MCP(Model Context Protocol)是一種開放式通訊協定,允許 OpenCode 與外部工具服務進行標準化互動。你可以將 MCP 想像成 AI 代理的「USB 埠」——它定義了一套統一的介面,讓任何符合規範的工具都能即插即用。
當代理需要執行超出其內建能力的任務時(如查詢資料庫、建立 GitHub Issue、傳送 Slack 訊息),MCP 伺服器就扮演了橋樑角色。代理透過 MCP 協定發送請求,伺服器執行對應操作並回傳結果。
本地 MCP 伺服器與 OpenCode 執行在同一台機器上,透過標準輸入輸出(stdio)或本機 TCP 連接進行通訊。這是最常見的 MCP 部署方式,適合整合本地資料庫、檔案系統工具或內部腳本。
MCP 伺服器設定在 opencode.json 的 mcp 欄位中:
{
"mcp": {
"servers": {
"sqlite-explorer": {
"command": "node",
"args": ["mcp-servers/sqlite-server.js"],
"env": {
"DB_PATH": "./data/app.db"
}
},
"file-manager": {
"command": "python",
"args": ["mcp-servers/file-manager.py"],
"transport": "stdio"
},
"local-llm": {
"command": "ollama",
"args": ["run", "llama3"],
"transport": "stdio"
}
}
}
}
遠端 MCP 伺服器透過 HTTPS 或 WebSocket 連接,讓 OpenCode 能夠與雲端服務互動。這對於整合第三方 API(如 GitHub、Slack、Jira)特別有用。
{
"mcp": {
"servers": {
"github-mcp": {
"url": "https://mcp.example.com/github",
"transport": "sse",
"headers": {
"Authorization": "Bearer ${GITHUB_TOKEN}"
}
},
"sentry-mcp": {
"url": "https://mcp.sentry.io/v1",
"transport": "https"
}
}
}
}
| 特性 | 本地 MCP | 遠端 MCP |
|---|---|---|
| 通訊方式 | stdio 或本機 TCP | HTTPS / SSE / WebSocket |
| 延遲 | 低(毫秒級) | 中~高(取決於網路) |
| 認證需求 | 通常不需要 | 需要 API Key 或 OAuth |
| 適用場景 | 本機工具、資料庫、腳本 | 第三方 API、雲端服務 |
| 可用性 | 依賴本機執行環境 | 只要伺服器在線即可 |
| 安全性 | 本機隔離 | 需額外的傳輸加密 |
對於需要使用者授權的遠端 MCP 伺服器,OpenCode 提供了完整的 OAuth 2.0 支援:
當代理首次嘗試使用需要 OAuth 的 MCP 伺服器時,OpenCode 會自動啟動 OAuth 授權流程:
開發者也可以預先在設定檔中註冊 OAuth 憑證:
{
"mcp": {
"oauth": {
"github-mcp": {
"client_id": "your-client-id",
"client_secret": "your-client-secret",
"scopes": ["repo", "issues"],
"redirect_uri": "http://localhost:3456/callback"
}
},
"servers": {
"github-mcp": {
"url": "https://mcp.github.com/v1",
"auth": "oauth"
}
}
}
}
client_secret 不建議直接寫入 opencode.json。建議使用環境變數(如 ${GITHUB_CLIENT_SECRET})或系統的金鑰管理服務儲存敏感資訊。
以下是一些經過驗證的熱門 MCP 伺服器設定,可以直接複製使用:
{
"mcp": {
"servers": {
"sentry": {
"description": "查詢 Sentry 錯誤與效能資料",
"url": "https://mcp.sentry.io/v1",
"transport": "https",
"headers": {
"Authorization": "Bearer ${SENTRY_API_KEY}"
}
},
"context7": {
"description": "500+ 框架的官方文件檢索",
"url": "https://mcp.context7.com/v1",
"transport": "https",
"headers": {
"X-API-Key": "${CONTEXT7_API_KEY}"
}
},
"grep-app": {
"description": "GitHub 開源程式碼搜尋",
"url": "https://mcp.grep.app/v1",
"transport": "https",
"auth": "oauth"
}
}
}
}
OpenCode 允許針對不同代理設定不同的 MCP 伺服器。這在多代理協作場景中非常重要——每個代理只需要載入與其任務相關的 MCP:
{
"agents": {
"Sisyphus": {
"mcps": ["context7", "grep-app"]
},
"dev-agent": {
"mcps": ["sentry", "github-mcp"]
},
"explore": {
"mcps": ["context7"]
}
}
}
ACP(Agent Communication Protocol)是 OpenCode 特有的通訊協定,專門用於代理之間的直接溝通。與 MCP(工具與代理之間的通訊)不同,ACP 讓代理可以相互交換訊息、共享上下文、協調任務。
代理之間可以發送結構化訊息,包含查詢、回覆、狀態更新與錯誤報告。
代理可以選擇性地將部分上下文傳遞給其他代理,避免重複工作與資訊孤島。
當一個代理的輸出是另一個代理的輸入時,ACP 自動處理依賴關係與觸發順序。
代理可以透過 ACP 請求其他代理審查其工作成果,實現內建品質控制。
代理遇到無法處理的狀況時,可透過 ACP 向協調代理或使用者發出警報。
代理定期廣播執行狀態,讓整體工作流程可視化。
| 面向 | MCP | ACP |
|---|---|---|
| 通訊對象 | 代理 ↔ 工具/服務 | 代理 ↔ 代理 |
| 協定類型 | 請求-回應(RPC) | 訊息佇列(Pub/Sub + 直接傳遞) |
| 資料格式 | JSON-RPC | 結構化代理訊息 |
| 狀態管理 | 無狀態(每次請求獨立) | 有狀態(保留對話歷史) |
| 主要用途 | 擴充代理能力 | 協調代理協作 |
本地 MCP 伺服器與自訂工具在功能上有重疊,但存在幾個關鍵差異:(1) MCP 伺服器是獨立程序,可以有自己的生命週期管理;自訂工具通常是在 OpenCode 進程內執行的簡單處理器。(2) MCP 伺服器遵循標準化協定,可以跨專案、跨平台重用;自訂工具的設定與實作較為緊湊。(3) MCP 伺服器支援遠端部署與 OAuth 認證,自訂工具僅限本機使用。若需要簡單的腳本整合,自訂工具就足夠了;若要建立可分享的工具服務,MCP 是更好的選擇。
MCP 伺服器消耗的上下文空間主要來自兩個部分:(1) 初始化階段——伺服器會向 OpenCode 註冊其提供的工具列表與參數 schema,這通常佔用 1~5 KB 不等。(2) 每次工具呼叫——請求參數與回應內容都會進入上下文,回應越大消耗越多。一個設計良好的 MCP 伺服器應該將其工具數量控制在 10 個以下,並避免在單次回應中回傳過多資料。如果發現上下文空間不足,可以考慮暫時停用不常用的 MCP 伺服器。
遠端 MCP 伺服器應始終使用 HTTPS 連線以確保傳輸加密。對於需要授權的伺服器,建議使用 OAuth 2.0 或 API Key 進行身分驗證。若 MCP 伺服器處理敏感資料,可以考慮建立專用的 API Gateway 進行流量過濾與速率限制。在 opencode.json 中儲存憑證時,建議使用環境變數(${VAR_NAME})而非明文寫入。最後,定期審視已授權的 MCP 伺服器清單,移除不再使用的項目。