Skip to main content
Glama

Get the results of a simulation you already ran

get_simulation_results
Read-onlyIdempotent

Checks on, and reads, a run you started with run_monte_carlo_simulation, rank_inputs_by_impact or summarize_outcome_scenarios, using its run_id. Use this when a run tool returned status running or queued: it waits up to 30 seconds for the run to finish, then returns its status and percent done, or the finished result, so call it again until status is completed. Use it also to get specific numbers from a finished simulation without running it again (a finished run keeps every node's and edge's statistics for every period): pass nodes (node, edge or metric ids), periods, percentiles such as 0.05 or 0.95, a threshold to get the chance a value is at least or at most some number, or histogram for the distribution's shape. Without those it returns the summary (or the ranking, or the scenarios). A failed run returns its error and is not charged. Only the caller who started the run can read it. Runs started without an account can be read for 24 hours, and only from the same connection, since a caller without an account is recognized by network address and client. Cost: free; uses no credits and no free runs.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "run_id": "<run_id>"
    },
    "name": "get_simulation_results"
  }
}

Input Schema

NameRequiredDescriptionDefault
nodesNoIds of the nodes, edges or metrics (output_request.aggregations ids) to return numbers for. Default: the output nodes.
run_idYesThe run_id returned by run_monte_carlo_simulation, rank_inputs_by_impact or summarize_outcome_scenarios.
periodsNoTime period indices to return, counting from 0. Default: the last period only. Ignored for metrics, which cover the whole run.
histogramNotrue to also return a histogram (trial counts per value bin) for up to 3 of the rows.
period_toNoInstead of periods: the last index of a range (inclusive).
thresholdNoA value to test: returns, for each node and period, the chance (0 to 1) that it is at least this value (or at most it, see threshold_direction), for example the chance cash is at least 0 in month 6.
percentilesNoPercentiles to return, as fractions from 0 to 1 (0.95 is the 95th percentile). Default [0.1, 0.5, 0.9].
period_fromNoInstead of periods: the first index of a range of periods.
wait_secondsNoIf the run is still going, wait up to this many seconds (0 to 50, default 30) for it to finish before answering. Returns as soon as it finishes. 0 answers at once with the current percent done.
threshold_directionNoat_least (default): the chance of being greater than or equal to threshold. at_most: the chance of being less than or equal to it.at_least

Output Schema

