
Geo Explorer Mcp
io.github.arnienemeth由 GitHub 账号 arnienemeth 发布v0.1.0更新于 Oct 24, 2026
Country facts, administrative boundaries and regional statistics, for interactive geography.
概览
一个本地 MCP 服务器,为助手提供结构化的国家概况、行政边界和区域统计数据,用于构建交互式地理内容。
- 可以做什么
- 查询国家概况:首都及坐标、人口、面积、地区、货币、语言、邻国、国旗和维基百科链接,国家名支持多种语言和拼写。获取 ADM0、ADM1 或 ADM2 级别的地图数据,包括区域名称和可在浏览器中获取的 GeoJSON 链接,并附来源、许可、数据年份和质量警告。获取各区域详情:人口、面积、首府及其人口和坐标、本地名称、行政区划类型、Wikidata 和维基百科链接。利用工具返回的匹配键和连接提示,把边界数据与统计数据关联起来。
- 适用场景
- 适合需要助手基于真实数据生成地图、对比表格或地理课程的场景,例如按人口给某国区域着色,或跨国比较行政区划。
- 运行要求
- 作为本地 Python 进程运行,可从 PyPI 安装(uvx geo-explorer-mcp),或克隆后用 uv sync 安装。需要 RESTCOUNTRIES_API_KEY 获取国家信息,并提供 GEO_EXPLORER_CONTACT(网址或邮箱)放入发送给 Wikidata 的 User-Agent。需要访问 REST Countries、geoBoundaries 和 Wikidata 的网络连接。
安装
在 SourceWeft 中
- 打开 控制台中的 Geo Explorer Mcp,将其添加到工作区。
- 为需要使用其工具的对话启用该服务。
Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。
其他 MCP 客户端
参照 仓库 中的启动说明。
README
geo-explorer-mcp
Listed in mcprush: https://mcprush.com/arnienemeth/geo-explorer-mcp
An MCP server that serves country facts, administrative boundaries and regional statistics as structured data, so an AI assistant can build interactive geography instead of reciting it.
The server deliberately returns data, not prose. It hands back populations, polygons and coordinates; the model decides how to present them — as a clickable map, a comparison table, or a lesson in Slovak, German or Hungarian. Nothing in this server knows how to translate, and it does not need to.
[Slovakia's regions shaded by population, with capitals and per-region statistics]
Tools
country accepts a name in almost any language — Slovakia, Slovensko,
Magyarország, Magyarorszag (no diacritics), Deutschland, Ungarn.
The two boundary and statistics tools are designed to be joined:
get_region_details returns a match_key per region, and a join_hint
telling the model how to normalise get_map_data's names to match it.
Quick start
Copy .env.example to .env and fill it in:
GEO_EXPLORER_CONTACT goes into the User-Agent sent to Wikidata. Wikimedia
requires a contact URL or email and answers anything else with 403.
Once published to PyPI it also installs with no clone at all:
Try it in the MCP Inspector:
Claude Desktop
Add this to claude_desktop_config.json (on Windows,
%APPDATA%\Claude\claude_desktop_config.json), adjusting the paths:
Pointing at the project's own .venv interpreter means Claude runs exactly what
you tested, with no second environment to keep in sync. Restart Claude Desktop
fully afterwards — the config is only read at startup.
Then ask it something like:
Show me an interactive map of Slovakia's regions, shaded by population, in German.
Demo page
demo/index.html renders any of four countries from the same two sources the
server uses, joined in the browser: shading by population, area or density,
capital markers, a sortable table, and per-region links to Wikipedia and
Wikidata. One page, parameterised by country — because the server is generic.
It must be served over http, not opened as a file — a file:// page has a
null origin and the browser blocks its cross-origin fetches:
The single US miss is the Virgin Islands, which has no ISO 3166-2 entry in Wikidata. Regions without a match render grey rather than being dropped.
Layout
server.py at the root re-exports the server object, so the Claude Desktop
config, fastmcp dev inspector server.py and the probe scripts all keep working
while the package underneath stays publishable.
Tests
probe2.py runs all four demo countries and asserts two things that previously
broke: that geojson_url is the resolved Git LFS media URL, and that at least
90% of boundary regions join to their statistics. Germany sat at 50% before
native-name matching landed.
Field notes
Things that cost real debugging time, written down so they don't cost yours.
REST Countries v3.1 is gone. Nearly every tutorial online still uses it. v5
lives at a different host, requires a bearer token, and renamed every field
(area → area.kilometers, cca3 → codes.alpha_3, and capitals is now an
array of objects, not strings).
geoBoundaries GeoJSON is stored in Git LFS, and only
media.githubusercontent.com serves it to a browser:
raw.githubusercontent.com/...returns a 131-byte LFS pointer file, not geometry.- The
github.com/.../raw/...URL the API publishes 302-redirects with an emptyaccess-control-allow-origin. Browsers enforce CORS on every hop of a redirect, so a page fetching it fails withTypeError: Failed to fetcheven though the final response sendsaccess-control-allow-origin: *.
Either mistake produces a blank map with no error. get_map_data resolves the
redirect and returns the URL that actually works.
Verifying with curl does not verify browser behaviour. curl -L followed
that redirect happily and reported the permissive header on the final response.
It ignores CORS entirely. Test cross-origin fetches with an Origin header, or
in a browser.
Wikidata's area property mixes units. P2046 values are entered in square
kilometres, hectares or square metres, and the raw number carries no hint
which. Reading it directly gave Békéscsaba an area of 193,930,000 km² — it is
193.9 km², recorded in m². Use the normalised value
(p:P2046/psn:P2046), which Wikidata converts to SI base units.
ISO 3166-2 mixes administrative levels. Hungary returns 43 subdivisions: 19
counties, Budapest, and 23 cities with county rights. The cities sit inside the
counties, so their areas and populations must not be summed, and there are far
fewer boundary shapes than entries. get_region_details returns
subdivision_types and warns via data_quality_notes.
Country-name matching folds case but not diacritics. Magyarország resolves;
Magyarorszag does not. Translations (Ungarn, Hongrie) are excluded from the
name aggregate on purpose. The server works around both with a three-step
fallback: the name aggregate, then the translations endpoint, then a locally
built diacritic-folded index.
A Wikidata query that works for a small country can time out for a large
one. Resolving subdivisions via ?i wdt:P17 ?country makes Wikidata scan
everything in that country: fine for Slovakia, HTTP 504 for the United States.
Filtering on the ISO 3166-2 prefix instead — FILTER(STRSTARTS(?iso, "US-")) —
returns the same 56 rows in 0.9 seconds, because those codes are defined as
<alpha-2>-<subdivision>, so the prefix already is the country filter.
The same region has different names in each source. geoBoundaries says
Bayern, Sachsen, Thüringen; Wikidata's English labels are Bavaria,
Saxony, Thuringia. Matching on the English label alone joined 8 of Germany's
16 states. Building a key from every name variant, native names included,
joins all 16 — which is why get_region_details returns match_keys (plural).
A bounding box lies about shapes that cross the antimeridian. Alaska's
Aleutian Islands run past 180°, so its box reads -179.15 .. 179.78 — a
359-degree span. fitBounds on that zooms out to the whole globe and shrinks
the mainland to a smudge, with no error. Russia, Fiji and New Zealand share the
trap. The demo refuses any box wider than 180° and falls back to a fixed view.
The hidden attribute loses to any author display rule. It works through
the browser's default stylesheet, the weakest source there is, so an element
styled display:grid stays visible when you set hidden. Symptom: a loading
overlay that never goes away, covering a map that loaded perfectly. Guard it
with [hidden]{display:none !important}.
Some upstream region names are damaged. geoBoundaries' ADM2 names for
Slovakia are truncated and mistransliterated (Prešov → Predov, Dolný Kubín
→ Dolne Kub). The geometry is fine. get_map_data detects this and returns a
data_quality_note so a model does not present corrupted names as fact.
No # comments inside a SPARQL query that gets collapsed to one line. In
SPARQL # comments out the rest of the line; after collapsing, that is the
entire query. Symptom: HTTP 400.
Data sources
Boundary licences differ by country because geoBoundaries aggregates national
sources. Slovakia's are OpenStreetMap-derived and therefore ODbL, which has
share-alike obligations that CC BY does not. get_map_data returns the licence
that applies to the data it just gave you; use that, not a hardcoded string.
Roadmap
- Publish to PyPI so the server installs with
uvx geo-explorer-mcp - Repair corrupted ADM2 names by joining to Wikidata
compare_countriesfor side-by-side statistics- Cache boundary metadata to disk rather than in memory
Licence
MIT — see LICENSE. The data this server returns carries its own licences; see the table above.
来源:README.md,提交 b024202
工具
0版本历史
1- v0.1.0最新Sep 27, 2026
评分
已满足适用检查项的 50%
该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。
- 近 30 天内可连通25 分
请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。
- 已声明认证方式10 分
请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。
- 已列出工具15 分
请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。
- 描述必需15 分
- 图标10 分
- 文档15 分
- 许可证10 分