{"ok":true,"site":{"host":"maav-mobility-webmcp.vercel.app","url":"https://maav-mobility-webmcp.vercel.app/lab","type":"live","desc":"A synthetic deterministic mobility resilience workbench with trusted evidence and visible human review.","tools":[{"name":"read_lab_state","kind":"answer","impl":"imperative","description":"Read compact authoritative Stress Lab state without mutation. Reading one current RUN by objectId focuses and starts its visible committed replay; this changes presentation only.","title":"Read MAAV Stress Lab state","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"scope":{"type":"string","description":"Optional bounded artifact view.","enum":["SUMMARY","SCENARIO","RUN","COMPARISON","FINDING"]},"objectId":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{0,63}$","description":"Optional artifact identifier."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/lab"},{"name":"configure_scenario","kind":"act","impl":"imperative","description":"Configure seed-07 Scenario A or B. For golden setup use mode REPLACE and exact labels: A \"Twelve compact pods\"; B \"Ten higher-capacity pods\"; never add suffixes. A is 12x8; B is 10x10. Shared: 70 kWh, 82% start, 20% reserve, 0.21 kWh/km, 30 s dwell; weights sandton 30, parkmore 15, illovo 20, rosebank 25, melrose-arch 10; wait 180 s, unserved 12, recovery 600 s, standing false; all five objectives. PATCH preserves an existing disruption. Never infer patch values from vague assent; ask first.","title":"Configure a Stress Lab scenario","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"oneOf":[{"type":"object","description":"Replace one scenario with a complete configuration.","properties":{"operationId":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{0,63}$","description":"Retry-safe command identifier."},"expectedRevision":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Current application revision."},"slot":{"type":"string","description":"Scenario slot to configure.","enum":["A","B"]},"mode":{"const":"REPLACE","description":"Provide every configuration field."},"configuration":{"type":"object","description":"Complete H0 configuration. A is 12 by 8; B is 10 by 10. Use the documented shared assumptions.","properties":{"label":{"type":"string","description":"For seed-07 use exactly Twelve compact pods for A or Ten higher-capacity pods for B; do not add slot suffixes.","examples":["Twelve compact pods","Ten higher-capacity pods"],"minLength":1,"maxLength":48},"fleet":{"type":"object","properties":{"vehicleCount":{"type":"integer","description":"H0 Scenario A uses 12; Scenario B uses 10.","examples":[12,10],"minimum":0,"maximum":30},"seatsPerVehicle":{"type":"integer","description":"H0 Scenario A uses 8; Scenario B uses 10.","examples":[8,10],"minimum":1,"maximum":20},"batteryCapacityKWh":{"type":"number","description":"H0 value is 70 kWh.","default":70,"exclusiveMinimum":0,"maximum":1000000},"startingBatteryPercent":{"type":"number","description":"H0 value is 82 percent.","default":82,"minimum":0,"maximum":100},"minimumReservePercent":{"type":"number","description":"H0 value is 20 and must equal the constraint reserve.","default":20,"minimum":0,"maximum":100},"energyKWhPerKm":{"type":"number","description":"H0 value is 0.21 kWh per kilometre.","default":0.21,"exclusiveMinimum":0,"maximum":100},"dwellSeconds":{"type":"integer","description":"H0 value is 30 seconds; must be a multiple of 30.","default":30,"minimum":0,"maximum":86400,"multipleOf":30},"initialZoneWeights":{"type":"object","description":"All five authored H0 zones are required; positive integer weights must total exactly 100.","properties":{"sandton":{"type":"integer","minimum":1,"maximum":1000000,"description":"H0 weight 30.","default":30},"parkmore":{"type":"integer","minimum":1,"maximum":1000000,"description":"H0 weight 15.","default":15},"illovo":{"type":"integer","minimum":1,"maximum":1000000,"description":"H0 weight 20.","default":20},"rosebank":{"type":"integer","minimum":1,"maximum":1000000,"description":"H0 weight 25.","default":25},"melrose-arch":{"type":"integer","minimum":1,"maximum":1000000,"description":"H0 weight 10.","default":10}},"required":["sandton","parkmore","illovo","rosebank","melrose-arch"],"additionalProperties":false}},"required":["vehicleCount","seatsPerVehicle","batteryCapacityKWh","startingBatteryPercent","minimumReservePercent","energyKWhPerKm","dwellSeconds","initialZoneWeights"],"additionalProperties":false},"constraints":{"type":"object","properties":{"maximumWaitSeconds":{"type":"integer","description":"H0 value is 180 seconds.","default":180,"minimum":0,"maximum":86400},"maximumUnservedPassengers":{"type":"integer","description":"H0 value is 12 passengers.","default":12,"minimum":0,"maximum":1000000},"minimumBatteryReservePercent":{"type":"number","description":"H0 value is 20 and must equal the fleet reserve.","default":20,"minimum":0,"maximum":100},"maximumRecoverySeconds":{"type":"integer","description":"H0 value is 600 seconds.","default":600,"minimum":0,"maximum":86400},"standingAllowed":{"const":false,"description":"Standing is always prohibited in H0."}},"required":["maximumWaitSeconds","maximumUnservedPassengers","minimumBatteryReservePercent","maximumRecoverySeconds","standingAllowed"],"additionalProperties":false},"objectives":{"type":"array","description":"H0 uses all five listed objectives for both scenarios.","default":["LOWER_WAIT","LOWER_ENERGY_PER_PASSENGER_KM","HIGHER_UTILIZATION","FASTER_RECOVERY","LOWER_EMPTY_KM"],"minItems":1,"maxItems":5,"uniqueItems":true,"items":{"type":"string","enum":["LOWER_WAIT","LOWER_ENERGY_PER_PASSENGER_KM","HIGHER_UTILIZATION","FASTER_RECOVERY","LOWER_EMPTY_KM"]}}},"required":["label","fleet","constraints","objectives"],"additionalProperties":false}},"required":["operationId","expectedRevision","slot","mode","configuration"],"additionalProperties":false},{"type":"object","description":"Patch at least one supported mutable field on a configured scenario.","properties":{"operationId":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{0,63}$","description":"Retry-safe command identifier."},"expectedRevision":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Current application revision."},"slot":{"type":"string","description":"Scenario slot to configure.","enum":["A","B"]},"mode":{"const":"PATCH","description":"Provide only fields that should change."},"configuration":{"type":"object","description":"Patch mutable fields only. A supplied zone-weight map must contain all five authored zones.","minProperties":1,"properties":{"label":{"type":"string","description":"New label text; omit unless the user explicitly requested it.","minLength":1,"maxLength":48},"fleet":{"type":"object","minProperties":1,"properties":{"vehicleCount":{"type":"integer","description":"H0 Scenario A uses 12; Scenario B uses 10.","examples":[12,10],"minimum":0,"maximum":30},"seatsPerVehicle":{"type":"integer","description":"H0 Scenario A uses 8; Scenario B uses 10.","examples":[8,10],"minimum":1,"maximum":20},"batteryCapacityKWh":{"type":"number","description":"H0 value is 70 kWh.","default":70,"exclusiveMinimum":0,"maximum":1000000},"startingBatteryPercent":{"type":"number","description":"H0 value is 82 percent.","default":82,"minimum":0,"maximum":100},"minimumReservePercent":{"type":"number","description":"H0 value is 20 and must equal the constraint reserve.","default":20,"minimum":0,"maximum":100},"energyKWhPerKm":{"type":"number","description":"H0 value is 0.21 kWh per kilometre.","default":0.21,"exclusiveMinimum":0,"maximum":100},"dwellSeconds":{"type":"integer","description":"H0 value is 30 seconds; must be a multiple of 30.","default":30,"minimum":0,"maximum":86400,"multipleOf":30},"initialZoneWeights":{"type":"object","description":"All five authored H0 zones are required; positive integer weights must total exactly 100.","properties":{"sandton":{"type":"integer","minimum":1,"maximum":1000000,"description":"H0 weight 30.","default":30},"parkmore":{"type":"integer","minimum":1,"maximum":1000000,"description":"H0 weight 15.","default":15},"illovo":{"type":"integer","minimum":1,"maximum":1000000,"description":"H0 weight 20.","default":20},"rosebank":{"type":"integer","minimum":1,"maximum":1000000,"description":"H0 weight 25.","default":25},"melrose-arch":{"type":"integer","minimum":1,"maximum":1000000,"description":"H0 weight 10.","default":10}},"required":["sandton","parkmore","illovo","rosebank","melrose-arch"],"additionalProperties":false}},"additionalProperties":false},"constraints":{"type":"object","minProperties":1,"properties":{"maximumWaitSeconds":{"type":"integer","description":"H0 value is 180 seconds.","default":180,"minimum":0,"maximum":86400},"maximumUnservedPassengers":{"type":"integer","description":"H0 value is 12 passengers.","default":12,"minimum":0,"maximum":1000000},"minimumBatteryReservePercent":{"type":"number","description":"H0 value is 20 and must equal the fleet reserve.","default":20,"minimum":0,"maximum":100},"maximumRecoverySeconds":{"type":"integer","description":"H0 value is 600 seconds.","default":600,"minimum":0,"maximum":86400},"standingAllowed":{"const":false,"description":"Standing is always prohibited in H0."}},"additionalProperties":false},"objectives":{"type":"array","description":"H0 uses all five listed objectives for both scenarios.","default":["LOWER_WAIT","LOWER_ENERGY_PER_PASSENGER_KM","HIGHER_UTILIZATION","FASTER_RECOVERY","LOWER_EMPTY_KM"],"minItems":1,"maxItems":5,"uniqueItems":true,"items":{"type":"string","enum":["LOWER_WAIT","LOWER_ENERGY_PER_PASSENGER_KM","HIGHER_UTILIZATION","FASTER_RECOVERY","LOWER_EMPTY_KM"]}}},"additionalProperties":false}},"required":["operationId","expectedRevision","slot","mode","configuration"],"additionalProperties":false}]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/lab"},{"name":"run_scenario","kind":"act","impl":"imperative","description":"Run one current scenario through the deterministic engine and publish only a verified result.","title":"Run a deterministic scenario","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"operationId":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{0,63}$","description":"Retry-safe command identifier."},"expectedRevision":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Current application revision."},"scenarioRevisionId":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{0,63}$","description":"Current scenario revision ID."}},"required":["operationId","expectedRevision","scenarioRevisionId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/lab"},{"name":"inject_disruption","kind":"act","impl":"imperative","description":"Mutate one explicit current scenario with the deterministic vehicle-failure rule. Copy the required constant type, target kind, and rule exactly; do not invent alternatives. atSecond is seconds after 08:30; use 720 for 08:42. If the user did not choose A or B, ask before calling. Both requires two sequential calls with distinct operation IDs and the latest revision.","title":"Inject an equivalent vehicle failure","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"operationId":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{0,63}$","description":"Retry-safe command identifier."},"expectedRevision":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Current application revision."},"scenarioRevisionId":{"type":"string","minLength":1,"maxLength":64,"pattern":"^scenario-[AB]-r[1-9][0-9]*$","description":"Current Scenario A or B revision ID."},"disruption":{"type":"object","properties":{"type":{"const":"VEHICLE_FAILURE"},"target":{"type":"object","properties":{"kind":{"const":"DETERMINISTIC_RULE"},"rule":{"const":"HIGHEST_OCCUPANCY_THEN_VEHICLE_ID"}},"required":["kind","rule"],"additionalProperties":false},"atSecond":{"type":"integer","description":"Seconds after 08:30; use 720 for 08:42. Must be a 30-second increment.","default":720,"minimum":0,"maximum":1799,"multipleOf":30}},"required":["type","target","atSecond"],"additionalProperties":false}},"required":["operationId","expectedRevision","scenarioRevisionId","disruption"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/lab"},{"name":"compare_scenarios","kind":"act","impl":"imperative","description":"Create one trusted neutral comparison from explicit current Scenario A and B run artifacts.","title":"Compare verified scenarios","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"operationId":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{0,63}$","description":"Retry-safe command identifier."},"expectedRevision":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Current application revision."},"runAId":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{0,63}$","description":"Current Scenario A run ID."},"runBId":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{0,63}$","description":"Current Scenario B run ID."}},"required":["operationId","expectedRevision","runAId","runBId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/lab"},{"name":"stage_finding","kind":"act","impl":"imperative","description":"Stage deterministic evidence from the current comparison for visible human review; never approve it. Use only an outcome and emphasis explicitly requested by the user; vague assent is not authority to choose either.","title":"Stage a bounded finding","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"operationId":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{0,63}$","description":"Retry-safe command identifier."},"expectedRevision":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Current application revision."},"comparisonId":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{0,63}$","description":"Current trusted comparison ID."},"selectedOutcome":{"type":"string","description":"Finding outcome explicitly requested by the user; never infer it from vague assent.","enum":["A","B","TRADE_OFF","INCONCLUSIVE"]},"emphasis":{"type":"string","description":"Finding emphasis explicitly requested by the user.","enum":["BALANCED","SERVICE","ENERGY","RESILIENCE"]}},"required":["operationId","expectedRevision","comparisonId","selectedOutcome","emphasis"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/lab"}],"favicon":"/favicons/maav-mobility-webmcp.vercel.app.png","apiSurface":"spec","category":"Developer Tools","toolCount":6}}