工具

注释与输入示例

MCP 客户端的行为提示以及复杂工具的具体 inputExamples。

工具注释

注释是行为提示,用于告诉 MCP 客户端某个工具的行为方式。客户端可以据此决定何时提示用户进行确认(human-in-the-loop)。

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

export default defineMcpTool({
  name: 'delete-user',
  description: '删除用户账户',
  inputSchema: {
    userId: z.string(),
  },
  annotations: {
    readOnlyHint: false,    // 工具会修改状态
    destructiveHint: true,  // 工具会执行破坏性更新
    idempotentHint: true,   // 多次删除同一个用户不会产生额外影响
    openWorldHint: false,   // 工具不会与外部系统交互
  },
  handler: async ({ userId }) => {
    // ...
  },
})

注释参考

注释类型默认值描述
readOnlyHintbooleanfalse如果为 true,工具只读取数据,不修改任何状态(可安全重试)。
destructiveHintbooleantrue如果为 true,工具可能执行破坏性操作,例如删除数据。仅在 readOnlyHintfalse 时有意义。
idempotentHintbooleanfalse如果为 true,使用相同参数多次调用该工具,除首次调用外不会产生额外影响。仅在 readOnlyHintfalse 时有意义。
openWorldHintbooleantrue如果为 true,工具可能与外部世界交互(外部 API、互联网)。如果为 false,则只对本地/内部数据进行操作。

以下是典型工具的常见注释模式:

// 搜索、列表、查询、计算...
annotations: {
  readOnlyHint: true,
  destructiveHint: false,
  openWorldHint: false,
}
所有注释都只是提示——并不能保证会被每个 MCP 客户端遵守。客户端绝不应基于来自不受信任服务器的注释做出安全关键决策。

输入示例

你可以使用 inputExamples 为工具提供具体用法示例。这些示例是类型安全的(与 inputSchema 匹配),并会通过 _meta.inputExamples 传输给客户端。

输入示例有助于 AI 模型理解如何正确填写工具参数,尤其适用于具有可选字段或复杂输入的工具。

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

export default defineMcpTool({
  description: '创建新的待办事项',
  inputSchema: {
    title: z.string().describe('待办事项的标题'),
    content: z.string().optional().describe('可选描述'),
  },
  inputExamples: [
    { title: 'Buy groceries', content: 'Milk, eggs, bread' },
    { title: 'Fix login bug' },  // content 是可选的
  ],
  handler: async ({ title, content }) => {
    // ...
  },
})
inputExamples 对于带有可选参数、枚举或复杂嵌套输入的工具尤其有用,因为展示具体值有助于模型选择正确的格式。