Appearance
MCP 协议深度解析:AI 工具的"TCP/IP"
最后更新:2026-08-11
MCP(Model Context Protocol)是 Anthropic 提出的开放协议标准,让 AI 模型与外部工具/数据源之间建立标准化的连接。你可以把它理解为 AI 世界的"HTTP + REST"——定义了一套通用语言,让任何 AI 客户端都能连接任何 MCP 兼容的服务器。

一、为什么需要 MCP
1.1 没有 MCP 之前
每个 AI 工具要对接外部系统,需要各自实现一套集成逻辑:
| 问题 | 后果 |
|---|---|
| Claude Code 要接 GitHub API | 写一套 GitHub 集成代码 |
| Codex CLI 也要接 GitHub API | 再写一套(不兼容) |
| 我想用自建的内部 API | 没有标准接口,只能改源码或发 PR |
| 工具间无法互操作 | Claude Code 的数据库连接,Cursor 用不了 |
1.2 有了 MCP 之后

核心价值:一次编写 MCP Server,所有 MCP 客户端都能用。就像写一个 REST API,任何 HTTP 客户端都能调用。
二、协议层次

2.1 传输层
| 传输方式 | 适用场景 | 特点 |
|---|---|---|
| stdio | 本地进程通信 | 最常用,Claude Code 默认方式,启动子进程通过 stdin/stdout 通信 |
| SSE (HTTP) | 远程服务 | 适合部署在服务器上的 MCP 服务 |
| WebSocket | 双向实时通信 | 适合需要推送通知的场景 |
| Streamable HTTP | 新一代传输 | 2025 年新增,整合了 SSE + 流式响应 |
2.2 消息层:JSON-RPC 2.0
MCP 的所有通信都遵循 JSON-RPC 2.0 格式——一个极简的远程调用协议:
json
// 请求:客户端向服务器发
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "search_symbol",
"arguments": { "query": "process_data" }
}
}
// 成功响应:服务器返回
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [
{ "type": "text", "text": "Found at src/core.cpp:42" }
]
}
}
// 错误响应
{
"jsonrpc": "2.0",
"id": 1,
"error": {
"code": -32601,
"message": "Method not found: search_symbol"
}
}
// 通知:无需响应
{
"jsonrpc": "2.0",
"method": "notifications/resources/updated"
}| 消息类型 | 有 id ? | 需要响应? | 用途 |
|---|---|---|---|
| Request | ✅ | ✅ | 客户端发起调用,服务器必须响应 |
| Response | ✅ | — | 服务器对 Request 的应答 |
| Notification | ❌ | ❌ | 单向通知,无需响应 |
| Error | ✅ | — | 处理失败的响应 |
2.3 应用层:三种能力原语
这是 MCP 最核心的部分——定义了三种"AI 能看到和操作"的东西:

Tools(工具)—— 最常用的能力
Tools 让 AI 调用外部系统执行操作:
json
// 服务器声明自己有什么工具(客户端启动时获取)
{
"tools": [
{
"name": "query_database",
"description": "执行 SQL 查询",
"inputSchema": {
"type": "object",
"properties": {
"sql": { "type": "string" }
},
"required": ["sql"]
}
},
{
"name": "create_issue",
"description": "在 GitHub 创建 Issue",
"inputSchema": {
"type": "object",
"properties": {
"title": { "type": "string" },
"body": { "type": "string" },
"labels": { "type": "array", "items": { "type": "string" } }
},
"required": ["title", "body"]
}
}
]
}AI 客户端看到这个声明后,就会在合适的时机调用 tools/call:
json
// AI 调用工具
{ "method": "tools/call",
"params": {
"name": "query_database",
"arguments": { "sql": "SELECT * FROM users WHERE status = 'active'" }
}
}Resources(资源)—— 数据源
Resources 暴露可读取的数据,类似于文件系统中的"文件"概念:
json
// 服务器声明的资源
{
"resources": [
{
"uri": "schema://users_table",
"name": "用户表结构",
"mimeType": "application/json"
},
{
"uri": "config://server_settings",
"name": "服务器配置",
"mimeType": "text/plain"
}
]
}客户端通过 resources/read 获取内容:
json
{ "method": "resources/read",
"params": { "uri": "schema://users_table" }
}Prompts(提示模板)
Prompts 是预定义的提示词模板,可以被 AI 客户端发现和调用:
json
{
"prompts": [
{
"name": "code_review",
"description": "标准化 Code Review 模板",
"arguments": [
{ "name": "file", "description": "要审查的文件", "required": true }
]
}
]
}
// 客户端获取模板
{ "method": "prompts/get",
"params": {
"name": "code_review",
"arguments": { "file": "src/auth.cpp" }
}
}2.4 三种能力对比
| 维度 | Tools | Resources | Prompts |
|---|---|---|---|
| 操作方向 | 读写 | 只读 | 只读 |
| AI 可以 | 调用执行 | 读取内容 | 获取模板 |
| 典型场景 | 查数据库、调 API、写文件 | 读表结构、读配置文件 | 代码审查模板、提交信息模板 |
| inputSchema 验证 | ✅ | ❌ | ❌ |
| 会改变系统状态吗 | ✅ | ❌ | ❌ |
三、生命周期:一次完整的 MCP 会话

