All Projects

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.

Developer Tools / MCPActiveMITPython 3.10+SSEnone requiredHF Spaces · Docker
12
Governorates
122
Hospitals
5
MCP tools
50
Style combinations

Overview

Problem

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.

Surface

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.

list_governorates
all 12, bilingual, with centroid and bbox
list_hospitals
122 entries, optional governorate filter
hospitals_in
one governorate by id, English, or Arabic name
render_map
whole country → SVG
render_governorate
one governorate, cropped to its bounds
Styling

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.

Themes
light · dark
Palettes
rose · sand · olive · teal · mono · custom
Vibes
minimal · editorial · blueprint · neon · mono
Scope

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.

jordan_geo
models · data · geometry · render
Adapters
MCP server · REST API · Claude Skill
SVG out
one self-contained file, no assets to host

In the terminal

python — five lines to an SVG
$ 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 Code
$ claude mcp add --transport sse jordan-geo \
$ https://baselhusam-jordan-geo-mcp.hf.space/sse
Python (from source)
$ pip install "git+https://github.com/baselhusam/jordan-geo"
$ python -c "import jordan_geo as jg; print(len(jg.list_governorates()))"
quick start
# 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_governorates

All 12 governorates with bilingual names, capitals, hospital counts, centroids, and bounding boxes.

list_hospitals

The full 122-hospital directory, optionally filtered to a single governorate.

hospitals_in

Hospitals for one governorate, keyed by ISO id, English name, or Arabic name.

render_map

Renders the whole country as an SVG — choropleth, hospital metric, or decorative.

render_governorate

Renders a single governorate cropped to its bounds, optionally with surrounding context.

Built with

Python
core rendering package
Pydantic v2
typed governorate + hospital models
FastMCP
MCP server over SSE
FastAPI
REST adapter
Docker
Hugging Face Space runtime
Next.js
interactive map explorer
geoBoundaries
JOR ADM1 boundary data (ODbL)
Upstash Redis
fire-and-forget tool-call telemetry