【MCP】從一個天氣查詢服務帶你了解MCP

1. 前言

這篇文章將通過一個集成高德天氣查詢的 MCP Server 用例,帶你上手開發自己的 MCP Server ,文章將通過以下三種方式(自己編寫 Client 端代碼,使用 mcp-cli 自帶頁面,集成到 Claude 桌面版等)帶你測試自己的 MCP Server。

PS:文章中的每一步都經過自己親自上手。整理不易,請不要令色你的贊和收藏。

2. MCP介紹

2.1 什么是MCP?

MCP (Model Context Protocol) 是一個開放協議,由 Anthropic 公司推出的開放標準,用于標準化應用程序如何向 LLM 提供上下文。它可以比作 AI 應用程序的 USB-C 接口,提供了一種標準化方式將 AI 模型連接到不同的數據源和工具。

2.2 架構介紹

MCP 遵循 client-server (客戶端-服務端) 架構,并允許一個主機應用程序同時連接多個服務器。下面是其核心架構圖:

2.3 傳輸機制

MCP 中 Server 和 Client 之間主要支持以下兩種通信方式,并且都使用 JSON-RPC 2.0 (一種輕量級的遠程過程調用(RPC)協議) 交換消息:

  • Stdio 傳輸:使用標準輸入/輸出,適合本地通信。

  • SSE 傳輸:使用 Server-Sent Events 和 HTTP POST 請求,實現響應式輸出,適合遠程通信。

2.4 你的疑問?

2.4.1 什么是MCP Servers?

MCP Servers 是提供上下文、工具和提示給 AI 客戶端的系統。它們可以暴露數據源,如文件、文檔、數據庫和 API 集成,允許 AI 助手以安全的方式訪問實時信息

2.4.2?MCP Servers能提供什么?

MCP Servers 可以共享資源(文件、文檔、數據)、暴露工具(API 集成、操作)并提供提示(模板交互)。它們控制自己的資源并維護清晰的系統邊界以保障安全。

2.4.3 MCP Servers是如何工作的?

MCP Servers 通過簡單的客戶端-服務器架構工作。它們通過標準協議公開數據和工具,與主機應用程序(如 Claude 桌面)中的客戶端保持安全的 1:1 連接。

2.4.4 MCP Servers安全嗎?

是的,安全性已內置到 MCP 協議中。服務器控制自己的資源,無需與LLM提供商共享 API 密鑰,并且系統保持清晰的邊界。每個服務器管理自己的身份驗證和訪問控制。

3. 前提條件

這篇文章使用 Python 來開發 MCP Server ,使用高德地圖的 API 來查詢天氣。閱讀之前,你需要具備以下條件:

  • 已安裝 Python 3.10 或更高版本。

  • 已申請高德 web 服務?API_KEY,訪問??高德開放平臺?申請。

我使用的 Python 版本是 3.12,我的系統是 win11。

拓展:目前官方已提供以下幾種語言的 SDK:Python、TypeScript、Java、C#、Kotlin等,詳情可訪問文末的參考文檔。

4. 開發

4.1 創建一個Pyhon項目

推薦使用 uv 做為 Python 包管理工具。

1. 安裝 uv:

pip install uv

?2. 使用uv創建一個 mcp-demo 項目:

uv init mcp-demo

?3. 創建uv虛擬環境:

# 進入到剛創建的項目目錄下
cd .\mcp-demo\# 創建uv虛擬環境
uv venv .venv

執行完上述命令后,當前目錄下會創建一個名為 .venv 的虛擬環境文件夾。?

4.??激活虛擬環境:

.\.venv\Scripts\activate

5.?安裝 python mcp 依賴:?

uv add "mcp[cli]"

6.?PyCharm中引入該項目:

使用 PyCharm 打開這個項目,并在【Settings - Python Interpreter】中查看python解釋器是否正確(地址為項目路徑下的".venv\Scripts\python.exe")。

