Skip to main content
Glama
EasyDeploy-AI

easydeploy-ai-mcp

Official

EasyDeploy AI MCP (easydeploy-ai-mcp)

A Model Context Protocol (MCP) server that exposes the EasyDeploy public REST API as tools for Claude, Cursor, Claude Code, and other MCP clients.

PyPI package name: easydeploy-ai-mcp · Import package: easydeploy_ai_mcp

Contents

Related MCP server: my-mcp-server

Connect with Claude

Hosted connector (claude.ai or Claude Desktop)

We host the MCP endpoint. You add it once inside Claude; after you connect and sign in, new chats can use EasyDeploy like any other enabled connector.

  1. Open Claude in the browser or open Claude Desktop.

  2. Open Settings, then Connectors, and choose Add custom connector.

  3. Enter exactly:

    • Name: EasyDeploy AI

    • Remote MCP server URL: https://mcp.easydeploy.ai/mcp

  4. Save the connector so EasyDeploy appears in your list of connectors.

  5. Open the EasyDeploy connector entry and choose Connect, then finish sign-in in your browser. That step authorizes Claude to use your EasyDeploy account.

Connect and sign in (inside Claude): After the custom connector is set up, Claude shows an EasyDeploy card with the MCP URL and a Connect button. Use that flow to sign in. You do not paste an API key into Claude. Access stays tied to the EasyDeploy profile you authenticate in the browser.

Claude Desktop and file uploads: File uploads and some tool calls reach EasyDeploy over the network. On Desktop, Claude blocks outbound traffic unless you allow the domains it should call. Open Settings → Capabilities, turn on Allow network egress, and under the domain allowlist add this one host exactly:

api.easydeploy.ai

That is the only host uploads to the public production server go to; allow it exactly, nothing wider. A server pointed at another EasyDeploy API (one set with EDA_API_BASE) needs that API's host instead, and the start_upload runbook names the exact host to allow.

The domain allowlist UI is available on paid Claude plans.

More detail and variants (for example a URL from your own deployment) are in docs/claude-getting-started.md.

Start here: get_started

get_started returns the EasyDeploy data-science playbook, which is most useful at the start of a modeling task. Its description and the server's MCP instructions say what it returns rather than when the agent must call it, as the Claude connector directory requires. Hosts cache tool descriptions and server instructions, and many never show the instructions to the model; a tool result is fetched live on every call. So the playbook lives in the tool's result, not in its description: the name and description stay fixed, and the content is updated with each release without anyone reconnecting.

  • get_started() returns the overview: the roles, the whole workflow with the tools at each step, and the hard rules.

  • get_started(section=...) returns one section: prepare, split, upload, train, validate or predict. all returns every section.

  • Each result carries guide_version, updated, the list of sections with a one-line summary each, and next, the section to read next.

The content ships inside the package as Markdown, one file per section, in src/easydeploy_ai_mcp/guide/. The tool is read-only and makes no API call.

You are the data scientist

EasyDeploy searches models, engineers features, tunes hyperparameters, trains, deploys and predicts. It does not clean your data, define the target, split it, or check the model on data it never saw. The agent does that, following the get_started playbook:

  1. Prepare. Agree the decision and the target with you, explore the data, drop identifiers and anything not known at prediction time from the training file, and write a one-sentence target definition. Ids can stay in test and scoring files: prediction ignores columns the model wasn't trained on and returns them in the output, which makes joining results back easy. Data changes and dropped columns are confirmed with you before they are applied.

  2. Split. Stratified 80/20 for classification, chronological for time series, no entity in both files, no duplicates. Balancing such as SMOTE touches the train file only.

  3. Upload and train. The files go up separately, with dataset_type train and test (validation optional). The model version is created on the train dataset version only.

  4. Validate on the holdout. The report's cross-validation score is measured inside the training file and its training-fit metrics are in-sample. The real estimate comes from run_batch_prediction on the test dataset version: the downloaded CSV keeps every input column, the true label included, in the original row order and adds prediction and probability_<class> columns. The agent computes the metrics from it and picks the decision threshold from the cost of each kind of error (best F1 only when those costs are unknown), or reports the error margin for regressors.

  5. Use real outputs. Dashboards, reports and scored lists are built from real predictions, never mock values.

Getting a training file into EasyDeploy

start_upload opens an upload session and the agent picks the best byte channel the host offers. File contents never travel through the conversation or through tool arguments on any channel — the agent passes a URL or runs a curl, never the data itself.

Channel

When it is used

Flow

File parameter

Hosts that support openai/fileParams (Codex, ChatGPT). start_upload declares _meta: {"openai/fileParams": ["file"]}, so the host hydrates a file argument with a download URL. No sandbox network needed.

start_upload(..., file=…) → session goes to RECEIVING → poll get_upload_status → complete_upload

Gateway PUT (default)

Claude Code, Cowork, and claude.ai / Desktop sandboxes with egress. Max 6 MB per file; the gateway answers 413 above that, and there is no chunking path.

start_upload → run the returned curl_command in the shell where the file is → poll get_upload_status → complete_upload

Fetch from a share link

The sandbox has no egress but the file is already at a shareable URL: a Google Sheets or Drive link set to anyone with the link, an OpenAI file link, or another allowlisted host. EasyDeploy fetches the bytes server-side, up to 256 MB.

start_upload → upload_from_url(upload_request_id, source_url) → poll get_upload_status → complete_upload

get_upload_status reports URL_ISSUED → RECEIVING → UPLOADED → VALIDATING → READY | REJECTED → CONSUMED (plus EXPIRED). complete_upload requires READY — every byte that becomes a dataset version passes the CSV validator first, and a session still in flight, REJECTED or EXPIRED returns a 400 naming what to do. On REJECTED, the error field says which check failed. Retrying complete_upload is safe: on a session that is already CONSUMED it returns the existing dataset version, and a 409 means another call for the same session is still in progress (wait a few seconds and retry). get_upload_status only covers sessions opened by start_upload; files uploaded through the web model builder are registered in the web app and do not appear there.

New dataset or new version. Omit dataset_id on start_upload and complete_upload creates a new dataset with the name you give it. Pass an existing dataset's id and the upload becomes a new version of that dataset; complete_upload's name is then ignored and the dataset keeps its name. complete_upload returns dataset and datasetVersion once each, with the column names as a columnNames list. qa_status is informational and does not gate anything. version_type matters in one case: submit_training_job with an explicit dataset_version_id rejects a raw version. Omit dataset_version_id to train on the model version's own dataset.

Fallback when the host has no byte channel at all (no egress and no file bridge): the agent saves the training file, hands it to you as a download, and points you at the web model builder using the fallback text start_upload returns, which carries the right model-builder URL for the environment (for example easydeploy.ai/model-builder). After you upload there, tell the agent the dataset name you entered or paste the dataset URL from the page — it resolves the dataset with list_datasets and confirms the row count before continuing. That upload is already registered as a dataset, so complete_upload is not used for it. Adding the allowlist entry above (where your plan allows it) avoids the detour.

Reading a model report

get_model_report returns the report plus a structured metrics object (passed through unchanged from the API). Model search scores candidates with 10-fold cross-validation (stratified and shuffled on ROC-AUC for classifiers, shuffled on negative MSE for regressors; forward-chaining TimeSeriesSplit for a version created with time_series_mode=true), then refits the winner on all rows. There is no separate test set: accuracy, the confusion matrix, per-class precision/recall and in-sample ROC-AUC under metrics.trainingFit are training fit, and metrics.crossValidation.score is the report's out-of-sample estimate, measured inside the training file. The holdout estimate comes from scoring your own test file with run_batch_prediction, not from the report. metrics.crossValidation.strategy records which CV a run used (time_series_split for forward-chaining), and metrics.warnings flags anything to be careful quoting. The prose summary is written by an LLM and may use looser wording.

Promoting a model with aliases

An alias is a named pointer on a model, such as staging or production, that resolves to exactly one of its versions. run_prediction and run_batch_prediction take either model_version_id (an exact version) or model_id + alias (whichever version the alias points to when the call runs), never both. Scoring by alias lets the user promote a new version without changing their calls; the result's modelVersionId always names the version that actually scored, and alias echoes the alias that resolved it.

list_model_aliases shows where each alias points. set_model_alias creates or moves one. It always checks the change with a dry run first: when the new version was trained on different columns or a different target than the version the alias points to now (TRAINING_COLUMNS_CHANGED with the added and removed columns, TARGET_FEATURE_CHANGED, TRAINING_COLUMNS_UNKNOWN), it writes nothing and returns needs_confirmation: true with the warnings, so the agent can show the user what changes; it writes only when called again with confirm=true. With no warnings it writes straight after the check.

API keys have a scope: full, or predict (reads, predictions and uploads for scoring). Only a full-scope key can move an alias; a predict-only key gets 403 INSUFFICIENT_SCOPE, and the tool error says a full-scope key is needed. Alias arguments need an EasyDeploy API that has the alias routes; a self-hosted EDA_API_BASE pointing at an older backend answers with its own 400 or 404.


Local MCP on your computer (stdio)

Run the MCP server on your own machine using your EasyDeploy API key. Nothing is exposed to the internet.

1. Install

pip install easydeploy-ai-mcp

2. Add to Claude Desktop config

Edit (or create) the Claude Desktop config file:

OS

Path

macOS

~/Library/Application Support/Claude/claude_desktop_config.json

Windows

%APPDATA%\Claude\claude_desktop_config.json

Merge the following into the root of that JSON (keep any existing keys):

{
  "mcpServers": {
    "EasyDeploy AI": {
      "command": "easydeploy-ai-mcp-stdio",
      "env": {
        "EDA_API_KEY": "eda_live_YOUR_KEY"
      }
    }
  }
}

Replace eda_live_YOUR_KEY with your key from Account → API Keys in the EasyDeploy dashboard. Use the full path to easydeploy-ai-mcp-stdio (run which easydeploy-ai-mcp-stdio to find it) if Claude cannot locate it on your PATH.

3. Restart Claude Desktop

Fully quit and reopen the app. EasyDeploy AI will appear in your MCP servers.


