Estate Atlas SD-MCP
OfficialClick on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Estate Atlas SD-MCPWhat are the fence height rules for an RS-1-7 lot?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Estate Atlas: SD-MCP
The first and only Model Context Protocol server for the San Diego Municipal Code — built so any AI agent (Claude, Cursor, custom) can query SD's regulatory data with citations, freshness guarantees, and machine-readable structure that no government source publishes.
Status: v0.1 — pilot. Read-only. STDIO transport. Maintained by Estate Atlas. Powered by the same fresh data pipelines used by our property-intelligence product. Embeddings: Voyage AI
voyage-4-large— Anthropic's embedding partner.
What you can ask it
> "What are the fence height rules for an RS-1-7 lot?"
> "Show me all the active permits on APN 535-095-05-00."
> "What's the rear setback for RM-1-1?"
> "Find bulletins about ADUs."
> "When was the municipal code last updated?"Related MCP server: Dilix MCP
Tools
Tool | Purpose |
| Semantic search across SDMC, bulletins, ordinances |
| Fetch a specific section by number (e.g. |
| Browse the code structure |
| Discover DSD information bulletins |
| Fetch a specific IB by number |
| Address or APN → zoning, overlays, lot, assessor |
| Permit history for a parcel |
| Code-enforcement cases for a parcel |
| Setbacks, FAR, height limits by zone code |
| Higher-level zone summary |
| Per-source last-update + SLA cadence |
| (Stub — v2) Court rulings affecting SD land use |
Every response includes a _meta envelope with source, data_as_of, freshness_sla, citations (with PDF page anchors where available), and license. This is the differentiator — no government source publishes machine-readable freshness or citations.
Install
Claude Desktop
Edit your Claude Desktop config at ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"sandiego-municipal-code": {
"command": "uvx",
"args": ["sandiego-municipal-code-mcp"],
"env": {
"SANDIEGO_MCP_DATABASE_URL": "postgresql://readonly@db.estateatlas.ai/sandiego_public",
"SANDIEGO_MCP_VOYAGE_API_KEY": "pa-..."
}
}
}
}Restart Claude Desktop. You should see "sandiego-municipal-code" in the MCP indicator.
Claude Code
In ~/.claude/settings.json or a project .mcp.json:
{
"mcpServers": {
"sandiego-municipal-code": {
"command": "uvx",
"args": ["sandiego-municipal-code-mcp"],
"env": {
"SANDIEGO_MCP_DATABASE_URL": "postgresql://...",
"SANDIEGO_MCP_VOYAGE_API_KEY": "pa-..."
}
}
}
}Cursor / Continue / Other MCP-aware tools
Use the same JSON above; check your editor's MCP docs for the config path.
From source (development)
git clone https://github.com/estate-atlas/sandiego-mcp
cd sandiego-mcp
uv venv --python 3.11
uv pip install -e ".[dev]"
.venv/bin/sandiego-municipal-code-mcp # runs server over STDIOEnvironment variables
Var | Required | Default | Purpose |
| yes | — | Postgres connection string (read-only role). Falls back to |
| yes | — | Voyage AI key for query embeddings ( |
| no |
| Override the embedding model (must match the model the DB was re-indexed with). |
| no |
| Override the embedding dimension. |
| no |
|
|
Public read-only database (coming soon)
The hosted endpoint db.estateatlas.ai/sandiego_public will provide free, rate-limited access to all the data this MCP server exposes. Until that ships, you can:
Run your own Supabase replica with the schemas under
david/backend/db/Email
hello@estateatlas.aifor a private beta credential
Data sources + refresh cadence
Source | Records | Refresh |
San Diego Municipal Code | 1,966 docs / 27k chunks | Monthly |
Information Bulletins | 456 docs | Monthly |
Building Permits | 240k | Weekly (Accela API) |
Code Enforcement | 17.4k | Weekly |
Parcels | 1.09M | Quarterly |
Zoning Parcels | varies | Quarterly |
Zone Setbacks | 21 zones | On ordinance change |
Refresh is automated via GitHub Actions in the upstream Estate Atlas data repo. The MCP server source code lives at estate-atlas/sandiego-mcp.
Roadmap
v0.1 (now) — STDIO transport, 11 tools, read-only, BYO DB credentials
v0.2 — Public read-only hosted endpoint (free tier + rate limit)
v0.3 — Court rulings ingestion (CourtListener integration)
v1.0 — Hosted HTTP/SSE transport, bearer-token auth, billing tiers
v1.x — San Diego County → other CA cities → other states
License
MIT. Municipal data is public-domain (City of San Diego). The MCP envelope, citations layer, and freshness SLA are © Estate Atlas.
Citing
If your agent's output is consumed for any regulatory or legal decision, the _meta.citations[] field gives you the verifiable source. We recommend always surfacing source_pdf_url to the human consumer.
Available Tools
14 toolsdata_freshnessA
Per-source data freshness: last-update timestamp, record count, and SLA cadence for every data source the MCP exposes. Call this when you need to assess whether the answer to a regulatory question is up-to-date.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It describes the output fields and implies a read-only operation. While it doesn't discuss auth or rate limits, the tool is simple and non-destructive, so the disclosure is adequate.
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 concise sentences: one defines the product, the other advises usage. No wasted words, front-loaded with key information.
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 an output schema present, the description doesn't need to detail return values. It mentions key fields and provides a usage scenario. Given zero parameters, this is fully complete.
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?
There are no parameters; schema coverage is 100%. The description adds no parameter-specific info but none is needed. Baseline 4 is appropriate as the schema is already complete.
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 clearly states it provides per-source data freshness with specific attributes (last-update timestamp, record count, SLA cadence), and the name aligns well. It distinguishes itself from sibling data-retrieval tools by being a metadata tool about freshness.
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?
Explicitly advises to call when assessing if a regulatory answer is up-to-date. This provides clear guidance on appropriate invocation context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_bulletinA
Fetch the full content of a specific information bulletin by IB number (e.g. 'IB-121' or '121'). Returns checklist, required forms, and reference code sections.
| Name | Required | Description | Default |
|---|---|---|---|
| ib_number | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses that the tool returns 'checklist, required forms, and reference code sections,' adding behavioral context. However, it does not mention any side effects, permissions, or rate limits, but given the read-only nature, this is acceptable but not exceptional.
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?
The description is two sentences, each serving a distinct purpose: first explains the action and input, second describes the output. No extraneous words, highly efficient.
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?
Given the output schema exists, the description appropriately summarizes return content without redundancy. It covers the core input parameter and output content. Minor improvement would be referencing the sibling 'list_bulletins' tool for context on obtaining IB numbers.
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 0%, so the description must compensate. It provides a concrete example ('IB-121' or '121') for the ib_number parameter, clarifying the expected format. This adds significant meaning beyond the raw schema, though it could be more precise (e.g., regex pattern).
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 explicitly states 'Fetch the full content of a specific information bulletin by IB number' with an example format. It clearly identifies the resource (bulletin) and the action (fetch), distinguishing it from sibling tools like 'list_bulletins'.
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 description implies when to use the tool (when you have an IB number). It provides context for the IB number format but does not explicitly state when not to use it or recommend alternatives like 'list_bulletins' for obtaining IB numbers.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_case_rulingsC
PENDING (v0.1): Federal and California appellate court rulings affecting San Diego land use, zoning, CEQA, and Coastal Act. Pipeline scaffolded 2026-05-15 via CourtListener API. Returns coverage:pending with a planned_at date and fallback CourtListener search URL until live data ships (ETA 2026-07-15).
| Name | Required | Description | Default |
|---|---|---|---|
| query | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Given no annotations, the description transparently discloses that the tool is pending with a planned date and a fallback URL. It explains the current behavior (returns coverage:pending) and future expectations, which is sufficient for an agent to understand its limitations.
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?
The description is somewhat verbose but front-loaded with the 'PENDING' status and date. The second sentence could be shortened, but the info about planned_at and fallback URL is useful. Overall adequate but not concise.
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?
Despite lacking parameter details, the description covers the tool's current state, future date, and fallback mechanism. An output schema is present (not shown but noted), which may compensate, but for now the agent lacks full context on input semantics. The description is moderately complete for a pending 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?
The schema has one parameter 'query' with 0% coverage in the description. The description does not explain what 'query' expects or how it affects results. The agent has no guidance on whether to pass a case number, topic, or other input.
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 clearly states the tool returns Federal and California appellate court rulings on specific land-use topics. The scope is well-defined, and it distinguishes itself from sibling tools like get_code_section or lookup_parcel by focusing on case law rather than municipal code or parcel data.
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 description does not indicate when to use this tool versus alternatives. It mentions the tool is pending and returns a placeholder, but provides no guidance on when it should be invoked or what to do instead (e.g., use the fallback URL).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_code_sectionA
Fetch the full text of a specific SDMC section by section number (e.g. '142.0610'). Includes diagrams, cross-references, and source PDF link. Prefer this over search when you already know the section.
| Name | Required | Description | Default |
|---|---|---|---|
| section_number | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden. It discloses that output includes 'diagrams, cross-references, and source PDF link,' informing about key return elements. However, it does not mention behavior for missing or invalid section numbers, which would improve transparency.
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 sentences with no wasted words. First sentence states action and input, second adds output details and usage guidance. Front-loaded and efficient.
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?
Given the tool's simplicity (one parameter, output schema present), the description covers purpose, usage context, and output highlights. It is sufficiently complete for an agent to correctly select and invoke 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 has 0% description coverage, but the description illustrates parameter usage with an example ('e.g. '142.0610''), adding meaning beyond the schema's bare type 'string'. This compensates somewhat, though it could be more explicit about allowed format or constraints.
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?
Description uses specific verb 'Fetch' with resource 'full text of a specific SDMC section' and gives an example section number. It distinguishes from sibling tool search_municipal_code by stating 'Prefer this over search when you already know the section.' This clearly defines the tool's scope and differentiation.
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?
Explicitly advises when to use this tool over search: 'Prefer this over search when you already know the section.' This provides clear context for selection, though it does not explicitly state when not to use it (e.g., if unsure of section number).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_overlays_for_apnA
Return every regulatory overlay that applies to a parcel by APN: SDA (Sustainable Development Area, drives state ADU density bonus eligibility), TPA (Transit Priority Area for AB 2097 parking elimination), CPIOZ, Coastal Overlay, Prop D Coastal Height Limit, MSCP, flood, fire, seismic, airport, and historic-district overlays. The #1 multifamily-developer question — overlays gate ADU bonus and parking workflows.
| Name | Required | Description | Default |
|---|---|---|---|
| apn | Yes | ||
| include_all | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description adequately describes that the tool returns a collection of overlays and their relevance. It implies a read-only operation but does not disclose behavioral traits like data freshness, authentication needs, or potential caching. The description does not contradict any annotations (none exist).
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?
The description is a single concise sentence plus a brief contextual tagline, with no wasted words. It front-loads the purpose and key overlays efficiently.
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?
Given the tool's complexity (multiple overlay types) and the presence of an output schema, the description provides sufficient context about what overlays are returned and their practical significance. It could be more complete by briefly explaining the effect of the 'include_all' parameter or noting if any overlays are inactive by default.
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 description explains that the tool returns overlays 'by APN', adding some meaning to the 'apn' parameter, but does not explain the 'include_all' boolean parameter or its default false value. With 0% schema description coverage, the description does not compensate enough for the missing parameter documentation.
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 clearly states the tool returns regulatory overlays for a parcel by APN, listing specific overlay types like SDA, TPA, and historic-district overlays. It distinguishes from sibling tools like get_overlays_for_point by specifying the input type (APN vs point).
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 description explicitly states it addresses 'the #1 multifamily-developer question' and relates overlays to ADU bonus and parking workflows, providing clear guidance on when to use the tool. However, it does not explicitly mention when not to use it or compare to alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_overlays_for_pointA
Same overlay lookup as get_overlays_for_apn but keyed by a WGS84 lat/lon. Use when you have a project-site coordinate but no APN (map click, geocode result, etc.).
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | ||
| lon | Yes | ||
| include_all | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden. It indicates a read-only lookup operation but does not disclose any behavioral traits beyond that, such as authorization needs, rate limits, or pagination. The description is adequate but not thorough.
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?
The description consists of two short sentences that are front-loaded with key information. Every word serves a purpose—no fluff.
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 3-parameter lookup tool with an output schema, the description is nearly complete. It lacks parameter details but is otherwise sufficient. The sibling context and example usage provide enough guidance.
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%, meaning no parameter descriptions in the schema. The tool description does not explain the parameters (lat, lon, include_all) beyond their names. While 'lat' and 'lon' are self-explanatory, 'include_all' is not described, which is a gap given the low coverage.
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 clearly states the tool performs an overlay lookup keyed by lat/lon coordinates, explicitly mentioning it is the same as get_overlays_for_apn but with coordinates. It distinguishes itself from the sibling tool and specifies the coordinate system (WGS84).
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 description explicitly tells when to use this tool: 'Use when you have a project-site coordinate but no APN (map click, geocode result, etc.)', and by contrast, implies when not to use it (when APN is available, use get_overlays_for_apn).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_permits_for_parcelA
Fetch building permits for a parcel by APN. Filter by status ('Active', 'Completed', 'Expired', 'Revoked', 'Pending', or 'all'). Returns permit number, type, dates, contractor, and project value.
| Name | Required | Description | Default |
|---|---|---|---|
| apn | Yes | ||
| status | No | all | |
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It correctly indicates a read operation ('Fetch') and describes the returned fields. However, it does not explicitly state idempotence, authentication needs, or potential performance impacts, leaving some gaps.
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?
The description consists of exactly two sentences, each adding distinct value. No redundant information, and the most critical details (purpose, filter, return fields) are front-loaded.
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?
Given the tool's simplicity (3 params, output schema exists), the description covers essential aspects: what the tool does, how to filter, and what is returned. It does not mention the default limit or error conditions, but the presence of an output schema somewhat reduces the need for detailed return description.
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 0%, so the description must compensate. It explains the 'apn' parameter (by APN) and the 'status' parameter with allowed values listed. The 'limit' parameter is not mentioned, but since it has a default value, the omission is partial. Overall, it adds significant meaning beyond the bare schema.
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 clearly states the verb 'Fetch' and the resource 'building permits for a parcel by APN'. It lists the filter parameter and return fields, differentiating it from sibling tools like get_violations_for_parcel or get_overlays_for_apn.
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 description provides clear context for when to use this tool (to fetch permits by APN with optional status filter). However, it does not explicitly state when not to use it or mention alternative tools for related data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_setbacks_for_zoneA
Return setbacks, lot dimension minima, FAR, height limits, and special-overlay rules for a San Diego zone code (e.g. 'RS-1-7', 'RM-1-1'). Sourced from SDMC tables.
| Name | Required | Description | Default |
|---|---|---|---|
| zone_code | Yes | ||
| lot_area_sqft | No | ||
| dwelling_units | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description notes that data is 'Sourced from SDMC tables,' providing a useful behavioral trait about data origin and implicitly that this is a read operation. With no annotations provided, this adds value beyond the schema and purpose. However, it does not address error handling or rate limits.
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?
The description is a single sentence that immediately states the action and resource, with no filler. It is optimally concise and front-loaded.
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?
Given the presence of an output schema, the return format is covered. However, the description omits any explanation of how the optional parameters (lot_area_sqft, dwelling_units) influence results, which is a gap for an agent needing to invoke the tool correctly.
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 compensate. It provides an example format for zone_code but gives no explanation for lot_area_sqft or dwelling_units, leaving the agent to guess their purpose (e.g., whether they affect calculations).
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 clearly identifies the tool as returning setbacks, lot dimension minima, FAR, height limits, and special-overlay rules for a San Diego zone code, with specific example formats. This distinguishes it from sibling tools like get_zone_info (which may be more generic) and get_overlays_for_apn (which uses APN).
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 description states the tool is for a San Diego zone code, which implies when to use it, but it does not explicitly mention when not to use it or point to alternatives. For example, it does not guide the agent to use get_overlays_for_apn if an APN is available instead of a zone code.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_table_of_contentsA
Return a hierarchical table of contents for the Municipal Code, optionally filtered to a single chapter. Use to discover what's available before searching.
| Name | Required | Description | Default |
|---|---|---|---|
| chapter | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses the hierarchical and filtering behavior but omits details like authentication needs, rate limits, or error handling. Adequate but not rich in behavioral context.
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 sentences, front-loaded with purpose. Every sentence adds value—no redundancy or filler. Efficient and well-structured.
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?
Given the output schema exists, return values need not be described. The description covers purpose, usage hint, and parameter meaning. Could mention the hierarchical output structure more explicitly, but output schema likely handles that.
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 description must compensate. It explains the 'chapter' parameter is optional and used for filtering, adding meaning beyond the schema's type/anyOf. However, it could specify accepted formats more precisely.
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?
Description clearly states the action (Return), resource (hierarchical table of contents for the Municipal Code), and optional filtering. It also provides usage context ('Use to discover what's available before searching'), distinguishing it from sibling tools like search_municipal_code.
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?
Description explicitly advises using the tool for discovery before searching, providing clear context. It does not mention when not to use or explicitly name alternatives, but the purpose is sufficiently differentiated from siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_violations_for_parcelA
Fetch code-enforcement cases for a parcel by APN. Filter by status ('Open', 'Closed', 'Resolved', 'Pending', or 'all'). Returns case number, violation type, dates, and resolution.
| Name | Required | Description | Default |
|---|---|---|---|
| apn | Yes | ||
| status | No | all | |
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description must cover behavior. It mentions filtering by status and return fields, but omits details like pagination, rate limits, or error handling for invalid APNs.
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 sentences, front-loaded with verb and object, no filler. Every sentence adds value.
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?
Given the output schema exists (context signal) and the description already covers return fields and key parameters, it is largely complete. Minor gaps on limit behavior and APN format.
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 0%, so description adds meaning: APN as parcel identifier, status with explicit values, limit likely for max results. However, it doesn't explain limit's behavior or APN format.
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 clearly states the action ('Fetch'), the resource ('code-enforcement cases'), and the identifier ('parcel by APN'). It also lists return fields, distinguishing it from sibling tools like get_permits_for_parcel.
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 description implies usage for fetching code-enforcement cases by APN, but provides no explicit guidance on when to use this tool versus alternatives like get_permits_for_parcel or search_municipal_code.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_zone_infoB
Higher-level zone summary. Returns setbacks + envelope limits + pointer back into SDMC for permitted-use detail. Combine with search_municipal_code for narrative regs.
| Name | Required | Description | Default |
|---|---|---|---|
| zone_code | Yes | ||
| lot_area_sqft | No | ||
| dwelling_units | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral traits. It only states what it returns, omitting details like read-only nature, rate limits, or authentication requirements.
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 succinct sentences: the first front-loads the purpose and outputs, the second provides usage guidance. No redundancy or filler.
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?
While an output schema exists (so return values need not be elaborated), the description lacks context about prerequisites, data source, or detailed explanation of 'envelope limits' and 'pointer'. Adequate but incomplete.
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% (no parameter descriptions). The description fails to explain any of the three parameters (zone_code, lot_area_sqft, dwelling_units), offering no value beyond the schema.
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 clearly states the tool returns a 'higher-level zone summary' with specific outputs (setbacks, envelope limits, pointer to SDMC), and distinguishes it from sibling tools like 'search_municipal_code' and 'get_setbacks_for_zone'.
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 description explicitly advises combining with 'search_municipal_code' for narrative regulations, providing usage context. However, it lacks explicit when-not-to-use guidance or alternatives for other siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_bulletinsB
List Development Services Department information bulletins, optionally filtered by project type (e.g. 'ADU', 'New Construction'). Bulletins are the procedural guides that tell applicants what forms + checklists are required.
| Name | Required | Description | Default |
|---|---|---|---|
| project_type | No | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. Only states it lists bulletins, with no mention of behavioral traits such as read-only nature, authentication requirements, or rate limits. No contradictions.
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 concise sentences with no wasted words. First sentence states purpose and optional filtering, second provides useful context on what bulletins are.
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?
Incomplete for a tool with 2 parameters and no parameter descriptions in schema. Does not mention the 'limit' parameter or any pagination/format details. Output schema exists but return structure not discussed.
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%. Description adds meaning to 'project_type' with examples, but completely omits the 'limit' parameter. Fails to compensate for lack of schema documentation.
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?
Clearly states the action (List), the resource (Development Services Department information bulletins), and optional filtering by project type with examples. Distinguishes from sibling 'get_bulletin' which likely retrieves a single bulletin.
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?
Implies usage for listing bulletins, optionally filtered. Provides an example of filtering by project type. However, no explicit guidance on when not to use or how it differs from siblings like 'search_municipal_code'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lookup_parcelC
Look up a parcel by street address OR APN. Returns zoning, overlays, lot size, assessor data (year built, sqft, type). The killer query — most public sources require visiting 4+ websites to assemble this picture.
| Name | Required | Description | Default |
|---|---|---|---|
| address | No | ||
| apn | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It states it is a query (read operation) but does not disclose authentication needs, rate limits, what happens if both or neither parameter is given, or any side effects. Minimal behavioral context.
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 sentences; the first is clear and functional. The second is promotional ('The killer query...') which adds some context but is not essential. It is reasonably concise but could be more focused on parameter guidance.
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?
Given the existence of sibling tools like get_zone_info and get_overlays_for_apn, the description does not explain how this tool aggregates data or how it relates to those. Also, with both parameters optional, the usage context is unclear. The output schema exists, so return values are covered, but overall completeness is low.
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%, yet the description only says 'by street address OR APN' without explaining formats, constraints, or that exactly one should be provided. Both parameters are optional with null default, which is confusing. The description adds little over the schema structure.
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 clearly states the tool looks up a parcel by address or APN and lists returned data (zoning, overlays, etc.). However, it does not differentiate from sibling tools like get_zone_info or get_overlays_for_apn, which may cover subsets of the data.
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 description does not specify when to use this tool versus alternatives. It mentions 'most public sources require visiting 4+ websites' as a rationale, but lacks explicit when-to-use or when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_municipal_codeA
Semantic search across San Diego Municipal Code, information bulletins, and ordinances. Returns top-matching chunks with section numbers, source URLs, and PDF anchors. Use for open-ended questions like 'what are fence height rules' or 'when do I need historical review'.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| limit | No | ||
| doc_types | No | ||
| min_similarity | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description fully discloses behavior: returns top-matching chunks with section numbers, source URLs, and PDF anchors. Adequate for a read-only search tool; no contradictions.
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 sentences, no wasted words. Purpose and usage are front-loaded. Highly efficient and clear.
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?
While output schema likely covers return format, the description omits parameter details, leaving agents to guess about limit, doc_types, and min_similarity. Incomplete for a 4-parameter tool with no schema descriptions.
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%. Description fails to explain any of the 4 parameters (query, limit, doc_types, min_similarity). Only query is implied via examples. Does little to help agent understand correct parameter usage.
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 clearly states it performs semantic search across San Diego Municipal Code, information bulletins, and ordinances. It distinguishes from sibling tools like get_code_section and get_bulletin, which are more specific lookups.
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?
Provides explicit use cases with example questions ('what are fence height rules', 'when do I need historical review'), guiding when to use semantic search. Does not explicitly state when not to use, but context implies alternatives exist for exact matches.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Most tools have distinct purposes, but get_zone_info and get_setbacks_for_zone partially overlap (both return setbacks), and lookup_parcel includes zoning/overlays also covered by separate tools. Descriptions help, but an agent might be uncertain which to use for zone details.
Tools predominantly use verb_noun snake_case (get_*, list_*, lookup_*, search_*). data_freshness breaks the pattern slightly, but overall naming is predictable and clear.
14 tools cover a comprehensive domain (land use, zoning, permits, overlays, code enforcement, bulletins, case rulings) without unnecessary excess. Each tool earns its place for a real estate regulatory assistant.
The tool set covers most common regulatory queries (parcel info, overlays, permits, code sections, bulletins). Minor gaps: missing tax assessment or property history, and get_case_rulings is still pending. But core workflows are well-supported.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Unofficial MCP server for the public PortlandMaps property/permit/zoning API. Not city-affiliated.
MCP server for Mireye Earth — federal-source-cited geospatial data for any MCP-aware agent.
Agent-native MCP server over 49M+ US public and government records, privacy-first, always current.
DataSF MCP — San Francisco open data (data.sfgov.org, Socrata SODA API).
Related MCP Servers
- FlicenseAqualityDmaintenanceAn MCP server that enables users to search and navigate Madison, Wisconsin municipal ordinances using a TF-IDF search index. It provides specific code sections and citations to answer questions about local regulations like building permits and zoning.2
- AlicenseAqualityCmaintenanceOpen-source MCP server providing real estate regulatory intelligence (zoning, permits, entitlements, deal scoring) for US properties, enabling AI agents to access 10 callable tools.1215MIT
- FlicenseNot gradedqualityCmaintenanceA read-only MCP server for querying Los Angeles City legislative data - Council Files, votes, member activity, and Neighborhood Council engagement - through parameterized tools without raw SQL.1
- AlicenseAqualityBmaintenanceAn MCP server that puts open data on tap, enabling LLM clients to search, inspect, and query 30,000+ civic datasets from Socrata portals with built-in guardrails like row caps and actionable error messages.4MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/estate-atlas/sandiego-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server