使用Claude Desktop快速体验MCP servers!
MCP简介
MCP(Model Context Protocol),模型上下文协议,是由美国科技公司Anthropic(Claude就是是由Anthropic公司打造的一系列高性能且智能的AI大语言模型)在2024年11月份开源的一项用于解决LLM与外部数据源和工具之间集成问题的标准化协议。更直白一些的说法就是,MCP为LLM应用标准化了手脚,让LLM可以根据需要获取一切可以连接的数据、直接执行一切可以连接的工具。
引入MCP后的变化[1]:
引入MCP后,核心变化在于如何连接数据和调用工具的方式。MCP定义了一套协议和规范,其中包括MCP的客户端(clients),这些客户端被包裹在AI应用中。而MCP服务器(Server)则与应用分离,如果需要在本地计算机上操作,则需在本地计算机上启动MCP服务器。这样,AI应用便可与服务器通过MCP协议(如JSON RPC)进行通信,以完成数据读取、文件操作等各种动作。
本篇文章是一篇基础且快速的MCP实践博文,因此暂不对MCP的概念、核心架构及其的提出对生成式AI应用发展的影响等做更多深入的介绍,感兴趣的朋友可以阅读以下好文自行学习了解:
[1] 因为Manus爆火的 Claude MCP,90%人的认知可能都是错的
MCP 快速上手(Quick Hands-On)
首先,去官网下载 Claude Desktop,然后我们按照 官方文档 提供给 MCP servers Developers的命令进行基于Python开发&运行 MCP servers环境的安装部署。
实践环境介绍:
机型 Apple M1 Pro
操作系统 macOS Sequoia version 15.5
- 打开终端,执行以下命令安装
uv
;
curl -LsSf https://astral.sh/uv/install.sh | sh
- 重启终端后,查看
uv
版本,验证uv
已成功安装;
uv --version
uv 0.7.12 (dc3fd4647 2025-06-06)
- 初始化一个名为weather的MCP server项目,该项目包含两个服务:获取美国某州的气象预警 & 获取指定经纬度的天气预报;
# 第一次初始化uv项目环境的话,需要使用--no-workspace(否则会报错),用于忽略父目录的 pyproject.toml,直接在 weather 目录下初始化环境
uv init --no-workspace weather
# 进入到执行上一步命令生成的项目目录
cd weather
# 创建 Python 虚拟环境(会在当前目录下生成 .venv 文件夹)
# 需要注意一点,如果你和我一样是使用miniconda进行多python环境的管理,请确保在Python3.10或更高版本的环境下执行以下命令
uv venv
# 激活虚拟环境
source .venv/bin/activate
# 安装 mcp(带 cli 工具)和 httpx 依赖包到当前虚拟环境
uv add "mcp[cli]" httpx
# 创建一个空的 weather.py 文件(用于编写你的 FastMCP 服务器代码)
touch weather.py
- 编辑
weather.py
文件,写入拷贝自 MCP 官方 github repo 的如下完整代码(为了方便大家更快熟悉代码,我请github copilot GPT-4.1给关键代码行加上了中文注释);
from typing import Any
import httpx
from mcp.server.fastmcp import FastMCP# 初始化 FastMCP 服务器,服务名为 weather
mcp = FastMCP("weather")# 常量:NWS API 基础地址和 User-Agent
NWS_API_BASE = "https://api.weather.gov"
USER_AGENT = "weather-app/1.0"# 异步请求 NWS API,带异常处理,返回字典或 None
async def make_nws_request(url: str) -> dict[str, Any] | None:"""向 NWS API 发起请求,异常时返回 None。"""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 None# 格式化单条气象预警信息为可读字符串
def format_alert(feature: dict) -> str:"""将单条预警 feature 格式化为可读字符串。"""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')}
"""# 工具函数:获取指定州的气象预警
@mcp.tool()
async def get_alerts(state: str) -> str:"""获取美国某州的气象预警。参数: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:"""获取指定位置的天气预报。参数:latitude - 纬度,longitude - 经度"""# 先获取该点的 forecast 网格接口points_url = f"{NWS_API_BASE}/points/{latitude},{longitude}"points_data = await make_nws_request(points_url)if not points_data:return "无法获取该位置的预报数据。"# 从 points 响应中获取 forecast 详细预报 URLforecast_url = points_data["properties"]["forecast"]forecast_data = await make_nws_request(forecast_url)if not forecast_data:return "无法获取详细预报信息。"# 格式化前 5 个时段的预报信息periods = forecast_data["properties"]["periods"]forecasts = []for period in periods[:5]: # 只显示最近 5 个时段forecast = f"""
{period['name']}:
Temperature: {period['temperature']}°{period['temperatureUnit']}
Wind: {period['windSpeed']} {period['windDirection']}
Forecast: {period['detailedForecast']}
"""forecasts.append(forecast)return "\n---\n".join(forecasts)if __name__ == "__main__":# 启动 FastMCP 服务器,使用 stdio 作为通信方式mcp.run(transport='stdio')
- 在第3步创建的虚拟Python环境下运行
weather.py
代码,若无异常输出,则可进行到下一步; - 打开下载的 Claude Desktop 应用,点击 settings -> Developer -> 点击左下方的 “Edit Config” 按钮;
- 编辑选中的
claude_desktop_config.json
文件,写入以下内容(注意,“command” 字段的值是uv
的路径,可通过which uv
获取;);
{"mcpServers": {"weather": {"command": "/Users/xxx/.local/bin/uv","args": ["--directory","/ABSOLUTE/PATH/TO/PARENT/FOLDER/weather","run","weather.py"]}}
}
-
写入保存后,重启 Claude Desktop 应用,在对话栏的左下角点击 “Search and tools” 图标,就可以看到识别成功的名为weather的MCP服务;
再点入进去就可以看到服务里包含的两个具体工具,get_alerts()
用于获取美国某州的气象预警 &get_forecast()
获取指定经纬度的天气预报;
-
我们来提问看看实际效果。
10.1 询问天气:How is the weather in Sacramento?
10.2 获取加利福尼亚州的天气预警:What are the current weather warnings for the state of California?
总体效果还是很不错的!
MCP servers对于实力强劲的LLM底座简直是如虎添翼,从此LLM有了标准化的手脚,可以做更多实际又落地、对各行各业有意义和价值的事!
话不多说,一起来探索吧~
MCP相关资源:
- 官方文档教程:https://modelcontextprotocol.io/introduction
- MCP 官方 servers repo: https://github.com/modelcontextprotocol/servers
- MCP官方文档之支持MCP集成的应用列表(MCP Clients):https://modelcontextprotocol.io/clients
- MCP Hub: https://github.com/ravitemer/mcp-hub
- Awesome MCP Clients