MCP协议的核心架构基础

一、MCP协议的核心架构

MCP协议的核心是充当 "工具路由器",协调AI与外部工具的交互。其架构通常包含以下模块:

模块 功能
工具注册中心 存储所有可用工具的定义(名称、参数、权限、执行函数等)。
请求解析器 解析AI生成的工具调用请求,验证格式和权限。
执行引擎 调用具体工具(同步/异步),管理执行状态(如超时、重试)。
结果格式化器 将工具返回的原始数据转换为AI可理解的标准化格式(如JSON)。
错误处理器 捕获异常,决定重试、降级处理或通知AI调整策略。

二、MCP协议的完整调用流程

以下是一个典型工具调用的分步流程(以网络搜索为例):

  1. 步骤1:工具注册

    • 将工具(如web_search)的元信息和执行函数注册到MCP的工具注册中心

    • 示例元数据:

      json

      复制代码
      {
        "name": "web_search",
        "description": "调用Google搜索API",
        "parameters": {
          "query": {"type": "string", "required": true},
          "max_results": {"type": "int", "default": 5}
        },
        "permissions": ["internet_access"]
      }
  2. 步骤2:AI生成请求

    • AI根据任务目标,生成结构化请求。例如:

      json

      复制代码
      {
        "tool": "web_search",
        "params": {"query": "如何学习深度学习", "max_results": 3},
        "request_id": "req_123"
      }
  3. 步骤3:MCP验证与分发

    • MCP检查:

      • 工具是否存在?

      • 参数是否符合格式?

      • AI是否有权限调用该工具?

    • 若验证通过,将请求发送给web_search的执行函数。

  4. 步骤4:工具执行与返回

    • 工具执行后返回原始结果(如API响应):

      python

      复制代码
      [
        {"title": "深度学习入门教程", "url": "https://example.com/1"},
        {"title": "PyTorch官方文档", "url": "https://example.com/2"}
      ]
  5. 步骤5:结果标准化

    • MCP将原始结果转换为AI需要的格式:

      json

      复制代码
      {
        "request_id": "req_123",
        "status": "success",
        "result": [
          {"title": "深度学习入门教程", "summary": "从零开始学习神经网络..."},
          {"title": "PyTorch官方文档", "summary": "官方教程与API参考..."}
        ]
      }
  6. 步骤6:AI处理结果

    • AI根据返回结果继续执行后续任务(如总结内容、生成报告等)。

三、代码示例:实现一个简易MCP系统

以下用Python演示一个最小化的MCP协议实现:

1. 工具注册中心(Tool Registry)

python

复制代码
class MCPRegistry:
    def __init__(self):
        self.tools = {}

    def register_tool(self, name, description, parameters, execute_func):
        self.tools[name] = {
            "description": description,
            "parameters": parameters,
            "execute": execute_func
        }

# 初始化注册中心
registry = MCPRegistry()
2. 注册一个工具(例如执行Python代码)

python

复制代码
def execute_python_code(code: str):
    try:
        # 安全限制:禁止访问文件系统或网络
        locals_dict = {}
        exec(f"import sys\nsys.modules['os'] = None\n{code}", {}, locals_dict)
        return {"status": "success", "result": locals_dict.get('result')}
    except Exception as e:
        return {"status": "error", "message": str(e)}

# 注册工具
registry.register_tool(
    name="python",
    description="执行Python代码并返回结果(沙盒环境)",
    parameters={"code": {"type": "string", "required": True}},
    execute_func=execute_python_code
)
3. MCP请求处理器(Request Handler)

python

复制代码
class MCPHandler:
    def __init__(self, registry):
        self.registry = registry

    def handle_request(self, request: dict):
        tool_name = request.get("tool")
        params = request.get("params", {})
        
        # 检查工具是否存在
        if tool_name not in self.registry.tools:
            return {"error": "Tool not found"}
        
        # 检查参数是否合法
        tool_info = self.registry.tools[tool_name]
        required_params = [p for p, v in tool_info["parameters"].items() if v.get("required")]
        for param in required_params:
            if param not in params:
                return {"error": f"Missing required parameter: {param}"}
        
        # 执行工具
        try:
            result = tool_info["execute"](**params)
            return {"status": "success", "result": result}
        except Exception as e:
            return {"status": "error", "message": str(e)}
