工具

错误与缓存

工具处理器中的 H3 和普通错误,以及基于 Nitro 的响应缓存。

错误处理

直接从你的处理器中抛出错误——就像在 Nitro 事件处理器中一样。抛出的错误会被自动捕获并转换为符合 MCP 规范的 isError 结果。

H3 错误(推荐)

对带有状态码的错误使用 H3 的 createError()

server/mcp/tools/get-user.ts
import { z } from 'zod'
import { createError } from 'h3'
import { defineMcpTool } from '@nuxtjs/mcp-toolkit/server'

export default defineMcpTool({
  name: 'get-user',
  description: '通过 ID 获取用户',
  inputSchema: {
    id: z.string(),
  },
  handler: async ({ id }) => {
    const user = await findUser(id)
    if (!user) {
      throw createError({ statusCode: 404, message: '未找到用户' })
    }
    return user
  },
})
// 错误结果: { isError: true, content: [{ type: 'text', text: '[404] 未找到用户' }] }

H3 错误也可以包含结构化数据:

throw createError({
  statusCode: 400,
  message: '验证失败',
  data: { fields: ['name', 'email'] },
})
// 错误文本: '[400] 验证失败\n{ "fields": ["name", "email"] }'

普通错误

常规的 Error 实例也可以正常使用:

server/mcp/tools/safe-divide.ts
import { z } from 'zod'
import { defineMcpTool } from '@nuxtjs/mcp-toolkit/server'

export default defineMcpTool({
  name: 'safe-divide',
  inputSchema: {
    a: z.number(),
    b: z.number(),
  },
  handler: async ({ a, b }) => {
    if (b === 0) throw new Error('除数不能为零')
    return a / b
  },
})

响应缓存

你可以使用 Nitro 的缓存系统来缓存工具响应。cache 选项接受三种格式:

简单时长

使用字符串时长(由 ms 解析)或以毫秒为单位的数字:

server/mcp/tools/cached-data.ts
import { z } from 'zod'
import { defineMcpTool } from '@nuxtjs/mcp-toolkit/server'

export default defineMcpTool({
  description: '获取带有 1 小时缓存的数据',
  inputSchema: {
    id: z.string(),
  },
  cache: '1h', // 或 '30m'、'2 days'、3600000 等
  handler: async ({ id }) => {
    return await fetchExpensiveData(id)
  },
})

完整缓存选项

如需更多控制,请使用包含所有 Nitro 缓存选项的对象:

server/mcp/tools/cached-pages.ts
import { z } from 'zod'
import { defineMcpTool } from '@nuxtjs/mcp-toolkit/server'

export default defineMcpTool({
  description: '获取带自定义缓存键的页面',
  inputSchema: {
    path: z.string(),
  },
  cache: {
    maxAge: '1h',
    getKey: args => `page-${args.path}`,
    swr: true, // 陈旧时重新验证
  },
  handler: async ({ path }) => {
    // ...
  },
})

缓存选项参考

OptionTypeRequiredDescription
maxAgestring | numberYes缓存持续时间(例如:'1h'3600000
getKey(args) => stringNo自定义缓存键生成器
staleMaxAgenumberNo陈旧时重新验证的持续时间
swrbooleanNo启用陈旧时重新验证(默认 false,见下方警告)
namestringNo缓存名称(根据工具名称自动生成)
groupstringNo缓存分组(默认:'mcp'
有关所有可用选项,请参阅 Nitro 缓存文档
swr 默认为 false(而 Nitro 本身默认为 true)。当 swr: true 时,过期命中会立即返回,并且处理器会在请求响应后于后台刷新,因此请求作用域内的写入(结构化日志、跟踪)可能会被丢弃。只有在你接受这种权衡时才启用。