明智的披萨mcp
像热刀切披萨一样切开你的数据。
MCP服务器,用于包装 智慧披萨 库,让LLM在多维数据中找到最有趣的片段。加载CSV一次,然后通过模型上下文协议运行多次分析。
它做什么
明智的披萨会在你的数据中发现不寻常的片段,或者解释时间段之间的变化。此MCP服务器公开了四种分析方法:
- 解释级别 --查找平均值与全球平均值差异最大的细分市场
- 解释_变更_总计 --解释是什么导致了两个数据集之间总数的变化
- 解释平均变化 --解释是什么促使两个数据集之间的平均值发生变化
- 解释时间序列 --在面板数据中查找具有不同时间模式的片段
加上数据集管理工具,用于加载、列出和删除CSV数据。
先决条件
此服务器使用 紫外线 跑步。如果没有,请安装它:
curl -LsSf https://astral.sh/uv/install.sh | sh快速开始
使用uvx安装
添加到您的Claude桌面配置(~/.claude/claude_desktop_config.json):
{
"mcpServers": {
"wise-pizza": {
"command": "uvx",
"args": ["wise-pizza-mcp"]
}
}
}如果您使用Claude Code在这个仓库的克隆中工作,服务器将通过以下方式自动配置 .mcp.json --无需手动设置。
工具
load_data
将CSV文件加载到内存中的数据集存储中。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
file_path | string | yes | 磁盘上CSV文件的路径 |
dataset_name | string | yes | 引用此数据集的唯一名称 |
dims | list\[string\] | yes | 用作维度的列名(要分割的分类列) |
total_name | string | yes | 包含总计的列名(要分析的值) |
size_name | string | no | 包含段大小/权重的列名 |
例子:
Load the file /data/sales.csv as "sales_q1" with dimensions ["region", "product", "channel"],
total_name "revenue", and size_name "transactions"list_loaded_datasets
返回当前存储中所有数据集名称的列表。
remove_loaded_dataset
按名称从存储中删除数据集。
explain_levels
找出平均值与全局值差异最大的细分市场。非常适合回答:“此数据集中哪些片段不寻常?”
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
dataset_name | string | 必填 | 加载数据集的名称 |
max_segments | int | auto | 要查找的最大分段数 |
min_depth | int | 1 | 每段的最小尺寸 |
max_depth | int | 2 | 每段的最大尺寸 |
constrain_signs | bool | true | 强制分段权重与方向匹配 |
cluster_values | bool | false | 考虑具有相似维度值的集群 |
image_size | list\[int\] | none | \[width,height\]生成PNG图表 |
例子:
Run explain_levels on "sales_q1" with max_segments=5 and image_size=[1200, 600]explain_changes_in_totals
找到解释两个数据集总和差异的分段。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
dataset_name_1 | string | 必需 | 基线数据集 |
dataset_name_2 | string | 必填 | 比较数据集 |
max_segments | int | auto | 要查找的最大分段数 |
min_depth | int | 1 | 每段的最小尺寸 |
max_depth | int | 2 | 每段的最大尺寸 |
how | string | “totals” | “total”、“split_fits”、“extra_dim”或“force_dim” |
constrain_signs | bool | true | 强制分段权重与方向匹配 |
cluster_values | bool | false | 考虑具有相似维度值的集群 |
image_size | list\[int\] | none | \[width,height\]用于PNG图表 |
这 how 参数控制分解:
"totals"--分段总变化综合分析"split_fits"--分别分解大小变化与平均变化(回报SplitAnalysisResult)"extra_dim"--将规模/平均贡献视为额外维度"force_dim"--与extra_dim类似,但每个段都必须指定一个Change_from约束
explain_changes_in_totals example
explain_changes_in_average
签名与 explain_changes_in_totals,但侧重于平均值变化,而不是总量变化。
explain_changes_in_average example
explain_timeseries
将时间序列面板数据分割成具有不同时间模式的片段。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
dataset_name | string | 必填 | 加载数据集的名称 |
time_name | string | 必填 | 包含时间值的列 |
num_segments | int | auto | 要查找的段数 |
max_depth | int | 2 | 每段的最大尺寸 |
fit_sizes | bool | auto | 随着时间的推移也适合分段大小 |
num_breaks | int | 3 | 程式化时间序列中的断点 |
n_jobs | int | 10 | 树构建的并行作业 |
ignore_averages | bool | true | 比较时忽略整体级别 |
image_size | list\[int\] | none | \[width,height\]用于PNG图表 |
响应格式
分析结果
大多数工具返回 AnalysisResult JSON:
{
"task": "levels",
"segments": [
{
"segment": {"region": "US", "product": "A"},
"total": 1500.0,
"seg_size": 200.0,
"naive_avg": 7.5,
"impact": 120.0,
"avg_impact": 0.6
}
],
"relevant_clusters": {},
"global_average": 5.2,
"markdown_summary": "| ... |",
"image_path": "/tmp/tmpXXXXXX.png"
}- 段:定义此段的维度值对
- 总计:细分市场内的总价值
- sec_size:节段的尺寸/重量
- 天真:分段中的简单平均值(total/seg_size)
- 影响:分段对总体的影响(仅限于套索求解器)
- avg影响:每单位重量的影响(仅限套索求解器)
- 相关集群:群集定义
cluster_values=True - 图像路径:生成PNG文件的路径(当
image_size已设置)
Split分析结果
使用时 how="split_fits",响应包含单独的分析:
{
"task": "changes (split)",
"size_analysis": { "...AnalysisResult..." },
"average_analysis": { "...AnalysisResult..." },
"image_path": "/tmp/tmpXXXXXX.png"
}用例演练
1.在当前数据中发现异常段
1. Load my sales data: load_data("/data/sales_jan.csv", "jan_sales",
dims=["region", "product", "channel"], total_name="revenue", size_name="orders")
2. Find unusual segments: explain_levels("jan_sales", max_segments=5, image_size=[1200, 600])这确定了每份订单的平均收入与全球平均水平差异最大的细分市场,例如,“APAC+Premium产品的每份订单收入是平均水平的3倍”。
2.解释不同时期之间的变化
1. Load both periods:
load_data("/data/sales_q1.csv", "q1", dims=["region", "product"], total_name="revenue", size_name="orders")
load_data("/data/sales_q2.csv", "q2", dims=["region", "product"], total_name="revenue", size_name="orders")
2. What drove the total change?
explain_changes_in_totals("q1", "q2", image_size=[1000, 800])
3. What about average changes specifically?
explain_changes_in_average("q1", "q2")
4. Break down size vs average contributions:
explain_changes_in_totals("q1", "q2", how="split_fits")3.时间序列分割
1. Load panel data:
load_data("/data/monthly_metrics.csv", "monthly",
dims=["region", "product"], total_name="revenue", size_name="customers")
2. Find segments with different trends:
explain_timeseries("monthly", time_name="month", image_size=[1200, 800])这发现像“欧盟+产品B正在下降,而美国+产品A正在增长”这样的群体。
发展
git clone https://github.com/MotleyAI/wise-pizza-mcp.git
cd wise-pizza-mcp
pip install -e ".[dev]"
pytest tests/ -v许可证
麻省理工学院
