Agentic Research
首頁/學習/MCP (Model Context Protocol) 生態詳解:Tool、Resource、Prompt 三大原語

MCP (Model Context Protocol) 生態詳解:Tool、Resource、Prompt 三大原語

2026/05/1010 分鐘Bryan Chan最後更新 2026/05/10
這篇屬於學習主題MCPClaude Code

先讀這些

這篇文章在學習路徑上假設你已經讀過下列內容。

MCP 的三個原語:Tools、Resources、PromptsMCP server 提供三種東西,而區分它們最有用的軸不是「是什麼」而是「誰決定用它」。Tools 由**模型**決定呼叫,它能做事情而不只是回資料,是三個原語裡唯一會改變外部世界的,所以風險最高、也因此需要閘門與權限設定。Resources 由**應用程式**決定讀取,它是資料不是動作,風險在內容而非動作 —— 讀進來的東西會影響模型的判斷,所以來源要可信。Prompts 由**使用者**決定選用,它是 server 提供、出現在選單裡的模板,風險最低但最容易被忽略,因為它是 server 作者寫的提示詞,你應該知道裡面說了什麼。怎麼讀一個 server 的原語清單:只提供 Resources 的 server 不能替你做事、只能供應資料,提供 Tools 的就能,這一個差別應該改變你讀它的 access 說明時有多仔細。原語清單也不會告訴你兩件事:各有多少個(一個工具與四十個工具的 server 都只寫 tools),以及它們會動到什麼 —— 這就是本站 MCP 目錄每一筆都必填 access 與 risk 的原因。三個原語,用「誰決定用它」來區分這個軸比「它們是什麼」有用,因為它直接對應到權限與風險宿主(你的 AI 應用)連到若干 serverMCP server提供這三種stdio / Streamable HTTPTools模型決定呼叫它能**做**事情,不只是回資料。唯一會改變外部世界的原語。例:查資料庫、發訊息、建立 issue、執行程式Resources應用程式決定讀取它是**資料**,不是動作。由宿主程式決定塞進上下文。例:檔案內容、資料庫 schema、文件片段Prompts使用者決定選用它是**模板**,出現在選單裡。由你主動挑,不是模型發明的。例:「審查這段程式碼」「把這份會議紀錄變成待辦」Tools · 風險風險最高,所以需要閘門。模型會自己決定要不要用 —— 這就是為什麼權限設定存在。原語清單不會告訴你的兩件事· 各有多少個。一個工具與四十個工具的 server,清單上都只寫「tools」。· 它們會動到什麼。這就是本站目錄每一筆都必填 access 與 risk 的原因。1
1/4Tools:模型決定
唯一會改變外部世界的一個
第 1 步,共 4 步 Tools:模型決定
圖:MCP 的三個原語 —— tools、resources、prompts。誰發起、誰回應、資料往哪個方向流。

MCP 是什麼?

MCP(Model Context Protocol)是 Anthropic 推出的開源協議,定義了 LLM 與外部工具/數據源之間的標準接口。它讓 Claude Code 等 AI 客戶端可以安全地訪問本地文件、數據庫、API 等外部資源。

核心概念

┌──────────────┐     MCP Protocol     ┌──────────────┐
│  MCP Client  │ ◄──────────────────► │  MCP Server  │
│ (Claude Code)│    JSON-RPC 2.0      │ (tool/data)  │
└──────────────┘                      └──────────────┘

三大原語

原語用途例子
Tool讓 LLM 執行操作查詢數據庫、發送 HTTP 請求
Resource暴露數據給 LLM文件內容、API 響應
Prompt預定義提示模板代碼審查模板、翻譯模板

Tool(工具)

Tool 讓 LLM 能夠執行操作,而不僅僅是生成文字。

內置常用 MCP Servers

# 文件系統訪問
npx @anthropic-ai/mcp-server-filesystem /path/to/allowed/dir

# GitHub 整合
npx @anthropic-ai/mcp-server-github

# PostgreSQL 查詢
npx @anthropic-ai/mcp-server-postgres

# Brave Search
npx @anthropic-ai/mcp-server-brave-search

# Puppeteer 瀏覽器
npx @anthropic-ai/mcp-server-puppeteer

配置 Claude Code 使用 MCP

編輯 ~/.claude.json:

{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": ["@anthropic-ai/mcp-server-filesystem", "/Users/me/projects"],
      "env": {}
    },
    "github": {
      "command": "npx",
      "args": ["@anthropic-ai/mcp-server-github"],
      "env": {
        "GITHUB_TOKEN": "ghp_xxx"
      }
    }
  }
}

配置後重啟 Claude Code,輸入 /mcp 查看已連接的 servers。


Resource(資源)

Resource 讓 LLM 能夠讀取結構化數據,無需用戶粘貼內容。

典型場景

  • 數據庫 Schema:讓 LLM 了解表結構後自動生成 SQL
  • API 文檔:自動讀取 OpenAPI spec,生成正確的 API 調用
  • 項目結構:暴露項目文件樹,讓 LLM 理解代碼庫佈局
{
  "mcpServers": {
    "postgres": {
      "command": "npx",
      "args": ["@anthropic-ai/mcp-server-postgres", "postgresql://localhost/mydb"]
    }
  }
}

Prompt(提示模板)

Prompt 提供可復用的提示模板,確保一致性。

{
  "mcpServers": {
    "review-templates": {
      "command": "npx",
      "args": ["@anthropic-ai/mcp-server-prompt", "--dir", "~/.claude/prompts"]
    }
  }
}

在 ~/.claude/prompts/ 下放置 .md 文件,即可通過 MCP 調用。


實戰:構建自定義 MCP Server

# my_mcp_server.py
from mcp.server import Server, NotificationOptions
from mcp.server.models import InitializationCapabilities
import mcp.server.stdio
import mcp.types as types

server = Server("my-tools")

@server.list_tools()
async def handle_list_tools() -> list[types.Tool]:
    return [
        types.Tool(
            name="get_weather",
            description="獲取指定城市的天氣",
            inputSchema={
                "type": "object",
                "properties": {
                    "city": {"type": "string", "description": "城市名稱"}
                },
                "required": ["city"]
            }
        )
    ]

@server.call_tool()
async def handle_call_tool(name: str, arguments: dict):
    if name == "get_weather":
        city = arguments["city"]
        # 實際調用天氣 API
        return [types.TextContent(type="text", text=f"{city} 天氣:晴天 25°C")]

async def run():
    async with mcp.server.stdio.stdio_server() as (read_stream, write_stream):
        await server.run(read_stream, write_stream,
            InitializationCapabilities(
                sampling={},
                experimental={},
            ))

if __name__ == "__main__":
    import asyncio
    asyncio.run(run())

在 ~/.claude.json 中註冊:

{
  "mcpServers": {
    "my-tools": {
      "command": "python",
      "args": ["/path/to/my_mcp_server.py"]
    }
  }
}

安全考量

MCP Server 能訪問文件系統和網絡,需要謹慎:

  1. 最小權限原則:filesystem server 只暴露必要的目錄
  2. 環境變量隔離:敏感憑證用 env 傳遞,不寫入配置文件
  3. 審計日誌:定期檢查 MCP Server 的訪問記錄
  4. 不要暴露 / 根目錄:限制 filesystem server 的訪問範圍

推薦閱讀

在這條路徑上的下一步