资源

元数据、内容与错误

资源元数据、MIME 类型、二进制载荷和错误响应。

资源元数据

添加一个 metadata 块,帮助客户端正确渲染资源。它包含 MIME 类型、行为注解,以及你希望在 resources/list 中展示的任何额外字段:

server/mcp/resources/readme.ts
import { defineMcpResource } from '@nuxtjs/mcp-toolkit/server'

export default defineMcpResource({
  name: 'readme',
  description: '项目 README 文件',
  file: 'README.md',
  metadata: {
    mimeType: 'text/markdown',
    annotations: {
      audience: ['user', 'assistant'],
      priority: 0.8,
      lastModified: new Date().toISOString(),
    },
  },
})
FieldTypeDescription
metadata.mimeTypestring提示客户端内容类型。当你使用 file: '…' 时会自动检测;对于自定义 URI,请显式设置。
metadata.annotations.audience('user' | 'assistant')[]谁应该看到这个资源——用户、AI,或两者。
metadata.annotations.prioritynumber (0–1)当客户端必须选择要包含哪些资源时,建议的重要程度。
metadata.annotations.lastModifiedstring (ISO 8601)资源最后一次变更的时间——客户端可将其用于缓存。

你放入 metadata 的其他任何内容,都会在列表响应中原样转发到 _meta 下,因此你可以为自己的 UI 携带自定义字段。

内容类型

资源可以返回不同的 MIME 类型:

return {
  contents: [{
    uri: uri.toString(),
    mimeType: 'text/markdown',
    text: '# Markdown 内容',
  }],
}

错误处理

在处理程序中优雅地处理错误:

server/mcp/resources/custom-readme.ts
import { readFile } from 'node:fs/promises'
import { fileURLToPath } from 'node:url'
import { defineMcpResource } from '@nuxtjs/mcp-toolkit/server'

export default defineMcpResource({
  name: 'readme',
  uri: 'file:///README.md',
  handler: async (uri: URL) => {
    try {
      const filePath = fileURLToPath(uri)
      const content = await readFile(filePath, 'utf-8')

      return {
        contents: [{
          uri: uri.toString(),
          mimeType: 'text/markdown',
          text: content,
        }],
      }
    }
    catch (error) {
      return {
        contents: [{
          uri: uri.toString(),
          mimeType: 'text/plain',
          text: `错误:${error instanceof Error ? error.message : String(error)}`,
        }],
        isError: true,
      }
    }
  },
})