个人中心

MCP 工作原理

MCP 的架构、通信流程与传输方式

概述

理解 MCP 的工作原理有助于更好地集成、调试并优化 MCP 服务器。

MCP 架构

客户端-服务器模型

┌─────────────────┐         ┌─────────────────┐
│   Claude Code   │         │  MCP 服务器     │
│   (客户端)      │◄──────►│   (服务器)       │
└─────────────────┘         └─────────────────┘
│                           │
│                           │
└─────────┬─────────────────┘
│
▼
┌──────────────┐
│  外部服务    │
└──────────────┘

组件说明:

  • Claude Code(客户端):发起工具调用、管理连接、处理响应
  • MCP 服务器:提供工具、执行调用、返回结果与错误
  • 外部服务:数据库、API、文件系统、CI/CD 等

通信流程

初始化流程

  1. 启动 Claude Code
  2. 加载配置
  3. 连接已配置 MCP 服务器
  4. 发现可用工具与资源

工具调用流程

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

本页目录