Hub Google AI CLI 教學

第 3 篇 進階 · 第 9 章

MCP 入門

MCP 讓 Gemini CLI 接上外部工具、資料來源與可重用 prompt。先學會最小設定、檢查方式與安全邊界,再把它放進真實工作流。

先確認你目前能不能用 Gemini CLI

Google 在 2026-05-19 公告 Antigravity CLI 過渡,並說明 2026-06-18 後免費與 Google AI Pro/Ultra 等個人路線的 Gemini CLI 請求會停止服務;企業、Google Cloud 與 paid API key 路線依公告仍有不同安排。實作前請以當下官方文件和帳號狀態為準。

9.1 MCP 是什麼?

MCP 是 Model Context Protocol。對 Gemini CLI 來說,MCP server 是一個外接服務:它可以提供工具、資源與 prompts,讓模型在你的同意與設定範圍內查資料、呼叫 API、讀外部系統或執行特定流程。

類型用途例子
Tools讓模型呼叫一個動作查 issue、讀資料庫、搜尋內部文件
Resources提供可引用的資料@server://resource/path
Prompts把常用任務變成 slash command/review-release

9.2 mcpServers 設定範例

MCP 通常寫在 ~/.gemini/settings.json 或專案內的 .gemini/settings.json。先從專案設定開始,範圍比較清楚;secret 用環境變數,不要硬寫進 JSON。

{
  "mcpServers": {
    "project-docs": {
      "command": "node",
      "args": ["./mcp/project-docs/dist/server.js"],
      "cwd": ".",
      "env": {
        "DOCS_TOKEN": "$DOCS_TOKEN"
      },
      "timeout": 30000,
      "trust": false,
      "includeTools": ["search_docs", "read_doc"],
      "excludeTools": ["delete_doc", "write_doc"]
    }
  }
}

每個 server 一定要選一種連線方式,而且三選一、不能混用:本機執行檔用 command(走 stdio,行程之間用標準輸入輸出傳資料);遠端 SSE 服務用 url;遠端 streamable HTTP 服務用 httpUrl。這三個欄位對應完全不同的連線邏輯,設定裡同時寫兩個也不會「兩個都試著連」,CLI 是照你填的欄位去判斷該用哪種協定。本機 server 會吃你的本機權限,所以先用最小工具集、短 timeouttrust: false

key 選錯,介面通常不會直接告訴你「你選錯了」

把 streamable HTTP 的 server 誤設成 url(當 SSE 處理),最常見的表現是連線後收到 405 Method Not Allowed;反過來把只支援 SSE 的 server 誤設成 httpUrl,通常是安安靜靜連不上,畫面上不會明確提示「協定選錯了」。撞到連線異常,第一步永遠是回去該 MCP server 自己的文件,確認它到底是 stdio、SSE 還是 streamable HTTP 三者之一,再對照設定檔裡的欄位有沒有選對。

欄位完整對照

上面的範例只用到 commandargscwdenvtimeouttrustincludeToolsexcludeTools 這幾個欄位,但每個 server 實際上還能設定更多可選欄位。平常用不到可以先跳過,但知道有這些選項存在,之後遇到企業內部 SSO、IAP 保護的服務這類進階場景,才不用整個重查一次文件。

欄位預設值說明
command / args / cwdstdio 專用:執行檔路徑、參數陣列、工作目錄
urlSSE 專用:服務端點
httpUrlstreamable HTTP 專用:服務端點
headersurlhttpUrl 用的自訂 HTTP header,常用來帶固定 token
env傳給該 server 行程的環境變數,支援展開語法(見下)
timeout600000(10 分鐘)單位毫秒,逾時視為該次呼叫失敗
trustfalsetrue 會跳過該 server「所有」工具呼叫的確認對話框
includeTools無(等同全部開放)白名單,只放行列出的工具
excludeTools黑名單,與 includeTools 同時列到同一工具時以此為準
targetAudience / targetServiceAccount搭配 authProviderType: service_account_impersonation,用於 IAP 保護的服務
authProviderTypedynamic_discovery另兩種是 google_credentialsservice_account_impersonation

env 環境變數:展開語法與自動遮蔽

env 區塊不是把值原封不動塞給 server,它支援簡單的展開語法:$VAR_NAME${VAR_NAME} 這兩種寫法跨平台都能用,Windows 專屬還多一種 %VAR_NAME%。CLI 啟動 server 前,會把這些寫法換成你目前終端機裡對應的環境變數值。

