目 录CONTENT

文章目录

LLM - MCP

PySuper
2025-05-17 / 0 评论 / 0 点赞 / 0 阅读 / 0 字
温馨提示:
所有牛逼的人都有一段苦逼的岁月。 但是你只要像SB一样去坚持,终将牛逼!!! ✊✊✊

工具集成与 MCP 协议

本文档系统阐述 AI Agent 的工具集成体系与 MCP(Model Context Protocol)协议,涵盖从协议架构、Server/Client 开发、Schema 设计、安全权限、错s误处理到传输层、版本管理与完整工具生态的全链路技术知识


1. MCP 概念与架构

1.1 定义

MCP(Model Context Protocol,模型上下文协议)是由 Anthropic 提出的开放标准协议,用于规范 AI 模型(LLM)与外部工具、资源、数据源之间的连接方式。MCP 的目标是将"AI 如何调用工具"这一过程标准化,使任意 Host(宿主应用)能够通过统一的 Client-Server 架构接入任意第三方工具,避免为每个工具编写定制化集成代码

1.2 核心问题:为什么需要 MCP

在 MCP 出现之前,工具集成面临三大痛点:

痛点1: M x N 集成爆炸
  M 个 AI 应用 x N 个工具 = M x N 套定制集成代码
  每新增一个工具,所有应用都要适配

痛点2: 接口不统一
  应用A 用 OpenAI Function Calling 格式
  应用B 用自定义 JSON 格式

痛点3: 能力发现缺失
  应用无法动态发现工具提供哪些能力

MCP 的解法: M + N 集成模式
  M 个 Host 各实现 1 个 MCP Client
  N 个工具各实现 1 个 MCP Server
  集成复杂度从 O(M*N) 降为 O(M+N)

1.3 三层架构:Host / Client / Server

┌─────────────────────────────────────────────────────────┐
│                      Host(宿主)                        │
│   运行 Agent 的应用程序                                  │
│   例如: Claude Desktop, VS Code, 自研 Agent 平台          │
│                                                         │
│   ┌─────────────┐  ┌─────────────┐  ┌─────────────┐    │
│   │ MCP Client A│  │ MCP Client B│  │ MCP Client C│    │
│   │ (连接搜索   )│  │ (连接数据库 )│  │ (连接文件系统)│    │
│   └──────┬──────┘  └──────┬──────┘  └──────┬──────┘    │
└──────────┼────────────────┼────────────────┼───────────┘
           │ JSON-RPC 2.0   │                │
           ▼                ▼                ▼
    ┌──────────┐     ┌──────────┐     ┌──────────┐
    │MCP Server│     │MCP Server│     │MCP Server│
    │ Tools    │     │ Tools    │     │ Tools    │
    │ Resources│     │ Resources│     │ Resources│
    │ Prompts  │     │ Prompts  │     │ Prompts  │
    └──────────┘     └──────────┘     └──────────┘
    独立进程          独立进程          独立进程

角色

职责

生命周期

示例

Host

运行 Agent、管理 Client、决策工具调用

应用级

Claude Desktop、IDE

Client

协议桥梁,连接 Server、转发请求、发现能力

会话级

Host 内部的协议适配器

Server

提供工具/资源/提示,执行实际操作

进程级

搜索 Server、数据库 Server

1.4 三种资源类型

┌──────────────┬───────────────────────────────────────────┐
│  Tools(工具)│ 可执行的函数,Client 调用,Server 执行返回    │
│              │ 例: search("query"), calculate("1+1")    │
├──────────────┼───────────────────────────────────────────┤
│Resources(资源)│ 可读取的数据,Client 通过 URI 读取           │
│              │ 例: file:///data/report.pdf              │
├──────────────┼───────────────────────────────────────────┤
│Prompts(提示) │ 预定义的提示模板,Client 获取并填充参数       │
│              │ 例: code_review(language, code)          │
└──────────────┴───────────────────────────────────────────┘

1.5 JSON-RPC 2.0 通信协议

请求消息:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": { "name": "search", "arguments": { "query": "LangGraph" } }
}

成功响应:

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": { "content": [{ "type": "text", "text": "LangGraph 是 Agent 编排框架" }] }
}

错误响应:

{
  "jsonrpc": "2.0",
  "id": 1,
  "error": { "code": -32602, "message": "Invalid params: missing 'query'" }
}

核心方法:

初始化:    initialize / initialized
工具:      tools/list -> 列出工具;  tools/call -> 调用工具
资源:      resources/list -> 列出资源;  resources/read -> 读取资源
提示:      prompts/list -> 列出提示;  prompts/get -> 获取提示

1.6 通信时序

