mcpField
D
dashAI (unofficial)

dashAI (unofficial)

本地服务
github.com/Maarmapa数据与分析06 周前更新

关于 dashAI (unofficial)

dashAI (unofficial) 是面向运行中 dashAI 机器学习工作台的 MCP 服务,供 Agent 查看数据集、训练和评估模型。它覆盖核心建模流程,且不提供删除工具。

主要功能

  1. 01查看数据集和组件
  2. 02异步训练模型
  3. 03跟踪任务进度
  4. 04查看运行记录与指标
  5. 05执行预测并查看类别计数

适用场景

  1. 01建模前检查数据集
  2. 02训练并比较模型运行结果
  3. 03跟踪耗时较长的训练任务

MCP 相关

它向 MCP 客户端提供 10 个工具,用于查询数据集和组件、训练模型、跟踪任务、检查运行记录及请求预测。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"maarmapa-dashai": {
"command": "uvx",
"args": [
"dashai-mcp"
],
"env": {
"DASHAI_BASE_URL": "<DASHAI_BASE_URL>",
"DASHAI_ALLOW_REMOTE": "<DASHAI_ALLOW_REMOTE>",
"DASHAI_TIMEOUT": "<DASHAI_TIMEOUT>"
}
}
}
}
启动命令uvx dashai-mcp
需要配置的环境变量
DASHAI_BASE_URLURL of the dashAI backend. Defaults to http://localhost:8000.
DASHAI_ALLOW_REMOTESet to 1 to allow a non-localhost backend. dashAI's API has no authentication, so pointing this server at a remote host exposes an ML backend with no door on it — read the README before enabling.
DASHAI_TIMEOUTSeconds to wait per request. Defaults to 30.

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypidashai-mcp0.3.1

工具

10

收录的工具列表 · 更新于 2 周前

参数类型必填说明
paramsany是

详细介绍

dashai-mcp

一个适用于 dashAI 的 MCP 服务。dashAI 是由智利大学(FCFM)牵头的开源机器学习工作台,由 DCC UChile 和 UTFSM 的学生与 CENIA 和 IMFD 共同打造。

非官方且独立。 这是一个第三方项目。它与 dashAI 项目或开发该项目的机构 无关联,也未获其认可或维护。

它让 Agent 能像人通过 GUI 使用 dashAI 一样操作:查看数据集、了解可用模型、训练模型、跟踪排队中的任务,并读取指标。

"Train a random forest on dataset 3 predicting 'species' and tell me the F1"

状态

v0.2.2 — 已通过针对运行中的 dashAI 0.9.7.post1 的验证。 确定性测试 (包括 predict 两步流程)以及实时运行:dashai_train_model → dashai_job_status → 带指标的 dashai_get_run,以及已完成的 dashai_predict → dashai_job_status。

实时表格数据运行(种子 students)

仅使用公开 dashAI 种子数据。目标为 placement_status(多数类占比约 83%)。
未将 exam_score 纳入输入(它会泄露标签)。数据集按 70/15/15 划分。目标指标:BalancedAccuracy —— 多数类上的 Accuracy 和 F1 都会造成误导。

模型测试集 BalancedAccuracy测试集 MCC测试集 F1测试集 Accuracy
DummyClassifier(most_frequent)0.5000.0000.9060.827
RandomForestClassifier(class_weight=balanced,深度 8,100 棵树)0.8510.5910.9000.845
LogisticRegression(class_weight=balanced,L2)0.8730.6240.9050.853

Dummy 模型总是预测多数类,因此 F1 得分最高。在线性模型真正衡量类别区分能力的指标上,它优于随机森林。每一行都来自各自的 70/15/15 划分(测试行并不相同)——但这已经足以说明不该再默认使用随机森林。如果客户端在这里仅报告 F1,那就是在误导。

在已完成的随机森林运行上调用 dashai_predict,返回了 prediction_id,且任务已完成。该操作评估的是模型训练所用的同一个种子数据集,而不是留出的文件——不要将其视为泛化能力检查。dashai_get_prediction 仅返回 {n, n_classes, class_counts}。

实时图像运行(种子 cifar10-subset)

公开种子数据:200 张图像,青蛙与卡车(各 100 张)。LeNet5ImageClassifier,CPU,32×32。按 70/15/15 划分 → 测试集 n=30。随机猜测基准为 0.5。

