Cloud World Model
Server Details
Simulate cloud infrastructure and estimate cost before deploying or changing infrastructure.
- Status
- Healthy
- Uptime
- 100.0% over 59 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 9 tools
Each tool has a clearly distinct purpose: scenario.list and scenario.get separate catalog browsing from full graph hydration, while simulation.create/delete/step/metrics cover lifecycle and simulation.inject_traffic/inject_failure/recover_resource handle targeted interventions. Despite the verbose descriptions, an agent can unambiguously select the right tool.
All tool names follow a consistent namespace.action pattern in lowercase snake_case (scenario.get, simulation.create, simulation.inject_traffic, etc.). The verbs are predictable and the naming scheme is uniform across all nine tools.
Nine tools is well-scoped for the demo cloud simulation purpose. Each tool earns its place in the lifecycle without redundancy or excessive fragmentation.
The surface covers the core simulation lifecycle: scenario discovery, create, step, inject traffic/failure, recover, inspect metrics, and delete. Minor gaps exist—no explicit tool to update an existing simulation's architecture after creation or to list active simulations—and many authenticated operations (typed failures, chaos, persistence) are unavailable in this demo set.
Available Tools
9 toolsscenario.getGet ScenarioRead-onlyIdempotentInspect
Hydrate one built-in scenario from the live Cloud World Model scenario library. Prerequisite: a scenario id returned by scenario.list. Returns the complete selected scenario graph, including resources and connections plus optional seed, resilienceConfig, protectedResilienceConfig, traffic/failure presets, named traffic-phase summaries, activeFailurePhases and optionalFailurePhases (type, resource/zone target, severity, step range), retry-workload disclosure, and real-world incident metadata. The response includes both title and name for compatibility; pass resources and connections, and optionally seed/resilienceConfig, to simulation.create when you need to edit or inspect the graph. For the shorter handoff, pass the id as scenarioId instead. For SQS Queue Backlog Saturation, the optional 5,000 RPS event burst is inactive by default and starts at step 6 after the five-step creation warm-up when enabled. simulation.create accepts scenarioOverrides.sqsQueueBacklogSaturation.includeEventBurst and an optional absolute eventBurstStartStep (integer 6–100000); omit the step to retain default step 6, and choose it before simulation.step finalizes replay identity. The likely next tool is simulation.create.
| Name | Required | Description | Default |
|---|---|---|---|
| scenarioId | Yes | Scenario identifier returned by scenario.list |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Stable scenario identifier |
| name | No | Scenario display name; equivalent to title |
| seed | No | |
| tags | No | |
| title | No | Scenario title |
| status | No | Result status; not_found when the requested scenario does not exist |
| message | No | Error or guidance message |
| category | No | |
| duration | No | |
| resources | No | Full resource graph; pass to simulation.create |
| difficulty | No | |
| connections | No | Full connection graph; pass to simulation.create |
| description | No | |
| primaryPurpose | No | Primary purpose of the scenario; absent means legacy purpose not specified |
| resilienceConfig | No | |
| autoscalingConfig | No | Scenario-level autoscaling thresholds and cooldown; pass this with resources and connections when copying the graph. |
| realWorldIncident | No | |
| activeFailurePhases | No | |
| activeTrafficPhases | No | |
| optionalFailurePhases | No | |
| optionalTrafficPhases | No | |
| defaultTrafficPatterns | No | |
| retryTrafficDisclosure | No | |
| defaultFailureInjections | No | |
| protectedResilienceConfig | No |
scenario.listList ScenariosARead-onlyIdempotentInspect
List the built-in demo scenarios as compact catalog cards — stable IDs, title/name, description, difficulty, tags, category, duration, provider summary, resource/connection counts, named active/optional traffic phases, and retry-workload disclosure. Use it as the first call when you want a ready-made architecture instead of designing one; the cards intentionally omit resource, connection, traffic-pattern, and failure-injection graphs. Anonymous discovery includes only scenarios with at most 10 resources so every listed card is demo-creatable. No prerequisites. Optionally narrow discovery with provider, category, and/or difficulty filters; omit them to receive the complete demo-creatable catalog. Pass a returned id as scenarioId to simulation.create for server-side expansion, or pass it to scenario.get when you need to inspect the full graph. Larger scenarios require an authenticated session. Returns named activeFailurePhases and optionalFailurePhases with type, resource/zone target, severity, and step range. No API key required. The likely next tool is scenario.get.
| Name | Required | Description | Default |
|---|---|---|---|
| category | No | Only scenarios in this category, such as scaling, failure, reliability, networking, or cost | |
| provider | No | Only scenarios that include resources from this cloud provider | |
| difficulty | No | Only scenarios at this difficulty level |
Output Schema
| Name | Required | Description |
|---|---|---|
| scenarios | Yes | Available demo scenarios |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, which covers safety. The description adds valuable context: the 10-resource limit for anonymous discovery (affects what is returned), no API key required, larger scenarios require authenticated session, and the return includes specific failure-phase details. This goes beyond annotations, describing what the result includes and access constraints. However, it doesn't detail what happens if filters are invalid or response size limits, which is minor.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single block of 5 sentences, each packed with information. It's fairly long but every sentence contributes: purpose, omission of graphs, anonymous limit, filtering, usage of returned IDs, auth, return fields, next tool. Could be slightly more compact by splitting into bullets, but it's well-organized and front-loaded with the primary purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (3 optional parameters, output schema present), the description covers when to use, what it returns (including details like failure phase names), prerequisites, auth requirements, and next-step routing. The presence of an output schema means return structure is already documented; the description complements with behavioral specifics like the 10-resource limit and anonymous discovery.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% — all three parameters have descriptions in the schema. The description adds a bit of context: 'omit them to receive the complete demo-creatable catalog' and filter examples. But it doesn't add much beyond the schema. Since coverage is high, baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'List the built-in demo scenarios as compact catalog cards' with specific fields (stable IDs, title, description, difficulty, tags, etc.). It distinguishes itself from siblings by noting that it omits resource/connection/traffic/failure graphs, which are available via scenario.get. The verb 'list' and resource 'scenarios' are precise.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use: 'Use it as the first call when you want a ready-made architecture instead of designing one.' It also tells when not to use (if you need the full graph, use scenario.get) and mentions prerequisites (none for anonymous, authentication for larger scenarios). Provides routing to 'simulation.create' and 'scenario.get' with returned IDs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
simulation.createCreate SimulationInspect
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). No API key required for this temporary anonymous demo operation. 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. When copying a scenario graph that returns autoscalingConfig, pass that config to simulation.create too so its thresholds and cooldown are preserved. For SQS Queue Backlog Saturation, set scenarioOverrides: { sqsQueueBacklogSaturation: { includeEventBurst: true, eventBurstStartStep: 10 } } to enable the optional 5,000 RPS burst and choose its absolute start step (integer 6–100000, after the five-step creation warm-up). Within this override, includeEventBurst defaults to true, so eventBurstStartStep alone enables the burst; without the override the burst stays inactive. Omit eventBurstStartStep to use catalog default step 6; select this scenario-only override before the first simulation.step so replay identity is unchanged. For the catalog EKS Spot Interruption Migration scenario, you may set scenarioOverrides: { eksSpotInterruption: { startupSeconds } } with an integer startupSeconds from 0 through 3600 to test a different readiness deadline without copying the graph; this override requires scenarioId and is mutually exclusive with resources and connections. For the Web App Autoscaling scenario, create with scenarioId: "web-autoscaling" and scenarioOverrides: { webAutoscaling: { includeTrafficRecovery: true } } to activate the optional Traffic Recovery ramp and observe scale-in. includeTrafficRecovery is optional and defaults to false, leaving the phase inactive. Opt in before the first simulation.step because replay identity is finalized when stepping starts. This override also requires scenarioId and is mutually exclusive with resources and connections. For the Redis Cache Crash & Recovery scenario, create with scenarioId: "redis-cache-crash-recovery" and scenarioOverrides: { redisCacheCrashRecovery: { cacheableRequestShare: 0.8, cacheHitRate: 0.8 } } to set the request share sent to Redis and the configured hit rate among those requests (both fractions from 0 to 1; defaults are 0.8). The selected values are per-simulation and appear in normalizedConfig and per-step requestFlow metrics; they do not change the catalog scenario. Redis Cache Crash & Recovery starts at 5,000 RPS by default; an explicit simulation.create traffic value becomes the starting load, and the scenario has no active traffic pattern. Use simulation.inject_traffic to change load after stepping; this remains valid after replay identity finalizes. scenario.list returns graph-free cards with bounded active/optional traffic-phase and retry-workload summaries; it is not a source of resource, connection, traffic-pattern, or failure-injection graphs. Scenario traffic and failure presets are not applied automatically. Custom cache path: use a resource with type 'cache', characteristics.serviceFamily 'elasticache', cacheHitRate as a fraction (0.8, not 80) and optional cacheableRequestShare; connect the load balancer to each app server, each app server to the cache and to the database, and the cache to the database; use responseMode 'full' to see metrics.requestFlow. Use resilienceConfig.externalMetrics for deterministic sampled recommendations: no_ready_endpoints is successful zero only when its trigger sets noReadyEndpointsAsZero:true; discovery_error and fetch_error always remain errors. This is not a KEDA/provider actuator and does not change resource counts. 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). For the exact owned typical fit, set appWeight:'typical', location.regionKey:'us-east-2' on all four AWS nodes, one ALB with serviceFamily:'alb' and loadBalancerScheme:'internal', two m5.large compute apps with workload:'crud-typical', appRuntime:'node', appWorkerCount:2, appDbPoolSize:250, one db.r5.large MySQL with workloadDatabaseEngine:'mysql', workloadDatabaseVersion:'8.0', maxConnections:500, ALB→each app→DB connections, minInstances=maxInstances=2, autoscaling:false, traffic 20–300 RPS. Only typical-fit-20, typical-fit-100 and typical-fit-200 tuned the typical-v1-20260927c/6aa574d7ff9d3080b88b221bcd59f7d218ae37f0 fit; 300 is an independent holdout and 500 is diagnostic only. Other typical workloads are modeled, not owned. P99 has distinct per-percentile provenance: latencyP99Basis identifies the owned in-VPC internal-ALB fit, a scaled-from-fit estimate (not directly measured), or an uncalibrated generic model. On the exact healthy lean owned graph at 10–1,000 offered target RPS, P99=max(final P95, 7.021919127633514 + 0.00027013891327780484T) ms; only 10/100/500 RPS were fit, 1,000 RPS was held out. Lean M5 scaling is not a new measurement; typical/heavy and active failures retain uncalibrated P99. predictionEvidence.latencyP99 has measured 0.65–1.35×, scaled 0.50–1.50× (beyond 1,000: 0.25–2×), or uncalibrated 0.50–2× (beyond: 0.25–3×) assumption bounds centered on final P99. These are not confidence intervals or provider measurements. Historical evidence may omit P99. latencyBasis describes the general modeled latency path; use latencyP99Basis specifically for P99. P99 is diagnostic, not scored. For compute, set characteristics.capacityRps for an explicit per-node RPS ceiling at which CPU reaches ~95%; do not use maxThroughput for that compute contract. Kubernetes rejects capacityRps: set maxThroughput for the total cluster RPS ceiling, or nodePools[].maxThroughput for per-node pool capacity. Omitted compute 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 compute experiment, declare an explicit per-node capacity such as 500 RPS. That value is an experiment control, not a universal hardware fact. For OCI flexible compute shapes, pass the documented positive integer characteristics.ocpus explicitly; VM.Standard.E4.Flex accepts 1–64 OCPUs and each OCPU maps to 2 vCPUs. OCPU count establishes capacity dimensions only, not provider-specific performance, throughput, or price. An uncounted flexible shape remains an unverified generic estimate. Check GET /api/prediction/generic-shapes for the catalog-derived generic fallback inventory. New prediction-only GCP standard capacity entries include e2-standard-2/4/8/16/32, n1-standard-1/2/4/8/16/32/64/96, and n2-standard-16/32/48/64/80/96/128; provider specifications establish vCPU/memory dimensions, not CWM performance or pricing. Version 1 predictionEvidence explicitly reports legacyGeneric at the top level and on every appCpuByResource item; its note identifies each generic resource's shape and fallback reason. For generic fixed compute, characteristics.instanceCount accepts integer 1–100 represented VMs; capacity aggregates and CPU is per VM. Do not combine it with autoscaling:true, minInstances, or maxInstances. Aurora Serverless v2 remains limited to 1 with multiAz:false or 2 with multiAz:true. For Aurora Serverless ACU limits, use characteristics.config.minCapacity/maxCapacity or flat characteristics.minCapacity/maxCapacity. The exact AWS database shape with serviceFamily: 'aurora-serverless' and size: 'db.serverless' also accepts flat characteristics.minAcu/maxAcu; those aliases are rejected elsewhere, including at the resource root or inside config. For that shape, multiAz:true with instanceCount:2 creates a separately billable reader (-reader) in another AZ. Inspect returned resources and metrics before using simulation.step to observe modeled failover; no AWS timing guarantee is implied. For database connection budgets, set characteristics.connectionDemand on a database: {mode:'declared',declaredConnections:240} uses that plan-time demand without RPS; {mode:'max',declaredConnections:240,idlePoolFloor:200} takes the maximum of load-derived demand and the declared/floor values; omitted configuration preserves load-derived behavior. declaredConnections and idlePoolFloor are ASSUMPTIONS / plan-time budgets (for example, replicas × per-pod pool size), not observed live DB connections. Set maxConnections to the usable limit you intend to test. Per-database metrics report connectionDemandMode, loadDerivedConnections, declaredConnections/idlePoolFloor, and modeledConnections; cost and DB CPU/latency remain based on existing load-driven behavior. Demand above the usable limit adds a bounded, rule-based pool-saturation error signal; it is not a provider-calibrated rate. 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. For ECS Fargate CPU-only target tracking, set ecsCpuTargetTracking: true, autoscalingTargetCpu, minInstances/maxInstances, and optional scaleOutCooldownSeconds/scaleInCooldownSeconds with simulationSecondsPerStep (default 1). Inspect autoscalingConfig in the compact response or applicationAutoscalingPolicy in the full response. Latency and throughput do not trigger ECS scaling in this mode. 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.step until state is healthy, then use simulation.metrics to inspect the resulting state and metrics. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Human-readable name for the simulation | |
| seed | No | Deterministic RNG seed for reproducible replays | |
| traffic | No | Initial traffic in requests per second (RPS) | |
| appWeight | No | Immutable root-level workload weight; defaults to typical with appWeightDefaulted=true. Lean is measured only for the eligible owned graph; heavy is an unsupported assumption. predictionEvidence reports per-quantity provenance and assumption ranges, not confidence intervals. | |
| resources | No | 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) | |
| scenarioId | No | Live scenario identifier from scenario.list; mutually exclusive with resources and connections | |
| connections | No | 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. | |
| description | No | Optional description of the simulation's purpose | |
| maxInstances | No | Hard 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. | |
| minInstances | No | Floor on the autoscaled compute fleet size, stored as autoscalingConfig.minInstances. | |
| responseMode | No | Response 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 |
| resilienceConfig | No | Optional retry/cascade resilience model returned by scenario.get. externalMetrics accepts deterministic sampled triggers; no_ready_endpoints is successful zero only when noReadyEndpointsAsZero:true, while discovery_error and fetch_error remain errors. This recommendation model does not actuate KEDA, providers, or simulated resource counts. | |
| autoscalingConfig | No | Simulation autoscaling thresholds and cooldown. Pass the value from scenario.get when creating from a copied scenario graph. | |
| scenarioOverrides | No | Scenario-only customization; requires scenarioId and exactly one supported override. SQS event-burst start is an absolute post-warm-up step and must be selected before the first simulation.step. Redis cache assumptions affect only this simulation. | |
| scaleOutCpuPercent | No | Grok-compatible alias for the CPU HPA scale-out target; if multiple target names are sent they must match. | |
| autoscalingTargetCpu | No | Canonical CPU HPA scale-out target percent. CWM synthesizes unrelated autoscaling defaults. | |
| ecsCpuTargetTracking | No | Opt into CPU-only ECS Fargate target tracking. | |
| scaleOutCpuThreshold | No | Equivalent alias for autoscalingTargetCpu; if both are sent they must match. | |
| scaleInCooldownSeconds | No | ECS CPU target-tracking scale-in cooldown in simulated seconds. | |
| scaleOutCooldownSeconds | No | ECS CPU target-tracking scale-out cooldown in simulated seconds. | |
| simulationSecondsPerStep | No | Simulated seconds per step for ECS cooldowns (default 1). | |
| autoscaleTargetCpuPercent | No | Grok-compatible alias for the CPU HPA scale-out target; if multiple target names are sent they must match. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Unique simulation ID — use with simulation.step, simulation.metrics, etc. |
| name | No | Simulation name |
| status | No | Current simulation status |
| traffic | No | Current traffic in RPS |
| hpaAudit | No | CPU HPA create-time audit: whether a target arrived, its accepted field, the persisted thresholds, and the provider-default explanation when omitted. |
| appWeight | No | |
| resources | No | Per-resource summary (compact mode) or full resource states (full mode) |
| scenarioHash | No | Canonical SHA-256 of the persisted scenario graph and attached traffic-pattern order |
| engineVersion | No | Simulation engine version used for this prediction. |
| replayIdentity | No | |
| normalizedConfig | No | 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. |
| resilienceConfig | No | Effective resilience model returned after create; per-edge retryPolicy values include defaults for omitted fields. |
| autoscalingConfig | No | Effective simulation scaling config; full response also contains the ECS resource's linked CPU-only target-tracking policy. |
| appWeightDefaulted | No | |
| predictionEvidence | No | |
| calibrationEvidence | No | Owned-versus-modeled evidence and latency boundary. |
| effectiveConfigHash | No | Versioned prediction hash over replay startup inputs, engine version, and calibration identity; see replayIdentity.effectiveConfigHash for the original replay-only hash. |
| scenarioAttribution | No | Trusted server-side attribution copied from the live scenario catalog; absent for explicit resource-graph creates |
| effectiveMaxInstances | No | The fleet-size ceiling the engine will enforce (autoscalingConfig.maxInstances, or the provider default when unset) |
| effectiveMinInstances | No | The fleet-size floor the engine will enforce (autoscalingConfig.minInstances, or the provider default when unset) |
| predictionEffectiveConfigHash | No | Versioned prediction hash over replay startup inputs, engine version, and calibration identity. |
simulation.deleteDelete SimulationADestructiveIdempotentInspect
Permanently delete an owned temporary anonymous demo simulation and its metrics, events, failures, and capability. This is the explicit way to free a simulation slot; deletion is irreversible, while the existing demo TTL remains the safety net for abandoned simulations. Prerequisite: a simulationId from simulation.create, or an active simulation in the preserved MCP session. The likely next tool is simulation.create to use the freed slot. A successful response is { deleted: true, id }; failed ownership checks do not delete or revoke anything. Authenticate with an API key to unlock all 63 tools and persistent simulation management.
| Name | Required | Description | Default |
|---|---|---|---|
| simulationId | No | Simulation ID returned by simulation.create. Preserve Mcp-Session-Id to omit this field and use the session's current simulation; if your connector starts a fresh MCP session for each call (for example Grok Bot or Cursor), pass this explicit ID after every fresh initialization. A fresh session has no current-simulation pointer and returns NO_ACTIVE_SIMULATION when the ID is omitted. Anonymous capabilities are short-lived (30 minutes by default), unguessable, and revoked when the demo expires or is deleted; proxy IP changes do not invalidate them. Do not treat the ID as a durable share link. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | ID of the deleted simulation |
| deleted | No | True when the simulation was deleted |
| simulationId | No | ID used for the deletion |
| simulationIdSource | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond destructiveHint/idempotentHint: deletion is irreversible, it cascades to metrics/events/failures/capability, the TTL remains the fallback for abandoned demos, and failed ownership checks neither delete nor revoke anything. It also discloses the authentication requirement, which annotations do not cover.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: the irreversible delete and cascade come first, then prerequisites, then the next step. The closing API-key upsell ('unlock all 63 tools') is promotional rather than operational and slightly dilutes the signal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive single-parameter tool with an output schema, the description covers everything an agent needs: cascade effects, irreversibility, session vs explicit-ID usage, failure semantics, and the routing to simulation.create. Return values are already covered by the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single parameter already documents session behavior, fresh-session pitfalls, and NO_ACTIVE_SIMULATION. The description restates the prerequisite and session fallback but adds no new syntax or format detail, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Permanently delete an owned temporary anonymous demo simulation') with an explicit scope of what is also removed (metrics, events, failures, capability). It is easily distinguished from read-side siblings like simulation.metrics and from simulation.create, which it names.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains when to reach for it ('the explicit way to free a simulation slot') versus the alternative of letting the TTL expire, and names the likely next tool (simulation.create). It gives prerequisites (simulationId from simulation.create or an active session) but no explicit exclusions for the other seven siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
simulation.inject_failureInject FailureDestructiveInspect
Fail one compute/Kubernetes node, database, or cache in a temporary anonymous demo simulation (marked critical, not removed). Targeted database quick failures are bounded and reversible; with no serving database at positive load, simulation.step reports 100% errors, zero goodput and errorBreakdown.dbFailure: 100. simulation.recover_resource can restore a database or cache early. An AWS Aurora writer with characteristics.auroraStandbyResourceId pointing to a healthy related replicaOf database has an opt-in modeled failover: the first step is unavailable, the second shows the standby serving without a residual writer-outage penalty. MultiAz or an unrelated second database alone does not establish a standby. Read metrics.databases[].auroraFailover and the promotion event for the failed and standby IDs and success, plus errorRate and throughput. Each quick step is one modeled simulation second, so second-step promotion is one second after injection. Chaos database_crash samples every 10 seconds and defaults to a 30-second promotion and a 1800-second sole-writer restart after its injection duration; compare matching phases, not equal step indices or wall-clock times. These are deterministic assumptions, not observed AWS behavior. No API key required for this temporary anonymous demo operation. Exact targeting: pass resourceName (human-readable name, e.g. 'app-server-01'; exact match preferred, an unambiguous prefix is accepted) or resourceId to fail a specific resource — including an individual named instance, not only a group. If resourceName matches multiple resources the call fails with a 400 listing every matching candidate by name — retry with one exact name (or its resourceId) from that list. The database or cache must be healthy; an already failed database or cache returns a 400 describing its current status. When neither parameter is supplied, a RANDOM healthy compute/Kubernetes node is selected (not a database) — this path is non-deterministic and NOT suitable for controlled scenarios or replay; always target by name/id when reproducing a precise fault sequence. The response always echoes the applied outcome via resolvedResourceId, resolvedResourceName, and previousHealth (populated from the selected resource on the random path too). Network, storage, queue, and security resource types are not supported by quick injection. Cache failures are supported and recoverable with simulation.recover_resource. For typed database_overload use authenticated failure.create (unavailable anonymously); instance_kill PERMANENTLY removes the instance — failure.delete does not restore it; use instance_down instead for a reversible single-node outage. Returns the updated resource list and the failure event that was logged. The likely next tool is simulation.step to observe how the architecture degrades under failure, then simulation.metrics to review the health impact. Do not use it to advance simulation time — that is simulation.step. Pass simulationId from simulation.create when this call is made from a fresh MCP session; otherwise you may omit it to target the current simulation in the preserved MCP session. Authenticate with an API key to unlock all 63 tools including typed durational failures and chaos engineering.
| Name | Required | Description | Default |
|---|---|---|---|
| resourceId | No | Optional: ID of the resource to fail. Takes precedence over resourceName. | |
| resourceName | No | Optional: name of the resource to fail (exact match preferred; unambiguous prefix accepted). Ambiguous names return a 400 with a candidate list. | |
| simulationId | No | Simulation ID returned by simulation.create. Preserve Mcp-Session-Id to omit this field and use the session's current simulation; if your connector starts a fresh MCP session for each call (for example Grok Bot or Cursor), pass this explicit ID after every fresh initialization. A fresh session has no current-simulation pointer and returns NO_ACTIVE_SIMULATION when the ID is omitted. Anonymous capabilities are short-lived (30 minutes by default), unguessable, and revoked when the demo expires or is deleted; proxy IP changes do not invalidate them. Do not treat the ID as a durable share link. |
Output Schema
| Name | Required | Description |
|---|---|---|
| event | No | Failure event that was logged |
| resources | No | Updated resource list after failure injection |
| previousHealth | No | The resource's health status immediately before the failure was applied |
| resolvedResourceId | No | ID of the resource that was failed (targeted or randomly selected) |
| resolvedResourceName | No | Name of the resource that was failed |
simulation.inject_trafficInject TrafficInspect
Change traffic on a demo simulation using targetRps, deltaPercent, or explicit random: true. targetRps takes precedence over deltaPercent; random cannot be combined with either. Missing or unknown selectors are rejected, and no random spike is selected implicitly. Absolute targets are capped at 10000 RPS in demo mode. The change affects metrics after the next simulation.step. For Redis Cache Crash & Recovery, the default 5,000 RPS load has no active pattern, so this controlled traffic update also works after replay identity finalizes. Do not use it to read metrics (simulation.metrics) or advance time (simulation.step). Pass the simulationId returned by simulation.create when your connector opens a fresh MCP session; preserve Mcp-Session-Id to use the omitted-ID current-simulation default. Returns the updated simulation with its new traffic level; the likely next tool is simulation.step.
| Name | Required | Description | Default |
|---|---|---|---|
| random | No | Explicitly select a random stress spike; never selected implicitly. | |
| targetRps | No | Absolute traffic level in RPS to set. Server-capped at 10000 RPS in demo mode. | |
| deltaPercent | No | Relative traffic change; must be greater than -100. | |
| simulationId | No | Simulation ID returned by simulation.create. Preserve Mcp-Session-Id to omit this field and use the session's current simulation; if your connector starts a fresh MCP session for each call (for example Grok Bot or Cursor), pass this explicit ID after every fresh initialization. A fresh session has no current-simulation pointer and returns NO_ACTIVE_SIMULATION when the ID is omitted. Anonymous capabilities are short-lived (30 minutes by default), unguessable, and revoked when the demo expires or is deleted; proxy IP changes do not invalidate them. Do not treat the ID as a durable share link. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Simulation ID |
| status | No | Updated simulation status |
| traffic | No | New traffic level in RPS after injection |
simulation.metricsGet Simulation MetricsRead-onlyIdempotentInspect
Read the latest metrics and resource states for a temporary anonymous demo simulation: latency, CPU, throughput, error rate, cost per hour, and per-resource health. Use it to inspect current state and metrics history without advancing time; do not use it to move the simulation forward — that is simulation.step. Responses are compact by default: principal current metrics plus explicit modeled goodputRps (a post-step point rate sourced from throughput, with provenance), goodputWindow (recorded only from persisted simulation-clock bounds, otherwise unavailable with provenance; never derive it from retrieval time or currentStep), errorBreakdown when available, per-resource status (id, name, status, cpuPercent, routedRps, availabilityState, isRoutable, and recoveryBlockedReason when provided), seeded EKS Spot checkpoint history and migrationEvaluationComplete/provenance when present, and the last 10 metrics-history entries. Pass responseMode: 'full' to get the complete simulation state, normalizedConfig, and full metrics history instead. During recovery, each resource may include recoveryProgress.state (parked, cooling_down, or healthy) with parkWindow and cooldown counters; poll simulation.step until healthy, then use simulation.metrics to inspect the resulting state and metrics. GPU / inference workflow: when the simulation includes a kubernetes resource with characteristics.inferenceMode: true, the response also includes top-level gpuUtilization (%), tokensPerSecond, costPerMillionTokens (USD/M tokens), idleGpuCostPerHour (USD/hr of standby GPU spend), and idleGpuFraction (0-1 idle HA overhead share) from the latest step, and each history entry carries the same inference fields. Pass the simulationId returned by simulation.create when your connector opens a fresh MCP session; preserve Mcp-Session-Id to use the omitted-ID current-simulation default. A fresh session has no current-simulation pointer. At least one simulation.step is needed for meaningful metrics. Read-only; repeated calls may be subject to demo usage limits. The likely next tool is simulation.step or simulation.inject_traffic.
| Name | Required | Description | Default |
|---|---|---|---|
| responseMode | No | Response detail level. 'compact' (default) returns principal current metrics, errorBreakdown when available, per-resource status (id, name, status, cpuPercent, routedRps, availabilityState, isRoutable, recoveryBlockedReason, and failureLifecycle/routingState when provided), and only the last 10 metrics-history entries — keeps polling cheap for agent loops. 'full' returns the complete simulation object (all resource characteristics and connections) plus the entire metrics history. | compact |
| simulationId | No | Simulation ID returned by simulation.create. Preserve Mcp-Session-Id to omit this field and use the session's current simulation; if your connector starts a fresh MCP session for each call (for example Grok Bot or Cursor), pass this explicit ID after every fresh initialization. A fresh session has no current-simulation pointer and returns NO_ACTIVE_SIMULATION when the ID is omitted. Anonymous capabilities are short-lived (30 minutes by default), unguessable, and revoked when the demo expires or is deleted; proxy IP changes do not invalidate them. Do not treat the ID as a durable share link. |
Output Schema
| Name | Required | Description |
|---|---|---|
| metrics | No | Metrics history — bounded to the last 10 entries in compact mode, full history in full mode |
| traffic | No | Current traffic level in RPS |
| metricId | No | Storage-assigned ID of the latest persisted metric |
| appWeight | No | |
| errorRate | No | Latest client-level error rate (%) against original offered RPS. Resilience dependency targets in autoscaled compute fleets use aggregate routable-fleet capacity and health; non-autoscaled targets use their resolved resource capacity, including any declared fixed-instance count. |
| resources | No | Per-resource status summary (compact mode) |
| goodputRps | No | Modeled client-level successful requests per second; a post-step point rate sourced from metrics.throughput. Resilience dependency targets in autoscaled compute fleets use aggregate routable-fleet capacity and health; non-autoscaled targets use their resolved resource capacity, including any declared fixed-instance count. |
| latencyP50 | No | Latest 50th-percentile latency in ms; null when workload-specific latency evidence is unavailable. |
| latencyP95 | No | Latest 95th-percentile latency in ms; null when workload-specific latency evidence is unavailable. |
| latencyP99 | No | Latest modeled 99th-percentile latency in ms; null when workload-specific latency evidence is unavailable. Interpret with latencyP99Basis and predictionEvidence.latencyP99. |
| offeredRps | No | Latest aggregate offered requests per second |
| simulation | No | Complete simulation state (full mode only; absent in compact mode and when status is not_found/access_denied) |
| throughput | No | Latest effective requests per second |
| costPerHour | No | Latest estimated cost in USD/hr |
| currentStep | No | Current simulation time step |
| latencyBasis | No | Latest general modeled latency path/boundary; see latencyP99Basis for P99-specific provenance. |
| scenarioHash | No | Canonical replay scenario graph hash. |
| simulationId | No | ID of the queried simulation |
| engineVersion | No | Simulation engine version used for this prediction. |
| goodputWindow | No | Interval goodput aggregate when every point has persisted simulation-clock bounds; otherwise status=unavailable. Never derive this from retrieval time or currentStep. |
| errorBreakdown | No | Validated additive error contributors from the latest metrics entry, in percentage-point units; distinguishes database connection pressure below the usable limit from pool saturation after exhaustion |
| gpuUtilization | No | Latest GPU utilization (%) — present only on GPU inference simulations |
| modeledShedRps | No | Latest aggregate modeled shed requests per second |
| replayIdentity | No | |
| auroraFailovers | No | Latest compact per-writer Aurora failover state, with failed and standby IDs and phase. |
| externalMetrics | No | Latest deterministic external-metric recommendation telemetry, including each trigger's sample status/outcome/value/desired capacity and the combined capacity decision. It never actuates simulated or provider resources. |
| idleGpuFraction | No | Latest share (0-1) of the GPU bill that is idle/standby capacity — present only on GPU inference simulations |
| latencyP99Basis | No | Latest percentile-specific P99 basis: owned fit, scaled-from-fit (not directly measured), or uncalibrated generic model. |
| tokensPerSecond | No | Latest inference throughput in tokens/second — present only on GPU inference simulations |
| goodputSemantics | No | Goodput is a point rate, not an interval total |
| kubernetesCpuHpa | No | Latest per-workload bounded CPU HPA telemetry, including input provenance and missing-request errors; no Kubernetes controller parity is claimed. |
| goodputProvenance | No | Provenance for the modeled goodput field |
| appWeightDefaulted | No | |
| idleGpuCostPerHour | No | Latest USD/hr of GPU spend funding idle/standby capacity (HA overhead) — present only on GPU inference simulations |
| predictionEvidence | No | |
| calibrationEvidence | No | Owned-versus-modeled evidence and latency boundary. |
| effectiveConfigHash | No | Versioned prediction hash over replay startup inputs, engine version, and calibration identity. |
| latencyAvailability | No | |
| residualCostPerHour | No | Subtotal of unavailable, parked, or stopped resource costs; healthy/degraded idle resources, including ALBs, are excluded. |
| costPerMillionTokens | No | Latest self-hosted inference cost in USD per million tokens (null when no tokens are being processed) — present only on GPU inference simulations |
| eksSpotInterruptions | No | Latest seeded EKS interruption telemetry, including additive migrationEvaluation/provenance when recorded. |
| metricsHistoryLength | No | Total number of metrics-history entries (compact mode returns only the last 10) |
| resilienceDiagnostics | No | Bounded resilience diagnostics from the latest step (compact mode). Absent when the resilience model did not run. |
| residualCostDefinition | No | Definition of residual cost; total cost remains the complete billed total. |
| retryAmplificationFactor | No | Latest (original offered RPS + generated retry RPS) / original offered RPS; an amplification measure, not capacity or goodput. Values > 1.0 = amplification risk. null = model ran but no traffic. Absent = resilience model disabled. |
| predictionEffectiveConfigHash | No | Versioned prediction hash over replay startup inputs, engine version, and calibration identity. |
simulation.recover_resourceRecover Failed ResourceAInspect
Recover one reversible failed resource in a temporary anonymous demo simulation. No API key required for this temporary anonymous demo operation. Lower traffic to a serviceable level first, then provide resourceId or resourceName from simulation.create, simulation.step, or simulation.metrics. This deactivates applicable instance_down/database_overload failures for only the selected resource and returns recoveryProgress with parked, cooling_down, or healthy state plus cooldown counters. It cannot restore an instance_kill because that failure permanently removes the resource. The likely next tool is simulation.step; keep stepping and inspect the targeted resource until recoveryProgress.state is healthy. Pass simulationId from simulation.create when using a fresh MCP session; a preserved session may omit it. Authenticate with an API key to unlock all 63 tools and unlimited simulations.
| Name | Required | Description | Default |
|---|---|---|---|
| resourceId | No | ID of the failed resource to recover | |
| resourceName | No | Exact case-insensitive name of the failed resource to recover | |
| simulationId | No | Simulation ID returned by simulation.create. Preserve Mcp-Session-Id to omit this field and use the session's current simulation; if your connector starts a fresh MCP session for each call (for example Grok Bot or Cursor), pass this explicit ID after every fresh initialization. A fresh session has no current-simulation pointer and returns NO_ACTIVE_SIMULATION when the ID is omitted. Anonymous capabilities are short-lived (30 minutes by default), unguessable, and revoked when the demo expires or is deleted; proxy IP changes do not invalidate them. Do not treat the ID as a durable share link. |
Output Schema
| Name | Required | Description |
|---|---|---|
| simulationId | No | |
| recoveryState | No | |
| previousHealth | No | |
| stepsToHealthy | No | |
| recoveryProgress | No | |
| resolvedResourceId | No | |
| simulationIdSource | No | |
| resolvedResourceName | No | |
| deactivatedFailureIds | No | |
| stepsToHealthyIsLowerBound | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say non-read-only, non-destructive, non-idempotent; the description goes well beyond by disclosing that only the selected resource's instance_down/database_overload failures are deactivated, that recoveryProgress returns parked/cooling_down/healthy plus cooldown counters, and that instance_kill failures are unrecoverable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and its constraints, and most sentences earn their place. Some repetition around the anonymous-demo/no-API-key framing and the closing upsell sentence slightly dilute density.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a recovery mutation with an output schema, the description covers preconditions, scope of effect, unrecoverable cases, return-state semantics, and session handling. An agent has everything needed to call it and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds genuine value on top: it tells the agent where each identifier originates (simulation.create/step/metrics) and gives session guidance for simulationId, though it doesn't clarify precedence between resourceId and resourceName.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (recover) plus resource (one reversible failed resource) and scopes it to a temporary anonymous demo simulation. It also distinguishes itself from siblings by naming simulation.create/step/metrics as ID sources and simulation.step as the follow-up tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit preconditions (lower traffic to a serviceable level first), explicit inputs to source (resourceId or resourceName from create/step/metrics), explicit exclusion (cannot restore an instance_kill), and an explicit next step (simulation.step until healthy). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
simulation.stepSimulate StepInspect
Advance a temporary anonymous demo simulation by one time step and return updated metrics — CPU, latency, throughput, error rate, cost (max 20 persisted steps per demo). Concurrent simulation.step calls on one simulation either serialize as distinct consecutive steps (in the browser Workspace queue) or receive HTTP 409 simulation_step_in_progress without advancing or consuming a demo credit. Wait for the running call to finish, then retry only rejected calls; distinct simulations can run concurrently. After a timeout, inspect simulation.metrics before retrying an uncertain result. Use it to observe how the architecture behaves over time, typically right after simulation.create or simulation.inject_traffic. Do not use it to read current state without advancing time — that is simulation.metrics. Pass the simulationId returned by simulation.create when your connector opens a fresh MCP session; preserve Mcp-Session-Id to use the omitted-ID current-simulation default. An optional traffic override is applied when no traffic pattern is active; with an active pattern it is rejected with STEP_TRAFFIC_PATTERN_ACTIVE. Use simulation.inject_traffic to change load; it deactivates patterns before replay finalization and uses a runtime-only override for finalized SQS backlog runs, or omit traffic to follow the schedule. The likely next tool is simulation.step again (to keep observing) or simulation.inject_traffic (to change load first). Responses are compact by default: principal metrics plus per-resource status (id, name, status, cpuPercent, routedRps, availabilityState, isRoutable, and recoveryBlockedReason when provided) and this step's events. Seeded characteristics.eksSpotInterruption telemetry retains its additive migrationEvaluation beside the interruption lifecycle: use its recorded/derived/unavailable field provenance, frozen deadline verdict/counts/reasons, and simulation-clock milestones rather than final service health. The distinct eksSpotMigration contract remains separately reported when configured. Compact responses also include errorBreakdown when the engine provides it. A critical resource with isRoutable: true is degraded but still serving; unavailable identifies a failed or parked node, while scaled_to_zero and cold_start identify Fargate no-task states. Pass responseMode: 'full' to get the complete simulation state instead. During recovery, each resource may include recoveryProgress with state parked, cooling_down, or healthy, plus parkWindow and cooldown counters. Poll simulation.step until the targeted resource's recoveryProgress.state is healthy, then use simulation.metrics to inspect the resulting state and metrics. GPU / inference workflow: when the simulation includes a kubernetes resource with characteristics.inferenceMode: true, each step response also includes gpuUtilization (%), tokensPerSecond, costPerMillionTokens (USD/M tokens), idleGpuCostPerHour (USD/hr of standby GPU spend), and idleGpuFraction (0-1 idle HA overhead share) so you can track inference economics step by step. Authenticate with an API key for unlimited steps and GPU right-sizing hints.
| Name | Required | Description | Default |
|---|---|---|---|
| traffic | No | Optional RPS override for this step. Applied when no traffic pattern is active; otherwise rejected with STEP_TRAFFIC_PATTERN_ACTIVE. Use simulation.inject_traffic to change load; finalized SQS backlog runs keep the pattern snapshot and apply an explicit target at runtime. | |
| responseMode | No | Response detail level. 'compact' (default) returns only principal metrics, errorBreakdown when available, per-resource status (id, name, status, cpuPercent, routedRps, availabilityState, isRoutable, recoveryBlockedReason, and failureLifecycle/routingState when provided), and this step's events — keeps observations small for agent loops. 'full' returns the complete backend step response including the entire simulation object with all resource characteristics and connections. | compact |
| simulationId | No | Simulation ID returned by simulation.create. Preserve Mcp-Session-Id to omit this field and use the session's current simulation; if your connector starts a fresh MCP session for each call (for example Grok Bot or Cursor), pass this explicit ID after every fresh initialization. A fresh session has no current-simulation pointer and returns NO_ACTIVE_SIMULATION when the ID is omitted. Anonymous capabilities are short-lived (30 minutes by default), unguessable, and revoked when the demo expires or is deleted; proxy IP changes do not invalidate them. Do not treat the ID as a durable share link. |
Output Schema
| Name | Required | Description |
|---|---|---|
| events | No | Events generated during this step; every event has a non-empty canonical type |
| metrics | No | Full-mode backend metric record; migrationEvaluation is exact-typed when a seeded interruption is present. |
| traffic | No | Current traffic level in RPS |
| metricId | No | Storage-assigned persisted metric ID when available |
| appWeight | No | |
| errorRate | No | Client-level error rate (%) against original offered RPS. Resilience dependency targets in autoscaled compute fleets use aggregate routable-fleet capacity and health; non-autoscaled targets use their resolved resource capacity, including any declared fixed-instance count. |
| resources | No | Per-resource status summary (compact mode) |
| goodputRps | No | Modeled client-level successful requests per second; a post-step point rate sourced from metrics.throughput. Resilience dependency targets in autoscaled compute fleets use aggregate routable-fleet capacity and health; non-autoscaled targets use their resolved resource capacity, including any declared fixed-instance count. |
| latencyP50 | No | 50th-percentile latency in ms; null when workload-specific latency evidence is unavailable. |
| latencyP95 | No | 95th-percentile latency in ms; null when workload-specific latency evidence is unavailable. |
| latencyP99 | No | Modeled 99th-percentile latency in ms; null when workload-specific latency evidence is unavailable. Interpret with latencyP99Basis and predictionEvidence.latencyP99. |
| offeredRps | No | Aggregate offered requests per second represented by metrics.offeredRps provenance |
| throughput | No | Effective requests per second |
| costPerHour | No | Estimated cost in USD/hr |
| currentStep | No | New simulation time step index |
| latencyBasis | No | General modeled latency path/boundary; see latencyP99Basis for P99-specific provenance. |
| scenarioHash | No | Canonical SHA-256 of the persisted scenario graph and attached traffic-pattern order |
| simulationId | No | ID of the stepped simulation |
| engineVersion | No | Simulation engine version used for this prediction. |
| goodputWindow | No | Interval goodput aggregate when every point has persisted simulation-clock bounds; otherwise status=unavailable. Never derive this from retrieval time or currentStep. |
| loadBalancers | No | Per-load-balancer routed traffic, including CDN-origin-matched ALB RPS for comparison with cdnFlow.originRps |
| errorBreakdown | No | Validated additive error contributors in percentage-point units; separates database connection pressure below the usable pool limit from pool saturation after exhaustion, plus DB, compute, capacity, CPU, storage, runtime-memory, and queue absorption effects |
| gpuUtilization | No | GPU utilization (%) — present only on simulations with a GPU inference kubernetes resource |
| modeledShedRps | No | Aggregate modeled requests per second shed by bounded capacity |
| replayIdentity | No | |
| requestServing | No | |
| auroraFailovers | No | Compact per-writer Aurora failover state; promoting has no serving writer, serving means the explicitly related standby took over. |
| externalMetrics | No | Latest deterministic external-metric recommendation telemetry, including each trigger's sample status/outcome/value/desired capacity and the combined capacity decision. It never actuates simulated or provider resources. |
| idleGpuFraction | No | Share (0-1) of the GPU bill that is idle/standby capacity — present only on GPU inference simulations; values above 0.5 mean over half the GPU spend is HA overhead |
| latencyP99Basis | No | Percentile-specific P99 basis: owned fit, scaled-from-fit (not directly measured), or uncalibrated generic model. |
| tokensPerSecond | No | Inference throughput in tokens/second — present only on GPU inference simulations |
| goodputSemantics | No | Goodput is a point rate, not an interval total |
| kubernetesCpuHpa | No | Per-workload CPU request, observed millicores per pod, target calculations, bounded replica recommendation, scale-down stabilization, and provenance/errors. Utilization without a CPU request has no recommendation; this is not Kubernetes controller parity. |
| goodputProvenance | No | Provenance for the modeled goodput field |
| appWeightDefaulted | No | |
| idleGpuCostPerHour | No | USD/hr of GPU spend funding idle/standby capacity (HA overhead) — present only on GPU inference simulations |
| predictionEvidence | No | |
| calibrationEvidence | No | Owned-versus-modeled evidence and latency boundary. |
| effectiveConfigHash | No | Versioned prediction hash over replay startup inputs, engine version, and calibration identity; see replayIdentity.effectiveConfigHash for the original replay-only hash. |
| latencyAvailability | No | |
| residualCostPerHour | No | Subtotal of unavailable, parked, or stopped resource costs; healthy/degraded idle resources, including ALBs, are excluded. |
| costPerMillionTokens | No | Self-hosted inference cost in USD per million tokens (null when no tokens are being processed) — present only on GPU inference simulations |
| eksSpotInterruptions | No | Seeded EKS interruption telemetry, including the authoritative additive migrationEvaluation when recorded. |
| resilienceDiagnostics | No | Bounded resilience diagnostics summary (compact mode). Absent when the resilience model did not run. Use simulation.compare_resilience for full per-path detail. |
| residualCostDefinition | No | Definition of residual cost; total cost remains the complete billed total. |
| retryAmplificationFactor | No | (Original offered RPS + generated retry RPS) / original offered RPS; an amplification measure, not capacity or goodput. Values > 1.0 = amplification risk. null = model ran but no traffic. Absent = resilience model disabled. |
| predictionEffectiveConfigHash | No | Versioned prediction hash over replay startup inputs, engine version, and calibration identity. |
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
- Changed
simulation.inject_traffic4 fields changed- added
Input schema / properties / deltaPercentAdded value: +{ + "description": "Relative traffic change; must be greater than -100.", + "exclusiveMinimum": -100, + "type": "number" +} - added
Input schema / properties / randomAdded value: +{ + "const": true, + "description": "Explicitly select a random stress spike; never selected implicitly.", + "type": "boolean" +} - added
Input schema / properties / targetRpsAdded value: +{ + "description": "Absolute traffic level in RPS to set. Server-capped at 10000 RPS in demo mode.", + "minimum": 1, + "type": "integer" +} - removed
Input schema / properties / trafficRemoved value: -{ - "description": "Absolute traffic level in RPS to set. Omit to trigger a random spike instead. Server-capped at 10000 RPS in demo mode.", - "type": "number" -}
1 tool update
- Changed
simulation.create1 field changed- changed
Input schema / properties / scenarioOverrides / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "sqsQueueBacklogSaturation": { - "additionalProperties": false, - "properties": { - "eventBurstStartStep": { - "maximum": 100000, - "minimum": 6, - "type": "integer" - }, - "includeEventBurst": { - "type": "boolean" - } - }, - "required": [ - "includeEventBurst" - ], - "type": "object" - } - }, - "required": [ - "sqsQueueBacklogSaturation" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "eksSpotInterruption": { - "additionalProperties": false, - "properties": { - "startupSeconds": { - "maximum": 3600, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "startupSeconds" - ], - "type": "object" - } - }, - "required": [ - "eksSpotInterruption" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "webAutoscaling": { - "additionalProperties": false, - "properties": { - "includeTrafficRecovery": { - "default": false, - "type": "boolean" - } - }, - "type": "object" - } - }, - "required": [ - "webAutoscaling" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "redisCacheCrashRecovery": { - "additionalProperties": false, - "properties": { - "cacheHitRate": { - "description": "Configured hit rate among requests sent to Redis (0–1; the scenario default is 0.8).", - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "cacheableRequestShare": { - "description": "Fraction of offered requests sent to Redis (0–1; the scenario default is 0.8).", - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "cacheableRequestShare", - "cacheHitRate" - ], - "type": "object" - } - }, - "required": [ - "redisCacheCrashRecovery" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "sqsQueueBacklogSaturation": { + "additionalProperties": false, + "properties": { + "eventBurstStartStep": { + "maximum": 100000, + "minimum": 6, + "type": "integer" + }, + "includeEventBurst": { + "default": true, + "type": "boolean" + } + }, + "type": "object" + } + }, + "required": [ + "sqsQueueBacklogSaturation" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "eksSpotInterruption": { + "additionalProperties": false, + "properties": { + "startupSeconds": { + "maximum": 3600, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "startupSeconds" + ], + "type": "object" + } + }, + "required": [ + "eksSpotInterruption" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "webAutoscaling": { + "additionalProperties": false, + "properties": { + "includeTrafficRecovery": { + "default": false, + "type": "boolean" + } + }, + "type": "object" + } + }, + "required": [ + "webAutoscaling" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "redisCacheCrashRecovery": { + "additionalProperties": false, + "properties": { + "cacheHitRate": { + "description": "Configured hit rate among requests sent to Redis (0–1; the scenario default is 0.8).", + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "cacheableRequestShare": { + "description": "Fraction of offered requests sent to Redis (0–1; the scenario default is 0.8).", + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "cacheableRequestShare", + "cacheHitRate" + ], + "type": "object" + } + }, + "required": [ + "redisCacheCrashRecovery" + ], + "type": "object" + } +]
1 tool update
- Changed
simulation.create2 fields changed- changed
Input schema / properties / scenarioOverrides / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "eksSpotInterruption": { - "additionalProperties": false, - "properties": { - "startupSeconds": { - "maximum": 3600, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "startupSeconds" - ], - "type": "object" - } - }, - "required": [ - "eksSpotInterruption" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "webAutoscaling": { - "additionalProperties": false, - "properties": { - "includeTrafficRecovery": { - "default": false, - "type": "boolean" - } - }, - "type": "object" - } - }, - "required": [ - "webAutoscaling" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "redisCacheCrashRecovery": { - "additionalProperties": false, - "properties": { - "cacheHitRate": { - "description": "Configured hit rate among requests sent to Redis (0–1; the scenario default is 0.8).", - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "cacheableRequestShare": { - "description": "Fraction of offered requests sent to Redis (0–1; the scenario default is 0.8).", - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "cacheableRequestShare", - "cacheHitRate" - ], - "type": "object" - } - }, - "required": [ - "redisCacheCrashRecovery" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "sqsQueueBacklogSaturation": { + "additionalProperties": false, + "properties": { + "eventBurstStartStep": { + "maximum": 100000, + "minimum": 6, + "type": "integer" + }, + "includeEventBurst": { + "type": "boolean" + } + }, + "required": [ + "includeEventBurst" + ], + "type": "object" + } + }, + "required": [ + "sqsQueueBacklogSaturation" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "eksSpotInterruption": { + "additionalProperties": false, + "properties": { + "startupSeconds": { + "maximum": 3600, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "startupSeconds" + ], + "type": "object" + } + }, + "required": [ + "eksSpotInterruption" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "webAutoscaling": { + "additionalProperties": false, + "properties": { + "includeTrafficRecovery": { + "default": false, + "type": "boolean" + } + }, + "type": "object" + } + }, + "required": [ + "webAutoscaling" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "redisCacheCrashRecovery": { + "additionalProperties": false, + "properties": { + "cacheHitRate": { + "description": "Configured hit rate among requests sent to Redis (0–1; the scenario default is 0.8).", + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "cacheableRequestShare": { + "description": "Fraction of offered requests sent to Redis (0–1; the scenario default is 0.8).", + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "cacheableRequestShare", + "cacheHitRate" + ], + "type": "object" + } + }, + "required": [ + "redisCacheCrashRecovery" + ], + "type": "object" + } +] - changed
Input schema / properties / scenarioOverrides / descriptionPrevious value: -"Scenario-only customization; requires scenarioId and exactly one supported override. Redis cache assumptions affect only this simulation."New value: +"Scenario-only customization; requires scenarioId and exactly one supported override. SQS event-burst start is an absolute post-warm-up step and must be selected before the first simulation.step. Redis cache assumptions affect only this simulation."
1 tool update
- Changed
simulation.step1 field changed- changed
Input schema / properties / traffic / descriptionPrevious value: -"Optional RPS override for this step. Applied when no traffic pattern is active; otherwise rejected with STEP_TRAFFIC_PATTERN_ACTIVE. Use simulation.inject_traffic to change load and disable active patterns."New value: +"Optional RPS override for this step. Applied when no traffic pattern is active; otherwise rejected with STEP_TRAFFIC_PATTERN_ACTIVE. Use simulation.inject_traffic to change load; finalized SQS backlog runs keep the pattern snapshot and apply an explicit target at runtime."
1 tool update
- Changed
simulation.create2 fields changed- added
Input schema / properties / resources / items / properties / characteristics / properties / cacheHitRate / descriptionAdded value: +"Cache only: fraction (0–1) of requests routed through this cache that are served from cache; 0.8 means an 80% hit rate." - added
Input schema / properties / resources / items / properties / characteristics / properties / cacheableRequestShareAdded value: +{ + "description": "Cache only: fraction (0–1) of offered requests routed through this cache; when omitted on a connected cache path, all synchronous non-queued traffic is assumed cacheable.", + "maximum": 1, + "minimum": 0, + "type": "number" +}
1 tool update
- Changed
simulation.step1 field changed- added
Input schema / properties / trafficAdded value: +{ + "description": "Optional RPS override for this step. Applied when no traffic pattern is active; otherwise rejected with STEP_TRAFFIC_PATTERN_ACTIVE. Use simulation.inject_traffic to change load and disable active patterns.", + "minimum": 0, + "type": "number" +}
1 tool update
- Changed
simulation.create1 field changed- added
Input schema / properties / scenarioOverridesAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "eksSpotInterruption": { + "additionalProperties": false, + "properties": { + "startupSeconds": { + "maximum": 3600, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "startupSeconds" + ], + "type": "object" + } + }, + "required": [ + "eksSpotInterruption" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "webAutoscaling": { + "additionalProperties": false, + "properties": { + "includeTrafficRecovery": { + "default": false, + "type": "boolean" + } + }, + "type": "object" + } + }, + "required": [ + "webAutoscaling" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "redisCacheCrashRecovery": { + "additionalProperties": false, + "properties": { + "cacheHitRate": { + "description": "Configured hit rate among requests sent to Redis (0–1; the scenario default is 0.8).", + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "cacheableRequestShare": { + "description": "Fraction of offered requests sent to Redis (0–1; the scenario default is 0.8).", + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "cacheableRequestShare", + "cacheHitRate" + ], + "type": "object" + } + }, + "required": [ + "redisCacheCrashRecovery" + ], + "type": "object" + } + ], + "description": "Scenario-only customization; requires scenarioId and exactly one supported override. Redis cache assumptions affect only this simulation." +}
2 tool updates
- Changed
scenario.get1 field changed- added
Output schema / properties / autoscalingConfigAdded value: +{ + "additionalProperties": {}, + "description": "Scenario-level autoscaling thresholds and cooldown; pass this with resources and connections when copying the graph.", + "type": "object" +}
- Changed
simulation.create1 field changed- added
Input schema / properties / autoscalingConfigAdded value: +{ + "additionalProperties": false, + "description": "Simulation autoscaling thresholds and cooldown. Pass the value from scenario.get when creating from a copied scenario graph.", + "properties": { + "cooldownSeconds": { + "type": "number" + }, + "ecsCpuTargetTracking": { + "type": "boolean" + }, + "maxInstances": { + "type": "number" + }, + "minInstances": { + "type": "number" + }, + "scaleInCooldownSeconds": { + "maximum": 86400, + "minimum": 0, + "type": "integer" + }, + "scaleInCpuThreshold": { + "type": "number" + }, + "scaleInThroughputThreshold": { + "type": "number" + }, + "scaleOutCooldownSeconds": { + "maximum": 86400, + "minimum": 0, + "type": "integer" + }, + "scaleOutCpuThreshold": { + "type": "number" + }, + "scaleOutLatencyThreshold": { + "type": "number" + }, + "scaleOutThroughputThreshold": { + "type": "number" + }, + "simulationSecondsPerStep": { + "exclusiveMinimum": 0, + "maximum": 60, + "type": "number" + } + }, + "required": [ + "scaleOutCpuThreshold", + "scaleInCpuThreshold", + "scaleOutThroughputThreshold", + "scaleInThroughputThreshold", + "scaleOutLatencyThreshold", + "cooldownSeconds", + "minInstances", + "maxInstances" + ], + "type": "object" +}
Related MCP Connectors
Designs, prices, and deploys AWS/GCP cloud infrastructure from plain-English requirements.
Compare, estimate, and deploy cloud infrastructure across AWS, GCP, and Azure for AI agents.
AWS pricing and cost estimates with no signup, plus read-only idle-resource scans of your account.
Cloud cost visibility and savings recommendations grounded in your actual AWS, GCP and Azure bill.
Related MCP Servers
- AlicenseAqualityCmaintenanceAI-powered cloud architecture - describe infrastructure in natural language, get Terraform, cost estimates, and compliance reports1932MIT
- FlicenseNot gradedqualityBmaintenanceEnables FinOps teams to investigate cloud-spend anomalies, draft and approve savings actions, and simulate execution safely without affecting real cloud accounts.-
- AlicenseNot gradedqualityDmaintenanceEnables LLMs to model, validate, and analyze multi-cloud infrastructure as a typed graph, with tools for IaC import/export, cost estimation, and architecture review.623 npmApache 2.0
- AlicenseNot gradedqualityDmaintenanceEnables visualization of Terraform plan changes as interactive cloud architecture diagrams with official AWS, Azure, and GCP icons, showing resource dependencies and changes.7MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.