自訂外掛與 MCPB 打包
Core 與 Desktop 處理「你的機器」;Plugins 處理「其他人的 MCP 服務」,而且用第三個、單獨 token 化的端點與共享的 Chat On Steroids Plugins 連接器。這篇範例把一條自製的 MCP server 接進 ChatGPT。
情境
receipt-cli 團隊有一個只讀的「專案筆記」MCP server:receipt-notes,用 Node.js 寫、stdio transport,能列出 docs/notes/*.md 的標題並讀取摘要。你想把它接進 ChatGPT;同時先把 catalog 裡的 Web Fetch recipe 裝起來試水溫。目標是先讓它在本機跑得動,再談怎麼進 ChatGPT。
目標
- 完成 Plugins 連線(獨立的 tunnel/端點)。
- 裝好一個 reviewed catalog recipe,確認它變成 Ready。
- 把自製 server 以本機 MCPB bundle 加入,並用 ChatGPT 實際呼叫一次它的工具。
步驟一:建立 Plugins 連線
- 打開 Settings → Plugins,在連線卡片按 Set up plugins。
- 若你用 OpenAI Secure Tunnels:建立另一個 Plugins 專用 tunnel,在對話框輸入它的 ID,按 Save & connect。既有的 API key 與 tunnel 執行檔會沿用。
- 若你用 Cloudflare 快速 tunnel 或自架 HTTPS tunnel:Plugins 端點會發布在它自己的路徑上。
- 在 ChatGPT 用畫面上顯示的名稱、描述與 MCP URL 建立 Chat On Steroids Plugins 連接器,並讓 CoS 的連線保持運行。
Core、Desktop、Plugins 是三個分開的連接器與權限邊界;Core 與 Desktop 的連接器、權限、工具註冊不因外掛而改變。
步驟二:先裝一個 reviewed catalog recipe
- 在 Settings → Plugins 按 +。
- 選一個 reviewed catalog recipe(這篇用 Web Fetch)。
- 依安裝說明準備它需要的 runtime(npm/Python recipe 需要對應的 Node.js/uv 在位;CoS 不會替你安裝缺少的系統 runtime),並在安全欄位提供憑證。
- 外掛只有在連線與 discovery 都成功後才是 Ready。
步驟三:自製 MCPB bundle
先用長指令與開發伺服器的手法,在本機確認 server 會在 stdio 上正常回應,再打包:
1. exec_command(cmd: "node ./tools/receipt-notes/index.mjs --stdio")
→ session_id(stdio server 常駐等待輸入)
2. write_stdin(session_id: "...", chars: "")
→ server 啟動訊息
3. write_stdin(session_id: "...", chars: "{\"jsonrpc\":\"2.0\",...}\n")
→ 手動送一次請求,確認回應格式
驗證過後,把 server 打包成 MCPB bundle,然後在 Settings → Plugins → + 選 custom server、指向本機 bundle。
- MCPB 使用上游的 manifest parser 與設定展開。不支援的 runtime/manifest 設定會直接回報錯誤,而不是替你發明一條啟動指令——看到錯誤時,修 bundle,不要猜。
- 也可以改選:帶明確引數的可執行檔(沒有 shell 插值)、遠端 Streamable HTTP MCP URL(HTTPS 或 loopback HTTP;HeyGen/Recraft 額外走瀏覽器 OAuth)。
- GitHub URL 只有在符合 reviewed recipe 時才可直接用;其他 repo 需要 MCPB release 或明確的 package/executable 設定——單一個 repo URL 不是可執行的 MCP 設定。
- 憑證用加密儲存;不要把它們嵌進 URL 或引數裡。
步驟四:給 ChatGPT 的 prompt
The Chat On Steroids Plugins connector is set up and the receipt-notes
plugin should be Ready.
Use the plugin's tools to list the note titles under docs/notes, then read
the one about tax rounding and summarize its decision.
Report the exact tool name you called and the raw result. If the connector
doesn't expose the tool, say so instead of guessing — local readiness
doesn't prove ChatGPT has enrolled the connector.
預期的呼叫序列
(本機先驗證 server)
1. exec_command(cmd: "node ./tools/receipt-notes/index.mjs --stdio") → session_id
2. write_stdin(session_id: "...", chars: "") → 啟動訊息
3. write_stdin(session_id: "...", chars: "<JSON-RPC 請求>\n") → 回應
(App/瀏覽器編排層)
4. Settings → Plugins → Set up plugins(獨立 tunnel 或端點)
5. 在 ChatGPT 建立並重新整理 Chat On Steroids Plugins 連接器
6. Settings → Plugins → + → custom server → 選本機 MCPB bundle
7. 外掛變 Ready(連線 + discovery 成功)
8. 在 ChatGPT 呼叫外掛工具(名稱由上游 server 決定,CoS 原樣保留)
認識外掛的邊界
- 外掛程序以你目前的作業系統權限執行,不會繼承 CoS 的核准資料夾沙盒。
- Read-only 模式會拒絕外部外掛呼叫:上游的註解無法證明外部程序不會改動狀態。
- 工具名稱原樣保留;衝突的宣告會被排除而不是改名。Discovery 上限是 64 個工具與 250 KB schema;已安裝清單會區分「已啟用」與「在上限內實際發布」的工具。
- 傳輸失敗不會自動重試工具呼叫。 失敗的變更可能已經生效——重試前先檢查狀態。
- 安裝、設定或工具政策變更後,要重新整理 ChatGPT 的 Chat On Steroids Plugins 連接器,或開啟 CoS 既有的自動連接器重新整理。既有對話可能保留快取的宣告;被停用的工具會立即拒絕過期的呼叫。
- 自動重新整理比對的是 provider 已安裝工具 UI 顯示的名稱、描述與 input schema;只有註解或 output schema 變更的上游調整,要手動重新整理。
- 全新安裝沒有任何外掛。已安裝且啟用的外掛會維持連線直到停用或解除安裝。Update 會先驗證新版本連線成功才提交,失敗會還原前一版;Uninstall 會停掉程序並移除安裝資料與憑證。
驗收方式
- ChatGPT 能列出筆記標題、讀回摘要,並說出實際呼叫的工具名。
- 若工具沒出現:先回到 CoS 看外掛是否真的 Ready,再重新整理 Plugins 連接器;注意「本機 Ready」不等於「ChatGPT 已註冊這個連接器」。
注意事項
- 每個外部服務有自己的條款、權限與用量限制。裝了外掛不等於獲得繞過 provider 限制的授權;被政策擋下的動作不要改由外掛執行。
- Blender 這類 recipe 還有額外條件:社群 addon 必須安裝並啟用、MCP server 要在 viewport 側邊欄啟動,並通過唯讀場景探測才算 Ready。
- 權限與責任使用的完整說明見外掛生態、安全邊界與責任使用、工具表面與權限。