MCP 工作原理
MCP 的架构、通信流程与传输方式
概述
理解 MCP 的工作原理有助于更好地集成、调试并优化 MCP 服务器。
MCP 架构
客户端-服务器模型
┌─────────────────┐ ┌─────────────────┐
│ Claude Code │ │ MCP 服务器 │
│ (客户端) │◄──────►│ (服务器) │
└─────────────────┘ └─────────────────┘
│ │
│ │
└─────────┬─────────────────┘
│
▼
┌──────────────┐
│ 外部服务 │
└──────────────┘组件说明:
- Claude Code(客户端):发起工具调用、管理连接、处理响应
- MCP 服务器:提供工具、执行调用、返回结果与错误
- 外部服务:数据库、API、文件系统、CI/CD 等
通信流程
初始化流程
- 启动 Claude Code
- 加载配置
- 连接已配置 MCP 服务器
- 发现可用工具与资源
工具调用流程
1. 用户发起请求
↓
2. Claude Code 分析请求
↓
3. 选择合适的 MCP 工具
↓
4. 构建工具调用请求
↓
5. 发送到 MCP 服务器
↓
6. MCP 服务器执行工具
↓
7. 返回执行结果
↓
8. Claude Code 处理结果
↓
9. 返回给用户错误处理流程
1. 工具调用失败
↓
2. MCP 服务器捕获错误
↓
3. 构建错误响应
↓
4. 返回给 Claude Code
↓
5. Claude Code 显示错误
↓
6. 提供恢复建议传输方式
HTTP 传输
特点:远程可用、易部署、适合云服务。
Claude Code → HTTP 请求 → MCP 服务器
↓ ↓
HTTP 响应 ← 工具执行claude mcp add --transport http github https://api.githubcopilot.com/mcp/优势:
- 易扩展、支持负载均衡
- 适配云服务
- 跨平台
限制:
- 依赖稳定网络
- 可能存在延迟
- 需要处理超时与重试
SSE 传输
已弃用,不建议使用。
stdio 传输
适合本地工具集成:
Claude Code → stdout → MCP 服务器
↓ ↓
stdin ← 工具执行claude mcp add --transport stdio db -- npx -y @bytebase/dbhub优势:
- 无需网络
- 低延迟
- 本地通信更安全
限制:
- 仅限本地
- 需要进程管理
- 不适用于分布式
数据格式
MCP 使用 JSON-RPC 2.0 进行通信。
请求格式
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "tool_name",
"arguments": {
"param1": "value1"
}
}
}响应格式
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [
{
"type": "text",
"text": "Tool result"
}
]
}
}错误格式
{
"jsonrpc": "2.0",
"id": 1,
"error": {
"code": -32601,
"message": "Method not found"
}
}工具与资源定义
工具定义
{
"tools": [
{
"name": "query_database",
"description": "Query the database",
"inputSchema": {
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "SQL query"
}
},
"required": ["query"]
}
}
]
}资源定义
{
"resources": [
{
"uri": "database://users",
"name": "Users Table",
"description": "User data",
"mimeType": "application/json"
}
]
}状态管理
连接状态
/mcp
# 输出示例
MCP 服务器状态:
- github: 已连接
- sentry: 已连接
- database: 连接错误重连机制
连接断开
↓
等待重试间隔
↓
尝试重连
↓
成功 → 已连接
失败 → 继续重试性能优化
连接池
┌─────────────────┐
│ 连接池 │
├─────────────────┤
│ 连接 1 │
│ 连接 2 │
│ 连接 3 │
└─────────────────┘缓存机制
请求 → 检查缓存
↓
命中 → 返回缓存
未命中 → 执行请求
↓
缓存结果
↓
返回结果批处理
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "batch_query",
"arguments": {
"queries": [
"SELECT * FROM users LIMIT 10",
"SELECT * FROM orders LIMIT 10"
]
}
}
}安全机制
身份验证
Claude Code → OAuth 流程 → 访问令牌
↓
使用令牌访问Claude Code → API 密钥 → 服务器Claude Code → 证书 → 服务器加密传输
Claude Code → 加密数据 → MCP 服务器
↓
解密数据权限控制
{
"permissions": {
"tools": ["read", "write"],
"resources": ["database://users"],
"operations": ["query", "update"]
}
}调试和监控
# 启用详细日志
claude --verbose
# 启用调试模式
claude --debug-mcp
# 测试 MCP 服务器连接
/mcp test