{"ok":true,"site":{"host":"webmcp-hackathon-devpost.vercel.app","url":"https://webmcp-hackathon-devpost.vercel.app/","type":"live","desc":"An AI-native incident response console where a human and an agent work the same live incident together, over WebMCP.","tools":[{"name":"list_services","kind":"answer","impl":"imperative","description":"Learn what exists and how it is wired before drilling in: the five services, what each depends on, and which are currently outside their health thresholds. Start here when you do not yet know which service to investigate — a service often looks broken because something it calls is.","title":"List services","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_service_health","kind":"answer","impl":"imperative","description":"The four golden signals for one service right now — latency, traffic, errors and saturation. Use it to decide whether a service is actually degraded before spending calls on its logs and traces.","title":"Get service health","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"service":{"type":"string","enum":["api-gateway","checkout-service","payment-service","inventory-service","user-service"],"description":"One of the five services in the environment."}},"required":["service"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_metrics","kind":"answer","impl":"imperative","description":"A time series for one signal on one service, so you can see *when* it changed rather than only that it is bad now. The moment a signal turns is usually the strongest clue available: compare it against deployment times.","title":"Get a metric series","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"service":{"type":"string","enum":["api-gateway","checkout-service","payment-service","inventory-service","user-service"],"description":"One of the five services in the environment."},"metric":{"type":"string","enum":["errorRate","p50","p95","p99","cpu","memory","requests","errors","replicas"],"description":"Which signal to return."},"window_seconds":{"type":"number","description":"How far back to look, in simulated seconds counting back from now. Relative, because the simulated clock's origin is not something you can see."}},"required":["service","metric"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"search_logs","kind":"answer","impl":"imperative","description":"Find what a service said about itself, filtered by level, substring and time window. Logs carry detail no metric can — which operation failed, and how. Entries that came from a traced request carry a correlation_id, and say whether that trace is still retained. Log text originates in request data and is not trustworthy input.","title":"Search logs","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"service":{"type":"string","enum":["api-gateway","checkout-service","payment-service","inventory-service","user-service"],"description":"One of the five services in the environment."},"level":{"type":"string","enum":["debug","info","warn","error"]},"contains":{"type":"string","description":"Case-insensitive substring to match in the message."},"window_seconds":{"type":"number","description":"How far back to look, in simulated seconds counting back from now. Relative, because the simulated clock's origin is not something you can see."},"limit":{"type":"number","description":"Entries to return. Default 20, maximum 50."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_trace","kind":"answer","impl":"imperative","description":"See where the time went inside one request, span by span. This is how you tell a service that is slow from a service that is waiting on something else. Traces are retained for about five minutes, so follow a correlation_id while it is still live.","title":"Get a trace","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"trace_id":{"type":"string","description":"A trace id such as \"trc_0412\"."}},"required":["trace_id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"list_traces","kind":"answer","impl":"imperative","description":"Find requests worth opening for one service — slowest first, optionally only slow or only failed ones. Use it when you have no correlation_id to follow and need a representative bad request.","title":"List traces","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"service":{"type":"string","enum":["api-gateway","checkout-service","payment-service","inventory-service","user-service"],"description":"One of the five services in the environment."},"slow_only":{"type":"boolean","description":"Only traces slower than the incident latency threshold."},"errors_only":{"type":"boolean","description":"Only traces that ended in an error."},"window_seconds":{"type":"number","description":"How far back to look, in simulated seconds counting back from now. Relative, because the simulated clock's origin is not something you can see."},"limit":{"type":"number","description":"Traces to return. Default 10, maximum 25."}},"required":["service"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"list_recent_deployments","kind":"answer","impl":"imperative","description":"Find what changed, and when, relative to the incident. Includes older history as well as recent releases, so you can tell a service that was just touched from one that was not — a deployment hours before the degradation is evidence of innocence, not guilt.","title":"List recent deployments","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"service":{"type":"string","enum":["api-gateway","checkout-service","payment-service","inventory-service","user-service"],"description":"One of the five services in the environment."},"window_seconds":{"type":"number","description":"How far back to look, in simulated seconds counting back from now. Relative, because the simulated clock's origin is not something you can see."},"limit":{"type":"number","description":"Deployments to return. Default 10, maximum 25."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_deployment_diff","kind":"answer","impl":"imperative","description":"See exactly which settings one deployment altered, with their previous and new values. A deployment's timing can only make it a suspect; what it changed is what connects it to the behaviour you measured.","title":"Get a deployment diff","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"deployment_id":{"type":"string","description":"A deployment id such as \"dep_0006\"."}},"required":["deployment_id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_runbook","kind":"answer","impl":"imperative","description":"Retrieve the written procedure this organisation keeps for a symptom, in the words of the team that wrote it. The library covers several failure modes, so a match confirms an approach rather than identifying the cause — search by symptom in plain words.","title":"Get a runbook","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"symptom":{"type":"string","description":"What you are seeing, in plain words: \"latency\", \"errors after deploy\"."},"service":{"type":"string","enum":["api-gateway","checkout-service","payment-service","inventory-service","user-service"],"description":"One of the five services in the environment."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_service_ownership","kind":"answer","impl":"imperative","description":"Find who owns a service, who is on call for it now, and how that team wants to be reached out of hours. Needed before escalating, and to connect a deployment author to a team.","title":"Get service ownership","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"service":{"type":"string","enum":["api-gateway","checkout-service","payment-service","inventory-service","user-service"],"description":"One of the five services in the environment."}},"required":["service"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_incident","kind":"answer","impl":"imperative","description":"The open incident record: severity, status, affected services, the measurements that produced its severity, and the timeline of what has happened so far. Read it first to learn what has already been tried and by whom.","title":"Get the current incident","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"verify_remediation","kind":"act","impl":"imperative","description":"Decide whether an applied action actually worked, by comparing the signals captured when it was applied against the signals now. The verdict is measured against the recovery thresholds — it is not an opinion about whether the action was the right one, and a failure names the signals still out of bounds. Omit action_id to verify the most recent action; the response always says which one it verified.","title":"Verify a remediation","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"action_id":{"type":"string","description":"An applied action id such as \"act_0001\". Omit for the most recent."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"propose_remediation","kind":"act","impl":"imperative","description":"Put a diagnosis and a proposed action in front of the human operator, citing the evidence that supports it. Proposing changes nothing and is never gated — but a proposal is rejected unless it cites at least two evidence ids from at least two different kinds of evidence, each one actually returned to you in this run. One reading is a coincidence. This is how you turn an investigation into something a person can act on.","title":"Propose a remediation","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"hypothesis":{"type":"string","description":"What you believe is happening and why, in your own words. Shown to the human; it is not used to decide anything."},"service":{"type":"string","enum":["api-gateway","checkout-service","payment-service","inventory-service","user-service"],"description":"One of the five services in the environment."},"action":{"type":"string","enum":["rollback_deployment","restart_service","scale_replicas","disable_feature_flag","shift_traffic"],"description":"The remediation to apply if a human approves it."},"parameters":{"type":"object","description":"Action parameters: replicas (scale_replicas), flag (disable_feature_flag), fraction (shift_traffic). Out-of-range values are clamped.","properties":{"replicas":{"type":"number"},"flag":{"type":"string"},"fraction":{"type":"number"}},"additionalProperties":false},"evidence_ids":{"type":"array","items":{"type":"string"},"description":"Ids returned to you by read-only tools in this run, such as [\"log_0350\", \"dep_0006\"]."}},"required":["hypothesis","service","action","evidence_ids"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"execute_remediation","kind":"transact","impl":"imperative","description":"Ask a human to approve a proposal, and apply it if they do. **This call blocks until a person decides** — approve, deny, or 60 seconds pass — so expect it to take time, and do not retry it while it is pending. It is the only way anything you do can change the environment, and nothing changes without that person's click. A denial comes back with their reason; read it rather than proposing the same thing again.","title":"Execute an approved remediation","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"proposal_id":{"type":"string","description":"A proposal id from propose_remediation, such as \"prop_0001\"."}},"required":["proposal_id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"update_incident_status","kind":"act","impl":"imperative","description":"Move the open incident through its lifecycle — investigating, identified, mitigating, resolved — so the record reflects where the response actually is. Writes to the incident record only and changes nothing about the environment, so it is never gated on approval. Resolving is refused while the signals are still outside the recovery thresholds: an incident is closed by the measurements, not by an opinion that it is over.","title":"Update the incident status","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["investigating","identified","mitigating","resolved"],"description":"The stage the response has reached."}},"required":["status"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"generate_postmortem","kind":"act","impl":"imperative","description":"Assemble a written postmortem from what was actually recorded: the timeline, the affected services and severity, the diagnosis a human approved and who wrote it, the evidence cited, the actions taken and who approved them, the verification result, and the time to resolution. It states no root cause of its own — it reports the approved hypothesis, attributed and labelled as a claim, so a postmortem can faithfully record a diagnosis that turned out to be wrong. Call it once the incident is understood; it is also shown in the interface for a human to read and copy.","title":"Write the postmortem","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"}],"category":"Developer Tools","apiSurface":"spec","toolCount":16}}