For self-hosting on Docker or a cloud provider, see Remote MCP (HTTP).

What you get

  • 30 tools: get_started (the playbook) plus tools covering projects, datasets (including the three upload channels), model versions, model aliases, training jobs, predictions, and account status.

  • A title and tool annotations on every tool (title, set both on the tool and as annotations.title, plus readOnlyHint, destructiveHint, idempotentHint, openWorldHint), so hosts can tell reads from writes. get_started and the 17 other get_* / list_* tools are read-only. A write is destructiveHint: true when it can overwrite fields of an existing record: create_project, create_model and create_dataset_version (when given an id they update that record), update_dataset, submit_training_job (a resubmitted job retrains its model version in place), and set_model_alias (it can move an existing alias; it is also the one idempotent write besides update_dataset, since the same call again changes nothing). The other writes only add records and are destructiveHint: false; no tool deletes anything. Only upload_from_url and start_upload (given a host file) make EasyDeploy fetch an external URL. create_project and create_model are create-or-update, so they are marked as non-idempotent writes. Renaming a dataset is its own tool, update_dataset; get_dataset is a pure read.

  • stdio transport for local clients, or HTTP with Streamable MCP on /mcp and GET /healthz for load balancers.

  • Hardening: HTTPS-only calls to the EasyDeploy API; optional MCP_SERVICE_TOKEN for the HTTP MCP surface; response fields trimmed where appropriate for agents; query values (OAuth codes, state, PKCE values) left out of the access log; Cache-Control: no-store on token and registration responses.

For production and SOC 2–sensitive setups, prefer self-hosting so your data stays within your own infrastructure. The hosted connector at https://mcp.easydeploy.ai/mcp is fine for most users.

Requirements

  • Python 3.10+

  • An EasyDeploy API key from the dashboard (Account → API Keys). The client uses the production EasyDeploy API host by default.

Install

From PyPI (after first release)

pip install easydeploy-ai-mcp

From source

git clone https://github.com/easydeploy-ai/easydeploy-ai-mcp.git
cd easydeploy-ai-mcp
pip install -e ".[dev]"   # includes pytest
# or minimal runtime only:
pip install .

Environment variables

Variable

Required

Description

EDA_API_KEY

stdio / legacy HTTP

Required for stdio and legacy HTTP (no OAuth). Not used for outbound API calls when EDA_OAUTH_ENABLED=1 — each MCP request must include Authorization: Bearer <JWT or eda_live_…>.

EDA_API_BASE

No

