---
title: "Examples & routing"
description: "Full handler examples, multiple handlers, routes, and default vs custom comparison."
canonical_url: "https://mcp-toolkit.nuxt.dev/handlers/examples-routing"
---
# Examples & routing

> Full handler examples, multiple handlers, routes, and default vs custom comparison.

## Complete Example

Here's a complete example of a custom handler:

```typescript [server/mcp/api-handler.ts]
import { z } from 'zod'
import { defineMcpTool, defineMcpResource, defineMcpPrompt, defineMcpHandler } from '@nuxtjs/mcp-toolkit/server'

const getUserTool = defineMcpTool({
  name: 'get-user',
  description: 'Get user information',
  inputSchema: {
    userId: z.string(),
  },
  handler: async ({ userId }) => {
    const user = await db.users.find(userId)
    return user
  },
})

const createUserTool = defineMcpTool({
  name: 'create-user',
  description: 'Create a new user',
  inputSchema: {
    name: z.string(),
    email: z.string().email(),
  },
  handler: async ({ name, email }) => {
    const user = await db.users.create({ name, email })
    return `User created: ${user.id}`
  },
})

// Define resources for this handler
const userResource = defineMcpResource({
  name: 'user',
  uri: 'api://users/{id}',
  handler: async (uri, variables) => {
    const id = variables.id as string
    const user = await db.users.find(id)
    return {
      contents: [{
        uri: uri.toString(),
        mimeType: 'application/json',
        text: JSON.stringify(user),
      }],
    }
  },
})

// Define prompts for this handler
const userPrompt = defineMcpPrompt({
  name: 'user-help',
  description: 'Get help with user operations',
  handler: async () => {
    return {
      messages: [{
        role: 'user',
        content: {
          type: 'text',
          text: 'How can I manage users?',
        },
      }],
    }
  },
})

// Export the handler
export default defineMcpHandler({
  name: 'api',
  version: '1.0.0',
  route: '/mcp/api',
  tools: [getUserTool, createUserTool],
  resources: [userResource],
  prompts: [userPrompt],
  browserRedirect: '/docs/api',
})
```

## Multiple Handlers

You can create multiple handlers in your application:

```text
server/
└── mcp/
    ├── migration.ts          # Migration handler
    ├── api-handler.ts        # API handler
    ├── admin-handler.ts      # Admin handler
    ├── tools/
    │   └── echo.ts           # Default handler tools
    ├── resources/
    │   └── readme.ts         # Default handler resources
    └── prompts/
        └── greeting.ts       # Default handler prompts
```

Each handler file should export a default handler definition:

```typescript [server/mcp/migration.ts]
import { defineMcpHandler } from '@nuxtjs/mcp-toolkit/server'

export default defineMcpHandler({
  name: 'migration',
  tools: [ ... ],
})
```

```typescript [server/mcp/api-handler.ts]
import { defineMcpHandler } from '@nuxtjs/mcp-toolkit/server'

export default defineMcpHandler({
  name: 'api',
  tools: [ ... ],
})
```

## Handler Routes

The handler's `name` determines where it will be mounted. By default, handlers are accessible at `/mcp/:name` where `:name` is the handler's name:

- Handler with `name: 'migration'` → mounted at `/mcp/migration`
- Handler with `name: 'api'` → mounted at `/mcp/api`
- Handler with `name: 'admin'` → mounted at `/mcp/admin`

You can also specify a custom route to override the default:

```typescript
import { defineMcpHandler } from '@nuxtjs/mcp-toolkit/server'

export default defineMcpHandler({
  name: 'api',
  route: '/api/mcp/v1', // Custom route instead of /mcp/api
})
```

## Default vs Custom Handlers

<table>
<thead>
  <tr>
    <th>
      Feature
    </th>
    
    <th>
      Default Handler
    </th>
    
    <th>
      Default Handler Override (<code>
        index.ts
      </code>
      
      )
    </th>
    
    <th>
      Custom Handler
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      Route
    </td>
    
    <td>
      <code>
        /mcp
      </code>
      
       (via config)
    </td>
    
    <td>
      <code>
        /mcp
      </code>
      
       (via config)
    </td>
    
    <td>
      <code>
        /mcp/:name
      </code>
      
       (or custom route)
    </td>
  </tr>
  
  <tr>
    <td>
      Tools
    </td>
    
    <td>
      From <code>
        server/mcp/tools/
      </code>
    </td>
    
    <td>
      Custom or global
    </td>
    
    <td>
      Defined in handler
    </td>
  </tr>
  
  <tr>
    <td>
      Resources
    </td>
    
    <td>
      From <code>
        server/mcp/resources/
      </code>
    </td>
    
    <td>
      Custom or global
    </td>
    
    <td>
      Defined in handler
    </td>
  </tr>
  
  <tr>
    <td>
      Prompts
    </td>
    
    <td>
      From <code>
        server/mcp/prompts/
      </code>
    </td>
    
    <td>
      Custom or global
    </td>
    
    <td>
      Defined in handler
    </td>
  </tr>
  
  <tr>
    <td>
      Name
    </td>
    
    <td>
      From config
    </td>
    
    <td>
      Custom or config
    </td>
    
    <td>
      Handler name (required)
    </td>
  </tr>
  
  <tr>
    <td>
      Version
    </td>
    
    <td>
      From config
    </td>
    
    <td>
      Custom or config
    </td>
    
    <td>
      Handler version
    </td>
  </tr>
</tbody>
</table>


## Sitemap

See the full [sitemap](https://mcp-toolkit.nuxt.dev/sitemap.md) for all pages.
