打造无状态安全异步MCP协议,支撑可扩展智能体工作流
•0 次浏览•6分钟•应用
MCP协议无状态异步智能体工作流安全签名
•0 阅读•6分钟•应用
背景
随着大语言模型(LLM)在智能体(Agent)系统中的广泛应用,如何在 无状态、安全、异步 的前提下,让不同服务之间可靠地调用工具,成为架构师面临的首要难题。传统的会话式 RPC 往往依赖持久连接或全局状态,难以横向扩展。本文基于 Model Context Protocol(MCP) 的思路,提供一套完整的实现示例。
关键设计原则
- 无状态通信:每一次请求都携带完整的上下文信息(client_id、server_id、nonce、timestamp),服务器不保存会话状态,仅通过签名验证合法性。
- SDK 级别强校验:采用
pydantic定义严格的输入/输出模型,字段类型、范围、必填项在代码层面即被拦截,避免运行时异常。 - 异步长任务:通过返回
job_id并提供poll_job接口,实现任务的非阻塞执行,支持数秒到数十秒的后台计算。 - 统一签名机制:使用 HMAC‑SHA256 对请求体(去除 signature 字段的 canonical JSON)进行签名,服务器同样使用 HMAC 验证返回体,确保端到端的完整性与防篡改。
核心实现概览
1. 工具函数 & 加密
def _now_ms(): return int(time.time() * 1000)
def _uuid(): return str(uuid.uuid4())
def _canonical_json(obj):
return json.dumps(obj, separators=(",",":"), sort_keys=True).encode()
def _hmac_hex(secret, payload):
return hmac.new(secret, _canonical_json(payload), hashlib.sha256).hexdigest()
这些函数为时间戳、唯一标识、标准化 JSON 与 HMAC 签名提供底层支撑。
2. 数据模型
使用 pydantic.BaseModel 定义 MCPEnvelope 与 MCPResponse,以及每个工具的输入/输出模型(BatchSumIn、StartLongTaskIn、PollJobIn 等),并通过 ConfigDict(extra="forbid") 防止未知字段进入。
3. 服务器端逻辑
- 签名校验:收到请求后先剥离
signature,使用客户端共享 secret 重新签名比对。 - 工具分发:根据
env.tool调用相应的业务函数,返回统一格式的MCPResponse。 - 异步任务管理:
start_long_task会创建JobState,并以asyncio.create_task启动后台 coroutine;poll_job读取当前状态并返回。 - 响应签名:在返回前再次对完整响应体进行 HMAC 签名,客户端可直接验证。
4. 客户端封装
MCPClient.call 把要调用的工具、参数封装进 MCPEnvelope,自动生成签名并发送给服务器。示例代码展示了 同步调用(server_identity、batch_sum)以及 异步轮询(start_long_task → poll_job)的完整流程。
示例演示
server = MCPServer("mcp-server-001", b"server_secret")
client = MCPClient("client-001", b"client_secret", server)
await client.call("server_identity") # 获取服务器身份
await client.call("batch_sum", {"numbers": [1,2,3]}) # 批量求和
start = await client.call("start_long_task", {"seconds":2, "payload":{"task":"demo"}})
job_id = start["result"]["job_id"]
# 轮询直至完成
while True:
poll = await client.call("poll_job", {"job_id": job_id})
if poll["status"] == "done":
print(poll)
break
await asyncio.sleep(0.5)
运行结果会展示每一步的签名校验、状态转移以及最终的任务结果,完整复现了 无状态、可验证、异步 的交互链路。
结论与展望
本文通过最小化的代码实现,验证了 MCP‑style 协议在实际智能体工作流中的可行性:
- 安全:基于 HMAC 的端到端签名抵御中间人篡改。
- 可扩展:无状态设计天然适配水平扩容的微服务架构。
- 灵活:
pydantic模型可随业务快速迭代,新增工具仅需定义新模型即可。
未来可以进一步引入 零信任 的公钥基础设施(PKI)替代对称密钥、支持 批量请求 与 流式返回,以及在大型多代理系统中引入 协议版本协商,让 MCP 成为跨组织、跨云的通用协议标准。
拓展阅读:完整源码已同步至 GitHub,欢迎 star、fork 并在社区讨论中提交你的改进想法。
本文是对第三方新闻源的主观解读。消息可能出现过时、不准确、歧义或错误的地方,仅供参考使用。点击此处查看消息源。