跳轉到

2025 - MCP 智慧代理與工具迴圈#

案件摘要#

2024 年 11 月,Anthropic 提出 Model Context Protocol(MCP);2025 年,生態全面爆發——OpenAI、Google、微軟先後採用,MCP 成為 LLM 連接世界的 USB-C。它用統一的 JSON-RPC 介面規範「模型怎麼呼叫工具」:

\[ \text{agent} = \text{LLM} + \text{工具} + \text{迴圈} \]

一句話:模型會說話不夠,要能動手。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)範式的協議化:

\[ s_{t+1} = f(s_t, \text{tool\_result}), \quad a_t \sim \pi_\theta(s_t) \]

用一段最小示意(非真實執行,僅闡明結構):

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 世界變成觀察-行動空間:

\[ \text{觀察} = \text{螢幕截圖}, \quad \text{行動} = \{\text{click}(x,y),\ \text{type}(s),\ \text{key}(k)\} \]
工具層級 抽象度 範例
專用 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 限縮參數——第四條線索(安全與權限)的最小示範。