使用说明
MCP CSV分析仪
MCP(模型上下文协议)服务器,提供强大的工具来读取CSV文件和执行LLM生成的Python代码,以从数据中提取有用的见解。
特性
- CSV文件加载:加载具有可自定义编码和分隔符的CSV文件
- 数据分析:执行Python代码进行全面的数据分析
- 统计洞察:自动生成基本统计见解
- 数据可视化:使用matplotlib、seaborn和plotly创建绘图和可视化
- 多数据集支持:同时处理多个数据集
- 安全代码执行:LLM生成的分析代码的安全执行环境
- 导出功能:以各种格式(CSV、Excel、JSON)导出处理后的数据
- 电子邮件集成:通过Gmail API发送分析结果
- Azure OpenAI客户端:由Azure OpenAI支持的交互式客户端,用于自然语言交互
可用工具
1. load_csv
将CSV文件加载到内存中进行分析。
- 参数:
file_path:CSV文件的路径encoding:文件编码(默认值:utf-8)separator:CSV分隔符(默认值:逗号)
2. list_datasets
列出当前加载的所有数据集及其基本信息。
3. get_dataset_info
获取特定数据集的详细信息,包括:
- 形状和柱
- 数据类型
- 缺失值
- 样本数据
- 统计摘要
4. execute_analysis_code
执行Python代码进行数据分析,并访问:
- 熊猫(
pd) - numpy(
np) - matplotlib(
plt) - 海运(
sns) - plotly(
go,px) - scipy.stats(
stats) - scikit学习组件
- 所有加载的数据集
5. generate_basic_insights
自动生成统计见解,包括:
- 数据集概述
- 数值列分析
- 分类列分析
- 相关分析
6. export_dataset
将数据集导出为各种格式的文件(CSV、Excel、JSON)。
7. clear_datasets
从内存中清除所有加载的数据集。
8. send_email
使用Gmail API发送带有附件的电子邮件。
- 参数:
to_email:收件人电子邮件地址(逗号分隔为多个)subject:电子邮件主题行body:电子邮件正文内容body_type:正文内容类型-“plain”或“html”(默认:plain)cc_emails:CC收件人(逗号分隔)[可选]bcc_emails:密件抄送收件人(逗号分隔)[可选]attachments:要附加的文件路径列表[可选]
项目结构
mcp-csv-analyzer/
├── mcp_csv_analyzer/ # MCP server implementation
│ ├── __init__.py
│ └── server.py # Main server with all tools
├── client/ # Azure OpenAI client
│ ├── __init__.py
│ └── app.py # Interactive client application
├── generate_token/ # Gmail OAuth token generator
│ ├── __init__.py
│ └── generate_oauth_token.py
├── scripts/ # Convenience runner scripts
│ ├── __init__.py
│ ├── run_mcp.py # Complete system runner
│ ├── run_server.py # Server runner
│ ├── run_client.py # Client runner
│ └── run_token_generator.py
├── pyproject.toml # Project configuration and dependencies
├── test_data.csv # Sample data file
└── README.md # This file
安装
- 克隆或创建项目:
# If using uv (recommended)
uv init mcp-csv-analyzer
cd mcp-csv-analyzer
- 安装依赖项:
uv sync
- 配置Azure OpenAI(用于客户端):
创建一个
.env使用您的Azure OpenAI凭据创建文件:
AZURE_OPENAI_ENDPOINT=https://your-resource-name.openai.azure.com/
AZURE_OPENAI_DEPLOYMENT=your-deployment-name
AZURE_OPENAI_API_KEY=your-api-key
AZURE_OPENAI_API_VERSION=2024-02-01
运行系统
快速入门(推荐)
运行整个系统的最简单方法是使用集成运行器:
uv run mcp
此命令将:
- 检查Gmail OAuth令牌是否存在(
token.json) - 如果令牌不存在,请提供运行令牌生成器
- 在后台启动MCP服务器
- 启动基于Azure OpenAI的客户端
- 退出时优雅地关闭服务器
可用命令
完整的系统运行程序
uv run mcp
运行具有自动令牌检查和服务器管理的完整MCP系统。
单个组件
仅限MCP服务器:
uv run mcp_server
仅启动提供所有数据分析工具的MCP CSV Analyzer服务器。
仅限MCP客户端:
uv run mcp_client
仅启动Azure OpenAI驱动的客户端。要求:
- MCP服务器将单独运行
- 在中配置的Azure OpenAI凭据
.env
生成OAuth令牌:
uv run generate_token
运行用于Gmail集成的OAuth令牌生成器。
手动运行组件
如果您更喜欢单独运行组件进行开发或调试:
-
生成Gmail OAuth令牌 (一次性设置):
uv run generate_token -
启动MCP服务器:
uv run mcp_server # Or directly: uv run python mcp_csv_analyzer/server.py -
在另一个终端中,运行客户端:
uv run mcp_client # Or directly: uv run python client/app.py
Gmail API设置
若要使用电子邮件发送功能,您需要设置Gmail API凭据:
1.创建Google云项目并启用Gmail API
- 首选 谷歌云控制台
- 创建新项目或选择现有项目
- 为您的项目启用Gmail API
- 创建OAuth 2.0凭据(桌面应用程序类型)
- 下载凭据JSON文件
2.生成OAuth令牌
运行令牌生成脚本:
uv run generate_token
或者使用特定的凭据文件:
uv run generate_token credentials.json
脚本将:
- 读取您的客户ID和客户机密(从文件或手动输入)
- 打开浏览器进行身份验证
- 生成OAuth令牌并将其保存到
token.json - 显示令牌信息以供验证
3.代币管理
- 令牌保存到
token.json默认情况下 - 令牌在一段时间后过期,但如果存在刷新令牌,则会自动刷新
- 保持令牌文件的安全,因为它提供了从您的帐户发送电子邮件的访问权限
- 您可以通过再次运行脚本随时重新生成令牌
使用示例
使用交互式客户端
当你奔跑时 uv run mcp 或 uv run mcp_client,您将进入一个交互式会话,您可以在其中使用自然语言分析数据:
You: Load the test_data.csv file and tell me what columns it has
Assistant: I'll help you load the test_data.csv file and show you its columns...
You: Create a histogram of the numeric columns
Assistant: I'll create histograms for the numeric columns in your dataset...
You: Calculate the correlation between all numeric variables
Assistant: I'll calculate and visualize the correlation matrix for all numeric variables...
You: Send me an email with the analysis results
Assistant: I'll prepare and send an email with the analysis results...
客户端自动:
- 根据您的请求检测何时使用工具
- 将多个工具链接在一起以完成复杂任务
- 提供有关其正在做什么的明确反馈
- 维护后续问题的对话上下文
加载和分析数据(直接使用工具)
- 加载CSV文件:
# Tool call: load_csv
{
"file_path": "data/sales_data.csv",
"encoding": "utf-8",
"separator": ","
}
- 获取数据集信息:
# Tool call: get_dataset_info
{
"dataset_name": "sales_data"
}
- 执行分析代码:
# Tool call: execute_analysis_code
{
"code": """
# Basic data exploration
print("Dataset shape:", df.shape)
print("\\nColumn info:")
print(df.info())
# Statistical summary
print("\\nStatistical summary:")
print(df.describe())
# Check for missing values
print("\\nMissing values:")
print(df.isnull().sum())
# Create a simple visualization
plt.figure(figsize=(10, 6))
if 'sales' in df.columns:
plt.hist(df['sales'], bins=30, alpha=0.7)
plt.title('Sales Distribution')
plt.xlabel('Sales Amount')
plt.ylabel('Frequency')
plt.show()
"""
}
- 生成自动洞察:
# Tool call: generate_basic_insights
{
"dataset_name": "sales_data"
}
高级分析示例
相关性分析:
# Tool call: execute_analysis_code
{
"code": """
# Correlation heatmap
import seaborn as sns
plt.figure(figsize=(12, 8))
correlation_matrix = df.select_dtypes(include=[np.number]).corr()
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', center=0)
plt.title('Correlation Heatmap')
plt.tight_layout()
plt.show()
"""
}
时间序列分析 (如果存在日期列):
# Tool call: execute_analysis_code
{
"code": """
# Convert date column and create time series plot
df['date'] = pd.to_datetime(df['date'])
df_sorted = df.sort_values('date')
plt.figure(figsize=(15, 6))
plt.plot(df_sorted['date'], df_sorted['sales'])
plt.title('Sales Over Time')
plt.xlabel('Date')
plt.ylabel('Sales')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
"""
}
机器学习分析:
# Tool call: execute_analysis_code
{
"code": """
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
# Prepare numeric data for clustering
numeric_cols = df.select_dtypes(include=[np.number]).columns
X = df[numeric_cols].dropna()
# Standardize the data
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# Perform K-means clustering
kmeans = KMeans(n_clusters=3, random_state=42)
clusters = kmeans.fit_predict(X_scaled)
# Visualize clusters (first two features)
plt.figure(figsize=(10, 6))
plt.scatter(X_scaled[:, 0], X_scaled[:, 1], c=clusters, cmap='viridis')
plt.title('K-means Clustering')
plt.xlabel(f'{numeric_cols[0]} (standardized)')
plt.ylabel(f'{numeric_cols[1]} (standardized)')
plt.colorbar()
plt.show()
print(f"Cluster distribution: {np.bincount(clusters)}")
"""
}
电子邮件功能示例
通过电子邮件发送分析结果:
# Tool call: send_email
{
"to_email": "recipient@example.com",
"subject": "Data Analysis Report - Sales Data",
"body": "Please find attached the analysis results for the sales data.\n\nKey findings:\n- Total revenue: $1.2M\n- Growth rate: 15%\n- Top performing category: Electronics",
"attachments": ["sales_analysis.pdf", "charts.png"]
}
向多个收件人发送HTML电子邮件:
# Tool call: send_email
{
"to_email": "team@example.com",
"subject": "Weekly Data Insights",
"body": "<h2>Weekly Report</h2><p>This week's <b>key metrics</b>:</p><ul><li>Orders: 1,234</li><li>Revenue: $45,678</li></ul>",
"body_type": "html",
"cc_emails": "manager@example.com",
"attachments": ["weekly_report.xlsx"]
}
自动报告工作流:
# First, generate analysis and export
# Tool call: execute_analysis_code
{
"code": """
# Generate comprehensive report
report_data = []
for dataset_name, df in loaded_datasets.items():
summary = {
'dataset': dataset_name,
'rows': len(df),
'columns': len(df.columns),
'numeric_mean': df.select_dtypes(include=[np.number]).mean().to_dict()
}
report_data.append(summary)
# Create visualization
plt.figure(figsize=(12, 6))
# ... create charts ...
plt.savefig('analysis_charts.png')
# Export summary
import json
with open('analysis_summary.json', 'w') as f:
json.dump(report_data, f, indent=2)
"""
}
# Then send the results
# Tool call: send_email
{
"to_email": "stakeholders@example.com",
"subject": "Automated Analysis Report",
"body": "Attached are the automated analysis results generated on " + datetime.now().strftime('%Y-%m-%d'),
"attachments": ["analysis_summary.json", "analysis_charts.png"]
}
依赖项
核心依赖关系
- 主控程序:模型上下文协议框架
- 熊猫:数据操作和分析
- 数值Python:数值计算
- matplotlib:基本绘图
- 海生:统计数据可视化
- 绘图:交互式绘图
- Scipy 的:科学计算
- scikit学习:机器学习库
- openpyxl:Excel文件支持
客户端依赖关系
- openai:客户端的Azure OpenAI SDK
- pydantic 的:用于工具集成的AI代理框架
- 富有的:交互式客户端的终端格式化
- python dotenv:环境变量管理
电子邮件集成
- 谷歌认证:谷歌身份验证
- 谷歌认证oauthlib:用于Google API的OAuth流
- googleapi-python客户端:Gmail API客户端
安全说明
- 代码执行是在受控环境中执行的
- 文件访问仅限于指定路径
- 执行代码无法访问网络
- 临时文件用于生成绘图
故障排除
常见问题
导入错误:
- 确保您已使用安装了该项目
uv sync - 检查所有依赖项是否已正确安装
客户端连接问题:
- 启动客户端之前,确保MCP服务器正在运行
- 检查您的Azure OpenAI凭据是否在中正确设置
.env - 验证服务器是否在端口8000上以SSE模式运行
OAuth令牌问题:
- 确保您已完成令牌生成过程
uv run generate_token - 检查一下
token.json存在于项目根目录中或mcp_csv_analyzer/目录 - 确保您的谷歌云项目已启用Gmail API
未找到脚本:
- 跑
uv sync确保所有项目脚本都已正确安装 - 使用
uv run <command>而不是直接运行脚本
服务器无法启动:
- 检查是否有其他进程正在使用端口8000
- 确保您有适当的权限为绘图创建临时文件
- 检查Python版本兼容性(需要Python 3.10+)
许可证
这个项目是开源的,可以在MIT许可证下使用。
贡献
- 分叉存储库
- 创建要素分支
- 添加您的改进
- 提交拉取请求
支持
对于问题和疑问,请在项目存储库中创建问题。