Client                              Server
  │  ── initialize ──────────────────>│  协商能力
  │  ── initialized ─────────────────>│
  │  ── tools/list ──────────────────>│  发现工具
  │  <── tools list ─────────────────│
  │  ── tools/call(search) ──────────>│  执行工具
  │  <── search result ──────────────│
  │  ── resources/read(uri) ────────>│  读取资源
  │  <── resource content ───────────│

1.7 与其他概念的关联

  • -> MCP Server 开发:Server 是协议的提供方

  • -> MCP Client 集成:Client 是协议的消费方

  • -> 工具 Schema 设计:工具定义采用 JSON Schema

  • -> MCP 传输层:JSON-RPC 消息通过 stdio 或 HTTP 传输


2. MCP Server 开发

2.1 定义

MCP Server 是工具能力的提供方,作为独立进程运行,通过 MCP 协议向 Client 暴露 Tools、Resources、Prompts 三种能力。核心职责:注册工具定义、接收调用请求、执行业务逻辑、返回结构化结果。

对应 Demo: demos/05_工具集成与MCP/02_MCP_Server开发.py

2.2 Server 核心组件

┌─────────────────────────────────────────────────────┐
│                   MCP Server                         │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐ │
│  │  工具注册表  │  │  资源注册表  │  │  提示注册表  │ │
│  └──────┬──────┘  └──────┬──────┘  └──────┬──────┘ │
│         ▼                ▼                 ▼        │
│  ┌──────────────────────────────────────────────┐  │
│  │            请求路由器 (Router)                 │  │
│  │  tools/list -> 返回工具列表                    │  │
│  │  tools/call -> 路由到对应处理函数              │  │
│  └──────────────────────┬───────────────────────┘  │
│                         ▼                           │
│  ┌──────────────────────────────────────────────┐  │
│  │       JSON-RPC 传输层 (stdio / HTTP)         │  │
│  └──────────────────────────────────────────────┘  │
└─────────────────────────────────────────────────────┘

2.3 使用 MCP SDK 开发 Server

import asyncio
from mcp import types
from mcp.server import Server

# 创建 Server 实例
server = Server("knowledge-server")


@server.list_tools()
async def handle_list_tools() -> list[types.Tool]:
    """列出 Server 提供的所有工具"""
    return [
        types.Tool(
            name="search_knowledge",
            description="搜索知识库",
            inputSchema={
                "type": "object",
                "properties": {
                    "query": {"type": "string", "description": "搜索关键词"}
                },
                "required": ["query"],
            },
        ),
    ]


@server.call_tool()
async def handle_call_tool(name: str, arguments: dict) -> list[types.TextContent]:
    """处理工具调用请求"""
    if name == "search_knowledge":
        query = arguments.get("query", "")
        result = search_knowledge(query)
        return [types.TextContent(type="text", text=result)]
    raise ValueError(f"Unknown tool: {name}")

2.4 工具定义三要素

工具定义三要素:

  name        -> Client 用于路由调用 (唯一标识, snake_case)
  description -> LLM 用于判断"是否该用这个工具" (至关重要!)
  inputSchema -> LLM 用于构造正确的调用参数 (JSON Schema)

description 写得好坏,直接决定 LLM 能否正确选择工具!

2.5 工具处理函数模式

async def tool_handler(arguments: dict) -> list[types.TextContent]:
    """工具处理函数标准模式: 提取 -> 校验 -> 执行 -> 封装 -> 错误处理"""
    expression = arguments.get("expression")
    if not expression:
        raise ValueError("缺少必要参数: expression")

    try:
        result = eval(expression, {"__builtins__": {}}, {})
    except Exception as e:
        return [types.TextContent(type="text", text=f"计算错误: {e}")]

    return [types.TextContent(type="text", text=f"计算结果: {result}")]

2.6 Server 启动与运行

from mcp.server.stdio import stdio_server

async def main():
    """启动 MCP Server,通过 stdio 传输通信"""
    async with stdio_server() as (read_stream, write_stream):
        await server.run(read_stream, write_stream)

if __name__ == "__main__":
    asyncio.run(main())

2.7 与其他概念的关联

  • <- MCP 概念与架构:Server 是协议架构中的提供方

  • -> MCP Client 集成:Client 连接 Server 发现并调用工具

  • -> 工具 Schema 设计:工具定义使用 JSON Schema

  • -> MCP 传输层:Server 通过传输层与 Client 通信


3. MCP Client 集成

3.1 定义

MCP Client 是 Host 内部的协议桥梁,负责连接一个或多个 MCP Server,发现各 Server 提供的工具能力,并聚合后暴露给 Agent。核心职责:管理连接、发现工具、路由调用、聚合结果。

