打造无状态安全异步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 定义 MCPEnvelopeMCPResponse,以及每个工具的输入/输出模型(BatchSumInStartLongTaskInPollJobIn 等),并通过 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_identitybatch_sum)以及 异步轮询start_long_taskpoll_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 并在社区讨论中提交你的改进想法。

本文是对第三方新闻源的主观解读。消息可能出现过时、不准确、歧义或错误的地方,仅供参考使用。点击此处查看消息源。