Claude Code Plugin 安全驗收的第一條規則,是別把「Official」或「Community」看成安全保證。一個 Plugin 不只是圖示與介紹頁;它可以帶進 Skills、Agents、Hooks、MCP、LSP、Scripts、設定與每次對話都要付出的 Context。你若不知道這些元件會讀什麼、執行什麼、連去哪裡,就還沒完成安裝前判斷。
本文在 2026 年 8 月 30 日以 Claude Code 2.1.251、Anthropic 當時的官方與社群 Marketplace repository 重跑流程,帶你完成六關:認來源、鎖執行內容、盤元件、算 Context、隔離啟動、驗證退出。你不需要先會開發 Plugin;只要會複製終端機指令,就能替每次安裝留下可追溯收據。
這篇不會替任何第三方 Plugin 背書,也不會把自動掃描當認證。若你尚未理解 Plugin 與 Skill 的差別,可先看《Cursor Plugin 6 步打包教學》與《Agent Skill/SKILL.md 教學》;本文專注在使用者端的 Marketplace 准入。
先說結論:Claude Code Plugin 安全驗收不是看徽章,而是看六張收據
🔐 記憶把手:放心裝 = 鎖來源 × 看全元件 × 縮小權限 × 可退出。
Marketplace 標籤只回答「從哪個目錄發現」;commit SHA 只回答「抓到哪份 repository tree」;真正准入還要回答 runtime 會不會再抓浮動套件、啟動遠端 MCP、載入 Hooks,以及失敗時能否停用並回到已審版本。
六張收據依序是:候選 entry、transitive runtime、component inventory、scope/Context、隔離行為、退出/更新。這與《Scientific Agent Skills 安全上手》的通用「鎖版、掃檔、隔離」方法相接,但本文多處理 Marketplace 解析、多元件自動載入與移除殘留。