对应 Demo: demos/05_工具集成与MCP/03_MCP_Client集成.py

3.2 多 Server 架构

┌──────────────────────────────────────────────────────────┐
│                        Agent (LLM + 决策)                 │
└──────────────────────┬───────────────────────────────────┘
                       │ 统一工具列表
                       ▼
┌──────────────────────────────────────────────────────────┐
│              AgentToolManager(工具管理器)                 │
│   - 聚合所有 Server 的工具                                │
│   - 自动路由: 根据工具名找到对应 Server                   │
│   - 去重: 处理多 Server 同名工具冲突                      │
│   ┌──────────┐  ┌──────────┐  ┌──────────┐              │
│   │ Client A │  │ Client B │  │ Client C │              │
│   └─────┬────┘  └─────┬────┘  └─────┬────┘              │
└─────────┼─────────────┼─────────────┼───────────────────┘
          ▼             ▼             ▼
     ┌─────────┐  ┌─────────┐  ┌─────────┐
     │搜索工具集│  │数据库工具│  │文件工具集│
     └─────────┘  └─────────┘  └─────────┘

3.3 工具发现与自动路由

class AgentToolManager:
    """Agent 工具管理器:聚合多 Server 工具,自动路由调用"""

    def __init__(self):
        self.clients: dict[str, MCPClient] = {}
        self.tool_registry: dict[str, str] = {}  # tool_name -> server_name

    def discover_tools(self):
        """发现所有已连接 Server 的工具"""
        all_tools = []
        for server_name, client in self.clients.items():
            tools = client.list_tools()
            for tool in tools:
                self.tool_registry[tool.name] = server_name
                all_tools.append(tool)
        return all_tools

    async def call_tool(self, tool_name: str, arguments: dict):
        """自动路由:根据工具名找到对应 Server 并调用"""
        if tool_name not in self.tool_registry:
            raise KeyError(f"工具 '{tool_name}' 未注册")
        server_name = self.tool_registry[tool_name]
        client = self.clients[server_name]
        return await client.call_tool(tool_name, arguments)

3.4 工具冲突处理

冲突场景: Server A "search"(网络) vs Server B "search"(本地)

处理策略:
  ┌────────────────┬──────────────────────────────────┐
  │ 命名空间前缀    │ 工具名改为 "web_search"/"file_search"│
  │ (推荐)          │ 消除歧义                          │
  ├────────────────┼──────────────────────────────────┤
  │ 优先级覆盖      │ 高优先级 Server 的工具覆盖低优先级 │
  ├────────────────┼──────────────────────────────────┤
  │ 显式指定        │ "serverA.search"/"serverB.search" │
  └────────────────┴──────────────────────────────────┘

3.5 与其他概念的关联

  • <- MCP Server 开发:Client 连接 Server 获取能力

  • -> 工具 Schema 设计:Client 聚合各 Server 的工具 Schema

  • -> 工具错误处理:Client 需处理 Server 调用失败的情况

  • -> 常用工具集成:多 Server 集成各种常用工具


4. 工具 Schema 设计

4.1 定义

工具 Schema 是描述工具接口的元数据,采用 JSON Schema 格式定义工具的名称、描述、参数类型、参数约束等信息。Schema 是 LLM 理解工具能力的唯一途径。

对应 Demo: demos/05_工具集成与MCP/04_工具Schema设计.py

4.2 好 Schema vs 坏 Schema 对比

=== 坏 Schema ===
{
  "name": "search",
  "description": "搜索",            <-- 太模糊!
  "inputSchema": {
    "properties": {
      "q": { "type": "string" },    <-- 参数名不清晰,无描述
      "n": { "type": "number" }     <-- n 是什么?
    }
  }
}
问题: LLM 不知道何时用、怎么用

=== 好 Schema ===
{
  "name": "search_web",
  "description": "在互联网上搜索信息,返回相关网页摘要。
    适用于需要查找最新资讯、事实核查的场景。
    不适用于搜索本地文件或数据库。",
  "inputSchema": {
    "properties": {
      "query": {
        "type": "string",
        "description": "搜索查询词,如 'Python 异步编程'"
      },
      "max_results": {
        "type": "integer",
        "description": "返回结果数量,1-20",
        "minimum": 1, "maximum": 20, "default": 5
      }
    },
    "required": ["query"]
  }
}
优势: LLM 能准确判断何时用、如何构造参数

4.3 Schema 设计六原则