Overrides the default production API (https://api.easydeploy.ai). Set only when targeting a non-production endpoint. Trailing /v1 is optional.

EDA_UI_BASE_URL

No

Prefix for ui_url fields (default https://easydeploy.ai).

MCP_SERVICE_TOKEN

No

Legacy single-tenant gate. If set, HTTP mode requires Authorization: Bearer <token> for /mcp (not for GET /healthz). Mutually exclusive with EDA_OAUTH_ENABLED.

EDA_OAUTH_ENABLED

No

Set to 1 to run the HTTP transport as an OAuth 2.0 resource server. Requires EDA_COGNITO_USER_POOL_ID and EDA_COGNITO_CLIENT_ID. See Remote MCP (HTTP).

EDA_COGNITO_USER_POOL_ID

OAuth

Cognito user pool that issues access tokens for the EasyDeploy API.

EDA_COGNITO_CLIENT_ID

OAuth

App client ID expected in the access token's client_id claim.

EDA_COGNITO_REGION

No

AWS region for the user pool (default us-east-1).

EDA_REPORT_MAX_WAIT_SECONDS

No

get_model_report poll budget in seconds (default 45, maximum 60).

EDA_REPORT_POLL_INTERVAL_SECONDS

No

Poll interval in seconds (default 10).

HOST / PORT

No

HTTP bind (defaults 0.0.0.0 / 8080).

EDA_TRUST_FORWARDED_HEADERS

No

Set to 1 behind ALB/reverse proxy so RFC 9728 resource uses https (trusts X-Forwarded-Proto).

EDA_MCP_OAUTH_ISSUER

No

Public MCP base URL (no path) for authorization_servers and proxy /.well-known/oauth-authorization-server issuer. Default: request origin. Use if Host / X-Forwarded-Proto are wrong behind a proxy.

EDA_CORS_EXTRA_ORIGINS

No

Comma-separated browser origins to allow in addition to the built-in list (Claude, ChatGPT, VS Code Web, Cursor, MCP Inspector).

EDA_MCP_OAUTH_BROKER

No

Set to 1 to broker the authorization redirect. Default off. See Brokered authorization.

EDA_MCP_EXTRA_REDIRECT_HOSTS

No

Broker mode: comma-separated extra HTTPS callbacks accepted as client redirect_uri. host (any path), host/path (exact), host/path/ (prefix), .host (host and subdomains).

EDA_MCP_EXTRA_REDIRECT_SCHEMES

No

Broker mode: comma-separated extra private-use URI schemes (RFC 8252 §7.1) accepted as client redirect_uri.

EDA_MCP_ALLOW_LOOPBACK_REDIRECT

No

Broker mode: set to 0 to refuse http://127.0.0.1:<port> callbacks. Default 1 — desktop clients need them.

EDA_MCP_BROKER_SECRET

No

Broker mode: HMAC key that seals the OAuth state. Set it in any real deployment; the fallback is derived from the Cognito pool and client ids, which are public, and the server logs a warning without it.

Local MCP (stdio)

Use when the client starts the server as a subprocess (Claude Desktop, Cursor, etc.).

export EDA_API_KEY="eda_live_..."
easydeploy-ai-mcp-stdio

Or: python -m easydeploy_ai_mcp

Example config snippet:

{
  "mcpServers": {
    "easydeploy-ai": {
      "command": "easydeploy-ai-mcp-stdio",
      "env": {
        "EDA_API_KEY": "eda_live_..."
      }
    }
  }
}

Remote MCP (HTTP)

Serves Streamable HTTP via FastMCP on /mcp (confirm with your pinned FastMCP 3.x version). Health checks: GET /healthz.

export EDA_API_KEY="eda_live_..."
easydeploy-ai-mcp-http

Or: uvicorn easydeploy_ai_mcp.http_main:app --host 0.0.0.0 --port 8080

If you embed mcp.http_app() in another ASGI app, pass through lifespan from the FastMCP HTTP app (FastMCP ASGI); easydeploy_ai_mcp.http_main already does this for uvicorn.

Auth modes

Pick exactly one (setting both EDA_OAUTH_ENABLED and MCP_SERVICE_TOKEN raises at import):

  • OAuth 2.0 resource server (multi-tenant): set EDA_OAUTH_ENABLED=1 plus EDA_COGNITO_USER_POOL_ID and EDA_COGNITO_CLIENT_ID. Install the optional extra: pip install easydeploy-ai-mcp[oauth]. The server validates incoming Cognito access JWTs locally against the Cognito JWKS (issuer, signature, exp, token_use=='access', client_id) and forwards the token to the EasyDeploy API. EasyDeploy API keys (prefix eda_live_) are accepted in the same Authorization: Bearer header and forwarded as-is — the API is the source of truth for revocation. RFC 9728 metadata is published at /.well-known/oauth-protected-resource; RFC 8414 proxy metadata includes registration_endpoint and grant_types_supported (authorization_code, refresh_token), and POST /oauth/register returns the static Cognito MCP EDA_COGNITO_CLIENT_ID (RFC 7591-style, public client), with the requested grant_types it supports echoed back (authorization_code and refresh_token; both when none are requested). 401 responses include WWW-Authenticate: Bearer … so MCP clients can discover the auth server. Note: Cognito access tokens carry client_id, not aud; do not configure an audience.

  • Shared-secret gate (legacy single-tenant): set MCP_SERVICE_TOKEN. All outbound API calls use the static EDA_API_KEY.

  • No auth: development only.

Brokered authorization

Cognito matches redirect_uri literally against the app client's callback list — no wildcards, no prefixes, no ports — and it checks at /oauth2/authorize, before rendering the Hosted UI. A client whose callback is not registered therefore never sees a sign-in page: the browser lands on redirect_mismatch, which reads as "the connector could not load the login page" rather than as a configuration problem.

That works for clients with one fixed callback and cannot work for the rest:

Client

Callback

Registrable?

Claude (web, Desktop)

https://claude.ai/api/mcp/auth_callback

yes

ChatGPT custom connector

https://chatgpt.com/connector_platform_oauth_redirect, or https://chatgpt.com/connector/oauth/<callback_id> when it cannot identify the issuer

the first only

VS Code / Insiders

https://vscode.dev/redirect

yes

Claude Code, Cursor, MCP Inspector

http://127.0.0.1:<port chosen at runtime>/callback

no

Set EDA_MCP_OAUTH_BROKER=1 and the server sends Cognito its own callback, {issuer}/oauth/callback, which is one fixed URL you register once. It seals the client's real redirect_uri into the OAuth state, and when Cognito comes back it forwards the authorization code to that URI with the client's own state restored. /token rewrites redirect_uri to match, because Cognito checks it a second time at the token exchange.

This moves the redirect check from Cognito to this server, so it stays a real check. Without one, anybody could start a flow here with a callback they control and collect a signed-in user's authorization code. oauth_broker.py is about as tight as the list it replaces: an HTTPS callback must match a known client's host exactly and, where that client's callback path is known, the path too (claude.ai/api/mcp/auth_callback, chatgpt.com/connector/oauth/…, vscode.dev/redirect). Subdomains are never implied — one open redirect or dangling CNAME under a vendor's domain would otherwise be a place to collect codes. Loopback is accepted per RFC 8252 §7.3, and private-use schemes from a short allowlist. Extend it with EDA_MCP_EXTRA_REDIRECT_HOSTS / EDA_MCP_EXTRA_REDIRECT_SCHEMES rather than by widening the code.

PKCE is mandatory in broker mode. Cognito treats code_challenge as optional, and the broker's /token rewrite removes the one check Cognito made there, so a flow without PKCE would leave the code bound to nothing — anyone who found it in a browser history or a proxy log could redeem it. /authorize refuses a brokered request without code_challenge_method=S256. Every MCP client already sends one.

Rollout order matters. Register {issuer}/oauth/callback on the Cognito app client first, then set EDA_MCP_OAUTH_BROKER=1. Doing it the other way round breaks the clients that work today, which is why the default is off.

Docker — run locally (same image you deploy to ECS/Fargate; includes easydeploy-ai-mcp[oauth]):

# Convenience: build + run (reads .env in the repo root if present)
./scripts/run_mcp_docker_local.sh

# Explicit env vars (no .env)
./scripts/run_mcp_docker_local.sh -e EDA_API_KEY="eda_live_..."

# Different host port
PORT=9000 ./scripts/run_mcp_docker_local.sh

Host on AWS (Fargate + ALB): build and push this repo’s Dockerfile to a container registry, then deploy behind an HTTPS load balancer. Set the env vars listed above on the task/container.

Manual equivalent:

docker build -t easydeploy-ai-mcp .
docker run --rm -p 8080:8080 \
  -e EDA_API_KEY="eda_live_..." \
  easydeploy-ai-mcp

Documentation

REST API reference

This MCP server is a thin client over the EasyDeploy public REST API. Endpoint behavior, request bodies, and response shapes are defined by EasyDeploy (dashboard, product help, and official API materials at easydeploy.ai). This repo does not duplicate the full OpenAPI spec; it maps those operations to MCP tools.

Releases and API compatibility

This repository is the open-source home of the EasyDeploy MCP server. New releases track the EasyDeploy public REST API as documented for customers (dashboard and official API materials). If the API adds or changes endpoints, expect corresponding updates here. Contributors should follow CONTRIBUTING.md when changing tools or client behavior.

Development

pip install -e ".[dev]"
pytest

Optional — real Cognito JWT against the HTTP app (live JWKS, no mocks): set EDA_INTEGRATION_COGNITO_ACCESS_TOKEN plus the same EDA_COGNITO_* vars you use for OAuth mode, then run pytest tests/test_cognito_jwt_integration.py -v. See the docstring in that file.

See CONTRIBUTING.md for pull requests and reporting issues.

Security

See SECURITY.md for vulnerability reporting and deployment notes.

License

MIT — see LICENSE.

Available Tools

28 tools
complete_uploadComplete uploadA

Register a validated upload as a dataset (the last step of every channel).

upload_request_id: opaque id returned by start_upload. dataset_id: omit it to create a new dataset named name. Pass an existing dataset's id (the one given to start_upload) to add a new version to that dataset; name is then still required but ignored, and the dataset keeps its current name. dataset_type: train | test | validation (default train). You produce these files by splitting the prepared data yourself: train is what the model learns from, test is the holdout you score afterwards with run_batch_prediction, and validation is an optional extra holdout. EasyDeploy stores the type as a label and never splits for you.

The upload session must be in status READY — not UPLOADED. READY means the validator has accepted and promoted the bytes. RECEIVING / UPLOADED / VALIDATING (still in flight), REJECTED (failed validation) and EXPIRED (needs a new start_upload) return 400 naming the current state and what to do. Call get_upload_status first and wait for READY instead of calling this tool on a guess.

Retrying is safe: if the session is already CONSUMED (an earlier call succeeded), the API returns the existing dataset version instead of an error. A 409 means another complete_upload for the same session is still in progress — wait a few seconds and call again.

A file the user uploaded through the web model builder is already a dataset — resolve it with list_datasets rather than calling this.

Returns dataset (id, name, ui_url) and datasetVersion once, at the top level, with its ui_url and columnNames as a list.

qa_status is informational and does not gate anything. version_type matters in one case: submit_training_job with an explicit dataset_version_id rejects a raw version. Omit dataset_version_id to train on the model version's own dataset.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
dataset_idNo
project_idYes
descriptionNo
dataset_typeNotrain
upload_request_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly=false, destructive=false, openWorld=false), yet the description adds substantial behavioral context: the session state machine, which states return 400 and why, what 409 means, and that a CONSUMED session returns the existing version. The only friction is that this retry-safety statement reads as idempotent behavior while the annotation sets idempotentHint=false; the annotation is best read as a conservative default here, and the description mutes rather than contradicts the mutation semantics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and then organized by parameter, then by state requirements, then by error handling — dense but every paragraph carries operational information. It is long, and the closing paragraph on qa_status/version_type is only loosely tied to this tool's own behavior, so slight trimming was possible.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool that ends an upload session, the description covers prerequisites, retry behavior, failure modes, and routing alternatives; the output schema exists so return values need no further explanation, and the brief mention of what is returned is harmless. Nothing an agent needs to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry all parameter meaning, and it does for the important ones: upload_request_id (opaque id from start_upload), dataset_id (omit to create new, pass existing to add a version, name then required but ignored), and dataset_type (train/test/validation with default and semantics). It leaves project_id and description unexplained, so it compensates strongly but not completely.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb and resource ('Register a validated upload as a dataset') and situates it in the workflow ('the last step of every channel'), which cleanly separates it from start_upload and get_upload_status. An agent can tell exactly what state transition this performs without consulting the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit prerequisites (session must be READY, not UPLOADED, and instructs calling get_upload_status first rather than guessing), explicit exclusions (a file uploaded via the web model builder should be resolved with list_datasets instead), and retry/409 escalation guidance. This is a full when/when-not/alternative treatment against named siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_dataset_versionCreate or update dataset versionA
Destructive

Create or update a dataset version.

Create (register an S3 file as a new version): Required: version_type (raw | qa_cleaned | training), file_url, qa_metadata (freeform JSON with QA results). file_url accepts either the file's s3:// URL (s3://{bucket}/users/{userId}/...) or its bare S3 key starting with users/{userId}/ — the s3Key field that complete_upload returns as datasetVersion.s3Key and get_dataset_version returns as s3Key. Any other form (an https URL, a key with another prefix) is refused before calling the API. The file must be under your own storage prefix users/{userId}/; the API rejects any other location with 400.

Update (change qa_status on an existing version): Required: version_id, qa_status (pending | in_progress | ready | blocked).

qa_status is informational and does not gate anything. version_type matters in one case: submit_training_job with an explicit dataset_version_id rejects a raw version. Omit dataset_version_id to train on the model version's own dataset.

ParametersJSON Schema
NameRequiredDescriptionDefault
file_urlNo
qa_statusNo
dataset_idYes
project_idYes
version_idNo
qa_metadataNo
version_typeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare destructiveHint=true, idempotentHint=false, readOnlyHint=false, and the description adds real value beyond them: client-side refusal of malformed file_url forms, an API 400 when the path is outside users/{userId}/, the fact that qa_status is purely informational, and the training-job constraint on raw versions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the two bolded mode headers and organized by required fields per branch, so the agent can parse it quickly. The s3Key cross-referencing (complete_upload / get_dataset_version) is somewhat dense but each sentence carries operational content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-param mutation tool with an output schema, everything an agent needs to invoke correctly is present: mode selection, required fields, input format constraints, failure conditions, and downstream effects on training. Return values are legitimately omitted given the output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must carry the load, and it documents five of seven parameters including enum values (version_type raw|qa_cleaned|training, qa_status pending|in_progress|ready|blocked) and the two accepted file_url formats. Only project_id and dataset_id scoping are left undescribed, which is a minor gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource and cleanly splits the two modes (create registering an S3 file as a version vs update changing qa_status). It names related siblings (complete_upload, get_dataset_version, submit_training_job) so an agent can place it in the workflow without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit conditions for choosing each mode (required field sets differ) and a concrete routing rule for submit_training_job with dataset_version_id. It stops short of distinguishing this tool from the sibling update_dataset, so the branch selection is clear but the sibling boundary is left implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_modelCreate or update modelA
Destructive

Create or update a model (create-or-update: not idempotent).

  • Create: call with project_id and name (and optional description). Each call without model_id creates another model.

  • Update/rename: also pass model_id plus the fields to change; this PATCHes the existing model.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
model_idNo
project_idYes
descriptionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=false, but the description adds the *reason* ('each call without model_id creates another model') and the underlying mechanism (PATCH on update). That is useful context beyond the annotations, though it says nothing about permissions or the effect of an update on unmentioned fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the key distinction (create-or-update, not idempotent) followed by two tight bullets. Every sentence carries actionable information with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value detail is not required, and the description fully covers the create/update dichotomy, the non-idempotency trap, and which fields matter. An agent has everything needed to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it largely does: it explains that project_id+name drive creation, that model_id switches the call to update mode, and that description is optional. It does not clarify what happens to unspecified fields on PATCH, leaving a small gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Create or update a model') and explicitly delineates two operating modes (create vs update/rename). This distinguishes it from siblings like create_model_version and get_model without opening their schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit conditions: call with project_id and name to create, add model_id to update/rename. It even warns that repeated calls without model_id create duplicates. It does not name an alternative sibling (e.g., get_model to inspect first), so it falls just short of a full when/when-not treatment.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_model_versionCreate model versionA

Create a model version tied to a dataset version and target column. Then call submit_training_job with the returned model version id.

Pass the train dataset's version, never the test one: a test file that reaches training is no longer a holdout. EasyDeploy does not check the type.

Set time_series_mode=true and time_column when forecasting ordered periods (e.g. weekly business metrics). Time-series mode uses forward-chaining cross-validation (TimeSeriesSplit) instead of shuffled k-fold: each fold trains on earlier periods and scores on later ones. get_model_report records the strategy a run used in metrics.crossValidation.strategy (time_series_split for forward-chaining).

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYes
project_idYes
time_columnNo
target_featureYes
time_series_modeNo
dataset_version_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare write/non-destructive/non-idempotent, so the safety profile is covered. The description adds real behavioral context beyond that: EasyDeploy does not validate dataset-type, so misuse silently breaks the holdout, and time_series_mode switches the downstream cross-validation to TimeSeriesSplit. It stops short of saying whether duplicate/creation calls fail or what the created version's state is.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action and next step, then the critical pitfall, then the optional time-series behavior. Well organized and mostly earned, though the final sentence about get_model_report recording the strategy is somewhat tangential for a create tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema exists so return values need not be explained. For a write tool operating in a multi-step workflow, the description supplies the sequencing, the data-hygiene caveat, and the semantics of the non-obvious parameters – nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the full burden. It explains dataset_version_id (must be the train split), target_feature (the target column), and both time_series_mode and time_column with their semantics and default behavior. model_id and project_id are left implicit, which is the only gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Create a model version') and immediately scopes it ('tied to a dataset version and target column'), distinguishing it from siblings create_model, create_dataset_version and get_model_version. An agent knows exactly what object is produced.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes to the next step ('Then call submit_training_job with the returned model version id'), states a hard prerequisite (pass the train version, never the test one, and why a leaked holdout is harmful), and gives the condition for time_series_mode ('when forecasting ordered periods'). This is when-to-use, when-not, and alternatives in one place.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_projectCreate or update projectA
Destructive

