Case study: MapIron.com
Self-hosted map API with an agent-native surface
A production map API on OpenStreetMap data, engineered and operated in house: a Rust/Axum service for static map images, geocoding and tiles, a Cloudflare edge that serves and meters tiles from cache, and a hosted MCP server listed in the official MCP Registry.
The problem
Listing sites, marketplaces and local services need maps and geocoding, but the large map APIs bill per request past the free tier, often restrict caching static images or storing geocoding results, and default to an exact pin on someone's home. The goal was a map API with predictable flat pricing, results customers can keep, and a built-in way to show where a place is without showing exactly where.
Architecture
- 01
Data and rendering
OpenStreetMap data is rebuilt on our own servers into a PMTiles basemap and a Photon geocoding index, kept apart from the customer database. A Rust/Axum service renders static images and answers lookups, with two render nodes taking part of the tile and image load.
- 02
Privacy by design
Privacy area mode snaps each point to a grid and draws a circle that always contains it. The exact point never appears in the image, and every address in the same cell produces the identical map.
- 03
Edge and metering
Cloudflare fronts all public traffic. A Worker serves tiles from cache, validates keys against the origin with a short-lived cached answer, and reports tile counts in batches, so every plan has a hard monthly cap and never an overage bill.
- 04
Agent surface
A hosted MCP server, listed in the official MCP Registry as com.mapiron/maps, exposes geocoding, reverse geocoding, static maps, privacy area maps and interactive map setup. A zero-dependency stdio bridge covers clients that only launch local servers.
- 05
Integrations
Quickstarts for Leaflet, MapLibre GL JS, OpenLayers and WordPress, plus Google Sheets, Zapier, Make and a dedicated n8n node that AI Agent workflows can call as a tool.
- 06
Security and billing
API keys and session tokens are stored only as hashes, sign-in supports passkeys and authenticator apps, the managed PostgreSQL database accepts only private TLS connections, and Stripe handles every card.
Components
- Rust/Axum map service
- One Rust service renders static map images, answers geocoding and reverse geocoding through a self-hosted Photon index, and serves raster and vector tiles from a PMTiles basemap, with two render nodes sharing the load.
- Privacy area mode
- The real point is snapped to a grid and drawn as a circle that always contains it, with no pin. Every address in a cell gets the identical image, so listings show the neighbourhood without exposing a home.
- Metered edge delivery
- A Cloudflare Worker serves tiles from cache, checks each key with the origin, and reports usage in batches, so hard monthly caps hold without putting the origin on the hot path.
- Agent and no-code surface
- A hosted MCP server listed in the official MCP Registry, a zero-dependency stdio bridge, and an n8n node put geocoding and map images inside Claude, Cursor, VS Code, n8n, Zapier and Make.
In production
MapIron runs on its own infrastructure with a public status page, and Kulomo, a listings site, runs its maps on MapIron tiles. The service launched as PinSharing and was renamed MapIron in November 2026 with every existing key, endpoint and integration left working.