Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
作者提供的说明(英文原文)
Owner and APN lookup across 515 US counties (509 ArcGIS endpoints). No API key needed.
这三项永远不会合并成一个分数:意见、测量和人气是不同的东西。
我们还没有为它写通俗的介绍。下面是我们从注册中心读取到的事实。
选择你使用的 AI 应用,然后复制设置。
你需要
你用的是哪个应用?
在上方选择你的应用。我们会记住它,下次按钮会显示“安装到 …”。
打开 Claude Desktop → Settings → Developer → Edit Config,把下面的内容粘贴到 claude_desktop_config.json
{
"mcpServers": {
"atlas": {
"command": "npx",
"args": [
"-y",
"@urbankitstudio/mcp-atlas"
]
}
}
}在终端中运行这条命令
claude mcp add atlas -- npx -y @urbankitstudio/mcp-atlas粘贴到项目中的 .cursor/mcp.json,或 ~/.cursor/mcp.json
{
"mcpServers": {
"atlas": {
"command": "npx",
"args": [
"-y",
"@urbankitstudio/mcp-atlas"
]
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
粘贴到项目中的 .vscode/mcp.json
{
"servers": {
"atlas": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@urbankitstudio/mcp-atlas"
]
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
这个服务器在你的电脑上运行,而 ChatGPT 只能连接互联网上的服务器。请选择其他应用。
你的选择通过 Cookie 保存在这台设备上,无需账户。
这些设置是根据作者在注册中心的条目生成的。如果 README 的写法不同,请以 README 为准。
它在你的电脑上运行;安装后,工具列表会显示在你的 AI 应用中。
我们检查的是任何人都能看到的信息;我们没有阅读代码。不适用的检查项不计入总数。 · 检查于 2026年11月9日
注册名称已通过 GitHub 账户 urbankitstudio 验证,该账户拥有此仓库
我们还没有从 GitHub 读取这个仓库
我们还没有从 GitHub 读取这个仓库
它在你的电脑上运行,没有互联网端点
在你的电脑上运行,改用本地设置
它在你的电脑上运行;我们只能读取互联网端点的工具列表
与注册中心里这个分类中所有活跃的服务器比较。只有当发布者拥有该仓库时,星标数才计入。
它在 1 项适用的基础检查中通过了 1 项。我们没有阅读代码。在添加密钥或令牌之前,请先看看这个服务器要求哪些权限,并使用只具备所需权限的密钥。
注册中心没有列出必需的密钥,不过有些服务器会在首次使用时要求你登录。
它在你的电脑上运行。你的 AI 应用会在需要时启动它,数据不会经过作者的服务器(除非它自己调用在线服务)。
GitHub 仓库最后更新于–,最新版本(0.3.11)于6天前进入注册中心。
支持 MCP 的应用,例如 Claude Desktop、Claude Code、Cursor 和 VS Code。你的电脑上还需要有 Node.js。
同一分类中有:Spec Driven Development, Remote Desktop Commander, AikenDewit
同一分类中其他作者的服务器,按星标数排序。
如何看卡片:↓ 每周下载量i★ GitHub 星标i三大支柱:评价 · 检查 · 使用情况i更新 = 最新版本发布到注册中心的时间i
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Read, add and schedule your AikenDewit tasks and today's top three from ChatGPT or Claude.
按原文从作者的仓库复制。PopNx MCP 没有审查或背书其内容。HTML、图片和脚本已被移除。链接会离开本站。
Query the parcel ArcGIS REST endpoints of 515 counties across 51 US states (50 states plus DC), 509 endpoints total, for owner, APN and address lookup via the Model Context Protocol (MCP).
An MCP server that gives AI assistants direct access to UrbanKit Studio's atlas of manually verified county parcel GIS services. Ask Claude or Cursor to find the ArcGIS REST endpoint for any covered county, get the exact owner-search query URL, and look up parcel data — without needing to know anything about ArcGIS REST API conventions.
Coverage: 515 counties across 51 US states (50 states plus DC), 509 endpoints, 509 of them live (atlas 0.7.2). 481 of the counties have an endpoint; for the other 34 the atlas records why not (see "A county we cannot serve" below).
Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": { "mcp-atlas": { "command": "npx", "args": ["-y", "@urbankitstudio/mcp-atlas"] } } }
Add to .cursor/mcp.json in your project root (or ~/.cursor/mcp.json globally):
{
"mcpServers": { "mcp-atlas": { "command": "npx", "args": ["-y", "@urbankitstudio/mcp-atlas"] } } }
npm install -g @urbankitstudio/mcp-atlas
Then use mcp-atlas as the command instead of npx -y @urbankitstudio/mcp-atlas.
The first four tools are one county pipeline, and what separates them is how precisely you can already name the county. The fifth, get_city_datasets, is separate: it answers about a city, not a county.
| You have | Use | You get |
|---|---|---|
| A state, or nothing | list_counties | Which counties are covered, and whether owner search works there. No URLs. |
| A vague, misspelled or FIPS reference | find_county | Every county that reference matches, named, each with its record |
| An exact state and county | get_parcel_endpoint | That one county's endpoint URL, layer, fields and sample query |
| A county and an owner's name | build_owner_query | A runnable URL that searches for that name |
| A city, and optionally a street | get_city_datasets | That city's code-violation, building-permit and zoning-case datasets, each with a runnable query URL |
find_county and get_parcel_endpoint return the same per-county record. They differ in how you address the county: find_county accepts an uncertain reference and may come back with several candidates, get_parcel_endpoint takes an exact pair and answers about one. If you already know the county, skip find_county.
This server never executes a query and returns no parcel records. It tells you the URL to fetch; fetching it is yours to do.
find_county, get_parcel_endpoint and build_owner_query give one answer for a county with no endpoint to hand back, the same text the hosted UrbanKit MCP server, its REST API and the uks CLI give. It comes from coverageAnswer() in @urbankitstudio/atlas 0.6.38:
Both end with a free request for the county: a ready body for request_county on the hosted MCP server or POST https://urbankitstudio.com/api/atlas/request. Requesting does not promise we add the county. list_counties still lists only the counties we serve.
list_countiesBrowse coverage. Answers "is this county covered?" and "what can I search there?" — one line per county, with no endpoint URLs or field names.
| Parameter | Type | Required | Description |
|---|---|---|---|
state | string | No | Two-letter abbreviation (IL) or full name (Illinois) |
Example prompt: "List all covered counties in Illinois"
Example output:
ST | County | Slug | Coverage
IL | Kane | kane-county | owner+APN IL | Cook | cook-county | APN only IL | DuPage | dupage-county | owner+APN ...
What each Coverage label promises:
| Label | Meaning |
|---|---|
owner+APN | build_owner_query returns a URL for at least one endpoint |
APN only (county publishes no owner name) | A reviewed record says the county serves no usable owner name |
APN only (owner name withheld) | A reviewed record says owner names are withheld: by a statute, by the county's terms, or while we ask the county |
location queries only | No endpoint answers attribute searches; parcels are reached by geometry, which also returns owner fields |
APN only (owner column not searchable) | An owner column exists but the county marks it unsearchable by name; a parcel-id or location query returns it |
APN only (confidential flag incomplete) | An owner column exists, but the layer's confidential-owner flag is malformed, so no owner query is offered |
APN only | No endpoint documents an owner column |
find_countyResolves a reference you cannot state exactly. Fuzzy-matches a partial or misspelled name, a "County State" phrase, or a 5-digit FIPS code against every covered county, and names each county it matched so an ambiguous reference comes back as a list to choose from. Each match carries that county's record: endpoint URLs, searchable field names, owner field, sample query, license.
| Parameter | Type | Required | Description |
|---|---|---|---|
query | string | Yes | County name (Kane), name+state (Kane IL), or FIPS (17089) |
Example prompt: "Find the parcel endpoint for Kane County Illinois"
get_parcel_endpointThe default lookup once the county is known. Returns the full ArcGIS REST URL, layer index, searchable fields, owner field (or why no owner query is offered), the county's Scope: predicate when the layer is shared statewide or regionally, a generic sample ?where=…&f=json query and the UrbanKit deep-link for one county. For a named owner, use build_owner_query rather than editing the sample query by hand. On a layer that flags confidential owners it prints the Confidential flag: exclusion to AND into any query of your own, and prints its own sample owner query in place of the atlas's, so the one sample shown carries this server's clauses.
| Parameter | Type | Required | Description |
|---|---|---|---|
state | string | Yes | Two-letter abbreviation or full name |
county | string | Yes | County name (Kane or Kane County) |
Example prompt: "Give me the ArcGIS REST endpoint for Cook County Illinois"
build_owner_queryThe only tool that searches for a named owner. Fills a person or company name into the county's verified owner/taxpayer field as UPPER(field) LIKE UPPER('%NAME%'), a case-insensitive partial match, and returns a URL you can fetch or open. On a shared statewide or regional layer (Connecticut's regional composites, for example) the county's scope predicate is ANDed in front, as (scope) AND UPPER(field) LIKE …, so only that county's rows come back.
Some layers publish an owner whose record must not be shown, and flag it in a column beside the owner: Texas Tax Code §25.025 lets peace officers, judges, family-violence victims and others keep their home address confidential, and Harris and Collin mark those accounts (Ector carries a forward guess). On such a layer the query excludes flagged rows, as (…) AND UPPER(CAST(flag AS VARCHAR(255))) NOT LIKE '%Y%', a contains test for every flag value (Harris packs one flag per ownership slot, YNNNNNNNNN). SQL UPPER matches the atlas's uppercase rule on ASCII only, so each of the 17 non-ASCII characters whose uppercase holds an ASCII letter (ß, a dotless i, the fi ligatures, ẙ and the like) gets a clause of its own when it shares a letter with a value: CAST(flag AS VARCHAR(255)) NOT LIKE '%ẙ%' drops a cell holding one. Those clauses still lean on the county's database (an UPPER that maps a-z to A-Z, a LIKE that reads past an embedded NUL, no cell cut off at the 255-character cast, one encoding for cell and literal), so the query ends with a clause that does not: flag IN (…), the exact raw cells the atlas lists as safe (confidentialFlag.safeValues: Harris's blank and N runs, each 10 characters; Collin F; Ector 0). A row stays only when the database itself says its cell equals one of those values, under its own comparison rules, so a NUL, a cut-off cell or a value nobody has reviewed drops out. A backend that ignores trailing spaces or case also keeps the same safe value padded differently or in another case; none of those holds a flag value. A flag without safe values, or with one that holds a marker, offers no owner query. On 2026-10-26 the IN clause kept exactly the rows the contains clauses keep on all three layers (Harris 1,541,671, Collin 435,783, Ector 77,042), and those lists were each layer's complete distinct values. A value longer than one character is a contains test too, which deliberately excludes more than the atlas's trimmed-equality rule: for SEALED, the cells SEALED and UNSEALED drop out as well. The cast lets one form serve a text or an integer column, and UPPER on both sides compares the flag without regard to case. A row with no flag recorded (NULL) counts as flagged and drops out. The flag column comes back with each row; never show or pass on a row whose flag is set.
An endpoint is refused, with the reason, rather than handed a query that finds nothing, hangs, or serves confidential owners:
A refusal that points to a location, parcel-id or address read also prints the layer's Confidential flag: line, and on a flagged layer its advice follows the flag. With a well-formed flag, the read must request the flag column in outFields and keep a row only when its flag cell is exactly one of the safe values and contains no flag value, dropping every other row (a missing or NULL cell included); a layer with no attribute search takes no where clause, so that filtering is the reader's, and its Confidential flag: line gives that row rule in place of "AND this into every query". With an incomplete flag, the refusal advises no read at all: do not read owner fields on that layer. find_county and get_parcel_endpoint carry the same advice in their Confidential flag: line, and their Owner line says why no owner query is offered.
Every free-text argument of every tool refuses control characters (CR, LF, TAB, NUL and the rest of U+0000 to U+001F, U+007F, and the C1 controls U+0080 to U+00
只显示了开头部分;其余内容请在仓库中阅读