從手貼設定檔到雙擊一個檔:MCPB 把 MCP server 的安裝搬去哪了
先確認你電腦上有 Node。開終端機打 node --version,沒有的話去 nodejs.org 下載 LTS 版。
這是官方文件教一般使用者接上一台本機 MCP server 的第一步。不是附註,是第一步。
接下來的路是這樣走:點系統選單列上的 Claude、進設定、切到 Developer 分頁、按 Edit Config,打開一個 JSON 檔。macOS 上它在 ~/Library/Application Support/Claude/claude_desktop_config.json,Windows 在 %APPDATA%\Claude\claude_desktop_config.json。然後把一段 mcpServers 貼進去:
1 | { |
貼完還沒結束。username 要換成自己的;疑難排解那節特別交代過,裡面的路徑必須是絕對路徑、不能是相對路徑;最後要完全結束 Claude Desktop 再重開,設定才會被讀進去。
對工程師來說,這十分鐘的事沒什麼好抱怨。問題是 MCP server 常常不是寫給工程師用的。一台查訂單的 server、一台接公司內部知識庫的 server,真正每天要用它的人是業務跟客服。你寫完的那一刻,它離「能給人用」還隔著一台終端機。
MCPB 要補的就是這段距離。
那段要貼對的 JSON,變成別人替你貼
.mcpb 本身沒什麼玄機。repo 的 README 講得很白,它就是個 zip:「MCP Bundles (.mcpb) are zip archives containing a local MCP server and a manifest.json that describes the server and its capabilities.」對照物也點名了,Chrome 的 .crx、VS Code 的 .vsix。
真正把差別講出來的,是 MANIFEST.md 裡一句不太起眼的話:
When installing the extension, apps will automatically generate the appropriate MCP server configuration and add it to the user’s settings, eliminating the need for manual JSON editing.
設定檔沒有消失。它還在,只是不再由使用者手寫。
順帶一提,這東西改過名。README 最上面到現在還掛著改名公告:DXT(Desktop Extensions)改叫 MCPB(MCP Bundles),dxt CLI 變成 mcpb,.dxt 變成 .mcpb,npm 套件從 @anthropic-ai/dxt 搬到 @anthropic-ai/mcpb。而 repo 那一行描述現在還寫著 Desktop Extensions。改名還沒改完。
還有兩件事底下沒有專節,先在這裡放著:
| 同一件事 | 舊做法 | MCPB |
|---|---|---|
| 依賴怎麼進來 | npx -y 每次現抓 |
打包在 zip 裡(Node 範例含 node_modules/) |
| 執行環境需求 | 使用者自己確認有 Node | compatibility.runtimes 宣告版本區間 |
絕對路徑這件事,換人負責
舊做法的疑難排解有一條很誠實:「Make sure the file paths included in claude_desktop_config.json are valid and that they are absolute and not relative」。要使用者寫絕對路徑,等於要他知道自己的東西裝在這台機器的哪個位置。
manifest 這邊寫的是變數:
1 | "mcp_config": { |
規格對 ${__dirname} 的說明是「replaced with the absolute path to the extension’s directory」。同一個絕對路徑,以前使用者填,現在 host 填。同一組變數還有 ${HOME}、${DESKTOP}、${DOCUMENTS}、${DOWNLOADS},以及替你處理斜線方向的 ${pathSeparator}(可以簡寫成 ${/})。
sensitive 那一格,以前沒有人負責
舊做法的 key 放哪?放 env 區塊,明文,在使用者自己的設定檔裡。官方文件講 Windows 疑難排解那段順手示範了一次,BRAVE_API_KEY 就跟 APPDATA 並排躺在同一個 JSON 物件中。
MCPB 把這件事整個反過來。作者不填值,作者宣告一個欄位,讓 host 去問使用者:
1 | "user_config": { |
然後在 mcp_config 裡用 ${user_config.api_key} 把收到的值注回 env。
sensitive 那一格才是重點。規格給它的定義是「For string types, mask input and store securely」,輸入時遮住、儲存時另外處理。以前這件事沒有人負責,key 就躺在一個純文字檔裡等人去讀。
型別五種:string、number、boolean,加上兩個選擇器型別 directory 跟 file。每一種都能配 title、description、required 跟 default,multiple 給資料夾與檔案複選,min 和 max 給數字做範圍檢查。
複選那條還牽著一個機制。標了 multiple: true 的值進到 args 會自動展開成多個參數:使用者挑了 /home/user/docs 跟 /home/user/projects 兩個資料夾,["${user_config.allowed_directories}"] 就變成兩個獨立的參數傳給 server。宣告一次,數量由使用者決定。
這裡有個容易錯過的轉換。你不是在設計一個表單畫面,你是在描述「這台 server 需要使用者給我什麼」。介面長什麼樣、欄位怎麼排、遮罩怎麼做,那是 host 的事。同一份宣告換一個 app 去實作,可以畫成完全不同的樣子。
那能不能順便宣告「這個 bundle 只准讀這個資料夾」
不能。這是讀規格時最容易接錯的一條線。
user_config 有 directory 型別,官方的 filesystem 範例又正好拿它來讓使用者挑「Directories the server can access」,看起來就很像一個權限宣告。它不是。那些資料夾是以命令列參數的形式傳給 server 的,server 要不要真的只讀這幾個,是 server 自己的事,沒有任何一層在攔。
於是我把 0.3 版的 MANIFEST.md 整份抓下來,搜 permission、security、sandbox、signature 這四個字。
這四個字不在同一層:permission 是宣告式的邊界,sandbox 是執行期的圍籬,security 是文件願不願意談這件事,signature 是退而求其次的來源證明。四條路只要通一條,「雙擊就裝好」這句話就還有個底。
一個都沒有。
負面證據得說清楚查的是哪一份,不然它什麼都證明不了:這是 0.3 那一版的 manifest 規格本身,不是 CLI,也不是任何一家 host 的實作。在這份文件的語法裡,你講得出來的只有「這個 bundle 需要什麼、在哪些平台跑得起來、提供哪些工具」,沒有任何一個欄位在描述它不准做什麼。
這一點跟舊做法完全一樣。官方那份手動安裝文件自己在警告框裡寫過:「The server runs with your user account permissions, so it can perform any file operations you can perform manually.」安裝變簡單了,這句話沒有跟著變。
簽章有,但它掛在 optional 底下
CLI 那邊確實備了一整套:mcpb sign 用 X.509 憑證簽,mcpb verify 驗,mcpb info 看狀態。verify 會印出憑證的 subject、issuer、效期跟指紋,文件也寫明「Warning if self-signed」。
但 CLI.md 自己的建議流程裡,那一步寫的是 # 6. (Optional) Sign the extension,示範指令用的還是 --self-signed。另外還有一個 mcpb unsign,文件標的用途是 for development/testing。
所以「雙擊就裝好」這句話得配一個但書。雙擊裝進去的東西,預設不保證你知道是誰包的,也不保證有人審過。這跟瀏覽器擴充功能商店那種上架審查是兩回事。
支援範圍也要講清楚。README 明講的是 Claude for macOS 與 Windows 用這個 repo 的程式碼實作單擊安裝,其餘寫的是 hope:希望這個格式不只讓本機 MCP server 對 Claude 更好搬,對其他 AI 桌面應用也一樣。現階段它不是一個到處都能用的安裝格式。
裝之前就看得到它會做什麼
manifest 可以先列出 tools 清單,讓使用者在安裝前看到這台 server 提供哪些工具。搭配的是 tools_generated,布林值、預設 false,意思是「除了清單上這些,執行期還會生出更多」。旁邊還有一個對稱的 prompts_generated。
規格對這組欄位的解釋值得抄一次:「This helps implementing apps understand that querying the server at runtime will reveal more capabilities than what’s declared in the manifest.」它等於在承認清單可能不完整,並要求你誠實標記這件事。願意寫下「我這裡還有你看不到的東西」,比清單本身有用。
_meta 還有個更極端的版本。官方範例用 com.microsoft.windows 這個反向 DNS 命名的 key,底下放 package_family_name 跟 static_responses,而 static_responses 裡直接把 initialize 跟 tools/list 的回應內容預先寫好了。白話講:server 一行都還沒跑,host 就能回答「你是誰、你有哪些工具」。
規格自己也還在動
有個小裂縫值得記一下。MANIFEST.md 開頭寫著 Current version: 0.3、Last updated: 2025-12-02,而 server.type 旁邊那行註解列的是三種:Server type: "node", "python", or "binary"。往下翻,同一份文件另外有一節在講第四種 uv,標題掛著 v0.4+,範例裡的 manifest_version 也寫 0.4。
uv 那種的設計是不把 Python 依賴打包進去,改用 pyproject.toml 宣告、交給 host 用 UV 安裝。規格列的好處有跨平台、體積從 5-10 MB 降到大約 100 KB、能處理 pydantic 跟 numpy 這類要編譯的依賴,而且使用者不需要自己裝 Python。它同時要求 bundle 不可以包含 server/lib/ 或 server/venv/。
所以照 0.3 寫是三種,0.4 才是四種。查欄位的時候得先對一下自己寫的 manifest_version 是哪一版。repo 上一次 push 停在 2026 年 5 月 26 日,README 最上面那則改名公告也還沒撤,這東西在動,但不是每天在動。
本文全部依據官方文件寫成:anthropics/mcpb 的 MANIFEST.md(Current version: 0.3、Last updated: 2025-12-02)、CLI.md、README,以及 MCP 官方那份接本機 server 的說明。我沒有打包過 .mcpb、沒有跑過 mcpb CLI,也沒有在任何 host 裡實際安裝過一次,所以安裝畫面長什麼樣、雙擊之後的互動流程怎麼走,本文一律沒寫。上面提到的每個欄位與每條限制,都是規格文字裡有的。
誰該把事情想清楚
要判斷 MCPB 對你有沒有用,問一個問題就夠了:你這台 server 的使用者,會不會自己開終端機。
會的話,MCPB 幫不上什麼忙。同事看得懂 JSON、知道絕對路徑是什麼,多一份 manifest 加一次打包,只是多一個要跟著版本更新的東西。哪天你要把同一台 server 交給業務或客服,那條界線才會浮出來。
步驟從好幾步壓成一步,那只是表面。底下換掉的是歸屬。以前 claude_desktop_config.json 是使用者的檔案,使用者要對裡面每一個值負責——路徑對不對、key 貼哪一格、JSON 有沒有少一個逗號。MCPB 把同一份資訊變成作者的宣告,寫進 manifest,跟著 bundle 一起走。user_config 逼你在按下打包之前,就把「這台 server 到底需要使用者給我什麼」講到規格的程度,而那件事以前可以在 README 裡含混帶過,反正使用者會來問。
這也剛好解釋了為什麼權限不在裡面。manifest 的語法從頭到尾只能講一件事:我需要什麼。它沒有一個地方能講「我不會做什麼」。安裝這段路鋪平了,信任那段還在原地。










