使用说明
数据分析MCP
来自单个自然语言请求的数据分析、预处理和可视化——用于LLM的MCP数据分析服务器
快速开始 · 演示 · 使用场景 · 案例研究 · 图表主题 · 刀具清单 · LLM集成指南
一览
| 60 专业工具·11个领域模块 | 5 可访问性验证图表主题 | 2 法学硕士后端(克劳德·OpenAI) |
| 58 测试· 4-方式CI矩阵 | 0-依赖性调色板验证器 | ~4.2K LOC(src/) |
一句话总结 --一个MCP服务器,通过分析一直接收CSV和自然语言请求→ 预处理→ 可视化→ 模型诊断。 LLM只决定调用哪个工具;服务器拥有每一个计算和每一个可访问性保证。 pytest强制执行色觉缺陷和对比度检查,因此服务器返回 经验证的图表,而不仅仅是漂亮的——这是核心区别。
特性
- 自动可视化 --任何CSV中的提要:自动检测列角色(数字/分类/日期时间/ID…),推荐合适的图表并说明原因,并当场呈现(
recommend_visualizations→plot_auto) - 图表主题系统 --5个主题:
modern(默认),dark,minimal,vibrant,classic对话中的一句话——“切换到黑暗”——重新设计了接下来的每张图表(set_chart_style) - 经过计算验证的调色板 --每个主题都通过了四次可访问性检查(OKLCH亮度带·色度底·3种色觉缺陷模拟下相邻对间距ΔE≥12·与背景的对比度为3:1), 由pytest执行验证器是纯Python(
palette_check.py)并在每次提交时在CI中运行 - 立即查看结果 --图表在对话中以MCP图像的形式内联显示(
view_chart),CLI会自动打开操作系统查看器和实时web结果库(data-analysis-viewer)实时监控输出 - 60种专业工具 --分析、预处理(缺失值/异常值/编码/缩放)、特征工程、静态和交互式可视化、组合和比较图、分布和数据质量诊断、假设检验、模型比较/评估/调整/诊断
- 韩国第一 --支持韩文列名和轴标签,内置韩文响应系统提示
- 对任何数据都安全 --空文件、所有NaN列、单类目标、高基数类别:边缘输入返回为明显错误而不是崩溃,因此LLM可以自行恢复
演示--分析→ 过程→ 可视化
这是实际的使用流程。用户用自然语言提问,LLM选择并调用MCP工具, 下面的每个数字和图表都是服务器实际返回的未经编辑的结果。
1.分析 --了解数据。
You: analyze house_price.csv
AI: 545 rows x 12 columns. 34 outliers (6.2%) detected in the price column.
[calls get_dataset_info, detect_outliers]
2.流程 --去除异常值,并在一张图像中比较前后。
You: remove the outliers and show me a before/after comparison
AI: Removed 34 rows. (545, 12) → (511, 12)
Here is the comparison chart — the tail above 1.3M on the left is gone on the right.
[calls remove_outliers → plot_before_after → view_chart, chart displayed inline]
plot_before_after 从磁盘中提取原始版本,从缓存中提取处理后的版本
在同一轴上并排放置,这样你就可以在一张图像中看到预处理发生了什么变化。
3.可视化 --对清理后的数据进行自动推荐并绘制出来。
You: recommend the best visualization and draw it
AI: The area-price correlation is the strongest at |r|=0.80 (0.33 before removal → 0.80 after).
Generated a scatter plot, colored by bedrooms.
[calls recommend_visualizations → plot_auto → view_chart, chart displayed inline]
预处理改变了可视化——仅去除异常值就提高了相关性 从0.33到0.80,图表直接显示了这一点。完整的MCP请求/响应JSON 本次对话的内容 docs/LLM_INTEGRATION.md.
图表主题
每个图表工具都会绘制活动主题。您可以在对话中切换
(set_chart_style)或者将其设置为服务器启动 MCP_CHART_THEME 环境变量。
| 深色 | 极简 | 鲜艳 |
|---|---|---|
| 主题 | 用途 |
|---|---|
modern (默认) |
平静的专业调色板、浅色网格、左对齐的标题 |
dark |
专门为深色表面重新计算的调色板——仪表板、对话 |
minimal |
静音,最小网格——报告、论文 |
vibrant |
高色度、强对比度——强调展示 |
classic |
matplotlib/plotly默认样式(遗留兼容性,未验证可访问性) |
每个调色板,除了 classic 在以下条件下,相邻槽之间保持ΔE≥25
色觉缺陷模拟(protan/deutan/tritan),每种颜色的对比度均为3:1
主题本身的背景。插槽 秩序本身就是一种安全机制 --它是由
穷举搜索以最大化最小相邻对ΔE,从而任意重新排序序列
颜色会使测试失败。当调色板需要8种以上的颜色时,答案不是
更多颜色,但可折叠成“其他”(fold_other)或小倍数
(plot_small_multiples).故意没有双轴(两个y轴)工具。
使用场景
60种工具闪闪发光 工作流,而不是孤立的电话。四种常见的流程, 使用工具链,LLM实际上在每一步都会调用。
1.在10分钟内理解一个不熟悉的数据集
"Can I trust this CSV? Walk me through it, structure to quality"
profile_dataset → plot_missingness (缺失是随机的还是结构性的?)→
find_duplicates → recommend_visualizations → 渲染顶部 plot_auto 挑选。
使命诊断是第一位的,因为 未知质量数据的图表是
似是而非的谎言超过5%的缺失,自动推荐列表会增加缺失
自行诊断。
2.构建报告和演示材料
"Make it minimal for a report, and summarize the top revenue drivers as a Pareto"
set_chart_style("minimal") → plot_pareto (有多少项目占80%?)→
plot_stacked_bar(normalize=True) (成分比较)→ stat_tile (英雄号码卡)→
将生成的PNG直接放入文档中。对于幻灯片,单个
set_chart_style("dark") 用深色表面调色板重新渲染相同的图表——每个
主题通过了CVD和对比度检查,因此 会议室里的投影仪和
色觉缺陷的同事都得到了相同的信息.
3.模型开发循环
"Build a churn model and tell me whether I should collect more data"
compare_models (基线)→ tune_hyperparameters →
plot_learning_curve (如果验证曲线仍在攀升,那么更多的数据就是答案)→
plot_roc_pr (不平衡,公关告诉真相)→ plot_calibration (前提条件
基于阈值的决策)→ 对于回归, plot_residuals (结构缺陷R²看不见)。
你最终得到的不是一个单一的准确数字,而是 一套证据
“为什么这个模型值得信赖”.
4.用一张图表回答一个商业问题
| 问题 | 唯一能回答它的工具 |
|---|---|
| “哪些渠道贡献了80%的收入?” | plot_pareto |
| “为什么总产量比上个季度下降了?” | plot_waterfall (按项目贡献细分) |
| “按地区×产品的平均单价?” | plot_pivot_heatmap |
| “去年与今年相比,每个分支机构都发生了什么变化?” | plot_slope |
| “本月只有一个关键指标” | stat_tile (当答案是一个数字时,不绘制图表是正确的选择) |
每个输出都可以 在对话中内联显示 与单一 view_chart 呼叫--
它返回MCP ImageContent(base64 PNG),因此像Claude Desktop/Code这样的多模式客户端会显示
无需打开文件即可立即得到结果(通过实际的stdio协议进行验证)。
案例研究——6章海事数据
工具如何在两个真实数据集上链接成一个分析故事:
这个 美国国家海洋和大气管理局NDBC 46042浮标 (蒙特利湾,2023年的47137次观测——自动下载
根据脚本)和 139 KMST(韩国海上安全法庭)判决 (捆绑)。每
下图是未经编辑的工具输出,通过一次运行复制
examples/maritime_case_study.py,每章都有注释
哪种设计规则介入以及为什么介入.
第1章·趋势——平滑不得隐藏数据
"Show me last year's wave-height trend. Clean up the noise but don't erase the raw data"
plot_rolling --所有12585个原始观测值都保留在背景中(静音灰色),仅
7天移动平均线为原色。1月至3月的风暴季节是一种趋势
而单个风暴尖峰永远不会消失。 设计规则:强调一种颜色,
为上下文而静音——颜色是层次结构。
第二章关系——过去一万点,散点图
plot_hexbin --与散点图相同的数据会折叠成一个斑点。编码密度
作为 顺序斜坡 (一种色调,浅色→dark)揭示了结构:波高方差
随着风力的增强而增长。 设计规则:用亮度编码连续量
一种色调,而不是多种色调。
第3章·分布——测试统计和视觉诊断是一组
test_normality (夏皮罗p≈0,不正常)+ plot_qq --测试只说“不是”;
Q-Q图显示 如何 它不是:在参考线上方逃逸的右端是
沉重的右尾——极端的波浪高度。对于设计载荷计算,该尾部为
整个要点。
第4章可预测性——两条曲线,而不是一个准确度数字
plot_learning_curve --根据风速、阵风、波浪周期和
压力给出了验证R²0.34,泛化差距为0.63。两条曲线
诊断它:“这些功能还不够,现在它正在记忆噪音。”
设计规则:不确定性(±1σ)作为光填充带,两个系列总是得到一个图例。
第5章·优先级和贡献——询问事故数据的两个问题
plot_pareto --前5种类型(伤亡、碰撞、火灾/爆炸、接地、接触)
占判决的80%。酒吧(个人股)和累计线共享a
单%轴 --没有双轴。 plot_waterfall --分解201个月
按类型分列:碰撞(+52)和伤亡(+47)各占一半。
设计规则:在每个条上直接贴标签;+/-取调色板颜色1和2。
第6章·当答案是一个数字时
stat_tile --“去年最大波高是多少?”的答案是数字
8.18米,不是图表。 设计规则:不画不需要画的东西也是
可视化决策。
# Full reproduction (buoy data auto-downloads once, ~4MB)
python examples/maritime_case_study.py
快速开始
git clone https://github.com/chaeminyoon/Data-Analyze-MCP.git
cd Data-Analyze-MCP
pip install -e . # installs server + client + viewer
python generate_all_test_data.py # generate 3 demo datasets (optional)
克劳德桌面/克劳德代码
claude_desktop_config.json 或 .mcp.json:
{
"mcpServers": {
"data-analysis": {
"command": "data-analysis"
}
}
}
然后和克劳德谈谈: “分析house_price.csv,删除异常值,然后将其可视化” --图表出现在对话中。
OpenAI API(捆绑客户端)
export OPENAI_API_KEY=sk-... MODEL_NAME=gpt-4o-mini
python data_client.py
在每个回合结束时,新的图表会在操作系统默认查看器中自动打开
(禁用 AUTO_OPEN_RESULTS=0).
实时结果库
data-analysis-viewer # http://127.0.0.1:8400
在分析旁边保持打开状态,生成的输出每3秒刷新一次。 PNG渲染为网格;交互式Plotly HTML在新选项卡中打开。没有额外的依赖关系。
MCP服务器工具(共60个)
Exploration & Profiling (4) — understand the data
| 工具 | 说明 |
|---|---|
get_dataset_info |
基本数据集信息(形状、数据类型、缺失值) |
profile_dataset |
综合分析(统计、相关性、分布) |
detect_data_types |
自动列角色分类(数字/分类/日期时间/ID/文本) |
find_duplicates |
检测并计数重复行 |
Preprocessing (5) — clean
| 工具 | 说明 |
|---|---|
handle_missing_values |
缺失值处理(平均值、中位数、众数、下降值、ffill) |
detect_outliers |
异常检测(IQR、Z评分) |
remove_outliers |
异常值移除(全部检测到) |
encode_categorical |
分类编码(标签,一次性) |
scale_features |
缩放比例(标准、最小、最大) |
Feature Engineering (3) — create features
| 工具 | 说明 |
|---|---|
create_derived_feature |
基于公式的导出列(df.eval) |
create_polynomial_features |
多项式和交互特征 |
extract_datetime_features |
日期时间特征(年、月、星期几等) |
Auto Visualization (2) — automatic recommendation & rendering
| 工具 | 说明 |
|---|---|
recommend_visualizations |
自动分析数据→ 合理的图表推荐+可执行工具call |
plot_auto |
自动选择并呈现1-3列(或无列)的图表(interactive 支持) |
数字的→直方图·分类→bar·数字×数字→分散·数字×分类(≤8级)→箱线图· 数字×分类(9-16级)→小倍数·日期时间×数字→直线·分类×分类→交叉表· +分类→色调/分组。推荐列表自动包含时间×构成→面积图, 当缺失值超过5%时,进行缺失诊断。
Chart Style (2) — design themes
| 工具 | 说明 |
|---|---|
list_chart_styles |
可用主题和当前主题 |
set_chart_style |
切换每个后续图表的设计(现代/黑暗/极简/活力/经典) |
Visualization (15) — static PNG + interactive HTML
| 工具 | 说明 |
|---|---|
plot_histogram / plot_boxplot / plot_scatter |
可定制的基本图表 |
plot_before_after |
在共享轴上并排预处理之前/之后(直方图/箱线图) |
plot_line |
时间序列线(分组、重采样、采样), interactive) |
plot_rolling |
原始系列(静音)+移动平均线(主要)——内部噪声趋势 |
plot_bar |
分类频率/聚合条(top_n, interactive) |
plot_correlation_heatmap |
相关热图(发散斜坡) |
plot_pivot_heatmap |
类别×类别×数字汇总热图——不是“多少”,而是“多少” |
plot_hexbin |
密度hexbin——数万个点涂抹散点图时的替代品 |
analyze_target_distribution |
目标分布+不平衡检测 |
plot_interactive_scatter/histogram/boxplot/heatmap |
绘图HTML(缩放和悬停) |
Composition & Comparison (6)
| 工具 | 说明 |
|---|---|
plot_stacked_bar |
堆叠的棒材(100%标准化,9级以上的“其他”折叠,分段间隙) |
plot_area |
堆叠面积——总面积和随时间变化的组成(支持重新采样) |
plot_slope |
斜率图——每个项目在两个时间点之间的变化,两端直接标记 |
plot_small_multiples |
小倍数——共享轴上每个类别的迷你图表(拆分而不是颜色循环) |
plot_pareto |
Pareto——有多少项构成80%,单轴(无双轴) |
plot_waterfall |
瀑布——每个项目对总变化的贡献(+/-颜色,直接标签) |
Distribution & Data Quality (5) — distribution & quality diagnostics
| 工具 | 说明 |
|---|---|
plot_ecdf |
经验CDF——读取直方图隐藏的确切百分位数 |
plot_violin |
小提琴——暴露箱图隐藏的双峰形状(内置四分位数) |
plot_missingness |
2-面板缺失诊断——每列速率+行序矩阵(结构间隙) |
plot_qq |
Q-Q图——视觉伴侣 test_normality (斜尾和重尾诊断) |
stat_tile |
英雄数字图块——当答案是一个数字时,使用的卡片而不是图表 |
Machine Learning (8) — modeling & diagnostics
| 工具 | 说明 |
|---|---|
compare_models |
RandomForest/XGBoost/逻辑回归/线性比较 |
evaluate_model |
混淆矩阵、特征重要性、详细指标 |
tune_hyperparameters GridSearchCV/随机化搜索CV |
|
plot_roc_pr |
ROC+PR曲线并排(避免了不平衡数据上的ROC错觉,多类OvR) |
plot_calibration |
校准曲线——概率是真实的吗?(阈值决策的前提条件) |
plot_feature_importance |
重要性/ |
plot_residuals |
残差与预测值+残差分布——结构缺陷R²看不见 |
Statistical Analysis (6) — hypothesis testing
| 工具 | 说明 |
|---|---|
calculate_correlation |
皮尔森/斯皮尔曼/肯德尔 |
test_normality |
Shapiro-Wilk正态性检验 |
test_ttest / test_anova |
组均值比较 |
test_chi_square |
类别独立性测试 |
calculate_confidence_interval |
平均值的置信区间 |
Data & Results Management (4) — cache & outputs
| 工具 | 说明 |
|---|---|
list_cached_datasets / clear_cache |
内存数据集缓存管理 |
view_chart |
在对话中内联显示图表(MCP图像内容) |
list_outputs |
列出生成的输出(最新的优先) |
建筑学
graph LR
classDef blue fill:#e1f5fe,stroke:#01579b,stroke-width:2px
classDef purple fill:#f3e5f5,stroke:#4a148c,stroke-width:2px
classDef orange fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef green fill:#e8f5e9,stroke:#1b5e20,stroke-width:2px
classDef gray fill:#fafafa,stroke:#333,stroke-width:2px
User((User))
subgraph Client [Client Layer]
Agent[Claude or<br/>LangGraph Agent]
end
LLM[LLM Engine<br/>Claude / OpenAI]
subgraph MCPLayer [MCP Server]
Server[FastMCP<br/>60 Tools]
Theme[Chart<br/>Themes]
Cache[Dataset<br/>Cache]
end
Files[(CSV · PNG · HTML)]
Viewer[Results Gallery<br/>:8400]
User <-->|natural language| Agent
Agent <-->|prompt/response| LLM
Agent <-->|MCP tools/call| Server
Server <--> Cache
Server <--> Theme
Server <-->|read/write| Files
Files -->|live refresh| Viewer
Viewer --> User
class User gray
class Agent blue
class LLM orange
class Server,Cache,Theme purple
class Files,Viewer green
分工:LLM只决定 使用哪个工具调用哪个参数;每一个实际
计算(panda/sklearn/matplotlib)在服务器上运行。无效输入返回为 isError
有一个明确的信息,所以LLM会自我纠正。
工程亮点
这 设计决策 在功能列表后面。每个项目不是“建造了什么”,而是“为什么这样决定”。
- 可访问性降低到计算 --“这个颜色漂亮吗”是主观的,但“色觉缺陷的同事能把这两个系列区分开吗”是可计算的。
palette_check.py实现sRGB→OKLab(Ottosson)、CIELAB(D65)、Machado 2009 CVD矩阵和WCAG相对亮度 直接来自已发布的公式,无外部依赖每个调色板必须通过的四个检查(亮度带、色度底、相邻对CVDΔE、3:1背景对比度)由pytest在每次提交时强制执行。 - 调色板顺序本身就是一种安全机制 --系列颜色是按照插槽顺序分配的,该顺序不是任意的:它是由 穷举搜索以最大化最小相邻对CVD距离 (
theming.py).随意重新排序颜色会破坏可访问性测试——错误不会悄无声息地通过。 - 从结构上阻止了“添加更多颜色”的诱惑 --当需要8种以上的颜色时,解决方案是折叠成“其他”(
fold_other)或小倍数(plot_small_multiples)没有更多的颜色。有 故意不使用双轴(两个y轴)工具 --甚至帕累托也绘制在一个百分比轴上。如果该工具不存在,则不会出现坏图表。 - 自动可视化是一个规则引擎 —
recommend_visualizations对列角色进行分类(数字/分类/日期时间/ID),根据确定性规则选择图表,并返回 **可执行tool_call**数据的形状决定了图表,而不是LLM的直觉。当缺失值超过5%时,会自动在建议中插入缺失诊断。 - 边缘输入上的恢复而不是崩溃 --空文件、所有NaN列、单类目标、高基数类别:这些都不会杀死服务器。他们回来了
isError+这是一个明确的信息,以便LLM选择自己的下一个工具。专用边缘机箱套件(test_edge_cases.py)防止倒退。 - 可选依赖关系的优雅降级 --没有
xgboost,compare_models继续使用其余型号,只有在明确请求XGBoost时才会出现明显错误(ml.py).安装环境永远不会停止服务器。 - 通过三种途径暴露的结果 --MCP
ImageContent(base64 PNG)内联用于多模式客户端,CLI自动打开操作系统查看器,以及3秒滚动的网络库(:8400).无论客户是谁,用户都会立即看到结果。
质量·检测
显示这一点的部分是 维护代码,而不是投资组合代码。
- 4路CI矩阵 python
3.11/3.12×熊猫2.2/3.0横向奔跑(ci.yml).pandas 2和3的字符串数据类型不同(object对str),因此两者都必须保持绿色,以捕捉字符串处理回归。 - 58次测试·绒毛 --涵盖可视化、预处理、ML/统计、自动推荐、调色板、边缘案例和服务器/结果。无头渲染也通过以下方式进行验证
MPLBACKEND=Agg. - 可访问性作为CI门 --上述四个调色板检查是测试套件的一部分,因此涉及颜色的提交在未通过的情况下无法合并。
- 基于公关的发展 --特征以分支形式着陆→PR→合并(
feat/chart-themes,feat/tests-ci-license, …).历史一次读一个特征。 - 可复制的人工制品 --本自述中的每个演示和案例研究图像都是 未经编辑的工具输出 来自
scripts/generate_demo_images.py和examples/maritime_case_study.py。没有手绘模型。
pip install -e ".[dev]"
ruff check src tests
pytest -q
项目结构
Expand
Data-Analyze-MCP/
├── src/data_analysis/ # MCP server package (python -m data_analysis)
│ ├── server.py # shared FastMCP instance + theme initialization
│ ├── theming.py # chart theme system (5 presets + sequential/diverging ramps)
│ ├── palette_check.py # palette accessibility validator (OKLCH·CVD·WCAG, zero deps)
│ ├── viewer.py # results gallery web UI (:8400)
│ ├── config.py # environment-variable configuration
│ ├── cache.py / helpers.py # dataset cache · shared helpers · mark specs
│ ├── fonts.py / prompts.py # Korean fonts · system prompts
│ └── tools/ # 60 tools by domain
│ ├── exploration.py ├── preprocessing.py
│ ├── feature_engineering.py ├── visualization.py
│ ├── composition.py ├── distribution.py
│ ├── auto_viz.py ├── style.py
│ ├── results.py ├── ml.py
│ └── statistics.py
├── data_client.py # LangGraph conversational client (OpenAI)
├── examples/demo_session.py # LLM-MCP session replay script
├── examples/maritime_case_study.py # reproduces the 6-chapter maritime case study (auto-downloads NDBC)
├── docs/LLM_INTEGRATION.md # integration guide with captured real I/O
├── scripts/generate_demo_images.py # regenerates README demo images (unedited tool output)
├── generate_all_test_data.py # generator for the 3 demo datasets
└── pyproject.toml # src-layout package (pip install -e .)
配置
| 环境变量 | 默认值 | 描述 |
|---|---|---|
MCP_CHART_THEME |
modern |
创业时的图表主题(现代/黑暗/极简/充满活力/经典) |
MCP_OUTPUT_DIR |
outputs/ |
保存图表和导出的位置 |
MODEL_NAME |
gpt-4o-mini |
捆绑客户端的型号ID |
AUTO_OPEN_RESULTS |
1 |
从CLI自动打开结果(0=关闭) |
MCP_CLASSIFICATION_MAX_UNIQUE |
10 |
分类/回归决策阈值 |
文档
- LLM集成指南 --Claude/OpenAI设置+捕获的4轮会话的完整MCP JSON
- 会话重放 -准确地重新运行记录的I/O,不需要API密钥
- 海事案例研究 --再现了6章案例研究的所有图表(真实的NDBC和KMST数据)
Python 3.11+ · FastMCP · pandas / scikit-learn / matplotlib / seaborn / plotly · 3 demo datasets included
