【超详模型上下文协议(MCP)部署与开发实战】MCP 天气查询应用实战、基于 CLINE 开发与调试行程规划助手、Weather MCP Server 与 MCP Client 配置
本文介绍了MCP(模型上下文协议)作为连接大模型与工具资源的桥梁,详细解析了其开发流程。MCP采用C/S架构和三层设计,包含宿主进程、客户端和服务器三大核心角色,具备资源、工具和提示三大能力。文章以天气查询应用为例,展示了从环境搭建到服务器开发的完整过程,包括Python SDK使用、异步通信实现和工具注册方法。最后介绍了基于CLINE的调试方法,并阐述了MCP的协议层与传输层设计,以及完整的生命
MCP 作为连接大模型与各类工具、资源的桥梁,彻底解决了传统 AI 应用开发中 "模型孤岛" 的问题。本文将结合实战项目,从环境搭建、核心开发、调试部署到底层原理,全方位拆解 MCP 的开发流程,带你从零打造生产级 MCP 应用。
一、MCP 核心概念与技术架构
在动手开发前,我们首先需要理解 MCP 的核心设计理念。具体框架搭建可见笔者前面的文章:https://blog.csdn.net/2402_87515571/article/details/154367643?fromshare=blogdetail&sharetype=blogdetail&sharerId=154367643&sharerefer=PC&sharesource=2402_87515571&sharefrom=from_linkMCP 遵循 C/S 架构与多对一 "总线" 设计,通过三层架构实现大模型与外部系统的无缝通信:
1. 三大核心角色
🔴宿主进程(Host):作为容器与协调者,负责管理客户端实例、控制连接权限、执行安全策 略、协调 AI/LLM 集成,支持创建多个客户端。常见的 Host 有 VS Code + CLINE 插件、Claude Desktop 等。
🟡客户端(Client):由宿主创建,与服务器保持 1:1 对应关系,维护服务器连接、处理协议协商、双向路由消息、管理订阅通知机制,保持服务器间的安全边界。
🔵服务器(Server):提供专业化上下文与能力,通过 MCP 原语暴露资源(Resources)、工具(Tools)和提示(Prompts),可作为本地进程或远程服务独立运行。
2. MCP 三大核心能力
🔴Resources(资源):类文件数据,可供客户端读取,如 API 响应或文件内容。
🟡Tools(工具):可供 LLM 调用的函数,需经用户授权,是 MCP 应用的核心交互载体。
🔵Prompts(提示):预置场景化的提示模板,帮助用户快速完成特定任务。
二、MCP Server 开发与部署
2.1MCP 项目开发流程
2.2.1MCP Server 开发环境搭建(MacOS/Linux)
2.2.2 MCP Server 开发环境搭建(Windows)
2.3开发 MCP 天气查询服务器
from typing import Any
import httpx
from mcp.server.fastmcp import FastMCP
# 1. 初始化FastMCP服务器
# 创建一个名为"weather"的服务器实例,该名称用于识别工具集
mcp = FastMCP("weather")
# --- 常量定义 ---
# 美国国家气象局(NWS)API的基础URL
NWS_API_BASE = "https://api.weather.gov"
# 设置请求头中的User-Agent,公共API要求提供此信息以识别客户端
USER_AGENT = "weather-app/1.0"
# --- 辅助函数 ---
async def make_nws_request(url: str) -> dict[str, Any] | None:
"""
通用的异步函数,用于向NWS API发起请求并处理常见错误
Args:
url (str): 要请求的完整URL
Returns:
dict[str, Any] | None: 成功时返回解析后的JSON字典,失败时返回None
"""
headers = {
"User-Agent": USER_AGENT,
"Accept": "application/geo+json" # NWS API推荐的Accept头格式
}
# 使用httpx.AsyncClient执行异步HTTP GET请求
async with httpx.AsyncClient() as client:
try:
# 发起请求,设置30秒超时防止无限等待
response = await client.get(url, headers=headers, timeout=30.0)
# 触发4xx(客户端错误)或5xx(服务器错误)状态码异常
response.raise_for_status()
# 请求成功则返回JSON格式响应体
return response.json()
except Exception:
# 捕获所有可能异常(网络问题、超时、HTTP错误等),返回None
return None
def format_alert(feature: dict) -> str:
"""
将单个天气预警的JSON数据格式化为人类可读的字符串
Args:
feature (dict): 单个预警的原始JSON数据
Returns:
str: 格式化后的预警信息
"""
props = feature["properties"]
# 使用get()方法安全访问字典键,避免键不存在导致程序崩溃
return f"""
事件:{props.get('event', '未知')}
区域:{props.get('areaDesc', '未知')}
严重性:{props.get('severity', '未知')}
描述:{props.get('description', '无描述信息')}
指令:{props.get('instruction', '无具体指令')}
"""
# --- MCP工具定义 ---
@mcp.tool()
async def get_alerts(state: str) -> str:
"""
获取美国某个州当前生效的天气预警信息
该函数被@mcp.tool()装饰器标记,可被大模型作为工具调用
Args:
state (str): 两个字母的美国州代码(例如:CA, NY, TX)
Returns:
str: 格式化后的天气预警信息或提示文本
"""
# 构造请求特定州天气预警的URL
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:
"""
根据给定的经纬度获取天气预报
该函数被@mcp.tool()装饰器标记,可被大模型作为工具调用
Args:
latitude (float): 地点的纬度(例如:40.7128 对应纽约)
longitude (float): 地点的经度(例如:-74.0060 对应纽约)
Returns:
str: 格式化后的天气预报信息或提示文本
"""
# NWS API获取预报需要两步:先获取网格点信息,再获取具体预报
# 第一步:根据经纬度获取包含预报接口URL的网格点信息
points_url = f"{NWS_API_BASE}/points/{latitude},{longitude}"
points_data = await make_nws_request(points_url)
if not points_data:
return "无法获取该地点的预报数据。"
# 第二步:从网格点响应中提取实际的天气预报接口URL
forecast_url = points_data["properties"]["forecast"]
forecast_data = await make_nws_request(forecast_url)
# 第三步:请求并处理详细预报数据
if not forecast_data:
return "无法获取详细的预报信息。"
# 提取预报周期数据(默认返回多个时段预报)
periods = forecast_data["properties"]["periods"]
forecasts = []
# 遍历前5个预报周期(今天下午、今晚、明天等核心时段)
for period in periods[:5]:
forecast = f"""
{period['name']}:
温度:{period['temperature']} {period['temperatureUnit']}
风力:{period['windSpeed']} {period['windDirection']}
预报:{period['detailedForecast']}
"""
forecasts.append(forecast)
# 拼接所有时段预报并返回
return "\n---\n".join(forecasts)
# --- 启动服务器 ---
if __name__ == "__main__":
# 启动MCP服务器,监听外部工具调用请求(默认使用stdio协议)
mcp.run()
2.4 MCP 天气查询应用实战


