← 博客书房

Agent 实战:从 Dify 到 LangGraph·MCP 协议:工具接入的事实标准

进阶25 分钟

MCP 协议:工具接入的事实标准

2026 年 Agent 连接外部系统的事实标准(月下载近亿):三种传输、工具适配器、亲手写一个 MCP Server。

写一次工具,到处能用。MCP 解决的是每个 Agent 都要重复造「连接外部系统」轮子的问题。

问题:N 个 Agent × M 个工具 = N×M 次重复

没有 MCP 之前,每个 Agent 框架都自己定义工具接口:

  • LangChain 用 @tool 装饰器
  • Dify 用插件系统
  • Claude Code 用内置工具 + 自己的扩展协议
  • 你的项目可能直接写函数

同一个「查天气」工具,要为每个框架写一遍适配。MCP 的目标就是把这个 N×M 问题变成 N+M——工具写一次,所有支持 MCP 的 Agent 都能用。

MCP 的核心思想:USB-C

MCP Server 工具提供方 天气查询 API 数据库查询 文件系统操作 写一次,所有 Agent 都能用 MCP 协议 tools/list · tools/call · 统一 JSON Schema Agent(使用方) 任何支持 MCP 的客户端 Claude Code Codex / Cursor / Dify 你自己写的 Agent 不用改代码,即插即用 之前:N 个 Agent × M 个工具 = N×M 份适配代码 有了 MCP:N + M —— 各写各的,协议帮你们连

三种传输方式

MCP Server 和 Agent 之间怎么通信?三种方式,按场景选:

stdio(本地) Agent 启动子进程,stdin/stdout 通信 command: npx my-mcp-server ✓ 零延迟 · ✓ 无网络配置 ✗ 只能本地用 · ✗ 需要运行时 适合:本地开发工具 HTTP(远程) 标准 HTTP 请求/响应 url: https://api.example.com/mcp ✓ 可远程部署 · ✓ 可共享给多人 ✗ 有网络延迟 · 需要鉴权 适合:团队共享工具 SSE(推送) 服务端主动推送事件流 Accept: text/event-stream ✓ 实时通知 · ✓ 长连接 ✗ 连接管理复杂 适合:需要推送的场景

easy-agent 的 MCP 实现

easy-agent Step 16 实现了完整的 MCP Client。核心流程只需四步:

+ + ① 读配置 settings.json 里 的 mcpServers 字段 ② 建连接 按 type 启动子进程 或发 HTTP 请求 ③ 拉工具列表 发 tools/list 请求 拿到 JSON Schema ④ 包装为本地工具 mcp__serverName__toolName Agent 像用内置工具一样用 Agent 不需要知道工具是本地的还是远程的——MCP 把差异屏蔽了

第一步:配置就长这样

// settings.json
{
  "mcpServers": {
    "weather": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@mcp/weather-server"]
    },
    "github": {
      "type": "http",
      "url": "https://mcp.github.com/sse",
      "headers": { "Authorization": "Bearer xxx" }
    }
  }
}

第二步:连接后拉工具列表

const result = await connection.client.request({
  method: "tools/list"
});
// 返回:[{ name: "get_weather", description: "…", inputSchema: { … } }]

第三步:包装为本地工具

function buildToolAdapter(connection, mcpTool) {
  return {
    name: `mcp__${connection.name}__${mcpTool.name}`,
    description: mcpTool.description,
    inputSchema: mcpTool.inputSchema,
    async call(input) {
      const result = await connection.client.request({
        method: "tools/call",
        params: { name: mcpTool.name, arguments: input },
      });
      return { content: result.content[0].text, isError: result.isError };
    },
  };
}

碎开来说这段代码干了什么:

  1. 命名规范 mcp__serverName__toolName——防止不同 Server 的同名工具冲突
  2. 直接复用 MCP Server 返回的 inputSchema——不需要自己重新定义参数
  3. call() 内部发 tools/call 请求——对 Agent 来说,这个 MCP 工具和内置工具完全没区别

为什么说 MCP 是「事实标准」

2026 年的数据:月下载近亿、数千个开源 Server、所有主流 Agent 框架都已支持。

对你的意义:学一次 MCP,写的工具能在 Claude Code、Codex、Cursor、Dify 里通用。面试时能讲清楚 MCP 的三种传输方式和工具适配器模式,就是差异化加分。

本章要点

  1. MCP 解决 N×M 适配问题 → N+M 各写各的
  2. 三种传输:stdio(本地子进程)、HTTP(远程)、SSE(推送)
  3. Client 四步:读配置 → 建连接 → 拉 tools/list → 包装为本地工具
  4. 命名规范 mcp__server__tool 防冲突
  5. Agent 不感知工具是本地还是远程——MCP 把差异屏蔽了

→ 下一章:记忆与多轮对话