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

On this page