{"ok":true,"site":{"host":"spotigoo.netlify.app","url":"https://spotigoo.netlify.app/","type":"live","desc":"Spotigoa voice- and photo-first WebMCP app for reporting civic issues. It uses browser location when allowed, otherwise a labelled demo location, and enforces a human confirmation gate.","tools":[{"name":"report_civic_issue","kind":"act","impl":"imperative","description":"Prepare a civic issue report when a user wants to report a pothole, road damage, broken streetlight, blocked sidewalk, illegal dumping, flooding, fallen tree, traffic signal problem, graffiti, or another public issue. This creates only a draft in Spotigo; it never contacts a government authority and still requires human confirmation before submission.","inputSchema":{"type":"object","properties":{"issue_type":{"type":"string","enum":["pothole","streetlight","sidewalk","signal","graffiti","trash","tree","flooding","other"]},"description":{"type":"string"},"location":{"type":"string"},"lat":{"type":"number"},"lng":{"type":"number"},"photo_filename":{"type":"string"},"photo_size_bytes":{"type":"number"}},"required":["issue_type","description"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"describe_issue_accessibly","kind":"answer","impl":"imperative","description":"Create a structured civic issue report draft from a plain-language description. Attach optional photo file metadata when the person selected a photo. Does not submit anything — it only builds a draft for review.","inputSchema":{"type":"object","properties":{"category":{"type":"string","enum":["pothole","streetlight","sidewalk","signal","graffiti","trash","tree","flooding","other"],"description":"The type of issue. Pick the closest match from the enum."},"description":{"type":"string","description":"Plain-language description of the issue, in the user's own words where possible."},"location_text":{"type":"string","description":"Human-readable location, e.g. 'corner of 5th and Main' or 'in front of the library'."},"lat":{"type":"number","description":"Latitude, if known (e.g. from device GPS)."},"lng":{"type":"number","description":"Longitude, if known (e.g. from device GPS)."},"photo_filename":{"type":"string","description":"Name of an optional photo selected by the human."},"photo_size_bytes":{"type":"number","description":"Byte size of the optional photo selected by the human."}},"required":["category","description"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"acknowledge_safety_guidance","kind":"act","impl":"imperative","description":"Record that the human has heard the urgent safety guidance for a safety-critical draft. Only applies to drafts classified as critical. The human must still explicitly confirm submission afterward.","inputSchema":{"type":"object","properties":{"draft_id":{"type":"string"},"acknowledge":{"type":"boolean","description":"Must be explicitly true."}},"required":["draft_id","acknowledge"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"check_duplicate_reports","kind":"answer","impl":"imperative","description":"Check whether an issue near a given location and category has already been reported recently, to avoid filing a duplicate. Pass a draft_id to reuse its location/category, or pass lat/lng/category directly. Returns duplicate_assessment as one of three structured values an agent can reason about: \"NO_NEARBY_REPORTS\" (nothing found — safe to proceed), \"EXISTING_MATCHING_REPORT\" (a report within 25m already covers this, likely the same physical issue), or \"POSSIBLE_DUPLICATE\" (something nearby but not close enough to be certain). This tool never blocks filing on its own — it only informs the human/agent.","inputSchema":{"type":"object","properties":{"draft_id":{"type":"string","description":"A draft id from describe_issue_accessibly."},"lat":{"type":"number"},"lng":{"type":"number"},"category":{"type":"string","enum":["pothole","streetlight","sidewalk","signal","graffiti","trash","tree","flooding","other"]},"radius_meters":{"type":"number","description":"Search radius in meters. Defaults to 250."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"read_report_summary","kind":"answer","impl":"imperative","description":"Produce a plain-language, screen-reader-friendly readback of a draft report exactly as it will be submitted. ALWAYS call this and read it back to the user before calling confirm_submission — this is the accessible equivalent of 'reviewing your order before checkout'.","inputSchema":{"type":"object","properties":{"draft_id":{"type":"string"}},"required":["draft_id"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"confirm_submission","kind":"act","impl":"imperative","description":"Record the human's explicit confirmation that a draft report is accurate and ready to submit. This tool requires confirm=true and must be called only after the human has heard or read the summary from read_report_summary and agreed. submit_report will refuse to run without this.","inputSchema":{"type":"object","properties":{"draft_id":{"type":"string"},"confirm":{"type":"boolean","description":"Must be true. Represents the human's explicit yes."}},"required":["draft_id","confirm"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"submit_report","kind":"transact","impl":"imperative","description":"Submit a confirmed draft to the city. Will throw an error if the draft has not been confirmed via confirm_submission first — this is a hard gate, not a suggestion.","inputSchema":{"type":"object","properties":{"draft_id":{"type":"string"}},"required":["draft_id"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"undo_last_action","kind":"act","impl":"imperative","description":"Reverse the most recent mutating action taken in this session (e.g. retract a just-submitted report). Operates on a real action history, not a guess — it will say clearly what was undone, or that there is nothing to undo.","inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"list_nearby_reports","kind":"answer","impl":"imperative","description":"Browse all civic issue reports near a location, optionally filtered by category. Use this to help a user see what's already been reported in their area, independent of filing a new one.","inputSchema":{"type":"object","properties":{"lat":{"type":"number"},"lng":{"type":"number"},"radius_meters":{"type":"number"},"category":{"type":"string","enum":["pothole","streetlight","sidewalk","signal","graffiti","trash","tree","flooding","other"]}},"required":["lat","lng"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_report_status","kind":"answer","impl":"imperative","description":"Look up the current status of a previously filed report by its report id.","inputSchema":{"type":"object","properties":{"report_id":{"type":"string"}},"required":["report_id"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"}],"favicon":"/favicons/spotigoo.netlify.app.ico","apiSurface":"spec","category":"Productivity & Business","toolCount":10}}