{
  "$comment": "EasyDeploy AI MCP server tool catalog. Mirrors the shape of an MCP tools/list response, so it can be diffed against a live server. Endpoint: https://mcp.easydeploy.ai/mcp. Transport: streamable HTTP. Auth: OAuth 2.0 (RFC 9728) or Authorization: Bearer <api-key>.",
  "server": {
    "name": "easydeploy-ai",
    "title": "EasyDeploy AI",
    "version": "1.0.0",
    "endpoint": "https://mcp.easydeploy.ai/mcp",
    "transport": "streamable-http",
    "auth": ["oauth2", "bearer-api-key"],
    "source": "https://github.com/EasyDeploy-AI/easydeploy-ai-mcp",
    "toolCount": 24
  },
  "tools": [
    {
      "name": "get_account_status",
      "group": "Account",
      "description": "Get current account status: tier, training credits, prediction usage, endpoint limits. customer_id is optional; the backend resolves the account from the API key.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "customer_id": { "type": "string", "default": "" }
        }
      }
    },
    {
      "name": "list_projects",
      "group": "Projects",
      "description": "List all projects for this API key (id, name, description, timestamps). Call this first to obtain project IDs needed by other tools.",
      "inputSchema": { "type": "object", "additionalProperties": false, "properties": {} }
    },
    {
      "name": "get_project",
      "group": "Projects",
      "description": "Fetch a single project by id.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": { "project_id": { "type": "string" } },
        "required": ["project_id"]
      }
    },
    {
      "name": "create_project",
      "group": "Projects",
      "description": "Create or update a project. Create: call with name and optional description. Update or rename: pass project_id of an existing project plus the fields to change.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "name": { "type": "string" },
          "description": { "type": "string", "default": "" },
          "project_id": { "type": "string", "default": "" }
        },
        "required": ["name"]
      }
    },
    {
      "name": "list_datasets",
      "group": "Datasets",
      "description": "List datasets in a project (id, name, type, timestamps).",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": { "project_id": { "type": "string" } },
        "required": ["project_id"]
      }
    },
    {
      "name": "get_dataset",
      "group": "Datasets",
      "description": "Fetch or update a dataset. Read: call with project_id and dataset_id only. Update or rename: also pass name and/or description. Datasets are created via complete_upload; use this tool for reads and metadata edits.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "project_id": { "type": "string" },
          "dataset_id": { "type": "string" },
          "name": { "type": "string", "default": "" },
          "description": { "type": "string", "default": "" }
        },
        "required": ["project_id", "dataset_id"]
      }
    },
    {
      "name": "start_upload",
      "group": "Datasets",
      "description": "Start an upload request and return a gateway upload curl command. Three-step flow: call start_upload, run the returned curl_command with the real file path, then call complete_upload with the upload_request_id. No auth header is needed in the curl command. Pass dataset_id when uploading a new version of an existing dataset.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "project_id": { "type": "string" },
          "filename": { "type": "string" },
          "dataset_id": { "type": "string", "default": "" }
        },
        "required": ["filename", "project_id"]
      }
    },
    {
      "name": "complete_upload",
      "group": "Datasets",
      "description": "Finalize an upload after start_upload and the curl PUT. The gateway PUT must return HTTP 2xx first, otherwise the API responds 400 because the upload session is not yet UPLOADED. If the dataset already exists, a new version is created automatically. Returns the dataset record with id, name and the new datasetVersion.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "project_id": { "type": "string" },
          "name": { "type": "string" },
          "upload_request_id": { "type": "string" },
          "dataset_id": { "type": "string", "default": "" },
          "dataset_type": { "type": "string", "default": "train", "enum": ["train", "test", "validation"] },
          "description": { "type": "string", "default": "" }
        },
        "required": ["project_id", "name", "upload_request_id"]
      }
    },
    {
      "name": "list_dataset_versions",
      "group": "Datasets",
      "description": "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.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "dataset_id": { "type": "string" },
          "project_id": { "type": "string", "default": "" }
        },
        "required": ["dataset_id"]
      }
    },
    {
      "name": "get_dataset_version",
      "group": "Datasets",
      "description": "Fetch one dataset version by id (metadata, qa_status, version_type).",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "project_id": { "type": "string" },
          "dataset_id": { "type": "string" },
          "version_id": { "type": "string" }
        },
        "required": ["project_id", "dataset_id", "version_id"]
      }
    },
    {
      "name": "create_dataset_version",
      "group": "Datasets",
      "description": "Create or update a dataset version. Create, registering an object-store file as a new version: requires version_type (raw, qa_cleaned or training), file_url and qa_metadata. Update, changing qa_status on an existing version: requires version_id and qa_status (pending, in_progress, ready or blocked).",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "project_id": { "type": "string" },
          "dataset_id": { "type": "string" },
          "version_type": { "type": "string", "default": "", "enum": ["", "raw", "qa_cleaned", "training"] },
          "file_url": { "type": "string", "default": "" },
          "qa_metadata": { "anyOf": [{ "type": "object", "additionalProperties": true }, { "type": "null" }], "default": null },
          "version_id": { "type": "string", "default": "" },
          "qa_status": { "type": "string", "default": "", "enum": ["", "pending", "in_progress", "ready", "blocked"] }
        },
        "required": ["project_id", "dataset_id"]
      }
    },
    {
      "name": "list_models",
      "group": "Models",
      "description": "List all models in a project (id, name).",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": { "project_id": { "type": "string" } },
        "required": ["project_id"]
      }
    },
    {
      "name": "get_model",
      "group": "Models",
      "description": "Fetch a single model by id (name, description, version count).",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "project_id": { "type": "string" },
          "model_id": { "type": "string" }
        },
        "required": ["project_id", "model_id"]
      }
    },
    {
      "name": "create_model",
      "group": "Models",
      "description": "Create or update a model. Create: call with project_id and name, plus optional description. Update or rename: also pass model_id plus the fields to change.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "project_id": { "type": "string" },
          "name": { "type": "string" },
          "description": { "type": "string", "default": "" },
          "model_id": { "type": "string", "default": "" }
        },
        "required": ["project_id", "name"]
      }
    },
    {
      "name": "list_model_versions",
      "group": "Models",
      "description": "List model versions. Training state is status (SUBMITTED, TRAINING, TRAINING_COMPLETED or TRAINING_FAILED). Report readiness is edaReportStatus (PENDING, GENERATING, READY or FAILED).",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "project_id": { "type": "string" },
          "model_id": { "type": "string" }
        },
        "required": ["project_id", "model_id"]
      }
    },
    {
      "name": "get_model_version",
      "group": "Models",
      "description": "Fetch a single model version by id (status, edaReportStatus, target, timestamps). Prefer this over list_model_versions when the version_id is already known.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "project_id": { "type": "string" },
          "model_id": { "type": "string" },
          "version_id": { "type": "string" }
        },
        "required": ["project_id", "model_id", "version_id"]
      }
    },
    {
      "name": "create_model_version",
      "group": "Models",
      "description": "Create a model version tied to a dataset version and target column. Then call submit_training_job with the returned model version id.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "project_id": { "type": "string" },
          "model_id": { "type": "string" },
          "dataset_version_id": { "type": "string" },
          "target_feature": { "type": "string" }
        },
        "required": ["project_id", "model_id", "dataset_version_id", "target_feature"]
      }
    },
    {
      "name": "get_model_report",
      "group": "Models",
      "description": "Load the training report for a model version: metrics, feature analysis and performance summary. project_id is optional and resolved from model_id. Omit model_version_id to use the latest version. Default response is the summary only; set full_report true for full detail.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "model_id": { "type": "string" },
          "model_version_id": { "type": "string", "default": "" },
          "project_id": { "type": "string", "default": "" },
          "full_report": { "type": "boolean", "default": false }
        },
        "required": ["model_id"]
      }
    },
    {
      "name": "submit_training_job",
      "group": "Training",
      "description": "Submit a training job for a model version. Returns jobId, modelVersionId and status. 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. Track completion with get_training_status, or poll list_model_versions until status reaches TRAINING_COMPLETED or TRAINING_FAILED.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "model_version_id": { "type": "string" },
          "dataset_version_id": { "type": "string", "default": "" }
        },
        "required": ["model_version_id"]
      }
    },
    {
      "name": "get_training_status",
      "group": "Training",
      "description": "Check a training job by job_id. Returns status (PENDING, RUNNING, COMPLETE or FAILED), trainingTimeSeconds once the job stops, and modelVersionId. Set wait true to block until a terminal state, polling every poll_interval_seconds for up to timeout_seconds. If the timeout expires the last polled status is returned with timed_out true.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "job_id": { "type": "string" },
          "wait": { "type": "boolean", "default": false },
          "poll_interval_seconds": { "type": "number", "default": 10 },
          "timeout_seconds": { "type": "integer", "default": 180 }
        },
        "required": ["job_id"]
      }
    },
    {
      "name": "run_prediction",
      "group": "Predictions",
      "description": "Run a single ad-hoc prediction against a trained model version. project_id and target_feature are auto-resolved from the model version record when omitted. By default waits and returns the result inline with label and probability. Set wait_for_result false to return immediately with a prediction_id.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "model_version_id": { "type": "string" },
          "input_data": { "type": "object", "additionalProperties": true },
          "project_id": { "type": "string", "default": "" },
          "target_feature": { "type": "string", "default": "" },
          "wait_for_result": { "type": "boolean", "default": true },
          "poll_interval_seconds": { "type": "number", "default": 2 },
          "max_wait_seconds": { "type": "integer", "default": 90 }
        },
        "required": ["model_version_id", "input_data"]
      }
    },
    {
      "name": "run_batch_prediction",
      "group": "Predictions",
      "description": "Score an entire dataset against a trained model version. 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. Returns immediately by default; use get_prediction to check status, or set wait_for_result true to block.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "model_version_id": { "type": "string" },
          "dataset_version_id": { "type": "string" },
          "project_id": { "type": "string", "default": "" },
          "target_feature": { "type": "string", "default": "" },
          "wait_for_result": { "type": "boolean", "default": false },
          "poll_interval_seconds": { "type": "number", "default": 5 },
          "max_wait_seconds": { "type": "integer", "default": 600 }
        },
        "required": ["model_version_id", "dataset_version_id"]
      }
    },
    {
      "name": "get_prediction",
      "group": "Predictions",
      "description": "Fetch prediction status and result by prediction id. For a completed ad-hoc prediction, output contains the label and probability. For a completed batch, download_url and curl_command are included automatically via a tokenized gateway proxy.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": { "prediction_id": { "type": "string" } },
        "required": ["prediction_id"]
      }
    },
    {
      "name": "list_predictions",
      "group": "Predictions",
      "description": "List predictions, newest first. Optionally filter by project_id. Use get_prediction for the full result and the batch download URL.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": { "project_id": { "type": "string", "default": "" } }
      }
    }
  ]
}
