11.4 MCP 工作原理
瞭解 MCP 的工作原理有助於更好地使用和除錯 MCP 伺服器,充分發揮其擴充套件能力。
MCP 架构
客户端-服务器模型
MCP 採用標準的客戶端-伺服器架構,實現了 Claude Code 與外部工具的解耦和通訊:
bash
┌─────────────────┐ ┌─────────────────┐
│ Claude Code │ │ MCP 服务器 │
│ (客户端) │◄──────►│ (服务器) │
└─────────────────┘ └─────────────────┘
│ │
│ │
└─────────┬─────────────────┘
│
▼
┌──────────────┐
│ 外部服务 │
└──────────────┘
### 组件说明
1. **Claude Code (客户端)** :
* 发起工具调用请求
* 处理服务器响应
* 管理服务器连接
* 提供用户界面
2. **MCP 服务器** :
* 提供工具和资源
* 执行工具调用
* 返回结果
* 处理错误
3. **外部服务** :
* 数据库(PostgreSQL、MySQL、MongoDB 等)
* API(GitHub、AWS、Slack 等)
* 文件系统(本地和远程)
* 其他服务(CI/CD、监控、测试等)
## 通信流程
### 初始化流程- 使用者啟動 Claude Code
- Claude Code 載入配置
- 自動連線已配置的 MCP 伺服器
- 發現可用工具和資源
- 準備接收使用者請求
### 工具调用流程
bash
1. 用户发起请求
↓
2. Claude Code 分析请求
↓
3. 选择合适的 MCP 工具
↓
4. 构建工具调用请求
↓
5. 发送到 MCP 服务器
↓
6. MCP 服务器执行工具
↓
7. 返回执行结果
↓
8. Claude Code 处理结果
↓
9. 返回给用户
### 错误处理流程
bash
1. 工具调用失败
↓
2. MCP 服务器捕获错误
↓
3. 构建错误响应
↓
4. 返回给 Claude Code
↓
5. Claude Code 显示错误
↓
6. 提供恢复建议
## 传输方式
### HTTP 传输
**特点** :
* 基於 HTTP 協議
* 支援遠端伺服器
* 適合雲服務
* 易於監控和除錯
**流程** :
bash
Claude Code → HTTP 请求 → MCP 服务器
↓ ↓
HTTP 响应 ← 工具执行
**示例** :
bash
claude mcp add --transport http github https://api.githubcopilot.com/mcp/
**优势** :
* 易於部署和擴充套件
* 支援負載均衡
* 適合雲服務整合
* 跨平臺相容性好
**限制** :
* 需要穩定的網路連線
* 可能存在網路延遲
* 需要處理超時和重試
### SSE 传输
**特点** :
* 基於 Server-Sent Events
* 支援實時更新
* 已棄用,不建議使用
**注意** : SSE 傳輸已棄用,建議使用 HTTP 傳輸替代。
### stdio 传输
**特点** :
* 基於標準輸入輸出
* 本地程序通訊
* 適合本地工具整合
**流程** :
bash
Claude Code → stdout → MCP 服务器
↓ ↓
stdin ← 工具执行
**示例** :
bash
claude mcp add --transport stdio db -- npx -y @bytebase/dbhub
**优势** :
* 無需網路連線
* 低延遲響應
* 安全性高(本地通訊)
* 適合敏感資料操作
**限制** :
* 僅限本地使用
* 需要程序管理
* 資源佔用較高
* 不適合分散式系統
## 数据格式
### JSON-RPCMCP 使用 JSON-RPC 2.0 協議進行通訊,這是一種輕量級的遠端過程呼叫協議。
**请求格式** :
json
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "tool_name",
"arguments": {
"param1": "value1"
}
}
}
**响应格式** :
json
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [
{
"type": "text",
"text": "Tool result"
}
]
}
}
**错误格式** :
json
{
"jsonrpc": "2.0",
"id": 1,
"error": {
"code": -32601,
"message": "Method not found"
}
}
}
bash
### 工具定义
MCP 服务器提供工具定义:json
json
{ "tools": [ { "name": "query_database", "description": "Query the database", "inputSchema": { "type": "object", "properties": { "query": { "type": "string", "description": "SQL query" } }, "required": ["query"] } } ] }
**資源定義**
MCP 伺服器提供資源定義:
json
{
"resources": [
{
"uri": "database://users",
"name": "Users Table",
"description": "User data",
"mimeType": "application/json"
}
]
}
## 状态管理
### 连接状态
MCP 伺服器有多種連線狀態:
**狀態檢查**
bash
# 检查 MCP 服务器状态
/mcp
# 输出示例
MCP 服务器状态:
- github: 已连接
- sentry: 已连接
- database: 连接错误
**重連機制**
MCP 伺服器支援自動重連:
bash
连接断开
↓
等待重试间隔
↓
尝试重连
↓
成功 → 已连接
失败 → 继续重试
## 性能优化
### 连接池MCP 使用連線池提高效能:
bash
┌─────────────────┐
│ 连接池 │
├─────────────────┤
│ 连接 1 │
│ 连接 2 │
│ 连接 3 │
└─────────────────┘
**优势** :
* 減少連線開銷
* 提高響應速度
* 支援併發請求
### 快取機制
MCP 支援結果快取:
bash
请求 → 检查缓存
↓
命中 → 返回缓存
未命中 → 执行请求
↓
缓存结果
↓
返回结果
**缓存策略** :
* 基於時間的過期
* 基於大小的限制
* 基於鍵的失效
### 批處理
MCP 支援批次操作:
json
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "batch_query",
"arguments": {
"queries": [
"SELECT * FROM users LIMIT 10",
"SELECT * FROM orders LIMIT 10"
]
}
}
}
## 安全机制
### 身份验证MCP 支援多種身份驗證方式:
1. **OAuth 2.0** :
bash
Claude Code → OAuth 流程 → 访问令牌
↓
使用令牌访问
1. **API 密钥** :
bash
Claude Code → API 密钥 → 服务器
1. **证书** :
bash
Claude Code → 证书 → 服务器
### 加密传输MCP 支援加密傳輸:
bash
Claude Code → 加密数据 → MCP 服务器
↓
解密数据
**支持的加密** :
* TLS/SSL
* 自定義加密
### 許可權控制
MCP 提供細粒度許可權控制:
json
{
"permissions": {
"tools": ["read", "write"],
"resources": ["database://users"],
"operations": ["query", "update"]
}
}
## 调试和监控
### 日志记录MCP 伺服器記錄詳細日誌:
bash
# 启用详细日志
claude --verbose
# 日志示例
[INFO] MCP server connected: github
[DEBUG] Tool call: query_database
[INFO] Tool result: 10 rows
## 性能监控MCP 提供效能監控功能,幫助使用者瞭解工具呼叫的效率和質量。
bash
# 查看性能指标
显示 MCP 性能统计
# 输出示例
MCP 性能统计:
- github: 平均响应时间 100ms,成功率 98%
- database: 平均响应时间 50ms,成功率 99.5%
- sentry: 平均响应时间 200ms,成功率 95%
## 错误追踪MCP 提供詳細的錯誤追蹤功能,幫助使用者定位和解決問題。
bash
# 查看错误日志
显示 MCP 错误日志
# 输出示例
MCP 错误日志:
- database: 连接超时 (3 次),最后一次 5 分钟前
- github: API 限流 (1 次),最后一次 10 分钟前
- sentry: 认证失败 (2 次),最后一次 15 分钟前
## 调试技巧
### 启用调试模式
bash
# 启用调试模式
claude --debug-mcp
### 查看详细日志
bash
# 查看详细 MCP 日志
claude --verbose
### 测试服务器连接
bash
# 测试 MCP 服务器连接
/mcp test