MINARA

接入 MCP 服務器

通過 `mcp/servers.json` 把外部 MCP 服務器接進 Agent

Agent 在啟動時會連接 Model Context Protocol 服務器。它們的工具進入與內置工具相同的 ToolRegistry,並默認帶有 defer_loading: true(schema 只在模型調用 tool_search 時才被取回)。

兩個文件位置

服務器配置會從兩個地方讀取併合並:

  • 用戶全局<dataDir>/mcp/servers.json,默認 ~/.minara/mcp/servers.json。可通過 MINARA_DATA_DIR 覆蓋目錄。 放個人憑據和你希望在每個倉庫都能用的服務器。當 mcp/servers.json 不存在時,舊路徑 <dataDir>/mcp.json 仍會被讀取,已有配置照常工作。
  • 項目本地<repo>/.minara/mcp/servers.json。從 cwd 向上查找 最近的 .minara/ 目錄(與 .git/ 同級)即可定位。用來為單個倉庫 釘死開發 URL 或租戶專用 token。舊路徑 <repo>/.minara/mcp.json 是 同樣的回退。

id 衝突時項目級條目勝出,所以倉庫可以覆蓋全局已有服務器的 authTokenEnvurl

兩個文件共用同一種結構:

{
  "mcpServers": {
    "slack": {
      "url": "https://mcp.example.com/slack/",
      "authTokenEnv": "SLACK_MCP_TOKEN",
      "headers": { "X-Tenant": "acme" }
    },
    "etherscan": {
      "url": "https://mcp.example.com/etherscan/",
      "timeoutMs": 60000,
      "subagent": {
        "systemPrompt": "你专门回答 EVM 区块浏览器查询。",
        "maxSteps": 10
      }
    }
  }
}

JSON 的鍵即為服務器 id(用作 mcp_<id>_* 工具名前綴)。如果需要同一 服務器以不同別名註冊多次,可在條目中顯式寫 "id" 字段覆蓋鍵。

字段

字段必填說明
urlStreamable-HTTP 的 MCP 端點。不支持僅 SSE 的端點。
authTokenEnv持有 bearer token 的環境變量名。連接時從環境解析,作為 Authorization: Bearer <token> 發送。優先於 authToken,secret 不落盤。
authTokenbearer token 字面值。存在時會被讀取,但寫這個文件的工具(minara mcp add、chat 內安裝路徑)會拒絕 inline token 並要求 authTokenEnv。可信主機上手寫的文件仍可用它。
headers額外 HTTP 頭,合併到每次請求裡。secret 類頭值(AuthorizationX-Api-Key)必須引用環境變量,例如 "Authorization": "Bearer ${SLACK_MCP_TOKEN}"
timeoutMs單次調用超時。默認 30000。
label日誌中顯示的名字,默認為 id。
maxTools單服務器註冊工具數硬上限,默認 64。
include遠程工具名白名單,未列出的全部丟棄。
subagent設置後,該服務器的工具被包成單個 mcp_<id>_query,由內部 agent 循環驅動。對工具眾多的服務器,用持久人格 + 步數預算保持主循環簡潔。

非法條目(缺 url、類型錯)會被記錄後跳過::單條壞數據不會阻斷其餘服務器接入。

優先級

  1. MCP_SERVERS 環境變量 :: 服務器配置 JSON 數組,會短路兩個文件 位置。測試和容器部署用,通常由 secrets manager 直接注入。
  2. 合併後的服務器配置 :: 全局 <dataDir>/mcp/servers.json 與項目 本地 <repo>/.minara/mcp/servers.json 合併(各自回退到同級舊路徑 mcp.json)。id 衝突時項目級覆蓋全局;id 不同的條目取並集。
  3. v1 單服務器 URL 環境變量 :: MCP_EVM_RPC_URLMCP_ETHERSCAN_URLMCP_SOLSCAN_URLMCP_GOPLUS_URL,各自獨立開關,僅在前兩層都 為空時才生效。

就算磁盤上有配置文件,MCP_SERVERS=… 也總會短路文件,保留可復現性。

安全

secret 不要寫進配置文件。用 authTokenEnv(環境變量名)表達鑑權, token 在連接時從環境解析。寫這個文件的工具(minara mcp add 和 chat 內安裝路徑)會強制這一點。它拒絕 inline authToken,也拒絕持有字面值 的 secret 頭,token 不會經由 Agent 落盤。

可信主機上手寫的文件仍可攜帶字面值 authToken,loader 會讀取它。共享 主機上請優先用 authTokenEnv。如果你必須存字面值 token:

  • chmod 600 ~/.minara/mcp/servers.jsonchmod 600 <repo>/.minara/mcp/servers.json
  • 或者通過 MCP_SERVERS 從 secrets manager(Vault、AWS Secrets Manager、doppler 等)注入,讓配置文件留空。
  • 項目本地文件如不希望與倉庫協作者共享 token,記得把 .minara/ 加進 .gitignore

可觀測性

啟動日誌的 module: "app"action: mcp_initialized 行會列出已連接的 服務器和工具數。單服務器失敗以 mcp_server_connect_failed 上報。

REPL 中 pnpm dev -- status(或對應 HTTP gateway 端點)會彙報實時 MCP 狀態數組。

本頁目錄