┌──────────────┬─────────────────────────────────────────────┐
│ 1. 名称清晰   │ 动词+名词: search_web, query_database      │
│ 2. 描述详尽   │ 做什么 + 何时用 + 何时不适用 + 示例         │
│ 3. 参数自解释 │ 每个参数有 description, 参数名语义化        │
│ 4. 约束明确   │ min/max/enum 限定取值, 标注 required       │
│ 5. 合理默认值 │ 可选参数提供 default, 减少 LLM 填写量       │
│ 6. 类型精确   │ enum 代替 string(取值有限时), format 指定  │
└──────────────┴─────────────────────────────────────────────┘

4.4 参数校验

import jsonschema

def validate_tool_args(schema: dict, arguments: dict) -> tuple[bool, str]:
    """使用 JSON Schema 校验工具参数"""
    try:
        jsonschema.validate(arguments, schema)
        return True, "校验通过"
    except jsonschema.ValidationError as e:
        return False, f"参数校验失败: {e.message}"

# 合法: validate_tool_args(schema, {"query": "LangGraph", "limit": 10})  -> True
# 缺少必填: validate_tool_args(schema, {"limit": 10})  -> False
# 类型错误: validate_tool_args(schema, {"query": "test", "limit": "ten"})  -> False

4.5 与其他概念的关联

  • <- MCP Server 开发:Schema 是工具注册时的核心元数据

  • -> 工具安全与权限:Schema 中的约束是安全的第一道防线

  • -> 工具错误处理:参数校验失败需返回清晰的错误信息


5. 工具安全与权限

5.1 定义

工具安全确保 Agent 调用外部工具时不造成数据泄露、系统破坏、越权访问等风险。权限系统根据工具风险等级,实施不同级别的审批、约束和防护。

对应 Demo: demos/05_工具集成与MCP/05_工具安全与权限.py

5.2 五级风险分类

┌─────────┬──────────┬──────────────────────┬─────────────────┐
│ Level 0 │ 无风险    │ calculate, format    │ 无需审批         │
│ Level 1 │ 低风险    │ search, query_db     │ 记录日志,自动执行│
│ Level 2 │ 中风险    │ read_file, http_get  │ 首次需用户确认   │
│ Level 3 │ 高风险    │ write_file, db_update│ 每次需用户确认   │
│ Level 4 │ 极高风险  │ exec_cmd, run_code   │ 确认+沙箱+审计   │
└─────────┴──────────┴──────────────────────┴─────────────────┘

5.3 路径控制(防穿越攻击)

import os

class PathGuard:
    """路径安全守卫:防止路径穿越攻击"""

    def __init__(self, allowed_roots: list[str]):
        self.allowed_roots = [os.path.realpath(r) for r in allowed_roots]

    def validate_path(self, path: str) -> tuple[bool, str]:
        """验证路径是否在允许范围内"""
        real_path = os.path.realpath(path)  # 解析 ../ 和符号链接
        for root in self.allowed_roots:
            if real_path.startswith(root + os.sep) or real_path == root:
                return True, real_path
        return False, f"路径 '{path}' 超出允许范围"

# 攻击: /data/workspace/../../../etc/passwd -> 解析为 /etc/passwd -> 拒绝
# 防护: 始终用 os.path.realpath() 解析后再校验

5.4 SQL 注入防护

class SQLGuard:
    """SQL 安全守卫"""

    DANGEROUS = ["DROP", "DELETE", "TRUNCATE", "ALTER", "INSERT",
                 "UPDATE", "CREATE", "GRANT", "REVOKE", "--", ";"]

    def validate_sql(self, sql: str) -> tuple[bool, str]:
        """验证 SQL 安全性"""
        sql_upper = sql.upper()
        if not sql_upper.strip().startswith("SELECT"):
            return False, "仅允许 SELECT 查询"
        for pattern in self.DANGEROUS:
            if pattern in sql_upper:
                return False, f"检测到危险操作: {pattern}"
        if sql.count(";") > 1:
            return False, "禁止多语句执行"
        return True, "SQL 校验通过"

    # 正确: cursor.execute("SELECT * FROM users WHERE name = ?", (user_input,))
    # 危险: cursor.execute(f"SELECT * FROM users WHERE name = '{user_input}'")

5.5 安全检查流程

  Agent 请求调用工具
    -> 1. 参数校验 (Schema)
    -> 2. 风险评估 (确定等级)
    -> 3. 权限检查 (角色/路径/SQL)
    -> 4. 审批确认 (高危需 HITL)
    -> 5. 沙箱执行 (Critical 级别)
    -> 6. 审计记录 (调用详情追溯)

5.6 与其他概念的关联

  • <- 工具 Schema 设计:Schema 约束是安全的第一道防线

  • -> 工具错误处理:安全检查失败属于一种错误场景

  • -> 完整工具生态:安全策略是工具生态的核心组件


6. 工具错误处理

6.1 定义

