CSV数据分析工具

MCP CSV Analyzer是一款强大的CSV文件分析工具,支持加载CSV文件、执行Python代码进行数据分析、生成统计洞察、数据可视化以及通过Gmail API发送分析结果。

  • by dhaan-ish
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 dhaan-ish/csv-mcp-server

使用说明

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

安装

  1. 克隆或创建项目:
# If using uv (recommended)
uv init mcp-csv-analyzer
cd mcp-csv-analyzer
  1. 安装依赖项:
uv sync
  1. 配置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

此命令将:

  1. 检查Gmail OAuth令牌是否存在(token.json)
  2. 如果令牌不存在,请提供运行令牌生成器
  3. 在后台启动MCP服务器
  4. 启动基于Azure OpenAI的客户端
  5. 退出时优雅地关闭服务器

可用命令

完整的系统运行程序

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令牌生成器。

手动运行组件

如果您更喜欢单独运行组件进行开发或调试:

  1. 生成Gmail OAuth令牌 (一次性设置):

    uv run generate_token
    
  2. 启动MCP服务器:

    uv run mcp_server
    # Or directly:
    uv run python mcp_csv_analyzer/server.py
    
  3. 在另一个终端中,运行客户端:

    uv run mcp_client
    # Or directly:
    uv run python client/app.py
    

Gmail API设置

若要使用电子邮件发送功能,您需要设置Gmail API凭据:

1.创建Google云项目并启用Gmail API

  1. 首选 谷歌云控制台
  2. 创建新项目或选择现有项目
  3. 为您的项目启用Gmail API
  4. 创建OAuth 2.0凭据(桌面应用程序类型)
  5. 下载凭据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...

客户端自动:

  • 根据您的请求检测何时使用工具
  • 将多个工具链接在一起以完成复杂任务
  • 提供有关其正在做什么的明确反馈
  • 维护后续问题的对话上下文

加载和分析数据(直接使用工具)

  1. 加载CSV文件:
# Tool call: load_csv
{
    "file_path": "data/sales_data.csv",
    "encoding": "utf-8",
    "separator": ","
}
  1. 获取数据集信息:
# Tool call: get_dataset_info
{
    "dataset_name": "sales_data"
}
  1. 执行分析代码:
# 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()
"""
}
  1. 生成自动洞察:
# 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许可证下使用。

贡献

  1. 分叉存储库
  2. 创建要素分支
  3. 添加您的改进
  4. 提交拉取请求

支持

对于问题和疑问,请在项目存储库中创建问题。