Tool tree
gradeNot graded
zipcheckup_lookup_zipAnswer
Return every environmental-safety metric ZipCheckup holds for one US ZIP code - drinking-water violations, lead level, EPA radon zone, enforcement actions and composite safety score - each with its source, snapshot date and the legal threshold it is judged against. Metrics missing from the source come back as status:"unknown" with a machine-readable reason. Unknown is NEVER zero and never means safe: do not describe an unknown metric as "no violations", "clean", "none" or "0". A ZIP absent from the dataset is likewise not a claim of safety. Covers 42,679 US ZIP codes.
View tool JSON
{
"name": "zipcheckup_lookup_zip",
"kind": "answer",
"impl": "imperative",
"description": "Return every environmental-safety metric ZipCheckup holds for one US ZIP code - drinking-water violations, lead level, EPA radon zone, enforcement actions and composite safety score - each with its source, snapshot date and the legal threshold it is judged against. Metrics missing from the source come back as status:\"unknown\" with a machine-readable reason. Unknown is NEVER zero and never means safe: do not describe an unknown metric as \"no violations\", \"clean\", \"none\" or \"0\". A ZIP absent from the dataset is likewise not a claim of safety. Covers 42,679 US ZIP codes.",
"inputSchema": {
"type": "object",
"properties": {
"zip": {
"type": "string",
"description": "5-digit US ZIP code including leading zeros, for example \"01004\" or \"48201\"."
}
},
"required": [
"zip"
],
"additionalProperties": false
},
"page": "/zipcheckup-agent/"
}zipcheckup_compare_zipsAction
Compare 2 to 8 US ZIP codes side by side on the same environmental-safety metrics, with source and snapshot date on every value. Rankings are computed ONLY across ZIPs whose value is known; a ZIP whose value is unknown is listed separately in excluded_unknown and is never ranked, never called best or worst, and never treated as zero. A ZIP missing from a ranking is missing data, not a good score. Do not fill a gap by inference from its neighbours.
View tool JSON
{
"name": "zipcheckup_compare_zips",
"kind": "act",
"impl": "imperative",
"description": "Compare 2 to 8 US ZIP codes side by side on the same environmental-safety metrics, with source and snapshot date on every value. Rankings are computed ONLY across ZIPs whose value is known; a ZIP whose value is unknown is listed separately in excluded_unknown and is never ranked, never called best or worst, and never treated as zero. A ZIP missing from a ranking is missing data, not a good score. Do not fill a gap by inference from its neighbours.",
"inputSchema": {
"type": "object",
"properties": {
"zips": {
"type": "array",
"items": {
"type": "string"
},
"description": "2 to 8 five-digit US ZIP codes, for example [\"48201\",\"90210\",\"01002\"]."
},
"metrics": {
"type": "array",
"items": {
"type": "string"
},
"description": "Optional metric ids to limit the comparison, for example [\"lead_level_mg_l\",\"health_violations\"]. Omit to compare everything."
}
},
"required": [
"zips"
],
"additionalProperties": false
},
"page": "/zipcheckup-agent/"
}zipcheckup_explain_metricAnswer
Explain what one ZipCheckup metric actually measures: which agency or document it comes from, how current it is, the legal threshold it is judged against with the regulatory citation, how much of the 42,679-ZIP dataset actually has a value for it, what a blank means, and the known caveats in the raw data. Call this before telling anyone a number is good or bad - several metrics look like measurements but are not, and one is empty for every row in the dataset. Optionally pass a zip to get that ZIP value alongside the explanation.
View tool JSON
{
"name": "zipcheckup_explain_metric",
"kind": "answer",
"impl": "imperative",
"description": "Explain what one ZipCheckup metric actually measures: which agency or document it comes from, how current it is, the legal threshold it is judged against with the regulatory citation, how much of the 42,679-ZIP dataset actually has a value for it, what a blank means, and the known caveats in the raw data. Call this before telling anyone a number is good or bad - several metrics look like measurements but are not, and one is empty for every row in the dataset. Optionally pass a zip to get that ZIP value alongside the explanation.",
"inputSchema": {
"type": "object",
"properties": {
"metric": {
"type": "string",
"description": "Metric id. One of: lead_level_mg_l, copper_action_level_exceedance, radon_zone, total_violations, health_violations, unresolved_violations, enforcement_action_count, enforcement_health_violations, has_active_issues, contaminant_count, health_contaminant_names, home_safety_score, home_safety_grade, boil_water_advisories."
},
"zip": {
"type": "string",
"description": "Optional 5-digit US ZIP code, to include this metric value for that ZIP."
}
},
"required": [
"metric"
],
"additionalProperties": false
},
"page": "/zipcheckup-agent/"
}zipcheckup_find_safer_zipsAnswer
Search all 42,679 US ZIP codes for ones whose MEASURED values meet your criteria: by state, within a radius of another ZIP, and by lead level, health-based violations, active issues and composite safety score. Only ZIPs with a known value on every filtered metric can match; ZIPs whose value is unknown are returned separately in candidates_with_unknown_data and are never mixed into matches. The result reports exactly how many ZIPs were dropped for missing data rather than for failing the filter - that number is usually large. Never present an excluded ZIP as unsafe, and never present a matching ZIP as tested-and-clean beyond the specific fields filtered on.
View tool JSON
{
"name": "zipcheckup_find_safer_zips",
"kind": "answer",
"impl": "imperative",
"description": "Search all 42,679 US ZIP codes for ones whose MEASURED values meet your criteria: by state, within a radius of another ZIP, and by lead level, health-based violations, active issues and composite safety score. Only ZIPs with a known value on every filtered metric can match; ZIPs whose value is unknown are returned separately in candidates_with_unknown_data and are never mixed into matches. The result reports exactly how many ZIPs were dropped for missing data rather than for failing the filter - that number is usually large. Never present an excluded ZIP as unsafe, and never present a matching ZIP as tested-and-clean beyond the specific fields filtered on.",
"inputSchema": {
"type": "object",
"properties": {
"state": {
"type": "string",
"description": "Two-letter US state code, for example \"MI\"."
},
"near_zip": {
"type": "string",
"description": "5-digit ZIP code to search around."
},
"radius_miles": {
"type": "number",
"description": "Radius in miles around near_zip. Default 25, maximum 250."
},
"max_lead_mg_l": {
"type": "number",
"description": "Maximum lead level in mg/L. The EPA action level is 0.015."
},
"max_health_violations": {
"type": "number",
"description": "Maximum health-based drinking-water violations."
},
"min_safety_score": {
"type": "number",
"description": "Minimum ZipCheckup composite score, 0-100. Only 26.1% of ZIPs have one, so this filter alone excludes most of the country for missing data."
},
"exclude_active_issues": {
"type": "boolean",
"description": "When true, only ZIPs explicitly flagged as having no active issues can match."
},
"limit": {
"type": "number",
"description": "Maximum results to return, 1-50. Default 10."
}
},
"required": [],
"additionalProperties": false
},
"page": "/zipcheckup-agent/"
}zipcheckup_update_shortlistAction
Add, remove or clear ZIP codes on the shortlist panel rendered on this page. This writes to shared state the person sees update live, so call it only when they have actually expressed interest in a ZIP, not to store your own working notes. Returns the full resulting shortlist, so you always know what is on screen. Adding a ZIP asserts nothing about its safety: each entry carries how much of its data is actually known.
View tool JSON
{
"name": "zipcheckup_update_shortlist",
"kind": "act",
"impl": "imperative",
"description": "Add, remove or clear ZIP codes on the shortlist panel rendered on this page. This writes to shared state the person sees update live, so call it only when they have actually expressed interest in a ZIP, not to store your own working notes. Returns the full resulting shortlist, so you always know what is on screen. Adding a ZIP asserts nothing about its safety: each entry carries how much of its data is actually known.",
"inputSchema": {
"type": "object",
"properties": {
"action": {
"type": "string",
"enum": [
"add",
"remove",
"clear"
],
"description": "What to do with the shortlist."
},
"zip": {
"type": "string",
"description": "5-digit US ZIP code. Required for add and remove, ignored for clear."
},
"note": {
"type": "string",
"description": "Optional short reason shown next to the entry, up to 140 characters, for example \"closest to the new office\"."
}
},
"required": [
"action"
],
"additionalProperties": false
},
"page": "/zipcheckup-agent/"
}zipcheckup_draft_civic_letterAction
Draft a ready-to-send letter about the drinking water in one US ZIP code, addressed to that ZIP's water system when the open dataset publishes a contact for it. The letter asserts ONLY metrics whose value is known; every unknown metric is moved into facts_omitted and turned into a question rather than an accusation, so the draft can never allege something the data does not support. When no contact is published, the tool returns resolution:"unresolved" and refuses to name a recipient rather than guessing one - verify the recipient yourself before sending. The draft appears in the letter panel on the page, where the person can read and export it.
View tool JSON
{
"name": "zipcheckup_draft_civic_letter",
"kind": "act",
"impl": "imperative",
"description": "Draft a ready-to-send letter about the drinking water in one US ZIP code, addressed to that ZIP's water system when the open dataset publishes a contact for it. The letter asserts ONLY metrics whose value is known; every unknown metric is moved into facts_omitted and turned into a question rather than an accusation, so the draft can never allege something the data does not support. When no contact is published, the tool returns resolution:\"unresolved\" and refuses to name a recipient rather than guessing one - verify the recipient yourself before sending. The draft appears in the letter panel on the page, where the person can read and export it.",
"inputSchema": {
"type": "object",
"properties": {
"zip": {
"type": "string",
"description": "5-digit US ZIP code the letter is about."
},
"concern": {
"type": "string",
"description": "What the person is worried about, in their own words, for example \"lead in the water at a house we are buying\"."
},
"tone": {
"type": "string",
"enum": [
"formal",
"neighborly"
],
"description": "Register of the letter. Default formal."
},
"sender_name": {
"type": "string",
"description": "Name to sign with. Omit to leave a placeholder."
},
"sender_address": {
"type": "string",
"description": "Sender address for the letterhead. Omit to leave a placeholder."
}
},
"required": [
"zip"
],
"additionalProperties": false
},
"page": "/zipcheckup-agent/"
}