NameRequiredDescriptionDefault
kindNosimulation
tierYes
errorNoError code and message if the run failed; otherwise null.
queryNo
run_idYes
statusYesThe run's status, for example completed or failed.
billingNoWho you are and what this call cost: principal, auth source, credits debited and balance, or the anonymous allowance left today.
summaryNoPer-node and per-edge statistics for each period (mean, standard deviation, minimum, maximum, percentiles, histogram) plus requested financial metrics. Null until available. Its layout differs from run_monte_carlo_simulation's result.
tornadoNo
progressNo
next_stepNo
scenariosNo
created_atYesWhen the run started, as an ISO-8601 time.
total_trialsYes
credits_debitedNo
baseline_outcomeNo
trials_completedYes
estimated_seconds_remainingNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed40 schema fields changed
    • removedInput schema / properties / api_key
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "type": "string"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ],
      -  "default": null,
      -  "description": "The same API key used for the original run. Leave it out if your connection is signed in as that account, or if the run was made without an account. A different caller gets \"not found\".",
      -  "title": "Api Key"
      -}
    • addedInput schema / properties / histogram
      Added value: +{
      +  "default": false,
      +  "description": "true to also return a histogram (trial counts per value bin) for up to 3 of the rows.",
      +  "title": "Histogram",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / nodes
      Added value: +{
      +  "anyOf": [
      +    {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Ids of the nodes, edges or metrics (output_request.aggregations ids) to return numbers for. Default: the output nodes.",
      +  "examples": [
      +    [
      +      "revenue",
      +      "npv"
      +    ]
      +  ],
      +  "title": "Nodes"
      +}
    • addedInput schema / properties / percentiles
      Added value: +{
      +  "anyOf": [
      +    {
      +      "items": {
      +        "maximum": 1,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "maxItems": 20,
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Percentiles to return, as fractions from 0 to 1 (0.95 is the 95th percentile). Default [0.1, 0.5, 0.9].",
      +  "examples": [
      +    [
      +      0.05,
      +      0.5,
      +      0.95
      +    ]
      +  ],
      +  "title": "Percentiles"
      +}
    • addedInput schema / properties / period_from
      Added value: +{
      +  "anyOf": [
      +    {
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Instead of periods: the first index of a range of periods.",
      +  "title": "Period From"
      +}
    • addedInput schema / properties / period_to
      Added value: +{
      +  "anyOf": [
      +    {
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Instead of periods: the last index of a range (inclusive).",
      +  "title": "Period To"
      +}
    • addedInput schema / properties / periods
      Added value: +{
      +  "anyOf": [
      +    {
      +      "items": {
      +        "type": "integer"
      +      },
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Time period indices to return, counting from 0. Default: the last period only. Ignored for metrics, which cover the whole run.",
      +  "examples": [
      +    [
      +      0,
      +      5,
      +      11
      +    ]
      +  ],
      +  "title": "Periods"
      +}
    • changedInput schema / properties / run_id / description
      Previous value: -"The run_id returned by run_monte_carlo_simulation."New value: +"The run_id returned by run_monte_carlo_simulation, rank_inputs_by_impact or summarize_outcome_scenarios."
    • addedInput schema / properties / threshold
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "A value to test: returns, for each node and period, the chance (0 to 1) that it is at least this value (or at most it, see threshold_direction), for example the chance cash is at least 0 in month 6.",
      +  "examples": [
      +    0
      +  ],
      +  "title": "Threshold"
      +}
    • addedInput schema / properties / threshold_direction
      Added value: +{
      +  "default": "at_least",
      +  "description": "at_least (default): the chance of being greater than or equal to threshold. at_most: the chance of being less than or equal to it.",
      +  "enum": [
      +    "at_least",
      +    "at_most"
      +  ],
      +  "title": "Threshold Direction",
      +  "type": "string"
      +}
    • addedInput schema / properties / wait_seconds
      Added value: +{
      +  "default": 30,
      +  "description": "If the run is still going, wait up to this many seconds (0 to 50, default 30) for it to finish before answering. Returns as soon as it finishes. 0 answers at once with the current percent done.",
      +  "maximum": 50,
      +  "minimum": 0,
      +  "title": "Wait Seconds",
      +  "type": "number"
      +}
    • changedOutput schema / $defs / BillingInfo / properties / auth_source / description
      Previous value: -"How you were identified: bearer (a signed-in connection token), api_key (the api_key argument) or anonymous."New value: +"How you were identified: bearer (a credential sent in the Authorization: Bearer header) or anonymous."
    • changedOutput schema / $defs / BillingInfo / properties / auth_source / enum
      Previous value: -[
      -  "bearer",
      -  "api_key",
      -  "anonymous"
      -]New value: +[
      +  "bearer",
      +  "anonymous"
      +]
    • changedOutput schema / $defs / BillingInfo / properties / charged_to / enum
      Previous value: -[
      -  "anonymous_allowance",
      -  "credits",
      -  "none"
      -]New value: +[
      +  "anonymous_allowance",
      +  "free_daily_run",
      +  "credits",
      +  "none"
      +]
    • addedOutput schema / $defs / BillingInfo / properties / free_run_limits
      Added value: +{
      +  "anyOf": [
      +    {
      +      "$ref": "#/$defs/SignedInLimits"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "The free signed-in tier's bounds. Null unless the account signed in with Kromatic."
      +}
    • addedOutput schema / $defs / BillingInfo / properties / free_runs_remaining_today
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Free signed-in runs left in the current UTC day, counting this call. Null unless the account signed in with Kromatic.",
      +  "title": "Free Runs Remaining Today"
      +}
    • addedOutput schema / $defs / BillingInfo / properties / free_runs_reset_at
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "ISO-8601 instant the free signed-in runs next refill (the next UTC midnight). Null unless the account signed in with Kromatic.",
      +  "title": "Free Runs Reset At"
      +}
    • addedOutput schema / $defs / DrivingInput
      Added value: +{
      +  "description": "A best-effort driving input value for a scenario.",
      +  "properties": {
      +    "node_id": {
      +      "title": "Node Id",
      +      "type": "string"
      +    },
      +    "value": {
      +      "description": "The root node's own distribution value at the scenario percentile (best-effort marginal driver; exact for monotone single-input graphs).",
      +      "title": "Value",
      +      "type": "number"
      +    }
      +  },
      +  "required": [
      +    "node_id",
      +    "value"
      +  ],
      +  "title": "DrivingInput",
      +  "type": "object"
      +}
    • addedOutput schema / $defs / MetricSummary
      Added value: +{
      +  "description": "One requested metric (npv, irr, payback, prob, ...) across trials.",
      +  "properties": {
      +    "function": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null,
      +      "title": "Function"
      +    },
      +    "id": {
      +      "title": "Id",
      +      "type": "string"
      +    },
      +    "mean": {
      +      "title": "Mean",
      +      "type": "number"
      +    },
      +    "p10": {
      +      "title": "P10",
      +      "type": "number"
      +    },
      +    "p50": {
      +      "title": "P50",
      +      "type": "number"
      +    },
      +    "p90": {
      +      "title": "P90",
      +      "type": "number"
      +    },
      +    "probability": {
      +      "anyOf": [
      +        {
      +          "type": "number"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null,
      +      "description": "For a prob metric: the probability (0 to 1), which is its mean.",
      +      "title": "Probability"
      +    },
      +    "target": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null,
      +      "description": "The node or metric it was computed on.",
      +      "title": "Target"
      +    }
      +  },
      +  "required": [
      +    "id",
      +    "mean",
      +    "p10",
      +    "p50",
      +    "p90"
      +  ],
      +  "title": "MetricSummary",
      +  "type": "object"
      +}
    • addedOutput schema / $defs / OutputNodeSummary
      Added value: +{
      +  "description": "One output node: its final period, plus a compact series over time.",
      +  "properties": {
      +    "max": {
      +      "title": "Max",
      +      "type": "number"
      +    },
      +    "mean": {
      +      "title": "Mean",
      +      "type": "number"
      +    },
      +    "min": {
      +      "title": "Min",
      +      "type": "number"
      +    },
      +    "name": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null,
      +      "title": "Name"
      +    },
      +    "node_id": {
      +      "title": "Node Id",
      +      "type": "string"
      +    },
      +    "p10": {
      +      "title": "P10",
      +      "type": "number"
      +    },
      +    "p50": {
      +      "title": "P50",
      +      "type": "number"
      +    },
      +    "p90": {
      +      "title": "P90",
      +      "type": "number"
      +    },
      +    "period": {
      +      "description": "The period these numbers describe (the last one).",
      +      "title": "Period",
      +      "type": "integer"
      +    },
      +    "series": {
      +      "anyOf": [
      +        {
      +          "$ref": "#/$defs/OutputSeries"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null,
      +      "description": "Mean and P10/P50/P90 per period. Absent for a one-period model."
      +    }
      +  },
      +  "required": [
      +    "node_id",
      +    "period",
      +    "mean",
      +    "p10",
      +    "p50",
      +    "p90",
      +    "min",
      +    "max"
      +  ],
      +  "title": "OutputNodeSummary",
      +  "type": "object"
      +}
    • addedOutput schema / $defs / OutputSeries
      Added value: +{
      +  "description": "An output node over time, sampled to at most 24 periods.",
      +  "properties": {
      +    "mean": {
      +      "items": {
      +        "type": "number"
      +      },
      +      "title": "Mean",
      +      "type": "array"
      +    },
      +    "p10": {
      +      "items": {
      +        "type": "number"
      +      },
      +      "title": "P10",
      +      "type": "array"
      +    },
      +    "p50": {
      +      "items": {
      +        "type": "number"
      +      },
      +      "title": "P50",
      +      "type": "array"
      +    },
      +    "p90": {
      +      "items": {
      +        "type": "number"
      +      },
      +      "title": "P90",
      +      "type": "array"
      +    },
      +    "periods": {
      +      "description": "Period indices, counted from 0.",
      +      "items": {
      +        "type": "integer"
      +      },
      +      "title": "Periods",
      +      "type": "array"
      +    }
      +  },
      +  "required": [
      +    "periods",
      +    "mean",
      +    "p10",
      +    "p50",
      +    "p90"
      +  ],
      +  "title": "OutputSeries",
      +  "type": "object"
      +}
    • addedOutput schema / $defs / QueryHistogram
      Added value: +{
      +  "description": "Trial counts per bin; ``bins`` has one more edge than ``counts``.",
      +  "properties": {
      +    "bins": {
      +      "items": {
      +        "type": "number"
      +      },
      +      "title": "Bins",
      +      "type": "array"
      +    },
      +    "counts": {
      +      "items": {
      +        "type": "integer"
      +      },
      +      "title": "Counts",
      +      "type": "array"
      +    }
      +  },
      +  "required": [
      +    "counts",
      +    "bins"
      +  ],
      +  "title": "QueryHistogram",
      +  "type": "object"
      +}
    • addedOutput schema / $defs / QueryResult
      Added value: +{
      +  "description": "Specific numbers you asked for from a finished run.",
      +  "properties": {
      +    "note": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null,
      +      "title": "Note"
      +    },
      +    "rows": {
      +      "items": {
      +        "$ref": "#/$defs/QueryRow"
      +      },
      +      "title": "Rows",
      +      "type": "array"
      +    },
      +    "truncated": {
      +      "default": false,
      +      "title": "Truncated",
      +      "type": "boolean"
      +    },
      +    "unknown_ids": {
      +      "items": {
      +        "type": "string"
      +      },
      +      "title": "Unknown Ids",
      +      "type": "array"
      +    }
      +  },
      +  "title": "QueryResult",
      +  "type": "object"
      +}
    • addedOutput schema / $defs / QueryRow
      Added value: +{
      +  "description": "One node (or edge, or metric) in one period.",
      +  "properties": {
      +    "histogram": {
      +      "anyOf": [
      +        {
      +          "$ref": "#/$defs/QueryHistogram"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null
      +    },
      +    "id": {
      +      "title": "Id",
      +      "type": "string"
      +    },
      +    "max": {
      +      "title": "Max",
      +      "type": "number"
      +    },
      +    "mean": {
      +      "title": "Mean",
      +      "type": "number"
      +    },
      +    "min": {
      +      "title": "Min",
      +      "type": "number"
      +    },
      +    "percentiles": {
      +      "additionalProperties": {
      +        "type": "number"
      +      },
      +      "description": "Keyed like 'p10', 'p50', 'p95' (or 'p2.5'), from your percentiles.",
      +      "title": "Percentiles",
      +      "type": "object"
      +    },
      +    "period": {
      +      "anyOf": [
      +        {
      +          "type": "integer"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Period index from 0; null for a metric.",
      +      "title": "Period"
      +    },
      +    "probability": {
      +      "anyOf": [
      +        {
      +          "type": "number"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null,
      +      "description": "The chance of meeting the threshold, if you gave one.",
      +      "title": "Probability"
      +    },
      +    "std": {
      +      "title": "Std",
      +      "type": "number"
      +    }
      +  },
      +  "required": [
      +    "id",
      +    "period",
      +    "mean",
      +    "std",
      +    "min",
      +    "max",
      +    "percentiles"
      +  ],
      +  "title": "QueryRow",
      +  "type": "object"
      +}
    • addedOutput schema / $defs / RunProgress
      Added value: +{
      +  "description": "How far a queued or running run has got.",
      +  "properties": {
      +    "done": {
      +      "title": "Done",
      +      "type": "integer"
      +    },
      +    "percent": {
      +      "description": "0 to 100.",
      +      "title": "Percent",
      +      "type": "number"
      +    },
      +    "total": {
      +      "title": "Total",
      +      "type": "integer"
      +    },
      +    "unit": {
      +      "description": "trials for a simulation; runs (internal simulations) for a sensitivity sweep.",
      +      "enum": [
      +        "trials",
      +        "runs"
      +      ],
      +      "title": "Unit",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "percent",
      +    "done",
      +    "total",
      +    "unit"
      +  ],
      +  "title": "RunProgress",
      +  "type": "object"
      +}
    • addedOutput schema / $defs / RunSummary
      Added value: +{
      +  "description": "The headline numbers of a finished simulation.",
      +  "properties": {
      +    "metrics": {
      +      "items": {
      +        "$ref": "#/$defs/MetricSummary"
      +      },
      +      "title": "Metrics",
      +      "type": "array"
      +    },
      +    "note": {
      +      "default": "This is a summary. For other nodes, periods, percentiles, the chance of reaching a threshold, or a histogram, call get_simulation_results with this run_id and the nodes, periods, percentiles, threshold or histogram arguments.",
      +      "title": "Note",
      +      "type": "string"
      +    },
      +    "other_nodes": {
      +      "description": "Ids of the other nodes, which you can query by name.",
      +      "items": {
      +        "type": "string"
      +      },
      +      "title": "Other Nodes",
      +      "type": "array"
      +    },
      +    "other_nodes_count": {
      +      "default": 0,
      +      "description": "How many other nodes there are.",
      +      "title": "Other Nodes Count",
      +      "type": "integer"
      +    },
      +    "outputs": {
      +      "items": {
      +        "$ref": "#/$defs/OutputNodeSummary"
      +      },
      +      "title": "Outputs",
      +      "type": "array"
      +    },
      +    "time_periods": {
      +      "title": "Time Periods",
      +      "type": "integer"
      +    },
      +    "trials": {
      +      "title": "Trials",
      +      "type": "integer"
      +    }
      +  },
      +  "required": [
      +    "trials",
      +    "time_periods"
      +  ],
      +  "title": "RunSummary",
      +  "type": "object"
      +}
    • addedOutput schema / $defs / ScenarioCase
      Added value: +{
      +  "description": "One scenario: the target's outcome at a percentile + its driving inputs.",
      +  "properties": {
      +    "driving_inputs": {
      +      "items": {
      +        "$ref": "#/$defs/DrivingInput"
      +      },
      +      "title": "Driving Inputs",
      +      "type": "array"
      +    },
      +    "label": {
      +      "description": "'worst' | 'median' | 'best' | 'p<N>'.",
      +      "title": "Label",
      +      "type": "string"
      +    },
      +    "output_value": {
      +      "description": "The target node's value at this percentile of its distribution.",
      +      "title": "Output Value",
      +      "type": "number"
      +    },
      +    "percentile": {
      +      "title": "Percentile",
      +      "type": "number"
      +    }
      +  },
      +  "required": [
      +    "label",
      +    "percentile",
      +    "output_value"
      +  ],
      +  "title": "ScenarioCase",
      +  "type": "object"
      +}
    • addedOutput schema / $defs / SignedInLimits
      Added value: +{
      +  "description": "The free signed-in tier's bounds (neumann#334), rendered from ``Settings``.",
      +  "properties": {
      +    "max_nodes": {
      +      "description": "Maximum nodes in a free run's graph.",
      +      "title": "Max Nodes",
      +      "type": "integer"
      +    },
      +    "max_trials": {
      +      "description": "Maximum trials in a free run.",
      +      "title": "Max Trials",
      +      "type": "integer"
      +    },
      +    "runs_per_day": {
      +      "description": "Free runs per UTC calendar day.",
      +      "title": "Runs Per Day",
      +      "type": "integer"
      +    }
      +  },
      +  "required": [
      +    "runs_per_day",
      +    "max_trials",
      +    "max_nodes"
      +  ],
      +  "title": "SignedInLimits",
      +  "type": "object"
      +}
    • addedOutput schema / $defs / TornadoRow
      Added value: +{
      +  "description": "One input's bar in the tornado chart.",
      +  "properties": {
      +    "baseline_input": {
      +      "description": "The input's median, where it is held otherwise.",
      +      "title": "Baseline Input",
      +      "type": "number"
      +    },
      +    "elasticity": {
      +      "description": "Roughly the % change in the outcome per 1% change in the input (unsigned).",
      +      "title": "Elasticity",
      +      "type": "number"
      +    },
      +    "high_input": {
      +      "description": "The input at the highest percentile tried.",
      +      "title": "High Input",
      +      "type": "number"
      +    },
      +    "input_id": {
      +      "title": "Input Id",
      +      "type": "string"
      +    },
      +    "low_input": {
      +      "description": "The input at the lowest percentile tried.",
      +      "title": "Low Input",
      +      "type": "number"
      +    },
      +    "name": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null,
      +      "title": "Name"
      +    },
      +    "outcome_at_high": {
      +      "description": "The outcome's mean with the input at high_input.",
      +      "title": "Outcome At High",
      +      "type": "number"
      +    },
      +    "outcome_at_low": {
      +      "description": "The outcome's mean with the input at low_input.",
      +      "title": "Outcome At Low",
      +      "type": "number"
      +    },
      +    "rank": {
      +      "description": "1 = the input with the biggest impact.",
      +      "title": "Rank",
      +      "type": "integer"
      +    },
      +    "swing": {
      +      "description": "abs(outcome_at_high - outcome_at_low): the bar's length.",
      +      "title": "Swing",
      +      "type": "number"
      +    }
      +  },
      +  "required": [
      +    "rank",
      +    "input_id",
      +    "baseline_input",
      +    "low_input",
      +    "high_input",
      +    "outcome_at_low",
      +    "outcome_at_high",
      +    "swing",
      +    "elasticity"
      +  ],
      +  "title": "TornadoRow",
      +  "type": "object"
      +}
    • addedOutput schema / properties / baseline_outcome
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Baseline Outcome"
      +}
    • addedOutput schema / properties / credits_debited
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Credits Debited"
      +}
    • addedOutput schema / properties / estimated_seconds_remaining
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Estimated Seconds Remaining"
      +}
    • addedOutput schema / properties / kind
      Added value: +{
      +  "default": "simulation",
      +  "enum": [
      +    "simulation",
      +    "sensitivity",
      +    "scenarios"
      +  ],
      +  "title": "Kind",
      +  "type": "string"
      +}
    • addedOutput schema / properties / next_step
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Next Step"
      +}
    • addedOutput schema / properties / progress
      Added value: +{
      +  "anyOf": [
      +    {
      +      "$ref": "#/$defs/RunProgress"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null
      +}
    • addedOutput schema / properties / query
      Added value: +{
      +  "anyOf": [
      +    {
      +      "$ref": "#/$defs/QueryResult"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null
      +}
    • addedOutput schema / properties / scenarios
      Added value: +{
      +  "anyOf": [
      +    {
      +      "items": {
      +        "$ref": "#/$defs/ScenarioCase"
      +      },
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Scenarios"
      +}
    • changedOutput schema / properties / summary / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": true,
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "$ref": "#/$defs/RunSummary"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / summary / title
      Removed value: -"Summary"
    • addedOutput schema / properties / tornado
      Added value: +{
      +  "anyOf": [
      +    {
      +      "items": {
      +        "$ref": "#/$defs/TornadoRow"
      +      },
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Tornado"
      +}
  2. Added

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already cover read-only/idempotent, but the description adds substantive behavior: a bounded 30s wait, failed runs return their error and are not charged, ownership restriction ('only the caller who started the run'), a 24-hour anonymous-run window tied to network address, and zero cost. These are exactly the traits annotations cannot express.

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 and trigger condition are front-loaded, and the parameter enumeration is compressed into one dense sentence. It is long — the final cost sentence could be trimmed — but nearly every clause carries operational information rather than 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?

For a 10-parameter async polling tool this covers everything: what starts the run, how to poll, how to read ownership/expiry failures, and how cost works, while an output schema handles return values. 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 coverage is 100%, so baseline is 3. The description earns above baseline by explaining the output-mode selection: 'Without those it returns the summary (or the ranking, or the scenarios)', which tells the agent that node/period/percentile/threshold/histogram presence switches the response type — a cross-parameter interaction the schema documents only per-field.

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 ('checks on, and reads, a run') and anchors it to the exact producer tools (run_monte_carlo_simulation, rank_inputs_by_impact, summarize_outcome_scenarios). An agent can distinguish it from every sibling without opening a 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?

Explicitly names the triggering condition ('when a run tool returned status running or queued'), the polling pattern (call again until status is completed), and the secondary use case (pull numbers from a finished run without re-running). Alternatives are effectively ruled out by naming the producer tools.

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.

Resources