🟣Weather MCP Server 与 MCP Client 配置





🔴实战:MCP 项目开发流程
MCP Server 开发配置(以 Python SDK 为例):
1.搭建开发环境: 安装 uv 包管理工具,确保 Python 3.10+, MCP Python SDK 1.2.0+
2.项目初始化:创建和激活 Python 虚拟环境,安装依赖包
3.开发 MCP Server:导入 FastMCP 和 httpx,使用异步通信开发服务器
4.调试 MCP Server:启动并查看 MCP Hosts 是否能正常通信。
🟣MCP Hosts 开发配置(以VS Code + CLINE 为例):
1.安装 CLINE 插件
2.配置 MCP Client 并检查是否能发现对应 MCP Server
3.MCP Hosts 大模型及关键参数配置
4.使用 CLINE 任务功能调试 大模型与 MCP Server 运行情况
三、基于 CLINE 开发与调试行程规划助手




四、MCP 完整生命周期管理

致谢
谢谢大家的阅读,还有很多不足支出,欢迎大家在评论区指出,如果我的内容对你有帮助,可以点赞 , 收藏 ,大家的支持就是我坚持下去的动力!
“请赐予我平静,去接受我无法改变的 ;赐予我勇气,去改变我能改变的。”

更多推荐


所有评论(0)