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结果)。
相关推荐
JicasdC123asd2 小时前
从零深入理解TridentNet_R50-CAFFE-MS:加拿大鹅目标检测实战指南
python
杨超越luckly2 小时前
从传统 GIS 向智能/自动化脚本演进:地铁接驳公交识别的 ArcGIS 与 Python 双路径实践
开发语言·arcgis·php·交互·数据可视化
qw9492 小时前
Python语言概述
开发语言·python
毕设源码-邱学长2 小时前
【开题答辩全过程】以 基于Python的茶叶销售数据可视化分析系统设计实现为例,包含答辩的问题和答案
开发语言·python·信息可视化
人道领域2 小时前
SSM从入门到入土(Spring Bean实例化与依赖注入全解析)
java·开发语言·spring boot·后端
newbiai2 小时前
小白用的AI视频创作软件哪个功能全?
人工智能·python
B站计算机毕业设计超人2 小时前
计算机毕业设计hadoop+spark+hive共享单车预测系统 共享单车数据可视化分析 大数据毕业设计(源码+LW文档+PPT+讲解)
大数据·hadoop·python·深度学习·spark·毕业设计·课程设计
love530love2 小时前
【实战经验】解决ComfyUI加载报错:PytorchStreamReader failed reading zip archive: failed finding central directory
人工智能·windows·python·ai作画·aigc·comfyui·攻关
B站计算机毕业设计超人2 小时前
计算机毕业设计Python+Spark+Hadoop+Hive微博舆情分析 微博情感分析可视化 大数据毕业设计(源码+LW文档+PPT+讲解)
大数据·hadoop·爬虫·python·spark·cnn·课程设计