AI学习之MCP协议
MCP 协议深度解剖:AI 时代的「USB-C」接口
“MCP 不是又一个 API 标准,它是 Large Language Model 与物理世界之间的通用翻译层。”
一、为什么我们需要 MCP?
在 AI Agent 爆发式增长的 2024-2025 年,开发者们面临一个尴尬的困境:每接入一个新的外部工具(GitHub、Slack、数据库、浏览器),都要写一堆「胶水代码」来告诉 LLM 怎么调用。这就像是每个电子设备都要配一个专用充电器——混乱、重复、难以维护。
Anthropic 在 2024 年底提出的 Model Context Protocol(MCP),本质上要做一件事:让 AI 模型与外部世界的交互标准化,就像 USB-C 统一了充电接口一样。

MCP 作为开放标准,连接 Models 与 Tools & Services
二、MCP 的三层架构哲学
MCP 的设计遵循极简主义,只关注通信栈的最底层两层,将语义层留给上层应用:
1. 传输层(Transport Layer)
负责 Client 与 Server 之间的物理连接,支持两种模式:
- STDIO(标准输入输出):本地进程间通信,适合本地工具(如文件系统、数据库)
- SSE(Server-Sent Events):基于 HTTP 的远程通信,适合网络服务
// STDIO 配置示例(VS Code 的 mcp.json)
{
"servers": {
"filesystem": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/path/to/dir"]
}
}
}
2. 消息契约层(Message Contract)
定义了 JSON-RPC 2.0 格式的消息规范,包括:
- 请求(Request):
tools/list,tools/call,resources/read - 通知(Notification):单向消息,如进度更新
- 响应(Response):成功结果或错误信息
3. 能力注册机制(Capability Registration)
这是 MCP 的精髓所在——Server 主动暴露自己能做什么,而不是 Client 去猜。

MCP Host 通过标准化接口连接多个 MCP Server
三、核心原语:Tools、Resources、Prompts
MCP Server 提供三大核心能力:
| 原语 | 控制权 | 用途 | 示例 |
|---|---|---|---|
| Tools | Model(LLM 决定是否调用) | 执行动作、修改状态 | 发送邮件、查询数据库、创建日历事件 |
| Resources | Application(应用层控制) | 提供只读上下文 | 公司文档、支持工单、代码库 |
| Prompts | User(用户触发) | 预置高质量指令模板 | 代码审查模板、会议纪要格式 |
Tool 的 Schema 定义示例
from mcp.server import FastMCP
mcp = FastMCP("my-server")
@mcp.tool()
def search_database(query: str, limit: int = 10) -> str:
"""
在内部知识库中搜索相关文档。
Args:
query: 搜索关键词
limit: 返回结果数量,默认10条
"""
# 实际的数据库查询逻辑
results = db.search(query, limit)
return json.dumps(results)
关键洞察:Tool 的 docstring 和类型提示会被自动转换为 JSON Schema,成为 LLM 理解「何时调用此工具」的上下文。
四、通信流程:一次完整的 Tool Call 之旅
让我们追踪一个真实场景:用户问 “帮我检查一下 staging-api-01 服务器的 Nginx 状态”