工具错误处理对调用外部工具时发生的各类错误进行分类处理,通过重试、超时、降级、幂等性等策略保障系统鲁棒性。

对应 Demo: demos/05_工具集成与MCP/06_工具错误处理.py

6.2 错误类型分类

┌─────────────────┬──────────────────────┬──────────────────┐
│ TRANSIENT       │ 网络抖动、暂时不可用   │ 指数退避重试      │
│ VALIDATION      │ 参数错误、缺失必填     │ 不重试,返回错误   │
│ PERMISSION      │ 权限不足、路径越权     │ 不重试,请求人工   │
│ TIMEOUT         │ 工具执行超时          │ 超时后重试或降级  │
│ NOT_FOUND       │ 工具不存在、资源已删   │ 不重试,告知 LLM  │
│ RATE_LIMIT      │ 请求频率超限          │ 等待后重试       │
└─────────────────┴──────────────────────┴──────────────────┘

6.3 重试策略:指数退避

async def retry_with_backoff(func, args, config: RetryConfig):
    """带指数退避的重试执行"""
    for attempt in range(config.max_retries + 1):
        try:
            return await func(*args)
        except ToolError as e:
            if e.error_type not in config.retry_on:
                raise  # 不可重试的错误
            if attempt == config.max_retries:
                raise  # 重试次数用尽
            delay = min(config.base_delay * (2 ** attempt), config.max_delay)
            if config.jitter:
                delay *= (0.5 + random.random() * 0.5)  # 随机抖动
            await asyncio.sleep(delay)
指数退避时序:
  调用1: 失败 -> 等待 1s
  调用2: 失败 -> 等待 2s
  调用3: 失败 -> 等待 4s
  调用4: 成功! (或达到 max_retries)
  抖动作用: 避免多客户端同时重试造成"重试风暴"

6.4 降级策略

降级链:
  主工具: GPT-4 API        <- 失败(限流)
    | 降级
  备选1: GPT-3.5 API       <- 失败(超时)
    | 降级
  备选2: 本地小模型         <- 成功
    |
  返回结果(质量降低,但服务不中断)
  降级原则: 质量递减,可用性递增

6.5 幂等性

非幂等操作(需特别处理):
  POST /transfer <- 重复执行会多扣钱!
  需要幂等键: idempotency-key = "txn_001"
  相同 key 的重复请求 -> 返回首次结果

天然幂等操作(可安全重试):
  GET /user/123 <- 读取无副作用
  PUT /user/123 <- 全量更新,结果一致
  DELETE /user/123 <- 已删除再删也无影响

6.6 错误处理策略矩阵

┌─────────────┬──────┬──────┬──────┬──────┐
│ 错误类型     │ 重试 │ 超时 │ 降级 │ 幂等 │
│ TRANSIENT   │ 是   │ -    │ 可选 │ 检查 │
│ VALIDATION  │ 否   │ -    │ 否   │ -    │
│ PERMISSION  │ 否   │ -    │ 否   │ -    │
│ TIMEOUT     │ 是   │ 是   │ 是   │ 必须 │
│ NOT_FOUND   │ 否   │ -    │ 是   │ -    │
│ RATE_LIMIT  │ 是   │ -    │ 是   │ 检查 │
└─────────────┴──────┴──────┴──────┴──────┘

6.7 与其他概念的关联

  • <- 工具安全与权限:权限拒绝是一种需要处理的错误

  • -> 常用工具集成:每种工具集成都需要错误处理

  • -> 完整工具生态:错误处理是工具生态的可靠性保障


7. 常用工具集成

7.1 定义

常用工具集成将搜索、数据库、文件操作、代码执行、浏览器自动化、通信通知等常见能力封装为 MCP 工具,供 Agent 按需调用。

对应 Demo: demos/05_工具集成与MCP/07_常用工具集成.py

7.2 六大类常用工具

┌──────────┬───────────────┬─────────────────────────────┐
│ 搜索类    │ web_search    │ Low (只读)                  │
│ 数据库类  │ sql_query     │ Low(读) / High(写)          │
│ 文件类    │ read_file     │ Medium / High(write)        │
│ 代码类    │ run_python    │ Critical (需沙箱)           │
│ 浏览器类  │ navigate      │ Medium                      │
│ 通信类    │ send_email    │ High                        │
└──────────┴───────────────┴─────────────────────────────┘

7.3 各类工具示例

# 搜索工具: 调用搜索 API,返回 JSON 格式结果
async def web_search(query: str, max_results: int = 5) -> str:
    """在互联网上搜索信息"""
    results = await search_api.search(query, max_results)
    return json.dumps([{"title": r.title, "url": r.url} for r in results])

