11.1 什麼是 MCP?

MCP(Model Context Protocol)是一種開放式通訊協定,允許 OpenCode 與外部工具服務進行標準化互動。你可以將 MCP 想像成 AI 代理的「USB 埠」——它定義了一套統一的介面,讓任何符合規範的工具都能即插即用。

當代理需要執行超出其內建能力的任務時(如查詢資料庫、建立 GitHub Issue、傳送 Slack 訊息),MCP 伺服器就扮演了橋樑角色。代理透過 MCP 協定發送請求,伺服器執行對應操作並回傳結果。

📘 MCP 的設計哲學: 不要讓 OpenCode 試圖內建所有功能。相反地,提供一個開放的擴充標準,讓社群與開發者自由貢獻。這使得 OpenCode 的核心保持輕量,同時擁有無限的擴充可能。

11.2 本地 MCP 伺服器

本地 MCP 伺服器與 OpenCode 執行在同一台機器上,透過標準輸入輸出(stdio)或本機 TCP 連接進行通訊。這是最常見的 MCP 部署方式,適合整合本地資料庫、檔案系統工具或內部腳本。

設定本地 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 伺服器時,建議先以 stdio 模式在本機測試,確認功能正常後再考慮升級為遠端 MCP 伺服器。本機模式沒有網路延遲,除錯也更容易。

11.3 遠端 MCP 伺服器

遠端 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、雲端服務
可用性 依賴本機執行環境 只要伺服器在線即可
安全性 本機隔離 需額外的傳輸加密

11.4 OAuth 認證支援

對於需要使用者授權的遠端 MCP 伺服器,OpenCode 提供了完整的 OAuth 2.0 支援:

自動認證流程

當代理首次嘗試使用需要 OAuth 的 MCP 伺服器時,OpenCode 會自動啟動 OAuth 授權流程:

  1. 代理嘗試呼叫 MCP 工具
  2. 系統偵測到需要 OAuth 授權
  3. 自動打開瀏覽器引導使用者完成授權
  4. 取得 access token 並安全儲存
  5. 後續呼叫自動帶入 token

預先註冊

開發者也可以預先在設定檔中註冊 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"
      }
    }
  }
}
⚠️ 安全提醒: OAuth client_secret 不建議直接寫入 opencode.json。建議使用環境變數(如 ${GITHUB_CLIENT_SECRET})或系統的金鑰管理服務儲存敏感資訊。

11.5 常用 MCP 伺服器範例

以下是一些經過驗證的熱門 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"
      }
    }
  }
}
💡 使用策略: 不需要一次啟用所有 MCP 伺服器。每個啟用的 MCP 伺服器都會佔用代理的上下文空間(Context Window)。建議僅在需要時啟用對應的 MCP,用完後可以暫時停用。

11.6 MCP 管理與安全

OpenCode 允許針對不同代理設定不同的 MCP 伺服器。這在多代理協作場景中非常重要——每個代理只需要載入與其任務相關的 MCP:

{
  "agents": {
    "Sisyphus": {
      "mcps": ["context7", "grep-app"]
    },
    "dev-agent": {
      "mcps": ["sentry", "github-mcp"]
    },
    "explore": {
      "mcps": ["context7"]
    }
  }
}
⚠️ 上下文管理: MCP 伺服器的工具列表與回應內容都會被載入到代理的上下文中。如果同時啟用過多 MCP 伺服器,可能會快速消耗可用上下文空間,導致代理「遺忘」早期的重要資訊。建議同時啟用的 MCP 伺服器不超過 3~4 個。

11.7 ACP:代理通訊協定

ACP(Agent Communication Protocol)是 OpenCode 特有的通訊協定,專門用於代理之間的直接溝通。與 MCP(工具與代理之間的通訊)不同,ACP 讓代理可以相互交換訊息、共享上下文、協調任務。

ACP 的核心功能

💬

代理對話

代理之間可以發送結構化訊息,包含查詢、回覆、狀態更新與錯誤報告。

📤

上下文共享

代理可以選擇性地將部分上下文傳遞給其他代理,避免重複工作與資訊孤島。

🔄

任務協調

當一個代理的輸出是另一個代理的輸入時,ACP 自動處理依賴關係與觸發順序。

🔍

同儕審查

代理可以透過 ACP 請求其他代理審查其工作成果,實現內建品質控制。

🚨

異常通知

代理遇到無法處理的狀況時,可透過 ACP 向協調代理或使用者發出警報。

📊

進度報告

代理定期廣播執行狀態,讓整體工作流程可視化。

ACP vs MCP

面向 MCP ACP
通訊對象 代理 ↔ 工具/服務 代理 ↔ 代理
協定類型 請求-回應(RPC) 訊息佇列(Pub/Sub + 直接傳遞)
資料格式 JSON-RPC 結構化代理訊息
狀態管理 無狀態(每次請求獨立) 有狀態(保留對話歷史)
主要用途 擴充代理能力 協調代理協作
📘 ACP 的未來: ACP 目前是 OpenCode 的內部協定,未來計畫將其標準化為開放規格,讓不同 AI 代理系統之間也能互相通訊——這將實現跨平台、跨供應商的代理協作網路。

📝 本章測驗

1. MCP(Model Context Protocol)的主要作用是?
2. 下列哪一個是 ACP 與 MCP 的主要差異?

❓ 常見問題

本地 MCP 伺服器和自訂工具(Custom Tools)有什麼不同? ▼

本地 MCP 伺服器與自訂工具在功能上有重疊,但存在幾個關鍵差異:(1) MCP 伺服器是獨立程序,可以有自己的生命週期管理;自訂工具通常是在 OpenCode 進程內執行的簡單處理器。(2) MCP 伺服器遵循標準化協定,可以跨專案、跨平台重用;自訂工具的設定與實作較為緊湊。(3) MCP 伺服器支援遠端部署與 OAuth 認證,自訂工具僅限本機使用。若需要簡單的腳本整合,自訂工具就足夠了;若要建立可分享的工具服務,MCP 是更好的選擇。

MCP 伺服器會消耗多少上下文空間? ▼

MCP 伺服器消耗的上下文空間主要來自兩個部分:(1) 初始化階段——伺服器會向 OpenCode 註冊其提供的工具列表與參數 schema,這通常佔用 1~5 KB 不等。(2) 每次工具呼叫——請求參數與回應內容都會進入上下文,回應越大消耗越多。一個設計良好的 MCP 伺服器應該將其工具數量控制在 10 個以下,並避免在單次回應中回傳過多資料。如果發現上下文空間不足,可以考慮暫時停用不常用的 MCP 伺服器。

如何確保遠端 MCP 伺服器的連線安全? ▼

遠端 MCP 伺服器應始終使用 HTTPS 連線以確保傳輸加密。對於需要授權的伺服器,建議使用 OAuth 2.0 或 API Key 進行身分驗證。若 MCP 伺服器處理敏感資料,可以考慮建立專用的 API Gateway 進行流量過濾與速率限制。在 opencode.json 中儲存憑證時,建議使用環境變數(${VAR_NAME})而非明文寫入。最後,定期審視已授權的 MCP 伺服器清單,移除不再使用的項目。