Create or update a project (create-or-update: not idempotent).

  • Create: call with name (and optional description). Each call without project_id creates another project.

  • Update/rename: pass project_id of an existing project plus the fields to change (name and/or description); this PATCHes it.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
project_idNo
descriptionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare idempotentHint=false and destructiveHint=true, but the description goes further by naming the practical consequence of non-idempotency (duplicate projects on repeated calls) and the PATCH/merge semantics of the update path. It does not explain the destructive side of destructiveHint=true, e.g. whether omitted fields are cleared or values overwritten, which is the remaining gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded headline sentence followed by two tightly scoped bullets, one per mode. No filler, and the key non-idempotency warning is placed in the leading line where it will be read.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described. With only three simple parameters and annotations covering the safety profile, the description supplies everything an agent needs to pick the correct mode and call it: branch condition, mutability, and the duplicate-creation hazard.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the burden falls on the description, and it delivers: it explains that project_id is the branch selector for update mode and that name/description are the mutable fields. It does not clarify the empty-string default for project_id/description in the schema, which would be the last missing piece.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb+resource (create/update a project) and immediately resolves the ambiguity of a dual-mode tool by spelling out the two branches. Siblings are list_projects/get_project, so no other tool competes for this purpose; an agent can tell exactly what this does without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit, mutually exclusive conditions: omit project_id to create, pass project_id plus fields to update/rename. That is a complete when-to-use rule for both branches, with the consequence of getting it wrong stated ('each call without project_id creates another project').

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_account_statusGet account statusA
Read-onlyIdempotent

Get current account status: tier, training credits, prediction usage, endpoint limits. customer_id is optional; the backend resolves the account from the API key.

ParametersJSON Schema
NameRequiredDescriptionDefault
customer_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the full safety profile (readOnly, idempotent, non-destructive, closed-world). The description adds the useful behavioral fact that the backend resolves the account from the API key when customer_id is empty, but stops short of explaining caching, freshness, or auth requirements. With annotations covering safety, a 3 is appropriate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences: the first enumerates what the status returns, the second clarifies the optional parameter. Nothing is wasted and the key scoping information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained. For a single-optional-param read tool with full annotation coverage, the description covers what the agent needs. It could more explicitly route against sibling status tools, but it is otherwise complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It does so effectively by explaining that customer_id is optional and that the backend falls back to the API-key-resolved account — meaning the empty default is a valid, meaningful value rather than a missing field. This is genuinely more than the bare schema conveys.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Get current account status') and enumerates exactly what the status contains (tier, credits, usage, limits). This distinguishes it from sibling status tools like get_upload_status and get_training_status, which return different resources.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The note that customer_id is optional and resolves from the API key gives implicit usage context, but the description never states when to call this tool vs alternatives like get_model_report or get_started. Guidance is implied rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_datasetGet datasetA
Read-onlyIdempotent

Fetch one dataset by id (name, description, type, timestamps). Read-only.

Datasets are created via complete_upload (the upload flow). To rename a dataset or change its description, use update_dataset.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataset_idYes
project_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, and the description's 'Read-only' is largely redundant with them. However, the lifecycle context (datasets originate from complete_upload, mutations live in update_dataset) is genuine behavioral context not present in the structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the core action and return fields; the routing note follows immediately. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no elaboration, and the alternative-tool guidance is complete. The only shortfall is the absent parameter guidance for the two required ids.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the description only says 'by id', never mentioning that project_id is also required alongside dataset_id, nor any format expectations. With two required undocumented parameters, the description fails to compensate for the schema gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Fetch one dataset by id') and enumerates the fields returned (name, description, type, timestamps), which cleanly separates it from list_datasets and get_dataset_version.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent: datasets are created via complete_upload, and renaming/description changes go to update_dataset. It tells the agent not just when to use this tool but which sibling to use instead for adjacent operations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_dataset_versionGet dataset versionA
Read-onlyIdempotent

Fetch one dataset version by id (row and column counts, columnNames list, qa_status, version_type).

qa_status is informational and does not gate anything. version_type matters in one case: submit_training_job with an explicit dataset_version_id rejects a raw version. Omit dataset_version_id to train on the model version's own dataset.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataset_idYes
project_idYes
version_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds real value beyond them: qa_status is informational and gates nothing, and a raw version is rejected by submit_training_job, which tells the agent how the returned version_type constrains downstream calls.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the action in the first clause, then gives return fields and a short caveat paragraph. Every sentence carries information, though the second paragraph drifts toward submit_training_job's behavior rather than this tool's.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and annotations covering the read-only profile, the description does not need to enumerate return values or safety behavior. What remains missing is any hint about id formats or failure modes when a version does not exist.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and none of the three required parameters (project_id, dataset_id, version_id) are explained in the description. It only implies that version_id identifies a dataset version; the id formats and the project/dataset/version hierarchy an agent must supply are left entirely to inference.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Fetch one dataset version by id') and enumerates what the response contains (counts, columnNames, qa_status, version_type). The singular 'one ... by id' implicitly contrasts with list_dataset_versions, but no sibling is named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explains how to interpret two returned fields and notes that version_type only matters when calling submit_training_job with an explicit dataset_version_id, which is useful routing context. However, it never states when to call this tool rather than list_dataset_versions or get_dataset, so the when-to-use guidance is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_modelGet modelB
Read-onlyIdempotent

Fetch a single model by id (name, description, version count).

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYes
project_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered. The description adds nothing behavioral beyond that, and its parenthetical about returned fields duplicates what the output schema already carries.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence with zero filler; the lookup key and the returned shape are stated immediately.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need not be restated, and annotations cover the safety profile, making the short description nearly sufficient for a simple getter. However, with 0% parameter coverage and no usage context, it leaves visible gaps for a two-required-parameter tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry the parameter burden, but it only gestures at 'id' and never disambiguates model_id from project_id, both required. An agent gets no help on which identifier to supply.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Fetch) and resource (model) with the scope qualifier 'single ... by id', which separates it from the list_models sibling. It does not explicitly distinguish itself from get_model_version, keeping it short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance, no prerequisites, and no mention of alternatives such as get_model_version or list_models. The usage is only inferable from the name and required ids.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_model_reportGet model reportA
Read-onlyIdempotent

Load the EDA training report (metrics, feature analysis, performance summary).

project_id is optional — the backend resolves it from model_id when omitted.

Omit model_version_id to use the latest version for this model. Pass an id from list_model_versions to read a specific version.

Default response is summary only (token-efficient). Set full_report=true for full detail.

The report is generated after training finishes, so this tool waits for it: 45 s by default (the server's EDA_REPORT_MAX_WAIT_SECONDS, never more than 60 s), since some hosts end a tool call at 60 s. If it is still being generated then, the result has timed_out: true and next_steps: nothing failed, call get_model_report again to keep waiting.

How the model was validated. Model search scores candidates by cross-validation: 10-fold stratified shuffled CV on ROC-AUC for classifiers, 10-fold shuffled CV on negative MSE for regressors; a version created with time_series_mode uses forward-chaining CV (TimeSeriesSplit) instead. The winning pipeline is then refit on all rows. There is no separate test set. Accuracy, the confusion matrix, per-class precision/recall and in-sample ROC-AUC are training fit (computed on the same rows the model learned from), not a holdout estimate. The CV score is the report's out-of-sample estimate, but it is measured inside the training file; the holdout estimate comes from scoring your own test file with run_batch_prediction, not from this report. The prose summary is written by an LLM and may use looser wording than these numbers.

metrics (returned next to the report, passed through unchanged): {taskType, crossValidation: {metric, score, strategy, folds, strategySource ('recorded'|'platform_default'), note}, trainingFit: {note, accuracy?, rocAuc?, confusionMatrix?, perClass?, mse?, rmse?, mae?, r2?, explainedVariance?, mape?}, additionalCv?: {r2?, rmse?}, warnings: []}. metrics is null when it cannot be derived, with metricsUnavailableReason saying why. crossValidation.strategy names the CV used for that run (time_series_split for forward-chaining); read warnings before quoting any number.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYes
project_idNo
full_reportNo
model_version_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only/idempotent, but the description adds substantial non-obvious behavior: a 45s default wait (capped at 60s), the timed_out:true + next_steps contract on timeout, the null metricsUnavailableReason path, and an instruction to read warnings before quoting numbers. This is exactly the context annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded and dense with no filler, and the operational rules come first. The extended paragraph on CV strategy and training-fit caveats is relevant for interpreting numbers but is long relative to the calling decision, slightly diluting an otherwise tight definition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite an output schema existing, the description still specifies the metrics object shape, the strategySource enum values, and the null case, and it resolves the 'accuracy is training fit, not holdout' ambiguity that would otherwise cause misuse. Nothing an agent needs to call and interpret this tool is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description bears the full burden and does so: it explains that project_id is optional and backend-resolved, that omitting model_version_id yields the latest version, and that full_report trades tokens for detail. Only model_id is left implicit, but its meaning is self-evident from the report context.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb and resource — 'Load the EDA training report' — and enumerates the contents (metrics, feature analysis, performance summary), which cleanly separates it from siblings like get_model, get_model_version, and get_training_status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit routing rules: omit model_version_id for latest, pass an id from list_model_versions for a specific version, project_id optional, full_report=true for detail, and that the real holdout estimate comes from run_batch_prediction rather than this report. An agent knows exactly when to call it and what to call instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_model_versionGet model versionA
Read-onlyIdempotent

Fetch a single model version by id (status, edaReportStatus, target, timestamps). Prefer this over list_model_versions when you already know the version_id.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYes
project_idYes
version_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety and idempotency profile is fully covered by structured data. The description's field list (status, edaReportStatus, target, timestamps) largely duplicates the existing output schema, so it adds little behavioral context beyond what annotations and the output schema already provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, zero filler, with the core action front-loaded and the disambiguation clause last. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only getter with rich annotations and an existing output schema, the description covers selection and scope adequately. The only gap is the unexplained parent-identifier semantics, which the schema does not supply either.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry the burden, yet it only names version_id (and only in the usage sentence). The parent identifiers project_id and model_id are never explained; an agent must infer the id hierarchy from the tool name. Partial compensation only.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Fetch a single model version by id') and even enumerates the payload fields (status, edaReportStatus, target, timestamps). It explicitly contrasts itself with list_model_versions, so an agent can distinguish the two without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Prefer this over list_model_versions when you already know the version_id' names the alternative and the exact condition that selects it. Nothing about tool selection is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_predictionGet predictionA
Read-onlyIdempotent