Official 與 Community Marketplace 各自保證什麼?
Claude Code Plugin discovery 官方文件說明:claude-plugins-official 是 Anthropic 維護、首次互動啟動時自動加入的精選目錄;anthropics/claude-plugins-community 則要自行加入,內容來自第三方,通過 Anthropic 的自動驗證與安全掃描。加入 Marketplace 只是登錄目錄,還沒有安裝其中的 Plugin。
但「精選」與「掃描過」都不是行為保證。官方同一頁直接警告:Plugin 與 Marketplace 屬於高信任項目,能以使用者權限執行任意程式;Anthropic 也無法控制第三方 MCP server、檔案或軟體是否照你的預期運作。請把四件事拆開看:Official/Community 是分發通道,Anthropic Verified 是 Directory 的額外審查標記,開發者名稱回答誰負責,Git SHA 才定位一份直接 source。這個四軸拆法是依第一方 metadata 做的實務歸納,不是 Anthropic 的安全評級;四者都不能取代候選版本的逐項審查。
還有一個值得停下來看的落差。官方文件當時寫「每個社群 Plugin 都固定到特定 commit SHA」;我們檢查社群 catalog 的 a727be1c7bd6064419b6f60d71993a19198adc17 snapshot,2,282 筆裡有 2,277 筆 external source,其中 2,274 筆有完整 source.sha,3 筆只有可移動的 ref;另有 5 筆是 catalog 內相對路徑。這不等於那些項目惡意;它證明你要驗證「選中的那一筆」,不能只引用整體宣稱。
先懂 Plugin 會載入什麼:plugin.json 甚至不是必備
依照 Plugins reference,.claude-plugin/plugin.json 是選用 manifest;沒有它時,Claude Code 仍會依標準目錄辨識 Skills、Commands、Agents、Hooks、MCP 與 LSP 等元件。完整 inventory 也要檢查 scripts/、bin/、settings.json、套件檔與 lockfile,因為它們可能被其他元件或相依安裝流程叫用。所以「manifest 看起來乾淨」不代表整包只有那些能力。
風險也不只在 shell script。Hooks 可在生命週期事件自動執行 command、HTTP 或 MCP tool;MCP server 啟用後會加入工具並可能連外;Skills 與 Agents 會增加提示內容;LSP 會啟動語言伺服器。若你想先補 Hooks 的觸發與失敗語意,可接著讀《Claude Code Hooks 教學》。
Claude Code Plugin 安全驗收第 1 關:固定候選 entry,不只記名稱
痛點:同名 Plugin 可以換來源,Marketplace 本身也會更新。解法:先保存 marketplace repo 的完整 commit,再抽出候選 entry 的 URL、path、ref 與 SHA;沒有完整 40 字元 SHA 就先 HOLD。
REVIEW_DIR="$(mktemp -d)"
PLUGIN='你的-plugin-name'
git clone --depth=1 \
https://github.com/anthropics/claude-plugins-community.git \
"$REVIEW_DIR/community"
git -C "$REVIEW_DIR/community" rev-parse HEAD
jq --arg name "$PLUGIN" \
'.plugins[] | select(.name == $name) |
{name, source, homepage}' \
"$REVIEW_DIR/community/.claude-plugin/marketplace.json"
這張收據要同時留「catalog commit」與「candidate source SHA」。前者證明你看到哪版目錄,後者才定位外部 Plugin tree。若 entry 是相對路徑,它實際跟著 catalog commit;若是 ref: main 或 @latest,內容可在你沒有重做 review 時改變。
第 2 關:SHA 只鎖 repository tree,還要追 runtime 第二跳
痛點:Plugin source 固定,不代表執行時拿到的程式也固定。解法:搜尋 npx、uvx、bunx、@latest、遠端 URL 與安裝命令,逐一判斷第二跳是否可重現。
rg -n \
'@latest|npx|uvx|bunx|pipx|curl|wget|https?://|API_KEY|TOKEN|SECRET' \
"$PLUGIN_DIR"
這不是理論風險。官方 Marketplace 在 Playwright Plugin 的固定 repository snapshot中,MCP launcher 仍是 @playwright/mcp@latest。這不代表 Playwright 不安全;它只示範一件事:repository SHA 無法固定套件 registry 下一次解析出的版本。遠端 HTTP MCP 更進一步連程式內容都不在該 tree 裡,你要另外接受服務端更新、資料傳輸與帳號權限邊界。
第 3 關:用 details 加逐檔掃描,建立 component inventory
痛點:README 只介紹功能,不一定列出所有自動載入元件。解法:安裝前先看固定 source tree;安裝後再讓 CLI 解析一次,兩份清單要能互相解釋。
claude plugin details "$PLUGIN@claude-community"
claude plugin list --json
find "$PLUGIN_DIR" -type f -print | sort
find "$PLUGIN_DIR" -type l -print
for file in .claude-plugin/plugin.json .mcp.json .lsp.json hooks/hooks.json settings.json; do
test -f "$PLUGIN_DIR/$file" && jq . "$PLUGIN_DIR/$file"
done
每個元件只問五件事:會讀什麼、會寫什麼、會執行什麼、會連去哪裡、會碰哪些秘密。未知不算零風險,而是未完成。要把這份 inventory 擴成 SARIF 或 CI gate,可沿用《AI-Infra-Guard/MCP 供應鏈掃描》的方法。
第 4 關:先用 local scope,再把 Context 當准入預算
痛點:預設 user scope 會把 Plugin 帶到更多專案;元件名稱與描述也可能每個 session 都佔 Context。解法:第一次只在拋棄式 repo 使用 --scope local,並用 plugin details 記錄 Always-on 與 On-invoke 估算。
LAB_REPO="$(mktemp -d)"
git -C "$LAB_REPO" init
cd "$LAB_REPO"
claude plugin marketplace add \
anthropics/claude-plugins-community --scope local
claude plugin install \
"$PLUGIN@claude-community" --scope local
claude plugin details "$PLUGIN@claude-community"
本次用 testdino@claude-community 當「有遠端 MCP、沒有 Hooks」的測試 fixture,不代表推薦。2.1.251 的 inventory 顯示 7 個 Skills、1 個 HTTP MCP、Always-on 約 528 tokens;CLI 同時註明 MCP tool schemas 在 runtime 才解析、沒有算進去,token 數也是估算。換句話說,528 不是帳單預測,而是「尚未做任務,每個 session 已先帶入多少索引文字」的准入訊號。

