us-places-mcp
Queries BLM's national Public Land Survey System ArcGIS MapServer to locate PLSS tracts from legal land descriptions, returning centroids, bounding boxes, acreage and BLM ids, and reverse-geocodes points to township, range, section and quarter-quarter.
Click on "Deploy 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., "@us-places-mcpwhich county held this spot on March 3, 1795?"
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.
us-places-mcp
An MCP server for where things were, then. Records follow the jurisdiction that held a place on the date of the event, not today's: a 1795 deed for a farm now in Greene County, Pennsylvania, is in Washington County's books, because Greene was carved out the next year. This server answers the questions that decide which office to write to:
Which county held this spot on that date? From the Newberry Library's Atlas of Historical County Boundaries, which records every creation and boundary change of every US county from 1629 to 2000, dated to the day, with the act behind it. OpenHistoricalMap imported the atlas and serves it free (CC0); this server asks it.
Where is this land description on the ground? "E½NE Sec. 18, T84N R39W, 5th P.M." becomes a centroid, a bounding box and BLM's ids, from the Bureau of Land Management's national Public Land Survey data. A map pin becomes a land description the other way.
Where is the case file behind this land patent? The patent is the end of a process. The file at the National Archives holds the application and, for a homestead, years of residence, witnesses and citizenship papers. The server says which file and which series, and builds the search.
Nothing here writes anywhere, and nothing here keeps a family tree. It sits well beside nara-catalog-mcp, which can run the archive searches this server builds, familysearch-mcp and snac-archives-mcp.
This is an independent project. It is not affiliated with, endorsed by, or supported by the Newberry Library, OpenHistoricalMap, the Bureau of Land Management or the National Archives.
Tools
The server publishes nine tools, all read-only and annotated so for the client. Five make no network call at all.
Jurisdiction at a date
Tool | Purpose |
| The county (or counties) that held a point on a date: a day, a month or a year. Returns the holder, its dates, the event and statute that made it, the whole chain of counties for that spot, changes within a year (check those by hand), and whether two governments contested it. |
| Every version of one county: created when, from what, and each later change, with statutes. |
Federal land
Tool | Purpose |
| Read a land description, however it is written ( |
| Place a description on the map: centroid, bounding box, acreage and BLM's ids, to the township, section, quarter-quarter or lot. |
| Name the survey tract at a point: township, range, section and quarter-quarter. |
| Was this state federal land? If not, who granted first title and where those records are; if so, its meridians and special cases. Offline. |
From patent to case file
Tool | Purpose |
| From a patent's Authority: the kind of entry, what its file holds, which National Archives series has it, ready-made arguments for nara-catalog-mcp's |
| A link to a search, or to one record, on BLM's General Land Office Records site, for you to open. Offline. |
| This session's live calls and cache hits. Offline. |
Related MCP server: Corridor-MCP
Setup
You need Python 3.11 or later and uv. There is no key to request.
uvx us-places-mcpor from a clone:
git clone https://github.com/ianderso/us-places-mcp
cd us-places-mcp
uv sync
uv run us-places-mcp # stdio server, usually launched by the clientClaude Desktop
{
"mcpServers": {
"places": {
"command": "uvx",
"args": ["us-places-mcp"]
}
}
}If the server fails to start because uvx cannot be found, give the full path
that which uvx prints as the command.
Claude Code
claude mcp add places -- uvx us-places-mcpConfiguration
Nothing is required. A .env file in the directory the server starts in
supplies anything the environment does not; only that directory is read.
Variable | Meaning |
| OpenHistoricalMap's Overpass endpoint. Default |
| BLM's national PLSS map service. Default |
| Response cache directory. Default |
| HTTP timeout in seconds. Default 60. |
| An email address or URL added to the User-Agent, so either service can reach you. Optional, and courteous. |
Both URLs must be https. Their two hosts are the only ones the server will contact.
Being a good guest
OpenHistoricalMap's Overpass server runs on donated capacity and publishes no
rate limit. The server sends one request at a time to each service, two
seconds apart for OpenHistoricalMap and half a second for BLM, joins identical
calls in flight, and caches answers on disk: county answers for 90 days, survey
answers until you pass refresh=true. A 429 or a 5xx is retried three times
with back-off, then reported as rate_limited or upstream_error, which is
never the same as "nothing here".
How to read what comes back
The county then, not now. A record was made by the county that held the place on the day. A new county does not take its parent's earlier records, so a deed from before Greene County existed is in Washington County's books still.
Check dates near a change.
boundary_change_within_a_yearlists changes close to your date. Laws took effect on stated days, but offices took time to organise; records from those months can be in either county."Attached to". Before an area was organised as a county it was often attached to a neighbour for administration, and that neighbour kept its records.
county_atreads this from the atlas's event text.Contested ground. Pennsylvania and Virginia both governed the Waynesburg area in the 1770s, and similar disputes ran elsewhere.
"status": "contested"means look in both governments' records.The atlas files counties under today's state. Monongalia County was created by Virginia but is filed under West Virginia; the event text says which government acted.
The atlas ends in 2000 and holds counties only: not towns, townships or parishes as church units.
A located tract is not a house. A section's centre is up to half a mile from any point in it, and BLM's data is a modern compilation that can differ from the original plat near correction lines and water. Lotted sections (along a township's north and west edges, or by water) have lots where a regular section has quarter-quarters.
A parse is a reading of a reading.
parse_legal_descriptionkeeps the original text and says what it guessed: a section number with no "Sec.", a meridian taken from the state.A patent proves a conveyance, on its signature date. The entry was years earlier: homesteaders lived on the land five years before final proof, and mid-century backlogs put years between purchase and signature. The Homestead Act took effect in 1863, so an "1856 homestead" in a family story is a cash, credit, preemption or warrant entry.
The patentee may never have seen the land. Military bounty-land warrants were bought and sold; the veteran is in the warrant file, the patentee may be a speculator.
No federal patents in state-land states. The thirteen colonies, Maine, Vermont, Kentucky, Tennessee, West Virginia, Texas and Hawaii granted their own land. A nil search there means nothing;
public_land_statesays where first title was recorded.Old GLO links are dead. BLM rebuilt glorecords.blm.gov in July 2026, and older record links now land on the home page. Cite a patent by its accession number, document number, state and signature date.
Deliberately not here
Searching GLO itself. The rebuilt site has no public API. The server builds links for you to open; it does not fetch the site.
Towns, townships and church parishes. The atlas is counties only.
Writing anywhere.
Security
Two hosts. A request hook refuses any request not for the two configured services, so a value a model passes in cannot make the server fetch another site.
Inputs are validated before they reach a query: coordinates as finite numbers in range, states against a table, survey numbers as digits, and a county name escaped character by character into the Overpass query.
Event and statute text is data. It comes from the atlas and reaches the model verbatim; the server's instructions tell the model to treat it as data, never as instructions.
To report a vulnerability, see SECURITY.md.
Development
uv sync --extra dev
uv run pytest # mocked with respx; never touches either service
uv run ruff check .
uv run ruff format --check .
uv run python -m tests.live_check # a few paced calls to both live servicesSee CONTRIBUTING.md, docs/API-NOTES.md for what was observed of each service and when, and docs/DESIGN.md for why the server is shaped this way.
Credits
County boundaries: the Newberry Library's Atlas of Historical County Boundaries (John H. Long, editor), as imported into OpenHistoricalMap and released under CC0. Survey data: the Bureau of Land Management's National PLSS (CadNSDI), a US government work.
License
MIT.
Available Tools
9 toolscache_statusARead-only
Report this session's live calls and cache use. Makes no network call.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description's 'Makes no network call' adds corroborating context, but it repeats what openWorldHint=false already implies and says nothing about the shape or timing of the returned report.
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 short sentences, zero waste, with the core purpose front-loaded before the network-call caveat.
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 no-parameter, read-only diagnostic tool with no output schema, the description is nearly sufficient. It could say slightly more about the report contents, but nothing an agent needs to call it 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?
The tool takes zero parameters, so there is nothing to disambiguate; baseline 4 applies. The schema itself is trivially 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?
States a specific verb and resource ('Report this session's live calls and cache use'), so an agent knows this is a session-level diagnostic. It doesn't explicitly contrast with any sibling, but the geospatial siblings make the distinction obvious.
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?
There is no explicit when-to-use or when-not-to-use guidance; usage is only implied by the description's diagnostic nature. 'Makes no network call' hints that it is cheap to call, but does not tell the agent which situations warrant it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
county_atARead-only
Which county held a point on a date, with the act that made it so.
Records were made by the county that held the place THEN: a 1795 deed for a
farm now in Greene County, Pa., is in Washington County's books. Returns the
holder(s), the full chain of counties for the point, and changes within a
year of the date (boundary_change_within_a_year: check those by hand). A
non-county area "attached to" a county was administered, and recorded, by
that county. "contested" means two governments claimed the spot. The atlas
ends in 2000 and holds no towns or townships. It says where the courthouse
was, not where anyone lived.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | The date of the event: YYYY, YYYY-MM or YYYY-MM-DD. A year or month returns every county that held the point during it. | |
| refresh | No | True asks the service again instead of using the cache. | |
| latitude | Yes | Latitude in decimal degrees, e.g. 39.896. | |
| longitude | Yes | Longitude in decimal degrees; negative in the US. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description adds real behavioral context beyond that: the returned chain of counties, the meaning of 'attached to' and 'contested', the 2000 cutoff, and the caveat that some results need manual verification.
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 purpose is front-loaded in sentence one, and each following sentence carries genuine domain information rather than filler. It is longer than strictly necessary and slightly discursive, but no sentence is wasted.
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 usefully characterizes the return (holder(s), full chain, within-a-year changes) and the tool's scope limits. It omits edge-case behavior such as out-of-range dates or points outside the covered area, which keeps it from a 5.
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 latitude, longitude, date and refresh are already fully documented, including the year/month expansion behavior. The description adds no syntax or format detail beyond the schema, so the baseline 3 applies.
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 opening sentence states a precise verb and resource: which county held a point on a date, plus the act that made it so. That is a specific point-in-time lookup that is inherently distinguishable from siblings like county_history (history of a named county) without needing to name them.
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 gives strong contextual guidance: records were made by the county that held the place THEN, boundary_change_within_a_year should be checked by hand, and the atlas ends in 2000 and holds no towns or townships. It never explicitly names an alternative sibling or states when not to use this tool, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
county_historyARead-only
Every version of one county: when it was created, from what, and each change.
Each version carries its dates, the event ("GREENE created from WASHINGTON."), and the statute. The atlas files counties under their modern state. Use county_at for a particular place: a county's history does not say which version held a given farm.
| Name | Required | Description | Default |
|---|---|---|---|
| state | Yes | The state whose atlas file holds it: today's state, e.g. 'WV' for a county Virginia created in what is now West Virginia. | |
| county | Yes | The county's name, e.g. 'Greene' or 'Greene County'. | |
| refresh | No | True asks the service again instead of using the cache. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, but the description adds real behavioral context: the shape of each returned version (dates, event string, statute) and the non-obvious atlas convention of filing counties under their modern state. It does not cover caching/rate-limit behavior beyond the schema's refresh note.
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 purpose, then a concrete example of a returned event, then the sibling routing rule. Sentences are short and each earns its place, though the telegraphic fragment style ('Each version carries its dates, the event..., and the statute.') borders on clipped.
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-shape burden and discharges it by naming the per-version contents (dates, event, statute). For a single-county lookup, pagination is unlikely to matter, so nothing critical 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 100%, so all three parameters are already documented, including the modern-state convention for 'state' with its own WV example. The description reinforces that convention but adds no syntax, format, or edge-case detail the schema lacks; baseline 3 applies.
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 precise verb+resource: returns every version of one county over time, with creation date, parent source, and each subsequent change, plus the statute citation. It explicitly contrasts itself with the sibling county_at, so an agent can pick correctly without inspecting either 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?
Names the alternative (county_at) and the exact condition that selects it: use county_at for 'a particular place,' because a county's history does not record which version held a given farm. This is an explicit when-to-use-this vs when-to-use-that statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_land_entry_fileARead-only
From a land patent to the case file behind it: which file, where, and the search to run.
The patent proves a conveyance on its signature date; the case file holds the application and, for a homestead, the proof of residence, witnesses and citizenship. Signature date is not purchase or settlement date: the entry came years earlier. For a military warrant the patentee may be an assignee, and the veteran is in the warrant file. Returns arguments for nara-catalog-mcp's search_records_advanced (this server cannot call it).
| Name | Required | Description | Default |
|---|---|---|---|
| state | Yes | The state of the land. | |
| patentee | No | The name on the patent, for a warrant search. | |
| authority | Yes | The patent's Authority, as GLO gives it, e.g. 'May 20, 1862: Homestead EntryOriginal (12 Stat. 392)'. | |
| land_office | No | The land office, e.g. 'Lincoln'. | |
| signature_date | No | The patent's signature date, YYYY-MM-DD. | |
| certificate_number | No | The final certificate or entry number on the patent. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and openWorldHint=false, and the description is consistent (a local lookup that produces query arguments, not a live search). The added disclosure that the tool does not itself perform the NARA search and instead returns arguments is valuable behavioral information beyond the annotations, though the exact return shape is only loosely described.
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 purpose and the patent-vs-case-file distinction are front-loaded, and the relevant caveats follow. It is dense but each sentence carries domain weight (provenance of dates, warrant assignee, the cross-server return contract), with no 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?
Six parameters with no output schema, but the description compensates by explaining what the return is (arguments for search_records_advanced) and by grounding the ambiguous date/name fields. It is complete enough for correct invocation, with only minor gaps around the exact output structure.
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 baseline is 3, and the description earns above that: it clarifies that signature_date is the patent's date and not the entry/purchase/settlement date, that authority is as GLO gives it, and that patentee may be an assignee on a military warrant. These are semantic caveats the schema alone does not convey.
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 transformation: given a land patent, find the entry/case file, its location, and the search to run. The verb+resource (find the land entry file behind a patent) is clear and the domain is distinct from the geographic siblings (plss_locate, county_at). It stops short of naming a sibling to disambiguate against, so 4 rather than 5.
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 gives real usage context: the patent proves a conveyance only on its signature date, and homestead/military-warrant cases require looking beyond the patent. Critically, it states that it returns arguments for nara-catalog-mcp's search_records_advanced and that this server cannot call it, telling the agent how the output is meant to be consumed. No explicit exclusion against siblings, but the routing guidance is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
glo_linksARead-only
Build a link to BLM's General Land Office Records site for the user to open. No network call.
GLO free text matches ANY word and ranks the results, so add a state and a category; there is no surname field. Links to the old site (before July 2026) now land on the home page: cite a patent by its accession number, document number, state and signature date, never by a link.
| Name | Required | Description | Default |
|---|---|---|---|
| state | No | Restrict the search to one state. | |
| document_id | No | Instead of a search, link one record by its GLO document id. | |
| search_text | No | Free text for a GLO search, usually a name and a place. | |
| document_category | No | Restrict the search to one kind of document. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint; the description adds the non-obvious behaviors that matter: no network call, free-text matches ANY word and is ranked, and pre-July-2026 links now degrade to the home page. These are exactly the quirks an agent could not infer from 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?
Roughly 60 words, purpose front-loaded in the first clause with the operational caveat immediately after. Every sentence carries information; the only minor cost is the fragmented line breaks rather than a single flowing statement.
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 still conveys the return artifact ('a link ... for the user to open') and that no network call occurs. Combined with the ranking and citation caveats, an agent has everything needed to build and present the link 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 coverage is 100%, so the baseline is 3, but the description adds real semantic value: it explains that search_text matching is per-word and ranked, that state and document_category should accompany free text, and that document_id links a single record. That goes beyond the neutral schema descriptions.
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 concrete verb and resource: 'Build a link to BLM's General Land Office Records site for the user to open,' and adds 'No network call' to distinguish it from data-fetching siblings like find_land_entry_file. It does not name a sibling explicitly, so it falls short of full sibling 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?
Gives substantive operating guidance: add a state and a category to counter GLO's ANY-word matching, note there is no surname field, and prefer citing a patent by accession/document number/state/signature date rather than a link when it predates July 2026. It never states when to prefer this tool over a sibling such as find_land_entry_file or plss_locate, so there are no explicit alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
parse_legal_descriptionARead-only
Read a Public Land Survey description into its parts. Makes no network call.
Handles GLO's padded 0840N/0390W, T84N R39W, E½NE / E2NE / "E 1/2 NE 1/4",
words ("east half of the northeast quarter"), lots, and several tracts.
Aliquots expand to quarter-quarters (E½NE -> NENE, SENE). A parse is a
reading of a reading: raw keeps the text, and warnings says what was
guessed (a bare section number, an inferred meridian). Pass a tract to
plss_locate to place it on the map.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | A land description as written, e.g. 'E½NE Sec. 18, T84N R39W, 5th P.M.' Several tracts may be separated by ';' or new lines. | |
| state | No | The state, which lets a missing meridian be inferred. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint and openWorldHint=false; the description reinforces this ('Makes no network call') and adds real behavior context beyond annotations: the accepted input dialects, aliquot expansion behavior, and that `warnings` reports guesses while `raw` preserves the original text.
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 core purpose, then format coverage, then output semantics, then routing. Dense but each clause carries information; the format examples are somewhat list-heavy but justified for a parser.
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?
No output schema exists, and the description covers the key return concepts (`raw`, `warnings`) though not their exact structure. Given a two-parameter read-only parser, an agent has enough to invoke it 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 coverage is 100%, so the baseline is 3, but the description adds meaning by enumerating the accepted text formats (0840N/0390W, T84N R39W, E½NE, words, lots, tracts) and explaining that state allows a missing meridian to be inferred.
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?
Specific verb+resource: 'Read a Public Land Survey description into its parts.' It clearly distinguishes itself from siblings like plss_locate by describing the parse step and routing the placement step elsewhere.
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?
Ends with an explicit handoff: 'Pass a tract to plss_locate to place it on the map,' and notes 'Makes no network call,' which frames when to use it locally. No explicit when-not-to-use case, but the alternative is named and the boundary is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plss_from_pointARead-only
Name the Public Land Survey tract at a point: township, range, section, quarter-quarter.
Use it to turn a map pin (a cemetery, a farmstead) into the description a land patent or tract book would carry, then search the land records with it. Finds nothing in states that were never federal public domain.
| Name | Required | Description | Default |
|---|---|---|---|
| refresh | No | True asks the service again instead of using the cache. | |
| latitude | Yes | Latitude in decimal degrees. | |
| longitude | Yes | Longitude in decimal degrees; negative in the US. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the safety/external-service profile is covered. The description adds genuinely non-structured behavior: results only exist in states that were once federal public domain. It does not mention caching or response latency, which the refresh parameter implies.
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 short sentences, front-loaded with what the tool returns, followed by the use case and the failure condition. Every sentence carries information an agent needs; nothing is padded.
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 usefully names the returned fields and the geographic limitation. It stops short of saying what a non-result looks like (null vs. empty vs. error) or whether results are cached, minor gaps for a read-only lookup.
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 latitude, longitude and refresh are fully documented in the schema. The description adds nothing about coordinate format, hemisphere handling, or the cache behavior, so the baseline 3 applies.
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 ('Name the Public Land Survey tract at a point') and enumerates the returned hierarchy (township, range, section, quarter-quarter). The 'from_point' direction is clear enough to separate it from the reverse-lookup sibling plss_locate, though no sibling is named explicitly.
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 a concrete use case ('turn a map pin (a cemetery, a farmstead) into the description a land patent or tract book would carry, then search the land records with it') and a real exclusion: it returns nothing outside federal public-domain states. No alternative tool is named for the reverse direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plss_locateARead-only
Place a federal land description on the map, using BLM's PLSS data.
Returns each tract's centroid and bounding box (lat/lon), BLM's ids, and the precision reached (township, section, aliquot or lot). A tract is not a house: a section's centre is up to half a mile from any point in it, and BLM's modern survey data can differ from the original plat near correction lines and water. To find the county that held it, pass the centroid and the patent's date to county_at; a county today is not the county then.
| Name | Required | Description | Default |
|---|---|---|---|
| state | Yes | The state, as a two-letter code or a name. | |
| refresh | No | True asks the service again instead of using the cache. | |
| description | Yes | The land description, e.g. 'E½NE Sec. 18, T84N R39W, 5th P.M.' The meridian may be left out where the state has only one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, but the description adds substantive, non-obvious context: the precision levels reached (township/section/aliquot/lot), the warning that a centroid can be up to half a mile off, and divergence from the original plat near correction lines and water. It omits caching behavior, though the refresh parameter implies a cache.
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?
Purpose and return values are front-loaded in the first two lines before the caveats, which is good structure. The prose is slightly literary ('A tract is not a house') and leans on metaphor, costing a little economy without losing meaning.
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 usefully enumerates the returned fields (centroid, bbox, BLM ids, precision) and warns about accuracy limits, a key gap for a coordinate tool. It does not address failure modes for unparseable or ambiguous land descriptions, leaving a modest gap.
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 all three parameters (state, description, refresh) are already documented in-schema with examples and defaults. The description adds no syntax or format detail beyond the schema, so the baseline 3 is appropriate.
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 first sentence gives a specific verb and resource ('place a federal land description on the map, using BLM's PLSS data'), which clearly separates it from the reverse-geocoding sibling plss_from_point and the text-only parse_legal_description. It also enumerates what is produced (centroid, bbox, BLM ids, precision).
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 explicitly routes the downstream step to a sibling ('pass the centroid and the patent's date to county_at'), which is clear conditional guidance. However it never states when to prefer this over plss_from_point or parse_legal_description, so the sibling differentiation is one-directional.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
public_land_stateARead-only
Was this state federal public domain, and if not, who granted its land? No network call.
In a state that was never federal land (the 13 colonies, ME, VT, KY, TN, WV, TX, HI), a search for a federal patent finds nothing, and that nil says nothing about the family: first title came from the colony or state, and this says where those records are. Public-land states list their principal meridians, and the special cases (Ohio's surveys, Spanish and French claims).
| Name | Required | Description | Default |
|---|---|---|---|
| state | Yes | A state, as a two-letter code or a name. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true and openWorldHint=false already declared, the description reinforces this with 'No network call' and goes further by describing what a result contains (principal meridians for public-land states, Ohio's surveys, Spanish and French claims). It does not discuss error cases for invalid state input, but adds real context beyond 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 key question is front-loaded and each following sentence carries information about why a nil result occurs and what the answer includes. Slightly verbose and the mid-sentence line break in the first paragraph is awkward, but no sentence is wasted.
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 must convey the return content itself, and it does: state status, where the first-title records live, principal meridians, and special survey/claim cases. It could be marginally more explicit about the response shape, but an agent has enough to call it and interpret results 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?
Only one parameter with 100% schema coverage ('A state, as a two-letter code or a name'), so the schema fully documents the input. The description adds no input-format detail beyond what the schema already states, making the baseline 3 appropriate.
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 opening question states exactly what the tool answers: whether a state was federal public domain and, if not, who granted its land. This is clearly distinct from coordinate/PLSS siblings like plss_locate and plss_from_point, and the 'No network call' note signals it is a local reference lookup.
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 explains the situation in which the tool matters: in a never-federal state a patent search comes back nil, and that nil says nothing about the family, so the agent needs the state-level provenance instead. It does not explicitly name sibling alternatives or state exclusions (e.g. 'do not use for PLSS coordinates'), so it stops short of a 5.
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.
9 tool updates
v0.1.0- First observed
cache_status - First observed
county_at - First observed
county_history - First observed
find_land_entry_file - First observed
glo_links - First observed
parse_legal_description - First observed
plss_from_point - First observed
plss_locate - First observed
public_land_state
TDQS
Scored across 9 tools
Tools are largely distinct: county_at (point-in-time jurisdiction) vs county_history (a county's versions) is explicitly differentiated, and plss_locate vs plss_from_point are inverse operations. There is mild overlap between parse_legal_description and plss_locate since both touch PLSS text, but the descriptions clarify that one parses and the other geolocates.
All names use snake_case with a mostly predictable verb/noun or noun/noun structure (plss_locate, county_at, parse_legal_description). A few names are static noun phrases (county_history, cache_status, glo_links) rather than action-oriented, a minor deviation but still readable and consistent in casing.
Nine tools is well-scoped for a land-research domain, with each tool covering a distinct capability (state context, PLSS geocoding both ways, county resolution, parsing, patent-to-file, link building, cache status). Nothing feels extraneous or missing at the count level.
The surface covers the PLSS-to-county research lifecycle well, including both directional geocoding, temporal county resolution, description parsing, GLO linking, and a hand-off to NARA for case files. Minor gaps like a direct patent/record lookup are delegated to companion servers by design, which is reasonable.
Maintenance
Related MCP Connectors
Look up Indian land parcels by survey number or lat/lon. Returns parcel boundaries.
Read-only OpenHeritage search for genealogy and cultural heritage records.
Official US government offices and pages for property, land and GIS questions, link-checked.
Property intelligence: 180M+ US parcels — lookup, search, owners, hazards, permits, deeds.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables searching and querying Lake County, Illinois open geospatial data (parcels, addresses, zoning) through ArcGIS Feature Services.245 npmMIT
- FlicenseNot gradedqualityCmaintenanceRead-only MCP server providing direct, credentialed access to parcel data via Regrid and county ArcGIS sources, with tools for querying by point, owner, size, and county.-
- FlicenseNot gradedqualityBmaintenanceEnables querying public ArcGIS REST services for county/state parcel data, GIS layer identification, and USGS elevation without API keys.-
- AlicenseAqualityAmaintenanceEnables users to search and browse US National Archives Catalog records, read OCR text, citizen transcriptions, tags, and comments, and download page images for genealogical or historical research. It also supports advanced filtered searches and searching within contributed document text while remaining read-only except for saving page images locally.18415 PyPIMIT