Fetch prediction status and result by prediction id.

  • Ad-hoc completed: output has the predicted label or value per row. For a classifier, probabilities has each row's probability_<class> values, in the same order.

  • Batch completed: download_url and curl_command are included automatically. curl_command is the HTTP GET that downloads the scored CSV through EasyDeploy's tokenized gateway; it carries a short-lived download token, never the API key.

  • Classifiers, ad-hoc and batch, also return classLabels: the label each <class> in probability_<class> stands for, such as {"0": "B", "1": "M"}. Regressors, models that give no probabilities, and predictions completed before these fields existed return neither field.

ParametersJSON Schema
NameRequiredDescriptionDefault
prediction_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower. The description adds real behavioral context: batch completions auto-include download_url/curl_command, the curl command carries a short-lived download token rather than the API key, and which fields are omitted for regressors. That is useful disclosure beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded and the remaining detail is organized as bullet points. It is dense, but each bullet is a distinct behavior; no filler sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter read tool with an output schema present, the description is more than complete; annotations cover safety and the return-shape detail is arguably redundant with the output schema but not harmful. Nothing needed to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description should compensate, but it only restates that the parameter is a 'prediction id' with no format, source, or constraint details. Marginal value over the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Fetch prediction status and result by prediction id'), which clearly separates it from list_predictions (enumerate) and run_prediction (execute). It does not explicitly name a sibling, but the verb+resource+key is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance: no mention of when to poll this versus list_predictions, no note that it requires a prediction id produced by run_prediction/run_batch_prediction, and no indication of behavior when the prediction is still running. The description offers no routing context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_projectGet projectC
Read-onlyIdempotent

Fetch a single project by id.

ParametersJSON Schema
NameRequiredDescriptionDefault
project_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered by structured data. The description adds nothing beyond that — no error behavior for a missing/invalid id, no permission requirements, no indication of what a not-found result looks like.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One short sentence with the key scoping word ("single") front-loaded and zero filler. It is terse rather than padded, though the terseness borders on under-specification.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need no explanation, and annotations carry the safety profile, so the remaining burden is light. Still, for a lookup tool that is one of many get_* siblings, some anchor for obtaining the project_id or distinguishing from list_projects would make it complete rather than merely adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for the single required project_id, but the description's phrase "by id" confirms the parameter is an identifier and that it selects exactly one record. That is a marginal but real addition; it does not supply format or source of the id.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb (fetch) and resource (a single project), and the word "single" implicitly contrasts with the sibling list_projects. However, it does not name or acknowledge any sibling explicitly, so the differentiation is left to inference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus list_projects or get_dataset/get_model counterparts. The single word "single" is the only hint about scope, and no prerequisites (e.g., where the project_id comes from) are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_startedRead the EasyDeploy playbookA
Read-onlyIdempotent

Return the EasyDeploy data-science playbook: how to prepare leakage-free training data, keep an honest test split, upload the files, train, validate on the holdout and predict with the model. Useful at the start of a modeling task.

section picks one part (overview, prepare, split, upload, train, validate, predict) or all; the default is overview. The result carries the playbook's guide_version, every section with a one-line summary, and the section that follows. The content ships with the server and changes between releases. Read-only; makes no API call.

ParametersJSON Schema
NameRequiredDescriptionDefault
sectionNooverview

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/openWorld=false, so the safety profile is covered. The description adds genuinely new behavior: the content 'ships with the server and changes between releases' (so results are version-dependent) and that it 'makes no API call', which explains why it always succeeds.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded and readable, but the parenthetical enumeration of the seven section names duplicates the enum already in the schema, and the return-shape sentence partially overlaps the output schema. Roughly one clause could be cut without loss.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, yet the description still notes the guide_version and next-section fields. Combined with purpose, usage context, parameter behavior and versioning caveat, an agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry the load. It explains that 'section' selects one part or 'all', names the default ('overview'), and describes what each selected value returns. The parenthetical list essentially restates the enum, but the default and the 'all' behavior are real additions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — 'Return the EasyDeploy data-science playbook' — and enumerates what the playbook covers (prepare, split, upload, train, validate, predict). No sibling tool returns guidance content, so the agent can distinguish it immediately from the operational tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear use context: 'Useful at the start of a modeling task.' It does not name an alternative, but none of the siblings overlaps (they are all operational read/write endpoints), so no exclusion is needed. Slightly short of explicit when/when-not framing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_training_statusGet training statusA
Read-onlyIdempotent

Check a training job by job_id (the jobId field from submit_training_job).

Response fields:

  • status: PENDING | RUNNING | COMPLETE | FAILED

  • trainingTimeSeconds: wall-clock seconds once the job stops; null while running

  • modelVersionId: the model version being trained

By default returns the current status immediately.

Set wait=true to block until the job reaches a terminal state (COMPLETE or FAILED). Polls every poll_interval_seconds (default 10 s) for up to timeout_seconds (45 s by default, at most 60 s; some hosts end a tool call at 60 s). Training can take from minutes to several hours depending on the plan and the data. If the timeout expires, the last polled status is returned with timed_out: true and next_steps: the job is still running, so call this tool again with the same job_id to keep waiting — do not resubmit the training job.

ParametersJSON Schema
NameRequiredDescriptionDefault
waitNo
job_idYes
timeout_secondsNoWith wait=true, how long to block, in seconds (default 45, at most 60; larger values are clamped). Hosts end long tool calls at different times, some at 60 s, so the default returns well before that; call get_training_status again to keep waiting.
poll_interval_secondsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only cover the safety profile (readOnly/idempotent/non-destructive); the description goes well beyond them by disclosing the polling interval, the 45s default and 60s ceiling, host-side tool-call cutoffs, and the exact timeout-expiry payload (timed_out: true plus next_steps). That is the operational context an agent cannot infer from annotations or schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the one-line purpose, then a compact response-field list, then the wait/timeout semantics. Bullets and inline code formatting make it scannable, and no sentence is filler — even the closing warning about not resubmitting carries distinct guidance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a polling tool with a long-running backend, everything needed is present: the terminal states, the timeout contract, the retry loop, and the response fields. An output schema exists, yet the description's field summary still adds clarity about null-while-running and timed_out rather than duplicating blindly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 25%, so the description must carry the load, and it does: job_id's provenance, wait=true semantics, poll_interval_seconds (default 10 s), and timeout_seconds (default 45, max 60, larger values clamped). Every parameter is given meaning beyond its bare type/default.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Check a training job by job_id') and immediately anchors the identifier to its source tool ('the jobId field from submit_training_job'), which cleanly separates it from sibling submit_training_job and from the unrelated get_upload_status/get_model_report.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly contrasts the default non-blocking behavior with wait=true, and gives a precise recovery rule for the timeout case: 'call this tool again with the same job_id to keep waiting — do not resubmit the training job.' It even notes training can take hours, telling the agent when polling is expected rather than a failure.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_upload_statusGet upload statusA
Read-onlyIdempotent

Poll an upload session by the upload_request_id from start_upload.

status is one of URL_ISSUED, RECEIVING, UPLOADED, VALIDATING, READY, REJECTED, CONSUMED, EXPIRED. It reports on sessions opened by start_upload, and every channel that feeds one (gateway PUT, host file parameter, upload_from_url) reports through this one tool. Files uploaded through the web model builder are not visible here — the user registers those in the web app; find them with list_datasets.

complete_upload only accepts READY — poll here first. On REJECTED, the error field names the validation check that failed; fix the file and start a new upload rather than retrying this session.

Also returns sizeBytes and rowCount once known — confirm the row count matches the file you handed over before registering the dataset.

ParametersJSON Schema
NameRequiredDescriptionDefault
upload_request_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the read-only/idempotent/non-destructive profile, so the description is free to add richer behavior — a full status state machine (URL_ISSUED through EXPIRED), the meaning of the error field on REJECTED, and the sizeBytes/rowCount verification step. These go well beyond what the annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core action and parameter source, then layers the status vocabulary, scope boundaries, and error handling. Every sentence carries actionable content; the enum list is dense but necessary.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return shape needs no explanation, yet the description still adds the useful sizeBytes/rowCount confirmation step. Scope, prerequisites, states, and failure paths are all covered for a polling tool of this complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and there is one parameter, so the description must carry it — and it does, tying upload_request_id to its origin in start_upload. It stops short of format/length details, but the key semantic (where the id comes from) is supplied.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Poll an upload session by the upload_request_id') and explicitly homes it in the start_upload workflow. It distinguishes itself from siblings by naming start_upload as the source of the id and scope-limiting which channels report here (gateway PUT, host file parameter, upload_from_url).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use ('complete_upload only accepts READY — poll here first'), when-not ('files uploaded through the web model builder are not visible here... find them with list_datasets'), and failure handling ('on REJECTED... start a new upload rather than retrying this session'). This is textbook routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_datasetsList datasetsB
Read-onlyIdempotent