4.2 MCP Server開發

4.2.1 核心功能

MCP 主要提供一下三種功能:

  • 資源(Resources):客戶端可讀取的文件類數據(如 API 響應或文件內容)。

  • 工具(Tools):LLM 可調用的函數(需要用戶批準)。

  • 提示(Prompts):幫助用戶完成特定任務的預編寫模板。

通過這篇文章,你可以快速構建一個 MCP Server,使 LLM 能夠訪問實時天氣數據。?MCP 提供了統一的接口,可以簡化?LLM 與外部數據源的集成過程。

4.2.2 代碼

這篇文章主要關注工具(Tools)的使用。

4.2.2.1 創建.env文件

首先在項目路徑下創建一個 .env 的文件,用來存儲配置信息:

AMAP_API_KEY=<你的高德API_KEY>
4.2.2.2 創建weather-mcp-server.py文件

這篇文章使用官方的 FastMCP 框架構建 MCP 服務端和客戶端。

完整代碼:

import os
from typing import Dict, Any, Optionalimport httpx
from dotenv import load_dotenv
from mcp.server.fastmcp import FastMCP# 定義一個 FastMCp 實例
mcp = FastMCP("LocalWeatherServer")# 高德天氣API配置信息
load_dotenv()
AMAP_WEATHER_API_BASE_URL = "https://restapi.amap.com/v3/weather/weatherInfo"
AMAP_API_KEY = os.getenv("AMAP_API_KEY")async def get_amap_weather(city: str) -> Optional[Dict[str, Any]]:"""調用高德天氣接口,獲取天氣數據"""params = {"city": city,"key": AMAP_API_KEY,"extensions": "all",  # all:預報天氣,base:實況天氣"output": "JSON",}try:async with httpx.AsyncClient(timeout=5.0) as client:response = await client.get(AMAP_WEATHER_API_BASE_URL, params=params)response.raise_for_status()return response.json()except httpx.HTTPError as e:return {"error": f"天氣服務請求失敗:{e}"}def parse_forecast(cast: Dict[str, str]) -> str:""" 格式化單日天氣信息 """return (f"日期:{cast.get('date', '未知')},"f"星期:{cast.get('week', '未知')},"f"白天天氣:{cast.get('dayweather', '未知')},"f"夜晚天氣:{cast.get('nightweather', '未知')},"f"溫度:{cast.get('nighttemp', '未知')}~{cast.get('daytemp', '未知')}℃,"f"風向:{cast.get('daywind', '未知')}~{cast.get('nightwind', '未知')},"f"白天風力:{cast.get('daypower', '未知')}級,"f"夜晚風力:{cast.get('nightpower', '未知')}級。")def format_weather_data(weather_data: Dict[str, Any]) -> str:"""格式化天氣響應數據"""if "error" in weather_data:return weather_data["error"]forecasts = weather_data.get("forecasts", [])if not forecasts:return "未找到該城市的天氣信息。"forecast = forecasts[0]city = forecast.get("city", "未知城市")casts = forecast.get("casts", [])if not casts:return "未找到該城市的天氣信息。"today = parse_forecast(casts[0])future = "\n".join(parse_forecast(c) for c in casts[1:])result = [f"{city}今天的天氣:{today}"]if future:result.append(f"未來幾天天氣:\n{future}")return "\n".join(result)@mcp.tool()
async def fetch_weather(city: str) -> str:"""獲取城市天氣"""weather_data = await get_amap_weather(city)return format_weather_data(weather_data)if __name__ == "__main__":# 運行 MCP 服務器,默認傳輸協議 stdiomcp.run(transport="stdio")

5. 測試

5.1 通過編寫Client端代碼測試

5.1.1 客戶端實現完整代碼:

創建一個 mcp-client.py 的文件:

from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client# 創建標準輸入輸出(stdio)連接的服務器參數配置
server_params = StdioServerParameters(command="python",  # 要執行的命令/可執行文件args=["weather-mcp-server.py"],  # 傳遞給命令的參數列表env=None,  
)async def run():"""主運行函數,處理客戶端會話邏輯"""# 使用stdio_client建立連接,獲取讀寫通道async with stdio_client(server_params) as (read, write):# 創建客戶端會話async with ClientSession(read, write) as session:# 初始化連接(握手協議等)await session.initialize()# 列出所有可用的提示模板# prompts = await session.list_prompts()# 獲取特定提示模板,可傳入參數# prompt = await session.get_prompt(#     "example-prompt",  # 提示模板名稱#     arguments={"arg1": "value"}  # 模板參數# )# 列出所有可用資源# resources = await session.list_resources()# 列出所有可用工具tools = await session.list_tools()print(f"工具列表:{tools}")# 讀取特定資源內容# content, mime_type = await session.read_resource(#     "file://some/path"  # 資源URI# )# 調用指定工具result = await session.call_tool("fetch_weather",  # 工具名稱arguments={"city": "南京"}  # 工具參數)print(f"查詢結果:{result}")if __name__ == "__main__":import asyncio# 運行主異步函數asyncio.run(run())

5.1.2? 啟動服務端

首先需要啟動 MCP 服務端,PyCharm 中右鍵啟動:

5.1.3 測試

以同樣的方式運行客戶端測試,其結果如下:

5.2?使用mcp-cli自帶頁面測試

該方式需要安裝 node.js 。

5.2.1 啟動服務端

命令行鍵入:

 mcp dev weather-mcp-server.py

運行結果:

5.2.2 測試

瀏覽器打開?http://127.0.0.1:6274?

?5.3 集成到 Claude 桌面端測試

首先你需要?下載?Claude 桌面端?。

5.3.1 啟動服務端

同 5.2.1?

5.3.2?配置claude_desktop_config.json文件

打開 Claude 桌面端 - File- Settings - Developer - Edit Config(我這里已經配置,這個界面會不同)。

點擊 Edit Config,進入 Claude 運行目錄,找到?claude_desktop_config.json 文件,鍵入以下配置,將 AMAP_API_KEY 值替換為你的高德 API_KEY:

{"mcpServers": {"LocalWeatherServer": {"command": "uv","args": ["--directory","F:\\workspace\\python\\demos\\mcp-demo","run","weather-mcp-server.py"],"env": {"AMAP_API_KEY": "<your_api_key>"}}}
}

配置完成后,重啟 Claude 桌面端(需要在任務管理器殺掉 Calude 進程)。

重啟后,對話框下方會出現如下錘子按鈕。

5.3.3 測試

在聊天對話框輸入 ‘ 南京天氣 ’,首次調用會出現如下是否使用工具的提示,點擊同意即可。

結果:

到這里,MCP的簡單用例就開發完了。如果你想發現、分享和學習各種適用于 AI 應用的 MCP 服務器,可以訪問?MCP Servers?。

6. 參考文檔

  • Model Context Protocol 官網
  • MCP Python SDK

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

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

相關文章

SHCTF-REVERSE

前言 之前寫的&#xff0c;一直沒發&#xff0c;留個記錄吧&#xff0c;萬一哪天記錄掉了起碼在csdn有個念想 1.ezapk 反編譯 快速定位關鍵函數 package com.mycheck.ezjv;import adrt.ADRTLogCatReader; import android.app.Activity; import android.content.Context; impo…

安卓觸摸事件分發機制分析

1. 前言 &#x1f3af; 一句話總結&#xff1a; 觸摸事件&#xff08;TouchEvent&#xff09;會從 Activity 層開始&#xff0c;按從外到內的方式傳遞給每一個 ViewGroup/View&#xff0c;直到某個 View 消費&#xff08;consume&#xff09; 它&#xff0c;事件傳遞就會停止…

Spring MVC 多個攔截器的執行順序

一、流程總覽 該流程圖描述了一個多層攔截器鏈的業務處理流程&#xff0c;核心邏輯為&#xff1a; 前置攔截&#xff1a;通過 predHandler1 和 predHandler2 逐層校驗請求合法性。核心處理&#xff1a;通過校驗后執行核心業務邏輯 handler()。后置處理與清理&#xff1a;按反…

django filter 排除字段

在Django中&#xff0c;當你使用filter查詢集&#xff08;QuerySet&#xff09;時&#xff0c;通常你會根據模型的字段來過濾數據。但是&#xff0c;有時你可能想要排除某些特定的字段&#xff0c;而不是過濾這些字段。這里有幾種方法可以實現這一點&#xff1a; 使用exclude方…

ByeCode,AI無代碼開發平臺,拖拽式操作構建應用

ByeCode是什么 ByeCode 是一款先進的 AI 無代碼平臺&#xff0c;旨在幫助企業迅速創建數字名片、網站、小程序、應用程序及內部管理系統&#xff0c;無需繁雜的編碼或開發工作。ByeCode 采用直觀的可視化界面和拖拽式操作&#xff0c;使得非技術用戶能夠輕松上手。同時&#x…

AI日報 - 2025年04月28日

&#x1f31f; 今日概覽(60秒速覽) ▎&#x1f916; 能力進展 | Gemini 2.5 Pro成功挑戰《口袋妖怪紅》8道館&#xff1b;AI推理器具備自我糾錯能力&#xff1b;LLM在游戲、多模態理解、代碼遷移等方面展現新能力。 ▎&#x1f4bc; 商業動向 | Google回應DOJ反壟斷案&#xff…

在Java中實現List按自定義順序排序的幾種方案

在Java中實現List按自定義順序排序的幾種方案 在實際開發中&#xff0c;我們經常需要對集合中的對象按照特定字段進行排序。當排序規則不是簡單的字母或數字順序&#xff0c;而是自定義的順序時&#xff0c;我們需要采用特殊的方法。本文將以一個List<Person>按省份特定…

微服務架構在云原生后端的深度融合與實踐路徑

??個人主頁??:一ge科研小菜雞-CSDN博客 ????期待您的關注 ???? 一、引言:后端架構的演變,走向云原生與微服務融合 過去十余年,后端架構經歷了從單體應用(Monolithic)、垂直切分(Modularization)、到微服務(Microservices)的演進,每一次變化都是為了解決…

Python中的Walrus運算符分析

Python中的Walrus運算符&#xff08;:&#xff09;是Python 3.8引入的一個新特性&#xff0c;允許在表達式中同時賦值和返回值。它的核心作用是減少重復計算&#xff0c;提升代碼簡潔性。以下是其適用的典型場景及示例&#xff1a; 1. 在循環中避免重復計算 當循環條件需要多次…

用Node.js施展文檔比對魔法:輕松實現Word文檔差異比較小工具,實現Word差異高亮標注(附完整實戰代碼)

引言&#xff1a;當「找不同」遇上程序員的智慧 你是否經歷過這樣的場景&#xff1f; 法務同事發來合同第8版修改版&#xff0c;卻說不清改了哪里 導師在論文修改稿里標注了十幾處調整&#xff0c;需要逐一核對 團隊協作文檔頻繁更新&#xff0c;版本差異讓人眼花繚亂 傳統…

前端瀏覽器窗口交互完全指南:從基礎操作到高級控制

瀏覽器窗口交互是前端開發中構建復雜Web應用的核心能力&#xff0c;本文深入探討23種關鍵交互技術&#xff0c;涵蓋從傳統API到最新的W3C提案&#xff0c;助您掌握跨窗口、跨標簽頁的完整控制方案。 一、基礎窗口操作體系 1.1 窗口創建與控制 // 新窗口創建&#xff08;現代瀏…

Git和Gitlab的部署和操作

一。GIT的基本操作 1.GIT的操作和查看內容 [rootmaster ~]# yum install git -y [rootmaster ~]# git config --list&#xff1a;查看所有配置 2.GIT倉庫初始化 [rootmaster ~]# mkdir /gittest&#xff1a;創建目錄 [rootmaster ~]# cd /gittest/&#xff1a;進入目錄 [rootm…

Linux中線程池的簡單實現 -- 線程安全的日志模塊,策略模式,線程池的封裝設計,單例模式,餓漢式單例模式,懶漢式單例模式

目錄 1. 對線程池的理解 1.1 基本概念 1.2 工作原理 1.3 線程池的優點 2. 日志與策略模式 2.1 日志認識 2.2 策略模式 2.2.1 策略模式的概念 2.2.2 工作原理 2.2 自定義日志系統的實現 3. 線程池設計 3.1 簡單線程池的設計 3.2 線程安全的單例模式線程池的設計 3…

量子力學:量子通信

量子通信是利用量子力學原理對信息進行編碼、傳輸和處理的新型通信方式&#xff0c;以下是其詳細介紹及業界發展現狀&#xff1a; 基本原理 量子疊加態 &#xff1a;量子系統可以處于多個狀態的疊加&#xff0c;如光子的偏振方向可以同時處于水平和垂直方向的疊加態&#xff…

企業架構之旅(1):TOGAF 基礎入門

大家好&#xff0c;我是沛哥兒。今天我們簡單聊下TOGAF哈。 文章目錄 一、TOGAF 是什么定義與核心定位發展歷程與行業地位與其他架構框架的區別 二、TOGAF 核心價值企業數字化轉型助力業務與 IT 的協同作用降本增效與風險管控 三、TOGAF 基礎術語解析架構域&#xff08;業務、…

CSS 內容超出顯示省略號

CSS 內容超出顯示省略號 文章目錄 CSS 內容超出顯示省略號**1. 單行文本省略&#xff08;常用&#xff09;****2. 多行文本省略&#xff08;如 2 行&#xff09;****3. 對非塊級元素生效****完整示例****注意事項** 在 CSS 中實現內容超出顯示省略號&#xff0c;主要通過控制文…

路由器重分發(OSPF+RIP),RIP充當翻譯官,OSPF充當翻譯官

路由器重分發&#xff08;OSPFRIP&#xff09; 版本 1 RIP充當翻譯官 OSPF路由器只會OSPF語言&#xff1b;RIP路由器充當翻譯官就要會OSPF語言和RIP語言&#xff1b;則在RIP中還需要將OSPF翻譯成RIPOSPF 把RIP路由器當成翻譯官&#xff0c;OSPF路由器就只需要宣告自己的ip&am…

AlexNet網絡搭建

AlexNet網絡模型搭建 環境準備 首先在某個盤符下創建一個文件夾&#xff0c;就叫AlexNet吧&#xff0c;用來存放源代碼。 然后新建一個python文件&#xff0c;就叫plot.py吧&#xff0c;往里面寫入以下代碼&#xff0c;用于下載數據集&#xff1a; # FashionMNIST里面包含了…

【計算機網絡】網絡基礎概念

&#x1f4da; 博主的專欄 &#x1f427; Linux | &#x1f5a5;? C | &#x1f4ca; 數據結構 | &#x1f4a1;C 算法 | &#x1f152; C 語言 | &#x1f310; 計算機網絡 這是博主計算機網絡的第一篇文章&#xff0c;本文由于是基礎概念了解&#xff0c;引用了大…

在Spring Boot項目中實現Word轉PDF并預覽

在Spring Boot項目中實現Word轉PDF并進行前端網頁預覽&#xff0c;你可以使用Apache POI來讀取Word文件&#xff0c;iText或Apache PDFBox來生成PDF文件&#xff0c;然后通過Spring Boot控制器提供文件下載或預覽鏈接。以下是一個示例實現步驟和代碼&#xff1a; 1. 添加依賴 …