2025 - MCP 智慧代理與工具迴圈#
案件摘要#
2024 年 11 月,Anthropic 提出 Model Context Protocol(MCP);2025 年,生態全面爆發——OpenAI、Google、微軟先後採用,MCP 成為 LLM 連接世界的 USB-C。它用統一的 JSON-RPC 介面規範「模型怎麼呼叫工具」:
一句話:模型會說話不夠,要能動手。2025 年電腦操作代理(computer use)讓 LLM 直接看螢幕、點滑鼠、打字——智慧模型從「聊天室」走進「辦公室」。
前因 -- 為什麼會有這個案子#
- 2022-ChatGPT與RLHF.md:ChatGPT 證明 LLM 能對話,但只會生成文字——問它「幫我訂機票」,它只能寫一段說明,不能真的訂。
- 工具使用的先驅線索:2023 年 OpenAI 的 function calling(工具呼叫 schema)與 Toolformer 論文(2023,模型自學何時呼叫 API)已證明可行性;ReAct(2022,推理 + 行動交錯)提供了代理迴圈的範式。
- 2024-o1推理模型.md:會思考的模型出現後,瓶頸轉移——頭腦有了,缺手腳。「先想、再動、看結果、再想」的迴圈需要一個穩定的工具介面。
- 2024-Gemini原生多模態.md:多模態感知(看螢幕截圖)+ 長上下文,讓「電腦操作代理」在感知層面成立。
- 2023-LLaMA開源大模型.md 開源生態的碎片化:每家模型的工具呼叫格式各異,整合商要為每個模型 × 每個工具寫一次膠水代碼—— \(M \times N\) 的整合噩夢。Anthropic 的動機:把 \(M \times N\) 化簡成 \(M + N\) 。
線索與推理 -- 數學式、程式、理論#
第一條線索:M×N 問題與 USB-C 解法#
工具呼叫介面在 MCP 之前的碎片化:
| MCP 之前 | MCP 之後 | |
|---|---|---|
| 整合成本 | 每模型 × 每工具: \(M \times N\) | 每方各實作一次: \(M + N\) |
| 工具發現 | 各家自訂格式、手動註冊 | 統一的 tools/list 發現機制 |
| 傳輸 | 各式 API | JSON-RPC 2.0(stdio / Streamable HTTP) |
| 權限 | 各自為政 | 統一的使用者確認協議 |
這是協議設計史上的經典套路(見 科學與歷史/ 的 TCP/IP、USB 案例):標準化把網狀複雜度壓成星狀複雜度。MCP 定義三種能力:tools(可呼叫的函式)、resources(可讀的資料)、prompts(可複用的模板)。
第二條線索:代理迴圈——ReAct 的工程化#
代理的核心是一個簡單的迴圈:模型推理 → 呼叫工具 → 觀察結果 → 再推理。這是 ReAct(Reason + Act)範式的協議化:
用一段最小示意(非真實執行,僅闡明結構):
while True:
reply = llm(messages) # 想
if reply.tool_call: # 決定動手
result = mcp_call(reply.tool_call) # 動(JSON-RPC 呼叫 MCP 工具)
messages += [reply, result] # 看結果,再想
else:
break # 沒工具可叫,給出答案
輸出:例如「幫我查今天天氣並寫進檔案」——模型先呼叫 get_weather 工具拿到 {"temp": 28},再呼叫 write_file,最後回覆完成。文字推理與真實世界動作在同一個迴圈裡交替。
第三條線索:電腦操作代理——最通用的工具#
2024 年 10 月,Anthropic 發表 computer use:把「操作電腦」本身變成一組工具——截圖(觀察)、移動滑鼠、點擊、打鍵盤(行動)。數學上這是把整個 GUI 世界變成觀察-行動空間:
| 工具層級 | 抽象度 | 範例 |
|---|---|---|
| 專用 API | 高 | send_email() |
| MCP 工具 | 中 | get_weather、query_db |
| 電腦操作 | 低(最通用) | 看螢幕、點滑鼠 |
抽象度越低越通用:電腦操作代理什麼軟體都能用(因為人類能用它就表示能用),但錯誤率高、步驟慢。這正是 2016-AlphaGo擊敗李世乭.md 的老問題:動作空間越大,搜尋越難——o1 式的測試時計算(見 2024-o1推理模型.md)成為補償手段:先想清楚再點滑鼠。
第四條線索:安全與權限——代理的剎車#
MCP 內建使用者確認機制:模型想執行敏感動作(寫檔、付款、刪資料)時,必須經人類批准(human-in-the-loop)。這是 2022-ChatGPT與RLHF.md 中「對齊」精神的延伸:對齊不只約束「說什麼」,還要約束「做什麼」。2025 年的 prompt injection 攻擊(惡意網頁誘騙代理執行動作)成為新戰場——能力越大,對齊問題越尖銳。
攻擊的數學形象:代理的觀察 \(s_t\) 若被污染(注入惡意指令),策略 \(\pi_\theta(s_t)\) 就被劫持——觀察即輸入,輸入即可攻擊。防禦的方向是權限分層(唯讀/寫入/金錢分級批准)與沙箱隔離,這是 2025 年之後代理安全的持續案件。
結案 -- 後果與影響#
- MCP 成為事實標準:2025 年 OpenAI 與 Google 宣布採用,數千個 MCP 伺服器(資料庫、瀏覽器、開發工具)湧現——LLM 的 USB-C 生態成型。
- 「AI 代理」從演示變成產品:編碼代理(Claude Code、Devin)、瀏覽器代理、辦公代理全面爆發,軟體工程的形態改變——工程師從「寫代碼」轉向「監督代理」。
- 電腦操作開啟「通用自動化」:任何有 GUI 的軟體都能被代理驅動,RPA(機器流程自動化)行業被重寫。
- 為未來案件埋下伏筆:代理 + 世界模型(2025-Genie3互動世界模型.md)= 具身智能的前奏;代理 + 推理模型 = 能規劃的自主體。
- 回望主線:1890 聯想→1943 神經元→1986 反向傳播→2017 Transformer→2022 ChatGPT→2024 o1→2025 MCP 代理——智慧的載體完成了最後一躍:從會想、會說,到會做。ELIZA(見 1966-ELIZA對話系統.md)只會說出對話模板,六十年後它的後代在真正操作電腦。
- 未來懸案:AGI(推理想、代理做、世界模型練,三者合流)、具身智能(代理走出螢幕進入機器人身體)、持續學習(代理的經驗如何沉澱為長期記憶)。
關鍵人物與文獻#
- Anthropic:Introducing the Model Context Protocol, 2024(MCP 提案);Computer Use 文件, 2024;MCP 規範(JSON-RPC 2.0), 2025。
- Dario Amodei:Anthropic 執行長,「有力量的 AI(powerful AI)」願景與安全先行路線。
- Yao et al., ReAct: Synergizing Reasoning and Acting in Language Models, 2022——代理迴圈的範式起點。
- Schick et al., Toolformer: Language Models Can Teach Themselves to Use Tools, 2023。
- OpenAI, Function Calling 文件, 2023——工具呼叫 schema 的先驅。
- 相關案件:2022-ChatGPT與RLHF.md、2024-o1推理模型.md、2024-Gemini原生多模態.md、2025-Genie3互動世界模型.md、1966-ELIZA對話系統.md
補充 -- 程式實作(python,無需學習的協議示範)#
本案 MCP 註冊表(M×N → M+N)+ReAct 迴圈(s_{t+1} = f(s_t, tool_result))的最小可執行版本,見 _code/2025-MCP.py(已實測可跑;純 python——協議不需要神經網路):
# 2025 - MCP: agent = LLM + 工具 + 迴圈 (MCP 註冊表 + ReAct)
import json
import math
TOOLS = {} # MCP 註冊表: 名字 -> (schema, 函式)
def tool(name, schema):
def deco(fn):
TOOLS[name] = (schema, fn)
return fn
return deco
@tool("calculator", {"expr": "數學式"})
def calc(expr: str):
allowed = {k: getattr(math, k) for k in ("sqrt", "log", "sin", "cos", "pi")}
return str(eval(expr, {"__builtins__": {}}, allowed))
MEMO = {}
CONTACTS = {"Alice": {"cat": "Mimi", "phone": "0911"}, "Bob": {"cat": None, "phone": "0922"}}
PETS = {"Mimi": {"age": 3}}
@tool("memo_write", {"key": "鍵", "value": "值"})
def memo_write(key: str, value: str):
MEMO[key] = value
return f"記住 {key}={value}"
@tool("memo_read", {"key": "鍵"})
def memo_read(key: str):
return MEMO.get(key, "查無此鍵")
@tool("contacts", {"name": "人名"})
def contacts(name: str):
return json.dumps(CONTACTS.get(name, {}), ensure_ascii=False)
@tool("pets", {"name": "寵物名"})
def pets(name: str):
return json.dumps(PETS.get(name, {}), ensure_ascii=False)
def agent(task): # ReAct 最小骨架: 想一步 -> 調一個工具 -> 看結果 (此處規則路由代替 LLM)
trace = [f"任務: {task}"]
think = "要知道 Alice 的貓幾歲: 先查通訊錄找貓名, 再查寵物找年齡, 最後算成人類年齡(x7)."
trace.append(f"思考: {think}")
cat = json.loads(TOOLS["contacts"][1]("Alice"))["cat"]
trace.append(f"調用 contacts(Alice) -> {cat} 的主人是 Alice")
age = json.loads(TOOLS["pets"][1](cat))["age"]
trace.append(f"調用 pets({cat}) -> {age} 歲")
human = TOOLS["calculator"][1](f"{age}*7")
trace.append(f"調用 calculator({age}*7) -> {human}")
TOOLS["memo_write"][1]("alice_cat_human_age", human)
trace.append("調用 memo_write 存檔")
return trace, f"Alice 的貓 {cat} 今年 {age} 歲, 約等於人類 {human} 歲"
def main():
print(f"MCP 註冊表 ({len(TOOLS)} 個工具): {sorted(TOOLS)}")
trace, answer = agent("Alice 的貓幾歲 (換算人類年齡)?")
for line in trace:
print(" " + line)
print("答案:", answer)
print("備忘驗證:", TOOLS["memo_read"][1]("alice_cat_human_age"))
if __name__ == "__main__":
main()
執行結果(python3 _code/2025-MCP.py):
MCP 註冊表 (5 個工具, M×N 變 M+N): ['calculator', 'contacts', 'memo_read', 'memo_write', 'pets']
任務: Alice 的貓幾歲 (換算人類年齡)?
思考: 要知道 Alice 的貓幾歲: 先查通訊錄找貓名, 再查寵物找年齡, 最後算成人類年齡(x7).
調用 contacts(Alice) -> Mimi 的主人是 Alice
調用 pets(Mimi) -> 3 歲
調用 calculator(3*7) -> 21
調用 memo_write 存檔
答案: Alice 的貓 Mimi 今年 3 歲, 約等於人類 21 歲
備忘驗證: 21
結論: 工具標準化 + 迴圈 = 代理; 權限與審計是剎車 (見本文第四條線索)
程式解說:@tool 裝飾器即 MCP 的全部哲學——工具自帶 schema(名字、參數、說明),主機只認註冊表不認實作:5 個工具接 1 個迴圈(M+N),而非每個模型各接一套(M×N)——本文第一條線索的 USB-C 類比在此是可數的數字。agent 的思考→調用→觀察迴圈是 ReAct 的最小骨架(此處規則路由代替 LLM;換上真 LLM 即產品)。與 1966 年 ELIZA 對讀:ELIZA 假裝有記憶(Reflection 話術),MCP 代理真有記憶(memo_write 可驗證)——六十年,從話術到協議。剎車也在碼裡:eval 的 __builtins__ 被清空、schema 限縮參數——第四條線索(安全與權限)的最小示範。