1986 年,Jon Bentley 在《Communications of the ACM》的專欄出了一道題:讀進一段文字,找出出現次數最多的 n 個單字,依次數排好印出來。他請 Donald Knuth 來解,目的是示範 Knuth 提倡的 literate programming — 把程式和解說寫在一起,像文章一樣讀。
Knuth 交出約八頁的程式與解說,用了 Frank Liang 提出的 hash trie 這種精巧的資料結構。Bentley 另外請 Doug McIlroy 寫評論。McIlroy 先稱讚了 Knuth 的功力,接著附上自己的版本:六行 shell。把文字拆成一行一個單字、轉成小寫、排序、數每個字出現幾次、依次數再排一次、取前 n 行。每一步都是 Unix 現成的小工具,用 pipe 串起來 — 前一個工具的輸出,直接當成下一個工具的輸入。
後來不少人替 Knuth 抱不平:他被找來是為了示範一種寫法,不是為了比誰寫得短。這個評價很公道。但 McIlroy 點出的事情依然成立 — Knuth 的程式從零打造,只能解這一題;六行 shell 用的工具,明天可以拿去組別的東西。
McIlroy 是 pipe 的提出者。1978 年,他和同事在貝爾實驗室期刊的 Unix 專刊序言裡,把這套做法歸納成幾條原則,最常被引用的兩條是:
每個程式只做好一件事。要做新的事,就寫新的程式,不要在舊程式上加功能。
每個程式的輸出,都要預期會成為另一個程式的輸入,即使那個程式還沒有人寫。
第一條讓工具保持小。第二條讓工具之間有共通的格式:在 Unix 上是純文字,一行一筆。
AI agent 碰到的是同一個問題。它要查 GitHub、讀資料庫、發 Slack。每種工具替每種 agent 各寫一套整合,數量是兩者相乘,永遠寫不完。
Model Context Protocol(MCP)是 Anthropic 在 2024 年 11 月推出的開放標準,做的就是定一個共通格式。工具這一端包成 MCP server,說明自己提供哪些功能:例如 GitHub 的 server 提供「列出 issue」,參數是哪個 repo、什麼狀態。agent 這一端只要會講 MCP,就能接上任何 server。整合的數量從相乘變成相加。
2026 年 7 月的新版規格又往 Unix 靠近一步:協定層不再維持 session,每個請求自己帶齊需要的資訊,任何一台 server 都能接手,就像 pipe 裡的工具只看眼前的輸入。
在 Claude Code 裡,用 claude mcp add 接上一個 server。預設只對自己、而且只在目前這個專案生效;加上 --scope project,設定會寫進專案根目錄的 .mcp.json,跟著 repo 讓整個團隊共用。
這個類比有一個地方會斷。pipe 是工具直接把資料交給下一個工具,串法寫死在指令裡,跑幾次都一樣。MCP server 之間不會互接,負責決定先呼叫誰、再把結果交給誰的是模型。同一個任務跑兩次,選的工具和順序都可能不同。
McIlroy 的第一條原則是寫給造工具的人。大多數人是在挑 server,換個問法一樣有用:這個 server 的每個工具,這次的工作都用得到嗎?
很多 server 一次提供幾十個工具。模型要從中挑出對的那一個,靠的是每個工具的名稱和說明。名稱相近、用途重疊的工具越多,越容易挑錯。用不到的 server 就關掉。
每個工具的定義 — 名稱、用途、參數格式 — 都要讀進 context 才能用。Day 10 講過 context 有上限,工具一多,還沒開始工作就先吃掉一塊。
Claude Code 預設用工具搜尋來處理這件事:開場只列出工具名稱,完整的參數定義等模型需要時才搜尋、載入。所以在一般設定下,接很多 server 不會一開始就塞滿 context。但有些環境用不了工具搜尋,例如 API 端點改接非官方服務,或關掉這個功能,這時所有工具定義會一開始全部載入。實際占多少,打 /context 就知道。
pipe 串的通常是系統自帶的工具,MCP server 則常常是第三方寫的。在本機執行的 server,跑起來就帶著使用者本人的權限;會去抓外部內容的 server,抓回來的東西會直接進入 agent 的 context,可能夾帶 prompt injection。
所以在互動模式下,Claude Code 對專案裡 .mcp.json 列的 server,第一次使用前會先問過使用者;非互動的自動化執行則不會問。按下同意之前,值得看一眼那是誰寫的、交給它的 token 開了多大範圍 — 最小權限原則在這裡一樣適用。
McIlroy 那六行 shell 之所以短,是因為 Unix 已經備好了一堆只做一件事的小工具,和一個讓它們接得起來的格式。
MCP 押的是同一件事:與其讓每個 agent 內建所有能力,不如讓能力變成一個個小 server,用同一份協定接上。唯一的新變數是,負責把它們串起來的,從寫指令的人換成了模型。
延伸閱讀