我只用少數幾個 MCP server,需要檢查嗎?
先看兩個條件:你的 allow 規則或 agent 的 tools: 清單裡,有沒有寫成 mcp__名稱 而沒有加 __* 的簡寫;以及你的 server 名稱是否含底線,或剛好是另一個 server 名稱的前綴。兩個條件都沒有的話,這項變更對你沒有影響。用文中第一個檢查指令跑一次就知道。
我的 Skill 在升級後從清單裡消失了,怎麼辦?
先檢查它的檔案或資料夾名稱,而不是 SKILL.md 裡的內容。如果名稱含有隱形字元、改變文字方向的字元、看起來像空白的字元(例如全形空白),或 <、>,它在改名前不會被提供,frontmatter 裡的 name: 也會被忽略。把資料夾改成乾淨的名稱後重新載入即可。常見來源是從網頁複製貼上的名稱。
我寫過檢查 prompt 內容的 UserPromptSubmit hook,升級後要改嗎?
至少要重測。hook 現在在斜線指令或 skill 展開之前執行,看到的是展開前的輸入,原本依賴展開後文字做比對的規則可能對不上。好處是:hook 擋下 prompt 時,內嵌的 shell 指令也不會再跑,以前這是個漏洞。用一個會展開並帶有 shell 指令的自訂斜線指令實測一次最快。
我不是工程師,為什麼這類變更不會有警告?
它們屬於行為改變:更新說明有寫,但程式在執行時不會報錯,只會讓設定不再生效。比較實際的做法是,升級後的第一天,請一位成員拿一份常用的 skill 與 MCP 工具清單實際跑一遍,不要等同事回報「skill 不見了」或「又開始問權限了」才處理。團隊如果有統一的設定檔,更新說明的這幾項值得貼進升級檢查表。
2026 年 10 月 14 日發布的 Claude Code v2.1.299 更新說明有約 131 項修正,其中幾項是「行為改變」:升級後不會報錯,只會讓原本能用的設定悄悄失效,或換了一種運作方式。下面三項引自官方更新說明,並參考 Classmethod 整理的升級影響。
官方更新說明的原文是:MCP allow 規則改為只涵蓋它指名的 server,mcp__a 不再允許名為 a__b 或 a_ 的 server;請寫成 mcp__<server>__*,並使用 server 完整的正規化名稱。Classmethod 整理的升級前行為是:mcp__a 會連 a__b、a_ 一起放行。agent 的 tools: 清單同樣改成只取指名 server 的工具,名稱含 __ 的 server 要寫成 mcp__<完整名稱>__*。
這項有兩個方向的影響。第一,allow 變窄:以前靠「寬鬆前綴」一次放行一整組 server 的人,升級後那些 server 會開始跳權限提示(headless 下則可能被拒)。第二,v2.1.300 的更新說明另外寫了一項修正:名稱正規化後含雙底線的 server,原本的 mcp__<server> deny 與 ask 規則沒有生效。依這句話推論(這是我的推論,不是更新說明的原話),在 v2.1.300 之前,你對這類 server 設的 deny 規則其實沒有擋住任何東西。更新說明沒有解釋「正規化名稱」的規則,遇到名稱含底線的 server,直接從權限提示或工具清單裡看到的完整名稱複製。
原文是:檔案或資料夾名稱含有隱形字元、改變文字方向的字元、看起來像空白的字元,或 <、> 的 skill 或指令,在改名之前不再被提供,其 name: 值也會被忽略。也就是說這個 skill 不會報錯,只是從清單裡消失。更新說明沒有說明原因;我的推測是這類字元可以讓名稱看起來是 A、實際是 B,屬於偽裝風險。
對中文與日文使用者要特別留意:更新說明沒有列出「看起來像空白」的具體字元,全形空白這類字元可能落在其中,建議一併檢查。純粹的中文或日文名稱不在更新說明列出的限制內,但下面的檢查指令會把所有非 ASCII 的名稱都列出來,需要你自己判斷哪些是隱形字元。
以前,自訂斜線指令會先展開、內嵌的 shell 指令先執行,然後才輪到 UserPromptSubmit hook,所以 hook 即使擋下 prompt,也擋不住那段 shell。v2.1.299 改成 hook 先執行:如果它擋下 prompt,展開和內嵌的 shell 指令都不會跑。另外,寫在 skill 自己 frontmatter 裡的 UserPromptSubmit hook,改成從「呼叫這個 skill 的下一則 prompt」才開始執行。
兩個實際影響(第一個是我的推論):用來檢查 prompt 內容的 hook,現在看到的會是展開前的輸入,原本依賴展開後文字做比對的規則要重測;以及,寫在 skill 裡、想攔截「觸發它的那一則 prompt」的 hook,不會再攔到。
onFailure: "block" 一致。mcp__a 寫成 mcp__a__*,名稱含雙底線的 server 用完整名稱:grep -rn "mcp__" ~/.claude/settings.json .claude/settings.json .claude/settings.local.json ~/.claude/agents .claude/agents 2>/dev/null
<、> 的 skill 與指令,逐一確認是不是隱形或方向字元,是的話改資料夾名稱:find ~/.claude/skills ~/.claude/commands .claude/skills .claude/commands -print 2>/dev/null | LC_ALL=C grep -nP '[^\x20-\x7E]|[<>]'
UserPromptSubmit hook 的,用一個會展開的斜線指令實測一次,確認它在展開前就攔得到。