概念、架构、协议格式到裸协议实现,彻底搞懂 MCP 的本质
一、MCP 是什么?
一句话概括:
MCP 定义了一套统一的接口规范,让 AI 模型能以标准化的方式发现并调用外部能力。
二、为什么需要 MCP?
MCP 被比作 "AI 的 USB-C 接口" —— USB-C 让所有设备用同一种接口连接外设,MCP 让所有 AI 应用用同一种协议连接工具。

三、MCP 架构:三个核心角色

四、三大核心能力

提示:Tools 是最常用的,大多数 MCP Server 只实现 Tools 就够了。
五、完整交互流程:三个阶段



六、协议格式:一个端点 + JSON-RPC

通用信封格式
{ "jsonrpc": "2.0", // 固定版本 "id": 1, // 请求 ID(通知无 id) "method": "xxx", // 方法名 "params": {} // 参数 / result: 结果 }
核心协议消息示例
initialize
// 请求 { "jsonrpc": "2.0", "id": 1, "method": "initialize", "params": { "protocolVersion": "2025-03-26", "capabilities": {}, "clientInfo": {"name": "my-client", "version": "1.0"} } } // 响应 { "jsonrpc": "2.0", "id": 1, "result": { "protocolVersion": "2025-03-26", "capabilities": {"tools": {}}, "serverInfo": {"name": "my-server", "version": "1.0"} } }
tools/list
// 请求 { "jsonrpc": "2.0", "id": 2, "method": "tools/list", "params": {} } // 响应 { "jsonrpc": "2.0", "id": 2, "result": { "tools": [{ "name": "get_weather", "description": "获取指定城市的天气", "inputSchema": { "type": "object", "properties": { "city": {"type": "string", "description": "城市名称"} }, "required": ["city"] } }] } }
tools/call
// 请求 { "jsonrpc": "2.0", "id": 3, "method": "tools/call", "params": { "name": "get_weather", "arguments": {"city": "北京"} } } // 响应 { "jsonrpc": "2.0", "id": 3, "result": { "content": [{"type": "text", "text": "晴天 25°C"}] } }
七、补充:JSON-RPC 2.0 标准
JSON-RPC 2.0 是一个已有的开放标准,和 MCP 无关。
MCP 聪明地借用了这个成熟标准,只需要定义具体的 method 有哪些,以及它们的 params 和 result 格式。
八、总结回顾


九、调试工具
通过调试工具抓包可以方便了解协议
1、安装:pnpm
npm install -g pnpm
2、安装并启动官方调试工具
pnpm dlx @modelcontextprotocol/inspector
3、复制启动


十、常见问题
偶发超时
MCP工具请求超时
超时的问题有可能是因为 配的ingress地址,ingress也是一个反向代理,代理可能针对SSE长连接有超时时间,代理层直接推送超时响应。目前dify统一改为走k8s 直连的方式。我dify测试了几轮没发现超时

404问题
MCP客户端通信 mcp/message?sessionId=770f849c-4ef9-4a8b-8032-d3ffc7cfb4a6 404
MCP客户端配置的是Ingrees地址,上线后未能评估出一期只支持1台MCP服务
由于MCP通信是采用SSE 加JSON RPC,当在服务A建立SSE后链接后, JSON RPC请求到服务B
导致找不到Session
、
|
方案一:广播模式(推荐)
方案二:Session使用中间件存储(redis)
|

浙公网安备 33010602011771号