[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"blog-\u002Fblog\u002Ftownship-america-mcp-server-plss-ai-agents":3},{"id":4,"title":5,"body":6,"cover":690,"date":691,"description":692,"draft":693,"extension":694,"meta":695,"navigation":715,"path":716,"seo":717,"stem":718,"tags":719,"__hash__":726},"blog\u002Fblog\u002Ftownship-america-mcp-server-plss-ai-agents.md","Township America MCP Server: PLSS Lookup for AI Agents",{"type":7,"value":8,"toc":681},"minimark",[9,18,21,26,33,44,48,57,86,89,92,96,103,128,134,153,160,337,354,358,361,368,371,429,432,588,600,603,607,610,625,631,637,640,644,647,650,654,674,677],[10,11,12,13,17],"p",{},"AI land tools have a gap you hit the moment they get useful. An agent can read a lease, parse ",[14,15,16],"strong",{},"T49N R73W Sec 22, 6th Principal Meridian"," out of the legal description, and reason about what it means — but ask it where that parcel actually sits, and it guesses. The coordinates aren't in its training data. The PLSS MCP server closes that gap: it gives any AI agent a direct line to convert a legal description to latitude\u002Flongitude, mid-conversation, against real survey data.",[10,19,20],{},"This post covers what the server does, how to install it in a few minutes, and where it earns its place in AI-assisted title and APD work.",[22,23,25],"h2",{"id":24},"the-missing-data-layer-in-ai-land-tools","The missing data layer in AI land tools",[10,27,28,29,32],{},"A model can explain that ",[14,30,31],{},"T49N R73W Sec 22"," is one square mile in Campbell County, Wyoming. It cannot tell you the corner coordinates, because the BLM survey record that fixes them was never something it memorized. So every AI land assistant ends up bolted to a converter through custom glue code — an API wrapper, a function-calling shim, a context switch to another tab.",[10,34,35,36,43],{},"The ",[37,38,42],"a",{"href":39,"rel":40},"https:\u002F\u002Fmodelcontextprotocol.io",[41],"nofollow","Model Context Protocol"," removes that glue. MCP is an open standard for handing tools to an AI agent in a way it can call on its own. The Township America PLSS MCP server speaks that protocol, so the agent gains coordinate lookup the same way it gains any other tool — declared once, then available for the rest of the session.",[22,45,47],{"id":46},"what-the-plss-mcp-server-does","What the PLSS MCP server does",[10,49,50,51,56],{},"The server exposes three tools over stdio transport. Each one is a thin door onto the same survey data behind the ",[37,52,55],{"href":53,"rel":54},"https:\u002F\u002Ftownshipamerica.com\u002Fapi",[41],"Township America API",":",[58,59,60,70,78],"ul",{},[61,62,63,69],"li",{},[14,64,65],{},[66,67,68],"code",{},"plss_to_latlon"," — takes a legal description and returns latitude\u002Flongitude plus the parcel boundary.",[61,71,72,77],{},[14,73,74],{},[66,75,76],{},"latlon_to_plss"," — takes a coordinate pair and returns the Section-Township-Range that contains it.",[61,79,80,85],{},[14,81,82],{},[66,83,84],{},"batch_plss_convert"," — takes up to 100 descriptions in one call, for well tables and title runs.",[10,87,88],{},"All three read BLM GCDB source records and cover all 30 PLSS states and 37 principal meridians. The agent picks the tool; you don't write the request.",[10,90,91],{},"![Diagram of an AI agent calling the three PLSS MCP tools — plss_to_latlon, latlon_to_plss, batch_plss_convert — which resolve against BLM survey data and return coordinates](PLACEHOLDER: diagram-flow — navy\u002Famber, AI agent box on the left connected by labeled arrows to three tool nodes, each resolving to a BLM survey data layer returning lat\u002Flong, no people)",[22,93,95],{"id":94},"install-and-configure-in-a-few-minutes","Install and configure in a few minutes",[10,97,98,99,102],{},"The server ships with the Python package. Install it with the ",[66,100,101],{},"mcp"," extra:",[104,105,110],"pre",{"className":106,"code":107,"language":108,"meta":109,"style":109},"language-bash shiki shiki-themes material-theme-lighter github-light github-dark","pip install townshipamerica[mcp]\n","bash","",[66,111,112],{"__ignoreMap":109},[113,114,117,121,125],"span",{"class":115,"line":116},"line",1,[113,118,120],{"class":119},"sbgvK","pip",[113,122,124],{"class":123},"s_sjI"," install",[113,126,127],{"class":123}," townshipamerica[mcp]\n",[10,129,130,131,56],{},"If you'd rather not install anything, run it on demand with ",[66,132,133],{},"uvx",[104,135,137],{"className":106,"code":136,"language":108,"meta":109,"style":109},"uvx --from townshipamerica[mcp] townshipamerica-mcp\n",[66,138,139],{"__ignoreMap":109},[113,140,141,143,147,150],{"class":115,"line":116},[113,142,133],{"class":119},[113,144,146],{"class":145},"stzsN"," --from",[113,148,149],{"class":123}," townshipamerica[mcp]",[113,151,152],{"class":123}," townshipamerica-mcp\n",[10,154,155,156,159],{},"Then register it with your AI agent. In Claude Desktop or Claude Code, add the server to a ",[66,157,158],{},".mcp.json"," file:",[104,161,165],{"className":162,"code":163,"language":164,"meta":109,"style":109},"language-json shiki shiki-themes material-theme-lighter github-light github-dark","{\n  \"mcpServers\": {\n    \"townshipamerica\": {\n      \"command\": \"uvx\",\n      \"args\": [\"--from\", \"townshipamerica[mcp]\", \"townshipamerica-mcp\"],\n      \"env\": {\n        \"TOWNSHIP_AMERICA_API_KEY\": \"ta_live_your_key_here\"\n      }\n    }\n  }\n}\n","json",[66,166,167,173,192,208,233,277,291,313,319,325,331],{"__ignoreMap":109},[113,168,169],{"class":115,"line":116},[113,170,172],{"class":171},"sP7_E","{\n",[113,174,176,180,184,187,189],{"class":115,"line":175},2,[113,177,179],{"class":178},"s39Yj","  \"",[113,181,183],{"class":182},"sseR_","mcpServers",[113,185,186],{"class":178},"\"",[113,188,56],{"class":171},[113,190,191],{"class":171}," {\n",[113,193,195,198,202,204,206],{"class":115,"line":194},3,[113,196,197],{"class":178},"    \"",[113,199,201],{"class":200},"sZMiF","townshipamerica",[113,203,186],{"class":178},[113,205,56],{"class":171},[113,207,191],{"class":171},[113,209,211,214,218,220,222,226,228,230],{"class":115,"line":210},4,[113,212,213],{"class":178},"      \"",[113,215,217],{"class":216},"srdBf","command",[113,219,186],{"class":178},[113,221,56],{"class":171},[113,223,225],{"class":224},"sjJ54"," \"",[113,227,133],{"class":123},[113,229,186],{"class":224},[113,231,232],{"class":171},",\n",[113,234,236,238,241,243,245,248,250,253,255,258,260,263,265,267,269,272,274],{"class":115,"line":235},5,[113,237,213],{"class":178},[113,239,240],{"class":216},"args",[113,242,186],{"class":178},[113,244,56],{"class":171},[113,246,247],{"class":171}," [",[113,249,186],{"class":224},[113,251,252],{"class":123},"--from",[113,254,186],{"class":224},[113,256,257],{"class":171},",",[113,259,225],{"class":224},[113,261,262],{"class":123},"townshipamerica[mcp]",[113,264,186],{"class":224},[113,266,257],{"class":171},[113,268,225],{"class":224},[113,270,271],{"class":123},"townshipamerica-mcp",[113,273,186],{"class":224},[113,275,276],{"class":171},"],\n",[113,278,280,282,285,287,289],{"class":115,"line":279},6,[113,281,213],{"class":178},[113,283,284],{"class":216},"env",[113,286,186],{"class":178},[113,288,56],{"class":171},[113,290,191],{"class":171},[113,292,294,297,301,303,305,307,310],{"class":115,"line":293},7,[113,295,296],{"class":178},"        \"",[113,298,300],{"class":299},"swQdS","TOWNSHIP_AMERICA_API_KEY",[113,302,186],{"class":178},[113,304,56],{"class":171},[113,306,225],{"class":224},[113,308,309],{"class":123},"ta_live_your_key_here",[113,311,312],{"class":224},"\"\n",[113,314,316],{"class":115,"line":315},8,[113,317,318],{"class":171},"      }\n",[113,320,322],{"class":115,"line":321},9,[113,323,324],{"class":171},"    }\n",[113,326,328],{"class":115,"line":327},10,[113,329,330],{"class":171},"  }\n",[113,332,334],{"class":115,"line":333},11,[113,335,336],{"class":171},"}\n",[10,338,339,340,342,343,347,348,353],{},"The server reads your ",[66,341,300],{}," from the environment — the same key that runs the ",[37,344,346],{"href":53,"rel":345},[41],"REST API"," and the ",[37,349,352],{"href":350,"rel":351},"https:\u002F\u002Ftownshipamerica.com\u002Fblog\u002Fpython-sdk-plss-pip-install-townshipamerica",[41],"Python SDK",". Restart the agent, and the three PLSS tools show up in its tool list. That's the whole setup.",[22,355,357],{"id":356},"a-real-lookup-mid-conversation","A real lookup, mid-conversation",[10,359,360],{},"Here is the part that changes the workflow. You ask your assistant a question in plain language, and it runs the conversion itself instead of handing you a description to look up later.",[10,362,363,364],{},"You: ",[365,366,367],"em",{},"\"Where is T49N R73W Sec 22 in Wyoming, and which county?\"",[10,369,370],{},"The agent calls the tool:",[104,372,374],{"className":162,"code":373,"language":164,"meta":109,"style":109},"plss_to_latlon({\n  \"description\": \"T49N R73W Sec 22\",\n  \"meridian\": \"6th Principal Meridian\"\n})\n",[66,375,376,384,403,421],{"__ignoreMap":109},[113,377,378,382],{"class":115,"line":116},[113,379,381],{"class":380},"su5hD","plss_to_latlon(",[113,383,172],{"class":171},[113,385,386,388,391,393,395,397,399,401],{"class":115,"line":175},[113,387,179],{"class":178},[113,389,390],{"class":182},"description",[113,392,186],{"class":178},[113,394,56],{"class":171},[113,396,225],{"class":224},[113,398,31],{"class":123},[113,400,186],{"class":224},[113,402,232],{"class":171},[113,404,405,407,410,412,414,416,419],{"class":115,"line":194},[113,406,179],{"class":178},[113,408,409],{"class":182},"meridian",[113,411,186],{"class":178},[113,413,56],{"class":171},[113,415,225],{"class":224},[113,417,418],{"class":123},"6th Principal Meridian",[113,420,312],{"class":224},[113,422,423,426],{"class":115,"line":210},[113,424,425],{"class":171},"}",[113,427,428],{"class":380},")\n",[10,430,431],{},"And gets back a structured result it can fold into its answer:",[104,433,435],{"className":162,"code":434,"language":164,"meta":109,"style":109},"{\n  \"latitude\": 44.2871,\n  \"longitude\": -105.6433,\n  \"county\": \"Campbell\",\n  \"state\": \"WY\",\n  \"meridian\": \"6th Principal Meridian\",\n  \"geometry\": { \"type\": \"Polygon\", \"coordinates\": [ ... ] }\n}\n",[66,436,437,441,457,473,493,513,531,584],{"__ignoreMap":109},[113,438,439],{"class":115,"line":116},[113,440,172],{"class":171},[113,442,443,445,448,450,452,455],{"class":115,"line":175},[113,444,179],{"class":178},[113,446,447],{"class":182},"latitude",[113,449,186],{"class":178},[113,451,56],{"class":171},[113,453,454],{"class":216}," 44.2871",[113,456,232],{"class":171},[113,458,459,461,464,466,468,471],{"class":115,"line":194},[113,460,179],{"class":178},[113,462,463],{"class":182},"longitude",[113,465,186],{"class":178},[113,467,56],{"class":171},[113,469,470],{"class":216}," -105.6433",[113,472,232],{"class":171},[113,474,475,477,480,482,484,486,489,491],{"class":115,"line":210},[113,476,179],{"class":178},[113,478,479],{"class":182},"county",[113,481,186],{"class":178},[113,483,56],{"class":171},[113,485,225],{"class":224},[113,487,488],{"class":123},"Campbell",[113,490,186],{"class":224},[113,492,232],{"class":171},[113,494,495,497,500,502,504,506,509,511],{"class":115,"line":235},[113,496,179],{"class":178},[113,498,499],{"class":182},"state",[113,501,186],{"class":178},[113,503,56],{"class":171},[113,505,225],{"class":224},[113,507,508],{"class":123},"WY",[113,510,186],{"class":224},[113,512,232],{"class":171},[113,514,515,517,519,521,523,525,527,529],{"class":115,"line":279},[113,516,179],{"class":178},[113,518,409],{"class":182},[113,520,186],{"class":178},[113,522,56],{"class":171},[113,524,225],{"class":224},[113,526,418],{"class":123},[113,528,186],{"class":224},[113,530,232],{"class":171},[113,532,533,535,538,540,542,545,547,550,552,554,556,559,561,563,565,568,570,572,574,578,581],{"class":115,"line":293},[113,534,179],{"class":178},[113,536,537],{"class":182},"geometry",[113,539,186],{"class":178},[113,541,56],{"class":171},[113,543,544],{"class":171}," {",[113,546,225],{"class":178},[113,548,549],{"class":200},"type",[113,551,186],{"class":178},[113,553,56],{"class":171},[113,555,225],{"class":224},[113,557,558],{"class":123},"Polygon",[113,560,186],{"class":224},[113,562,257],{"class":171},[113,564,225],{"class":178},[113,566,567],{"class":200},"coordinates",[113,569,186],{"class":178},[113,571,56],{"class":171},[113,573,247],{"class":171},[113,575,577],{"class":576},"srjyR"," ...",[113,579,580],{"class":171}," ]",[113,582,583],{"class":171}," }\n",[113,585,586],{"class":115,"line":315},[113,587,336],{"class":171},[10,589,590,591,593,594,599],{},"No copy-paste, no second tab. The reverse works the same way: hand the agent a coordinate pair from a field GPS unit and ",[66,592,76],{}," returns the Section-Township-Range that the permit needs. For an explanation of why the meridian has to be named — and how reading a description like this works — the ",[37,595,598],{"href":596,"rel":597},"https:\u002F\u002Ftownshipamerica.com\u002Flearn\u002Fplss",[41],"PLSS reference"," covers it.",[10,601,602],{},"![AI chat interface showing the result for T49N R73W Sec 22, 6th Principal Meridian — latitude, longitude, and Campbell County returned inline](PLACEHOLDER: ui-showcase — dark-mode chat panel, navy\u002Famber accents, a PLSS tool result rendered inline with lat\u002Flong and county, no people)",[22,604,606],{"id":605},"where-it-fits-ai-title-and-apd-workflows","Where it fits: AI title and APD workflows",[10,608,609],{},"The agent tools matter most where someone is already building an assistant for land professionals.",[10,611,612,615,616,618,619,624],{},[14,613,614],{},"AI-assisted APD filing."," A drafting agent reads the well plan, extracts each Section-Township-Range, and calls ",[66,617,84],{}," to verify coordinates before the BLM Form 3160-3 goes out — the same coordinate step ",[37,620,623],{"href":621,"rel":622},"https:\u002F\u002Ftownshipamerica.com\u002Fblog\u002Fhow-landmen-use-plss-api-apd-workflows",[41],"land departments automate with the API",", now driven by the agent.",[10,626,627,630],{},[14,628,629],{},"Title examination co-pilot."," An examiner pastes a chain of aliquot parts; the assistant resolves each one to a parcel and flags the descriptions that don't close.",[10,632,633,636],{},[14,634,635],{},"Lease management agent."," A pipeline ingesting new leases reverse-geocodes coordinates back to legal descriptions for the database of record, with no human in the loop.",[10,638,639],{},"In each case the agent decides when a lookup is needed. The server just answers.",[22,641,643],{"id":642},"the-landman-ai-landscape-and-why-the-timing-matters","The landman AI landscape, and why the timing matters",[10,645,646],{},"AI title automation is the loudest conversation in the land business right now. Landman.ai, TitleTrackr, and Tracts are all racing to read runsheets and draft title opinions with language models. They are good at the reasoning. They share the same blind spot: none of them resolve a legal description to a real coordinate on their own.",[10,648,649],{},"That is the layer the PLSS MCP server supplies. Drop it into any of those workflows — or a custom AI agent of your own — and the reasoning gets a verified location underneath it. No competitor has shipped an AI-agent PLSS integration on an open standard, which makes this the moment to build on it rather than wait.",[22,651,653],{"id":652},"get-a-key-and-start-building","Get a key and start building",[10,655,656,657,661,662,667,668,673],{},"The PLSS MCP server is one install and one environment variable away from running inside your AI agent today. Grab an API key from the ",[37,658,660],{"href":53,"rel":659},[41],"API page"," — the same key powers the REST endpoints, the Python SDK, and the MCP server. If you'd rather check the math by hand first, the ",[37,663,666],{"href":664,"rel":665},"https:\u002F\u002Ftownshipamerica.com\u002Fplss-converter",[41],"PLSS converter"," resolves any description in the browser, and ",[37,669,672],{"href":670,"rel":671},"https:\u002F\u002Ftownshipamerica.com\u002Fpricing",[41],"pricing"," lays out the plans for moving from a test key to production volume.",[10,675,676],{},"Three tools, one install, all 30 PLSS states — and your agent stops guessing where the parcel is.",[678,679,680],"style",{},"html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .stzsN, html code.shiki .stzsN{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sseR_, html code.shiki .sseR_{--shiki-light:#9C3EDA;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZMiF, html code.shiki .sZMiF{--shiki-light:#E2931D;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .swQdS, html code.shiki .swQdS{--shiki-light:#E53935;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .srjyR, html code.shiki .srjyR{--shiki-light:#90A4AE;--shiki-light-font-style:inherit;--shiki-default:#B31D28;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic}",{"title":109,"searchDepth":175,"depth":175,"links":682},[683,684,685,686,687,688,689],{"id":24,"depth":175,"text":25},{"id":46,"depth":175,"text":47},{"id":94,"depth":175,"text":95},{"id":356,"depth":175,"text":357},{"id":605,"depth":175,"text":606},{"id":642,"depth":175,"text":643},{"id":652,"depth":175,"text":653},null,"2026-06-04T10:00:00Z","The PLSS MCP server gives any AI agent a tool to convert legal descriptions to coordinates mid-conversation — three tools, one install, all 30 PLSS states.",false,"md",{"author":696,"category":697,"hero_image":698,"faqs":699},"Township America","product","https:\u002F\u002Fhswwubqgpp6hnvaz.public.blob.vercel-storage.com\u002Fimages\u002Fblog\u002F2026-06\u002Fd50768e7-d01b-429c-b2bb-23d800cba87a.jpeg",[700,703,706,709,712],{"question":701,"answer":702},"What is the Township America PLSS MCP server?","It is a Model Context Protocol server that exposes three PLSS tools to any compatible AI agent: plss_to_latlon, latlon_to_plss, and batch_plss_convert. The agent can convert a legal description to latitude\u002Flongitude, run the reverse lookup, or process up to 100 descriptions per call — without leaving the conversation. It ships in the townshipamerica Python package and runs over stdio.",{"question":704,"answer":705},"Which AI agents work with the PLSS MCP server?","Any MCP-compatible client. That includes Claude Desktop, Claude Code, and custom agents built on an MCP framework. You register the server once in the client's config, and the three PLSS tools appear alongside the agent's other tools.",{"question":707,"answer":708},"How do I install the PLSS MCP server?","Run pip install townshipamerica[mcp], then start it with townshipamerica-mcp, or run it without installing using uvx --from townshipamerica[mcp] townshipamerica-mcp. Point your MCP client at that command in a .mcp.json file and set the TOWNSHIP_AMERICA_API_KEY environment variable.",{"question":710,"answer":711},"Do I need an API key to use the MCP server?","Yes. The MCP server resolves descriptions through the Township America API, so it reads your TOWNSHIP_AMERICA_API_KEY from the environment. The same key works across the REST API, the Python SDK, and the MCP server. You can get one from the API page.",{"question":713,"answer":714},"How is the MCP server different from the REST API?","They share the same data and the same key. The REST API is what you call from your own code. The MCP server wraps that capability as agent tools, so an AI assistant can decide to run a PLSS lookup on its own, mid-task, rather than you writing the HTTP call yourself.",true,"\u002Fblog\u002Ftownship-america-mcp-server-plss-ai-agents",{"title":5,"description":692},"blog\u002Ftownship-america-mcp-server-plss-ai-agents",[720,721,722,723,724,725],"PLSS","MCP","AI","API","Developers","Landman","R6O7pQtB-cfV47JfFKsLyG5KGcFA_nJ6626mgeG42LI"]