关于 mcp-atlas
mcp-atlas 为 AI 助手提供经人工核验的美国县级地块 GIS 服务目录,面向需要查找产权人、APN 或地址数据的用户。它生成 ArcGIS REST 查询 URL,但不执行查询或返回地块记录。
主要功能
- 01浏览县级覆盖范围和产权人搜索支持
- 02模糊匹配县名、州名或 FIPS
- 03获取县级 ArcGIS REST 端点与字段
- 04生成产权人名称查询 URL
- 05查找城市违规、建筑许可和分区数据集
适用场景
- 01确认某县是否支持产权人查询
- 02为县名或 FIPS 查找地块端点
- 03构造指定产权人的查询 URL
- 04查找城市街道对应的许可数据集
MCP 相关
这是一个 MCP 服务,向 MCP 客户端提供县级地块端点、查询 URL 和城市数据集信息。它返回可供调用者自行访问的 URL,不会执行数据查询。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
4收录的工具列表 · 更新于 1 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| state | string | 否 | 可选:两位字母的州缩写(例如 'IL')或完整州名(例如 'Illinois') |
详细介绍
@urbankitstudio/mcp-atlas
通过模型上下文协议(MCP),查询美国 51 个州(50 个州加 DC)中 499 个县的地块 ArcGIS REST 端点(共 497 个端点),以查找业主、APN 和地址。
这是一个 MCP 服务,可让 AI 助手直接访问 UrbanKit Studio 手动验证的县级地块 GIS 服务图集。让 Claude 或 Cursor 查找任意已覆盖县的 ArcGIS REST 端点、获取准确的业主搜索查询 URL,并查找地块数据,无需了解 ArcGIS REST API 的任何约定。
覆盖范围: 美国 51 个州(50 个州加 DC)中的 499 个县,共有 497 个端点,其中 497 个处于运行状态(图集 0.6.40)。470 个县有端点;其余 29 个县的未覆盖原因均有记录(见下文“无法提供服务的县”)。
快速开始
Claude Desktop
添加到 ~/Library/Application Support/Claude/claude_desktop_config.json(macOS)或 %APPDATA%\Claude\claude_desktop_config.json(Windows):
{
"mcpServers": {
"mcp-atlas": {
"command": "npx",
"args": ["-y", "@urbankitstudio/mcp-atlas"]
}
}
}
Cursor
添加到项目根目录中的 .cursor/mcp.json(或全局配置文件 ~/.cursor/mcp.json):
{
"mcpServers": {
"mcp-atlas": {
"command": "npx",
"args": ["-y", "@urbankitstudio/mcp-atlas"]
}
}
}
全局安装(可选)
npm install -g @urbankitstudio/mcp-atlas
然后使用 mcp-atlas 作为命令,而不是 npx -y @urbankitstudio/mcp-atlas。
工具
前四个工具组成一个县级工作流,它们的区别在于你对县名的掌握程度。第五个工具 get_city_datasets 则独立运行:它查询的是城市,而不是县。
| 你知道的信息 | 使用 | 返回结果 |
|---|---|---|
| 一个州,或什么都不知道 | list_counties | 覆盖的县,以及这些县是否支持业主搜索。不返回 URL。 |
| 模糊、有拼写错误或 FIPS 代码的参考信息 | find_county | 返回所有匹配的县名及各自的记录 |
| 准确的州名和县名 | get_parcel_endpoint | 该县的端点 URL、图层、字段和示例查询 |
| 县名和业主姓名 | build_owner_query | 一个可运行的 URL,用于搜索该姓名 |
| 城市,以及可选的街道 | get_city_datasets | 该城市的违规建筑、建筑许可和分区案例数据集,以及各自可运行的查询 URL |
find_county 和 get_parcel_endpoint 返回相同的县级记录。两者的区别在于指定县的方式:find_county 接受不确定的参考信息,可能返回多个候选项;get_parcel_endpoint 接受准确的州名和县名,并返回一个县的信息。如果你已经知道县名,可以跳过 find_county。
此服务不会执行查询,也不会返回地块记录。它会告诉你要获取的 URL;获取数据由你自行完成。
无法提供服务的县
对于没有可返回端点的县,find_county、get_parcel_endpoint 和 build_owner_query 会给出相同的答复;托管的 UrbanKit MCP 服务、其 REST API 和 uks CLI 也会返回相同的文本。答复来自 @urbankitstudio/atlas 0.6.38 中的 coverageAnswer():
- 图集中没有该县的记录(拼写错误也会归入此类):提示“该县不在 UrbanKit 图集中”,并建议先检查拼写。
- 图集中有该县的记录,但该县未发布我们可提供服务的数据(田纳西州 Shelby 县,其条款禁止公开展示;宾夕法尼亚州 Columbia 县,其图层仅含地块编号):用一句话说明原因,注明上次检查日期、已设定时的下次检查日期、县级办公室的信息,以及在县里出售数据的情况下注明其自有产品。
两种答复最后都会提供免费的县级数据请求:一份可直接用于托管 MCP 服务 request_county 的请求正文,或可发送到 https://urbankitstudio.com/api/atlas/request 的 POST 请求。提交请求并不保证我们会添加该县。list_counties 仍只会列出我们提供服务的县。
list_counties
浏览覆盖范围。回答“是否覆盖这个县?”以及“我可以在那里搜索什么?”——每个县占一行,不含端点 URL 或字段名称。
| Parameter | Type | Required | Description |
|---|---|---|---|
state | string | No | 两字母缩写(IL)或全名(Illinois) |
示例提示词:“列出 Illinois 中所有已覆盖的县”
示例输出:
ST | County | Slug | Coverage
--------------------------------------------------------------------
IL | Kane | kane-county | owner+APN
IL | Cook | cook-county | APN only
IL | DuPage | dupage-county | owner+APN
...
各 Coverage 标签的含义:
| Label | Meaning |
|---|---|
owner+APN | build_owner_query 会返回至少一个端点的 URL |
APN only (county publishes no owner name) | 经审核的记录表明,该县未提供可用的所有者名称 |
location queries only | 没有端点可用于属性搜索;需通过几何图形查找地块,同时也会返回所有者字段 |
APN only (owner column not searchable) | 存在所有者列,但该县将其标记为不可按名称搜索;通过地块 ID 或位置查询可返回该列 |
APN only | 没有端点记录所有者列 |
find_county
当你无法准确表述县名时,用于解析县名。针对所有已覆盖的县,模糊匹配不完整或拼写错误的名称、“County State”短语或 5 位 FIPS 代码,并列出匹配到的每个县,以便在引用含糊时从列表中选择。每个匹配项都包含该县的记录:端点 URL、可搜索字段名称、所有者字段、示例查询和许可证。
| Parameter | Type | Required | Description |
|---|---|---|---|
query | string | Yes | 县名(Kane)、名称+州(Kane IL)或 FIPS(17089) |
示例提示词:“查找 Illinois Kane County 的地块端点”
get_parcel_endpoint
知道县名后,默认使用此工具进行查询。返回完整的 ArcGIS REST URL、图层索引、可搜索字段、所有者字段(或未提供所有者查询的原因)、当图层由全州或区域共享时该县的 Scope: 谓词、通用示例 ?where=…&f=json 查询,以及该县的 UrbanKit 深层链接。若要查询指定所有者,请使用 build_owner_query,而不要手动编辑示例查询。
| Parameter | Type | Required | Description |
|---|---|---|---|
state | string | Yes | 两字母缩写或全名 |
county | string | Yes | 县名(Kane 或 Kane County) |
示例提示词:“提供 Illinois Cook County 的 ArcGIS REST 端点”
build_owner_query
唯一可用于搜索指定所有者的工具。它会将个人或公司名称填入该县经过验证的所有者/纳税人字段,格式为 UPPER(field) LIKE UPPER('%NAME%'),执行不区分大小写的部分匹配,并返回可供获取或打开的 URL。对于由全州或区域共享的图层(例如 Connecticut 的区域综合图层),会将该县的范围谓词放在前面并用 AND 连接,格式为 (scope) AND UPPER(field) LIKE …,因此只会返回该县的记录。
如果端点无法用于查询,工具会说明原因并拒绝提供查询,以免查询无结果或一直挂起:
- 经审核的记录表明,该县未提供可用的所有者名称;
- 图层不支持属性搜索(请改用位置查询);
- 所有者列不可按名称搜索(请使用地块 ID 或位置查询)。
| Parameter | Type | Required | Description |
|---|---|---|---|
state | string | Yes | 两字母缩写或全名 |
county | string | Yes | 县名 |
owner_name | string | Yes | 所有者/纳税人名称(部分匹配) |
示例提示词:“为 Illinois Kane County 中由 ‘Smith’ 持有的房产构建 ArcGIS 查询”
示例输出:
County: Kane, Illinois
Owner field: TaxName
WHERE clause: UPPER(TaxName) LIKE UPPER('%SMITH%')
Query URL:
https://gistech.countyofkane.org/arcgis/rest/services/KanePINList/MapServer/0/query
?where=UPPER(TaxName)%20LIKE%20UPPER('%25SMITH%25')
&outFields=PIN,TaxName,SiteAddress,SiteCity,MailingAddress
&returnGeometry=false&f=json&resultRecordCount=25
get_city_datasets
城市违规、建筑许可和分区案例数据集。提供城市 slug(fort-worth)或名称(Fort Worth、Fort Worth, TX),还可以选择提供 kind 和街道地址行;该工具会返回该城市的每个已验证数据集:端点和提供方(Socrata、ArcGIS、CKAN 或 CARTO)、用于匹配地址的列、日期字段、数据集定义中的筛选条件、覆盖范围和新鲜度说明;如果提供了街道地址,还会返回可直接对城市自有服务发起查询的 query_url。省略 city 可列出所有覆盖的城市。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
city | string(最长 80) | 否 | 城市 slug 或名称;省略则列出覆盖的城市 |
state | string(最长 40) | 否 | 两位字母代码或州名;用于名称在两个州都存在的情况 |
kind | violations | permits | zoning | 否 | 仅返回该类型的数据集 |
street | string(最长 120) | 否 | 仅街道地址行,例如 Commerce 或 600 Commerce St。从第一个逗号处截断,因此可以安全地传入完整地址 |
- 如果两个城市名称相同,返回结果为
found: false, ambiguous: true,并附上候选城市;再次查询时提供state。如果城市不在注册表中,返回结果为found: false,并列出该州内的覆盖城市;如果参考数据中注明了所属县,则列出该县内的覆盖城市。 - 对于点查询(多边形案卷或当前分区地图),
query_url为null;此时数据集的query_template会提供请求模板,其中包含需要填入值的{LON},{LAT}占位符。 - 覆盖范围是城市辖区,而非整个县。这些表格不包含所有者数据:如需查询地块所有者,请使用上文的县级工具。
- 与县级工具一样,该工具不会获取任何数据。它根据 atlas 软件包中的数据作答,并提供供你自行使用的 URL。Socrata 会限制匿名调用者的请求频率,因此大量查询时请自行发送
X-App-Token标头。 - 这是托管版 UrbanKit MCP 提供的同一工具,声明的输入和响应键也相同。stdio 服务会严格校验参数是否符合该模式:
kind必须是小写的violations、permits或zoning。
示例提示词:“我该从哪里获取 Dallas 的 600 Commerce St 的未结建筑许可?”
示例输出(节选):
{
"found": true,
"city": { "slug": "dallas", "name": "Dallas", "state_abbrev": "TX", "county_slug": "dallas-county" },
"street": "600 Commerce St",
"datasets": [
{
"kind": "permits",
"provider": "socrata",
"endpoint": "https://www.dallasopendata.com/resource/e7gq-4sah.json",
"address_field": "street_address",
"street_used": "600 Commerce St",
"query_url": "https://www.dallasopendata.com/resource/e7gq-4sah.json?$where=upper(street_address)%20like%20upper('%25600%20Commerce%20St%25')&$limit=30"
}
]
}
对话示例
**用户:**我正在对 Illinois 州 Kane County 的房产做尽职调查。你能帮我找到所有归「Blackstone」所有的地块吗?
Claude(使用 mcp-atlas):
- 调用
get_parcel_endpoint→ 获取gistech.countyofkane.orgURL,并确认所有者字段为TaxName- 使用
owner_name=Blackstone调用build_owner_query→ 返回可直接使用的 fetch URL- 可选择获取该 URL 并整理地块结果
Atlas 覆盖范围
Atlas 由 UrbanKit Studio 维护。所有端点均经过人工验证。包含所有者/纳税人字段的县支持按姓名完整查询;仅支持 PIN 的县则支持按 APN/地块编号查询。
完整覆盖地图:https://urbankitstudio.com/parcel-atlas
数据
Atlas 数据嵌入在软件包中(启动时不会发起网络请求)。底层的 @urbankitstudio/atlas SDK 也单独发布,供程序化使用。
Socket 标记了什么,其中多少是我们的问题
Socket 的供应链扫描器给这个软件包打了 70 多分。点进去会看到一长串警报。逐项核查,而非一概置之不理:
| 警报 | 归属 | 内容 |
|---|---|---|
usesEval | 与我们无关 | src/ 中没有任何 eval 或 new Function。这是某个依赖引起的。 |
unmaintained (21) | 与我们无关 | 有些传递依赖最后一次发布是在 2017–2021 年。 |
mixedLicense | 与我们无关 | 某个依赖采用 BSD-3-Clause AND ISC 许可证发布。 |
noTests | 设计如此,是我们的问题 | files 只打包 dist。测试套件位于 test/,并在 CI 中运行。把测试打包进 tarball 才是缺陷。 |
networkAccess、filesystemAccess、envVars、shellAccess | 是我们的问题 | MCP 服务通过 stdio 与客户端通信,并读取自身配置。缺少这些能力的服务无法完成这项工作。 |
unpopularPackage、noV1 | 是我们的问题 | 下载量和 0.x 版本。随着时间推移,这两项都会改善;它们都不属于代码问题。 |
漏洞和许可证两项的评分都达到了 100,质量评分为 99。徽章显示的数字是供应链子评分,而扣分最多的单项是下载量——一种披着安全徽章外衣的人气指标。请看上面的清单,而非那个数字。
这四项访问警报只是让服务能够读取自身配置并通过 stdio 与客户端通信,仅此而已。它仍然不会执行查询,也不会返回包裹记录。
许可证
MIT — © 2026 UrbanKit Studio
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。