Nearby Permits
Server Details
Building permits by address for a growing list of US cities and counties, from city open data.
- Status
- Healthy
- Uptime
- 100.0% over 22 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 6 tools
get_permit (by number), list_cities, and zoning_requests_near are clearly distinct. The three permit-discovery tools (permits_at_address, permits_near, recent_permits) overlap in that all return permits, but their descriptions sharply differentiate exact-address vs radius vs city/ZIP scope, so misselection risk is low.
All names are consistent snake_case and readable, but the convention mixes verb_noun (get_permit, list_cities) with noun-locator patterns (permits_at_address, permits_near, recent_permits). The geographic tools share a coherent suffix style, making it mostly predictable.
Six tools is well-scoped for a permit/zoning lookup service. Each tool earns its place: a detail lookup, a catalog, three geographic discovery modes, and a zoning-case finder.
The surface covers lookup by permit number, by address, by proximity, recent activity by ZIP, supported-city discovery, and zoning cases a solid lifecycle of read operations. Minor gaps like contractor/type filtering or permit-history-by-status exist but are workable, and there are no obvious dead ends for the core use cases.
Available Tools
6 toolsget_permitLook up a permit numberARead-onlyIdempotentInspect
Look up one building permit by its city permit number: work, date, status, cost and address.
| Name | Required | Description | Default |
|---|---|---|---|
| city | Yes | ||
| permit_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so safety and repeatability are covered. The description adds the useful detail that a single record is returned and names the fields, but says nothing about missing-permit behavior, rate limits, or error handling beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler: it leads with the lookup action and key, then the returned fields. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read tool with safety annotations already in place, the description covers purpose, keying, and return fields, which compensates for the absent output schema. The remaining gaps are the parameter formats and not-found behavior, which are minor for this tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the full parameter burden. It does convey that permit_id is a city permit number and that the two parameters form a scoped key, but neither parameter's format (e.g., expected permit-number pattern) nor the city's accepted value form is explained, leaving meaningful ambiguity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (look up), a specific resource (one building permit), and the key (city permit number), and enumerates the returned fields (work, date, status, cost, address). The word 'one' plus the permit-number key clearly separates it from the list-oriented siblings permits_at_address and recent_permits.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: looking up 'by its city permit number' signals it is for the case where the agent already has a permit number, which implicitly rules out permits_at_address. However there is no explicit when-to-use statement, no mention of the sibling tools, and no guidance on what to do when the number is unknown.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_citiesList supported citiesARead-onlyIdempotentInspect
List the US cities and counties with building permit data, with each one's slug for the other tools.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is fully covered structurally. The description adds genuinely useful context about the return contents (cities/counties plus slugs for other tools), but says nothing about whether the list is exhaustive, stable, or how large it is.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with no filler, and it front-loads the resource and scope before the payoff (slugs for other tools). Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only enumeration tool with no output schema, the description covers what it does and roughly what comes back. The one remaining gap is that it does not characterize the return set's size or stability, which is minor here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no parameter semantics to explain and the baseline of 4 applies. The description correctly does not invent or restate any parameter information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (US cities and counties with building permit data) plus the payload shape (each one's slug). It is immediately distinguishable from the sibling retrieval tools (get_permit, permits_near, recent_permits) as the discovery/lookup tool rather than a data-fetch tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'for the other tools' implies this is a prerequisite lookup step to obtain slugs before calling siblings, which is useful implied guidance. However, it never explicitly says when to call this versus going straight to a sibling, nor any exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
permits_at_addressPermits at an addressARead-onlyIdempotentInspect
Use this tool when someone asks which building, remodeling or demolition permits exist at an address, whether a house had permitted work, or what is permitted next door. It returns every building permit on record at that street address in a supported city or county (Los Angeles, New York City, Chicago, San Francisco, Seattle, Austin, Cincinnati, Mesa, New Orleans, Fort Worth, Columbus, San Diego, Detroit, Nashville, Raleigh, Phoenix, San Antonio, Minneapolis, Montgomery County, Boston, Pittsburgh, Washington, Denver, Los Angeles County, Wake County, Miami, Miami-Dade County, Hillsborough County, Cape Coral, Port St. Lucie, Alachua County, Kansas City, Baltimore, Sacramento County, Memphis, Las Vegas, Tacoma, Boulder, Cambridge, Somerville, Marin County, Pierce County, Cary, Cleveland, Arlington, Naperville, Tempe, Anaheim, Riverside): type of work, description, date, status and reported cost, from city and county open data checked around the clock. The address can be typed loosely (a missing N or S, "Drive" for "Dr", a trailing city, state or ZIP, a unit): it is matched to the spelling the city files. When more than one address matches (N and S Holly Dr), the answer lists them in did_you_mean; ask which one is meant and call again with it.
| Name | Required | Description | Default |
|---|---|---|---|
| city | Yes | City slug, e.g. los-angeles, new-york, chicago | |
| address | Yes | Street address with house number, e.g. '867 N Iliff St'. New York: include the borough, e.g. '180 West Street, Brooklyn'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld, so the bar is low, and the description clears it comfortably: it enumerates the returned fields (type of work, description, date, status, reported cost), discloses the geographic coverage limit, explains the fuzzy address-matching behaviour, and documents the did_you_mean ambiguity path. That is real behavioural context not present in the annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the use case and return behaviour, which is good, but roughly half the text is a 50-entry wall of city names that bloats the definition and duplicates what the sibling list_cities presumably provides. The matching/disambiguation sentences earn their place; the coverage enumeration is disproportionate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must carry the return contract, and it does — listing the fields returned plus the did_you_mean ambiguity structure. Coverage limits and input flexibility are also covered, leaving only minor gaps around result volume or paging.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds genuine meaning: the address may be typed loosely (missing N/S, 'Drive' for 'Dr', trailing city/state/ZIP, unit) and is normalized to the city's filing spelling, and it clarifies what a supported city means for the city parameter. This goes beyond the schema's terse examples.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — returns every building permit on record at a given street address — and the address-based scope implicitly separates it from the time-based sibling recent_permits and the proximity-based permits_near. An agent can tell what it retrieves and by what key without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Opens with concrete trigger questions (which permits exist at an address, whether a house had permitted work) and gives an explicit follow-up protocol when multiple addresses match — ask which one, then re-call with the disambiguated address. It never names the sibling tools or states when a different tool (permits_near) is the better choice, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
permits_nearPermits near an address or a pointARead-onlyIdempotentInspect
Use this tool when someone asks what is being built near an address or a place: new buildings next door, construction on the block, what's permitted around a home they might buy or rent. Give a city and street address, or a latitude and longitude. The tool returns building permits within a radius (default 400 meters, about a quarter mile) issued since a date (default about six months back), newest first, each with distance in meters and compass direction from the point. It covers the last 24 months of city open data. counts.total is exact even when the list is capped. It matches a loosely typed address the same way permits_at_address does. If more than one address matches, the answer has found set to false and lists the addresses in did_you_mean.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | Latitude, used instead of city and address. | |
| lon | No | Longitude, used instead of city and address. | |
| city | No | City slug, e.g. chicago. Needed with address; optional with lat and lon. | |
| limit | No | Most permits to list, default 50. | |
| since | No | Earliest date, YYYY-MM-DD, or 6m, 1y, 2y. Default 6m (the first of the month five months back). | |
| address | No | Street address with house number, e.g. '2443 W Warren Blvd'. | |
| radius_m | No | Radius in meters, default 400. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the already-strong annotations (readOnly, idempotent, non-destructive), the description discloses defaults for radius and date, sort order, per-permit distance and compass direction, 24-month coverage limit, that counts.total is exact even when the list is capped, and the ambiguity branch (found=false with did_you_mean). This is rich behavioral context that structured fields do not carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the triggering scenario before mechanics, and each sentence carries information. Slight redundancy from restating defaults already present in the schema, but overall dense and well-ordered.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates fully: it describes the returned items (distance in meters, compass direction, newest first), the exactness of counts.total, and the found/did_you_mean ambiguity response. An agent has everything needed to call and interpret this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description restates defaults (radius 400m, six months back) and the since format, but adds no format or syntax detail beyond what the schema already documents for each parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('the tool returns building permits within a radius') scoped to proximity queries, and explicitly differentiates itself from sibling permits_at_address ('It matches a loosely typed address the same way permits_at_address does'). An agent can distinguish it from the other siblings without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Opens with an explicit use scenario ('when someone asks what is being built near an address or a place: new buildings next door...'). It names sibling permits_at_address as a behavioral reference but does not state when to prefer it over permits_at_address or the other siblings like recent_permits or zoning_requests_near, so routing is clear but not complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recent_permitsNewest permits in an areaARead-onlyIdempotentInspect
Use when someone asks what is being built in their neighborhood or ZIP code. Returns the newest building permits in a supported city or county, optionally within one ZIP code.
| Name | Required | Description | Default |
|---|---|---|---|
| zip | No | 5-digit ZIP code | |
| city | Yes | ||
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds useful behavior beyond that — results are ordered newest-first, and scope is limited to "supported" cities/counties — but omits pagination/limit behavior and what happens for unsupported locations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences that are well front-loaded: usage trigger first, return semantics second. Nothing is wasted, though "supported city or county" is slightly vague phrasing that could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description is right to say what it returns, but it doesn't specify the returned fields, the limit default, or behavior for unsupported areas. For a simple 3-parameter lookup this is adequate but leaves gaps an agent may hit at call time.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 33% (only zip is documented), so the description has to compensate. It clarifies that zip is an optional narrowing filter and that city/county is the primary scope, which helps, but limit (max 50, default unknown) is undocumented in both the schema and the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ("Returns the newest building permits") plus scope (city/county, optional ZIP). It distinguishes itself implicitly from address- and radius-based siblings via the neighborhood/ZIP framing, but never names an alternative like permits_near, so differentiation is left partly to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use when someone asks what is being built in their neighborhood or ZIP code" is a clear, concrete usage trigger. It offers no explicit exclusions or sibling comparisons (e.g., when to prefer permits_near or permits_at_address instead), so it stops short of the top tier.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zoning_requests_nearZoning requests near an address or a pointARead-onlyIdempotentInspect
Use when someone asks about variances, conditional uses, rezonings or zoning appeals near an address: what a neighbor asked the city for, or whether a hearing is coming up. Covers Boston, Washington DC, San Francisco and Seattle. Give a city and street address, or a latitude and longitude. Each case has the city's own status words, our plain status label (Filed, In review, Hearing scheduled, Approved, Approved with conditions, Denied, Withdrawn or Other), the hearing date when the city publishes one, and a link to the city's case record. We never infer an outcome the city's record doesn't state. Owner and applicant names are left out.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | Latitude, used instead of city and address. | |
| lon | No | Longitude, used instead of city and address. | |
| city | No | boston, washington-dc, san-francisco or seattle. Needed with address. | |
| limit | No | Most cases to list, default 50. | |
| since | No | Earliest filing, hearing or decision date, YYYY-MM-DD, or 6m, 1y, 2y. Default 1y. | |
| address | No | Street address with house number, e.g. '78 Pearl St'. | |
| radius_m | No | Radius in meters, default 400. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld, and the description goes well beyond them: it names the four supported cities, lists the status vocabulary returned, states that owner and applicant names are deliberately omitted, and commits to never inferring an outcome the city record does not state. That is substantive behavioral and data-quality disclosure an agent cannot get from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with the use case, then coverage, then inputs, then return shape and exclusions. Every sentence carries information, though the closing two sentences could be tightened slightly without loss.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so: status labels, hearing date, and the link to the city case record are all named, plus what is intentionally excluded. Combined with the annotation safety profile, an agent has everything needed to call and interpret the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so per-parameter meaning is already documented; the description still adds the non-obvious constraint that inputs are either city+address or lat/lon ('Give a city and street address, or a latitude and longitude'), which the flat optional schema does not express. It does not touch limit, since or radius_m, so it is additive rather than exhaustive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('zoning requests near an address or a point') and enumerates the case types it covers (variances, conditional uses, rezonings, zoning appeals), which cleanly separates it from the permit-oriented siblings. An agent can route between this and permits_near without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Opens with an explicit triggering condition ('Use when someone asks about variances, conditional uses, rezonings or zoning appeals near an address') and adds the follow-up intent of checking upcoming hearings. It stops short of naming the sibling tools (permits_near, recent_permits) or stating when not to use this, so it is clear context rather than full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
- Added
zoning_requests_near
1 tool update
- Added
permits_near
1 tool update
- Changed
recent_permits2 fields changed- removed
Input schema / properties / areaRemoved value: -{ - "description": "ZIP code (most cities) or district number", - "type": "string" -} - added
Input schema / properties / zipAdded value: +{ + "description": "5-digit ZIP code", + "type": "string" +}
4 tool updates
- First observed
get_permit - First observed
list_cities - First observed
permits_at_address - First observed
recent_permits
Related MCP Connectors
Source-linked building-permit search across 34 US states and DC, with county-level coverage.
US parcels and building permits from public sources. No owner data. Pay per record or monthly plan.
Pull recent building permits from 9 US cities in a unified schema from official open-data portals.
Public building permits, property assessments, parcels and development intelligence.
Related MCP Servers
- AlicenseAqualityDmaintenanceFrench building permits MCP server: 1.2M Sitadel permits (2014-2026, daily refresh), DVF transactions, cadastre DGFiP, PLU zoning, BRGM risks, and property-dealer opportunity scoring through 11 MCP tools. Free tier 500 req/month, no credit card.11153 PyPI3MIT
- AlicenseNot gradedqualityBmaintenanceOpen & historical US government bid solicitations from city/county portals — updated daily.23 npm1MIT
- AlicenseNot gradedqualityBmaintenanceEnables US address resolution and location-scoped search of building permits and construction contractors via the Shovels.ai API.20 npmMIT
- AlicenseAqualityDmaintenanceRegulatory intelligence API — look up permits, licenses, and fees for food service businesses in Austin, SF, and NYC.317 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.