MCP快速入門—快速構建自己的服務器

引言

隨著大語言模型(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 測試命令
  • “薩克拉門托的天氣怎么樣?”
  • “德克薩斯州有哪些活躍的天氣警報?”

img

5. 技術實現原理

當用戶提問時,系統會經歷以下流程:

  1. 客戶端將問題發送給Claude
  2. Claude分析可用工具并決定使用哪些
  3. 客戶端通過MCP服務器執行選定工具
  4. 結果返回給Claude
  5. Claude生成自然語言響應
  6. 向用戶顯示響應

結論

本文詳細介紹了如何使用Python和MCP SDK快速構建一個功能完整的天氣服務器。通過實現get-alerts和get-forecast兩個工具,我們成功擴展了Claude的能力,使其能夠查詢實時天氣信息。這種模式可以推廣到其他領域,為LLM添加各種實用功能。MCP協議的靈活性和Python SDK的易用性使得開發者可以快速構建和集成自定義功能,極大地豐富了LLM的應用場景。

MCP 核心架構解析

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/88314.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/88314.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/88314.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Vue 事件總線深度解析:從實現原理到工程實踐

在 Vue 組件通信體系中,事件總線(Event Bus)是處理非父子組件通信的輕量解決方案。本文將從技術實現細節、工程化實踐、內存管理等維度展開,結合源碼級分析與典型場景,帶你全面掌握這一核心技術點。?一、事件總線的技…

CMake Qt靜態庫中配置qrc并使用

CMake Qt序言環境代碼序言 看網上這資料較少,且我理解起來有歧義,特地補充 環境 CMake:3.29.2 Qt:5.15.2 MSVC:2022 IDE:QtCreator 代碼 方式一: 在CMakeLists.txt里,add_libr…

記錄一下:成功部署k8s集群(部分)

前提條件:安裝了containerd、docker 關閉了firewalld、selinux 配置了時間同步服務 chronyd 關閉swap分區等1、在控制節點、工作節點,安裝kubelet、kubeadm、kubectlyum install -y kubelet-1.26.0 kubeadm-1.26.0 kubectl-1.26.0 …

Idea如何解決包沖突

Idea如何解決包沖突1.Error信息:JAR列表。 在掃描期間跳過不需要的JAR可以縮短啟動時間和JSP編譯時間。SLF4J: Class path contains multiple SLF4J bindings.SLF4J: Found binding in [jar:file:/E:/javapojects/stww-v4-gjtwt-seal/target/stww--v4-platform-proj…

python 協程學習筆記

目錄 python 協程 通俗理解 Python 的 asyncio 協程,最擅長的是: 批量下載文件的例子: 協程的優勢: python 協程 通俗理解 def my_coroutine():print("開始")x yield 1print("拿到了:", x)yi…

【學習筆記】蒙特卡洛仿真與matlab實現

概述 20 世紀 40 年代,由于電子計算機的出現, 借助計算機可以實現大量的隨機抽樣試驗,為利用隨機試驗方法解決實際問題提供了便捷。 非常具代表性的例子是, 美國在第二次世界大戰期間研制原子彈的“曼哈頓計劃”中,為了…

HTTP/3.x協議詳解:基于QUIC的下一代Web傳輸協議

一、HTTP/3協議概述 HTTP/3是超文本傳輸協議(HTTP)的第三個正式版本,由IETF(互聯網工程任務組)于2022年正式標準化(RFC 9114)。其核心創新在于完全基于QUIC協議替代傳統TCP,結合UDP…

【SQL】使用UPDATE修改表字段的時候,遇到1054 或者1064的問題怎么辦?

我在使用python連接sql修改表格的時間字段的時候,遇到這樣一個問題:ProgrammingError: (pymysql.err.ProgrammingError) (1064, “You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the ri…

【字節跳動】數據挖掘面試題0013:怎么做男女二分類問題, 從抖音 app 提供的內容中。

文章大綱 ?? 一、問題定義與數據基礎數據源及預處理:?? 二、特征工程方案1. 文本特征2. 視覺特征3. 音頻與行為特征4. 上下文特征?? 三、模型選型與訓練1. 基礎模型對比2. 多模態融合模型3. 訓練技巧?? 四、評估與優化策略1. 評估指標2. 典型問題優化3. 算法偏差控制?…

HTTP請求走私漏洞

一、漏洞定義與核心原理HTTP請求走私(HTTP Request Smuggling)是一種利用前端服務器(如代理、負載均衡器)與后端服務器在解析HTTP請求時的不一致性,繞過安全機制并執行惡意操作的攻擊技術。其核心在于混淆請求邊界&…

Javaweb - 10.1 Servlet

目錄 Servlet 簡介 動態資源和靜態資源 Servlet 簡介 Servlet 開發流程 目標 開發過程 開發一個 web 類型的 module 開發一個 form 表單 開發一個 UserServlet 在 web..xml 為 userServlet 配置請求路徑 Edit Configurations 啟動項目 完! Servlet 簡介…

手機能用酒精擦嗎?

對于電視、電腦屏幕來說,為了避免反光、改善顯示效果,會在屏幕表面覆上一層“抗反射涂層”。不同廠商設計的涂層材料并不相同,酒精作為良好的溶劑,確實會損壞可溶的涂層。手機作為觸控產品,通常會在屏幕表面增加“疏水…

【圖像處理基石】圖像超分辨率有哪些研究進展值得關注?

近年來,圖像超分辨率(SR)領域在深度學習技術的推動下取得了顯著進展,尤其在模型架構優化、計算效率提升和真實場景適應性等方面涌現出諸多創新。以下是基于最新研究的核心進展梳理: 一、高效大圖像處理:像素…

Windows系統下WSL從C盤遷移方案

原因:一開始裝WSL的時候放在了C盤,這下好了,跑了幾個深度學習模型訓練后,C盤快滿了,這可怎么辦?可愁壞了。沒關系,山人自有妙計。我們將WSL遷移到D盤或者E盤呀。一.遷移操作步驟前期準備&#x…

金融時間序列機器學習訓練前的數據格式驗證系統設計與實現

金融時間序列機器學習訓練前的數據格式驗證系統設計與實現 前言 在機器學習項目中,數據質量是決定模型成功的關鍵因素。特別是在金融時間序列分析領域,原始數據往往需要經過復雜的預處理才能用于模型訓練。本文將詳細介紹一個完整的數據格式驗證系統&…

cocos2dx3.x項目升級到xcode15以上的iconv與duplicate symbols報錯問題

cocos2dx3.x項目升級xcode15以上后會有幾處報錯。1. CCFontAtlas.cpp文件下的iconv與iconv_close的報錯。修改如下:// iconv_close(_iconv);iconv_close((iconv_t)_iconv);iconv((iconv_t)_iconv, (char**)&pin, &inLen, &pout, &outLen); /…

HTTP/3.0的連接遷移使用連接ID來標識連接為什么可以做到連接不會中斷

一定要結合圖文一起理解!! 文章目錄文字描述傳統方式:HTTP/2 基于 TCP 的連接(就像打固定電話)HTTP/3 基于 QUIC 的連接遷移(就像用帶“通話ID”的手機)總結一下圖文詳解HTTP2.0傳統方式&#x…

讓工作效率翻倍的終極神器之被工具定義的編程時代(VS Code + GitHub Copilot + JetBrains全家桶)

目錄一、引言:被工具定義的編程時代二、背景:傳統開發模式的效率瓶頸2.1 認知負荷過載2.2 工具鏈斷層三、效率翻倍工具鏈深度解析3.1 智能代碼編輯器:從打字機到智能助手3.2 版本控制大師:Git的隱藏技能3.3 自動化腳本&#xff1a…

docker部署單機gitlab

環境準備: 證書: acme.sh --issue --dns dns_ali -d gitlab.chandz.com -d *.chandz.comcp /root/.acme.sh/gitlab.chandz.com_ecc/* /data/docker-data-volume/gitlab/ssl/目錄: mkdir -p /data/docker-data-volume/gitlab cd /data/docker-…

【K8S】在 Kubernetes 上配置安裝 Nginx Ingress 控制器指南

文章目錄架構概覽先決條件部署方案選擇方案一:手動 YAML 部署核心組件詳解方案二:Helm快速部署(生產推薦)驗證部署DNS配置策略方案A:單域名映射方案B:通配符映射(推薦)應用實戰&…