跳轉到主要內容
這個單元解決什麼問題MCP(Model Context Protocol)是把外部工具與資料源接進 agent 的標準協定。你會學到 MCP 解決什麼整合問題、怎麼設定並驗證一個 server、如何依信任等級與權限範圍選擇 server,以及它和 CLI、內建工具相比各自適用的場景。最後建立「什麼時候該走 MCP、什麼時候不該」的明確判準。

學習目標

  • 說明 MCP 是什麼、它解決哪種整合問題,以及為何需要一個跨工具協定。
  • 設定並驗證一個 local MCP server(以 Claude Code 為主範本)。
  • 依信任來源與權限範圍判斷是否引入某個 MCP server。
  • 說明 MCP 與 CLI、內建工具的取捨,並知道何時優先走 CLI(連結 04-10)。
  • 辨識 MCP 的主要攻擊面並採取最小必要的防護措施(連結 03-3)。

1. MCP 是什麼

MCP(Model Context Protocol)是 Anthropic 在 2024 年提出的開放標準,定義「外部工具與資料源如何被 LLM 呼叫」。一個 MCP server 對外暴露 tools(可呼叫函式)、resources(可引用的資料)、prompts(可被執行的命令範本)三類介面;MCP client(如 Claude Code、Cursor、Claude Desktop、Codex 等)連上後把這些介面掛進自己的 context,模型就能像呼叫內建工具一樣呼叫它 [1]。 它解決的具體問題:整合碎片化。如果每個 LLM 工具(Claude Code、Cursor、Codex、Antigravity…)都自己造一份「接 GitHub / 接 Slack / 接 Postgres」的介面,N×M 的開發與維護成本會把整合推向付費牆。MCP 把這個問題壓到 N+M:server 寫一次、跨多個 client 複用;client 內建 MCP 能力、不必為每個服務客製。 關鍵概念:
  • MCP server:提供 toolsresourcesprompts 的行程或服務。可以是本機 stdio 行程(npx server-foo),也可以是遠端 HTTP / WebSocket 服務。
  • MCP client:模型端呼叫者。Claude Code 內建 MCP client,掛入 server 後把它提供的工具加入 mcp__<server>__<tool> 命名空間。
  • Transport:client 與 server 間的傳輸協定。Claude Code 支援 stdio(本機行程)、http(含 streamable-http 別名,為最廣泛支援的雲端傳輸)、sse(deprecated)、ws(WebSocket,給需要主動推送事件的 server)[1]。
MCP 與 Skill / Subagent 的分工MCP 是「接外部系統」的介面。Skill 是「包裝程序」的容器,Subagent 是「隔離 context」的執行者。三者層級不同:MCP 給能力,Skill 給流程,Subagent 給環境。同一個外部系統應該只挑一種接入方式,不是 Skill 包 MCP 又另開 Subagent 跑它。
官方安全提示Anthropic 在 MCP 章節明示「Verify you trust each server before connecting it. Servers that fetch external content can expose you to prompt injection risk」[1]。這不是客套話。MCP server 從外部拉回的字串會直接進入模型 context,是 prompt injection 的高頻入口。

2. 接一個 server:設定、註冊、驗證

Claude Code 提供三條安裝路徑(截至 2026-06,依官方 MCP 章節 [1]):

2.1 透過 claude mcp add CLI(最常用)

# 1. 遠端 HTTP server
claude mcp add --transport http notion https://mcp.notion.com/mcp

# 2. 帶認證 header
claude mcp add --transport http secure-api https://api.example.com/mcp \
  --header "Authorization: Bearer your-token"

# 3. 本機 stdio server
claude mcp add --transport stdio --env AIRTABLE_API_KEY=YOUR_KEY airtable \
  -- npx -y airtable-mcp-server

