先確認你電腦上有 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
2
3
4
5
6
7
8
9
10
11
12
13
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-filesystem",
"/Users/username/Desktop",
"/Users/username/Downloads"
]
}
}
}

貼完還沒結束。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
2
3
4
5
6
7
"mcp_config": {
"command": "python",
"args": ["${__dirname}/server/main.py"],
"env": {
"CONFIG_PATH": "${__dirname}/config/settings.json"
}
}

規格對 ${__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
2
3
4
5
6
7
8
9
"user_config": {
"api_key": {
"type": "string",
"title": "API Key",
"description": "Your service API key",
"sensitive": true,
"required": true
}
}

然後在 mcp_config 裡用 ${user_config.api_key} 把收到的值注回 env

sensitive 那一格才是重點。規格給它的定義是「For string types, mask input and store securely」,輸入時遮住、儲存時另外處理。以前這件事沒有人負責,key 就躺在一個純文字檔裡等人去讀。

型別五種:stringnumberboolean,加上兩個選擇器型別 directoryfile。每一種都能配 titledescriptionrequireddefaultmultiple 給資料夾與檔案複選,minmax 給數字做範圍檢查。

複選那條還牽著一個機制。標了 multiple: true 的值進到 args 會自動展開成多個參數:使用者挑了 /home/user/docs/home/user/projects 兩個資料夾,["${user_config.allowed_directories}"] 就變成兩個獨立的參數傳給 server。宣告一次,數量由使用者決定。

這裡有個容易錯過的轉換。你不是在設計一個表單畫面,你是在描述「這台 server 需要使用者給我什麼」。介面長什麼樣、欄位怎麼排、遮罩怎麼做,那是 host 的事。同一份宣告換一個 app 去實作,可以畫成完全不同的樣子。

那能不能順便宣告「這個 bundle 只准讀這個資料夾」

不能。這是讀規格時最容易接錯的一條線。

user_configdirectory 型別,官方的 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_namestatic_responses,而 static_responses 裡直接把 initializetools/list 的回應內容預先寫好了。白話講:server 一行都還沒跑,host 就能回答「你是誰、你有哪些工具」。

規格自己也還在動

有個小裂縫值得記一下。MANIFEST.md 開頭寫著 Current version: 0.3Last 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.3Last 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 的語法從頭到尾只能講一件事:我需要什麼。它沒有一個地方能講「我不會做什麼」。安裝這段路鋪平了,信任那段還在原地。