Skip to main content
Glama

Create Simulation

simulation.create

Create a temporary anonymous demo cloud simulation from a list of resources and connections (max 2 active simulations per client, up to 10 resources; the returned simulationId is a short-lived unguessable capability that survives MCP transport teardown, but it is cleaned up when the demo lifetime expires or the simulation is deleted). Built-in scenario workflow: call scenario.list and pass a returned card's id as scenarioId to simulation.create for server-side graph expansion. For full control, call scenario.get and pass its hydrated resources and connections arrays instead. These are two alternatives — do not send scenarioId with resources or connections. scenario.list returns graph-free cards only; it is not a source of resource, connection, traffic-pattern, or failure-injection graphs. Scenario traffic and failure presets are not applied automatically. Use it to start any simulation workflow — either with hydrated resources and connections from scenario.get or your own architecture. Do not use it to modify an existing simulation (use simulation.inject_traffic to change load). To give a resource an explicit capacity, set characteristics.capacityRps — the literal per-node RPS ceiling at which CPU reaches ~95%; do not use maxThroughput for this (it is a legacy internal scaling parameter with different semantics). Omitted capacityRps uses the selected catalog tier and can intentionally produce a stressed baseline (for example, the AWS m5.large catalog denominator is 2,000 RPS); for a healthy, capacity-bounded reliability experiment, declare an explicit per-node capacity such as 500 RPS. That value is an experiment control, not a universal hardware fact. Capacity, node-bound, SKU, and autoscaling values supplied through this MCP tool are recorded as agent-supplied in the immutable normalizationReceipt; request responseMode: 'full' to inspect it. Generic GKE telemetry and recovery apply only to worker nodes; the control-plane management fee is cost-only, with no modeled control-plane CPU, API throttling, or cooldown. To bound the autoscaled fleet size, set the top-level maxInstances / minInstances parameters. If you do not set maxInstances, the engine uses the provider default — AWS 50, GCP 15, Azure/OCI/DigitalOcean 10 — which may be much larger than your intended fleet size. The response includes effectiveMaxInstances / effectiveMinInstances so you can confirm the bounds that will be enforced. For a targeted CPU HPA scale-out threshold, send the canonical autoscalingTargetCpu field in this create call (for example, autoscalingTargetCpu: 70 for GKE). The compatible aliases scaleOutCpuThreshold, scaleOutCpuPercent, and autoscaleTargetCpuPercent are also accepted; if more than one is sent, their values must agree. Every create response includes hpaAudit with the supplied field, persisted thresholds, and any provider default. These four TOP-LEVEL fields are simulation-wide — the engine applies one CPU threshold identically to every resource's scale decision by default. To make ONE resource scale at a different CPU target than the rest of the simulation (e.g. a GKE cluster scaling out at 60% while an EC2 fleet in the same simulation scales out at 80%), set characteristics.scaleOutCpuThreshold and/or characteristics.scaleInCpuThreshold on that specific resource instead — the per-resource value wins over the simulation-wide default for that resource only. A misnamed near-miss field nested under characteristics (e.g. targetCPUUtilizationPercentage) is rejected with a 400 explaining the correct field name — it is never silently dropped and defaulted. Responses are compact by default: id, name, status, traffic, and a per-resource summary (id, name, status, cpuPercent, routedRps, availabilityState, isRoutable, and recoveryBlockedReason when provided). Pass responseMode: 'full' to get the complete simulation object instead. During a failure workflow, lower traffic to serviceable levels before calling simulation.recover_resource, then use simulation.step until the recovered resource is healthy. Recovery progress is included when applicable: recoveryProgress.state is parked, cooling_down, or healthy, and its parkWindow/cooldown objects report totalSteps, completedSteps, remainingSteps, target, and requiredSteps. Poll simulation.get or simulation.step until state is healthy. No prerequisites. Returns the created simulation's id, which every other simulation.* tool consumes; the new simulation also becomes this session's current simulation, so subsequent per-simulation tools may omit simulationId. The likely next tool is simulation.step to advance time. Do not call api.spec to learn the simulation workflow — the tool descriptions in this session contain everything needed. Authenticate with an API key for unlimited persistent simulations.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
nameYesHuman-readable name for the simulation
seedNoDeterministic RNG seed for reproducible replays
trafficNoInitial traffic in requests per second (RPS)
resourcesNoList of cloud resources composing this simulation. For a built-in scenario, pass the hydrated resources from scenario.get; scenario.list cards are graph-free. (max 10 in demo mode; mutually exclusive with scenarioId)
scenarioIdNoLive scenario identifier from scenario.list; mutually exclusive with resources and connections
connectionsNoDirected connections between resources. For a built-in scenario, pass the hydrated connections from scenario.get; scenario.list cards are graph-free. Directed edges should describe traffic flow between resources; omit when using scenarioId.
descriptionNoOptional description of the simulation's purpose
maxInstancesNoHard ceiling on the autoscaled compute fleet size, stored as autoscalingConfig.maxInstances. If omitted, the provider default applies (AWS 50, GCP 15, Azure/OCI/DigitalOcean 10) — which may be much larger than your intended fleet size.
minInstancesNoFloor on the autoscaled compute fleet size, stored as autoscalingConfig.minInstances.
responseModeNoResponse detail level. 'compact' (default) returns id, name, status, traffic, and a per-resource summary (id, name, status, cpuPercent) — keeps the response small for agent loops. 'full' returns the complete simulation object including all resource characteristics and connections.compact
resilienceConfigNoOptional retry/cascade resilience model returned by scenario.get
scaleOutCpuPercentNoGrok-compatible alias for the CPU HPA scale-out target; if multiple target names are sent they must match.
autoscalingTargetCpuNoCanonical CPU HPA scale-out target percent. CWM synthesizes unrelated autoscaling defaults.
scaleOutCpuThresholdNoEquivalent alias for autoscalingTargetCpu; if both are sent they must match.
autoscaleTargetCpuPercentNoGrok-compatible alias for the CPU HPA scale-out target; if multiple target names are sent they must match.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
idNoUnique simulation ID — use with simulation.step, simulation.metrics, etc.
nameNoSimulation name
statusNoCurrent simulation status
trafficNoCurrent traffic in RPS
hpaAuditNoCPU HPA create-time audit: whether a target arrived, its accepted field, the persisted thresholds, and the provider-default explanation when omitted.
resourcesNoPer-resource summary (compact mode) or full resource states (full mode)
normalizedConfigNoEngine-resolved billing parameters for every resource: cost multipliers, hourly rates, autoscale thresholds (scaleOut/scaleIn CPU %), GPU SKU, per-node token throughput, billing floor, connection limits. Use this immediately after create to verify the simulation was set up as intended — e.g. confirm which GPU SKU was resolved, the effective billing floor, or the autoscale CPU threshold that will drive scale-out.
effectiveMaxInstancesNoThe fleet-size ceiling the engine will enforce (autoscalingConfig.maxInstances, or the provider default when unset)
effectiveMinInstancesNoThe fleet-size floor the engine will enforce (autoscalingConfig.minInstances, or the provider default when unset)