List datasets in a project (id, name, type, timestamps).

ParametersJSON Schema
NameRequiredDescriptionDefault
project_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds only the returned field list, which is already implied by the output schema; it says nothing about pagination, result limits, or ordering for a list operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single tight sentence, front-loaded with the verb and resource, with no filler. It is efficient, though the parenthetical field list is redundant given the output schema and could have carried usage information instead.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only single-parameter list tool with an output schema, the essentials are covered, and return fields need not be restated. However, list semantics (pagination, ordering, empty results) are absent and the sibling routing is unaddressed, leaving gaps an agent would need to resolve.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter (project_id) at 0% schema description coverage, so the schema gives no semantics. The description's 'in a project' loosely implies project_id identifies the project, but adds no format, source, or validation detail beyond that.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List) and resource (datasets) scoped to a project, and names the fields returned. It is clear on its own but does not differentiate itself from siblings such as get_dataset (single dataset) or list_dataset_versions, which an agent must disambiguate by name alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to choose this over get_dataset or list_dataset_versions, and no note on prerequisites (e.g. that project_id must exist). The project scoping is implied but no alternatives or exclusions are named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_dataset_versionsList dataset versionsA
Read-onlyIdempotent

List all versions of a dataset (version number, version_type, qa_status, row counts).

project_id is optional — the backend resolves access from dataset_id when omitted. Column names, where present, come back as a columnNames list.

qa_status is informational and does not gate anything. version_type matters in one case: submit_training_job with an explicit dataset_version_id rejects a raw version. Omit dataset_version_id to train on the model version's own dataset.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataset_idYes
project_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish readOnly/idempotent/non-destructive, so the bar is lower. The description still adds real behavioral context: project_id is optional and the backend resolves access from dataset_id, and qa_status is informational rather than gating.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose and returned fields, then scoped notes. It loses a little economy to the trailing submit_training_job/version_type digression, which belongs more naturally in that sibling's documentation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values needn't be explained, and the description still covers the optionality and resolution behavior of the one tricky parameter plus qa_status semantics. It is complete enough for an agent to call correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must carry the burden. It adequately explains the one non-obvious parameter by stating project_id is optional with backend resolution via dataset_id; the required dataset_id is self-evident.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ("List all versions of a dataset") and even enumerates the returned fields. It is clearly distinguishable from the singular sibling get_dataset_version and from list_datasets, so an agent can select it without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by "all versions" versus the singular get_dataset_version, and the qa_status/version_type commentary gives useful context. But the version_type guidance actually concerns submit_training_job, not when to call this tool, and no explicit alternatives or exclusions are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_modelsList modelsA
Read-onlyIdempotent

List all models in a project (id, name).

ParametersJSON Schema
NameRequiredDescriptionDefault
project_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered without the description. The description adds only a hint at returned fields ('id, name'), which is redundant given an output schema exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler; it is appropriately sized for a trivial one-parameter list tool, though it is perhaps too thin to fully earn the space it takes.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only list tool with one required parameter and an output schema that documents return values, the description covers enough to invoke correctly. Pagination or result-size behavior is not addressed, but nothing critical is missing given the existing structured fields.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the sole parameter project_id is undocumented in the schema. The description's phrase 'in a project' weakly implies the project scope of that parameter, but provides no format or semantics beyond the name itself.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('List all models in a project'), which is clearly distinct from siblings like get_model (singular), create_model, and list_model_versions. It does not explicitly name those alternatives, so it falls short of the 5-level differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied — an agent can infer you call this to enumerate models within a known project, but there is no explicit when-to-use, no prerequisite statement, and no pointer to alternatives like get_model or list_model_versions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_model_versionsList model versionsB
Read-onlyIdempotent

List model versions. Training state is status (SUBMITTED → TRAINING → TRAINING_COMPLETED or TRAINING_FAILED). Report readiness is edaReportStatus (PENDING | GENERATING | READY | FAILED).

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYes
project_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint=false, closedWorld), so the bar is lower. The description then adds genuinely useful context beyond structured fields: the training state machine (SUBMITTED → TRAINING → TRAINING_COMPLETED/TRAINING_FAILED) and the report-readiness states, which tell the agent how to interpret and poll the returned data. It does not disclose pagination, ordering, or scoping behavior, keeping it from a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short, front-loaded sentences with no filler: purpose first, then the two state vocabularies. Nothing is wasted, though the state lines are terse enough to be slightly cryptic without framing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be spelled out, and the annotations cover safety. What remains missing is parameter scoping and any routing hint against the many sibling list/get tools, leaving the definition only minimally adequate for this simple list operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the two required parameters (project_id, model_id) are documented nowhere. The description never mentions them or explains how they scope the listing, so it fails to compensate for the schema gap despite the names being fairly self-evident.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource ("List model versions"), which unambiguously conveys the operation. However, it offers no differentiation from closely related siblings such as get_model_version or list_models, and the opening sentence is a bare restatement of the title, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance, no prerequisites, and no mention of alternatives (e.g., get_model_version for a single version, or list_models for models rather than versions). The agent is left to infer the routing decision entirely.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_predictionsList predictionsA
Read-onlyIdempotent

List predictions (newest first). Optionally filter by project_id. Use get_prediction(id) for full result + batch download URL.

ParametersJSON Schema
NameRequiredDescriptionDefault
project_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower. The description adds the useful behavioral fact that results come newest-first, but says nothing about pagination, result limits, or how an empty project_id behaves.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, no filler, with the ordering guarantee and optional filter front-loaded before the alternative-tool pointer.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter listing tool with an output schema (so return shape need not be explained) and full annotation coverage, this is nearly complete. The only missing pieces are pagination behavior and the meaning of the empty default project_id.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry the parameter burden. It does name the sole parameter and marks it optional, but adds no format details or behavior for the default empty string (presumably 'return all projects'), leaving a genuine gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List predictions') plus the ordering guarantee ('newest first'), which no sibling name conveys. It also explicitly distinguishes itself from the sibling get_prediction, which retrieves a single record.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description says to use get_prediction(id) when the caller needs the full result plus a batch download URL, which is a concrete routing rule. However, it does not state when NOT to use this list (e.g., for unpaginated bulk exports) or how it relates to run_prediction/run_batch_prediction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_projectsList projectsA
Read-onlyIdempotent

List all projects for this API key (id, name, description, timestamps). The ids are the project_id that the other project-scoped tools take.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive, and closed-world. The description adds useful context: it enumerates returned fields and explains that ids are the project_id used by other tools. It doesn't mention pagination or limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short, front-loaded sentences. Every clause carries information: scope, returned fields, and the downstream identifier semantics.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and full annotation coverage, the description needn't explain return values. It is nearly complete for a zero-param list tool; a note on pagination behavior would be the only meaningful addition.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters, so the baseline is 4. No parameter meaning exists to add, and the description does not need to compensate for any schema gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a clear verb+resource ('List all projects') scoped to 'this API key'. It distinguishes itself from get_project by listing versus fetching a single one, though it doesn't explicitly name the sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implied usage is clear from the name and the note about ids feeding other project-scoped tools, but there is no explicit when-to-use or when-to-prefer-get_project guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

run_batch_predictionRun batch predictionA

Score an entire dataset against a trained model version.

Each call starts a new batch job and spends one prediction credit per row; get_prediction follows one already started, by its prediction_id.

project_id and target_feature are auto-resolved from the model version record when omitted. dataset_version_id identifies both the input file and the row count for credit billing (one prediction credit per row).

Holdout validation: score your test dataset version with its labels still in it. The CSV you download via get_prediction is that file in its original row order with every column kept (target and ids included), plus prediction and, for classifiers, one probability_<class> column per class (probability_1 is the positive class for a 0/1 target); compute the holdout metrics and decision threshold yourself from it, since EasyDeploy does not return them. For a string target the probability columns are named by encoded class index (probability_0, probability_1, ... in sorted label order), not by label; the completed prediction's classLabels, from get_prediction, maps each index to its label. Columns the model was not trained on, such as ids, are ignored for scoring and kept in the output, so leave them in to join results back; every training feature must be present or the job fails naming the missing one. The download is capped at 9 MB, so keep test files small enough that their scored output fits, or split the test set across several batches.

Returns immediately by default (fire-and-poll). get_prediction(prediction_id) reports the status; for a completed batch it also has batch_output_available: true, download_url and curl_command. Set wait_for_result=true to block for max_wait_seconds (45 s by default, at most 60 s); if the batch is still running then, the result has timed_out: true and next_steps: poll get_prediction to keep waiting.

ParametersJSON Schema
NameRequiredDescriptionDefault
project_idNo
target_featureNo
wait_for_resultNo
max_wait_secondsNoWith wait_for_result=true, how long to wait, in seconds (default 45, at most 60; larger values are clamped). Hosts end long tool calls at different times, some at 60 s, so the default returns well before that; poll get_prediction to keep waiting.
model_version_idYes
dataset_version_idYes
poll_interval_secondsNoSeconds between status checks while waiting (default 5.0). Values below 2 are raised to 2.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare the generic non-readonly/non-idempotent profile; the description goes well beyond by disclosing credit cost per row, the auto-resolution of project_id/target_feature, the hard failure mode when a training feature is missing, and the 9 MB download cap. The timeout/clamping behavior and the poll-to-keep-waiting fallback give the agent the operational picture annotations cannot.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded correctly: purpose, then billing, then fleet/timing semantics, then the holdout-validation guidance. Every sentence adds information, but the holdout paragraph is long and drifts toward task-level tutorial content rather than tool-selection guidance, costing some tightness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-parameter, async, credit-spending job with rich outputs, the description covers inputs, billing, failure modes, polling, and download constraints. Although an output schema exists, the extra explanation of the CSV's prediction/probability columns and classLabels is aligned with the schema rather than redundant noise.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With schema description coverage at 29%, the description carries most of the load: it explains that project_id and target_feature are auto-resolved when omitted, and that dataset_version_id identifies both the input file and the row count used for billing. model_version_id is left to inference, but the three schema-documented timing parameters are covered in the schema itself, so the gap is narrow.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a precise verb+resource+scope: 'Score an entire dataset against a trained model version.' It immediately distinguishes itself from the sibling run_prediction (single-row) and get_prediction (follows an already-started job), so an agent can route correctly without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states that each call starts a NEW batch job and that get_prediction is the tool for following an existing one, naming the selecting condition (you already have a prediction_id). It also gives concrete when-to-use guidance for wait_for_result=true versus fire-and-poll, including what to do after timed_out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