這裡有個容易漏掉的陷阱:如果你寫的變數名稱其實沒有被設定過,CLI 不會報錯,只會把它悄悄展開成空字串。你可能會看到 server「連線成功」,但工具一呼叫就卡在認證失敗,回頭才發現那個 token 從頭到尾都是空的——因為忘了在 shell 裡 export,或是名稱打錯字。改完 env 後,先確認變數名稱拼寫正確,再重新啟動 CLI 並用 /mcp list 或一個唯讀、無機密資料的工具呼叫驗證。不要用 echo 印出 token、key 或 password 的實際值;這些值可能被截圖、終端機紀錄或旁人看到。

CLI 會自動遮蔽敏感變數——但只保護「沒明寫」的那些

Gemini CLI 生出 MCP 子行程時,預設不會把你目前終端機的完整環境變數原封不動傳過去,會先過濾一輪:名稱長得像 TOKENSECRETPASSWORDKEYAUTHCREDENTIAL 這類樣式的變數,連同看起來像憑證或私鑰的內容,都會從基底環境裡先被拿掉,避免不小心把敏感資訊洩漏給一個你還沒完全信任的第三方 server。但這道保護只管「沒有明寫在該 server 自己 env 區塊裡」的變數——只要像前面範例一樣明確寫下 "DOCS_TOKEN": "$DOCS_TOKEN",就代表你已經主動決定要把它交給這個 server,CLI 會視為已信任,不會再擋。

想知道原理:為什麼「明寫」就能跳過遮蔽?

官方文件沒有攤開遮蔽機制實際怎麼實作,但從行為可以看出設計邏輯:遮蔽要防的是「沒人交代、卻可能被隱式帶進子行程」的敏感變數——例如你的 shell 裡本來就有一個雲端服務的金鑰變數,如果什麼都不設定就整包丟給 MCP server,等於沒經過你同意就外流。但當你在某個 server 自己的 env 區塊寫下一行明確的鍵值,這本身就是一個針對「這個 server」的授權動作——風險判斷已經是你自己做過的,過濾機制自然不需要再幫你多想一層。實務上要記住的提醒是:不要以為「只要環境變數存在、名字裡有 TOKEN」它就會自動被帶進某個 server,沒有在該 server 的 env 裡明寫,遮蔽名單很可能先一步把它濾掉,工具呼叫時才發現憑證是空的。

幾種進階寫法,照抄改一改就能用

多數時候只需要最簡單的 stdio 設定,但下面幾種場景遲早會遇到,先看過範例,需要時直接改參數。

用 Docker 包裝的 server:不少官方 MCP server(例如 GitHub 官方提供的版本)建議直接跑現成的 Docker image,不用自己裝執行環境。

{
  "mcpServers": {
    "github": {
      "command": "docker",
      "args": [
        "run", "-i", "--rm",
        "-e", "GITHUB_PERSONAL_ACCESS_TOKEN",
        "ghcr.io/github/github-mcp-server:latest"
      ],
      "env": {
        "GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_PERSONAL_ACCESS_TOKEN}"
      }
    }
  }
}

設定前記得先在終端機把 token 匯出成環境變數(export GITHUB_PERSONAL_ACCESS_TOKEN="github_pat_..."),設完重開 CLI,跑一次 /mcp list,正常會看到類似「✓ github: docker ... - Connected」的狀態。

遠端 HTTP server 帶固定 token:不要把真實 token 直接寫進 settings.json、範例檔或會提交的專案檔。無論是 GitHub token 或遠端服務 token,都先在服務端建立僅限這次用途的最小權限憑證,再透過環境變數傳入該 MCP server。若服務只提供固定 token,也把它留在本機受保護的環境設定;設定檔只引用變數名稱,不放 token 本文。

{
  "mcpServers": {
    "httpServerWithAuth": {
      "httpUrl": "http://localhost:3000/mcp",
      "headers": {
        "Authorization": "Bearer ${MY_SERVICE_TOKEN}",
        "X-Custom-Header": "custom-value"
      },
      "timeout": 5000
    }
  }
          }

MY_SERVICE_TOKEN 是你本機已設定的環境變數名稱,不是可原樣複製的文字。這個 token 只交給你已審查、確定可信的 server;不用時就撤銷或移除。

IAP 保護的內部服務:要連的是被 Identity-Aware Proxy 擋住的 Cloud Run/GCP 服務時,不用手動跑一次 OAuth 瀏覽器授權,直接設定服務帳戶冒用即可。