# 4. 從 JSON 設定
claude mcp add-json weather-api '{"type":"http","url":"https://api.weather.com/mcp","headers":{"Authorization":"Bearer token"}}'
選項順序所有選項(--transport--env--scope--header必須在 server 名稱之前-- 把名稱跟 server 的 command / args 分開 [1]。混用會把 Claude 的 flag 跟 server 的 flag 撞在一起。

2.2 三種 scope

設定存在哪、是否團隊共享,由 --scope 決定 [1]:
Scope載入範圍共享儲存位置
local(預設)當前專案~/.claude.json(在該專案的 path 內)
project當前專案是(進版控)專案根目錄的 .mcp.json
user你的所有專案~/.claude.json
重要的安全設計:project scope 的 server(從 .mcp.json 來)在 Claude Code 啟動時會先標為待核准,需使用者互動式 review 後才啟用 [1]。這是 CVE-2025-59536 之後官方加的防護:.mcp.json 不能在使用者不知情時自動核准陌生 server。
「local scope」與「local settings」是兩件事MCP local scope 存 ~/.claude.json;一般的 local settings 是 .claude/settings.local.json。命名相近但層級不同 [1]。

2.3 手動編輯 .mcp.json

如果走 project scope 或想用環境變數展開:
{
  "mcpServers": {
    "api-server": {
      "type": "http",
      "url": "${API_BASE_URL:-https://api.example.com}/mcp",
      "headers": {
        "Authorization": "Bearer ${API_KEY}"
      },
      "timeout": 600000
    },
    "database-tools": {
      "command": "/path/to/server",
      "args": ["--config", "/path/to/config.json"],
      "env": {
        "DB_URL": "${DB_URL}"
      }
    }
  }
}
${VAR}${VAR:-default} 兩種展開語法都支援;未設定且無預設會在 Claude Code 解析設定時直接 fail [1]。timeout 是該 server 每次工具呼叫的硬性時鐘上限(毫秒),可用 MCP_TIMEOUT 環境變數覆寫。

2.4 驗證連線

裝完後跑:
claude mcp list          # 列出所有 server 與狀態
claude mcp get github    # 看單一 server 的細節
在 Claude Code 內:
/mcp                      # 開啟 MCP 管理介面,看每個 server 的工具數、連線狀態
驗證 SOP
1

確認 server 出現在 /mcp 列表

執行 /mcp 確認目標 server 狀態為已連線,工具數量與預期相符。
2

跑一次簡單呼叫

mcp__notion__search 帶簡單 query,確認模型能成功呼叫並取得回傳。
3

確認回傳格式符合預期

檢查工具回傳的資料結構是否與 server 文件一致,排除 schema 版本不符。
4

觀察 OAuth 認證流程

HTTP server 常需要首次 OAuth 授權,確認 scope 與你實際需要的功能相符,不要照單全收。
常見設定錯誤
  • 路徑不存在command 寫絕對路徑但檔案不在;用 which <command> 先確認。
  • type 命名錯:HTTP transport 官方接受 httpstreamable-http 兩個值(後者是 MCP 規格名稱),不要寫成 https [1]。
  • 環境變數沒設${API_KEY} 沒值,啟動時 fail。
  • 多 server 撞 port:兩個 server 硬編同一 port,後啟動的 fail。

3. 選 server:信任、權限、是否官方

引入一個 MCP server 前,過這三題:

3.1 信任來源三級

等級來源處置
Anthropic 官方策展的 claude-plugins-official 市集內附帶的 MCP server;或工具原廠(GitHub、Notion、Atlassian、Stripe 等)自家發布仍要 review .mcp.json 內容與 server 程式碼
知名開源 repo,有 issue tracker、有 release、有社群維護額外掃 rg 供應鏈指紋(見第 5 節)
私人 URL、fork 很久沒更新、單人維護預設不安裝;要裝先讀完源碼

3.2 權限範圍

server 在 .mcp.json 宣稱的 envargs 暗示它要哪些資源。把它對應到「這個 server 真的需要這個嗎?」:
  • 一個只做 grep 的 server 不需要 write 權限。
  • 一個只查 issue 的 server 不需要對外網路。
  • 一個 server 同時要 write + 對外網路 + ~/.ssh 路徑,最高警覺。
官方 code.claude.com/docs/en/permissions 提供 Bash / Edit / Read 的白名單 / 黑名單 / ask 三層規則;對 MCP server 的權限收斂走 mcp__<server>__* 的 tool 級規則 [2]。
權限審查範例一個 server 的 .mcp.json 設定:
{
  "mcpServers": {
    "slack": {
      "type": "http",
      "url": "https://mcp.slack.com/mcp",
      "oauth": {
        "scopes": "channels:read chat:write search:read"
      }
    }
  }
}
審查點:這個 server 是 Slack 官方嗎?OAuth scope 列了 chat:write(可發訊息),你工作流真的需要從 agent 自動發訊息嗎?若不需要,把 chat:write 從 scope 拿掉,只在需要時再放回 [1]。oauth.scopes 讓你把 OAuth 權限收斂到最小(精準 scope 鎖定)。

3.3 Plugin 提供的 MCP server

Plugin 可以把 MCP server 打包進去 [1]。claude-plugins-officialclaude-community 兩個市集上的 plugin,啟用時其內含的 MCP server 會自動連線。同樣要 review:plugin 內的 .mcp.jsonplugin.jsonmcpServers 區段,是看 server 設定的地方。
plugin MCP server 預設跟手動 server 共用 tool 命名空間啟用 plugin 後,它的 MCP 工具會跟手動配置的 MCP 工具一起出現在 /mcp 列表。要區分來源,看 /mcp 介面上的 plugin 標示 [1]。

4. 與 CLI、內建工具的取捨

4.1 判準

情境優先選擇
該操作有完整 CLI(gitghdockerkubectlpsql 等)CLI(見 04-10 CLI 優先
該操作 Claude.ai / Claude Code 內建就有(Web search、Read、Edit)內建
該服務只提供 REST / GraphQL API,沒有合適 CLIMCP(包成 server)或 WebFetch
該服務已有官方 MCP server(如 GitHub、Notion、Atlassian、Stripe)MCP(最常見正解)
同一操作要跨多個 client(Claude Code + Cursor + Codex)共用MCP(跨工具標準的價值所在)

4.2 不適合 MCP 的場景

  • 一次性命令:用 Bash tool 跑 gh pr list 就好,沒必要裝 GitHub MCP server。
  • 重型 shell pipelinefind | xargs grep | sed | jq 之類的多步管道,shell 處理最直接;包成 MCP 反而要拆成多次工具呼叫,每次呼叫都吃 context。
  • 需要高度可審計的動作:CLI 指令進 shell history;MCP 呼叫要額外日誌設定。

4.3 同一操作不混用 CLI 與 MCP

混用是隱性 bug 來源:你在 shell 跑 gh pr create,同一時間 agent 用 MCP 走 mcp__github__create_pull_request,兩個都成功了,狀態就不一致。一個操作選定一條路,fallback 切換後不回頭混用04-10 詳述)。

5. 安全邊界

MCP 是高槓桿整合介面,也是高槓桿攻擊面。連結 03-3 安全、隱私與供應鏈風險04-7 Plugin 的供應鏈 SOP,這裡只列 MCP 特有的:

5.1 攻擊面

攻擊面描述
repo 帶入的 .mcp.json專案層 server 走 .mcp.json,clone 陌生 repo 後 server 可能自動掛上。project scope 需 user approval,但使用者若未仔細閱讀確認,惡意 server 就已啟用
tool 回傳值注入外部 server 回傳的字串直接進 context,是 prompt injection 路徑
enableAllProjectMcpServers 設定全開,預設拒絕
headersHelper 任意指令執行v2.1.64+ 引入,project / local scope 時仍會被執行。project scope 信任對話框通過後就會跑 [1]
oauth.scopes 過寬server 申請超過實際需要的 scope

5.2 最小必要防護

# 1. 裝前掃:可疑外連指令
rg -n 'curl|wget|nc|ssh|ANTHROPIC_BASE_URL|enableAllProjectMcpServers' ~/.claude/ .mcp.json

# 2. 隱藏 Unicode 與 bidi 覆寫
rg -nP '[\x{200B}-\x{200D}\x{202A}-\x{202E}]' ~/.claude/ .mcp.json

# 3. HTML 註解、script tag、base64
rg -n '<!--|<script|data:text/html|base64,' ~/.claude/ .mcp.json
加上 03-3 通用 SOP:敏感路徑(~/.ssh~/.aws**/.env*)在 permissions.deny 阻擋;MCP 工具呼叫要有日誌;server 啟用清單每季 review 一次。

5.3 Tool search 與 context 控制

Claude Code 預設開啟 MCP tool search:MCP tools 不會在 session 啟動時全量載入 context,而是 Claude 透過 ToolSearch 動態發現 [1]。這大幅降低多 MCP server 的 context 成本,但不是安全機制。已連線的 server 仍可能因任務相關被叫到。對特別敏感的 server,可設 alwaysLoad: false(預設)外加在 permissions.denymcp__<server>__* 阻擋。

6. 工具對照

概念Anthropic Claude(主範本)OpenAIGoogleGitHub CopilotCursor(短提)
設定檔(專案層).mcp.json [1]mcp_config.json 或平台原生 [需確認原始出處]設定式 [需確認原始出處]設定式 [需確認原始出處].cursor/mcp.json [需確認原始出處]
設定檔(使用者層)~/.claude.json [1]設定式 [需確認原始出處]設定式 [需確認原始出處]設定式 [需確認原始出處]~/.cursor/mcp.json [需確認原始出處]
支援 stdio是 [1]是 [需確認原始出處]是 [需確認原始出處]是 [需確認原始出處]
支援 http(SSE 替代)是(streamable-http 別名)[1]設定式 [需確認原始出處]設定式 [需確認原始出處]設定式 [需確認原始出處]設定式 [需確認原始出處]
自動核准機制(安全風險)project scope 預設待核准 [1]設定式設定式設定式設定式
Plugin 內 MCP支援 [1]不適用不適用透過 Extensions不適用
官方 server 目錄claude.ai/directory [1]設定式 [需確認原始出處]設定式 [需確認原始出處]GitHub Marketplace [需確認原始出處]設定式 [需確認原始出處]
Tool search 預設開啟 [1]設定式設定式設定式設定式
OAuth 支援是(HTTP)[1]設定式設定式設定式設定式
命名與邊界
  • Claude Code 內建 MCP client;不需要裝 plugin 就能用 MCP server。
  • OpenAI、Antigravity、GitHub Copilot、Cursor 對 MCP 的支援深度與時程各異;上表「需確認原始出處」項目需查各家當前官方文件。
  • SSE transport 已在官方文件標為 deprecated;新設定用 http [1]。

動手做

30 分鐘練習
  1. 接一個 server 跑通(15 分鐘):裝 claude mcp add --transport http notion https://mcp.notion.com/mcp(或選你已有的帳號,如 Sentry、GitHub)。在 Claude Code 內 /mcp 確認狀態,跑一次簡單呼叫驗證連線。
  2. 寫 project scope 設定(10 分鐘):把你目前用 MCP 完成的一個操作,搬到 .mcp.json 走 project scope;下次啟動 Claude Code 觀察 user approval 對話框,決定該批准還是拒絕。
  3. 安全掃描(5 分鐘):對 ~/.claude.json.mcp.json 跑本節的 rg 三條掃描,把所有 hit 記下來並人工 review。

常見誤區

反模式清單
  • 直接信任 repo 帶入的 .mcp.json 而不審查:等同讓外部程式碼決定 agent 的工具集。clone 陌生 repo 後第一件事:開 .mcp.json 看看有什麼。
  • 給 MCP server 過寬權限(write + 對外網路 + ~/.ssh 路徑),遠超其實際功能所需。先裝最窄 scope;需要時再加。
  • 同一操作 CLI 與 MCP 混用:導致結果從兩個來源拼接、狀態不一致。一個操作一條路04-10 詳述)。
  • 裝了一堆 server 但從未 review/mcp 列出十幾個,但有幾個你忘了為什麼裝。每季掃一次,把不用的 mcp remove 掉。
  • 把 OAuth scope 全開:server 申請什麼 scope 就接受什麼。預設拒絕;需要的功能才放 scope。
  • 把 MCP 當作「萬靈丹」:MCP 解決「沒 CLI 的服務的整合」。有 CLI 的場景應優先 CLI04-10)。