运行shuffle/stratify训练集 BalAcc验证集 BalAcc验证集 MCC测试集 BalAcc测试集 MCC
10 个 epoch(受污染)关闭0.879*0.467*0.0000.633*0.000
40 个 epoch(受污染)关闭0.950*0.733*0.0000.867*0.000
40 个 epoch(cifar10-lenet5-40ep-stratified)开启1.0000.7670.5440.9000.816

*这是 Accuracy,而非 BalancedAccuracy——在仅含单一类别的验证集/测试集上,两者会塌缩。该种子数据的随机猜测基准为 0.5。Dummy 表格分类器不适用(图像任务)。

图像的处理流程正常。0.867 不是有效结果:dashAI 默认使用 shuffle=False,因此验证集/测试集里有 30 张卡车,却没有青蛙。在仅含单一类别的划分上,sklearn 得出的 MCC 为 0。此服务发送 shuffle=true + stratify=true 后,验证集/测试集都包含两个类别,MCC 不再为 0。训练集达到 1.0(记住了 140 张图像)。验证集 0.767 是较为可信的数值;测试集 0.900 则是仅基于 30 行数据的偶然结果。不要将其发布为排行榜成绩。

针对实时实例进行验证时,发现了dashAI 文档与实际行为之间的差异。每一处差异都有对应的回归测试。第六处问题——shuffle=False 时采用顺序划分——只有在实时测试中才显现,因为 MCC 变为 0,而 Accuracy 却在变化。 dashai_predict 向 PredictJob 发送 run_id 的问题也只有实时测试时才显现(KeyError: 'prediction_id'),此前没有 predict 测试。

安装

pip install dashai-mcp
# or: uv pip install dashai-mcp

在你的 MCP 客户端配置中:

{
  "mcpServers": {
    "dashai": {
      "command": "dashai-mcp"
    }
  }
}

dashAI 必须单独运行(通过 dashai 或桌面应用)。默认会在 http://localhost:8000 查找它。

工具

工具功能
dashai_server_infodashAI 是否正在运行?有多少个数据集和运行记录
dashai_list_datasets列出已加载的数据集
dashai_describe_dataset一次调用即可获取列、类型和样例
dashai_list_components可用的模型、指标、任务和优化器
dashai_train_model训练。 将任务加入队列,并返回 job_id + run_id
dashai_job_status任务进度:not_started / started / finished / error
dashai_list_runs已记录的运行,用于比较模型
dashai_get_run获取某次运行的配置和指标
dashai_predict使用已完成运行的模型进行预测
dashai_get_prediction获取已完成预测的类别计数——绝不返回行数据

dashAI 文档(或默认设置)中有误的六处

通过在真实实例上运行发现。如果你要为此 API 编写客户端,这些问题会让你吃尽苦头:

文档所述代码实际行为
?select_types=["Model","Metric"]必须使用重复参数:?select_types=Model&select_types=Metric。JSON 数组会返回 422。
带 JSON 正文的 POST /job/它使用的是表单数据,其中 kwargs 被序列化为 JSON 字符串。该路由自己的 openapi.json 未声明 requestBody,因为端点会手动解析 request。
将 splits 作为对象传递它以JSON 字符串形式传递:Pydantic 架构将其声明为 str。
optimize(model_class, search_space, X, y, n_trials)实际签名是 optimize(model, input_dataset, output_dataset, parameters, metric),而且 model 是一个实例,不是类。
在任务中按 run_id 预测PredictJob.run 要求 kwargs["prediction_id"]。GUI 会先执行 POST /predict/({run_id, dataset_id}),然后才将任务加入队列。向任务传入 run_id 会触发 KeyError: 'prediction_id'。
数据集划分的 shuffle / stratifyprepare_for_model_session 默认将两者都设为 False。对于按类别排序的种子数据集(cifar10-subset 中先有 100 个 frog,再有 100 个 truck),按 70/15/15 划分会导致验证集和测试集只有一个类别。准确率仍会变动;sklearn 的 MCC 定义为 0。此服务会发送 shuffle=true,并在分类任务中发送 stratify=true。

组件注册表还有 13 种类型,而非文档所说的四种:Task、GenerativeTask、Model、GenerativeModel、DataLoader、DatasetSource、Metric、Optimizer、Job、LocalExplainer、GlobalExplainer、Explorer、Converter。

此外,GET /run/{id} 会返回包含完整索引列表的 split_indexes:对于包含 10,000 行的数据集,该字段有 59 KB,占响应的 99%。此服务会将其替换为每个数据集划分的计数,使响应缩减到约 1 KB。