第 5 關:在無秘密、可丟棄的 repo 才做第一次啟動
痛點:只要一進正常工作 repo,Hook 或 MCP 就可能看見真實檔案、環境變數與網路。解法:fixture repo 不放 .env、SSH key、雲端憑證或客戶資料;先以 OS/Dev Container 封鎖 outbound,再依必要性只放行單一 host。local scope 只控制這個 repo 是否啟用,不是 sandbox;Claude Code 內建 sandbox 主要約束 Bash subprocess,不能替 Hook、MCP 與其他 Plugin surface 作完整隔離。Sandboxing 文件也把開發容器與 VM 列為更強隔離選項。
啟動前後至少比較:git status --short、新增檔案、子程序、監聽 port、外連 host、工具清單與 Context 估算。刻意做三個 canary:要求讀 repo 外假秘密、要求連未放行網域、讓 Hook/MCP 超時。只要出現未授權讀寫、繞過網路規則或無法停止的程序,就直接 REJECT;平均表現再好也不能抵銷。更完整的 runtime revocation 可接《Agent Runtime Controls》與《Claude Code Auto Mode 安全實驗》。
第 6 關:先驗證 disable、update、uninstall,再談回滾
痛點:會裝不代表能安全退出。解法:先停用、確認 list 狀態,再更新;更新後用新 session 或 /reload-plugins 套用。Reload 可能讓下一次請求重新讀取對話並影響 prompt cache,所以不要在長任務中途把它當無成本按鈕。
claude plugin disable "$PLUGIN@claude-community"
claude plugin list --json
claude plugin update \
"$PLUGIN@claude-community" --scope local
claude plugin uninstall \
"$PLUGIN@claude-community" --scope local
claude plugin marketplace remove \
claude-community --scope local
我們的隔離實驗中,disable 後 enabled:false;uninstall 後 plugin list --json 變成空陣列,.claude/settings.local.json 的 enablement 也清空。但 cache 目錄仍留下 .orphaned_at,移除 Marketplace 後亦然。官方 reference 說 orphaned cache 由背景清理,通常約 14 天;因此驗收要分成「已失去作用」與「磁碟已清除」兩欄。
Claude Code 2.1.251 的 plugin --help 沒有獨立 rollback subcommand。真正可回復的做法,是更新前保存 catalog commit、candidate SHA、逐檔 hash、inventory 與設定;新版失敗先 disable 並開新 session,再從你控制的 pinned Marketplace/source 恢復已審版本。若舊版無法由收據重建,就不算具備回滾能力。
Claude Code Plugin 准入決策:什麼時候 PASS、HOLD、REJECT?
- PASS:候選 source 可定位;第二跳版本或遠端服務邊界可接受;元件、秘密、網路、Context 都有收據;隔離 canary 無越權;disable/uninstall/恢復流程可重做。
- HOLD:只有浮動 ref、遠端 MCP 尚未確認資料政策、Context 成本不明、需要正式秘密才能測,或新版 diff 尚未 review。HOLD 不是判定惡意,只是證據未完。
- REJECT:未揭露的自動執行、無法解釋的下載器、要求過大 scope、嘗試讀取不必要秘密、繞過 sandbox、無法停止,或來源與安裝內容對不上。
實務上最容易犯的錯,是看到一次 PASS 就開啟 auto-update。官方文件指出 Anthropic Marketplace 通常預設自動更新,第三方與本機 Marketplace 通常不是;但關閉它也不是完整凍結:具 Marketplace 名稱的安裝可能先刷新 catalog,command source 還有每個 session 重新解析的路徑。只要 source、runtime package、MCP endpoint、Hooks 或 Context 任一改變,原收據就不能替新版作保。
常見問題 FAQ
1. Anthropic Official Plugin 可以直接安裝嗎?
不能只因為 Official 就跳過驗收。官方目錄降低發現與供應通道的不確定性,但官方文件仍把 Plugin 視為可用使用者權限執行程式的高信任項目。
2. Community Marketplace 的 SHA 就是安全認證嗎?
不是。SHA 只定位 repository tree,不證明程式善意,也不固定 @latest、遠端 MCP 回應或伺服器端更新;而且本次公開 catalog snapshot 確實存在少數 ref-only 例外。
3. 找不到 plugin.json,是否代表不是 Plugin?
不代表。plugin.json 是選用;Claude Code 仍會從標準目錄自動發現 Skills、Agents、Hooks、MCP、LSP 等元件。
4. local scope 等於 sandbox 嗎?
不是。local scope 只縮小啟用範圍;程序能讀寫什麼、能否連網,仍由 Claude 權限、OS sandbox、容器與秘密管理共同決定。
5. plugin details 顯示的 token 是實際費用嗎?
不是。它是 projected token cost;Always-on 與 On-invoke 都是估算,MCP tool schema 還可能在 runtime 才解析。它適合做准入比較,不是帳單保證。
6. disable 後,當前 session 立刻乾淨嗎?
不要這樣假設。一般元件可在確認後 reload,但既有 monitor 可能要到 session 結束才停止;最穩妥是結束舊 session,再用新 session 重查元件清單、程序與連線。長任務中途 reload 還可能影響 prompt cache。
7. uninstall 後還看到 cache,是不是仍在執行?
不一定。本次實驗 active list 已空、enablement 已清除,但 orphaned cache 仍在等待背景清理。要分別檢查啟用狀態、程序/連線與磁碟殘留。
8. 最安全的更新方式是什麼?
把更新當成新候選。先 disable,記錄新舊 SHA 與 component diff,重跑第二跳、Context、canary 與退出測試,通過後才在正式 repo 啟用。
給新手的 6 個重點
- Marketplace 標籤不是安全認證。
- 同時保存 catalog commit 與 candidate source SHA。
- 追查
@latest、package registry 與遠端 MCP 這些第二跳。 - manifest 可缺席,標準元件目錄仍要全掃。
- 第一次只用 local scope、無秘密 fixture 與受控網路。
- 先證明能 disable、uninstall、重建舊版,才准許正式更新。
接著閱讀
左右滑動查看更多推薦
結語:真正放心,不是相信標籤,而是隨時能回答與退出
回到開頭的記憶把手:放心裝 = 鎖來源 × 看全元件 × 縮小權限 × 可退出。Official/Community 能幫你找到候選,卻不能替你接受 runtime 第二跳、資料外傳、Context 或生命週期風險。今天就先挑一個你真的需要的 Plugin,只做到 details、逐檔 inventory 與 local-scope 安裝;六張收據沒有湊齊以前,不要讓它進正式 repo。