{
  "mcpServers": {
    "myIapProtectedServer": {
      "url": "https://my-iap-service.run.app/sse",
      "authProviderType": "service_account_impersonation",
      "targetAudience": "YOUR_IAP_CLIENT_ID.apps.googleusercontent.com",
      "targetServiceAccount": "your-sa@your-project.iam.gserviceaccount.com"
    }
  }
}

targetAudience 放 IAP 的 OAuth client ID,targetServiceAccount 放要冒用的服務帳戶 email。這正是 Google 自家幾個 Cloud/Workspace 相關 MCP extension 在用的模式,企業內部要接類似架構的服務時,可以直接照抄改參數。

Windows 上 command 直接寫 npx,可能連不上

社群 npm 在 Windows 上把 npx 安裝成 npx.cmd 這個殼層批次檔,不是單純的可執行檔;MCP client 產生子行程時預設不會額外開一層殼層去解讀它。結果是 "command": "npx" 在 macOS/Linux 通常直接可用,換到 Windows 卻可能連不上、甚至沒有明確錯誤訊息。修法是改用 cmd 包一層:

{
  "mcpServers": {
    "sequential-thinking": {
      "command": "cmd",
      "args": ["/c", "npx", "-y", "@modelcontextprotocol/server-sequential-thinking"]
    }
  }
}
想知道原理:為什麼非要 cmd /c 包一層?

Node.js 產生子行程的方式,預設是直接呼叫作業系統的行程建立機制,不會像你在終端機打指令那樣,先啟動一層殼層去解讀、找到對應的可執行檔。在 macOS/Linux,npx 本身就是一個能被直接執行的檔案,直接呼叫沒問題。但 Windows 上的 npx 是一個 .cmd 批次檔,需要 cmd.exe 這層殼層來解讀執行;沒有額外指定要透過殼層執行,就找不到「合法的」執行方式。command 改成 cmdargs 前面加上 /c npx,等於明講「請 cmd.exe 幫我執行 npx 這個指令」,繞過直接找 .cmd 執行檔失敗的問題。

全域設定 vs 專案設定

MCP server 可以寫在兩個地方:家目錄底下的 ~/.gemini/settings.json(全域,這台電腦所有專案都看得到),或專案資料夾內的 .gemini/settings.json(只對這個專案生效)。兩邊都有 mcpServers 這個 key 時,專案層的設定優先權比較高。

這裡有一個容易想錯的地方:專案層設定生效的方式是「整個 mcpServers 這個 key 被取代」,不是逐欄位跟全域設定深層合併。如果全域設定裡有五個 server,專案設定裡只寫了一個,結果不會是「六個都在」,也不是「五個裡面被覆蓋一個」——而是專案這邊寫的那一個生效,其餘四個在這個專案底下等於沒設定過。跨專案有共用金鑰或工具集差異時,別假設專案沒寫到的欄位還會沿用全域預設值,需要的 server 就得在專案層重新完整寫一次。

如果你要接的服務已經有人包成現成的 extension(例如 GitHub、Google Cloud 一類常見工具),與其照抄一長串 mcpServers JSON,先查有沒有現成套件可以直接裝——這條路徑與它的完整介紹留到下一章 Extensions。

9.3 用 /mcp 檢查狀態

設定後重新啟動 Gemini CLI,先檢查 server 是否真的連上、有哪些工具暴露給模型。

/mcp
/mcp list
/mcp desc
/mcp schema
/mcp auth project-docs
/mcp enable project-docs
/mcp disable project-docs
/mcp reload

/mcp/mcp list 是預設行為,列出目前設定的 server、連線狀態與各自暴露的工具;desc 額外附工具描述;schema 附完整 JSON schema,看每個工具吃什麼參數最準;auth 對需要 OAuth 的 server 啟動授權流程;enabledisable 可以暫時關掉某個 server 而不用動設定檔——9.6 排查「一台拖累全部」的情境會直接用到這一組;reload 重新探索所有 server 目前有哪些工具,改了 server 端的工具定義後很常用到。這是目前官方文件列出的子指令;Gemini CLI 版本迭代快,加上產品正處於向 Antigravity CLI 過渡期,實際跑出來的清單若有出入,以當下 gemini --help/mcp 現場輸出與官方文件為準。

MCP 出問題,介面預設只提示一行字