# 数据库工具: SQL 安全检查 + 参数化执行
async def sql_query(connection: str, sql: str) -> str:
    """执行 SQL 查询(仅 SELECT)"""
    is_safe, msg = sql_guard.validate_sql(sql)
    if not is_safe:
        return f"SQL 安全检查失败: {msg}"
    rows = await get_connection(connection).execute(sql)
    return json.dumps(rows)

# 文件工具: 路径检查 + 大小限制
async def read_file(path: str, encoding: str = "utf-8") -> str:
    """读取文件内容(路径必须在允许范围内)"""
    is_safe, real_path = path_guard.validate_path(path)
    if not is_safe:
        return f"路径访问被拒绝: {real_path}"
    if os.path.getsize(real_path) > 10 * 1024 * 1024:
        return "文件过大,超过 10MB 限制"
    with open(real_path, encoding=encoding) as f:
        return f.read()

# 代码执行: 必须在沙箱中
async def run_python(code: str, timeout: float = 10.0) -> str:
    """在沙箱中执行 Python 代码"""
    result = await sandbox.execute(code=code, timeout=timeout,
        allowed_imports=["math", "json", "re", "datetime"], max_memory="256MB")
    return result.output

7.4 工具选择决策树

Agent 决策使用哪个工具?
  需要外部信息? ──> web_search / kb_search
  需要查询数据? ──> sql_query / nosql_query
  需要读写文件? ──> read_file / write_file
  需要执行计算? ──> run_python / calculate
  需要浏览网页? ──> browser_navigate
  需要发送通知? ──> send_email / send_message

7.5 与其他概念的关联

  • <- MCP Client 集成:常用工具通过 MCP Server 提供给 Client

  • <- 工具 Schema 设计:每种工具都需要精心设计的 Schema

  • -> 工具安全与权限:不同工具有不同风险等级

  • -> 工具错误处理:每种工具需要针对性的错误处理


8. MCP 传输层

8.1 定义

MCP 传输层是 Client 与 Server 之间传递 JSON-RPC 消息的底层通信通道,定义了 stdio 和 Streamable HTTP 两种标准传输方式。

对应 Demo: demos/05_工具集成与MCP/08_MCP传输层.py

8.2 两种传输方式对比

┌────────────────┬─────────────────────┬─────────────────────────┐
│ 通信方式        │ stdin/stdout        │ HTTP POST + SSE          │
│ 部署模式        │ 本地(同机)          │ 本地或远程               │
│ Server 形态     │ 子进程              │ 独立服务                 │
│ 延迟            │ 极低(管道)          │ 较低(HTTP 开销)          │
│ 安全性          │ 进程隔离            │ 需 TLS + 认证            │
│ 多 Client       │ 1:1                 │ 1:N                      │
│ 典型场景        │ IDE 插件、本地工具  │ 云端服务、共享工具        │
└────────────────┴─────────────────────┴─────────────────────────┘

8.3 stdio 传输架构

  Host 进程
  ┌────────────────────────────────────┐
  │  Agent -> MCP Client               │
  │    │ 写 stdin        读 stdout     │
  │    v                    ^          │
  │  ┌──┐  stdin pipe  ┌──┐           │
  │  │  │─────────────>│  │           │
  │  │  │<─────────────│  │           │
  │  └──┘ stdout pipe  └──┘           │
  └─────────┬──────────────────────────┘
            v fork/exec
  ┌────────────────────┐
  │  MCP Server 进程    │
  │  读 stdin/write stdout│
  └────────────────────┘
  特点: 父子进程关系,管道通信,零网络开销

8.4 Streamable HTTP 传输架构

  Host 进程                    远程 HTTP Server
  ┌──────────────┐            ┌──────────────────┐
  │  MCP Client  │  HTTP POST │  MCP HTTP Server  │
  │    │─────────┼───────────>│    │ 路由到处理函数 │
  │    │<────────┼───────────│    │               │
  └──────────────┘  +SSE响应   └──────────────────┘
  流程: POST(JSON-RPC) -> SSE 流(多个响应) -> 连接复用

8.5 传输层选择决策

  工具需要远程访问?
  ├── 否 ──> stdio (零配置,零延迟,进程隔离安全)
  └── 是 ──> Streamable HTTP
      ├── 多 Client 共享? ──> HTTP (1:N)
      ├── 负载均衡? ────────> HTTP (可加 LB)
      └── 容器部署? ────────> HTTP (云原生友好)

8.6 与其他概念的关联

  • <- MCP Server 开发:Server 通过传输层提供能力

  • <- MCP Client 集成:Client 通过传输层连接 Server

  • -> 完整工具生态:传输层是工具生态的通信基础