关键点:
| 阶段 | 方法 | 说明 |
|---|---|---|
| 初始化 | initialize + initialized | 双向握手,交换能力声明 |
| 发现 | tools/list、resources/list、prompts/list | AI 知道服务器能做什么 |
| 运行 | tools/call、resources/read、prompts/get | 实际调用 |
| 通知 | notifications/resources/updated | 服务器主动通知资源变化 |
四、自建 MCP Server 实战
4.1 最简示例:文件搜索服务器(Node.js)
javascript
// file-search-server.mjs
import { McpServer } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { readFileSync, readdirSync } from "fs";
const server = new McpServer({
name: "file-search",
version: "1.0.0"
});
// 注册一个 Tool:搜索文件
server.tool(
"search_files",
"在目录中搜索包含指定文本的文件",
{
pattern: { type: "string", description: "要搜索的文本" },
directory: { type: "string", description: "搜索目录" }
},
async ({ pattern, directory }) => {
const files = readdirSync(directory, { recursive: true });
const results = [];
for (const f of files) {
const content = readFileSync(`${directory}/${f}`, "utf-8");
if (content.includes(pattern)) {
results.push({ file: f, line: content.indexOf(pattern) });
}
}
return { content: [{ type: "text", text: JSON.stringify(results, null, 2) }] };
}
);
const transport = new StdioServerTransport();
await server.connect(transport);4.2 注册到 Claude Code
bash
# 方式一:命令行注册(local 作用域,仅当前用户可见)
claude mcp add file-search -e NODE_ENV=production -- node file-search-server.mjs
# 方式二:写在 .mcp.json(project 作用域,团队共享).mcp.json 示例:
json
{
"mcpServers": {
"file-search": {
"command": "node",
"args": ["file-search-server.mjs"],
"env": { "NODE_ENV": "production" }
},
"database": {
"command": "python",
"args": ["db_mcp_server.py"],
"env": { "DB_HOST": "localhost" }
}
}
}4.3 MCP 服务器开发要点
| 要点 | 建议 |
|---|---|
| description 很重要 | AI 靠 description 判断何时调用你的工具,写清楚"什么场景下用" |
| inputSchema 要完整 | 用 JSON Schema 声明参数类型和必填项,AI 才能正确传参 |
| 错误处理 | 返回标准 JSON-RPC 错误码,不要直接 crash |
| 性能 | MCP Server 是长期运行的子进程,注意内存泄露 |
| 安全 | 限制可访问的目录/数据库范围,不要给 root 权限 |
| 幂等性 | 读操作要幂等,写操作考虑事务 |
五、MCP 的局限与展望
5.1 当前局限
| 局限 | 说明 |
|---|---|
| 状态管理 | 协议本身无状态,会话状态需服务器自行管理 |
| 流式输出 | 工具调用是 request-response 模式,不支持流式返回(2025 年 Streamable HTTP 逐步改善) |
| 服务发现 | 没有服务注册中心,"有什么 MCP Server 可用"靠配置文件管理 |
| 版本兼容 | 协议版本升级时,旧版客户端和服务器可能不兼容 |
| 安全模型 | 权限控制依赖 AI 客户端实现,协议层没有细粒度鉴权 |
5.2 生态现状
| 类型 | 例子 |
|---|---|
| 官方 SDK | TypeScript / Python / Kotlin / Java |
| 常见 MCP Server | GitHub API、Postgres、Puppeteer (浏览器)、Brave Search、CodeGraph |
| 客户端支持 | Claude Code、Cursor、Codex CLI、Continue、Sourcegraph Cody |
| 注册中心 | modelcontextprotocol.io 官方列表 + npm/pip 社区包 |
5.3 为什么 MCP 是"AI 世界的 TCP/IP"

就像 TCP/IP 让不同操作系统的计算机能通信,MCP 让不同厂商的 AI 工具能连接同一个数据源。你写一个 GitHub MCP Server,Claude Code、Cursor、Codex CLI 都能用——这就是标准化的力量。
六、和本仓库其他文档的关系
| 文档 | 内容 | 与本文的关系 |
|---|---|---|
| AI 编程工具总纲 | 工具选型、四级演化 | MCP 是总纲中"协作基础设施"的核心协议 |
| Claude Code CLI 教程 §十 | MCP 在 Claude Code 中的配置与使用 | 本文是协议原理,那里是操作指南 |
| CodeGraph 教程 | 基于 MCP 的代码知识图谱 | CodeGraph 是 MCP Server 的典型应用案例 |
| Agent vs Skill 解析 | Agent 如何用 MCP 获取工具 | MCP 为 Agent 提供了标准化的工具接入方式 |
一句话总结
MCP 是 AI 工具连接外部世界的标准化协议:就像 HTTP 让互联网应用互通,MCP 让任何 AI 客户端通过同一套 JSON-RPC 接口对接任何数据源和工具——一次编写 MCP Server,所有 AI 工具通用。它定义了三种能力原语(Tools 执行操作、Resources 读取数据、Prompts 提供模板),通过 stdio/SSE/WebSocket 传输,让 AI 从"封闭的聊天窗口"进化为"连接一切的智能代理"。