使用说明
CSV分析器MCP服务器
一个轻量级的MCP服务器,它将CSV分析作为任何兼容MCP的客户端都可以调用的工具。
传递原始CSV内容,以JSON或Markdown格式返回结构化统计数据——行数、类型检测、空率、重复、分布、异常检测等。
什么是MCP?
这 模型上下文协议 是一个开放标准,允许AI助手调用外部工具。此服务器将CSV分析作为MCP工具公开,因此您可以向Claude询问以下问题 “分析此CSV并告诉我哪些列的空值最多” 或 “过滤收入>10000的行,然后分析结果” 并得到真实的计算结果。
特性
- 柱级分析 --类型检测、空率、唯一值、最小值/最大值/平均值/中值/标准差、四分位数、重复次数最多的值、日期范围
- 频率分布 --任何列的排序值计数(带百分比)
- 异常值检测 --所有数字列的IQR和z-score方法
- 行过滤 --按列条件和链过滤以进行进一步分析
- 数据预览 --在分析之前,将前N行作为Markdown表进行检查
- CSV比较 --按模式、行内容或两者区分两个文件
- 数据清理 --分析前可选的重复数据删除和空行删除
- 双输出格式 --结构化JSON用于编程,Markdown用于可读摘要
- 自定义分隔符 --逗号、分号、制表符、管道或任何分隔符
- 基于内容的 --接受原始CSV文本,而不是文件路径,使其安全并与远程环境兼容
安装
先决条件: Python≥3.12 紫外线
git clone https://github.com/juanmaalt/csv_analyzer_mcp_server.git
cd csv_analyzer_mcp_server
uv sync
连接到MCP客户端
克劳德桌面版
将以下内容添加到您的 claude_desktop_config.json
(通常在 ~/Library/Application Support/Claude/claude_desktop_config.json 在macOS上):
{
"mcpServers": {
"csv_analyzer": {
"command": "uv",
"args": [
"run",
"--directory",
"/absolute/path/to/csv_analyzer_mcp_server",
"python",
"main.py"
]
}
}
}
光标/VS代码(MCP扩展)
{
"mcp": {
"servers": {
"csv_analyzer": {
"command": "uv",
"args": [
"run",
"--directory",
"/absolute/path/to/csv_analyzer_mcp_server",
"python",
"main.py"
]
}
}
}
}
保存配置后重新启动客户端。所有工具都将出现在可用工具列表中。
可用工具
analyze_csv
CSV文件的完整统计分析。返回每列摘要,包括类型、空率、唯一计数和特定于类型的统计信息。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
csv_content |
str |
必需 | 完整的CSV文本内容(不是文件路径) |
delimiter |
str |
"," |
字符分隔值 |
remove_duplicates |
bool |
True |
在分析之前删除完全重复的行 |
remove_non_valid_data |
bool |
True |
在分析之前删除缺少/空字段的行 |
output_format |
str |
"json" |
"json" 或 "markdown" |
JSON输出结构:
{
"total_rows": 38,
"rows_removed": 2,
"columns": {
"age": {
"null_count": "N/A",
"null_percentage": "N/A",
"duplicate_count": "N/A",
"unique_values": 22,
"type": "int",
"min": 19,
"max": 74,
"avg": 43.5,
"median": 42.0,
"std": 14.2,
"q25": 31.0,
"q75": 57.0
},
"plan_type": {
"null_count": "N/A",
"null_percentage": "N/A",
"duplicate_count": "N/A",
"unique_values": 3,
"type": "string",
"most_repeated_value": "Premium",
"top_values": [
{"value": "Premium", "count": 18},
{"value": "Basic", "count": 12},
{"value": "Enterprise", "count": 8}
]
}
}
}
get_csv_preview
将CSV的前N行作为Markdown表返回。可用于在运行完整分析之前检查结构和值。不进行清洁。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
csv_content |
str |
必填 | 完整的CSV文本内容 |
delimiter |
str |
"," |
字符分隔值 |
n_rows |
int |
5 |
要返回的行数 |
输出示例:
| customer_id | age | plan_type | monthly_fee |
| --- | --- | --- | --- |
| 1001 | 34 | Premium | 49.99 |
| 1002 | 27 | Basic | 19.99 |
filter_csv
按列条件筛选行,并将结果作为CSV字符串返回。输出可以直接传递到 analyze_csv 或任何其他工具。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
csv_content |
str |
必填 | 完整的CSV文本内容 |
column |
str |
必填 | 要筛选的列名 |
operator |
str |
必填 | 以下之一: >, <, >=, <=, ==, !=, contains |
value |
str |
必需 | 要比较的值(自动转换为列类型) |
delimiter |
str |
"," |
字符分隔值 |
支持的操作员:
| 操作员 | 行为 |
|---|---|
> < >= <= |
数字比较 |
== != |
平等(适用于任何类型) |
contains |
字符串列上不区分大小写的子字符串匹配 |
get_column_distribution
返回特定列的排名频率表——每个值出现的次数以及它代表的行百分比。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
csv_content |
str |
必填 | 完整的CSV文本内容 |
column |
str |
必填 | 要分析的列名 |
delimiter |
str |
"," |
字符分隔值 |
top_n |
int |
10 |
要返回的最大值数 |
输出示例:
[
{"value": "Premium", "count": 18, "percentage": 45.0},
{"value": "Basic", "count": 12, "percentage": 30.0},
{"value": "Enterprise", "count": 8, "percentage": 20.0}
]
detect_outliers
使用IQR或z-score在数值列中查找具有异常值的行。返回带有列名、值和原因的标记行。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
csv_content |
str |
必填 | 完整的CSV文本内容 |
delimiter |
str |
"," |
字符分隔值 |
method |
str |
"iqr" |
"iqr" 或 "zscore" |
columns |
list[str] |
None |
要检查的特定列。如果省略,则选中所有数字列 |
方法:
iqr--标记外部值Q1 - 1.5 * IQR和Q3 + 1.5 * IQRzscore--标记值与平均值的偏差超过3个标准差
输出示例:
[
{"row_index": 4, "column": "monthly_fee", "value": 999.99, "reason": "outside IQR bounds [10.5, 89.3]"},
{"row_index": 21, "column": "age", "value": 3, "reason": "outside IQR bounds [22.0, 68.0]"}
]
compare_csvs
按架构(列差异)和/或行内容比较两个CSV文件。可用于检测同一数据集版本之间的变化。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
csv_content_a |
str |
必填 | 第一个文件的完整CSV文本内容 |
csv_content_b |
str |
必需 | 第二个文件的完整CSV文本内容 |
delimiter |
str |
"," |
两个文件中的字符分隔值 |
mode |
str |
"both" |
"schema", "rows",或 "both" |
输出示例(mode="both"):
{
"schema": {
"columns_only_in_a": ["notes"],
"columns_only_in_b": ["region"],
"common_columns": ["client", "revenue", "date"]
},
"rows": {
"total_rows_a": 25,
"total_rows_b": 28,
"rows_only_in_a": 4,
"rows_only_in_b": 7,
"common_rows": 21
}
}
作曲工具
工具被设计成用链条连接在一起。一些有用的模式:
# Preview first, then analyze
get_csv_preview → analyze_csv
# Filter a subset, then analyze it
filter_csv (churned == True) → analyze_csv
# Check distribution before deciding how to filter
get_column_distribution → filter_csv → analyze_csv
# Find outliers, then filter them out and re-analyze
detect_outliers → filter_csv (!= outlier_value) → analyze_csv
配置
设置从加载 .env 项目根目录下的文件:
| 变量 | 默认值 | 描述 |
|---|---|---|
MAX_ROWS_TO_ANALYZE |
500 |
每个请求处理的最大行数 |
DEFAULT_OUTPUT_FORMAT |
markdown |
回退输出格式 |
MAX_PREVIEW_ROWS |
10 |
摘要中的预览行数 |
NULL_THRESHOLD_WARNING |
0.3 |
零率,超过该值将显示警告 |
OUTLIER_STDDEV_CUTOFF |
3.0 |
异常检测的Z分数截止值 |
项目结构
csv_analyzer_mcp_server/
├── core/
│ ├── loader.py # CSV string → pandas DataFrame
│ ├── analyzer.py # Per-column statistics, distribution, outlier detection, comparison
│ ├── formatter.py # JSON / Markdown output, table preview
│ └── transformer.py # Column name normalization, row filtering
├── config/
│ └── settings.py # Environment-based configuration
├── data/ # Sample CSV files for testing
├── main.py # MCP server entry point — all tool definitions
├── pyproject.toml # Project metadata and dependencies
└── .env # Local configuration (not committed)
样品数据
包含三个示例CSV文件 data/ 用于测试:
| 文件 | 行 | 描述 |
|---|---|---|
sample_data_usage.csv |
40 | 电信客户使用情况(年龄、计划、数据、流失率) |
sample_heart_checks.csv |
40 | 医疗记录(胆固醇、血压、糖尿病、心脏病) |
sample_project_revenue.csv |
25 | 故意遗漏值的项目计费 |