MCP 协议 2025:AI 应用的 USB-C 标准
前言
2024 年底,Anthropic 提出了 Model Context Protocol(MCP)——一个开放标准,旨在解决 AI 应用与外部工具/数据源之间的连接问题。2025 年,MCP 从一个"提议"进化成了行业事实标准:ChatGPT 接入了,VS Code Copilot 接入了,Cursor 接入了,三大 Agent 框架(LangGraph、CrewAI、AutoGen)全部原生支持。Linux Foundation 接管了治理,MCP Registry 正式上线。
“如果 HTTP 是 Web 的协议,那 MCP 就是 AI 的协议。"——这句话在 2025 年频繁出现在各种技术大会上。
MCP 解决了什么问题?
在 MCP 出现之前,让 LLM 使用工具是一个不堪回首的"战国时代”:
类比一下:MCP 之于 AI 工具,就像 USB-C 之于硬件外设——一个统一的接口,所有设备即插即用。
MCP 的核心架构
MCP 采用**客户端-服务器(Client-Server)**架构:
MCP 定义了三个核心能力:
| 能力 | 说明 | 类比 |
|---|---|---|
| Resources | 暴露数据源(文件、数据库、API…) | 像 REST API 的 GET 请求 |
| Tools | 暴露可调用的函数(搜索、计算、发送邮件…) | 像 REST API 的 POST 请求 |
| Prompts | 暴露预定义的提示模板 | 像 API 文档中的示例 |
一个 MCP 服务器示例
# calculator_mcp_server.py
from mcp.server import Server
from mcp.types import Tool, TextContent
app = Server("calculator")
@app.list_tools()
async def list_tools() -> list[Tool]:
return [
Tool(
name="calculate",
description="执行数学运算",
inputSchema={
"type": "object",
"properties": {
"expression": {
"type": "string",
"description": "数学表达式,如 2 + 3 * 4",
}
},
"required": ["expression"],
},
)
]
@app.call_tool()
async def call_tool(name: str, arguments: dict) -> list[TextContent]:
if name == "calculate":
result = eval(arguments["expression"])
return [TextContent(type="text", text=str(result))]
# 启动服务器(通过 stdio 通信)
if __name__ == "__main__":
app.run(transport="stdio")// 在 Claude Desktop 中配置 MCP 服务器
{
"mcpServers": {
"calculator": {
"command": "python",
"args": ["calculator_mcp_server.py"]
}
}
}配置完成后,Claude 就可以直接调用这个计算器了:
用户:“帮我算一下 2^10 + 3^5 等于多少?” Claude:[自动调用 MCP 计算器工具] “2^10 = 1024,3^5 = 243,结果是 1267。”
2025 年 MCP 生态全景
客户端支持(Hosts)
| 客户端 | 类型 | 支持程度 |
|---|---|---|
| Claude Desktop | 桌面应用 | ✅ 原生首发支持 |
| ChatGPT | Web/桌面 | ✅ 2025 年加入支持 |
| VS Code Copilot | IDE | ✅ MCP 工具可直接作为 Copilot 扩展 |
| Cursor | IDE | ✅ 原生支持 MCP 服务器作为工具 |
| MCPJam | 开发者工具 | ✅ 用于测试和调试 MCP 服务器 |
MCP Registry:工具市场
2025 年上线的 MCP Registry 相当于 AI 工具的"应用商店":
# 从 Registry 安装 MCP 服务器
mcp install @mcp/filesystem # 文件系统操作
mcp install @mcp/github # GitHub API 集成
mcp install @mcp/sqlite # SQLite 数据库查询
mcp install @mcp/slack # Slack 消息和频道管理
mcp install @mcp/brave-search # 网络搜索Registry 上的 MCP 服务器通过 GitHub Actions 自动发布和更新版本。
MCP 协议的技术细节
传输层
MCP 支持两种传输方式:
1. stdio 传输(本地)
{
"mcpServers": {
"my-tool": {
"command": "node",
"args": ["dist/server.js"],
"env": { "API_KEY": "xxx" }
}
}
}适合本地开发、桌面应用,进程间通过标准输入输出通信。
2. Streamable HTTP(远程)
POST /mcp HTTP/1.1
Content-Type: application/json
{"jsonrpc": "2.0", "method": "tools/call", "params": {...}}适合生产环境、远程服务,支持水平扩展和负载均衡。
2025 年的 Streamable HTTP 是 MCP 在传输层的重要进化——从原始的 SSE(Server-Sent Events)升级为无状态的 HTTP 请求,解决了大规模部署的痛点。
核心方法
// MCP 协议的 JSON-RPC 方法集
{
// 生命周期
"initialize", // 初始化连接
"notifications/initialized", // 通知初始化完成
// 资源操作
"resources/list", // 列出可用资源
"resources/read", // 读取资源内容
"resources/subscribe", // 订阅资源变更
// 工具操作
"tools/list", // 列出可用工具
"tools/call", // 调用工具
// 提示模板
"prompts/list", // 列出可用提示模板
"prompts/get", // 获取特定提示模板
}实战:构建一个代码分析 MCP 服务器
下面用 Python 构建一个完整的代码分析 MCP 服务器:
import ast
import subprocess
from pathlib import Path
from mcp.server import Server
from mcp.types import Tool, TextContent, Resource
app = Server("code-analyzer")
# 注册工具
@app.list_tools()
async def list_tools() -> list[Tool]:
return [
Tool(
name="analyze_python",
description="分析 Python 代码中的问题",
inputSchema={
"type": "object",
"properties": {
"code": {"type": "string", "description": "Python 代码"},
},
"required": ["code"],
},
),
Tool(
name="run_tests",
description="运行项目的测试用例",
inputSchema={
"type": "object",
"properties": {
"path": {"type": "string", "description": "项目路径"},
},
"required": ["path"],
},
),
]
@app.call_tool()
async def call_tool(name: str, arguments: dict) -> list[TextContent]:
if name == "analyze_python":
tree = ast.parse(arguments["code"])
issues = []
for node in ast.walk(tree):
# 检查空 except
if isinstance(node, ast.ExceptHandler) and node.type is None:
issues.append("⚠️ 裸 except 会捕获所有异常,建议指定异常类型")
# 检查函数是否过长
if isinstance(node, ast.FunctionDef) and len(node.body) > 50:
issues.append(f"⚠️ 函数 `{node.name}` 超过 50 行,建议拆分")
return [TextContent(
type="text",
text= "\n".join(issues) if issues else "✅ 没有发现明显问题"
)]
elif name == "run_tests":
result = subprocess.run(
["python", "-m", "pytest", arguments["path"], "-v"],
capture_output=True, text=True, timeout=30
)
return [TextContent(type="text", text=result.stdout[-2000:])]
# 注册资源(暴露可访问的数据)
@app.list_resources()
async def list_resources() -> list[Resource]:
return [
Resource(
uri="project://config",
name="项目配置文件",
description="项目的 pyproject.toml 配置",
mimeType="text/plain",
)
]
if __name__ == "__main__":
app.run(transport="stdio")配置到 Cursor / VS Code 中后,AI 编程助手可以直接调用这些工具来分析代码、运行测试。
MCP vs 传统 API:为什么是 MCP?
| 维度 | 传统 API | MCP |
|---|---|---|
| 发现机制 | 需要查阅文档 | Tools/Resources 自动发现 |
| 输入格式 | 每个 API 自定义 | 统一的 JSON-RPC 协议 |
| 上下文传递 | 需手动管理 | 协议原生支持上下文 |
| 流式响应 | 需要额外实现 | 原生支持 SSE/流式 |
| 安全认证 | 多样化 | OAuth 2.1 标准化 |
| 多模型兼容 | 每套 API 只服务一个 AI | 一次实现,所有 MCP Host 可用 |
路线图:MCP 接下来会做什么?
根据 2025 年 3 月发布的路线图:
- Agent 间通信:MCP 正在扩展为 Agent-to-Agent 协议,让不同框架的 Agent 可以互相协作
- 审计追踪:企业级的操作日志和审计能力
- SSO 和网关模式:企业集中管理 MCP 服务器的认证和访问
- Interceptor(拦截器):中间件机制,用于监控、限流、日志
- Trigger/Events:事件驱动的 MCP 服务器,可以主动推送通知
总结
| 要点 | 说明 |
|---|---|
| MCP 是什么 | AI 应用与外部工具的标准化通信协议 |
| 为什么重要 | 统一了"AI 如何调用工具"这个核心问题 |
| 2025 年里程碑 | Linux Foundation 治理、ChatGPT 支持、Registry 上线 |
| 谁在用 | Claude Desktop、ChatGPT、VS Code、Cursor、三大 Agent 框架 |
| 对开发者的意义 | 写一个 MCP 服务器 = 在所有 AI 平台可用你的工具 |
| 上手门槛 | 极低——几十行 Python/JS 代码就能写一个 MCP 服务器 |
2025 年,不懂 MCP 的 AI 应用开发就像不懂 HTTP 的 Web 开发。无论你用哪个 Agent 框架、哪个 LLM 模型,MCP 都是连接 AI 与现实世界的那根"USB-C 线"。