9. 工具版本管理

9.1 定义

工具版本管理对 MCP 工具的迭代演进进行系统化管理,采用 SemVer 标识变更,管理兼容性,并在废弃时提供平滑迁移路径。

对应 Demo: demos/05_工具集成与MCP/09_工具版本管理.py

9.2 语义化版本(SemVer)

版本号格式: MAJOR.MINOR.PATCH

  1.4.2
  │ │ └── PATCH: 补丁版本(向后兼容的 Bug 修复)
  │ └──── MINOR: 次版本(向后兼容的功能新增)
  └────── MAJOR: 主版本(不兼容的 API 变更)

变更类型与版本号:
  Bug 修复      1.4.2 -> 1.4.3  (完全兼容)
  新增可选参数   1.4.2 -> 1.5.0  (向后兼容)
  删除参数      1.4.2 -> 2.0.0  (不兼容 Breaking)
  修改参数类型   1.4.2 -> 2.0.0  (不兼容)

9.3 版本兼容性规则

  ^1.0.0 (>=1.0.0,<2.0.0): 1.0.0~1.9.9 兼容, 2.0.0 不兼容
  ~1.4.0 (>=1.4.0,<1.5.0): 1.4.0~1.4.9 兼容, 1.5.0 不兼容
  1.4.2 (精确匹配):         仅 1.4.2 兼容

9.4 废弃流程

阶段1: Deprecation Warning (废弃警告)
  - 标记 deprecated: true
  - 调用时返回警告(但仍执行)
  - 设定 sunset_date (如 6 个月后)

阶段2: Sunset (日落)
  - 调用时返回错误"工具已废弃"
  - 提供替代方案建议
  - 不再执行逻辑

阶段3: Removal (移除)
  - 从 tools/list 中完全移除

9.5 版本变更类型

class VersionChange(Enum):
    """版本变更类型"""
    PATCH = "patch"        # Bug 修复,完全兼容
    MINOR = "minor"        # 新增功能,向后兼容
    MAJOR = "major"        # 破坏性变更,不兼容
    DEPRECATION = "deprecation"  # 废弃警告
    REMOVAL = "removal"    # 完全移除

9.6 与其他概念的关联

  • <- 工具 Schema 设计:Schema 变更驱动版本号变更

  • -> 完整工具生态:版本管理是工具生态的治理能力

  • -> MCP 传输层:版本协商在连接初始化时进行


10. 完整工具生态

10.1 定义

完整工具生态(ToolEcosystem)是将 MCP 协议、Server/Client、Schema 设计、安全权限、错误处理、传输层、版本管理等所有组件有机集成的统一系统,提供从工具注册、发现、调用、监控到退役的全生命周期管理。

对应 Demo: demos/05_工具集成与MCP/10_完整工具生态.py

10.2 生态架构总览

┌──────────────────────────────────────────────────────────────┐
│                    ToolEcosystem(工具生态)                   │
│  ┌────────────┐  ┌────────────┐  ┌────────────┐             │
│  │  Agent     │  │  监控面板   │  │  版本注册表 │             │
│  └─────┬──────┘  └─────┬──────┘  └─────┬──────┘             │
│        ▼               ▼               ▼                     │
│  ┌──────────────────────────────────────────────────────┐    │
│  │              统一 API 层 (Unified API)               │    │
│  └──────────────────────┬───────────────────────────────┘    │
│        ┌────────────────┼────────────────┐                   │
│        ▼                ▼                ▼                   │
│  ┌───────────┐  ┌───────────┐  ┌───────────┐               │
│  │安全策略层  │  │错误处理层  │  │传输管理层  │               │
│  └─────┬─────┘  └─────┬─────┘  └─────┬─────┘               │
│        ▼              ▼               ▼                     │
│  ┌──────────────────────────────────────────────────────┐    │
│  │           MCP Client 池 (Multi-Server)               │    │
│  └──────────────────────┬───────────────────────────────┘    │
└─────────────────────────┼────────────────────────────────────┘
                          │ JSON-RPC 2.0
                          ▼
                   多个 MCP Server

10.3 核心组件集成

class ToolEcosystem:
    """完整工具生态:集成所有工具管理能力"""

    def __init__(self):
        self.tool_manager = AgentToolManager()        # 工具管理
        self.security = SecurityPolicy()              # 安全策略
        self.error_handler = RobustToolExecutor()     # 错误处理
        self.version_registry = ToolVersionRegistry() # 版本管理
        self.monitor = CallMonitor()                  # 调用监控

    async def call_tool(self, tool_name: str, args: dict, context: dict):
        """统一的工具调用入口(集成所有能力)"""
        # 1. 版本兼容性检查
        self.version_registry.get_compatible(tool_name, "^1.0.0")
        # 2. 安全检查
        allowed, reason = self.security.check_permission(
            tool_name, args, context.get("user_role", "user"))
        if not allowed:
            return CallResult(success=False, error=reason)
        # 3. 带错误处理的调用
        result = await self.error_handler.execute(
            self.tool_manager.call_tool, (tool_name, args))
        # 4. 记录调用(监控/审计)
        self.monitor.record(CallRecord(tool=tool_name, args=args, result=result))
        return result

