Back to Blog
BlogApril 6, 2026201

如何建立你的第一個 MCP 伺服器:逐步教學指南

如何建立你的第一個 MCP 伺服器:逐步教學指南

前置準備

開始前,請確保您已準備好以下項目:

  • 已安裝 Python 3.10 或更高版本
  • 基本熟悉 Python 函式與非同步程式碼。
  • uv(快速的 Python 套件管理工具) – 使用 curl -LsSf https://astral.sh/uv/install.sh | sh 指令安裝。
  • 一個 MCP 客戶端,例如 Claude Desktop(從 claude.ai/download 下載並保持更新)。
  • 一個文字編輯器或整合開發環境(IDE)。

無需事先具備 MCP 經驗。我們將建立一個實用的 天氣 MCP 伺服器,讓 AI 能透過國家氣象局(NWS)API 查詢即時的美國天氣警報與預報。

步驟 1:設定環境

建立一個乾淨的專案目錄,並使用 uv 進行初始化:

mkdir weather-mcp-server
cd weather-mcp-server
uv init
uv venv
source .venv/bin/activate  # 在 Windows 上:.venv\Scripts\activate
uv add "mcp[cli]" httpx

這將安裝官方的 MCP Python SDK(FastMCP)以及用於 API 呼叫的 httpx。您的專案現在應包含 pyproject.toml 檔案與虛擬環境。

預期輸出: 新的 .venv 資料夾,以及列在 uv.lock 中的相依套件。

步驟 2:建立 MCP 伺服器程式碼

建立主要檔案:

touch weather.py

將以下完整、可立即執行的程式碼貼到 weather.py 中:

from typing import Any
import httpx
from mcp.server.fastmcp import FastMCP

# 初始化 MCP 伺服器
mcp = FastMCP("weather")

NWS_API_BASE = "https://api.weather.gov"
USER_AGENT = "weather-app/1.0"

# 輔助函式:安全地呼叫 NWS API
async def make_nws_request(url: str) -> dict[str, Any] | None:
    headers = {"User-Agent": USER_AGENT, "Accept": "application/geo+json"}
    async with httpx.AsyncClient() as client:
        try:
            response = await client.get(url, headers=headers, timeout=30.0)
            response.raise_for_status()
            return response.json()
        except Exception:
            return None

# 將天氣警報格式化,以便 AI 清晰閱讀
def format_alert(feature: dict) -> str:
    props = feature["properties"]
    return f"""
Event: {props.get("event", "Unknown")}
Area: {props.get("areaDesc", "Unknown")}
Severity: {props.get("severity", "Unknown")}
Description: {props.get("description", "No description available")}
Instructions: {props.get("instruction", "No specific instructions provided")}
"""

# 工具 1:取得美國某個州的現行天氣警報
@mcp.tool()
async def get_alerts(state: str) -> str:
    """Get current weather alerts for a U.S. state (e.g., "CA" or "TX")."""
    url = f"{NWS_API_BASE}/alerts/active/area/{state.upper()}"
    data = await make_nws_request(url)
    if not data or "features" not in data:
        return "Unable to fetch alerts or no alerts found."
    if not data["features"]:
        return f"No active alerts for {state.upper()}."
    alerts = [format_alert(f) for f in data["features"]]
    return "\n---\n".join(alerts)

工具 2:取得任意緯度/經度的 5 天預報

@mcp.tool() async def get_forecast(latitude: float, longitude: float) -> str: """取得特定緯度和經度的天氣預報。""" points_url = f"{NWS_API_BASE}/points/{latitude},{longitude}" points_data = await make_nws_request(points_url) if not points_data: return "無法取得此位置的天氣預報數據。" forecast_url = points_data["properties"]["forecast"] forecast_data = await make_nws_request(forecast_url) if not forecast_data: return "無法取得詳細預報。" periods = forecast_data["properties"]["periods"][:5] forecasts = [] for period in periods: forecast = f""" {period["name"]}: 溫度:{period["temperature"]}°{period["temperatureUnit"]} 風速:{period["windSpeed"]} {period["windDirection"]} 預報:{period["detailedForecast"]} """ forecasts.append(forecast) return "\n---\n".join(forecasts)

def main(): mcp.run(transport="stdio")

if name == "main": main()


**關鍵概念說明:**
- `@mcp.tool()` 裝飾器將普通的 async 函數轉換為 AI 能夠發現並呼叫的 MCP 工具。
- 伺服器透過 **stdio**(標準輸入/輸出)運行 — 這是本地 MCP 伺服器的預設方式。
- 所有日誌記錄應輸出到 stderr(FastMCP 會自動處理)。

## 步驟 3:在本地測試伺服器

執行伺服器:

