Examples
API Integration
Integrate external APIs and use Nuxt server utilities in MCP tools.
Fetching External Data
Here's a simple tool that fetches data from a public API:
server/mcp/tools/get-weather.ts
import { z } from 'zod'
import { defineMcpTool } from '@nuxtjs/mcp-toolkit/server' // optional
export default defineMcpTool({
description: 'Get current weather for a city',
inputSchema: {
city: z.string().describe('City name'),
},
cache: '15m',
handler: async ({ city }) => {
try {
const data = await $fetch(`https://wttr.in/${city}?format=j1`)
return {
content: [{
type: 'text',
text: JSON.stringify(data, null, 2),
}],
}
}
catch (error) {
return {
content: [{
type: 'text',
text: `Error: ${error instanceof Error ? error.message : String(error)}`,
}],
isError: true,
}
}
},
})
Using Nuxt Server Utilities
To use Nuxt server utilities like useEvent() in your handlers, enable asyncContext:
nuxt.config.ts
export default defineNuxtConfig({
experimental: {
asyncContext: true,
},
})
Then you can access the H3 event and use Nuxt server composables:
server/mcp/tools/get-page.ts
import { z } from 'zod'
import { queryCollection } from '@nuxt/content/server'
import { defineMcpTool } from '@nuxtjs/mcp-toolkit/server' // optional
export default defineMcpTool({
description: 'Get a documentation page',
inputSchema: {
path: z.string().describe('Page path'),
},
cache: '1h',
handler: async ({ path }) => {
const event = useEvent()
const page = await queryCollection(event, 'docs')
.where('path', '=', path)
.first()
if (!page) {
return {
content: [{ type: 'text', text: 'Page not found' }],
isError: true,
}
}
return {
content: [{ type: 'text', text: JSON.stringify(page, null, 2) }],
}
},
})
useEvent() is auto-imported when asyncContext is enabled.Next Steps
- Common Patterns - More general examples
- File Operations - File operation examples
- Tools - Learn more about tools