Resources
Templates & handlers
ResourceTemplate URIs, variables, and resource handler functions.
Dynamic Resources with Templates
Use ResourceTemplate to create dynamic resources that accept variables:
server/mcp/resources/file.ts
import { readFile } from 'node:fs/promises'
import { join } from 'node:path'
import { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js'
import type { Variables } from '@modelcontextprotocol/sdk/shared/uriTemplate.js'
import { defineMcpResource } from '@nuxtjs/mcp-toolkit/server'
export default defineMcpResource({
name: 'file',
title: 'File Resource',
uri: new ResourceTemplate('file:///project/{+path}', {
list: async () => {
// Return list of available resources
return {
resources: [
{ uri: 'file:///project/README.md', name: 'README.md' },
{ uri: 'file:///project/src/index.ts', name: 'src/index.ts' },
],
}
},
}),
handler: async (uri: URL, variables: Variables) => {
const path = variables.path as string
const filePath = join(process.cwd(), path)
const content = await readFile(filePath, 'utf-8')
return {
contents: [{
uri: uri.toString(),
mimeType: 'text/plain',
text: content,
}],
}
},
})
ResourceTemplate
ResourceTemplate allows you to create resources with variable parts in the URI:
new ResourceTemplate('file:///project/{+path}', {
list: async () => {
// Optional: Return list of available resources
return {
resources: [
{ uri: 'file:///project/file1.txt', name: 'File 1' },
{ uri: 'file:///project/file2.txt', name: 'File 2' },
],
}
},
})
Template Variables
Variables in the URI are defined with {variableName}:
// Single variable
new ResourceTemplate('file:///project/{path}', { ... })
// Variable allowing slashes (reserved expansion)
new ResourceTemplate('file:///project/{+path}', { ... })
// Multiple variables
new ResourceTemplate('api://users/{userId}/posts/{postId}', { ... })
Handler Function
The handler receives the resolved URI and optional variables:
// Static resource handler
handler: async (uri: URL) => {
return {
contents: [{
uri: uri.toString(),
mimeType: 'text/plain',
text: 'Content',
}],
}
}
// Dynamic resource handler
handler: async (uri: URL, variables: Variables) => {
const path = variables.path as string
// Use variables to resolve the resource
return {
contents: [{
uri: uri.toString(),
mimeType: 'text/plain',
text: 'Content',
}],
}
}