Gemini CLI 對 MCP 連線異常預設走低調路線,正常情況下你可能只會看到一行「MCP issues detected. Run /mcp list for status.」,不會主動把詳細錯誤攤開給你看。開機時沒跳出這行提示,不代表所有 server 都連好了——想看細節,要嘛加 --debug 重新啟動,要嘛直接觸發一次該 server 的工具或 prompt 呼叫,錯誤才會浮出來。

殼層底下的 gemini mcp 指令

前面那組 /mcp 指令,都是進到 Gemini CLI 互動模式之後才打得到的。還有另一組指令活在互動模式之外——直接在終端機的殼層底下打 gemini mcp,用來管理設定檔,不需要先啟動 CLI 再操作。

gemini mcp add --scope project --transport stdio \
  --env API_KEY=$API_KEY --trust myServer "node" "./server.js"
gemini mcp list
gemini mcp remove myServer -s user

add 常用的選項:-s--scope 指定寫進 user(全域)還是 project(專案),預設 project-t--transport 指定 stdiossehttp,預設 stdio-e--env-H--header 對應設定檔裡的 envheaders;還有 --timeout--trust--description--include-tools--exclude-tools。這組指令的價值在於可以寫進團隊的 onboarding script,讓新成員不用手動編輯 JSON、跑一行指令就把該裝的 MCP server 裝好,比貼一整段設定檔給對方複製貼上可靠。

動 Gemini CLI 之前,先用 MCP Inspector 單獨測 server

官方另外提供一個獨立的除錯工具 MCP Inspector,可以完全不透過 Gemini CLI,直接對一個 MCP server 送測試請求。stdio server 用 npx @modelcontextprotocol/inspector node /path/to/server.js,HTTP server 用 npx @modelcontextprotocol/inspector --url https://.../mcp。碰到連線異常,先用 Inspector 確認「是 server 本身有問題」還是「CLI 端設定有問題」,比在 Gemini CLI 裡反覆修改設定、重開、再試快很多——尤其是自己在開發中的 server。

9.4 include/exclude 的安全用法

includeTools 是 allowlist:只開你列出的工具。excludeTools 是 veto:即使工具同時在 include 裡,也會被排除。新 server 先用 include,確認每個工具的輸入、輸出與副作用後再放寬。

{
  "mcpServers": {
    "filteredServer": {
      "command": "python",
      "args": ["-m", "my_mcp_server"],
      "includeTools": ["safe_tool", "file_reader"],
      "excludeTools": ["dangerous_tool"]
    }
  }
}

這個例子裡,即使 my_mcp_server 本身還提供其他工具,模型也只看得到 safe_toolfile_reader;如果哪天 dangerous_tool 不小心也被加進 includeToolsexcludeTools 仍然會把它擋下來——兩份清單同時列到同一個工具名稱,永遠是 exclude 贏。

trust: true 是官方文件用重話警告的選項

官方文件的原文是「only for servers you completely control」,值得照字面看待。trust: true 不是「這個工具先跳過確認」,是整台 server 一次性豁免:現在有的工具、以後這個 server 新增的任何工具,都會直接執行、不再跳確認對話框。方便是真方便,代價是你之後很容易忘記自己開過這道後門,等 server 端悄悄多了一個有副作用的新工具,一樣暢行無阻。只在你自己寫、自己維護、範圍很窄的 server 上開,第三方 server 不建議設 true

  • 不要把 excludeTools 當成唯一安全機制;它降低誤用機率,不是 sandbox,工具本身該有的權限邊界還是要 server 端自己把關。
  • 給 token 時用最小 scope,並只在該 server 自己的 env 裡明確傳給需要的 server——上一節提過,沒明寫的敏感變數會被自動遮蔽擋掉,這其實也是一種天然的最小授權提醒。

工具命名衝突與消歧

多個 server 剛好提供同名工具時,Gemini CLI 會自動加前綴消歧,型式大致是 serverName__toolName 這樣;名稱裡的非英數字元會被換成底線,太長的名稱會截斷、中間補上 ...。官方文件也提醒,取 MCP server 名稱時最好避開底線,免得跟 CLI 自動加的前綴混在一起,分不清哪段是 server 名、哪段是工具名。

比較麻煩的是,就算有消歧前綴,模型仍可能因為兩個同名工具的描述不夠清楚而選錯 server,而且過程不會有明顯報錯。發現「Gemini 好像呼叫錯 server 的工具」時,先去 /mcp schema 對照兩邊工具的實際描述與參數,通常比懷疑模型「理解錯」更快找到答案。

團隊層級的白名單/黑名單

