超越基礎:Claude Code 進階用法(第 3/4 段)


🏦 台灣Pay 銀行轉帳 💙 PayPal
比較 MCP、skills、hooks、subagents 在大型 monorepo 中能否擴展,以及各自的 context 成本
- 23:41 MCP 是把更多工具注入 context 的方式,特性包括 transport agnostic、會替你處理 auth
- 29:43 描述刪得越多,使用者沒有明確提及時就越難穩定觸發
- 35:08 講者強烈反對這個需求,因為它是非常昂貴的抽象,看起來卻非常便宜
💡 你可以怎麼用:要替團隊加 Claude 功能時,先想有沒有現成的指令或 script,有的話寫一份 skill 教它用,別急著包成 MCP。只有接 Slack、Email 這類外部服務才用別人的 MCP。「某種情況才需要提醒」的規則,可以請工程同事改做成 hook,沒觸發就不佔空間。
看全部 42 條重點
🧑🏫 這段比較 Claude Code 四種擴充方式:MCP、skills、hooks、subagents。重點是公司程式很大、工具很多的時候,哪一種還撐得住,哪一種會悄悄吃掉 AI 的記憶空間。想替團隊設定 Claude、又怕越裝越慢越笨的人,看完就知道該怎麼挑。
- 23:41 MCP 是把更多工具注入 context 的方式,特性包括 transport agnostic、會替你處理 auth↳ MCP 是一套讓 AI 接上外部工具的標準,會把工具放進 context(AI 當下看得到的內容)。它不限定用哪種連線方式(transport agnostic),也會幫你處理登入驗證(auth)。
- 23:41 公司若要對外公開發布與 Claude 的整合,這個整合(至少一開始)大概應該做成 MCP server;這是「一般大眾版」的做法↳ 如果公司要讓所有 Claude 使用者都能接上自家服務,先做成 MCP server(提供工具給 AI 的連接程式)最穩,因為它是給一般大眾用的通用做法。
- 24:12 本場談的是專業軟體工程環境:大型 monorepo、多名開發者共用程式碼,以及如何在 agent 之間共享客製化設定與資訊↳ 講者這場談的不是一般使用者,而是工程團隊:monorepo(很多人共用的一個超大程式庫),以及怎麼讓大家的 AI 助手共用同一套設定和知識。
- 24:12 MCP 的設計預設 agent 沒有 shell,但 Claude Code 有 shell↳ shell 是可以直接打指令操作電腦的環境。MCP 設計時假設 AI 碰不到它,所以工具都得包好再遞給 AI。Claude Code 本身就能下指令,這層包裝常常多餘。
- 24:42 經驗法則:已經有 CLI 的話,除非要交給非技術客戶使用,否則不太需要再用 MCP 把 CLI 包一層↳ CLI 是用打字指令操作的程式。已經有 CLI 的話,Claude 直接下指令就能用。除非要給不懂技術的客戶,否則不必再用 MCP 多包一層。
- 24:42 用一個 skill 告訴 Claude 怎麼用 CLI,寫起來容易得多;替大公司內部開發者做開發體驗時,幾乎都是用 skills,而不是 MCP server↳ skill 是一份教 Claude 做事的說明書。寫一份 skill 教它怎麼用某個 CLI,比開發 MCP server 簡單很多,所以替公司內部工程師打造工具時,幾乎都選 skill。
- 25:17 但仍然需要用別人的 MCP server,例如連接 Slack、連接 email↳ MCP 不是沒用。要連 Slack、Email 這類別人家的服務,還是得用它們提供的 MCP server。
- 25:17 MCP 的擴展問題:每個工具的名稱、描述、schema 都要放進 system prompt,Claude 才知道怎麼呼叫↳ system prompt 是每次對話開頭就給 AI 的固定說明。MCP 的每個工具都要把名稱、用途描述、schema(參數格式規定)寫進這裡,Claude 才知道怎麼呼叫,工具一多就很佔空間。
- 25:48 即使只有 20 個 server、每個 15 個工具,context window 大部分也會被工具定義占滿;沒有輔助手段就無法擴展↳ context window 是 AI 一次能讀的內容上限。接 20 個服務、每個 15 個工具,光工具說明書就把大半空間塞滿,留給真正工作的空間很少。
- 25:48 新做法 tool search(講者說「大致可行」):system prompt 只放工具名稱,再給 Claude 一個用來搜尋工具的工具↳ tool search 是新解法:開頭只列工具名稱,再給 Claude 一個「搜尋工具的工具」。講者說這個做法大致行得通。
- 26:26 Claude 之後在對話中搜尋到工具時,才載入該工具的描述與 schema,等於 lazy load↳ Claude 搜尋到某個工具時,才去載入它的完整說明和格式。這種用到才載入的方式叫 lazy load(延遲載入),平常就不佔空間。
- 26:26 限制:除非很具體(例如使用者提到 Slack),Claude 不一定知道要去搜尋;edit tool、bash tool 這類通用工具通常還是得連同 schema 直接放進 system prompt↳ 缺點是 Claude 不一定想得到要去搜尋。你講出「Slack」這種明確字眼它才會找。像編輯檔案、執行指令這種天天用的基本工具,還是得直接放進開頭說明。
- 26:58 描述可以精簡或完整;system prompt 裡放越多描述,Claude 越可能去搜尋該工具,所以「沒有免費的午餐,只是稍微便宜一點」↳ 工具描述寫得越完整,Claude 越會想到去找它,但佔的空間也越多。所以講者說這不是免費午餐,只是比較便宜。
- 26:58 tool search 也沒解決 MCP 的 auth 設定、process lifecycle 等其他問題↳ tool search 只解決「說明書太佔空間」這件事。MCP 其他麻煩,像登入驗證要設定、背景程式要管理啟動和關閉,都還在。
- 27:36 若使用者是公司內部開發者、本來就能存取原始碼,多數事情本來就做得到,不必為了 MCP 建立整套 auth lifecycle↳ 公司內部工程師本來就碰得到原始碼,大多數事情早就做得到,沒必要為了 MCP 另外架一整套登入驗證流程。
- 27:36 用 CLI 搭配 skill 告訴 Claude 怎麼做事是很好的方式,特別適合公司既有的 scripts↳ 比較好的做法是用 CLI 搭配 skill,教 Claude 怎麼做事。公司原本就有一堆 scripts(自動化小程式),特別適合這樣用。
- 28:07 講者把 skill 形容成「lazy system prompt」:front matter 裡的一行描述會放進 system prompt,告訴 Claude 什麼時候該讀這個檔案↳ 講者把 skill 叫做「用到才讀的說明」。檔案開頭有個叫 front matter 的區塊,裡面一行摘要會進入開頭說明,告訴 Claude 什麼情況該打開這份檔案。
- 28:38 Claude 有工具可以載入 skill,並取用目錄裡的 scripts 和其他資源↳ Claude 有專門的工具可以載入 skill,也能順便使用 skill 資料夾裡附的 scripts 和其他檔案。
- 28:38 本質上 skill 就是一個資料夾,裡面有附摘要的 markdown 檔,所以在 repo 裡很容易建立↳ skill 說穿了就是一個資料夾,裡面放一份附摘要的 markdown 文字檔(一種簡單的純文字格式),所以在程式庫裡建一個非常容易。
- 28:38 容易建立有好有壞:要小心管控 monorepo 裡 skills 的品質,因為新增一個實在太容易↳ 容易建就代表人人都會亂建。大型程式庫裡要有人把關 skill 的品質,不然很快就一堆重複或寫爛的 skill。
- 29:09 skill 的擴展性:內文用到才付出成本(pay per use),但描述一直載入,所以不是完全零開銷的抽象↳ skill 的內文要用到才讀,才開始佔空間。但那行摘要永遠都在開頭說明裡,所以 skill 不是完全不佔空間。
- 29:09 要穩定觸發 skill,有時描述得寫到一段落長,大約 300、400 tokens↳ 摘要寫太短,Claude 常常不會觸發這個 skill。有時得寫到一整段,大約 300、400 個 tokens(AI 計算文字量的單位)才夠穩定。
- 29:43 描述刪得越多,使用者沒有明確提及時就越難穩定觸發↳ 摘要刪得越短,使用者沒有明講的時候,Claude 就越難想到要用這個 skill。
- 29:43 skills 目前還沒有定義好的階層機制,無法 lazy 地公開子 skill;官方正在開發,講者說希望未來幾週會有發表↳ 目前 skill 沒辦法分層,例如「大分類下面再藏子 skill,需要時才展開」。官方正在做這個功能,講者希望幾週內能發表。
- 30:15 skills「算是能擴展」,但當初沒預料到 monorepo 會有 100,000 個 skills;真正需要的是「零開銷的抽象」↳ skill 算是能擴大規模,但沒人料到一個程式庫會有十萬個 skill。真正需要的是「沒用到就完全不佔空間」的設計。
- 30:15 Hooks 不是萬能、也不完美,但它是真正零開銷的抽象↳ hooks 是在特定時機自動執行你的程式的機制。它不完美,但真的做到沒用到就完全不佔 AI 的閱讀空間。
- 30:46 Hooks 運作方式:可以選擇多種事件類型來觸發,觸發時呼叫你提供的 script;雙方以 JSON 格式傳入、回傳,決定要不要把內容插入 context window↳ 你可以選要在哪種事件發生時觸發 hook,例如要改檔案之前。觸發時會執行你的 script,雙方用 JSON(一種資料格式)溝通,由 script 決定要不要塞內容給 Claude 看。
- 30:46 細節可以在網站上查到;講者也說(字幕寫作 Quad)很會使用與建立 hooks↳ 詳細用法可以查官網。講者也提到一位很會用、也很會做 hooks 的人,字幕寫作 Quad。
- 31:16 本質:agentic loop 裡發生某件事 → 觸發電腦上的程式執行 → 由它決定要不要把內容插入 context window↳ agentic loop 是 AI 反覆「想、做、看結果」的工作流程。流程裡發生某件事,就執行你電腦上的程式,由程式決定要不要給 AI 補充訊息。
- 31:16 可以有 100,000 個 hooks,若其中 99,995 個沒觸發、沒匹配或沒回傳文字,唯一限制就是你的電腦↳ 裝十萬個 hooks 也沒關係。只要絕大多數沒觸發或沒回傳文字,就不會佔 AI 的空間,唯一的限制是你電腦跑不跑得動。
- 31:47 Hooks 把非常受限的資源(context window)轉成限制少得多的資源(電腦運算);設計這類系統時要找的就是這種特性↳ 這是 hooks 最厲害的地方:把稀缺的「AI 閱讀空間」換成便宜的「電腦運算」。設計這類系統時,就該找這種特性。
- 31:47 舉例:寫 Rust 時,JavaScript skill 的描述仍占 tokens,Claude 還得忽略它;JavaScript 型別檢查 hook 則發現不是 JS 檔就停止、不回傳任何東西,用不到就不付費↳ 舉例:你在寫 Rust,JavaScript 的 skill 摘要還是佔空間,Claude 還得自己忽略它。換成 JavaScript 型別檢查 hook,發現不是 JS 檔就直接結束,完全不佔空間。
- 32:22 Hooks 的限制:常得從指令或 tool call 中解析個別字詞或用 regex 判斷,不是最「AGI」的做法↳ hooks 的缺點是判斷方式很死板,常要從指令裡抓關鍵字,或用 regex(文字比對規則)來判斷,不像 AI 那樣真的讀懂意思。
- 33:00 可以用 subagents 判斷要不要注入內容,但以 token 來看會開始變貴;有很多取捨,同樣沒有免費午餐,只是可能便宜一點↳ 可以改用 subagent(另一個小 AI)來判斷要不要補充內容,但會多花不少 tokens。一樣沒有免費午餐,只是可能便宜一點。
- 33:00 講者說前面提到的「紅色波浪線」就是在這裡(hooks)實作↳ 講者先前提過的「紅色波浪線」提示,就是用 hooks 做出來的。
- 33:00 Subagents 的結構:一段描述放進主 system prompt,另外有 subagent 自己的 system prompt 或 in-context learning 文字,讓它執行特定任務↳ subagent 由兩部分組成:主 AI 的開頭說明裡有一段介紹它,它自己另外有一份專屬說明或 in-context learning 範例文字(直接給例子讓它照著學),讓它專做某件事。
- 33:30 Subagent 的 system prompt 在另一個 context;主 context 只需負擔 tool call 和 subagent 回傳的結果↳ subagent 的說明放在另一個獨立空間。主 AI 只需要記住「我派它去做事」和「它回報了什麼」。
- 34:00 這裡的「付費」是指 context window 的占用;用 subagent 的 tokens 並不因此免費,重點在切分單一 agent 的 context window↳ 這裡的「省」是指主 AI 的空間。subagent 自己用掉的 tokens 照樣要算錢,重點是把工作拆開,不要全擠在同一個 AI 的記憶裡。
- 34:00 例如 subagent 可以讀 50 個檔案,主迴圈就不用讀,因此在這方面可以擴展↳ 例如讓 subagent 去讀 50 個檔案、只回報結論,主 AI 就不用自己讀,這方面就能放大規模。
- 34:00 但問題相同:每個 subagent 的一行描述仍放在父層 prompt;monorepo 有 100,000 個就得負擔 100,000 行描述;官方正在試驗多種改善方式,但還不完美↳ 但同樣的問題還在:每個 subagent 都要在主 AI 的說明裡留一行介紹,十萬個就是十萬行。官方正在試各種改法,還不完美。
- 34:33 plug-ins 最早也最常見的需求:為什麼不能替 plug-in 提供 Cloud.MD 檔,也就是啟用時無條件放進使用者 context 的一段 system prompt↳ plug-in 是可以一次安裝的擴充包。大家最常要求讓 plug-in 附一份字幕寫作 Cloud.MD 的檔案,只要啟用就無條件放進 Claude 的開頭說明。
- 35:08 講者強烈反對這個需求,因為它是非常昂貴的抽象,看起來卻非常便宜↳ 講者強烈反對這個需求。它看起來只是加一段文字,其實每次對話都佔空間,是很貴卻看起來很便宜的設計。
📘 術語
MCP server(MCP 伺服器):把更多工具注入 context 的方式;transport agnostic、會處理 auth,適合公司對外發布整合
transport agnostic(不限傳輸方式):字幕只列為 MCP 的特性之一,沒有進一步解釋
monorepo(單一大型程式庫):講者的情境:大型程式庫,多名開發者共用同一份程式碼
system prompt(系統提示詞):工具的名稱、描述、schema 都要放在這裡,Claude 才知道怎麼呼叫工具
schema(結構定義):每個工具的定義之一,和名稱、描述一起放進 system prompt
context window(上下文視窗):受限的資源;工具定義太多時會被占滿
tool search(工具搜尋):system prompt 只放工具名稱,Claude 用搜尋工具找到後才載入描述與 schema
lazy load / lazy loaded(延遲載入):用到時才載入完整內容,例如 tool search 找到工具後才給描述與 schema
skill(技能):就是一個資料夾,內有附摘要的 markdown 檔;講者稱它為「lazy system prompt」
front matter(檔頭描述區):skill 檔案裡放一行描述的地方,這行描述會進入 system prompt
hooks(掛鉤):agentic loop 中的事件觸發你的 script,由 script 決定是否把內容插入 context;零開銷的抽象
zero overhead abstraction(零開銷抽象):沒用到就不耗費 context;講者認為 hooks 才真正做到,skills 做不到
agentic loop(代理迴圈):agent 運作過程;其中發生的事件可以觸發 hook
subagent(子代理):自己的 system prompt 在另一個 context;主 context 只負擔 tool call 與結果
in-context learning(上下文內學習):提供給 subagent 的一段文字,讓它能執行特定任務
plug-in(外掛):使用者常要求讓 plug-in 提供啟用時無條件放進 context 的 system prompt
transport agnostic(不限傳輸方式):字幕只列為 MCP 的特性之一,沒有進一步解釋
monorepo(單一大型程式庫):講者的情境:大型程式庫,多名開發者共用同一份程式碼
system prompt(系統提示詞):工具的名稱、描述、schema 都要放在這裡,Claude 才知道怎麼呼叫工具
schema(結構定義):每個工具的定義之一,和名稱、描述一起放進 system prompt
context window(上下文視窗):受限的資源;工具定義太多時會被占滿
tool search(工具搜尋):system prompt 只放工具名稱,Claude 用搜尋工具找到後才載入描述與 schema
lazy load / lazy loaded(延遲載入):用到時才載入完整內容,例如 tool search 找到工具後才給描述與 schema
skill(技能):就是一個資料夾,內有附摘要的 markdown 檔;講者稱它為「lazy system prompt」
front matter(檔頭描述區):skill 檔案裡放一行描述的地方,這行描述會進入 system prompt
hooks(掛鉤):agentic loop 中的事件觸發你的 script,由 script 決定是否把內容插入 context;零開銷的抽象
zero overhead abstraction(零開銷抽象):沒用到就不耗費 context;講者認為 hooks 才真正做到,skills 做不到
agentic loop(代理迴圈):agent 運作過程;其中發生的事件可以觸發 hook
subagent(子代理):自己的 system prompt 在另一個 context;主 context 只負擔 tool call 與結果
in-context learning(上下文內學習):提供給 subagent 的一段文字,讓它能執行特定任務
plug-in(外掛):使用者常要求讓 plug-in 提供啟用時無條件放進 context 的 system prompt
✏️ 小考一題
講者為什麼說 hooks 是「真正零開銷的抽象」?
A. hooks 會透過 tool search 延遲載入自己的 schemaB. 沒觸發或沒回傳文字的 hook 不會占用 context window,限制只剩你的電腦C. hooks 的一行描述比 skills 的描述短,只要約 300、400 tokensD. hooks 都在獨立的 subagent context 裡執行,不影響主 context看答案
答案:B。[31:16] 講者說可以有 100,000 個 hooks,只要其中 99,995 個沒觸發、沒匹配或沒回傳文字,唯一限制就是你的電腦;[32:22] 也舉例 JS 型別檢查 hook 遇到 Rust 檔時不回傳任何東西,「用不到就不付費」。300、400 tokens 是指 skill 描述 [29:43],lazy load 是指 tool search [26:26],獨立 context 是指 subagent [33:30]
💛 覺得有幫助?支持一下


課本免費、沒有廣告,支持與否都能照常讀 🐰