@ cyanheads/ openstreetmap- mcp- 服务器
Geocode,倒向地理学编码,并通过MCP运行OpenStreetMap数据上的Overpass空间查询. (原始内容存档于2012-10-12). STIO or Streamable HTTP.
概览
OpenStreetMap通过Nominatim和Overpass API的数据. Geocode 定位和地址,将坐标解到最近的地址,查找已知的OSM对象,并通过在某个点周围,一个边框内,或者在OSM边界内标记来查询特征.
工具
| 工具 | 说明 |
|---|---|
openstreetmap_search_places | 将一个地名或地址转换为坐标和结构化的地方数据 |
openstreetmap_reverse_geocode | 将纬度/经度转换为最近的地址或地名 |
openstreetmap_lookup_objects | 通过 ID 获取已知 OSM 对象的地址记录 |
openstreetmap_query_nearby | 在点的半径内查找 OSM 特性 |
openstreetmap_query_bbox | 在边框或城市、公园或区域等OSM边界内查找 OSM 特征 |
openstreetmap_query_raw | 运行原始 Overpass QL 查询其它工具无法表达的任何信息 |
能力参考
这个 openstreetmap-guide 技能包括定位解析、空间查询、寻呼、解释覆盖范围和标记结果.
在犬科鉴定前接受参数化名: latitude 编号 : longitude 页:1 lat 编号 : lon 在临近的和反向的询问中, radius_m 为了附近的 radius_meters,以及 q 寻找 query。发送任意一种拼写,从不同时发送. radius, (中文(简体) ), tag,以及 tags 无效; 已公布的术语名称.
openstreetmap_search_places 工具
- 自由形式
query或结构字段street, (中文(简体) ),city, (中文(简体) ),county, (中文(简体) ),state, (中文(简体) ),country, (中文(简体) ),postalcode; 最多40个结果(limit,默认为5;较大limit以40为单位使用limitNotice),缩小countrycodes, (中文(简体) ),layer, (中文(简体) ),featureType,则aviewbox(限制使用bounded: true(中文(简体) ) - 结果带坐标,结构
address, (中文(简体) ),boundingbox, (中文(简体) ),importance,以及osm_type+ 键osm_id· ;extratags添加联系人和物理属性标记; 空出第一页失败no_results名称countrycodes, (中文(简体) ),layer, (中文(简体) ),featureType边框viewbox发送 - 每页都有结果返回
nextExcludeIds转回为exclude_place_ids,因为比limit还可以有更多。 一旦结果耗尽, 就会得到零结果和通知, 而不是错误, 并且对实例的 URL 限制走得太长 失败request_too_long
openstreetmap_reverse_geocode 工具
lat编号 :lon加号zoom从3(国家)到18(建筑,默认);layer默认为address,poi- 返回结构化的最近索引对象
address, (中文(简体) ),osm_type+ 键osm_id,以及boundingbox; 无 OSM 数据的坐标失败no_coverage
openstreetmap_lookup_objects 工具
- 500人以下
osm_ids条目,每个前缀N, (中文(简体) ),W,或R(单位:千美元)["N240109189"]; 错误的ID失败为invalid_id_format - 头50个独特的身份被查;其余的作为
deferred_ids下一个呼叫 - 返回所找到对象的地址记录并列出其余内容
not_found(包括物体Nominatim不指数,例如街道灯;a)notice携带一个openstreetmap_query_raw要检查是否存在的查询
openstreetmap_query_nearby 工具
lat编号 :lon与radius_meters最多50,000(默认为1,000);一个主标签,amenity或者说tag_key带有可选tag_value,加上最多5个filters; 每页最多500个特性( 较大)limit以500为单位limitNotice(中文(简体) )element_types除非设置,否则要搜索节点、方式和关系;["node", "way"]断绝关系- 默认的数值完全匹配;
list_item模式 (tag_value_match,或match在过滤器上)匹配分号列表中的一个项目,所以cuisine=:pizza还发现cuisine=pizza;italian - 一个
amenity值为 OpenStreetMap 标记在另一键下(amenity: "museum"; 博物馆为tourism=museum得到一个notice命名要重试的密钥 - 特点携带
osm_type+ 键osm_id,坐标,distance_meters(到特性的最近点),和完整的标记集,排序最接近的第一;effectiveTag响应过滤链 - 通过搜索方式或关系,一个包含点的区域,如它所在的公园或城市,匹配在
distance_meters0,无论半径,和areasTimestamp说地区数据有多老 无法运行区域搜索的结束点会被再次询问,没有它notice表示未检查含有此点的区域
openstreetmap_query_bbox 工具
- 每个呼叫范围:角
south, (中文(简体) ),west, (中文(简体) ),north, (中文(简体) ),east,或within和一个R编号 :W边界参考文件(R237385由地理编码结果制成osm_type+ 键osm_id; 相同的标签过滤器, 列表项匹配, 出错 --amenity通知,每页500个上限为openstreetmap_query_nearby element_types除非设置,否则要搜索节点、方式和关系;["node", "way"]断绝关系effectiveArea命名边界within达到的目标name, (中文(简体) ),boundary,以及admin_level标记,然后是它所绘制的Overpass区域,所以一个打错了的 ref 显示;areasTimestamp表示区域数据的历史; 将区域映射到没有区域时, 返回空页并带有通知- A 类
west大于east是一个穿越时空的盒子;south大于north失败为invalid_bbox
openstreetmap_query_raw 工具
- 任何包含
[out:json]· ;[timeout:N]来自timeout_seconds(最多180个,缺省30个)和[maxsize:268435456](256 MiB) 当查询设置为无时会被添加;每页最多500个元素(较大)limit以500为单位limitNotice(中文(简体) ) - 返回原始要素(载体)
nodes[]关系members[]),加 (中文(简体) )total_elements编辑effectiveQuery已发送; 错误的 QL 失败query_error带有 Overpass 解析错误 max_element_bytes(默认为20,000, 最低为1,000)members, (中文(简体) ),nodes,或geometry数组,列于withheld_keys· ;withheldElements财务报告和审定财务报表withheldNotice说怎么接他们
特征
建造在 @cyanheads/mcp-ts-core: stdio和可流式的 HTTP 传输器,可插接式(none 编号 : jwt 编号 : oauth),可互换存储(in-memory, (中文(简体) ), filesystem, (中文(简体) ), Supabase, (中文(简体) ), Cloudflare KV/R2/D1),结构化记录,可选择的OpenTeleometry tracking.
OpenStreetMap 特异性 :
- 诺米纳蒂姆请求的间隔为1,050毫秒,以遵守其每秒一次请求的政策;
OSM_USER_AGENT将服务器识别为两个上游 - 每个端点限制过路查询
OSM_OVERPASS_MAX_CONCURRENCY,则选择进入失败OSM_OVERPASS_ENDPOINTS(见 逾越终点故障(中文(简体) ) - 过关工具页面
limit财务报告和审定财务报表offset报告totalFound, (中文(简体) ),truncated,以及nextOffset;结果被缓存了10分钟( Nominatim for 60),所以重传不会产生新的上游请求 - 超过 64 MiB 的过关响应失败
result_too_large OSM_NOMINATIM_BASE_URL财务报告和审定财务报表OSM_OVERPASS_BASE_URL将服务器指向自托管或镜像实例
方便代理输出 :
effectiveQuery财务报告和审定财务报表effectiveTag呼应所发送的effectiveArea命名边界 awithin已到达 ; 超时回复 添加data_timestamp财务报告和审定财务报表servingEndpoint,每个响应都带有ODbLattributionosm_type+ 键osm_id从任何工具种子中openstreetmap_lookup_objects,而地理编码关系或方式成为within参考:openstreetmap_query_bbox- Nominatim 工具从不通过标签选择,以及
tagSelectionCaveat说到做到,雷克克斯、交替、否定openstreetmap_query_raw - 在 Markdown 输出中隐藏名称和标记值;
structuredContent保存原始文本
开始
连接到主机实例, 没有安装 :
claude mcp add --transport http openstreetmap-mcp-server https://openstreetmap.caseyjhand.com/mcp
或者在当地运行它:
claude mcp add openstreetmap-mcp-server -- npx -y @cyanheads/openstreetmap-mcp-server
对于其他客户端,请将此添加到 MCP 配置文件中 :
{
"mcpServers": {
"openstreetmap-mcp-server": {
"command": "npx",
"args": ["-y", "@cyanheads/openstreetmap-mcp-server"]
}
}
}
不需要 API 密钥 。 重用,点数 OSM_NOMINATIM_BASE_URL 财务报告和审定财务报表 OSM_OVERPASS_BASE_URL 在你自己的例子。 对于 Docker 或源构建,请参见 运行服务器。 。 。 .
配置
| 变量 | 说明 | 默认 |
|---|---|---|
OSM_NOMINATIM_BASE_URL | 诺米纳蒂姆基础 URL. 路径前缀, 如 https://maps.example.com/nominatim 被支持. | https://nominatim.openstreetmap.org |
OSM_OVERPASS_BASE_URL | 将每个查询键入一个过端点并禁用故障. | 未设定 |
OSM_OVERPASS_ENDPOINTS | 以逗号分隔, 命令通过端点; 不止一个允许故障 。 忽略当 OSM_OVERPASS_BASE_URL 已经设定. | https://overpass-api.de/api/interpreter |
OSM_OVERPASS_MAX_CONCURRENCY | 每个终点飞行中 Max Overpass 查询 公共实例允许每个用户有一个. | 1 |
OSM_USER_AGENT | 用户代理发送到诺米纳蒂姆和Overpass. 按使用政策要求. | openstreetmap-mcp-server/<package version> |
MCP_TRANSPORT_TYPE | 运输: stdio 或者说 http。 。 。 . | stdio |
MCP_HTTP_PORT | HTTP 服务器端口. | 3010 |
MCP_SESSION_MODE | HTTP 会话模式 : stateless, (中文(简体) ), stateful,或 auto。服务器宣布 stateless 在代码中;一个明确的值将覆盖它. | stateless |
MCP_AUTH_MODE | 认证 : none, (中文(简体) ), jwt,或 oauth。 。 。 . | none |
MCP_LOG_LEVEL | 日志级别 (debug, (中文(简体) ), info, (中文(简体) ), warning, (中文(简体) ), error(见a/c.5/49/70,附件). | info |
STORAGE_PROVIDER_TYPE | 存储后端 : in-memory, (中文(简体) ), filesystem, (中文(简体) ), supabase, (中文(简体) ), cloudflare-kv/r2/d1。 。 。 . | in-memory |
OTEL_ENABLED | 启用 打开几何。 。 。 . | false |
见 .env.example 用于完整可选覆盖列表。 任意的无效值 OSM_* 变量在启动时停止服务器,并带有一个给变量命名的信息.
逾越终点故障
默认每个Overpass查询都到一个终点,即自由和开放源码软件操作的主要实例。 列出更多 OSM_OVERPASS_ENDPOINTS 和失败的调用移动到下一个条目, 顺序为 :
OSM_OVERPASS_ENDPOINTS="https://overpass-api.de/api/interpreter,https://overpass.private.coffee/api/interpreter"
- 多次失败的终点被跳过一段时间( 30秒, 翻倍可达10分钟)
- 当每个端点都失败时, 呼叫就会失败
rate_limited, (中文(简体) ),upstream_error, (中文(简体) ),overpass_unavailable, (中文(简体) ),endpoints_rejected, (中文(简体) ),endpoints_exhausted,或endpoints_unavailable,在消息中包含每个端点的结果 - 端点仅按来源报告(
https://overpass-api.de(单位:千美元)servingEndpoint,错误消息和日志 - 附加条目仅是失败, 且不会添加货币 。 对于允许并行查询的例子,附件
|N输入https://mirror.example/api/interpreter|4用于 N 槽; 写一字形|在 URL 中作为%7C。永远不要大小化公共实例(自由和开放源码软件服务器、地图.mail.ru、overpass.private.coffee) - 呼叫等待槽失败
pacer_shed(单位:千美元)retryAfter30秒后至少30秒
添加端点会向第三方发送您的询问 。 请检查url=值 (帮助) OSM 维基实例列表,确认它持有全球数据(一个区域实例用空的HTTP 200来解答抽出的问题),并期望镜像会落后于主要实例; servingEndpoint 财务报告和审定财务报表 data_timestamp 显示哪个主机的答案和数据有多新鲜.
运行服务器
地方发展
要求数 Bun v1.4.0 (英语) 或更高(或Node.js v24+).
git clone https://github.com/cyanheads/openstreetmap-mcp-server.git
cd openstreetmap-mcp-server && bun install
cp .env.example .env
# edit .env to override endpoints or the User-Agent as needed
-
构建和运行制作版本数字 :
# One-time build bun run rebuild # Run the built server bun run start:http # or bun run start:stdio -
运行检查和测试数字 :
bun run devcheck # Lints, formats, type-checks, and more bun run test # Runs the test suite
夹克
docker run --rm -p 3010:3010 ghcr.io/cyanheads/openstreetmap-mcp-server:latest
# or build locally
docker build -t openstreetmap-mcp-server .
docker run --rm -p 3010:3010 openstreetmap-mcp-server
该图像服务 HTTP 于 http://localhost:3010/mcp 在无国籍人会话模式和日志中 /var/log/openstreetmap-mcp-server。默认情况下安装了 OpenTeleometry 端对接点; 构建为 --build-arg OTEL_ENABLED=false 以略去他们。 运行时间遥测直到通过 -e OTEL_ENABLED=true。 。 。 .
项目结构
| 目录 | 目的 |
|---|---|
src/mcp-server/tools | 工具定义*.tool.ts)和共享输入,格式化,以及逃出帮助者. 六道工具横跨诺米纳蒂姆和奥弗帕斯. |
src/services/nominatim | 诺米纳蒂姆服务:为搜索,倒置,和找取,加上分析出错,对API客户端进行节奏. |
src/services/overpass | Overpass 服务: 查询构建器, 端点失效和执行器, 元素正常化器, 错误解析 . |
src/config | 服务器特定环境变量与Zod解析并验证. |
tests/ | 对工具、服务和安全进行单元和综合测试. |
发展指南
见 CLAUDE.md 发展准则和建筑规则。 简本:
- 搬运工投掷,框架渔获量——否
try/catch在工具逻辑中 - 使用
ctx.log用于伐木,ctx.state用于存储 - 登记册中的新工具
createApp()数组在src/index.ts - 环绕外部 API 调用: 验证 生 → 规范到域类型 → 返回输出计划; 永远不要编织缺失的字段
捐款
问题值得欢迎。 提交前进行检查和测试:
bun run devcheck
bun run test
许可证
阿帕奇-2.0 — 见 自由主义 详细情况.
地图数据来源 OpenStreet地图 捐款者,在 开放数据库许可证( ODbL)。 。 。 .