Commonwealth-MCP
This server exposes read-only MCP tools for exploring Virginia government data: jurisdiction resolution, parcels, zoning, boundaries, and Code of Virginia sections, all with provenance and coverage metadata.
registry.resolve_jurisdiction: Resolve a Virginia jurisdiction by name, alias, FIPS code, or lon/lat point-in-polygon; handles ambiguous names and layered authorities (town + county); signals when user choice is required.
geo.find_parcel: Find parcel records by PIN or lon/lat in supported jurisdictions; distinguishes “no source registered” from “no parcel found.”
geo.find_zoning: Look up zoning district(s) by PIN or point; screening-only evidence from GIS layers, never a legal determination; shows disagreements between official sources rather than reconciling them.
geo.find_boundaries: Get official jurisdiction boundary info (FIPS, GNIS, area, type, bbox, centroid, optional vertices); not a containment test.
civic.get_code_section: Fetch a Code of Virginia section by citation (e.g. 18.2-57); missing/repealed sections return found=False rather than an error.
Every tool returns an envelope with structured coverage dimensions, evidence, warnings, provenance, resources, and next actions, so answers name their government source and fetch date.
Provides access to Virginia state and local government geographic data through ArcGIS services, including parcel, zoning, and boundary lookups with source provenance.
Click 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., "@Commonwealth-MCPWhat zoning applies to parcel 0102 14 0231 in Fairfax County?"
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.
Commonwealth-MCP
Virginia government data, available to AI agents through the Model Context Protocol.
Ask which local government covers a spot on the map, what a parcel record says, how a parcel is zoned, or what a section of the Code of Virginia says. Every answer names the government system it came from and the date it was fetched.
Independent project. Not affiliated with or maintained by the Commonwealth of Virginia.
Why this exists
Virginia has 133 counties and independent cities. Each one publishes its data its own way: different platforms, different field names, different rules about what you may do with it. Anyone building something on top of Virginia public data has to work that out first, and everyone works it out separately.
This project does it once and writes down what it learned.
Related MCP server: Lextiva Compliance MCP Server
Try it
uv venv --python 3.12 .venv
uv pip install --python .venv/bin/python -e . --group devCheck that the registered government services are reachable:
.venv/bin/commonwealth doctor --liveAsk a real question. A PIN is the identifier a Virginia locality gives a parcel of land, printed on the tax bill and on the county's own map; the spacing inside it is the county's, and it matters:
.venv/bin/commonwealth tools call geo.find_zoning \
--args '{"jurisdiction": "Fairfax County", "pin": "0102 14 0231"}'Point an AI client at it. This writes the client's config file, shows you the change first, and leaves any other servers you have configured alone:
.venv/bin/commonwealth configure claude-code --dry-runDrop --dry-run to write it. claude, codex, cursor and vscode work
too. Or run the server directly, over stdio:
.venv/bin/commonwealth serveThe tests replay recorded government responses, so they run offline:
.venv/bin/pytestTo hold them to that, set COMMONWEALTH_DENY_NETWORK=1 and every outbound
request is refused before it is made:
COMMONWEALTH_DENY_NETWORK=1 .venv/bin/pytestWhat it can answer today
Question | Coverage |
Which government covers this? | By name, FIPS code, street address, ZIP, or coordinates: all 133 localities and 189 towns |
What is at this address? | Statewide address points |
What is this parcel? | Fairfax County, Richmond City, Charles City County, VGIN statewide |
How is it zoned? | Fairfax County and Richmond City |
Where does this jurisdiction end? | Statewide: 133 localities, 189 towns |
Is this ground built on? | Statewide building footprints |
Where is the nearest school or library? | Statewide landmarks |
What does § 18.2-57 say? | The full Code of Virginia |
Three skills package those into workflows — the order to ask in, and what
an empty answer means at each step: whose-government,
parcel-zoning-screen, and site-context-screen, in
skills/.
Some examples of what that looks like in practice:
The city on an envelope is a postal delivery route. "Alexandria, VA 22310" is a Fairfax County address. Ask about it and the answer is Fairfax County, with a note saying the mailing city and the government differ. A ZIP that spans several localities comes back as all of them, because a ZIP is a delivery route and picking one would be a guess.
Ambiguous names come back ambiguous. Ask about "Fairfax" and you get both candidates back. Fairfax City is not inside Fairfax County — it is a separate government. None of Virginia's 38 independent cities sit inside the county they share a name with, and this trips up almost every system that handles Virginia data.
A point in a town returns the town and the county. Both govern that ground, so both are in the answer.
Two official sources that disagree are both shown. Where a locality publishes its own parcel layer and VGIN publishes a statewide one, both are queried. Neither is ranked above the other, and a disagreement is reported as a disagreement.
An answer too big to return comes back with a handle to the rest. A county boundary is a polygon with thousands of vertices and a downtown building query finds hundreds of footprints. Both come back summarised, with a link to everything that was retrieved, rather than silently shortened.
An empty answer says which kind of empty it is. Either the records were searched and nothing matched, or no source is registered for that place at all. Most systems show the same blank screen for both. They are different facts, and only one of them means "there is nothing there".
Zoning answers are screening evidence. They report what the county's GIS layer says. The adopted ordinance is what governs, and the answer says so every time.
What it cannot do yet
Data for most localities. Every one of the 133 counties and independent cities is in the jurisdiction table, along with all 189 incorporated towns, so a name or a coordinate anywhere in Virginia finds the right government. What most of them do not have is a source of their own: three localities publish a parcel layer this project reads, and the rest are answered by VGIN's statewide layers or not at all.
Zoning outside two localities. Fairfax County and Richmond City are registered. Everywhere else returns a registry gap.
Everything else in the design. Finance, infrastructure, environment, and people are sketched in the architecture and not built.
Open issues is the list of what comes next, ordered by priority label.
Try it in a terminal
Five short scripts in examples/, each a real question with a printed answer. They run offline against recorded government responses by default, so a first run cannot fail on a network or a service being down:
python examples/whose_government.py # recorded responses
python examples/whose_government.py --live # the real serviceswhose_government.py asks about a mailing address whose city is not its
government, screen_a_parcel.py walks a property question from PIN to
zoning to buildings to monitored sites, what_is_covered.py shows what an
empty answer means here, and two_sources_disagree.py shows two official
sources describing one road differently.
one_address_every_question.py is the one to run first. It asks everything
this project can ask about a single address in Sterling, in Loudoun
County, and gets three different kinds of answer back: records found,
records checked and absent, and no source registered. Telling those apart
is what the whole project is for.
examples/README.md has the table.
The demo site
docs/index.html is a static page with no build step. It shows what is registered, and walks through a recorded call for every tool the server exposes, one at a time: successful lookups, an ambiguous jurisdiction, an empty result, a registry gap, and a typed error.
Three parts of it are interactive, and all three run on recorded data
rather than a mock-up. The jurisdiction resolver calls the real
JurisdictionTable.resolve() at build time. The HTTP view shows the
actual requests that went to Fairfax County's ArcGIS service. The coverage
decoder links each warning code to a call that produced it.
python tools/build_site.py --fixtures # rebuild from recordings
python tools/build_site.py --live # re-query the real services
python3 -m http.server -d docs # or just open the fileWhere things are
If you are reading the code, start at design/. It names three files to read first and says why, which is a shorter path than the architecture document.
If you want to add a government source, that is CONTRIBUTING.md, and it is the most useful thing anyone can contribute here.
Everything else, by folder:
design/ how it works, why, and the contract for each feature.
architecture.md holds one record per decision, with the
options that lost still written out
src/ the implementation
sources/ one manifest per government service, plus the jurisdiction
table. Reviewed like code, and mostly not code
skills/ workflows: what to ask, in what order, and what an empty
answer means at each step
evals/ the tasks those workflows are scored against
tests/ offline, replaying recorded government responses
research/ the evidence the design was made from. A reference, not a
next step: one long file with its own contents list
docs/ the published website, the run log, and the audits.
Named for GitHub Pages, not for documentation
tools/ the research scripts and the writing checker are stdlib
only; build_site.py and upstream_audit.py import the package
.github/ governance, the security policy, and review routingTwo files worth knowing about by name: design/source-quirks.md collects the things real government data does that its schema does not predict, and docs/RUNLOG.md says what happened when.
License
Code is Apache-2.0. The source registry is CC0. Documentation prose is CC-BY-4.0. Recorded government responses belong to their publishers and keep those publishers' terms.
NOTICE says which applies to what, and THIRD_PARTY_DATA.yml lists every government source this repo redistributes anything from.
Reproducing the research
The searches behind research/ are scripts, so you can re-run them:
python3 tools/search_hn.py
python3 tools/search_github.py
python3 tools/fetch_mcp_registry.pyThere is also a writing checker. It reads the docs and the site and flags the habits this project keeps falling into:
python3 tools/check_writing.pyAvailable Tools
5 toolscivic.get_code_sectionARead-only
Get the text of a Code of Virginia section by its citation (e.g. '1-500', '18.2-57'). Direct lookup only — this is not a full-text search; the caller must already know or have found the section number. Results carry the section's own citation history exactly as published, with a link to the live page. A missing section (repealed, renumbered, or never existed) returns found=False, not an error.
| Name | Required | Description | Default |
|---|---|---|---|
| citation | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| coverage | Yes | |
| evidence | No | |
| warnings | No | |
| resources | No | |
| _execution | No | |
| provenance | No | |
| next_actions | No | |
| requires_user_choice | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, and the description adds meaningful behavioral detail: results carry citation history exactly as published, include a link to the live page, and missing sections return found=False rather than an error. This sets accurate expectations beyond the structured annotations. No contradiction exists.
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 three sentences with no filler. The primary action is front-loaded, followed by critical lookup limitations, then result behavior. Every sentence earns its place and the length is appropriate for the tool's simplicity.
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?
The description fully equips an agent to call the tool correctly: a clear purpose, citation format examples, a lookup-only warning, and missing-section behavior. An output schema exists, so return value structure does not need to be repeated. Nothing necessary for correct invocation is omitted.
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?
With 0% schema description coverage, the description carries the full burden of explaining the single 'citation' parameter. It provides concrete examples ('1-500', '18.2-57') and clarifies that the value is a Code of Virginia section citation. This adds substantial 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 opens with a clear verb and resource: 'Get the text of a Code of Virginia section by its citation.' It further distinguishes itself from full-text search by stating 'Direct lookup only,' which separates it from any search-style sibling. The sibling tools are in different domains (jurisdiction, zoning, parcels), so no ambiguity remains about what this tool does.
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 when to use the tool: the caller must already know or have found the section number. It also gives an explicit exclusion: 'this is not a full-text search.' This is actionable guidance that prevents misuse without requiring inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
geo.find_boundariesARead-only
Get a Virginia jurisdiction's official boundary: FIPS, GNIS, area, jurisdiction type, bounding box, and the publisher's own centroid. Use to confirm WHICH government's territory is meant and how big it is. Independent cities are returned as their own territory, never as part of the county sharing their name. Screening geometry only — it is generalized and the publisher disclaims survey use, so never decide from it which side of a boundary an address sits on. Pass detail='full' for vertices. Not a containment test: to find which jurisdiction covers a point, use registry.resolve_jurisdiction with lon/lat.
| Name | Required | Description | Default |
|---|---|---|---|
| detail | No | concise | |
| jurisdiction | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| coverage | Yes | |
| evidence | No | |
| warnings | No | |
| resources | No | |
| _execution | No | |
| provenance | No | |
| next_actions | No | |
| requires_user_choice | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and openWorldHint annotations, the description discloses that geometry is generalized, the publisher disclaims survey use, and it must never be used to decide which side of a boundary an address sits on. It also explains the independent-city behavior, which is a suprising edge case.
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 dense but every sentence earns its place: function, usage context, edge case, geomery caveat, parameter guidance, and sibling distinction. Key constraints are front-loaded, and the warning about surveying is prominent.
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?
The output schema presumably documents return fields, so the description focuses on what is not elsewhere specified: when to use the tool, how the geometry behaves, independent-city behavior, and the detail parameter. For an agent selecting and invoking this tool, all necessary context is present.
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?
With 0% schema description coverage, the description compensates by explaining that detail='full' requests vertices and by framing jurisdiction as a Virginia jurisdiction whose territory is returned as separate for independent cities. It does not specify the jurisdiction value format, but the parameter semantics are meaningfully clarified.
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 has a specific verb and resource: 'Get a Virginia jurisdiction's official boundary,' and lists concrete return contents (FIPS, GNIS, area, jurisdiction type, bounding box, centroid). It also distinguishes itself from sibling registry.resolve_jurisdiction by explicitly stating it is not a containment test.
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?
It states exactly when to use this tool ('confirm WHICH government's territory is meant and how big it is') and when not to use it ('Not a containment test... use registry.resolve_jurisdiction'). This gives clear routing guidance against the sibling tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
geo.find_parcelARead-only
Find parcel records in a Virginia jurisdiction by parcel PIN or by a lon/lat point. Pass the user's jurisdiction string as given — resolution and its ambiguities are handled here, and candidate lists must go back to the user unchosen. Results carry provenance and coverage; an empty result with coverage.registry='none' means Commonwealth has no source there, not that no parcel exists. Not for street addresses yet (no geocoding in this release).
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | ||
| lon | No | ||
| pin | No | ||
| jurisdiction | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| coverage | Yes | |
| evidence | No | |
| warnings | No | |
| resources | No | |
| _execution | No | |
| provenance | No | |
| next_actions | No | |
| requires_user_choice | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint and openWorldHint, but the description adds material behavioral context beyond them: results carry provenance and coverage, an empty result with coverage.registry='none' means no source rather than no parcel, and jurisdiction-resolution ambiguity is handled internally. This is exactly the kind of operational nuance an agent needs to interpret results correctly.
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 compact yet dense; every sentence serves a purpose. The core action is front-loaded, followed by critical operational guidance, and no words are wasted on restating schema fields or repeating annotations.
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 tool with two query modes, jurisdiction-resolution semantics, candidate disambiguation, provenance/coverage concerns, and an open-world empty-result case, the description covers essentially all behavioral requirements. The output schema covers return shape, so the description only needs to explain semantics, which it does thoroughly.
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?
With schema description coverage at 0%, the description compensates by explicitly naming the PIN, the lon/lat point, and the jurisdiction string, and by explaining how jurisdiction should be passed ('as given'). It adds meaning beyond the bare schema, though it does not fully detail parameter constraints such as coordinate format or whether pin and lon/lat are mutually exclusive beyond the 'or' phrasing.
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 opens with a specific verb and resource: 'Find parcel records in a Virginia jurisdiction by parcel PIN or by a lon/lat point.' It also scopes the geographic domain and identifies the two supported query modes, making the purpose unambiguous and naturally distinct from sibling tools like geo.find_zoning or geo.find_boundaries.
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?
It clearly instructs the agent to pass the user's jurisdiction string as given and states that resolution/ambiguities are handled inside the tool, which also implies not to pre-resolve via registry.resolve_jurisdiction. It gives a useful exclusion ('Not for street addresses yet') and a handling rule ('candidate lists must go back to the user unchosen'). It does not explicitly name the zoning/boundaries siblings as alternatives for other query types, so it stops short of full alternative mapping.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
geo.find_zoningARead-only
Find the zoning district(s) for a parcel PIN or lon/lat point in a Virginia jurisdiction. Screening only: results state the GIS layer's answer, never a legal determination — repeat the screening_only warning to the user. When two official sources are registered, both are queried and any disagreement is shown, not reconciled. Use geo.find_parcel first when you need the parcel record itself.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | ||
| lon | No | ||
| pin | No | ||
| jurisdiction | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| coverage | Yes | |
| evidence | No | |
| warnings | No | |
| resources | No | |
| _execution | No | |
| provenance | No | |
| next_actions | No | |
| requires_user_choice | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond the readOnly/openWorld/destructive annotations by explaining that the tool reports the GIS layer's answer, requires repeating a screening_only warning, and queries both registered official sources while showing disagreements rather than reconciling them. These are meaningful behavioral traits not present in the structured metadata.
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?
Three sentences, front-loaded with the main purpose, followed immediately by the key caveats and sibling routing. There is no filler or repetition of schema/annotation 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?
The description is complete for a read-only screening tool: it covers input modes, jurisdiction scope, legal caveat, dual-source behavior, and a sibling alternative. Since an output schema exists, the description does not need to document return fields.
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?
With 0% schema description coverage, the description carries the burden of explaining parameters. It clarifies the two locator modes ('parcel PIN or lon/lat point') and the jurisdiction scope, but it does not explicitly state the at-least-one-of pin/lat/lon requirement or coordinate format details.
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?
Uses a specific verb and resource: 'Find the zoning district(s) for a parcel PIN or lon/lat point in a Virginia jurisdiction.' It clearly distinguishes itself from siblings by stating it answers zoning screening questions, not parcel-record lookups or legal determinations.
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 usage context: use it for zoning screening only, and names an alternative with a routing condition: 'Use geo.find_parcel first when you need the parcel record itself.' It also tells the agent the result is never a legal determination, covering a when-not-to-rely case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
registry.resolve_jurisdictionARead-only
Resolve a Virginia jurisdiction from a name, alias, or FIPS code, or from a lon/lat point by point-in-polygon against official boundaries. Use FIRST whenever a place is named or a coordinate is given: Virginia has independent cities that are not inside the counties sharing their names (Fairfax City is not in Fairfax County), and towns that sit inside a county so BOTH governments apply — read layered_authorities, do not assume the resolved leaf answers everything. Pass query OR lon/lat, never both. If the result carries candidates with requires_user_choice, present them to the user and never pick one yourself. Not for street addresses yet (no geocoding in this release).
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | ||
| lon | No | ||
| query | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| coverage | Yes | |
| evidence | No | |
| warnings | No | |
| resources | No | |
| _execution | No | |
| provenance | No | |
| next_actions | No | |
| requires_user_choice | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, openWorld, and non-destructive hints; the description adds substantial behavioral context beyond those hints. It explains point-in-polygon resolution, Virginia's independent-city versus county quirk, layered authorities that can apply simultaneously, and the requirement to surface requires_user_choice candidates rather than silently picking one. It does not contradict 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?
The description is front-loaded with the core action and immediately follows with essential context about Virginia's jurisdictional quirks. Every sentence earns its place: input modes, the crucial XOR constraint, user-choice handling, and the no-geocoding limitation. It is dense but structured and avoids 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?
For a tool with no required parameters, an output schema present, and complex jurisdictional semantics, the description is remarkably complete. It covers input modes, geographic pitfalls, layered authorities, user-decision handling, and the known limitation about street addresses. Nothing an agent needs to invoke it correctly is missing.
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 semantic burden. It does: query is explained as a name, alias, or FIPS code; lat and lon are tied to coordinate-based point-in-polygon resolution; and the mutual exclusivity of query versus lat/lon is made explicit. This adds meaning far beyond the bare schema properties.
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 precise verb and resource: resolve a Virginia jurisdiction from a name, alias, FIPS code, or lon/lat point. It also differentiates from sibling tools by noting this is the tool to use FIRST when a place or coordinate is given, and by explicitly excluding street addresses, which distinguishes it from potential geocoding or boundary tools.
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 gives explicit when-to-use guidance: use it whenever a place is named or a coordinate is given. It also provides clear exclusions (not for street addresses), a critical input rule (query OR lon/lat, never both), and a decisive handling instruction for requires_user_choice candidates, leaving no ambiguity about how to proceed.
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. Dates show when Glama detected each change.
5 tool updates
v0.1.0- First observed
civic.get_code_section - First observed
geo.find_boundaries - First observed
geo.find_parcel - First observed
geo.find_zoning - First observed
registry.resolve_jurisdiction
TDQS
Each tool addresses a distinct resource/action: jurisdiction resolution, parcel lookup, zoning lookup, boundary geometry, and legal code text. The only potential overlap is between find_parcel and find_zoning, but their outputs are clearly different.
All tools follow a prefix.verb_noun pattern with consistent snake_case: registry.resolve_jurisdiction, geo.find_zoning, geo.find_parcel, geo.find_boundaries, civic.get_code_section. The domain prefixes make grouping and purpose predictable.
With 5 tools, the server is well-scoped for the Virginia civic/geographic domain. Each tool fills a distinct role, and the set is neither bloated nor too sparse.
The set covers the core read-only workflows: resolve a jurisdiction, get boundaries, find a parcel, get zoning, and retrieve a code section. However, there is no full-text search for code sections and no geocoding for street addresses, so agents must already know section numbers or accept coordinates/PINs. These are explicitly out of scope but still limit the surface.
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
Resolve any government entity worldwide and submit service requests. Open civic data for AI agents.
U.S. civic data for AI agents: reps, votes, bills, finance, lobbying, cited gov sources. 47 tools.
US public-records intelligence for AI agents — companies, SEC, courts, spending, licenses.
Agent-native MCP over US public + government records, entity- and parcel-keyed.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to search and analyze legal documents from multiple jurisdictions including US federal and state law, case law, EU regulations, UK legislation, Canadian law, Congress bills, SEC filings, and FDA data through free government APIs.6MIT
- FlicenseAqualityDmaintenanceProvides AI agents with access to a structured compliance dataset covering privacy and AI regulations across jurisdictions, enabling verifiable answers to regulatory questions via tools and resources.12-
- AlicenseAqualityBmaintenanceAn MCP server that gives AI agents clean, token-efficient access to US civic & property data — geocoding, census tracts, Opportunity Zones, ACS demographics, and FEMA flood zones — sourced entirely from free federal open data.5521MIT
- AlicenseNot gradedqualityCmaintenanceEnables searching and querying Virginia Open Data (datahub.va.gov) via the Socrata API, providing tools to search datasets, run SoQL queries, and retrieve metadata.14MIT
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/pranava0x0/Commonwealth-MCP'
If you have feedback or need assistance with the MCP directory API, please join our Discord server