run_predictionRun predictionA

Run a single ad-hoc prediction against a trained model version.

Each call is a new prediction and spends a prediction credit; get_prediction follows one still running, by its prediction_id.

project_id and target_feature are auto-resolved from the model version record when omitted. By default waits and returns the predicted label or value in output. For a classifier the result also has probabilities, one {"probability_<class>": p} object per entry of output, named like run_batch_prediction's CSV columns, and classLabels, the label each <class> stands for: {"0": "B", "1": "M"} for a text target, {"0": 0, "1": 1} for a 0/1 target. output follows the model's default rule, so a threshold you chose applies to the probability, not to output. Regressors return neither. Set wait_for_result=false to return immediately with prediction_id. A wait lasts max_wait_seconds (45 s by default, at most 60 s); if the prediction is still running then, the result has timed_out: true and next_steps: poll get_prediction to keep waiting.

ParametersJSON Schema
NameRequiredDescriptionDefault
input_dataYes
project_idNo
target_featureNo
wait_for_resultNo
max_wait_secondsNoWith wait_for_result=true, how long to wait, in seconds (default 45, at most 60; larger values are clamped). Hosts end long tool calls at different times, some at 60 s, so the default returns well before that; poll get_prediction to keep waiting.
model_version_idYes
poll_interval_secondsNoSeconds between status checks while waiting (default 2.0). Values below 2 are raised to 2.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Rich disclosure beyond annotations: notes a prediction credit is spent, output format for classifiers vs regressors, how probabilities and classLabels are structured, that output uses the model's default rule, the max_wait_seconds clamp and timeout behavior with 'timed_out' and 'next_steps' returned. Annotations only provide basic hints like readOnlyHint=false, idempotentHint=false; the description adds substantial operational detail.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the main action and key details, then elaborates on output and waiting behavior. Some sentences are long and dense, but every sentence contributes useful information. Slightly verbose but appropriate for a complex tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a tool with 7 params, nested input_data, and an output schema, the description covers all critical aspects: required params, auto-resolution, output format for classifiers/regressors, timeout behavior, and alternative tool usage. The output schema is present but the description still adds value by explaining the output structure's meaning.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 29%, so description must compensate. It explains model_version_id is required (implied), that project_id and target_feature are auto-resolved when omitted, and the semantics of wait_for_result and max_wait_seconds. However, it does not clarify input_data structure or poll_interval_seconds beyond what's in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: 'Run a single ad-hoc prediction against a trained model version.' Clearly distinguishes it from run_batch_prediction (single vs batch) and from get_prediction (which 'follows one still running, by its prediction_id').

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly describes when to use it versus get_prediction: 'Each call is a new prediction and spends a prediction credit; get_prediction follows one still running.' Also explains the wait_for_result flag to choose between immediate and blocking behavior.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

start_uploadStart file uploadA

Open an upload session for one file and return the ways to send its bytes.

One session carries one file. Train and test files (and an optional validation file) are separate uploads, each with its own start_upload. File bytes never travel through tool arguments or the conversation on any channel:

A. Host file parameter (preferred where available). Hosts that support openai/fileParams (Codex, ChatGPT) hydrate file from a sandbox path. EasyDeploy then fetches the bytes server-side and the session goes straight to RECEIVING, with no network needed from the sandbox. Poll get_upload_status until READY, then call complete_upload.

B. Gateway PUT (default). Called without file, this returns curl_command, the HTTP PUT that sends the file to EasyDeploy's upload gateway. It runs in the shell where the file is, with FILE_PATH replaced by the file's path. Max ~6 MB; it carries a single-use upload token, never the API key. If the sandbox blocks network egress, next_steps names the exact API host the user can allow.

C. Fetch from a share link. If the sandbox cannot reach the network but the file sits at a shareable URL, upload_from_url with the returned upload_request_id has EasyDeploy fetch it.

The returned next_steps is the ordered runbook with the ids filled in, including the web model-builder fallback for hosts with no byte channel at all. The model-builder URL for this environment comes from the API in the fallback string of this result (for example https://www.easydeploy.ai/model-builder).

dataset_id: omit it to create a new dataset when complete_upload runs. Pass an existing dataset's id to add a new version to that dataset instead; complete_upload's name is then ignored and the dataset keeps its current name. The output carries dataset_id only when you passed one.

ParametersJSON Schema
NameRequiredDescriptionDefault
fileNo
filenameYes
dataset_idNo
project_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the mutation and open-world profile (readOnlyHint=false, openWorldHint=true, idempotentHint=false). The description goes well beyond them by disclosing the single-use upload token, that the API key is never carried, a ~6 MB size cap, the RECEIVING->READY lifecycle, and egress-fallback behavior — meaningfully richer than the annotations alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Long, but front-loaded and organized into A/B/C channels plus a bolded dataset_id paragraph, so an agent can scan it. A few asides (e.g. the model-builder URL example) could be trimmed, but nearly every sentence carries decision-relevant information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values needn't be detailed, yet the description still explains next_steps, upload_request_id and dataset_id echo. Given the multi-channel upload complexity and 0% param coverage, it is complete enough for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the burden and largely does: it explains `file` (host hydration shape, bytes fetched server-side), `dataset_id` (omit for new dataset, pass for new version, name ignored, echoed only when passed). `filename` and `project_id` are left implicit, but the two hard parameters are well covered.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Open an upload session for one file and return the ways to send its bytes') and immediately scopes it to one file per session, distinguishing it from the sibling upload_from_url, complete_upload and get_upload_status it references.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Lays out three numbered channels (A host file param, B gateway PUT, C share link) with explicit conditions for choosing each, including network-egress caveats, and names the exact follow-up sequence (poll get_upload_status, then complete_upload). It even explains the dataset_id create-vs-new-version fork.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

submit_training_jobStart model trainingA
Destructive

Submit a training job for a model version.

Each call starts a separate training job and spends one training credit; get_training_status follows a job already submitted, by its job_id.

Track completion: Poll list_model_versions for the model and watch the target version's status until it reaches TRAINING_COMPLETED or TRAINING_FAILED (same as the web UI). This is the most reliable approach across MCP hosts.

Or pass the returned jobId to get_training_status with wait=true to block until the job finishes. Run time depends on the plan and the data, from minutes to several hours.

dataset_version_id can be omitted when the model version was created with create_model_version in the same flow — the backend resolves target_feature, file, and dataset from the model version record automatically. Omit it to train on the model version's own dataset. Pass it only to override with a different qa_cleaned or training version: an explicit dataset_version_id whose version_type is raw (every upload starts as raw) is rejected with 400 INVALID_VERSION_TYPE.

Returns {jobId, modelVersionId, status}.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_version_idYes
dataset_version_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations mark it destructive/non-idempotent, and the description adds genuinely new context: each call spends one training credit, every call starts a separate job, runtime ranges from minutes to hours, and passing a 'raw' dataset_version_id is rejected with 400 INVALID_VERSION_TYPE. This goes well beyond the safety hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and cost, then well-sectioned guidance for tracking and the optional param. It is longer than strictly necessary but each block (tracking, dataset_version_id rules) earns its space.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a credit-spending, non-idempotent mutation the description covers cost, idempotency implications, tracking paths, and parameter edge cases, and even echoes the return shape despite an output schema existing. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry the load, and it explains dataset_version_id in depth (omission behavior, override semantics, backend resolution, raw rejection). model_version_id is only implicitly defined by the tool's purpose, so one of the two params lacks explicit semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Submit a training job for a model version') that an agent can distinguish from siblings like get_training_status and create_model_version. The description immediately clarifies that this starts a job versus the siblings that follow or set up one.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent: this call starts a job and spends a credit, while get_training_status follows an already-submitted job by job_id. It also gives precise conditions for omitting vs passing dataset_version_id and names the alternative flow, leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_datasetUpdate datasetA
DestructiveIdempotent

Rename a dataset or change its description.

Pass at least one of name or description; fields left empty are not changed. Repeating the same call leaves the dataset in the same state. Returns the updated dataset record.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
dataset_idYes
project_idYes
descriptionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare idempotentHint=true and destructiveHint=true, so the description's 'repeating the same call leaves the dataset in the same state' largely restates the annotation. It does add genuinely useful behavior beyond annotations by clarifying partial-update semantics ('fields left empty are not changed'), but it never explains that a supplied description overwrites the existing one, which is the destructive behavior the annotation flags.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the core action and with zero filler. The closing sentence about returning the updated dataset record is redundant given a dedicated output schema exists, a minor wasted line.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a four-parameter mutation tool with annotations and a full output schema, the description supplies the essential missing piece (partial-update semantics) and need not explain return values. An agent could call this correctly; only the overwrite behavior of description and the role of the two ID parameters remain implicit.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description has to carry the load, and it does for the two meaningful optional parameters: at least one of name/description must be supplied, and the empty-string default means 'no change'. project_id and dataset_id are left unexplained, but they are self-evident identifiers whose required status is already encoded in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb+resource ('Rename a dataset or change its description') and scopes it to exactly two mutable fields, which separates it from versioning siblings like create_dataset_version and read siblings like get_dataset. It stops short of naming an alternative, but the operation is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Pass at least one of name or description' gives a real precondition for invocation, and the rename-or-re-describe framing implies the context of use. However, there is no explicit guidance on when to use this versus create_dataset_version (content changes) or get_dataset, so usage is only implied rather than routed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upload_from_urlUpload from share linkA