4. 使用示例

python

复制代码
# AI生成请求
request = {
    "tool": "python",
    "params": {
        "code": "result = 1 + 2 * 3"
    }
}

# 处理请求
handler = MCPHandler(registry)
response = handler.handle_request(request)
print(response)  # 输出: {'status': 'success', 'result': {'result': 7}}

四、高级功能扩展

1. 异步执行与回调
  • 使用asyncioCelery管理长时间任务:

    python

    复制代码
    import asyncio
    
    async def async_execute_tool(tool_func, params):
        result = await tool_func(**params)
        return result
    
    # 在MCPHandler中调用异步函数
2. 权限控制
  • 为每个工具绑定权限标签,AI需通过认证获取权限令牌:

    python

    复制代码
    def check_permission(ai_token, tool_name):
        # 检查AI是否有权限调用该工具
        return True  # 实际需实现权限逻辑
3. 流量限制与负载均衡
  • 使用令牌桶算法限制工具调用频率:

    python

    复制代码
    from fastapi import HTTPException, status
    
    class RateLimiter:
        def __init__(self, rate_limit: int):
            self.rate_limit = rate_limit
            self.tokens = rate_limit
    
        def acquire_token(self):
            if self.tokens > 0:
                self.tokens -= 1
                return True
            else:
                raise HTTPException(
                    status_code=status.HTTP_429_TOO_MANY_REQUESTS,
                    detail="Rate limit exceeded"
                )

五、在现有框架中的应用

1. LangChain中的Tools
  • 使用@tool装饰器定义工具:

    python

    复制代码
    from langchain.tools import tool
    
    @tool
    def web_search(query: str) -> str:
        """调用Google搜索API"""
        return "搜索结果:..."
    
    # AI会自动选择工具并生成调用请求
2. AutoGPT的插件系统
  • 通过plugin.json定义工具:

    json

    复制代码
    {
      "name": "web_search",
      "description": "Search the web",
      "parameters": {
        "query": "string"
      }
    }
  • AI根据目标自动触发工具调用。

3. OpenAI Function Calling
  • 定义工具并让GPT-4生成调用请求:

    python

    复制代码
    tools = [
        {
            "type": "function",
            "function": {
                "name": "web_search",
                "parameters": {"query": {"type": "string"}}
            }
        }
    ]
    response = openai.ChatCompletion.create(
        model="gpt-4",
        messages=[...],
        tools=tools
    )

六、最佳实践与注意事项

  1. 安全性

    • 对危险工具(如代码执行)进行沙盒隔离。

    • 限制工具的资源使用(CPU/内存/网络)。

  2. 可观测性

    • 记录所有工具调用的日志(请求、响应、执行时间)。

    • 添加监控指标(如成功率、延迟)。

  3. 错误降级

    • 提供备选工具(如一个搜索API失败时切换到另一个)。
  4. 性能优化

    • 对高频工具使用缓存(如本地缓存API结果)。
相关推荐
宝贝儿好16 小时前
【强化学习】第十章:连续动作空间强化学习:随机高斯策略、DPG算法
人工智能·python·深度学习·算法·机器人
Ljwuhe16 小时前
类与对象(中)——运算符重载
开发语言·c++
郝学胜-神的一滴16 小时前
深入理解链表:从基础到实践
开发语言·数据结构·c++·算法·链表·架构
敲敲了个代码16 小时前
vue文件自动生成路由会成为主流
开发语言·前端·javascript·vue.js·前端框架
你住过的屋檐16 小时前
【Java】虚拟线程详解
java·开发语言
霍理迪16 小时前
JS—事件高级
开发语言·javascript·ecmascript
范特西.i16 小时前
QT聊天项目(8)
开发语言·qt
烟花落o16 小时前
栈和队列的知识点及代码
开发语言·数据结构·笔记·栈和队列·编程学习
crescent_悦16 小时前
C++:Have Fun with Numbers
开发语言·c++
mjhcsp16 小时前
C++轮廓线 DP:从原理到实战的深度解析
开发语言·c++·动态规划