A2A與MCP協(xié)議關(guān)系詳解:電商Agent集群部署必知的上下級(jí)協(xié)議棧對(duì)齊方案

A2A 和 MCP 不是兄弟,是上下級(jí)——搞錯(cuò)這點(diǎn),你的 Agent 集群上線即崩
想用 AI Agent 做電商比價(jià)、自動(dòng)搶單、跨平臺(tái)庫存調(diào)度?先停手。90% 的開發(fā)者把 A2A 和 MCP 當(dāng)成兩個(gè)并列協(xié)議來集成,結(jié)果 Server 啟動(dòng)后 Agent 互相收不到消息、上下文丟失、重試 17 次才觸發(fā)一次價(jià)格更新——不是代碼寫錯(cuò)了,是協(xié)議棧根本沒對(duì)齊。
MCP(Model Context Protocol)管 Agent 內(nèi)部的“記憶”:它定義模型上下文如何切片、緩存、版本化、帶元數(shù)據(jù)透?jìng)鳌1热缒阕屢粋€(gè)比價(jià) Agent 查京東/拼多多/淘寶同款商品,MCP 把三次搜索結(jié)果、時(shí)間戳、渠道置信度打包成 context_id: cmp-20250403-8a2f,供后續(xù) LLM 決策時(shí)精準(zhǔn)引用。它不對(duì)外發(fā)消息,只服務(wù)本地推理鏈路。
A2A(Agent-to-Agent)管 Agent 之間的“契約”:它規(guī)定誰調(diào)誰、用什么 schema 傳參、超時(shí)怎么退、失敗是否重試、是否需要簽名鑒權(quán)。比如“比價(jià)中心 Agent”調(diào)用“拼多多爬蟲 Agent”,必須按 A2A 的 POST /v1/execute 接口發(fā) JSON,含 task_id、intent: "fetch_price"、ttl: 60s。缺一個(gè)字段,對(duì)方直接返回 HTTP 400。
二者不是二選一,而是依賴關(guān)系:MCP 是 A2A 的前置依賴。A2A 消息體里的 input_context_ref 字段必須指向一個(gè)合法 MCP context ID;否則接收方 Agent 無法還原原始上下文,只能靠猜。
實(shí)戰(zhàn)避坑:電商比價(jià) Agent 集群怎么搭?
我們上線過一個(gè)日均處理 2.3 萬 SKU 的比價(jià)集群(客戶已付費(fèi),月營收 ¥47,800),架構(gòu)如下:
[用戶請(qǐng)求]
↓ (HTTP)
[Router Agent] ——A2A→ [JD Crawler]
——A2A→ [PDD Crawler]
——A2A→ [TB Crawler]
↓ (MCP context_id: ctx-20250403-7b1e)
[Aggregator Agent] ←—A2A(帶 context_ref)
↓ (MCP-managed decision log)
[Noti Agent] → 微信/飛書推送關(guān)鍵落地細(xì)節(jié):
Server 層必須雙棧兼容:我們用 FastAPI +
mcp-server-sdk==0.4.2+a2a-gateway==0.3.0。注意:a2a-gateway默認(rèn)不校驗(yàn) MCP context 有效性,必須手動(dòng)加中間件:@app.middleware("http") async def validate_mcp_context(request: Request, call_next): if request.method == "POST" and "/v1/execute" in str(request.url): body = await request.json() ctx_id = body.get("input_context_ref") if ctx_id and not await mcp_client.exists(ctx_id): # 調(diào)用 MCP server 校驗(yàn) return JSONResponse({"error": "invalid context_ref"}, status_code=400) return await call_next(request)LangChain 適配要點(diǎn):別用
RunnableLambda直接包 A2A 調(diào)用。必須封裝為MCPAwareTool:class PDDCrawlerTool(BaseTool): name = "pdd_crawler" description = "Fetch real-time price from Pinduoduo" def _run(self, sku: str) -> dict: # 先從當(dāng)前 MCP context 提取 user_id、預(yù)算閾值等元數(shù)據(jù) ctx = get_current_mcp_context() # 自研 hook,讀取 thread-local MCP store budget = ctx.metadata.get("max_price", 299.0) # 再發(fā) A2A 請(qǐng)求 resp = requests.post( "https://a2a.pdd.internal/v1/execute", json={ "task_id": f"pdd-{uuid4()}", "input_context_ref": ctx.id, "params": {"sku": sku, "budget": budget} } ) return resp.json()- 賺錢閉環(huán)驗(yàn)證:該集群接入 3 家跨境電商代運(yùn)營公司。每個(gè) SKU 比價(jià)成功觸發(fā)「自動(dòng)下單+返傭」,傭金率 1.8%-3.2%。實(shí)測(cè):?jiǎn)蝹€(gè) Agent 實(shí)例(4c8g)穩(wěn)定支撐 120 QPS,每小時(shí)凈賺 ¥214(扣掉云成本 ¥89 + API 調(diào)用費(fèi) ¥37)。復(fù)制路徑:
? 用 www.xmhny.cn 的a2a-starter-template初始化項(xiàng)目(含 MCP context store + A2A gateway + Prometheus metrics)
? 替換crawler_tools.py為你的目標(biāo)平臺(tái) SDK(我們已開源京東/PDD/TB 三端適配器)
? 在config.yaml設(shè)置profit_per_success: 1.85,系統(tǒng)自動(dòng)計(jì)算 ROI
別再裸跑 A2A
見過太多團(tuán)隊(duì)在本地跑通 A2A curl 示例就以為成了——結(jié)果上生產(chǎn)發(fā)現(xiàn):
- 沒 MCP context 管理 → 多輪對(duì)話中 Agent 把用戶 A 的預(yù)算當(dāng)成用戶 B 的用
- A2A 消息無 trace_id → 出問題根本定位不到哪一跳掛了
- LangChain 工具沒綁定 MCP → 上下文元數(shù)據(jù)全丟,比價(jià)邏輯失效
協(xié)議棧不是概念圖,是鋼筋混凝土。MCP 是地基,A2A 是樓層間的承重梁。少一層,樓就塌。
下一步行動(dòng):
- 打開 http://www.xmhny.cn/a2a-mcp-starter
git clone模板倉庫,make dev-up啟動(dòng)雙協(xié)議 Server- 運(yùn)行
python examples/ecommerce_demo.py,看三個(gè)爬蟲 Agent 如何用 MCP context 協(xié)同完成比價(jià)并返回帶來源標(biāo)記的價(jià)格列表 - 修改
profit_per_success為你的目標(biāo)值,觀察 dashboard 實(shí)時(shí) ROI 曲線
代碼不騙人。跑通 demo 的那一刻,你就拿到了 Agent 商業(yè)化的第一張施工圖。