```bash
uv run weather.py

預期輸出: 終端機保持開啟且無輸出(這是 stdio 伺服器的正常現象)。只有當 MCP 客戶端連接時,您才會看到 JSON-RPC 訊息。

請保持此終端機運行,以進行下一步。

步驟 4:將 MCP 伺服器連接至 Claude Desktop

  1. 開啟 Claude Desktop。
  2. 建立或編輯位於以下位置的設定檔:
    • macOS~/Library/Application Support/Claude/claude_desktop_config.json
    • Windows%APPDATA%\Claude\claude_desktop_config.json

加入以下確切項目(請將 /ABSOLUTE/PATH/TO/weather-mcp-server 替換為您的實際資料夾路徑):

{
  "mcpServers": {
    "weather": {
      "command": "uv",
      "args": [
        "--directory",
        "/ABSOLUTE/PATH/TO/weather-mcp-server",
        "run",
        "weather.py"
      ]
    }
  }
}
  1. 完全退出 Claude Desktop(macOS 為 Cmd+Q,Windows 為從系統匣關閉),然後重新啟動它。
  2. 在 Claude 中,點擊 「Add files, connectors, and more」 → 懸停在 Connectors 上 → 您應該會看到 「weather」 列出。

步驟 5:與 AI 一起使用您的 MCP 伺服器

在 Claude Desktop 中嘗試這些提示:

「德州有哪些活躍的天氣警報?」

  • 「給我舊金山的天氣預報(使用緯度 37.77,經度 -122.41)。」
  • 「檢查加州的警報,並告訴我是否需要準備任何事項。」

Claude 將自動發現這些工具,第一次使用時會徵求您的同意,然後返回格式化的結果。

預期行為: AI 將在後台呼叫您的工具,並以自然語言顯示答案。

常見問題與疑難排解

  • 伺服器未出現在 Claude 中

    • 再次確認 JSON 格式是否有效(無多餘的逗號)。
    • 在配置中使用絕對路徑
    • 完全重新啟動 Claude。
    • 檢查日誌:~/Library/Logs/Claude/mcp*.log(macOS)或 Windows 上的等效位置。
  • API 錯誤或無資料

    • NWS API 僅適用於美國境內地點。
    • 請使用兩個字母的州代碼(例如 CA、TX 等)。
    • 座標必須是有效的緯度/經度。
  • 「指令未找到」

    • 確保 uv 已在您的 PATH 中且虛擬環境已啟用。
    • 執行 uv --version 來驗證安裝。
  • 逾時或回應緩慢

    • 如有需要,可在 make_nws_request 中增加逾時設定。
    • NWS 有速率限制——避免在正式環境中頻繁請求。
  • 權限問題

    • 在 macOS 上,請前往系統設定 → 隱私與安全性,授予 Claude Desktop 完整的磁碟存取權限。

後續步驟

  • 新增更多工具:使用相同的 @mcp.tool() 模式,建立適用於資料庫、GitHub、Slack 或您自己的 API 的工具。
  • 新增資源與提示:使用 mcp.resource()mcp.prompt() 來處理檔案類資料及可重複使用的指令。 -a 遠端部署:切換到 HTTP/SSE 傳輸協定,並在 AWS Lambda、Vercel 或任何伺服器上部署(FastMCP 支援 stateless_http=True)。
  • 支援多種語言:嘗試使用官方的 TypeScript、Go 或 Rust SDK 以實現相同的功能。
  • 分享您的伺服器:將倉儲發佈出去,讓其他人可以透過 npx 或 Docker 來新增它。

您現在已擁有一個功能完整的 MCP 伺服器,任何相容的 AI 用戶端皆可使用。立即開始試驗、擴充工具,並著手建構強大的 AI 整合吧!

Share this article

Referenced Tools

Browse entries that are adjacent to the topics covered in this article.

Explore directory
TinyFish logo

TinyFish

MCP Servers

TinyFish 為相容 MCP 的 AI 助手提供網頁自動化、網路搜尋、內容擷取以及遠端瀏覽器會話工具。代管的 MCP 伺服器使用 OAuth 2.1,而可選的本地 @tiny-fish/mcp 代理支援 API 金鑰驗證,適用於僅限本地、CI 及無頭設定。

X MCP logo

X MCP

MCP Servers

X MCP 是 X 官方託管的 Model Context Protocol 伺服器,可讓相容 MCP 的 AI 工具呼叫 X API 端點。它透過 xurl 橋接 OAuth 使用者情境,支援貼文搜尋、使用者查詢、書籤、趨勢、新聞和 Articles 等工作流程。

TinyFish logo

TinyFish

MCP Servers

TinyFish exposes web automation, web search, content extraction, and remote browser-session tools to MCP-compatible AI assistants. The hosted MCP server uses OAuth 2.1, while an optional local @tiny-fish/mcp proxy supports API-key authentication for local-only, CI, and headless setups.

openaiDeveloperDocs logo

openaiDeveloperDocs

MCP Servers

OpenAI Developer Docs MCP is an OpenAI-hosted, read-only server that lets MCP clients search and fetch documentation from developers.openai.com, platform.openai.com, and learn.chatgpt.com. It uses a public streamable HTTP endpoint and does not call the OpenAI API on the user's behalf.

FetchSandbox logo

FetchSandbox

MCP Servers

FetchSandbox is a stdio MCP server and hosted API-sandbox service that lets AI coding agents import OpenAPI 3.x specifications, discover runnable workflows, and execute stateful integration tests without using production API credentials. It is designed for validating request flows, lifecycle state, webhooks, retries, and shareable run traces from MCP-compatible development tools.

DataForSEO MCP Server logo

DataForSEO MCP Server

MCP Servers

DataForSEO MCP Server is the official Model Context Protocol server for connecting AI clients to DataForSEO SEO, SERP, keyword, backlink, on-page, business, domain, content, merchant, and AI optimization data. It can be used as a hosted Streamable HTTP endpoint, a local npx package, a Docker container, or a source-built TypeScript server.