假設你手上有上百個老系統——有的甚至是跑了三十年的主機(像 AS/400 那種綠幕),各自的資料庫、輔助 API、使用者權限全都不一樣。現在你想讓 AI agent 去問這些系統的資料,問題來了:agent 要「直接打 A2A」、「經過 MCP server」、還是「走一個 Hub」?這篇把 A2A、MCP、Hub 這三層的用意與取捨一次講清楚——你會發現它們不是三個對立的東西,而是同一件事的四個管理檔位,而且這條路,軟體工程早在 MVC 時代就走過一次了。
- 裸接 → A2A → MCP → Hub 是同一個「Agent 問資料」動作的四個管理檔位,不是四選一,agent 可以從任一格進入。
- 往上一格:+治理、+可規模化,同時 −直接、−簡單。
- 對應軟體分層的老 pattern:A2A = Adapter + Repository、Hub = Front Controller / API Gateway。
- 該停哪格 = 規模 × 必要性。規模到了還裸接 = 技術債;MCP 才一個就蓋 Hub = over-engineering。
一個問題:上百個老系統,怎麼讓 agent 問到資料?
最原始的做法,是讓 agent 直接呼叫每個系統的 API 或資料庫。一個 agent 打得動,那一百個 agent 打一百個系統呢?那是 N×M 條整合:每個 agent 要自己知道每個 API 的長相、自己帶授權、自己處理格式。沒有發現機制、沒有統一授權、沒有稽核——改一個後端,所有 agent 跟著改。能動,但不可規模化。這就是為什麼「直接打」在單機 demo 很爽、一上規模就崩。
要解這題,關鍵不是「用哪個技術」,而是先看清楚:不管走哪一層,底層永遠是同一個動作。
不變的底層:一切都是「Agent 問資料」
A2A、MCP、Hub 表面上是三個不同的東西,但如果你從 agent 的角度看,它們做的是同一件事:讓一個 agent 拿到後端系統的資料或能力。差別只在中間隔了幾層「中介」,以及每一層幫你多管了什麼。整個設計,就是在「agent 直接裸接資料」這條線上,一層層加中介——每加一層,你用一點「直接與速度」,換一點「管理與治理」。
把這句話記住,四個檔位就串起來了。
四個檔位:裸接、A2A、MCP、Hub
這不是四選一,而是同一條「速度 ↔ 治理」光譜上的四個停靠點。往右一格,多一分可規模化,少一分直接:
| 檔位 | 你站在誰的角度 | 換到什麼 |
|---|---|---|
| 裸接 raw API/DB | 最原始 | 最快、最裸,只適合一次性 |
| A2A | Agent 角度(要快) | 自描述標準介面,一問就懂 |
| MCP server | 管理角度(最低限度) | 一個域的統一入口 + 發現/授權 |
| Hub | 治理角度 | 統籌:單一身分/policy/目錄/稽核 |
關鍵洞見:越高不是越好。每往右一格都有代價,該停哪格取決於你的規模,而不是「越治理越安心」。下面逐格看用意與取捨。
每個檔位的用意與取捨
檔位 0:裸接(Agent → raw API/DB)
用意:零基建、最快。一次性 spike、概念驗證,這樣做最划算,別為它蓋基礎建設。取捨:得到「立刻能動、零成本起步」,付出「N×M 整合、無發現、無授權、無稽核,改一個後端全部要改」。老 pattern 就是「把 SQL 寫進畫面」——能動,一到多人多頁就崩。
檔位 1:A2A(把後端包成自描述的 agent)
用意:讓後端「標準化 + 自我描述」。每個後端包成一個 A2A agent,帶一張 Agent Card——agent 問 Card 就知道怎麼用,不必預先寫死。一個 A2A 給所有 agent 重用,終結 N×M。取捨:得到「標準介面、自描述、可重用,醜的 legacy 被 Adapter 藏起來」;付出「多一層 wrapper 要建與維護、授權還各自管、agent 仍要自己知道有哪些 A2A、在哪」。老 pattern:Adapter + Repository——轉接醜介面,給乾淨的資料存取口。
檔位 2:MCP server(把一組 A2A 收成工具面)
用意:給 agent「一個域的統一入口」加上最低限度的管理——發現、授權、限流終於有個落點,而且 Claude Code、Codex 這類工具原生支援 MCP,插上就用。為什麼「最少要 MCP」?因為讓幾百個 agent 各自裸打 A2A,授權與稽核根本無處落地;MCP 是「管理」的最小可行單位。取捨:得到「一個連線點拿一整組能力」;付出「多一跳,而且 MCP 會長很多個——問題只是被推高一層,變成很多入口各自要管」。
檔位 3:Hub(統籌很多 MCP)
用意:當 MCP server 從一個變二十個,你需要一顆統籌——單一入口、單一身分、單一 policy、單一目錄、單一稽核,把授權、log、限流、發現這些「橫切關注」從每個 MCP 裡抽出來集中。決策者只連一個地方就能跨所有系統;新增系統只是註冊,不是又開一個要各自管的入口。取捨:得到「唯一真相、跨系統、可治理可稽核」;付出「又一跳、Hub 變成新的單點要做高可用、還要建整套控制面與憑證保管庫」。老 pattern:Front Controller / API Gateway——單一入口集中處理授權、路由、記錄。這顆 Hub,其實就是我在《導向型 MCP Gateway:無狀態閘道的實戰方法論》裡談的那個閘道。
這是軟體分層史的重演(Agent 版 MVC)
看到這裡你可能有既視感——這不就是 MVC 那套嗎?沒錯,而且對應關係非常乾淨。你不是在發明新東西,你是在用新名字重跑一條走過的路:
| Agent 時代 | 古典 pattern | 它負責什麼 |
|---|---|---|
| 舊系統 / 資料庫 | Model | 資料本身(很多異質後端 = 很多 Model) |
| A2A | Controller(Adapter + Repository) | 轉接醜介面、給乾淨存取口(很多 A2A = 很多 Controller) |
| MCP server | 一組 Controller 的路由/模組 | 把一個域的能力收成統一工具面 |
| Hub | Front Controller / API Gateway | 單一入口、集中授權/路由/記錄 |
| 消費端 AI agent | View / Client | 把資料組成使用者要看的答案 |
當年我們從「把 SQL 寫進畫面」→ MVC → Front Controller → 微服務 / API Gateway;現在 agent 存取資料,正在用 A2A、MCP、Hub 這些新名字跑同一條路。那「什麼時候該往上爬一層」呢?看觸發條件,不是無腦往上:
該停哪格?規模 × 必要性
整條線的取捨,一句話:每往右一格,+治理、+可規模化,同時 −直接、−簡單。所以「該站哪一檔」不是越高越好,而是由你的規模與必要性決定——頻次 × 必要性決定架構,避免過度設計。對照著挑:
| 你的情況 | 該停的檔位 |
|---|---|
| 一次性 spike / 探索 | 裸接 |
| 單一系統要給 agent 用 | A2A |
| 一個域 / 團隊要管理性 | MCP |
| 集團級、多個 MCP、要治理稽核 | Hub |
兩個方向都是錯:
一句話心法與延伸閱讀
把分層當成「選擇」而不是「義務」,你就不會在該簡單的地方過度設計,也不會在該收斂的地方欠技術債。延伸閱讀:
發佈留言