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 项目开发流程

MCP Server 开发配置(以 Python SDK 为例):
🔴搭建开发环境: 安装 uv 包管理工具,确保 Python 3.10+, MCP Python SDK 1.2.0+
项目初始化:创建和激活 Python 虚拟环境,安装依赖包
开发 MCP Server :导入 FastMCP httpx ,使用异步通信开发服务器
调试 MCP Server :启动并查看 MCP Hosts 是否能正常通信。
MCP Hosts 开发配置(以 VS Code + CLINE 为例):
🔵安装 CLINE 插件
配置 MCP Client 并检查是否能发现对应 MCP Server
• MCP Hosts 大模型及关键参数配置
使用 CLINE 任务功能调试 大模型与 MCP Server 运行情况
2.2.1MCP Server 开发环境搭建(MacOS/Linux
1. 安装 uv 包管理器
打开终端,运⾏以下命令(uv 是⼀个极速的 Python 包管理器。)
curl -LsSf https://astral.sh/uv/install.sh | sh
注意: 安装完成后,请务必 重启终端 ,以确保 uv 命令能够被系统识别。
2. 创建并设置 MCP 项⽬
# 为项目创建一个名为 weather 的新目录
uv init weather
cd weather
# 创建并激活虚拟环境 ( 用于隔离项目依赖 )
uv venv
source .venv/bin/activate
# 安装项目所需的依赖包
uv add "mcp[cli]" httpx
# 创建 MCP 服务器代码文件
touch weather.py
2.2.2 MCP Server 开发环境搭建(Windows
1. 安装 uv 包管理器
打开 PowerShell ,运⾏以下命令来安装 uv。
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
注意: 安装完成后,请务必 重启终端 PowerShell CMD ),以确保 uv 命令能够被系统识别。
2. 创建并设置 MCP 项⽬
# 为项目创建一个名为 weather 的新目录
uv init weather
cd weather
# 创建并激活虚拟环境 ( 用于隔离项目依赖)
uv venv
.venv\Scripts\activate
# 安装项目所需的依赖包
uv add mcp[cli] httpx
# 创建 MCP 服务器代码文件
new-item weather.py

2.3开发 MCP 天气查询服务器

🔴使⽤ Python 和 FastMCP 库,构建⼀个能让⼤模型查询实时天⽓的 MCP 服务器。
🟢核⼼功能:利⽤ httpx 异步调⽤美国国家⽓象局 (NWS) API,提供两个⼯具:get_alerts(根据州名获取天⽓预警和 get_forecast(根据经纬度获取天⽓预报)。
🔵开发流程:⾸先初始化 FastMCP 服务器,然后定义上述两个 async 函数,并使⽤ @mcp.tool() 装饰器将其注册为可调⽤⼯具。最后,通过 mcp.run() 启动服务器,使其能通过标准协议(如 stdio)接收并处理⼯具调⽤请求。
🔴技术栈:
语⾔/框架: Python, FastMCP
HTTP 请求: httpx (异步)
数据源: 美国国家⽓象局 (NWS) API
🔵核⼼实现:
定义⼯具 (Tools): 创建两个 async 函数:get_alerts 和 get_forecast。
注册⼯具: 使⽤ @mcp.tool() 装饰器将函数注册为 MCP 可调⽤⼯具。
启动服务: 调⽤ mcp.run() 启动服务器,监听外部调⽤请求。
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 天气查询应用实战

🔵天气查询应用:宿主进程选择
🔴官方 MCP Client 示例:https://modelcontextprotocol.io/clients
🔵CLINE 官网
🔴CLINE 插件(VS Code
🟢CLINE 配置 MCP Servers

🟣Weather MCP Server 与 MCP Client 配置

🟢CLINE 客户端配置

🔴使用 VS Code + CLINE 作为 MCP Host 体验天气查询应用

🔴实战: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 开发与调试行程规划助手

🔴回顾:Cherry Studio MCP Servers 配置方式
🟡对比:CLINE 配置 MCP Servers
🟣12306 MCP Servers:获取长期有效链接

🟢注册 OpenWeather 获取 API Key

🟣魔塔托管的 Weather MCP Servers:获取长期有效链接
🟢CLINE 启动新配置的 MCP Servers
🟡使用 CLINE 查看 MCP Servers 所有接口

MCP 架构回顾:遵循 C/S 架构与多对一 总线 设计
🔴主机 (Host) 是发起连接的 LLM 应用程序(如 Claude Desktop IDE )。
🟡客户端 (Client) 与服务器保持 1:1 连接,位于主机应用程序内部。
🟢服务器 (Server) 向客户端提供上下文 (Resources) 、工具 (Tools) 和提示 (Prompts)
MCP 协议层与通信层的协同设计
🔴协议层就像写信的规则(信封格式 / 邮政编码), 传输层 则是邮局的运输方式(航空信 / 快递)。
协议层(上层)
🟡职责:定义通信的 " 语言规则 "
🟣消息 结构化封装 JSON-RPC 2.0
请求 - 响应 的生命周期管理
🟢核心类:Protocol, Client, Server
功能 :处理消息帧、请求 / 响应 链接 和 高级通信模式(面向应用)
🔴TypeScript:
🟢Python:
传输层(下层)
🟡处理客户端与服务器之间的实际通信(面向网络),所有传输都使用 JSON-RPC 2.0 交换消息。
MCP 支持 2 种传输机制:
1. 标准输入输出( Stdio
🔴使用标准输入 / 输出进行通信
2. 流式 HTTP Streamable HTTP
🟣 使用事件 ( Server-Sent Events, SSE) 进行流式传输
🔵使用HTTP POST 进行客户端到服务器的消息传递
最佳实践:
1. Stdio (本地通信)
🔴本地进程,对同机通信效率高,进程管理简单
2. SSE (远程通信)
🟡需要 HTTP 兼容性的场景,且安全性高(支持认证和授权)

四、MCP 完整生命周期管理

1. 初始化
客户端发送包含协议版本和能力的 initialize 请求
服务器响应其协议版本和能力
客户端发送 initialized 通知作为确认
开始正常消息交换
2. 消息交换(初始化后)支持以下模式:
请求 - 响应 :客户端或服务器发送请求,另一端响应
通知 :任一方发送单向消息
3. 终止(任一方都可以终止连接):
通过 close() 进行干净关闭
传输断开连接
错误条件

致谢

 谢谢大家的阅读,还有很多不足支出,欢迎大家在评论区指出,如果我的内容对你有帮助,可以点赞 , 收藏 ,大家的支持就是我坚持下去的动力!

“请赐予我平静,去接受我无法改变的 ;赐予我勇气,去改变我能改变的。”

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