三项设计决策

1. 十个工具,而非 142 个

dashAI 提供 142 个 REST 端点。为每个端点生成一个工具只是机械操作,而且是个错误:拥有 140 个工具的模型会耗费上下文来读取目录,选择也会更差。这十个工具涵盖了实际工作流程。

2. dashai_train_model 合并三次调用

在原始 API 中,训练需要按顺序进行多次调用:

POST /model-session/   → creates the experiment
POST /run/             → creates the run
POST /job/             → enqueues the ModelJob

还需要提供 GUI 会自行填入、但文档未说明的必需字段——plot_history_path、plot_slice_path、plot_contour_path、plot_importance_path。此外,splits 以 JSON 字符串而非对象的形式传递,尽管 dashAI 文档将其显示为对象:后端的 Pydantic 架构将其声明为 str。这类细节正是 Agent 在调用原始 API 时失败的原因。

这里将其合并为一次调用,而且不会阻塞:训练可能需要数小时,因此会立即返回 job_id,并通过 dashai_job_status 轮询进度。

dashai_predict 对 GUI 的两步流程也做了同样处理:先执行 POST /predict/,再执行带有 prediction_id 的 `POST /job/``。

3. 没有工具会删除任何内容

dashAI 的 API 没有身份验证——已逐个检查端点。对于以本地为先的工具来说,这样设计是合理的,但这也意味着,一句被误读的话和不可逆的 DELETE /dataset/{id} 之间没有任何屏障。删除操作通过 GUI 执行,操作前可以查看要删除的内容。

出于同样的原因,服务拒绝指向非本地主机:

DASHAI_BASE_URL points to 'ml.example.com', which is not local, and dashAI's API
has no authentication: exposing it to the network leaves the backend open to
anyone who can reach it.

如果目标主机通过其他方式受到保护,可以使用 DASHAI_ALLOW_REMOTE=1 有意关闭此限制。

配置

变量默认值用途
DASHAI_BASE_URLhttp://localhost:8000后端地址
DASHAI_ALLOW_REMOTE(否)允许使用非本地主机(见上文)
DASHAI_TIMEOUT30每个请求的等待秒数

dashai_get_prediction 需要在 MCP 进程中安装 pyarrow,才能将 Arrow 文件转换为类别计数(运行 pip install 'dashai-mcp[counts]',或将 MCP 安装到与 dashAI 相同的环境中)。若未安装,该工具仍会返回状态信息,但不会导出行数据。

开发

python -m venv .venv && .venv/bin/pip install -e ".[dev]"
.venv/bin/python -m pytest tests/ -q

测试使用 respx 模拟 HTTP 响应:无需 dashAI 实例或凭据。它们测试的是接口约定——会发出哪些调用、调用顺序、请求正文内容,以及发生故障时会告知 Agent 什么信息。

针对运行中的实例进行验证

只针对模拟响应测试过的客户端仍只是一个假设。scripts/smoke_live.py 会通过 Agent 使用的相同代码路径,针对实际运行中的 dashAI 执行每个工具:

python scripts/smoke_live.py            # read-only tools
python scripts/smoke_live.py --train    # + a real train -> predict loop

--train 循环会在目标实例上创建模型会话、运行和预测——请将其指向专用的测试实例,而非生产实例。只有每个被测试的工具都正常工作时,退出代码才为 0。每个版本都会通过这种方式进行验证;最近一次运行时所针对的版本,会由 dashai_server_info 在 compatibility.verified_against 中报告。

API 兼容性检查

dashAI 未提供版本端点,因此 dashai_server_info 会读取实例的 openapi.json,并将 API 接口与此服务实际调用的接口进行比较:端点是否仍然存在,以及 POST /model-session/ 是否要求此服务未发送的字段。检查结果会通过 compatibility.status 返回,可能是 ok、mismatch(会指出具体差异)或 unknown(无法读取架构;其他功能仍可能正常工作)。这项检查有实际用途:dashAI 的开发分支已经为模型会话添加了 evaluation_strategy 字段。

关于 SDK

需要 MCP Python SDK 2.x。2.0 版本移除了 mcp.server.fastmcp;现在使用 mcp.server.mcpserver.MCPServer,注释则使用 ToolAnnotations 对象,而非字典。大多数教程仍展示 1.x API。

许可证

MIT,与 dashAI 相同。关于关联关系,请参阅顶部的说明。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。