进阶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 和 Agent 之间怎么通信?三种方式,按场景选:
easy-agent 的 MCP 实现
easy-agent Step 16 实现了完整的 MCP Client。核心流程只需四步:
第一步:配置就长这样
// 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 };
},
};
}
碎开来说这段代码干了什么:
- 命名规范
mcp__serverName__toolName——防止不同 Server 的同名工具冲突 - 直接复用 MCP Server 返回的
inputSchema——不需要自己重新定义参数 call()内部发tools/call请求——对 Agent 来说,这个 MCP 工具和内置工具完全没区别
为什么说 MCP 是「事实标准」
2026 年的数据:月下载近亿、数千个开源 Server、所有主流 Agent 框架都已支持。
对你的意义:学一次 MCP,写的工具能在 Claude Code、Codex、Cursor、Dify 里通用。面试时能讲清楚 MCP 的三种传输方式和工具适配器模式,就是差异化加分。
本章要点
- MCP 解决 N×M 适配问题 → N+M 各写各的
- 三种传输:stdio(本地子进程)、HTTP(远程)、SSE(推送)
- Client 四步:读配置 → 建连接 → 拉 tools/list → 包装为本地工具
- 命名规范
mcp__server__tool防冲突 - Agent 不感知工具是本地还是远程——MCP 把差异屏蔽了
→ 下一章:记忆与多轮对话