[AGENT] 10 分鐘閱讀OraCore 編輯部

Agent Plugins 讓工具包可交付

我把 Agent Plugins 1.0.0 拆成可直接複製的插件目錄模板,重點是清單、技能文件和 MCP 配置怎麼一起打包。

分享 LinkedIn
Agent Plugins 讓工具包可交付

1 個文件夾就能把技能、MCP 配置和插件清單一起打包,直接交給別的智能體客戶端用。

我最近一直被一個很煩的事卡住:工具明明做出來了,交出去卻像散件。今天補 OpenAI 這套格式,明天補一份 MCP,後天又要為 Cursor、VS CodeGitHub Copilot 各寫一版說明。功能不是沒做,是交付方式太爛。你可以把它想成一個能跑的工具箱,但每次打開都要先找螺絲起子,誰都會煩。

我是在這篇 AI Weekly 8.3-8.9 看到 OpenAI 8 月 7 日推出 Agent Plugins 1.0.0 的整理,還點名 MicrosoftAWSCursorVercelGoogle 這批人一起進來。原文沒給瀏覽數或收藏數,我就不亂編。

把插件當成一個可搬走的文件夾

訂閱 AI 趨勢週報

每週精選模型發布、工具應用與深度分析,直送信箱。不定期,不騷擾。

不會寄垃圾信,隨時可取消。

一個插件就是一個文件夾,裡面放 plugin.json、技能文件,還有 MCP 伺服器配置。

這句話我很買單,因為它直接把問題講死了:插件不是一堆散落的腳本,也不是 README 寫得很熱鬧的倉庫。它就是一個可搬運的交付單元。你拿走這個資料夾,理論上就該知道怎麼讀、怎麼啟、怎麼接。

Agent Plugins 讓工具包可交付

翻譯一下就是,別再把「可用」和「可交付」混在一起。可用只代表你本機能跑;可交付代表別人拿到也能跑。這中間差的不是幾行代碼,是包裝方式。

我之前做過一個內部知識庫助手,功能其實不差,但每次給別的團隊,都要口頭補一輪:先裝什麼、環境變數放哪、哪個端口、哪個 client 才能接。最後大家都懶得碰。Agent Plugins 這個方向至少先把形狀定下來,讓「拿走就能跑」變成第一件事。

實操上,我會先把每個插件的責任切小:一個資料夾只做一件事,比如查工單、整理會議、拉知識庫。目錄越乾淨,別的 client 越容易直接吃進去。你要的是穩定交付,不是把一個 repo 塞到爆。

  • 把插件目錄當發布單元,不要當雜物間。
  • 一個插件只對應一個明確場景。
  • 先讓別人讀懂,再談自動安裝。

plugin.json 是身份證,不是裝飾

這次最核心的文件是 plugin.json。我喜歡這種設計,因為它很直白:你想讓機器認識你,就先把身份講清楚。沒有清單,client 不知道你叫什麼、會做什麼、能不能信任你。

也就是說,插件的名字、版本、入口、權限、依賴,最好都壓進這份機器可讀的清單。別把這些資訊丟在 README、腳本註解,甚至聊天記錄裡。人會忘,機器根本不會去翻。

我踩過最多的坑,就是作者以為「大家都懂」。結果換一個環境,路徑不對;換一個 client,認證欄位不對;換一個人接手,整包就卡死。清單文件的價值,就是把這些默認知識變成顯式規則。

實操寫法很簡單:我會把清單拆成四塊,名稱、能力、入口、權限。名稱要穩定,能力要一句話講完,入口要能直接執行,權限要盡量小。別寫空話,別寫形容詞,別讓人看完還要猜。

  • 名稱要唯一,方便搜尋和引用。
  • 能力描述要短,最好能直接對應使用場景。
  • 入口要明確,命令、URL、MCP endpoint 擇一寫清。
  • 權限要最小化,能只讀就別寫入。

技能文件寫的是會什麼,不是怎麼吹

摘要裡提到插件包含「技能文件」,這點我覺得很重要。很多人一做智能體能力包,就開始寫介紹文案,像在賣 SaaS。問題是,模型不吃這套。模型要的是可執行的技能說明,不是漂亮話。

Agent Plugins 讓工具包可交付

翻譯一下就是,技能文件要回答三件事:它能做什麼、什麼時候該叫它、叫完會得到什麼。它是給模型看的操作說明,不是給市場看的產品頁。寫得越像說明書,越有用;寫得越像廣告,越容易誤導。

我以前調過一個自動整理會議紀要的 agent,前期失敗率很高。後來我把技能描述改得很死:輸入是會議原文,輸出是三段式摘要,缺參會人就先回缺口,不准瞎補。就這樣一改,調用穩定很多。不是模型突然變聰明,是我終於把邊界寫清楚。

實操上,我會要求每個技能文件固定有五段:用途、輸入、輸出、失敗條件、示例。尤其是示例,別省。模型會從示例裡學到調用節奏,工程師也能直接驗格式。你要的是可重用,不是看起來很完整。

如果你要把插件交給別的團隊,技能文件其實比代碼更值錢。代碼能改,技能邊界寫錯了,整個包都會被誤用。

MCP 配置直接打包,別讓人手工補洞

