什么是 MCP 工具(MCP Tool)?
MCP 工具(MCP Tool)是 MCP Server 暴露、由 MCP Client 发现和调用的模型控制动作契约,但执行权限与用户同意仍是独立的策略决策。
快速了解
| 规范文档 | 官方规范 |
|---|
工作原理
MCP Tool 是 Model Context Protocol 中面向动作的 Primitive。Server 发布 Tool Definition,Client 发现它,Host 可以把它提供给模型并路由模型选择的调用。模型不是执行器或授权主体:Server 执行边界明确的后端操作,Host 与 Server 分别实施策略。Tool 不同于以 URI 暴露上下文的 MCP Resource,也不同于提供用户控制交互模板的 MCP Prompt。Function Calling 是模型供应商提供的结构化调用接口,Host 可以用它表示 MCP Tool,但它不等同于 MCP 的 Discovery、Transport、Authorization 与 Result Protocol。
在 MCP 2026-07-28 中,每个 tools/list 和 tools/call Request 都是 Stateless,并在 _meta 中携带 Protocol Version 与相关 Client Capabilities。支持 Tool 的 Server 通过 server/discover 声明 tools Capability。列表可以为空,也可按当前 Request 提供的 Credential 过滤,但不能仅因另一个 Request 复用了同一 Connection 而改变。稳定排序、Pagination Cursor、真实的 ttlMs 与 cacheScope,以及只通过匹配 subscriptions/listen Stream 发送的 notifications/tools/list_changed,让 Tool Discovery 可缓存,同时不会把 Connection 误当 Session。
Tool Definition 包含程序化 name、可选显示 title 与 Icon、面向模型的 description、必需的 inputSchema、可选的 outputSchema 和 Annotation。Name 按约定区分大小写,建议长度为 1 至 128,只使用 ASCII 字母、数字、下划线、连字符或点,并且只在一个 Server 内唯一。聚合多个 Server 的 Host 或 Gateway 因此需要绑定已配置 Server Identity 的稳定 Namespace;Server 自报的 serverInfo.name 本身不保证全局唯一。Description 即使不改变 JSON 结构也会影响模型选择,所以它的变更同样需要审查。
Tool Schema 是 JSON Schema Contract,不是权限系统。未声明 $schema 时使用 2020-12 Dialect;无参数 Tool 仍应使用 Object Schema,并明确是否接受额外属性。实现必须拒绝无效或不支持的 Schema,不得自动获取网络 $ref,并应限制 Depth、Subschema 数量、输入 Byte、Array、String 与 Validation Time。Server 在执行前既要校验结构,也要校验领域规则:语法有效的 Repository、Tenant、Path、Amount 或 Recipient 仍可能超出调用方权限。
在 Streamable HTTP 中,x-mcp-header 可以把静态可达的 String、Integer 或 Boolean 输入属性映射为 Mcp-Param-* Header。Header Name 必须符合 HTTP Token Syntax,并在忽略大小写时保持唯一;Integer 还受可互操作安全范围限制。Client 必须在该 Transport 上拒绝无效定义。Password、API Key、Token、PII 与其他 Secret 不得提升到 Header,因为中间设备与日志可能暴露它们;stdio Client 可以忽略该扩展。
tools/call 在最终完成时返回 resultType: "complete",内容可以是 Text、Image、Audio、Resource Link、Embedded Resource,或 structuredContent 中任意 JSON Value。若声明 outputSchema,Server 必须让 structuredContent 符合该 Schema,Client 应再次校验;序列化 JSON TextContent 是兼容性回退。结构有效不代表事实正确、数据新鲜、已获授权或安全。大型 Artifact 应通过受限 Resource Link 返回,截断与部分结果需要显式标识,Secret 与隐藏后端字段必须移除;所有 Tool Result 都是不可信数据,不能覆盖 Host Policy。
故障需要按层分类。Malformed Request、未知 Tool、无效协议参数与内部协议故障使用 JSON-RPC Error;预期内的 Backend 或 Domain Failure 可以返回 isError: true 的合法 Tool Result,让模型或用户修正调用。Timeout、Cancellation、Transport Loss 或 Response Stream 关闭都不能证明下游副作用已经回滚。结果应提供稳定、机器可读的 Failure Class,保留 Request ID,并说明 Effect 是未开始、已提交、已补偿还是结果未知,同时不得泄露 Stack Trace 或 Credential。
Model-controlled 不等于预授权。每个 Request 都要认证 Principal,并授权具体 Server、Tool、Tenant、Object、Argument、Purpose 与 Side Effect。OAuth Audience 与 Scope 只是粗粒度门禁;readOnlyHint、destructiveHint、idempotentHint 等 Tool Annotation 是不可信提示,不是 Enforcement。Host 应展示选中的 Tool 和关键 Argument,允许用户拒绝,并对高影响操作要求确认。Approval 必须绑定已审阅参数与 Policy Revision;旧 Approval 或未改变的 Connection 不能授权参数已经变化的新调用。
执行中需要 Elicitation、Roots 或受支持的 Legacy Sampling 时,Tool 可以通过 MRTR 返回 resultType: "input_required"。重试是具有新 JSON-RPC ID 的独立 Request,并携带 inputResponses 与可选的不透明 requestState。该 State 必须按攻击者可控输入校验;若影响权限或业务逻辑,需要保护完整性,并绑定 Principal、Tool、关键 Argument Digest、短 TTL 与 Policy。Replay 可能重复副作用时还要保证单次消费。在输入和授权完成前不能提交不可逆动作;可重试写操作必须由后端执行 Idempotency 或 Transactional Deduplication,Annotation 无法提供这项保证。
Tool Metadata 与输出构成语义供应链边界。Tool Poisoning 可以把指令藏在 Description 中,Shadowing 可以影响其他 Tool,Rug Pull 可以在审查后改变 Metadata,Tool Output 也可能携带间接 Prompt Injection。应尽量固定 Server 或 Package Source,记录不可变 Build 与 Descriptor / Schema Hash,对变更重新审查后才启用高影响 Tool,隔离 Credential 与 Egress,并让 Server-side Allowlist 独立于模型判断。Trace 至少关联 Server Identity、Tool 与 Schema Revision、Principal 与 Tenant、Authorization 与 Approval Decision、脱敏 Argument Digest、Idempotency Decision、Result Type、Latency、Cancellation、Error Class 和最终 Effect Status。合法 MCP Message 只证明协议形态正确,不能证明 Tool 可信、必要或适合执行。
主要特点
- 协议动作原语:Server 声明模型控制操作,Host 与 Server 仍保留选择、同意、授权和执行策略
- 可发现契约:tools/list 返回稳定排序、分页和缓存作用域明确的定义,并可向已订阅 Client 通知列表变化
- Schema 约束交换:inputSchema 校验参数,可选 outputSchema 约束显式 JSON Schema Dialect 下的 structuredContent
- 逐请求安全:身份、Tenant、Object、Argument、Purpose 与 Side Effect 独立于 Connection、Scope 和 Annotation 授权
- 副作用感知执行:MRTR、Cancellation、Idempotency、Transaction 与 Outcome State 防止重试或中断调用静默重复工作
- 语义供应链表面:Description、Annotation、Schema Revision 与 Result 需要 Provenance、完整性审查、隔离和脱敏审计证据
常见用途
- 提供边界明确的代码仓库检索操作,并执行逐请求 Project Authorization 和带来源的结构化返回
- 展示关键字段并记录 Approval 后创建支持工单,通过 Idempotency Key 对重试去重
- 运行带 Tenant Filter、Query Limit、Timeout 与 Result Truncation 的参数化只读分析,而不暴露自由 SQL
- 通过受限 Resource Link 返回生成报告,避免把大型或敏感 Artifact 直接注入模型上下文
- 经 Streamable HTTP 路由远程 API 操作,并实施 Audience 校验、Scope Credential、Cancellation 与 Effect Status 审计
示例
Loading code...常见问题
MCP Tool 和 Function Calling 有什么区别?
Function Calling 通常是模型供应商 API 输出结构化调用的能力;MCP Tool 则是 Server 经 tools/list 声明、经 tools/call 执行的协议级能力。Host 可以把 MCP Tool 转成某家供应商的 Function Calling 格式,但 MCP 还定义 Discovery、Transport、Result、Capability 与版本行为;两者都不会自动授予权限。
MCP Tool 的 inputSchema 和 outputSchema 能保证什么?
它们在 JSON Schema 下定义结构契约,未声明 Dialect 时默认使用 2020-12。Server 必须校验输入,并在存在 outputSchema 时保证 structuredContent 符合 Schema;Client 也应复验输出。Schema 有效不能证明业务有效、事实正确、数据新鲜、已获授权或没有风险。
MCP Tool Annotation 或模型选择足以批准操作吗?
不足。Read-only、Destructive 或 Idempotent 等 Annotation 是不可信 Metadata,模型选择也只表达意图而非权限。Server 必须授权具体 Principal、Tenant、Object、Argument、Purpose 与 Effect;Host 应对高影响操作请求绑定参数的确认,并允许用户拒绝。
MCP Tool 应如何处理错误、取消和重试?
协议故障使用 JSON-RPC Error,预期执行或领域失败使用 isError Tool Result。Timeout、Cancellation 或 Transport Loss 应先视为结果未知,直到 Backend 确认 Effect Status。写操作只能通过 Idempotency Key 或 Transactional Deduplication 重试,并区分未开始、已提交、已补偿与结果未知。
Host 如何降低 MCP Tool Poisoning 与 Rug Pull 风险?
只信任已审查的 Server Source,保存 Tool Description 与 Schema Hash,并在 Descriptor 变化时重新审阅。Metadata 与 Result 必须服从 Host Policy,同时隔离 Credential 与 Egress、执行 Server-side Allowlist,并测试恶意描述和输出。这些控制只能降低风险,不能把模型解释能力变成安全边界。