引言
隨著大語言模型(LLM)技術的快速發展,如何擴展其能力邊界成為開發者關注的重點。MCP(Model Capability Protocol)作為一種協議標準,允許開發者構建自定義服務器來增強LLM的功能。
正文內容
1. MCP核心概念與技術背景
MCP服務器主要提供三種能力類型:
- 資源(Resources):客戶端可讀取的類似文件的數據(如API響應或文件內容)
- 工具(Tools):經用戶批準后LLM可調用的函數
- 提示(Prompts):幫助用戶完成特定任務的預編寫模板
本教程將重點介紹工具類型的實現,通過構建兩個實用工具(get-alerts和get-forecast)來擴展Claude的功能,使其能夠獲取天氣預報和惡劣天氣警報。
2. 環境準備與項目初始化
2.1 系統要求
- Python 3.10或更高版本
- Python MCP SDK 1.2.0或更高版本
2.2 安裝uv并創建項目
# 安裝uv包管理器
curl -LsSf https://astral.sh/uv/install.sh | sh# 創建項目目錄
uv init weather
cd weather# 創建并激活虛擬環境
uv venv
source .venv/bin/activate# 安裝依賴
uv add "mcp[cli]" httpx# 創建服務器文件
touch weather.py
3. 構建天氣服務器
3.1 初始化FastMCP實例
from typing import Any
import httpx
from mcp.server.fastmcp import FastMCP# 初始化FastMCP服務器
mcp = FastMCP("weather")# 常量定義
NWS_API_BASE = "https://api.weather.gov"
USER_AGENT = "weather-app/1.0"
```FastMCP類利用Python類型提示和文檔字符串自動生成工具定義,簡化了MCP工具的創建和維護過程。
3.2 實現輔助函數
async def make_nws_request(url: str) -> dict[str, Any] | None:"""向NWS API發起請求并處理錯誤"""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 Nonedef 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')}
"""
3.3 實現工具功能
@mcp.tool()
async def get_alerts(state: str) -> str:"""獲取美國各州的天氣警報Args:state: 兩字母州代碼(如CA, NY)"""url = f"{NWS_API_BASE}/alerts/active/area/{state}"data = await make_nws_request(url)if not data or "features" not in data:return "無法獲取警報或未發現警報"if not data["features"]:return "該州無活躍警報"alerts = [format_alert(feature) for feature in data["features"]]return "\n---\n".join(alerts)@mcp.tool()
async def get_forecast(latitude: float, longitude: float) -> str:"""獲取某地天氣預報Args:latitude: 緯度longitude: 經度"""# 首先獲取預測網格端點points_url = f"{NWS_API_BASE}/points/{latitude},{longitude}"points_data = await make_nws_request(points_url)if not points_data:return "無法獲取該位置的預測數據"# 從points響應中獲取預測URLforecast_url = points_data["properties"]["forecast"]forecast_data = await make_nws_request(forecast_url)if not forecast_data:return "無法獲取詳細預測"# 將時間段格式化為可讀預測periods = forecast_data["properties"]["periods"]forecasts = []for period in periods[:5]: # 僅顯示接下來5個時段forecast = f"""
{period['name']}:
溫度: {period['temperature']}°{period['temperatureUnit']}
風速: {period['windSpeed']} {period['windDirection']}
預測: {period['detailedForecast']}
"""forecasts.append(forecast)return "\n---\n".join(forecasts)
3.4 運行服務器
if __name__ == "__main__":# 初始化并運行服務器mcp.run(transport='stdio')
4. 連接Claude for Desktop進行測試
4.1 配置客戶端
{"mcpServers": {"weather": {"command": "uv","args": ["--directory","/ABSOLUTE/PATH/TO/PARENT/FOLDER/weather","run","weather.py"]}}
}
4.2 測試命令
- “薩克拉門托的天氣怎么樣?”
- “德克薩斯州有哪些活躍的天氣警報?”
5. 技術實現原理
當用戶提問時,系統會經歷以下流程:
- 客戶端將問題發送給Claude
- Claude分析可用工具并決定使用哪些
- 客戶端通過MCP服務器執行選定工具
- 結果返回給Claude
- Claude生成自然語言響應
- 向用戶顯示響應
結論
本文詳細介紹了如何使用Python和MCP SDK快速構建一個功能完整的天氣服務器。通過實現get-alerts和get-forecast兩個工具,我們成功擴展了Claude的能力,使其能夠查詢實時天氣信息。這種模式可以推廣到其他領域,為LLM添加各種實用功能。MCP協議的靈活性和Python SDK的易用性使得開發者可以快速構建和集成自定義功能,極大地豐富了LLM的應用場景。
MCP 核心架構解析