Schema Changelog

Changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. Changed4 schema fields changed
    • changedInput schema / properties / connections / description
      Previous value: -"Directed connections between resources. For a built-in scenario, pass the hydrated connections from scenario.get; scenario.list cards are graph-free. Directed edges should describe traffic flow between resources."New value: +"Directed connections between resources. For a built-in scenario, pass the hydrated connections from scenario.get; scenario.list cards are graph-free. Directed edges should describe traffic flow between resources; omit when using scenarioId."
    • changedInput schema / properties / resources / description
      Previous value: -"List of cloud resources composing this simulation. For a built-in scenario, pass the hydrated resources from scenario.get; scenario.list cards are graph-free. (max 10 in demo mode)"New value: +"List of cloud resources composing this simulation. For a built-in scenario, pass the hydrated resources from scenario.get; scenario.list cards are graph-free. (max 10 in demo mode; mutually exclusive with scenarioId)"
    • addedInput schema / properties / scenarioId
      Added value: +{
      +  "description": "Live scenario identifier from scenario.list; mutually exclusive with resources and connections",
      +  "minLength": 1,
      +  "type": "string"
      +}
    • changedInput schema / required
      Previous value: -[
      -  "name",
      -  "resources"
      -]New value: +[
      +  "name"
      +]
  2. Changed3 schema fields changed
    • changedInput schema / properties / connections / description
      Previous value: -"Directed edges describing traffic flow between resources"New value: +"Directed connections between resources. For a built-in scenario, pass the hydrated connections from scenario.get; scenario.list cards are graph-free. Directed edges should describe traffic flow between resources."
    • changedInput schema / properties / resilienceConfig / description
      Previous value: -"Optional retry/cascade resilience model returned by scenario.list"New value: +"Optional retry/cascade resilience model returned by scenario.get"
    • changedInput schema / properties / resources / description
      Previous value: -"List of cloud resources to include (max 10 in demo mode)"New value: +"List of cloud resources composing this simulation. For a built-in scenario, pass the hydrated resources from scenario.get; scenario.list cards are graph-free. (max 10 in demo mode)"
  3. Changed1 schema field changed
    • addedInput schema / properties / resources / items / properties / recoveryPolicy
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Optional recovery thresholds and cooldown lengths for this resource",
      +  "properties": {
      +    "criticalCpuThreshold": {
      +      "maximum": 100,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "criticalSteps": {
      +      "minimum": 1,
      +      "type": "integer"
      +    },
      +    "failureParkSteps": {
      +      "minimum": 1,
      +      "type": "integer"
      +    },
      +    "warningCpuThreshold": {
      +      "maximum": 100,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "warningSteps": {
      +      "minimum": 1,
      +      "type": "integer"
      +    }
      +  },
      +  "type": "object"
      +}
  4. Changed2 schema fields changed
    • addedOutput schema / properties / normalizedConfig / properties / resources / items / properties / capacityProvenance
      Added value: +{
      +  "description": "Source of the effective compute capacity: explicit caller field, provider catalog, or generic fallback",
      +  "enum": [
      +    "absent",
      +    "capacityRps",
      +    "explicit_maxThroughput",
      +    "explicit_requestsPerSecond",
      +    "provider_catalog",
      +    "generic_fallback"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / normalizedConfig / properties / resources / items / properties / effectiveCpuCapacityRps
      Added value: +{
      +  "description": "CPU-curve denominator after applying the provider threshold to explicit capacityRps",
      +  "type": "number"
      +}
  5. Changed1 schema field changed
    • changedInput schema / properties / resources / items / properties / characteristics / properties / capacityRps / description
      Previous value: -"Literal per-node RPS ceiling: the request rate at which this resource's CPU reaches ~95%. Preferred way to specify capacity in concrete RPS terms."New value: +"Literal per-node RPS ceiling: the request rate at which this resource's CPU reaches ~95%. Preferred for a healthy, capacity-bounded reliability experiment; omitted capacityRps uses the selected catalog tier and may intentionally model a stressed baseline."
  6. Changed4 schema fields changed
    • addedOutput schema / properties / resources / items / properties / availabilityState
      Added value: +{
      +  "description": "Availability derived from routed traffic; degraded can still serve, unavailable cannot",
      +  "enum": [
      +    "available",
      +    "degraded",
      +    "unavailable"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / resources / items / properties / isRoutable
      Added value: +{
      +  "description": "Whether this compute/Kubernetes resource can receive traffic",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / resources / items / properties / recoveryBlockedReason
      Added value: +{
      +  "description": "Engine recovery guard currently blocking cooldown progress, when present",
      +  "type": "string"
      +}
    • addedOutput schema / properties / resources / items / properties / routedRps
      Added value: +{
      +  "description": "Requests per second routed to this resource (compute/kubernetes only)",
      +  "type": "number"
      +}
  7. Changed2 schema fields changed
    • addedInput schema / properties / resources / items / properties / characteristics / properties / scaleInCpuThreshold
      Added value: +{
      +  "description": "Compute or Kubernetes only — overrides the simulation-wide CPU HPA scale-in target for THIS resource's scale decisions only; every other resource keeps the simulation-wide default.",
      +  "maximum": 100,
      +  "minimum": 0,
      +  "type": "number"
      +}
    • addedInput schema / properties / resources / items / properties / characteristics / properties / scaleOutCpuThreshold
      Added value: +{
      +  "description": "Compute or Kubernetes only — overrides the simulation-wide CPU HPA scale-out target (see the top-level autoscalingTargetCpu) for THIS resource's scale decisions only; every other resource keeps the simulation-wide default.",
      +  "maximum": 100,
      +  "minimum": 0,
      +  "type": "number"
      +}
  8. Changed4 schema fields changed
    • addedInput schema / additionalProperties
      Added value: +false
    • removedInput schema / properties / context
      Removed value: -{
      -  "description": "One-sentence goal for this session — e.g. 'train RL agent on AWS', 'compare GCP vs Azure costs', or 'run chaos test on database tier'.",
      -  "type": "string"
      -}
    • changedInput schema / required
      Previous value: -[
      -  "name",
      -  "resources",
      -  "context"
      -]New value: +[
      +  "name",
      +  "resources"
      +]
    • addedOutput schema / properties / hpaAudit
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "CPU HPA create-time audit: whether a target arrived, its accepted field, the persisted thresholds, and the provider-default explanation when omitted.",
      +  "properties": {
      +    "defaultExplanation": {
      +      "type": "string"
      +    },
      +    "defaulted": {
      +      "type": "boolean"
      +    },
      +    "effectiveScaleInCpuPercent": {
      +      "type": "number"
      +    },
      +    "effectiveScaleOutCpuPercent": {
      +      "type": "number"
      +    },
      +    "provider": {
      +      "type": "string"
      +    },
      +    "requestedTargetCpu": {
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "resourceCategory": {
      +      "type": "string"
      +    },
      +    "suppliedField": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "targetSupplied": {
      +      "type": "boolean"
      +    }
      +  },
      +  "required": [
      +    "targetSupplied",
      +    "suppliedField",
      +    "requestedTargetCpu",
      +    "effectiveScaleOutCpuPercent",
      +    "effectiveScaleInCpuPercent",
      +    "defaulted",
      +    "provider",
      +    "resourceCategory"
      +  ],
      +  "type": "object"
      +}
  9. Changed6 schema fields changed
    • addedInput schema / properties / autoscaleTargetCpuPercent
      Added value: +{
      +  "description": "Grok-compatible alias for the CPU HPA scale-out target; if multiple target names are sent they must match.",
      +  "maximum": 100,
      +  "minimum": 0,
      +  "type": "number"
      +}
    • addedInput schema / properties / autoscalingTargetCpu
      Added value: +{
      +  "description": "Canonical CPU HPA scale-out target percent. CWM synthesizes unrelated autoscaling defaults.",
      +  "maximum": 100,
      +  "minimum": 0,
      +  "type": "number"
      +}
    • addedInput schema / properties / scaleOutCpuPercent
      Added value: +{
      +  "description": "Grok-compatible alias for the CPU HPA scale-out target; if multiple target names are sent they must match.",
      +  "maximum": 100,
      +  "minimum": 0,
      +  "type": "number"
      +}
    • addedInput schema / properties / scaleOutCpuThreshold
      Added value: +{
      +  "description": "Equivalent alias for autoscalingTargetCpu; if both are sent they must match.",
      +  "maximum": 100,
      +  "minimum": 0,
      +  "type": "number"
      +}
    • changedOutput schema / properties / normalizedConfig / properties / resources / items / properties / controlPlaneFeePerHour / description
      Previous value: -"Fixed cluster control-plane fee in USD/hr"New value: +"Cost-only cluster management fee in USD/hr; it does not represent control-plane CPU, throttling, or recovery telemetry"
    • changedOutput schema / properties / normalizedConfig / properties / resources / items / properties / rateProvenance / properties / resolution / enum
      Previous value: -[
      -  "large-sku",
      -  "entry-level-fallback",
      -  "base-rate-multiplier"
      -]New value: +[
      +  "large-sku",
      +  "entry-level-fallback",
      +  "base-rate-multiplier",
      +  "fargate-task-vcpu-memory",
      +  "cloud-run-request-based",
      +  "request-serving-usage-based"
      +]
  10. Changed2 schema fields changed
    • addedInput schema / properties / resilienceConfig
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Optional retry/cascade resilience model returned by scenario.list",
      +  "properties": {
      +    "dependencies": {
      +      "description": "Dependency edges with retry and protection policies",
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "authDependencyId": {
      +            "description": "Dependency receiving generated auth/token traffic",
      +            "maxLength": 128,
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          "authRequestsPerAttempt": {
      +            "description": "Auth/token requests generated per dependency attempt",
      +            "maximum": 10,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "capacity": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "maxConcurrent": {
      +                "exclusiveMinimum": 0,
      +                "maximum": 1000000,
      +                "type": "integer"
      +              },
      +              "maxRps": {
      +                "exclusiveMinimum": 0,
      +                "maximum": 500000,
      +                "type": "number"
      +              },
      +              "meanServiceTimeMs": {
      +                "exclusiveMinimum": 0,
      +                "maximum": 120000,
      +                "type": "number"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "id": {
      +            "description": "Unique dependency edge ID",
      +            "maxLength": 128,
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          "protection": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "circuitBreaker": {
      +                "additionalProperties": false,
      +                "properties": {
      +                  "enabled": {
      +                    "type": "boolean"
      +                  },
      +                  "failureRateThreshold": {
      +                    "maximum": 1,
      +                    "minimum": 0,
      +                    "type": "number"
      +                  },
      +                  "halfOpenMaxRequests": {
      +                    "maximum": 10000,
      +                    "minimum": 1,
      +                    "type": "integer"
      +                  },
      +                  "minimumRequests": {
      +                    "maximum": 100000,
      +                    "minimum": 1,
      +                    "type": "integer"
      +                  },
      +                  "openSteps": {
      +                    "maximum": 120,
      +                    "minimum": 1,
      +                    "type": "integer"
      +                  }
      +                },
      +                "type": "object"
      +              },
      +              "loadShedding": {
      +                "type": "boolean"
      +              },
      +              "rateLimitRps": {
      +                "exclusiveMinimum": 0,
      +                "maximum": 500000,
      +                "type": "number"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "requestRatio": {
      +            "description": "Requests to target per original request",
      +            "maximum": 20,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "retryPolicy": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "backoffMs": {
      +                "maximum": 60000,
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "backoffMultiplier": {
      +                "maximum": 10,
      +                "minimum": 1,
      +                "type": "number"
      +              },
      +              "jitterRatio": {
      +                "maximum": 1,
      +                "minimum": 0,
      +                "type": "number"
      +              },
      +              "maxRetries": {
      +                "maximum": 8,
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "retryActorId": {
      +                "description": "Actor producing retries, such as a gateway or client",
      +                "maxLength": 128,
      +                "minLength": 1,
      +                "type": "string"
      +              },
      +              "retryBudgetRatio": {
      +                "maximum": 10,
      +                "minimum": 0,
      +                "type": "number"
      +              },
      +              "retryBudgetRps": {
      +                "maximum": 500000,
      +                "minimum": 0,
      +                "type": "number"
      +              },
      +              "timeoutMs": {
      +                "maximum": 120000,
      +                "minimum": 1,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "sourceId": {
      +            "description": "Upstream resource ID",
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          "targetId": {
      +            "description": "Downstream resource ID",
      +            "minLength": 1,
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "id",
      +          "sourceId",
      +          "targetId"
      +        ],
      +        "type": "object"
      +      },
      +      "maxItems": 64,
      +      "type": "array"
      +    },
      +    "enabled": {
      +      "description": "Master switch for retry/cascade modeling",
      +      "type": "boolean"
      +    },
      +    "maxCascadeDepth": {
      +      "maximum": 8,
      +      "minimum": 1,
      +      "type": "integer"
      +    },
      +    "maxGeneratedRps": {
      +      "exclusiveMinimum": 0,
      +      "maximum": 500000,
      +      "type": "number"
      +    },
      +    "maxStepWork": {
      +      "maximum": 2048,
      +      "minimum": 1,
      +      "type": "integer"
      +    },
      +    "retryGeneratedTrafficAffectsCost": {
      +      "type": "boolean"
      +    },
      +    "scalingPolicies": {
      +      "description": "Capacity-observation policies, including intentional autoscaling blind spots",
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "constrainedMetric": {
      +            "enum": [
      +              "rps",
      +              "concurrency"
      +            ],
      +            "type": "string"
      +          },
      +          "dependencyId": {
      +            "maxLength": 128,
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          "id": {
      +            "maxLength": 128,
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          "observationMetric": {
      +            "enum": [
      +              "source_cpu",
      +              "capacity_utilization"
      +            ],
      +            "type": "string"
      +          },
      +          "observedResourceId": {
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          "scaleOutCapacityMultiplier": {
      +            "maximum": 20,
      +            "minimum": 1,
      +            "type": "number"
      +          },
      +          "scaleOutThresholdPercent": {
      +            "maximum": 100,
      +            "minimum": 1,
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "id",
      +          "dependencyId",
      +          "constrainedMetric",
      +          "observationMetric",
      +          "scaleOutThresholdPercent"
      +        ],
      +        "type": "object"
      +      },
      +      "maxItems": 32,
      +      "type": "array"
      +    },
      +    "scheduledFaults": {
      +      "description": "Scheduled capacity, error, latency, concurrency, or traffic-surge faults",
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "addedLatencyMs": {
      +            "maximum": 120000,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "capacityPercent": {
      +            "maximum": 100,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "dependencyId": {
      +            "type": "string"
      +          },
      +          "endStep": {
      +            "minimum": 1,
      +            "type": "integer"
      +          },
      +          "errorRate": {
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "id": {
      +            "maxLength": 128,
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          "maxConcurrent": {
      +            "exclusiveMinimum": 0,
      +            "maximum": 1000000,
      +            "type": "integer"
      +          },
      +          "startStep": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "targetResourceId": {
      +            "type": "string"
      +          },
      +          "trafficMultiplier": {
      +            "description": "traffic_surge demand multiplier",
      +            "exclusiveMinimum": 1,
      +            "maximum": 20,
      +            "type": "number"
      +          },
      +          "type": {
      +            "description": "Fault type; traffic_surge increases root client demand",
      +            "enum": [
      +              "capacity_limit",
      +              "concurrency_limit",
      +              "latency",
      +              "error_rate",
      +              "traffic_surge"
      +            ],
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "id",
      +          "type",
      +          "startStep"
      +        ],
      +        "type": "object"
      +      },
      +      "maxItems": 32,
      +      "type": "array"
      +    },
      +    "version": {
      +      "const": 1,
      +      "description": "Resilience model version",
      +      "type": "number"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / seed
      Added value: +{
      +  "description": "Deterministic RNG seed for reproducible replays",
      +  "minimum": 0,
      +  "type": "integer"
      +}
  11. Changed1 schema field changed
    • addedOutput schema / properties / normalizedConfig / properties / resources / items / properties / behaviorModel
      Added value: +{
      +  "additionalProperties": true,
      +  "description": "Latency simulation model and GPU interconnect topology parameters for this resource. latencyPath identifies which engine path runs at step time. Two distinct model components: (1) throughput scaling — topologyThroughputFactor (resolveTopologyScalingFactor) bounds effective token capacity; topologyThroughputCalibrationStatus and topologyIsLegacyBaseline qualify that factor. (2) latency shape — topologyTtftFactor + topologyDecodeFactor (resolveTopologyLatencyFactors) scale TTFT and decode curves; topologyCalibrationStatus qualifies those factors. Both components are present on inferenceMode Kubernetes clusters; latencyPath is present on all resource types.",
      +  "properties": {
      +    "acceleratorResolution": {
      +      "description": "'catalog' = accelerator matched ACCELERATOR_TOKENS_PER_SEC; 'fallback' = unrecognised, defaults substituted (TTFT 600 ms, decode 700 tok/s, perNodeTokens 500)",
      +      "enum": [
      +        "catalog",
      +        "fallback"
      +      ],
      +      "type": "string"
      +    },
      +    "behaviourFidelity": {
      +      "description": "'modeled' = parameters from the performance catalog; 'estimated' = defaults substituted",
      +      "enum": [
      +        "modeled",
      +        "estimated"
      +      ],
      +      "type": "string"
      +    },
      +    "description": {
      +      "description": "Human-readable description of the latency model applied to this resource",
      +      "type": "string"
      +    },
      +    "latencyPath": {
      +      "description": "Canonical latency simulation path identifier, e.g. 'gpu-inference/ttft-decode' or 'generic-kubernetes/load-saturation'. Machine-match against LATENCY_PATHS constants — do not string-parse.",
      +      "type": "string"
      +    },
      +    "modelingNote": {
      +      "description": "Provenance disclaimer for latency figures. On inferenceMode clusters states that TTFT/P95/P99 are CWM simulation-model estimates from accelerator catalog parameters, not externally measured benchmarks. When topology is omitted also notes the legacy-baseline assumption (topologyThroughputFactor=1.0).",
      +      "type": "string"
      +    },
      +    "topologyCalibrationStatus": {
      +      "description": "Calibration status of the TTFT+decode latency factors (resolveTopologyLatencyFactors). Entirely separate from topologyThroughputCalibrationStatus, which covers throughput scaling.",
      +      "enum": [
      +        "calibrated",
      +        "estimated",
      +        "not_applicable"
      +      ],
      +      "type": "string"
      +    },
      +    "topologyDecodeFactor": {
      +      "description": "Decode-rate latency scaling factor applied by the engine's GPU inference model (resolveTopologyLatencyFactors). Describes the TTFT+decode latency dimension — distinct from the throughput scaling factor.",
      +      "type": "number"
      +    },
      +    "topologyInterNode": {
      +      "description": "Raw characteristics.topology.interNode value or null when absent",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "topologyIntraNode": {
      +      "description": "Raw characteristics.topology.intraNode value ('pcie', 'nvlink', 'nvlink-nvswitch', 'infiniband') or null when absent",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "topologyIsLegacyBaseline": {
      +      "description": "true when topology.intraNode was absent or unrecognised, meaning topologyThroughputFactor=1.0 reflects the pre-topology legacy baseline (not a fabric-specific measurement). false when an explicit, recognised intraNode value was supplied and the throughput factor is topology-modelled.",
      +      "type": "boolean"
      +    },
      +    "topologyNodeCount": {
      +      "description": "Node count used when resolving topology latency factors (≥ 1)",
      +      "type": "number"
      +    },
      +    "topologyThroughputCalibrationStatus": {
      +      "description": "Calibration status of the throughput scaling factor (resolveTopologyScalingFactor). Distinct from topologyCalibrationStatus, which covers TTFT+decode latency factors. 'estimated' for all current intraNode coefficients (engineering assumptions from bandwidth arithmetic). 'not_applicable' on non-inferenceMode resources. Reserve 'calibrated' for when a directly measured per-request throughput ratio is added.",
      +      "enum": [
      +        "calibrated",
      +        "estimated",
      +        "not_applicable"
      +      ],
      +      "type": "string"
      +    },
      +    "topologyThroughputFactor": {
      +      "description": "Throughput scaling coefficient applied by resolveTopologyScalingFactor to this cluster's token capacity (nodes × perNodeTokensPerSec × factor × gpuUtil/100). 1.0 when topology.intraNode is absent or unrecognised (legacy baseline, topologyIsLegacyBaseline=true). Known fabric penalties: pcie≈0.70, nvlink≈0.85, nvlink-nvswitch≈0.92, infiniband≈1.0. Entirely separate from topologyTtftFactor/topologyDecodeFactor, which describe the TTFT+decode latency model.",
      +      "type": "number"
      +    },
      +    "topologyTtftFactor": {
      +      "description": "TTFT latency scaling factor applied by the engine's GPU inference model (resolveTopologyLatencyFactors). Describes the TTFT+decode latency dimension — distinct from the throughput scaling factor.",
      +      "type": "number"
      +    }
      +  },
      +  "type": "object"
      +}
  12. Changed1 schema field changed
    • addedOutput schema / properties / normalizedConfig
      Added value: +{
      +  "additionalProperties": true,
      +  "description": "Engine-resolved billing parameters for every resource: cost multipliers, hourly rates, autoscale thresholds (scaleOut/scaleIn CPU %), GPU SKU, per-node token throughput, billing floor, connection limits. Use this immediately after create to verify the simulation was set up as intended — e.g. confirm which GPU SKU was resolved, the effective billing floor, or the autoscale CPU threshold that will drive scale-out.",
      +  "properties": {
      +    "resources": {
      +      "description": "Per-resource billing parameters resolved by the engine at create time",
      +      "items": {
      +        "additionalProperties": true,
      +        "properties": {
      +          "autoscaleThreshold": {
      +            "additionalProperties": false,
      +            "description": "Effective autoscale thresholds (provider profile merged with any explicit config)",
      +            "properties": {
      +              "scaleInCpuPercent": {
      +                "description": "CPU % below which a scale-in event fires",
      +                "type": "number"
      +              },
      +              "scaleOutCpuPercent": {
      +                "description": "CPU % that triggers a scale-out event",
      +                "type": "number"
      +              }
      +            },
      +            "required": [
      +              "scaleOutCpuPercent",
      +              "scaleInCpuPercent"
      +            ],
      +            "type": "object"
      +          },
      +          "billingFloorCostPerHour": {
      +            "description": "Minimum cluster cost in USD/hr (cost at billingFloorNodes)",
      +            "type": "number"
      +          },
      +          "billingFloorNodes": {
      +            "description": "Minimum node count the engine will ever bill — scale-in cannot go below this",
      +            "type": "number"
      +          },
      +          "controlPlaneFeePerHour": {
      +            "description": "Fixed cluster control-plane fee in USD/hr",
      +            "type": "number"
      +          },
      +          "currentNodesCostPerHour": {
      +            "description": "Total cluster cost at the current node count (control plane + nodes × rate) × spotFactor in USD/hr",
      +            "type": "number"
      +          },
      +          "id": {
      +            "description": "Resource ID",
      +            "type": "string"
      +          },
      +          "maxNodes": {
      +            "description": "Autoscale ceiling (scale-out stops here)",
      +            "type": "number"
      +          },
      +          "minNodes": {
      +            "description": "Autoscale floor (scale-in stops here)",
      +            "type": "number"
      +          },
      +          "name": {
      +            "description": "Resource display name",
      +            "type": "string"
      +          },
      +          "nodeCount": {
      +            "description": "Current node count",
      +            "type": "number"
      +          },
      +          "nodePools": {
      +            "description": "Per-pool billing details for multi-pool clusters (absent on single-pool clusters)",
      +            "items": {
      +              "additionalProperties": true,
      +              "properties": {
      +                "maxNodes": {
      +                  "type": "number"
      +                },
      +                "minNodes": {
      +                  "type": "number"
      +                },
      +                "name": {
      +                  "type": "string"
      +                },
      +                "nodeCount": {
      +                  "type": "number"
      +                },
      +                "perNodeMaxThroughputRps": {
      +                  "type": "number"
      +                },
      +                "perNodeRatePerHour": {
      +                  "type": "number"
      +                }
      +              },
      +              "required": [
      +                "nodeCount",
      +                "minNodes",
      +                "maxNodes",
      +                "perNodeRatePerHour"
      +              ],
      +              "type": "object"
      +            },
      +            "type": "array"
      +          },
      +          "perNodeRatePerHour": {
      +            "description": "Per-node billing rate in USD/hr",
      +            "type": "number"
      +          },
      +          "perNodeTokensPerSec": {
      +            "description": "Modelled per-node token throughput at full utilisation (tokens/sec) — present only on inference-mode kubernetes resources",
      +            "type": "number"
      +          },
      +          "provider": {
      +            "description": "Cloud provider",
      +            "type": "string"
      +          },
      +          "rateProvenance": {
      +            "additionalProperties": false,
      +            "description": "Trust metadata for the resolved rate: pricing basis (on-demand/spot/estimated), lookup path, and the date the constant was last verified against the provider's public pricing page. Present on compute, database, and GPU inference resources; absent on resource types where no rate is resolved.",
      +            "properties": {
      +              "basis": {
      +                "description": "Pricing basis: published on-demand list price, spot, or a flat estimate",
      +                "enum": [
      +                  "on-demand",
      +                  "spot",
      +                  "estimated"
      +                ],
      +                "type": "string"
      +              },
      +              "lastVerified": {
      +                "description": "ISO-8601 date the constant was last cross-checked against the provider's pricing page; null when unknown",
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "region": {
      +                "description": "Region the verified rate applies to; null for region-uniform pricing",
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "resolution": {
      +                "description": "Which lookup path resolved the rate",
      +                "enum": [
      +                  "large-sku",
      +                  "entry-level-fallback",
      +                  "base-rate-multiplier"
      +                ],
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "basis",
      +              "resolution",
      +              "lastVerified",
      +              "region"
      +            ],
      +            "type": "object"
      +          },
      +          "resolvedConnectionLimit": {
      +            "description": "Effective max-connection limit the engine uses for connection-pressure modelling (database resources)",
      +            "type": "number"
      +          },
      +          "resolvedCostMultiplier": {
      +            "description": "Effective cost multiplier the engine applies to the base provider rate for this resource",
      +            "type": "number"
      +          },
      +          "resolvedGpuRatePerNode": {
      +            "description": "Resolved GPU node billing rate in USD/hr — present only on inference-mode kubernetes resources",
      +            "type": "number"
      +          },
      +          "resolvedHourlyRate": {
      +            "description": "Resolved hourly billing rate in USD/hr (base rate × multiplier)",
      +            "type": "number"
      +          },
      +          "resolvedMaxThroughputRps": {
      +            "description": "Per-node RPS ceiling the engine uses for load and autoscale calculations",
      +            "type": "number"
      +          },
      +          "resolvedSkuLabel": {
      +            "description": "The GPU SKU that was matched (e.g. 'a100-80gb') or a fallback label naming the provider default — present only on inference-mode kubernetes resources",
      +            "type": "string"
      +          },
      +          "resolvedStorageTier": {
      +            "description": "Storage tier / size string used to resolve pricing (database resources)",
      +            "type": "string"
      +          },
      +          "spotFactor": {
      +            "description": "Spot-instance discount factor applied to the node cost (absent = 1, i.e. no discount)",
      +            "type": "number"
      +          },
      +          "type": {
      +            "description": "Resource type (compute, database, kubernetes, …)",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "type": "array"
      +    }
      +  },
      +  "type": "object"
      +}
  13. First observed

TDQS

A4.9/5.0
Behavior5/5

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

Annotations are all false hints, so the bar for disclosure is low, yet the description adds an exceptional amount of behavioral context: the simulationId is a short-lived unguessable capability that survives transport teardown, resources are cleaned up on lifetime expiry, scenario presets are not applied automatically, agent-supplied values are recorded in the immutable normalizationReceipt, GKE control-plane is cost-only with no modeled throttling, misnamed fields are rejected with a 400 rather than silently defaulted, and the new simulation becomes the session's current simulation. Nothing contradicts 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?

Nearly every sentence carries a distinct, non-obvious fact — there is essentially no padding and the core purpose and constraints are front-loaded in the first sentence. However, it is a single dense block with abrupt topic jumps (scenario workflow, then capacity, then GKE cost notes, then autoscaling defaults, then HPA aliases, then per-resource overrides, then response formats, then recovery workflow), so it would benefit from explicit sectioning or paragraph breaks. The content-to-fluff ratio is high enough to exceed 'adequate' but the structure prevents a 5.

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 15-parameter tool with deeply nested objects and an output schema, the description covers everything an agent needs to call it correctly: prerequisites (none), limits, the two input modes and their exclusion, response modes, autoscaling bounds and defaults, HPA threshold and alias semantics, per-resource overrides, post-conditions (becomes current simulation), the recovery workflow, and authentication for persistent simulations. It even describes the compact response shape and recoveryProgress structure despite the output schema existing.

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 coverage is 100%, setting a baseline of 3, but the description adds exactly the cross-parameter semantics the schema cannot express: the alias family around autoscalingTargetCpu and the rule that multiple aliases must agree, the per-resource characteristics.scaleOutCpuThreshold override that 'wins over the simulation-wide default for that resource only', the explicit warning to use capacityRps rather than maxThroughput, the concrete provider default values for maxInstances (AWS 50, GCP 15, Azure/OCI/DigitalOcean 10), and the mutual-exclusivity rule for scenarioId vs resources/connections.

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 ('create'), a specific resource ('temporary anonymous demo cloud simulation'), and the input basis ('from a list of resources and connections'), with explicit constraints (max 2 active simulations per client, up to 10 resources). It distinguishes itself from siblings by naming scenario.get/scenario.list as sources for built-in scenarios and simulation.inject_traffic as the alternative for modifying load.

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 ('start any simulation workflow — either with hydrated resources from scenario.get or your own architecture') and when-not-to-use ('Do not use it to modify an existing simulation — use simulation.inject_traffic'). It spells out the two mutually exclusive alternatives (scenarioId vs resources/connections), the exclusion rule between them, states there are no prerequisites, names the likely next tool (simulation.step), and even gives anti-guidance about not calling api.spec.

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.

TDQS

A4.6/5.0
Disambiguation5/5

Every tool targets a distinct step in the scenario/simulation workflow: catalog vs. hydrated graph, create vs. delete, traffic vs. failure injection, metrics vs. step, and recovery. The descriptions even call out look-alike pairs (e.g., simulation.metrics vs. simulation.step) to prevent misselection.

Naming Consistency4/5

The noun.action pattern with scenario.* and simulation.* prefixes is clear and consistent, and multi-word actions use snake_case. The only deviation is simulation.metrics, which uses a noun rather than an imperative verb like get_metrics or read_metrics, though it remains predictable.

Tool Count5/5

Nine tools is a well-scoped size for a demo simulation server: two for scenario discovery, one creation/one deletion, and five for operating/observing a simulation. No tool feels redundant or superfluous.

Completeness4/5

The core lifecycle is covered end to end: discover scenarios, create a simulation, inject load/failures, step, read metrics, recover, and delete. However, the descriptions repeatedly reference a simulation.get tool that is not present in the set; simulation.metrics mostly substitutes, but that documentation gap makes the surface slightly incomplete.

Resources