如果你在管一個團隊或企業環境,需要的是「不管使用者自己在本機加了什麼 server,都只有核准過的能生效」——個別 server 的 trust 欄位管不到這件事,那是每個 server 自己的授權開關,不是全域門禁。真正的門禁在 settings.json 最外層的 mcp 物件:mcp.allowed 是白名單陣列,設定後只有列在裡面的 server 會被連線;mcp.excluded 是黑名單;mcp.serverCommand 可以設定全域統一的啟動指令。這一層跟每個 server 自己的 trust 是分開的機制,能防止有人自己在本機加一個「自認安全」的新 server 就直接生效。

新接一個不熟的 server,怎麼安全地一步步放寬

先用 includeTools 只放你已經透過 /mcp schema 看過參數、確認是唯讀的工具,trust 保持 false;每次要多開放一個工具,先看過它的 schema 跟可能的副作用,再決定要不要放進 includeTools。不要因為圖方便就整台 server 一次全開,尤其是不是自己寫的第三方 server。

9.5 Resources 與 prompts

有些 MCP server 會提供 resources。Gemini CLI 會在探索時列出它們,你可以像引用檔案一樣用 @server://resource/path 把內容放進對話。這適合只讀文件、報表、API payload 或查詢結果。

@project-docs://guides/release-checklist
請根據這份 release checklist,幫我檢查目前 PR 還缺哪些步驟。

MCP prompts 則會變成可呼叫的 slash command。它適合包裝固定流程,例如 release review、客服摘要或資料品質檢查。prompt 由 server 回傳內容,CLI 再送給模型執行。

/release-review --version="2.4.0" --base="main"

如果你自己動手寫 MCP server,還有一個對使用體驗很有幫助、卻不是每個人都知道的細節:工具的回傳結果不是只能塞純文字。官方的 CallToolResult 格式允許同一次回應裡混合文字、圖片(Base64 加 mimeType)、音檔、resource 或 resource link,Gemini CLI 收到後會自動拆開處理——文字合併進模型看到的內容,二進位資料包成對應格式——不需要在使用端額外設定,也不需要 server 端自己把圖片硬轉成文字塞進去。工具想回傳一張截圖或一段錄音,直接回傳對應的 content 類型即可。

9.6 疑難排解

多數 MCP 疑難雜症都跟連線設定或執行環境有關,很少是模型本身的問題。養成先看 /mcp list、確認基本設定正確,再往下深挖的習慣,能省下大半排查時間。下面先列常見狀況的速查表,兩個比較棘手、需要多幾個步驟才能定位的情境,表格後面另外展開說明。

狀況先查什麼
server 顯示 disconnected確認 commandargscwd,並在終端機直接跑一次 server 本身,看它能不能正常啟動。
transport 選錯 key,連不上或報 405streamable HTTP server 設定成 url 常見報 405 Method Not Allowed;SSE server 設定成 httpUrl 常常靜默連不上。回去該 server 自己的文件確認它是哪一種 transport。
連上但沒有 tools確認 server 有實作 tool listing,並檢查 includeTools 是否寫錯名稱(大小寫、底線都要對)。
tool 執行失敗/mcp schema、server stderr、timeout 與參數格式是否符合 schema。
stdio server 回一大包資料就整個卡住單次回應資料量較大時可能塞滿管線緩衝區,常見於一次讀大量檔案或大筆查詢結果。設明確 timeout、server 端做分頁,或改走 HTTP transport。
改完 settings.json,介面顯示「沒有設定任何 MCP server」通常不是漏寫 mcpServers,是 JSON 語法錯誤(常見是多一個逗號);CLI 不會明確報 parse error。先用 python3 -m json.tool settings.json 驗證語法再重開。
敏感 env 變數在子行程裡讀不到沒有明寫在該 server 自己的 env 區塊裡、只是指望隱式繼承,會被 9.2 提過的自動遮蔽機制擋掉。
OAuth 不成功確認本機可開瀏覽器與接收 localhost callback;純 headless 環境改用 headers 帶固定 Bearer token 取代互動授權。
sandbox 下失敗確認 server 執行檔、工作目錄、網路與必要環境變數在 sandbox 裡可用。

一台掛掉、拖累全部連鎖失敗

設定裡同時掛好幾個 server 時,有一種狀況特別容易誤判:只要其中一台在啟動握手階段失敗,可能會拖累甚至中斷其他原本正常的 server 探索流程,畫面上看到的是一長串像整體崩潰的錯誤,例如 MCP error -32000: Connection closedTypeError: fetch failed。第一直覺常常是「是不是整包設定都壞了」,但多數時候只是其中一台拖累全局。

