主题
11.4 MCP 工作原理
了解 MCP 的工作原理有助於更好地使用和除錯 MCP 伺服器,充分發揮其擴展能力。
MCP 架構
客戶端-伺服器模型
MCP 採用標準的客戶端-伺服器架構,實現了 Claude Code 與外部工具的解耦和通信:
┌─────────────────┐ ┌─────────────────┐
│ Claude Code │ │ MCP 伺服器 │
│ (客戶端) │◄──────►│ (伺服器) │
└─────────────────┘ └─────────────────┘
│ │
│ │
└─────────┬─────────────────┘
│
▼
┌──────────────┐
│ 外部服務 │
└──────────────┘組件說明
Claude Code (客戶端):
- 發起工具呼叫請求
- 處理伺服器回應
- 管理伺服器連接
- 提供使用者介面
MCP 伺服器:
- 提供工具和資源
- 執行工具呼叫
- 返回結果
- 處理錯誤
外部服務:
- 資料庫(PostgreSQL、MySQL、MongoDB 等)
- API(GitHub、AWS、Slack 等)
- 檔案系統(本地和遠端)
- 其他服務(CI/CD、監控、測試等)
通信流程
初始化流程
- 使用者啟動 Claude Code
- 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 傳輸
特點:
- 基於 HTTP 協議
- 支援遠端伺服器
- 適合雲服務
- 易於監控和除錯
流程:
Claude Code → HTTP 請求 → MCP 伺服器
↓ ↓
HTTP 回應 ← 工具執行示例:
bash
claude mcp add --transport http github https://api.githubcopilot.com/mcp/優勢:
- 易於部署和擴展
- 支援負載均衡
- 適合雲服務整合
- 跨平台相容性好
限制:
- 需要穩定的網路連接
- 可能存在網路延遲
- 需要處理超時和重試
stdio 傳輸
特點:
- 基於標準輸入輸出
- 本地程序通信
- 適合本地工具整合
流程:
Claude Code → stdout → MCP 伺服器
↓ ↓
stdin ← 工具執行示例:
bash
claude mcp add --transport stdio db -- npx -y @bytebase/dbhub優勢:
- 無需網路連接
- 低延遲回應
- 安全性高(本地通信)
- 適合敏感資料操作
限制:
- 僅限本地使用
- 需要程序管理
- 資源佔用較高
- 不適合分散式系統
資料格式
JSON-RPC
MCP 使用 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"
}
}工具定義
MCP 伺服器提供工具定義:
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 伺服器支援自動重連:
連接斷開
↓
等待重試間隔
↓
嘗試重連
↓
成功 → 已連接
失敗 → 繼續重試效能最佳化
連接池
MCP 使用連接池提高效能:
┌─────────────────┐
│ 連接池 │
├─────────────────┤
│ 連接 1 │
│ 連接 2 │
│ 連接 3 │
└─────────────────┘優勢:
- 減少連接開銷
- 提高回應速度
- 支援並發請求
快取機制
MCP 支援結果快取:
請求 → 檢查快取
↓
命中 → 返回快取
未命中 → 執行請求
↓
快取結果
↓
返回結果快取策略:
- 基於時間的過期
- 基於大小的限制
- 基於鍵的失效
批處理
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 支援多種身份驗證方式:
- OAuth 2.0:
Claude Code → OAuth 流程 → 存取令牌
↓
使用令牌存取- API 密鑰:
Claude Code → API 密鑰 → 伺服器- 憑證:
Claude Code → 憑證 → 伺服器加密傳輸
MCP 支援加密傳輸:
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最佳實踐
1. 合理配置
根據實際需求配置 MCP 伺服器,確保最佳效能和安全性。
2. 監控使用
定期監控 MCP 工具使用情況,識別效能瓶頸和最佳化機會。
3. 安全第一
確保 MCP 設定安全,保護敏感資料和資源。
4. 錯誤處理
妥善處理錯誤,提高系統可靠性和使用者體驗。