這次最實際的一點,是插件包裡直接帶 MCP 伺服器配置。對我來說,這比「支援多少 client」更重要。因為只要接入方式一起打包,插件就不只是工具,而是一個完整的上下文服務入口。

也就是說,你不是只發一個功能,你是在發「功能 + 接法」。client 不用猜你怎麼連,開發者也不用再手搓一次設定。這件事很瑣碎,但真的省命。

我踩過的坑幾乎都在這裡。工具本身沒問題,問題是每個環境都要重寫配置。今天本地能連,明天 CI 失敗,後天換 client 又要改 port、改認證、改路徑。最後大家直接放棄。MCP 配置如果能跟插件一起交付,至少能把這類重工砍掉一大截。

實操上,我會把 MCP 配置當成預設接入層,而不是後補文件。把服務地址、認證方式、暴露能力寫進包裡,讓 client 能直接讀。再另外提供覆蓋項,給進階使用者改環境變數或本地配置。預設值要能跑,覆蓋項要能改,這才像能維護的包。

  • 預設配置放包內,方便開箱即用。
  • 敏感資訊用外部注入,不要硬編碼。
  • 提供覆蓋項,別把使用者鎖死。

這次真正值錢的是多方一起對齊

這份整理裡最有意思的,不只是 OpenAI 發了標準,而是 MicrosoftAWSCursorVercel 都被拉進同一套交付語言裡。再加上 Google 以 Core Maintainer 身份加入,還丟出 Agents CLIData Agent Kit,這就不是單點產品更新了。

翻譯一下就是,如果一個插件只能在單一 client 裡跑,它的價值會被鎖死。反過來,如果多個 client 都認同同一套打包方式,你的維護成本就會掉下來。你不用每個平台重寫一次,只要把包做對。

我最在意的是 Google 的位置。它不是站旁邊喊加油,而是直接以 Core Maintainer 身份進來,還把生產工具一起補上。這代表標準化的不只是消費端,連產出端也在收斂。生產端一旦統一,工具鏈才真的會省事。

實操上,我會先看自己的工具能不能塞進這套結構。就算不能完全照搬,也至少要保證包結構、清單、服務配置能被別的 client 理解。別把自己做成孤島,不然你永遠都在維護自己的私有協議。

我會怎麼把它落地到專案

如果是我來做,我不會先急著補功能。我會先把插件目錄設計成最小可發布單元。意思是,這個資料夾一出來,就應該能被別人讀、改、跑。先把包裝做好,再談能力擴張。

第一步,我會定義邊界,一個目錄只服務一個場景。第二步,我會寫清單文件,把名稱、版本、入口、權限寫死。第三步,我會把技能文件寫成機器友好的說明,帶輸入輸出示例。第四步,我會把 MCP 配置放進目錄,並提供環境覆蓋。最後才接 Cursor、VS CodeChatGPT 這些 client。

這個順序很重要,因為大多數失敗不是功能不夠,而是別人接不進來。你要先讓別人能接,再談別人願不願意用。順序錯了,後面全是返工。

我也會給每個插件加一個最小自檢腳本。讀清單、檢查 MCP、跑一個 sample call,三步過一遍。別等使用者報錯才處理。只要你開始分發,測試就不是加分題,是基本功。

可抄的模板

agent-plugin-name/
├── plugin.json
├── skills/
│   ├── README.md
│   └── summarize.md
├── mcp/
│   └── server.json
├── scripts/
│   └── self-check.sh
└── examples/
    └── invoke.md

# plugin.json
{
  "name": "agent-plugin-name",
  "version": "1.0.0",
  "description": "One-line description of what this plugin does.",
  "entry": {
    "type": "mcp",
    "config": "mcp/server.json"
  },
  "skills": [
    {
      "id": "summarize",
      "file": "skills/summarize.md",
      "purpose": "Turn raw input into a structured summary"
    }
  ],
  "permissions": {
    "network": "read-only",
    "filesystem": "scoped"
  },
  "clients": ["VS Code", "Cursor", "GitHub Copilot", "ChatGPT", "Codex", "Kiro"]
}

# skills/summarize.md
## Purpose
Summarize input into a short, structured output.

## Input
- source_text: raw text
- tone: concise | neutral | technical

## Output
- title
- bullets
- action_items

## Failure conditions
- Missing source_text
- Input too large for configured context

## Example
Input: meeting notes
Output: 3 bullets + 2 action items

# mcp/server.json
{
  "name": "agent-plugin-name-mcp",
  "command": "node",
  "args": ["dist/server.js"],
  "env": {
    "PORT": "${PORT:-3000}",
    "API_KEY": "${API_KEY}"
  }
}

# scripts/self-check.sh
#!/usr/bin/env bash
set -euo pipefail

echo "1) validate plugin.json"
cat plugin.json >/dev/null

echo "2) validate MCP config"
cat mcp/server.json >/dev/null

echo "3) run a sample invocation"
./run-sample.sh

echo "OK"

# examples/invoke.md
1. Install the plugin folder.
2. Read plugin.json.
3. Start the MCP server.
4. Call the summarize skill with sample input.
5. Verify the output matches the example.

這份模板不是官方原文,我是根據 原始整理,再加上我自己的工程化拆法寫出來的。原始來源 URL 我放在這裡:https://zhuanlan.zhihu.com/p/2069889254105392703。我寫的是可直接拿去改的版本,不是逐字搬運。