10.4 调用全流程

ToolEcosystem 工具调用全流程:
  Agent 调用 call_tool("search", {"query": "MCP"})
    -> 1. 版本检查: 是否有兼容版本?
    -> 2. 安全检查: 风险等级? 权限? 路径? SQL?
    -> 3. 参数校验: Schema 校验
    -> 4. 路由到 Server: 找到提供此工具的 MCP Server
    -> 5. 错误处理包装: 重试/超时/降级
    -> 6. 传输层调用: stdio 或 HTTP 发送 JSON-RPC
    -> 7. Server 执行: 运行业务逻辑
    -> 8. 结果返回: 经过错误处理层检查
    -> 9. 监控记录: 调用详情、延迟、成本
    -> 10. 返回给 Agent

10.5 工具全生命周期

工具生命周期:
  注册 -> 发现 -> 调用 -> 监控 -> 版本升级 -> 废弃 -> 移除
  Schema  tools/  tools/  记录    SemVer     警告    tools/
  定义    list    call    调用    版本号     日志    list

10.6 生态健康度指标

┌────────────────┬──────────────────────────────────┐
│ 工具可用率      │ 可调用工具数 / 注册工具数          │
│ 调用成功率      │ 成功调用数 / 总调用数              │
│ 平均延迟        │ 所有工具调用的平均响应时间         │
│ 错误率          │ 按错误类型分布的错误占比           │
│ 版本覆盖率      │ 使用最新版本的 Agent 占比          │
│ 废弃工具使用率  │ 仍在调用已废弃工具的占比(应趋近 0) │
└────────────────┴──────────────────────────────────┘

10.7 与其他概念的关联

  • <- MCP 概念与架构:生态基于 MCP 协议构建

  • <- MCP Server/Client:生态管理多 Server/Client

  • <- 工具 Schema 设计:生态使用 Schema 描述工具

  • <- 工具安全与权限:生态集成安全策略

  • <- 工具错误处理:生态提供鲁棒的错误处理

  • <- MCP 传输层:生态支持多种传输方式

  • <- 工具版本管理:生态治理工具版本演进


概念关系总览

                    ┌──────────────────────────────────────────┐
                    │          MCP 工具集成技术体系              │
                    └──────────────────────────────────────────┘

  协议层                        能力层                    治理层
    │                             │                        │
    ▼                             ▼                        ▼
┌──────────┐              ┌────────────┐           ┌────────────┐
│MCP 概念   │──> Server ──>│ Schema 设计│──────────>│ 安全与权限  │
│与架构    │    开发       │            │           │            │
└────┬─────┘              └────────────┘           └────────────┘
     │                          │                        │
     ▼                          ▼                        ▼
┌──────────┐              ┌────────────┐           ┌────────────┐
│MCP 传输层 │              │常用工具集成 │<──────────│ 错误处理    │
│(stdio/   │              │(搜索/DB/   │           │(重试/超时/  │
│ HTTP)    │              │ 文件/代码) │           │ 降级/幂等) │
└────┬─────┘              └────────────┘           └────────────┘
     │                          │                        │
     │                          ▼                        ▼
     │              ┌──────────────────────────────────┐
     └─────────────>│    完整工具生态 (ToolEcosystem)   │
                    │  注册->发现->调用->监控->         │
                    │  版本升级->废弃->移除             │
                    └──────────────────────────────────┘
                                ▲
                    ┌───────────┘
                    │  工具版本管理 (SemVer/兼容性/废弃)

概念间的依赖关系

概念

核心职责

依赖概念

MCP 概念与架构

定义协议标准

MCP Server 开发

提供工具能力

MCP 概念与架构

MCP Client 集成

聚合多 Server 工具

MCP Server 开发

工具 Schema 设计

描述工具接口

MCP Server 开发

工具安全与权限

控制工具风险

工具 Schema 设计

工具错误处理

保障调用鲁棒性

工具安全与权限

常用工具集成

封装常见能力

MCP Client 集成

MCP 传输层

传递通信消息

MCP 概念与架构

工具版本管理

治理版本演进

工具 Schema 设计

完整工具生态

集成全部能力

所有上述概念

0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区