完整的请求-响应流程:从用户查询到工具执行
Step-by-Step 拆解:
- 初始化连接:MCP Client 通过 STDIO 或 SSE 与 Server 建立长连接
- 能力发现:Client 发送
tools/list,Server 返回可用工具列表及其 Schema - 上下文注入:Client 将 Tool Schema 插入 LLM 的 System Prompt
- 意图识别:LLM 分析用户查询,决定调用
check_node_status和restart_nginx工具 - 工具执行:Client 发送
tools/call,Server 执行实际命令(SSH 到服务器检查服务状态) - 结果回传:Server 返回执行结果,LLM 生成自然语言响应
# 伪代码展示 Client 的核心逻辑
async def process_query(self, query: str):
# 1. 获取可用工具
tools = await self.session.list_tools()
# 2. 发送给 LLM,附带工具描述
response = await llm.chat(
messages=[{"role": "user", "content": query}],
tools=[convert_to_openai_format(t) for t in tools]
)
# 3. 如果 LLM 决定调用工具
if response.tool_calls:
for tool_call in response.tool_calls:
# 4. 执行工具
result = await self.session.call_tool(
tool_call.name,
tool_call.arguments
)
# 5. 将结果追加到对话历史
messages.append({
"role": "tool",
"content": str(result)
})
# 6. 让 LLM 基于工具结果生成最终回答
final_response = await llm.chat(messages=messages)
return final_response
五、MCP vs 传统 Function Calling:关键差异
| 维度 | OpenAI Function Calling | MCP Protocol |
|---|---|---|
| 工具定义位置 | Client 侧硬编码 | Server 侧动态发现 |
| Schema 传输 | 启动时手动配置 | 运行时自动协商 |
| 多模态支持 | 需额外处理 | 原生支持 Resources(图片、文档等) |
| 生态隔离 | 各平台互不兼容 | 跨模型、跨平台通用 |
| 状态管理 | 无标准方案 | 支持 Sampling(递归调用) |
核心优势:MCP 让 Tool 的定义与实现解耦。同一个 MCP Server 可以被 Claude、GPT-4、Gemini 或任何支持 MCP 的 Client 使用,无需重复适配。
六、实战:构建一个生产级 MCP Server
基于 Spring AI 的企业级实现:
1. 依赖配置(Maven)
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-mcp-server-webmvc</artifactId>
<version>1.1.2</version>
</dependency>
2. 配置属性(YAML)
spring:
ai:
mcp:
server:
enabled: true
type: SYNC # 同步模式,适合大多数场景
sse-endpoint: /mcp/sse
sse-message-endpoint: /mcp/messages
version: 2024-11-05
annotation-scanner:
enabled: true # 自动扫描 @MCPTool 注解
3. 定义 Tool(Java)
@Component
public class InfrastructureTools {
@MCPTool(name = "restart_nginx",
description = "重启指定节点上的 Nginx 服务")
public String restartNginx(
@MCPParameter(description = "节点主机名") String nodeName,
@MCPParameter(description = "最大重试次数", defaultValue = "2") int maxRetries
) {
// 实际的运维逻辑
return executeSSHCommand(nodeName, "systemctl restart nginx");
}
@MCPTool(name = "check_node_status")
public NodeStatus checkNode(@MCPParameter String nodeName) {
return pingService.check(nodeName);
}
}
启动日志会显示自动注册的工具:
Registered tools: 5
Enable resources capabilities, notification: true
Enable prompts capabilities, notification: true
七、安全考量:MCP 的阴暗面
随着 MCP 生态的爆发,安全问题也浮出水面:
主要攻击向量:
- Tool Poisoning(工具投毒):恶意 Server 注册同名 Tool 覆盖正常功能
- Prompt Injection:通过 Resource 或 Prompt 注入恶意指令
- 过度权限:Server 请求超出其职责范围的敏感权限
- Rug Pull 攻击:Server 在注册后动态修改 Tool 行为
防护策略:
// 在 Client 侧实施策略控制
{
"mcp": {
"servers": {
"trusted-server": {
"command": "python",
"args": ["server.py"],
"permissions": {
"tools": {
"read_only": true, // 禁止写操作
"allowed": ["search", "query"] // 白名单
},
"resources": {
"max_size": "10MB"
}
}
}
}
}
}
八、未来展望:MCP 会成为 AI 的 TCP/IP 吗?
MCP 目前还处于快速演化期(最新规范版本 2024-11-05),但已经展现出成为AI 基础设施层协议的潜力:
- 标准化:已被 VS Code、Claude Desktop、Cursor 等主流工具集成
- 生态爆发:社区已贡献数百个开源 MCP Server(文件系统、数据库、浏览器、Git 等)
- 跨语言支持:Python、TypeScript、Java、C#、Ruby、Go 等 SDK 日趋完善
但挑战依然存在:
- 语义层标准缺失:不同 Server 对同一概念的表达可能不一致
- 授权机制待完善:OAuth 集成还在 Draft 阶段
- 性能优化:高频 Tool Call 的延迟问题
结语:协议即权力
在 AI 时代,协议定义了智能的边界。MCP 的价值不仅在于技术层面的标准化,更在于它重新划定了 LLM 与世界的交互界面——让模型专注于推理,让工具专注于执行,让开发者专注于业务逻辑。
正如一位开发者所说:
“以前我要写 200 行代码让 Claude 操作 GitHub,现在只需要安装一个 MCP Server。”
这就是协议的力量。
参考资源:
本文基于 MCP 2024-11-05 规范版本撰写,部分内容参考了 Anthropic 官方文档及社区最佳实践。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)