自我檢核

通過本單元的標準
  1. 你能在一分鐘內說出 MCP 三種 scope 的差異,以及哪一種會被 user approval 攔下?
  2. 你能列出至少三條判斷「是否該裝某個 MCP server」的問題?
  3. 你目前主用的 MCP server(或考慮裝的),你能說出它的信任來源等級、它宣稱的權限範圍、以及你驗證過它確實只用那些權限嗎?
  4. 你能在裝一個新 MCP server 之前,跑完三條 rg 供應鏈掃描嗎?

來源與延伸閱讀

事實主張依官方文件,快變動項標註截至 2026-05。
  • [1] Anthropic, “Connect Claude Code to tools via MCP,” code.claude.com, 2026. [Online]. Available: https://code.claude.com/docs/en/mcp (截至 2026-06;含四種 transport、三種 scope、OAuth、headersHelper、tool search、streamable-http 別名、安全提示與 claude.ai/directory 官方 server 目錄)
  • [2] Anthropic, “Configure permissions,” code.claude.com, 2026. [Online]. Available: https://code.claude.com/docs/en/permissions (截至 2026-06;MCP tool 級 mcp__server__* 白名單 / 黑名單規則、與 Bash / Edit 規則的搭配)
  • [3] Model Context Protocol, “MCP specification,” modelcontextprotocol.io, 2026. [Online]. Available: https://modelcontextprotocol.io (截至 2026-06;官方規格首頁)
  • [4] Snyk, “ToxicSkills: 2026 Report on Malicious Skills in the Wild,” snyk.io, 2026. [Online]. Available: https://snyk.io (截至 2026-06;含 Skill / MCP server 供應鏈風險統計)[需確認原始出處:Snyk ToxicSkills 2026-02 報告的可引用 URL]