Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
제작자가 쓴 설명(영어 원문)
Train, track and query models on a running dashAI instance. Read-oriented, no delete tools.
이 세 가지는 절대 하나의 점수로 합치지 않아요. 의견, 측정, 인기는 서로 다른 것이니까요.
이 서버는 아직 쉬운 말로 된 요약을 쓰지 못했어요. 아래는 레지스트리에서 읽어 온 사실이에요.
쓰고 있는 AI 앱을 고른 다음 설정을 복사하세요.
DASHAI_BASE_URL, DASHAI_ALLOW_REMOTE, DASHAI_TIMEOUT필요한 것
어떤 앱을 쓰세요?
위에서 앱을 고르세요. 기억해 두었다가 다음부터는 버튼에 “…에 설치”라고 표시해요.
Claude Desktop → Settings → Developer → Edit Config를 열고 claude_desktop_config.json에 이 내용을 붙여 넣으세요
{
"mcpServers": {
"dashai": {
"command": "uvx",
"args": [
"dashai-mcp"
],
"env": {
"DASHAI_BASE_URL": "your-value",
"DASHAI_ALLOW_REMOTE": "your-value",
"DASHAI_TIMEOUT": "your-value"
}
}
}
}터미널에서 이 명령어를 실행하세요
claude mcp add dashai --env DASHAI_BASE_URL=your-value --env DASHAI_ALLOW_REMOTE=your-value --env DASHAI_TIMEOUT=your-value -- uvx dashai-mcp실행하기 전에 빈 값을 채워 주세요.
프로젝트의 .cursor/mcp.json 또는 ~/.cursor/mcp.json에 붙여 넣으세요
{
"mcpServers": {
"dashai": {
"command": "uvx",
"args": [
"dashai-mcp"
],
"env": {
"DASHAI_BASE_URL": "your-value",
"DASHAI_ALLOW_REMOTE": "your-value",
"DASHAI_TIMEOUT": "your-value"
}
}
}
}브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.
프로젝트의 .vscode/mcp.json에 붙여 넣으세요
{
"servers": {
"dashai": {
"type": "stdio",
"command": "uvx",
"args": [
"dashai-mcp"
],
"env": {
"DASHAI_BASE_URL": "your-value",
"DASHAI_ALLOW_REMOTE": "your-value",
"DASHAI_TIMEOUT": "your-value"
}
}
}
}브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.
이 서버는 내 컴퓨터에서 실행되는데, ChatGPT는 인터넷에 있는 서버에만 연결할 수 있어요. 다른 앱을 고르세요.
선택한 앱은 이 기기의 쿠키에만 저장돼요. 계정은 필요 없어요.
DASHAI_BASE_URL envDASHAI_ALLOW_REMOTE envDASHAI_TIMEOUT env이 설정은 제작자의 레지스트리 정보로 만들었어요. README와 다르면 README를 따르세요.
내 컴퓨터에서 실행돼요. 설치하면 AI 앱에 도구 목록이 나타나요.
누구나 볼 수 있는 정보를 점검했고, 코드는 읽지 않았어요. 해당하지 않는 항목은 개수에서 뺐어요. · 2026년 11월 7일 점검
레지스트리 이름이 GitHub 계정 Maarmapa 기준으로 확인되었고, 이 계정이 저장소를 소유하고 있어요
아직 GitHub에서 이 저장소를 읽어 오지 않았어요
아직 GitHub에서 이 저장소를 읽어 오지 않았어요
내 컴퓨터에서 실행되는 서버라 인터넷 엔드포인트가 없어요
내 컴퓨터에서 실행되며, 대신 로컬 설정을 사용해요
내 컴퓨터에서 실행돼요. 도구 목록은 인터넷 엔드포인트가 있는 서버에서만 읽을 수 있어요
레지스트리에서 이 카테고리의 활성 서버 전체와 비교했어요. 스타는 게시자가 저장소를 소유한 경우에만 세요.
해당하는 기본 점검 1개 중 1개를 통과했어요. 코드는 읽지 않았어요. 키나 토큰을 넣기 전에 서버가 어떤 권한을 요구하는지 확인하고, 꼭 필요한 권한만 있는 키를 쓰세요.
레지스트리에 필수 키가 나와 있지 않아요. 다만 처음 쓸 때 로그인을 요구하는 서버도 있어요.
내 컴퓨터에서 실행돼요. AI 앱이 필요할 때 실행하고, 데이터는 제작자의 서버를 거치지 않아요(서버 자체가 온라인 서비스를 호출하는 경우는 제외).
GitHub 저장소는 마지막으로 – 변경됐고, 최신 버전(0.3.1)은 2개월 전 레지스트리에 올라왔어요.
Claude Desktop, Claude Code, Cursor, VS Code처럼 MCP를 지원하는 앱에서 쓸 수 있어요. 내 컴퓨터에 Python (uv)도 있어야 해요.
같은 카테고리에는: Spec Driven Development, Remote Desktop Commander, 好縮 Short
같은 카테고리에서 다른 제작자가 만든 서버예요. 스타 순으로 정렬했어요.
카드 보는 법:★ GitHub 스타i세 기둥: 리뷰 · 점검 · 사용 정도i업데이트 = 최신 버전을 레지스트리에 공개한 날i
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Smart URL shortener: create, tag and track short links on s.gooo.name.
제작자의 저장소에서 쓰인 그대로 가져왔어요. PopNx MCP가 검토하거나 보증한 내용이 아니에요. HTML, 이미지, 스크립트는 제거했어요. 링크를 누르면 이 사이트를 벗어나요.
An MCP server for [dashAI](https://github.com/DashAISoftware/DashAI), the open source Machine Learning workbench led by the University of Chile (FCFM), built by students of DCC UChile and UTFSM, with CENIA and IMFD.
Unofficial and independent. This is a third-party project. It is not
affiliated with, endorsed by, or maintained by the dashAI project or the
institutions that develop it.
It gives an agent the same surface dashAI gives a person through its GUI: look at datasets, see which models are available, train, follow queued work, and read the metrics.
"Train a random forest on dataset 3 predicting 'species' and tell me the F1"
v0.2.2 — verified against a running dashAI 0.9.7.post1. Deterministic tests (including the predict two-step path) plus live runs: dashai_train_model → dashai_job_status → dashai_get_run with metrics, and dashai_predict → dashai_job_status finished.
students)Public dashAI seed only. Target placement_status (~83% majority). exam_score was left out of the inputs (it leaks the label). Split 70/15/15. Goal metric: BalancedAccuracy — Accuracy and F1 on the majority class are traps.
| model | test BalancedAccuracy | test MCC | test F1 | test Accuracy |
|---|---|---|---|---|
DummyClassifier(most_frequent) | 0.500 | 0.000 | 0.906 | 0.827 |
RandomForestClassifier (class_weight=balanced, depth 8, 100 trees) | 0.851 | 0.591 | 0.900 | 0.845 |
LogisticRegression (class_weight=balanced, L2) | 0.873 | 0.624 | 0.905 | 0.853 |
The dummy *wins F1* by always answering the majority class. The linear model beats the forest on the metrics that actually measure separation. Each row is its own 70/15/15 draw (not the same test rows) — still enough to stop treating the forest as the default. If a client reports only F1 here, it is lying.
dashai_predict on the finished forest run returned prediction_id and the job finished. That scores the same seed dataset the model was trained on, not a held-out file — do not read it as a generalization check. dashai_get_prediction returns {n, n_classes, class_counts} only.
cifar10-subset)Public seed: 200 images, frog vs truck (100/100). LeNet5ImageClassifier, CPU, 32×32. Split 70/15/15 → test n=30. Chance is 0.5.
| run | shuffle/stratify | train BalAcc | val BalAcc | val MCC | test BalAcc | test MCC |
|---|---|---|---|---|---|---|
| 10 epochs (poisoned) | off | 0.879* | 0.467* | 0.000 | 0.633* | 0.000 |
| 40 epochs (poisoned) | off | 0.950* | 0.733* | 0.000 | 0.867* | 0.000 |
40 epochs (cifar10-lenet5-40ep-stratified) | on | 1.000 | 0.767 | 0.544 | 0.900 | 0.816 |
\*Accuracy, not BalancedAccuracy — on the one-class val/test they collapse. Chance on this seed is 0.5. Dummy tabular does not apply (image task).
The image *path* works. The *0.867 is not a result*: dashAI defaulted shuffle=False, so val/test were 30 trucks and zero frogs. MCC 0 is sklearn on a one-class split. After this server sent shuffle=true + stratify=true, both classes are in val/test and MCC is no longer 0. Train hits 1.0 (140 images memorized). Val 0.767 is the honest-ish number; test 0.900 is a 30-row lottery. Do not publish a leaderboard line.
Verifying against a live instance surfaced gaps between dashAI's documentation and its actual behaviour. Each one has its own regression test. A sixth — sequential splits with shuffle=False — only showed up live because MCC came back 0 next to a moving Accuracy. dashai_predict sending run_id to PredictJob — only showed up live (KeyError: 'prediction_id') because there was no predict test.
pip install dashai-mcp
In your MCP client configuration:
{
"mcpServers": { "dashai": { "command": "dashai-mcp" } } }
dashAI has to be running separately (dashai, or the desktop app). It is looked up at http://localhost:8000 by default.
| Tool | What it does |
|---|---|
dashai_server_info | Is dashAI up? How many datasets and runs are there |
dashai_list_datasets | Lists the loaded datasets |
dashai_describe_dataset | Columns, types and a sample — all in one call |
dashai_list_components | Available models, metrics, tasks and optimizers |
dashai_train_model | Trains. Enqueues and returns job_id + run_id |
dashai_job_status | Job progress: not_started / started / finished / error |
dashai_list_runs | Recorded runs, for comparing models |
dashai_get_run | Configuration and metrics of a run |
dashai_predict | Predicts using the model of a finished run |
dashai_get_prediction | Class counts of a finished prediction — never the rows |
Found by running against a real instance. If you are writing a client for this API, these will bite you:
| What the docs say | What the code does |
|---|---|
?select_types=["Model","Metric"] | Must be repeated parameters: ?select_types=Model&select_types=Metric. The JSON array returns 422. |
POST /job/ with a JSON body | It is form data, with kwargs serialized as a JSON string. Its own openapi.json declares no requestBody for that route, because the endpoint parses request by hand. |
splits as an object | It travels as a JSON string: the Pydantic schema declares it str. |
optimize(model_class, search_space, X, y, n_trials) | The real signature is optimize(model, input_dataset, output_dataset, parameters, metric), and model is an instance, not a class. |
Predict by run_id on the job | PredictJob.run requires kwargs["prediction_id"]. The GUI first POST /predict/ ({run_id, dataset_id}) and only then enqueues. Sending run_id to the job raises KeyError: 'prediction_id'. |
Split shuffle / stratify | prepare_for_model_session defaults both to False. On a class-sorted seed (cifar10-subset is 100 frog then 100 truck) a 70/15/15 cut puts val and test in one class. Accuracy still moves; sklearn's MCC is defined as 0. This server sends shuffle=true and, on classification tasks, stratify=true. |
The component registry also has 13 types, not the four the documentation suggests: Task, GenerativeTask, Model, GenerativeModel, DataLoader, DatasetSource, Metric, Optimizer, Job, LocalExplainer, GlobalExplainer, Explorer, Converter.
And GET /run/{id} returns split_indexes with the full list of indices: on a 10,000-row dataset that is 59 KB, 99% of the response. This server replaces it with the per-split counts, bringing the response down to ~1 KB.
dashAI exposes 142 REST endpoints. Generating one tool per endpoint is mechanical and it is a mistake: a model with 140 tools burns context reading the catalogue and chooses worse. These ten cover the actual working path.
dashai_train_model collapses three callsIn the raw API, training is a chained sequence:
POST /model-session/ → creates the experiment
POST /run/ → creates the run POST /job/ → enqueues the ModelJob
With required fields the GUI fills in on its own and that are undocumented — plot_history_path, plot_slice_path, plot_contour_path, plot_importance_path. On top of that, `splits` travels as a JSON string, not an object, even though dashAI's documentation shows it as an object: the backend's Pydantic schema declares it str. That kind of detail is exactly what makes an agent fail against the raw API.
Here it is a single call, and it does not block: training can take hours, so it returns the job_id immediately and progress is polled with dashai_job_status.
dashai_predict does the same for the two-step GUI path: POST /predict/ then POST /job/ with prediction_id.
dashAI's API has no authentication — checked endpoint by endpoint. That is coherent for something local-first, but it means there is no barrier between a misread sentence and an irreversible DELETE /dataset/{id}. Deleting is done from the GUI, looking at what is being deleted.
For the same reason, the server refuses to point at a non-local host:
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.
This can be disabled on purpose with DASHAI_ALLOW_REMOTE=1, if the target is protected some other way.
| Variable | Default | What for |
|---|---|---|
DASHAI_BASE_URL | http://localhost:8000 | Where the backend is |
DASHAI_ALLOW_REMOTE | *(no)* | Allow a non-local host (see above) |
DASHAI_TIMEOUT | 30 | Seconds to wait per request |
dashai_get_prediction needs pyarrow in the MCP process to turn the Arrow file into class counts (pip install 'dashai-mcp[counts]', or install the MCP into the same env as dashAI). Without it the tool still returns status and refuses to dump rows.
python -m venv .venv && .venv/bin/pip install -e ".[dev]"
.venv/bin/python -m pytest tests/ -q
The tests stub the HTTP responses with respx: they need neither a dashAI instance nor credentials. They test the contract — which calls are made, in what order, with what body, and what the agent is told when something fails.
A client tested only against stubs is a hypothesis. scripts/smoke_live.py exercises every tool against a real running dashAI, through the same code paths an agent uses:
python scripts/smoke_live.py # read-only tools
python scripts/smoke_live.py --train # + a real train -> predict loop
The --train loop creates a model session, a run and a prediction on the target instance — point it at a scratch instance, not a production one. Exit code 0 only if every exercised tool worked. This is how each release gets verified; the version it was last run against is what dashai_server_info reports under compatibility.verified_against.
dashAI exposes no version endpoint, so dashai_server_info reads the instance's openapi.json and compares the API surface against what this server actually calls: are the endpoints still there, and does POST /model-session/ require fields this server does not send? The verdict comes back as compatibility.status — ok, mismatch (with the exact differences named) or unknown (schema unreadable; everything else may still work). The case it exists for is real: dashAI's development branch already adds an evaluation_strategy field to model sessions.
Requires the MCP Python SDK 2.x. Version 2.0 removed mcp.server.fastmcp; it is now mcp.server.mcpserver.MCPServer, and annotations are ToolAnnotations objects instead of dictionaries. Most tutorials still show the 1.x API.
MIT, same as dashAI. See the note at the top on affiliation.