Hand EasyDeploy a URL to fetch an upload session's bytes from, server-side.

Use this when the sandbox has no network egress (the gateway curl failed with a connection error) but the training file already lives at a shareable URL, or when a host handed you a file download link.

Accepted sources:

  • Google Sheets and Google Drive share links set to anyone with the link (Sheets are exported as CSV).

  • OpenAI file links from a host file parameter.

  • Any other host on the EasyDeploy source allowlist.

EasyDeploy fetches the bytes itself, up to 256 MB. The file never passes through the model, the conversation, or this tool's arguments — pass a URL, never file contents. Private, loopback, and metadata addresses are rejected, as is any host off the allowlist; the error explains which rule refused the URL.

Returns the session in RECEIVING. A 409 means the session already received bytes or expired — call start_upload again for a fresh one. If no channel works at all, the fallback string in the start_upload result carries the web model-builder URL for this environment (for example https://www.easydeploy.ai/model-builder).

ParametersJSON Schema
NameRequiredDescriptionDefault
source_urlYes
upload_request_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds substantial context beyond annotations: the 256 MB cap, that bytes never pass through the model/conversation, SSRF protections (private, loopback, metadata addresses rejected), the allowlist rule, the RECEIVING end state, and 409 semantics. These are behavioral traits the openWorldHint/destructiveHint flags cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then organized into accepted sources, limits, and return/error behavior. Efficient and scannable, though the final paragraph about start_upload's fallback string drifts slightly into another tool's territory.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given an output schema exists, the description need not restate return values, yet it still covers the RECEIVING state, the 409 failure mode, size limits, and security rejections. Nothing an agent needs to invoke this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must carry the load. It defines source_url thoroughly (accepted sources, URL-never-contents rule), but upload_request_id is only implied as coming from start_upload rather than defined explicitly. Strong compensation overall, one identifiable gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource plus the mechanism: 'Hand EasyDeploy a URL to fetch an upload session's bytes from, server-side.' It also distinguishes itself from siblings by referencing start_upload's session and the fallback path, so an agent can tell it apart from complete_upload or plain start_upload.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit triggering conditions: 'when the sandbox has no network egress (the gateway curl failed with a connection error)' or 'when a host handed you a file download link.' It also names the recovery alternative (409 → call start_upload again) and the ultimate fallback channel, covering when-not and what-to-do-instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 3 tool updatesv0.4.3
    • Changedget_training_status2 fields changed
      • changedInput schema / properties / timeout_seconds / default
        Previous value: -150New value: +45
      • changedInput schema / properties / timeout_seconds / description
        Previous value: -"With wait=true, how long to block, in seconds (default 150). Values above 150 are clamped to 150 so the call returns before MCP hosts end it (about 3 minutes); call get_training_status again to keep waiting."New value: +"With wait=true, how long to block, in seconds (default 45, at most 60; larger values are clamped). Hosts end long tool calls at different times, some at 60 s, so the default returns well before that; call get_training_status again to keep waiting."
    • Changedrun_batch_prediction2 fields changed
      • changedInput schema / properties / max_wait_seconds / default
        Previous value: -150New value: +45
      • changedInput schema / properties / max_wait_seconds / description
        Previous value: -"With wait_for_result=true, how long to wait, in seconds (default 150). Values above 150 are clamped to 150 so the call returns before MCP hosts end it (about 3 minutes); poll get_prediction to keep waiting."New value: +"With wait_for_result=true, how long to wait, in seconds (default 45, at most 60; larger values are clamped). Hosts end long tool calls at different times, some at 60 s, so the default returns well before that; poll get_prediction to keep waiting."
    • Changedrun_prediction2 fields changed
      • changedInput schema / properties / max_wait_seconds / default
        Previous value: -150New value: +45
      • changedInput schema / properties / max_wait_seconds / description
        Previous value: -"With wait_for_result=true, how long to wait, in seconds (default 150). Values above 150 are clamped to 150 so the call returns before MCP hosts end it (about 3 minutes); poll get_prediction to keep waiting."New value: +"With wait_for_result=true, how long to wait, in seconds (default 45, at most 60; larger values are clamped). Hosts end long tool calls at different times, some at 60 s, so the default returns well before that; poll get_prediction to keep waiting."
  2. 12 tool updatesv0.3.0
    • Changedcomplete_upload1 field changed
      • addedInput schema / properties / dataset_type / enum
        Added value: +[
        +  "train",
        +  "test",
        +  "validation"
        +]
    • Changedcreate_dataset_version2 fields changed
      • addedInput schema / properties / qa_status / enum
        Added value: +[
        +  "",
        +  "pending",
        +  "in_progress",
        +  "ready",
        +  "blocked"
        +]
      • addedInput schema / properties / version_type / enum
        Added value: +[
        +  "",
        +  "raw",
        +  "qa_cleaned",
        +  "training"
        +]
    • Changedcreate_model_version2 fields changed
      • addedInput schema / properties / time_column
        Added value: +{
        +  "default": "",
        +  "type": "string"
        +}
      • addedInput schema / properties / time_series_mode
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
    • Changedget_dataset2 fields changed
      • removedInput schema / properties / description
        Removed value: -{
        -  "default": "",
        -  "type": "string"
        -}
      • removedInput schema / properties / name
        Removed value: -{
        -  "default": "",
        -  "type": "string"
        -}
    • Addedget_started
    • Changedget_training_status2 fields changed
      • changedInput schema / properties / timeout_seconds / default
        Previous value: -180New value: +150
      • addedInput schema / properties / timeout_seconds / description
        Added value: +"With wait=true, how long to block, in seconds (default 150). Values above 150 are clamped to 150 so the call returns before MCP hosts end it (about 3 minutes); call get_training_status again to keep waiting."
    • Addedget_upload_status
    • Changedrun_batch_prediction3 fields changed
      • changedInput schema / properties / max_wait_seconds / default
        Previous value: -600New value: +150
      • addedInput schema / properties / max_wait_seconds / description
        Added value: +"With wait_for_result=true, how long to wait, in seconds (default 150). Values above 150 are clamped to 150 so the call returns before MCP hosts end it (about 3 minutes); poll get_prediction to keep waiting."
      • addedInput schema / properties / poll_interval_seconds / description
        Added value: +"Seconds between status checks while waiting (default 5.0). Values below 2 are raised to 2."
    • Changedrun_prediction3 fields changed
      • changedInput schema / properties / max_wait_seconds / default
        Previous value: -90New value: +150
      • addedInput schema / properties / max_wait_seconds / description
        Added value: +"With wait_for_result=true, how long to wait, in seconds (default 150). Values above 150 are clamped to 150 so the call returns before MCP hosts end it (about 3 minutes); poll get_prediction to keep waiting."
      • addedInput schema / properties / poll_interval_seconds / description
        Added value: +"Seconds between status checks while waiting (default 2.0). Values below 2 are raised to 2."
    • Changedstart_upload1 field changed
      • addedInput schema / properties / file
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "description": "A file handed over by the MCP host (OpenAI Apps SDK file-parameter shape).\n\nHosts that support ``openai/fileParams`` replace this argument with a\nshort-lived ``download_url`` plus a ``file_id``. The model never sees or\nwrites the file's bytes; EasyDeploy fetches them server-side.",
        +      "properties": {
        +        "download_url": {
        +          "type": "string"
        +        },
        +        "file_id": {
        +          "type": "string"
        +        },
        +        "file_name": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ],
        +          "default": null
        +        },
        +        "mime_type": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ],
        +          "default": null
        +        }
        +      },
        +      "required": [
        +        "download_url",
        +        "file_id"
        +      ],
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
    • Addedupdate_dataset
    • Addedupload_from_url
  3. 24 tool updatesv0.1.0
    • First observedcomplete_upload
    • First observedcreate_dataset_version
    • First observedcreate_model
    • First observedcreate_model_version
    • First observedcreate_project
    • First observedget_account_status
    • First observedget_dataset
    • First observedget_dataset_version
    • First observedget_model
    • First observedget_model_report
    • First observedget_model_version
    • First observedget_prediction
    • First observedget_project
    • First observedget_training_status
    • First observedlist_dataset_versions
    • First observedlist_datasets
    • First observedlist_model_versions
    • First observedlist_models
    • First observedlist_predictions
    • First observedlist_projects
    • First observedrun_batch_prediction
    • First observedrun_prediction
    • First observedstart_upload
    • First observedsubmit_training_job

TDQS

A3.8/5.0

Scored across 28 tools

Disambiguation4/5

Most tools target clearly distinct resources and actions, and the upload/train/predict flows are well explained. Minor overlap exists between get_training_status and model-version status tracking, and between complete_upload and create_dataset_version for registering dataset versions.

Naming Consistency5/5

Tool names consistently use snake_case with predictable verb_noun phrasing such as list_projects, get_dataset, create_model_version, and run_batch_prediction. The few create_* tools that also update still follow the same naming convention.

Tool Count3/5

28 tools is heavy, though it reflects a broad MLOps platform spanning projects, datasets, versions, models, training, and predictions. Several list/get pairs could likely be consolidated, but few tools are clearly redundant.

Completeness4/5

The core ML lifecycle is well covered: upload, dataset/model/version creation, training, reporting, and ad-hoc/batch prediction. Gaps remain around deletion operations, model-version updates, and endpoint/deployment management hinted at by account status.

Maintenance

ActivityNo data
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    A Model Context Protocol server that provides integration with the Coolify API, enabling DevOps teams to manage Coolify deployments, applications, services, and servers through MCP tools.
    32
    112 npm
    45
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    A Model Context Protocol server that allows integration with Claude Desktop by creating and managing custom tools that can be executed through the MCP framework.
    30 npm
    -
  • A
    license
    A
    quality
    D
    maintenance
    A Model Context Protocol server that enables AI assistants to make HTTP requests (GET, POST, PUT, DELETE) to external APIs through standardized MCP tools.
    4
    2
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    A Model Context Protocol (MCP) server built with the mcp-framework for developing and managing custom tools. It provides a structured foundation for building and integrating modular components like data processors and API clients into Claude Desktop.
    12 npm
    -