
MCP开发从入门到实战,少走99%弯路
模型上下文协议(Model Context Protocol,MCP)正在彻底改变我们与人工智能的交互方式,它让从数据科学家到业余爱好者的每个人都能轻松地为 AI 助手接入真实世界的数据,从而大幅提升其能力。举个例子,你可以像和同事聊天一样与 AI 对话,毫不费力地让它深入分析复杂数据集、发现隐藏模式、进行数值计算,甚至实时抓取网络上的市场趋势——整个过程自然流畅,就像普通对话一样。MCP 就像一个通用连接器,弥合了现代 AI 模型强大能力与动态变化的数据世界之间的鸿沟。无论是分析销售数据、预测趋势,还是探索实时洞察,MCP 都能把 AI 转变成一个强大的数据伙伴,它不仅能对话,更能真正理解并交互与你关心的重要信息。这个协议正在开启智能、上下文感知助手的新纪元,它们不再只是生成文本,而是能够推理、计算,并交付符合你需求的可执行结果。
什么是 MCP 服务器?
MCP 服务器就像一座桥梁,把 AI 模型(如 Claude 或 GPT)与您的数据或工具连接起来。它允许 AI 通过标准化协议访问数据集、执行计算或获取外部数据。你可以把它想象成 AI 的 USB-C 接口——它把数据科学的工作流与 AI 连接,使其功能远超文本生成。
对于数据科学家来说,MCP 服务器可以:
- 读取并总结数据集(例如 CSV 文件)。
- 计算统计量(如均值、中位数或标准差)。
- 从 API 获取实时数据(如股票价格或天气)。
- 基于数据生成洞察或可视化结果。
我们将在本文创建一个基于 Python 的 MCP 服务器,它可以:
- 读取包含销售数据的 CSV 文件。
- 提供计算统计量的工具(均值、中位数、标准差)。
- 使用 Alpha Vantage API 获取实时股票价格。
- 连接到 Claude Desktop,让你能与数据进行对话。
以下是高层次的工作流图:
设置开发环境
步骤 1:安装 Python
确保已安装 Python 3.10 或更高版本。检查方式:
python --version
步骤 2:安装 uv
uv 是一个轻量级的 Python 包管理器。安装方法:
Mac/Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
Windows
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
安装完成后,重启终端以确保 uv
命令可用。
步骤 3:创建项目目录
创建一个项目文件夹,并设置虚拟环境:
mkdir data_science_mcp
cd data_science_mcp
uv init data_science_mcp
uv venv
source .venv/bin/activate # Mac/Linux
.venv\Scripts\activate # Windows
步骤 4:安装依赖
创建一个 requirements.txt
文件,列出依赖:
mcp[cli]>=1.4.0
pandas>=2.0.0
httpx>=0.23.0
python-dotenv>=1.0.0
安装依赖:
uv pip install -r requirements.txt
步骤 5:获取 Alpha Vantage API Key
在 Alpha Vantage 注册并获取免费的 API key(每天 25 次请求)。将其保存到项目根目录下的 .env
文件:
ALPHA_VANTAGE_API_KEY=your_api_key_here
步骤 6:准备示例数据集
创建一个 data
文件夹,并添加一个示例 CSV 文件 sales_data.csv
:
product,category,price,quantity_sold
Laptop,Electronics,999.99,50
Phone,Electronics,499.99,120
T-Shirt,Clothing,19.99,200
Jeans,Clothing,49.99,80
这个数据集包含了产品的销售数据,我们将用它来做分析。
步骤 7:安装 Claude Desktop
从 Anthropic 官网 下载并安装 Claude Desktop。它支持 macOS 和 Windows(Linux 用户可以构建自定义 MCP 客户端)。
环境准备完成!
项目结构应如下
data_science_mcp/
├── .venv/
├── data/
│ └── sales_data.csv
├── .env
├── requirements.txt
构建 MCP 服务器
接下来我们来创建 MCP 服务器。我们将使用 FastMCP 库来定义数据分析和 API 调用的工具。
步骤 1:创建服务器文件
在项目根目录下创建 server.py
文件,写入以下代码:
import pandas as pd
import httpx
from mcp.server.fastmcp import FastMCP
from dotenv import load_dotenv
import os
# 加载环境变量
load_dotenv()
# 初始化 MCP 服务器
mcp = FastMCP("data_science_server")
# 加载示例数据集
DATA_PATH = "data/sales_data.csv"
df = pd.read_csv(DATA_PATH)
# 工具 1:获取数据集摘要
@mcp.tool()
def summarize_dataset() -> str:
"""总结数据集:行数、列数和列名。"""
rows, cols = df.shape
columns = ", ".join(df.columns)
return f"Dataset has {rows} rows and {cols} columns. Columns: {columns}"
# 工具 2:计算列均值
@mcp.tool()
def compute_mean(column: str) -> float:
"""计算数值列的均值。"""
if column not in df.columns:
return f"Error: Column '{column}' not found."
if not pd.api.types.is_numeric_dtype(df[column]):
return f"Error: Column '{column}' is not numeric."
return float(df[column].mean())
# 工具 3:计算列中位数
@mcp.tool()
def compute_median(column: str) -> float:
"""计算数值列的中位数。"""
if column not in df.columns:
return f"Error: Column '{column}' not found."
if not pd.api.types.is_numeric_dtype(df[column]):
return f"Error: Column '{column}' is not numeric."
return float(df[column].median())
# 工具 4:计算列标准差
@mcp.tool()
def compute_std(column: str) -> float:
"""计算数值列的标准差。"""
if column not in df.columns:
return f"Error: Column '{column}' not found."
if not pd.api.types.is_numeric_dtype(df[column]):
return f"Error: Column '{column}' is not numeric."
return float(df[column].std())
# 工具 5:获取股票价格
@mcp.tool()
async def get_stock_price(symbol: str) -> str:
"""获取指定股票代码的最新价格。"""
api_key = os.getenv("ALPHA_VANTAGE_API_KEY")
url = f"https://www.alphavantage.co/query?functinotallow=TIME_SERIES_INTRADAY&symbol={symbol}&interval=5min&apikey={api_key}"
async with httpx.AsyncClient() as client:
try:
response = await client.get(url)
response.raise_for_status()
data = response.json()
if "Time Series (5min)" not in data:
return f"Error: No data found for symbol '{symbol}'."
latest_time = list(data["Time Series (5min)"].keys())[0]
price = data["Time Series (5min)"][latest_time]["4. close"]
return f"Latest price for {symbol}: ${price}"
except httpx.HTTPError:
return f"Error: Failed to fetch stock price for '{symbol}'."
# 运行服务器
if __name__ == "__main__":
mcp.run(transport="stdio")
代码解释
- 导入:使用 pandas 处理数据,httpx 调用 API,FastMCP 创建 MCP 服务器,dotenv 管理环境变量。
- 服务器初始化:FastMCP("data_science_server")创建一个名为 “data_science_server” 的服务器。
- 加载数据集:读取 sales_data.csv 到 Pandas DataFrame。
- 工具:
summarize_dataset:返回行数、列数和列名。
compute_mean / compute_median / compute_std:计算数值列的基本统计量(如价格或销量)。
get_stock_price:异步获取实时股票价格(Alpha Vantage API)。
- 运行服务器:mcp.run(transport="stdio")启动服务器(STDIO 模式),适合本地与 Claude Desktop 测试。
步骤 2:配置 Claude Desktop
要将服务器连接到 Claude Desktop:
- 找到 Claude Desktop 的配置文件 claude_desktop_config.json(路径见官方文档)。
- 添加服务器配置:
{
"mcpServers": {
"data_science_server": {
"command": "/path/to/your/venv/bin/python",
"args": ["/path/to/data_science_mcp/server.py"]
}
}
}
将 /path/to/your/venv/bin/python
和 /path/to/data_science_mcp/server.py
替换为你本地的实际路径。
步骤 3:测试服务器
运行服务器:
uv run python server.py
打开 Claude Desktop。你应该能在可用工具中看到该服务器。如果显示绿色指示符(🟢),说明连接成功。
本文转载自PyTorch研习社,作者:南七无名士
