{"ok":true,"site":{"host":"webmcp-unitwatch.mbrush-ltd.workers.dev","url":"https://webmcp-unitwatch.mbrush-ltd.workers.dev/","type":"live","desc":"Paste a systemctl status blob. Unitwatch parses it, proposes a Restart= drop-in, a TCP watchdog timer, and a rollback — on the page for humans, as WebMCP tools for agents.","tools":[{"name":"parse_systemd_status","kind":"answer","impl":"imperative","description":"Parse a pasted systemctl status or journalctl snippet. Extracts unit name, Active/Loaded state, result (exit-code, start-limit-hit, watchdog), PIDs, drop-ins, and issues. Use this first when the human pasted a blob. Does not contact any host.","title":"Parse systemd status","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"statusBlob":{"type":"string","description":"Raw output of systemctl status UNIT or a journalctl snippet. If omitted, uses the blob currently in the page workspace."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"propose_restart_dropin","kind":"act","impl":"imperative","description":"Generate a systemd drop-in that sets Restart=, RestartSec=, and StartLimitIntervalSec= for a unit. Default policy is Restart=always, RestartSec=5, StartLimitIntervalSec=0. Updates the files shown on the page. Does not install anything on a host.","title":"Propose restart drop-in","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"unit":{"type":"string","description":"Unit name, with or without .service. Defaults to the parsed workspace unit."},"restart":{"type":"string","enum":["no","on-success","on-failure","on-abnormal","on-watchdog","on-abort","always"],"description":"systemd Restart= policy. Default always."},"restartSec":{"type":"number","description":"RestartSec in seconds. Default 5."},"startLimitIntervalSec":{"type":"number","description":"StartLimitIntervalSec in seconds. Default 0 (disable start limit)."},"startLimitBurst":{"type":"number","description":"StartLimitBurst. Default 0 when interval is 0."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"propose_watchdog_timer","kind":"act","impl":"imperative","description":"Generate a systemd oneshot service plus timer that checks a TCP port (bash /dev/tcp) and restarts the target unit when the port is closed. Default host 127.0.0.1, port 8080, interval 30s. Updates the files shown on the page. Does not install anything on a host.","title":"Propose TCP watchdog timer","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"unit":{"type":"string","description":"Target unit to restart when the port is down."},"host":{"type":"string","description":"TCP host to check. Default 127.0.0.1."},"port":{"type":"number","description":"TCP port to check. Default 8080 or guessed from the status blob."},"intervalSec":{"type":"number","description":"Timer interval in seconds. Default 30. Minimum 5."}},"required":[]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"propose_rollback","kind":"act","impl":"imperative","description":"Generate a root shell script that deletes the Unitwatch restart drop-in and optionally disables/removes the TCP watchdog timer and service, then runs daemon-reload. Does not restart the unit. Updates the files shown on the page.","title":"Propose rollback","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"unit":{"type":"string","description":"Unit the drop-in belonged to."},"includeWatchdog":{"type":"boolean","description":"Also remove the TCP watchdog units. Default true."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"propose_hardening_plan","kind":"act","impl":"imperative","description":"One-shot: parse the status blob if provided, then generate the restart drop-in, TCP watchdog timer, and rollback script together and show them on the page. Prefer this when the human wants a complete proposal. Does not install anything on a host.","title":"Propose full hardening plan","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"statusBlob":{"type":"string","description":"Optional systemctl status / journal snippet to parse first."},"unit":{"type":"string","description":"Override unit name."},"restart":{"type":"string","description":"Restart= policy. Default always."},"host":{"type":"string","description":"Watchdog host. Default 127.0.0.1."},"port":{"type":"number","description":"Watchdog TCP port."},"intervalSec":{"type":"number","description":"Watchdog interval seconds."},"restartSec":{"type":"number","description":"RestartSec seconds. Default 5."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_workspace","kind":"answer","impl":"imperative","description":"Read the current Unitwatch page workspace: pasted blob, unit name, Restart= policy, watchdog host/port, parsed diagnosis, and the files currently shown to the human. Call this to see what the person already entered before generating files.","title":"Get page workspace","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"}],"category":"Developer Tools","favicon":"/favicons/webmcp-unitwatch.mbrush-ltd.workers.dev.svg","apiSurface":"spec","toolCount":6}}