Jordan Geo.
An MCP server that hands an AI agent a styled SVG map of Jordan — 12 governorates, 122 hospitals, five typed tools, no API key and no network at call time.
Overview
Agents can describe Jordan, but they can't draw it
Ask a model for a map of Jordan and you get a description, a broken ASCII sketch, or a call to a tile service that needs a key, bills per request, and returns a raster you can't restyle. None of that drops cleanly into a chat surface, a report, or a slide.
Jordan Geo takes the opposite approach: the boundary data ships inside the package, rendering is deterministic, and the output is a single self-contained SVG string the caller can paste anywhere. Same input, same file, every time — no key, no tiles, no network at call time.
Five typed tools, and deliberately nothing else
The whole API is five functions. Three answer questions about the country, two draw it. The MCP server and the Claude Skill are thin wrappers over the same core, so the Python package and the agent see an identical surface.
Theme, palette, and vibe compose independently
Two themes, five palettes, and five vibes are orthogonal, so fifty base looks fall out of three arguments — before any custom palette or highlight set. Colouring follows a strict precedence: pass your own data and you get a choropleth, ask for the hospital metric and you get the built-in one, pass neither and you get a decorative map.
Labels render in English, Arabic, or both, with Tajawal-or-fallback for Arabic so the file stays readable on a machine that has never seen the font.
What it refuses to do
No demographics, no geocoding, no point-in-polygon, no hospital coordinates or proximity search, no sub-governorate geography, no live API calls. The boundary data is geoBoundaries JOR ADM1 under ODbL, so rendered footers carry the attribution the licence requires.
Keeping the surface this narrow is what lets the package stay offline and deterministic — the two properties that make it safe to hand to an agent.
How it works
One core package does the work; everything else is a thin adapter over it. The renderer never touches the network — boundaries and the hospital list are bundled, so a tool call is pure computation.
In the terminal
$ python
>>> from jordan_geo import render_map, hospitals_in
>>> svg = render_map(metric="hospital_count", vibe="editorial", palette="rose")
>>> open("jordan.svg", "w", encoding="utf-8").write(svg)
58412
>>> len(hospitals_in("إربد"))
17
>>> render_map(data={"JO-AM": 50, "JO-IR": 20}, data_label="Cases")[:38]
'<svg xmlns="http://www.w3.org/2000/svg"'Install & use
$ claude mcp add --transport sse jordan-geo \$ https://baselhusam-jordan-geo-mcp.hf.space/sse
$ pip install "git+https://github.com/baselhusam/jordan-geo"$ python -c "import jordan_geo as jg; print(len(jg.list_governorates()))"
# Claude Desktop — claude_desktop_config.json# "jordan-geo": { "type": "sse", "url": ".../sse" }# then ask the agent, in plain language:# "render Irbid governorate, neon vibe, Arabic labels"
Agent / MCP tools
list_governoratesAll 12 governorates with bilingual names, capitals, hospital counts, centroids, and bounding boxes.
list_hospitalsThe full 122-hospital directory, optionally filtered to a single governorate.
hospitals_inHospitals for one governorate, keyed by ISO id, English name, or Arabic name.
render_mapRenders the whole country as an SVG — choropleth, hospital metric, or decorative.
render_governorateRenders a single governorate cropped to its bounds, optionally with surrounding context.