排除法是二分法,不是重裝全部:用 /mcp disable 一次關掉一半可疑的 server,重開確認錯誤消失沒有,再逐步縮小範圍,找到真正出問題的那一台,其餘的維持原設定即可。這也是 9.3 提過 /mcp enabledisable 的實際用途——不用刪設定檔就能暫時隔離一台 server。

明明終端機打得動,MCP 子行程卻說找不到指令

另一種常見的困惑是:你在終端機直接打某個指令完全正常,寫進 command 欄位讓 MCP 子行程去跑,卻回報找不到執行檔。常見原因是 CLI 產生 MCP 子行程時,不是完整繼承你目前互動終端機的那份環境,而是用相對精簡過的一份——透過 nvm、Homebrew、asdf 這類版本管理工具安裝、只在你互動 shell 的 PATH 裡才找得到的執行檔,換到子行程的精簡環境裡就找不到了。

修法很直接:command 欄位不要只寫指令名稱,改成絕對路徑(跑一次 which nodewhich npx 查出實際路徑貼上去),或是在該 server 自己的 env 裡明確帶入完整的 PATH

另一個相關但成因不同的狀況:command 設成 npx,如果是第一次執行、套件還沒下載過,npx 會卡在下載安裝的過程,而這個過程可能超出 CLI 探索工具列表(tools/list)的逾時窗口,表現得像連線整個 hang 住。如果確認這個 MCP server 的官方文件支援全域安裝,而且你本來就使用 Node/npm,再考慮依官方指示安裝後把 command 指向該執行檔。不要只為了排除逾時就猜著執行 npm install -g,也不要混用 npx、全域 npm 與其他安裝方式。不確定時,先保留 npx、提高該 server 的啟動逾時,並依 server 官方文件排查。

排查的順序建議先用 /mcp list 或 shell 裡的 gemini mcp list 看整體狀態,訊息不夠再用 --debug 重開、或直接在終端機跑一次 server 本身取得最原始的錯誤輸出;9.3 提過的 MCP Inspector 也很適合在這一步拿來單獨排除「是 server 的問題還是 CLI 設定的問題」。

先排除帳號路線問題,再深究設定細節

2026-06-18 之後,免費、Google AI Pro/Ultra 等個人路線的 Gemini CLI 請求已經整體停止服務,這個狀況表現出來的症狀,跟單純的 MCP 連線失敗幾乎一模一樣。如果上面的檢查都做過、設定看起來完全正確卻還是連不上,先回第 0 章的帳號類別判斷表確認資格,再回頭深究 MCP 設定細節,能省下不少誤判時間。

本章小結

MCP 是 Gemini CLI 擴充能力的入口,運作分成三層:先在 settings.json 選對連線方式(stdio/SSE/streamable HTTP 三選一)、把 timeouttrustincludeToolsexcludeTools 這些安全欄位設好;再用 /mcp(互動模式內)或 gemini mcp(殼層底下)確認連線與工具清單;最後才是善用 resources 與 prompts,把常見查詢與固定流程變成可重複的工作習慣。安全上的底線很單純:新 server 先窄後寬,trust: true 只留給自己完全控制的 server,token 一律走環境變數、只在需要的 server 明確傳入。連線出狀況時,記得 MCP 的異常預設是安靜的——沒跳錯誤不代表沒事,先用 /mcp list 或 MCP Inspector 動手確認,比憑感覺猜快得多。

動手試試

  1. 打開目前專案的 .gemini/settings.json,草擬一個只讀 MCP server 設定,不放真 token。
  2. 啟動 Gemini CLI 後跑 /mcp list/mcp desc,確認工具名稱和描述是否清楚。
  3. 把範例中的 includeTools 改成只允許一個讀取工具,觀察 /mcp schema 的變化。
  4. 若 server 有 resources,試著用 @server://... 引用一筆只讀資料並要求 Gemini 摘要。
  5. 故意把一個 streamable HTTP server 的 httpUrl 打錯寫成 url,重開 CLI 觀察實際跳出的錯誤訊息,親眼看一次「選錯 transport key」的症狀長怎樣。
  6. 跑一次 npx @modelcontextprotocol/inspector 搭配手邊的 server,在完全不開 Gemini CLI 的情況下,確認 server 本身能不能正常回應工具列表。