一、MCP协议的核心架构
MCP协议的核心是充当 "工具路由器",协调AI与外部工具的交互。其架构通常包含以下模块:
| 模块 | 功能 |
|---|---|
| 工具注册中心 | 存储所有可用工具的定义(名称、参数、权限、执行函数等)。 |
| 请求解析器 | 解析AI生成的工具调用请求,验证格式和权限。 |
| 执行引擎 | 调用具体工具(同步/异步),管理执行状态(如超时、重试)。 |
| 结果格式化器 | 将工具返回的原始数据转换为AI可理解的标准化格式(如JSON)。 |
| 错误处理器 | 捕获异常,决定重试、降级处理或通知AI调整策略。 |
二、MCP协议的完整调用流程
以下是一个典型工具调用的分步流程(以网络搜索为例):
-
步骤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:AI生成请求
-
AI根据任务目标,生成结构化请求。例如:
json
{ "tool": "web_search", "params": {"query": "如何学习深度学习", "max_results": 3}, "request_id": "req_123" }
-
-
步骤3:MCP验证与分发
-
MCP检查:
-
工具是否存在?
-
参数是否符合格式?
-
AI是否有权限调用该工具?
-
-
若验证通过,将请求发送给
web_search的执行函数。
-
-
步骤4:工具执行与返回
-
工具执行后返回原始结果(如API响应):
python
[ {"title": "深度学习入门教程", "url": "https://example.com/1"}, {"title": "PyTorch官方文档", "url": "https://example.com/2"} ]
-
-
步骤5:结果标准化
-
MCP将原始结果转换为AI需要的格式:
json
{ "request_id": "req_123", "status": "success", "result": [ {"title": "深度学习入门教程", "summary": "从零开始学习神经网络..."}, {"title": "PyTorch官方文档", "summary": "官方教程与API参考..."} ] }
-
-
步骤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. 异步执行与回调
-
使用
asyncio或Celery管理长时间任务: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 )
六、最佳实践与注意事项
-
安全性
-
对危险工具(如代码执行)进行沙盒隔离。
-
限制工具的资源使用(CPU/内存/网络)。
-
-
可观测性
-
记录所有工具调用的日志(请求、响应、执行时间)。
-
添加监控指标(如成功率、延迟)。
-
-
错误降级
- 提供备选工具(如一个搜索API失败时切换到另一个)。
-
性能优化
- 对高频工具使用缓存(如本地缓存API结果)。