Skip to content

第14篇:服务与集成 · 第3节 MCP — Model Context Protocol 概览

MCP 让模型以标准方式发现外部工具与资源:服务器注册能力,宿主按名调用。本节讲消息形态、生命周期、动态发现,与传输层(第4节)解耦。


学习目标

能力项说明
角色区分 host / client / server 三角关系
方法列举 initializetools/listtools/call 等核心 JSON-RPC 意图
能力解释 capabilities 协商与版本字段
安全工具调用的权限、用户确认与审计
扩展resources / prompts 与 tools 的并列关系

生活类比:万能转接头上的设备枚举

你的笔记本是 host,USB 集线器是 client,插上移动硬盘、键盘、打印机是多个 server。插上后系统先问:你是什么设备、支持哪些指令list);你点打印时系统发具体打印任务call)。MCP 就是这套问能力再派发任务的协议,只不过对话发生在 LLM 宿主外部世界之间。


JSON-RPC 消息壳(概念)

json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "read_file",
    "arguments": { "path": "./README.md" }
  }
}

TypeScript 类型骨架

typescript
// mcp/types.ts — 教学示意
export interface McpTool {
  name: string;
  description?: string;
  inputSchema: Record<string, unknown>;
}

export interface InitializeParams {
  protocolVersion: string;
  capabilities: Record<string, unknown>;
  clientInfo: { name: string; version: string };
}

export interface InitializeResult {
  protocolVersion: string;
  capabilities: Record<string, unknown>;
  serverInfo: { name: string; version: string };
}

宿主侧:动态工具发现

typescript
export async function refreshTools(conn: McpConnection): Promise<McpTool[]> {
  const res = await conn.request("tools/list", {});
  return (res as { tools: McpTool[] }).tools;
}

发现后的工具需合并进 Agent 可用工具表,并 bump AppState.tools.registryVersion(与第13篇 History 续接校验呼应)。


Mermaid:初始化与 listing

图2:tools/call 与模型回合


能力协商表

能力键含义
tools支持 list/call
resources可读资源 URI
prompts预置提示模板
logging服务端日志通道

安全与权限

机制说明
用户确认高危工具需 TUI 二次确认
沙箱限制可访问路径 / 网络
审计transcript 记录 tool name + digest
版本锁不兼容的 protocolVersion 拒绝连接

与 Anthropic tool_use 的映射

模型侧MCP 侧
tool_use.nametools/call.params.name
tool_use.inputarguments
tool_resultJSON-RPC 响应 → 消息块

源码片段:合并多服务器工具

typescript
export function mergeToolNamespaces(
  servers: Array<{ prefix: string; tools: McpTool[] }>
): McpTool[] {
  const out: McpTool[] = [];
  for (const s of servers) {
    for (const t of s.tools) {
      out.push({
        ...t,
        name: `${s.prefix}__${t.name}`,
      });
    }
  }
  return out;
}
注意说明
前缀避免多 server 同名冲突
schema合并后仍需满足 API tools 数组大小限制

故障模式

现象可能原因
list 为空server 未实现或 capabilities 未声明
call 超时下游 I/O;应可取消
schema 不匹配模型幻觉参数;需校验后反馈 4xx 等价错误

小结

MCP 用 JSON-RPC 统一「发现 + 调用」:initialize 定调,tools/list 更新注册表,tools/call 执行。宿主负责 合并命名空间、权限与审计,传输细节交给第4节。


自测

  1. initialized 通知与 initialize 请求响应的先后顺序为何重要?
  2. resources 与 tools 在模型上下文注入上有何不同?
  3. 多 server 同名工具不加前缀会发生什么?

调试清单(host 开发者)

步骤检查
握手protocolVersion 双方兼容
列举tools/list 返回非空且 inputSchema 为合法 JSON Schema
调用tools/callname 与 list 完全一致(含前缀策略)
并发同一 id 不重复使用直至响应返回
日志JSON-RPC 与 stderr 分离

JSON-RPC 通知与请求对照

类型需 id需 response
request
response是(与请求同 id)
notification

宿主应对未知 method 返回规范错误,避免 server 悬挂。


上一节02-error-handling.md · 下一节04-mcp-transport.md

本项目仅用于教育学习目的。Claude Code 源码版权归 Anthropic, PBC 所有。