Skip to main content
Glama

Job status

getStatus
Read-onlyIdempotent

Progress of a submitted job by executionId: status/stage, units, budgetUsd, deadline, heartbeat age, transfer, storage, incidents. Status: queued = waiting for a machine (nothing booked or charged yet); running; completed = the command finished and every file was delivered (the web shows it as 'delivered'); a finished command with missing files is failed with deliveryOutcome partial — collect the files with getArtifact before considering a rerun; cancelled; lost. Status and artifact reads return text only and draw no card: a job's card is the one on its submitJob result (and the price card on estimateExecution), and that card keeps itself current while the job runs. budgetUsd is what you are willing to spend on the job, and you are never billed more than that. Once the job is over, priceUsd is what it has billed — including a run that failed or was cancelled, and never above budgetUsd — and priceStatus says whether that number can still move: "provisional" while it awaits provider confirmation, with no time bound promised; "final" once it is reconciled against the provider's own rows, or when nothing was charged. The charge shown after completion may change while billing is reconciled. Your total charge for the job, including retries, will not exceed your approved budget. artifactsReady is true once the job has finished and at least one file was delivered; getArtifact's deliveryComplete says whether every file arrived. nextAction is one machine-actionable hint from a fixed set ("poll getStatus", "getArtifact", "getArtifact; delivery incomplete, N of M files delivered", "getArtifact; delivery unconfirmed", "getArtifact; files recovered after the job stopped", "read cancelReason, fix, resubmit", "check incidents; workload failed, fix and resubmit", "check incidents; nothing of yours ran, resubmit", "check incidents; resubmit", "resubmit", "blocked: read recoveryAssessment; a new run needs a new estimate and approval"), or null. Read it before you touch the spec: a failed job says "nothing of yours ran" when every attempt died before your command started (provisioning, verification or data staging), and "fix and resubmit" only when your own workload ran and failed; either reads "blocked: read recoveryAssessment; a new run needs a new estimate and approval" instead when its recoveryAssessment calls the job blocked (a refused download, a pinned machine, a booking rule, a spending limit, an unconfirmed release). recoveryAssessment says what can happen next (mode none, resume, restart, blocked or user_stopped, with a reason and a next step in words); it never acts on its own, and any new run needs its own estimate and your approval. When status is "cancelled", cancelReason is your own reason when you cancelled (null if you gave none), else a note from Symbioza for you, else the fixed sentence "Stopped by Symbioza before it finished. You are charged only for the time used; the incidents say what was measured."; nextAction reads "read cancelReason, fix, resubmit" only when it carries your own reason or a note. priceStatusReason says which rule decided priceStatus ("reconciled", "awaiting provider confirmation" or "nothing was charged"). deliveryOutcome says what became of the files once the job is over ("delivered", "partial", "none" or "unconfirmed"), null while it is not. While queued, capacityWait.text says where the job stands: behind a real capacity gate "Waiting for a machine · 3rd of 3 in line · since 09:07 UTC · if none is free by 15:07 UTC the run ends and nothing is charged", otherwise "Queued · waiting for a machine · 2nd of 2 in line". cancelOrigin says who stopped it: "own" (you), "symbioza", or null when nothing was cancelled. Poll after submit.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
authKeyNoUsually omit this. The customer door — the OAuth-signed-in HTTPS connector at https://symbioza.dev/mcp — authenticates the session itself, so no key is passed per call. Only a self-hosted or test transport passes a key here.
executionIdYes

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
foundYes
stageNo
reasonNoWhy nothing was found (another account's id reads the same as an unknown one)
statusNoqueued | running | completed | failed | cancelled | lost
storageNo
attemptsNo
completeNo
exitCodeNoYour workload's own exit code
priceUsdNoWhat the job has billed once it is over; never above budgetUsd
recoveryNo
budgetUsdNoThe cap you set, in your units
incidentsNo
nextActionNo
transferInNo
cancelStateNonone | requested | enforced | unconfirmed
executionIdYes
priceStatusNoprovisional | final
cancelOriginNoown | symbioza — who stopped the job; null when it was not cancelled
cancelReasonNo
capacityWaitNoposition, of, startedAtMs, closesByMs, text — while queued for capacity
deadlineAtMsNo
unitsPlannedNo
workerStatusNo
artifactStoreNooffsite (download links) | local
artifactsCountNo
artifactsReadyNo
deliveryDetailNo
heartbeatAgeMsNo
machinesBookedNoDistinct machines this job held; attempts also counts any refused before a machine was booked
unitsCompletedNo
deliveryOutcomeNodelivered | partial | none | unconfirmed once the job is over; null before
executedAttemptNoThe attempt that ran your command (0-based); null when no attempt ran it
cancelStopDetailNo
deliveryCompleteNo
lastHeartbeatAtMsNo
priceStatusReasonNoreconciled | awaiting provider confirmation | nothing was charged
cancelEnforcedAtMsNo
machineEverExistedNo
recoveryAssessmentNo
cancelRequestedAtMsNo
workloadEverStartedNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changed
    • addedOutput schema / properties / executedAttempt
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": {},
      +      "properties": {
      +        "exitCode": {
      +          "anyOf": [
      +            {
      +              "type": "number"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "exitedAtMs": {
      +          "anyOf": [
      +            {
      +              "type": "number"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "index": {
      +          "type": "number"
      +        },
      +        "startedAtMs": {
      +          "anyOf": [
      +            {
      +              "type": "number"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        }
      +      },
      +      "required": [
      +        "index",
      +        "exitCode",
      +        "startedAtMs",
      +        "exitedAtMs"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "The attempt that ran your command (0-based); null when no attempt ran it"
      +}
    • addedOutput schema / properties / machinesBooked
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Distinct machines this job held; attempts also counts any refused before a machine was booked"
      +}
    • addedOutput schema / properties / recoveryAssessment
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": {},
      +      "properties": {
      +        "automatic": {
      +          "type": "boolean"
      +        },
      +        "blocker": {
      +          "anyOf": [
      +            {
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "description": "dependency_access | constraint | budget | capacity | checkpoint | cleanup_unconfirmed | unknown; null unless blocked"
      +        },
      +        "mode": {
      +          "description": "none | resume | restart | blocked | user_stopped",
      +          "type": "string"
      +        },
      +        "needsNewApproval": {
      +          "type": "boolean"
      +        },
      +        "nextAction": {
      +          "type": "string"
      +        },
      +        "preserved": {
      +          "additionalProperties": {},
      +          "properties": {
      +            "checkpoint": {
      +              "type": "boolean"
      +            },
      +            "files": {
      +              "type": "number"
      +            },
      +            "verifiedFiles": {
      +              "type": "number"
      +            }
      +          },
      +          "required": [
      +            "files",
      +            "verifiedFiles",
      +            "checkpoint"
      +          ],
      +          "type": "object"
      +        },
      +        "reason": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "mode",
      +        "blocker",
      +        "reason",
      +        "nextAction",
      +        "preserved",
      +        "needsNewApproval",
      +        "automatic"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
  2. First observed

TDQS

A4.3/5.0
Behavior5/5

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

Annotations already cover the safe-read profile (readOnlyHint, idempotentHint, non-destructive), and the description adds substantial context beyond them: text-only responses that draw no card, budget capping semantics, priceStatus provisional/final behavior, recoveryAssessment modes and its non-acting nature, and cancelReason/cancelOrigin rules. This is exactly the kind of state-transition and billing detail the agent needs and cannot get from 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.

Conciseness3/5

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

The design is organized field-by-field and front-loads the core purpose, but it drifts into a wall of text with real duplication — the budget cap is stated twice ('you are never billed more than that' and 'will not exceed your approved budget') and the approve-a-new-estimate point appears twice. Trimming the repeats would improve scanability without losing meaning.

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 (so return values need no explanation), the description anticipates the agent's real questions for a long-running-job status tool: what each status means, what a 'partial' failure implies, how billing can still move, and what recoveryAssessment can and cannot do. Nothing needed to poll and interpret this tool 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 coverage is 50%: authKey is documented in the schema while executionId is not. The description only says the job is identified 'by executionId' and does not add format, sourcing, or validity details (e.g., where the id comes from, whether it can be reused after a rerun). With the schema doing partial lifting, this sits at the baseline.

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 opening sentence states a specific verb and resource ('Progress of a submitted job by executionId') and immediately enumerates the returned fields (status/stage, units, budgetUsd, deadline, incidents). It also routes the agent away from itself for related work ('collect the files with getArtifact'), so it is separable from siblings like getArtifact and listJobs.

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 gives clear operative context — 'Poll after submit', read nextAction before acting on the spec, and collect files with getArtifact before considering a rerun. It explains the conditions under which nextAction takes specific values, but never explicitly contrasts itself with listJobs or estimateExecution, so it stops short of full when/when-not routing.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.