Built for AI agents, not retrofitted.
An agent gets a working API key in one call, with no card, no CAPTCHA and no sales call, then routes trucks, checks dangerous-goods compliance and publishes map styles by pure API.
Orientation, endpoints and prices in machine-readable form. No scraping.
GET mapmap.ai/llms.txt GET mapmap.ai/pricing.json
Card-free, live immediately. Email verification upgrades the same key to 50,000 calls a month.
POST api.mapmap.ai/v1/keys { "email": "…", "accept_tos": true } → 201 { "key": "snk_…", "calls": 1000 }
Connect the MCP server, or call the REST API directly: same engine, same errors.
claude mcp add --transport http \
mapmap https://mcp.mapmap.ai/mcpFull flow, error envelope and quotas: /docs/quickstart
One URL. Every client.
The hosted MCP server speaks streamable HTTP at https://mcp.mapmap.ai/mcp: no install, no key to connect, fair use. Pick your client:
Claude Code
claude mcp add --transport http mapmap \
https://mcp.mapmap.ai/mcpCursor
{ "mcpServers": {
"mapmap": { "url": "https://mcp.mapmap.ai/mcp" } } }Claude Desktop
{ "mcpServers": {
"mapmap": { "type": "http", "url": "https://mcp.mapmap.ai/mcp" } } }Codex
[mcp_servers.mapmap]
url = "https://mcp.mapmap.ai/mcp"VS Code
{ "servers": {
"mapmap": { "type": "http", "url": "https://mcp.mapmap.ai/mcp" } } }Windsurf
{ "mcpServers": {
"mapmap": { "serverUrl": "https://mcp.mapmap.ai/mcp" } } }From code
"mcp_servers": [
{ "type": "url", "url": "https://mcp.mapmap.ai/mcp", "name": "mapmap" } ]Copy-pasteable config for every client, plus self-host: /docs/mcp. Client names and marks are trademarks of their respective owners, shown to indicate compatibility.
Thirty-four tools, five jobs.
Every one of them, grouped by what it talks to. Full JSON Schemas and structured outputs, so a model calls them correctly on the first try. Tool errors name the exact problem, so agents self-correct.
01 · Route & comply
The differentiator: truck routing where ADR dangerous-goods tunnel codes and vehicle dimensions shape the route itself, not a post-filter.
Turn-by-turn for auto or truck; the truck profile merges dimensional and ADR costing. Distance, duration, manoeuvres, geometry.
Pure ADR 8.6.4 tunnel-entry decision: decision, reason, explanation. No network, answers instantly.
Multi-vehicle, multi-stop optimisation with truck and ADR constraints, fed by our own matrices.
One vehicle, one run: put the errands in the best visiting order, with arrival offsets. Truck costing keeps the order restriction-aware.
Cheapest fuel on the way, ranked by real engine-measured detour time and price per litre, from live statutory open-data feeds.

© OpenStreetMap contributors
02 · Search & measure
Ground an agent in the map: place search, many-to-many travel costs, and a check on the places a model claims are real.

Forward geocoding: name, label, position and address parts per candidate.
Coordinates to the nearest places: addresses, POIs and localities, nearest first with distance in metres. The inverse of geocode. Pass a heading and results come back described from where the user is standing rather than as coordinates.
Nearest-first search around a point, by category (cafes, fuel, EV charging, parking) or by name and brand, with real distances. Pass heading_deg and every result is phrased egocentrically, “ahead and slightly to your right, about 80 metres”, with a signed relative bearing; add fov_deg to keep only what is in front of the user. Without a heading it falls back to cardinals, so a client with no compass still gets something it can read aloud.
Check places and itineraries a model mentioned against the map before you act on them. Each claim comes back verified, contradicted or unverified, never a boolean, and a missing match is unverified rather than a denial. Pass a locality with every claim: a bare name is searched worldwide, so a short name can verify against a same-named place in another country.
Many-to-many travel-time and distance matrix; null cells mark unreachable pairs.
Stops from your own places dataset along a route, ranked by honest detour cost: real added driving time, measured by the engine.
Isochrone rings: where you can reach inside a chosen time budget on foot, by bike or by car.
Turn a list of stops into a navigable multi-stop route with per-stop arrival times; optionally optimises the order.
Terrain height for a list of points, or a resampled profile along a route. Null wherever the terrain set has no coverage, never a guess.
03 · Style maps
Agents publish real hosted map styles: recolour a palette, override one layer's paint, ship an immutable new version.
Everything a theme can restyle: palette slots, layer ids, source-layers. Local, instant.
A hosted style's theme document and compiled style URL. Public read.
Build and restyle hosted maps; every publish is a new immutable version.
Audit a style against WCAG 2.1 across both palette variants. Advisory: it names the slots to fix, and never blocks a publish.

04 · Compute locally
Ten geodesic tools that never leave the process: no network call, no quota, never metered or rate limited, and they keep answering when a backend is down. Measurement is geodesic on the WGS84 ellipsoid, not a spherical approximation, so it agrees with the rest of the platform.
Metres between two coordinates, as the crow flies. Not a driving distance: use route or matrix for that.
Initial bearing between two coordinates, degrees clockwise from true north.
The coordinate reached by travelling a distance on a bearing. The inverse of geo_distance plus geo_bearing.
Is this coordinate inside the zone? Delivery areas, catchments, clean-air and congestion zones. On the boundary counts as outside.
The axis-aligned box enclosing a set of coordinates, for fitting a map view to a set of stops.
The centroid of a set of coordinates: pick a depot, centre a map.
Total length of a polyline in metres. Measures the line you supply, not a driven route.
Area in square metres inside a ring. Always positive, so winding direction cannot change the answer.
Douglas-Peucker simplification. The tolerance is in degrees, not metres, and endpoints are always kept.
The closest position on a polyline to a coordinate, plus the distance to it. Answers “how far is this address from the route?”
05 · Report back
Two tools that point the other way: an agent that finds the map wrong, or the integration painful, can say so in a structured form rather than filing a ticket a human has to translate.
Queue a map correction for review: location, category, evidence. Never an automatic OpenStreetMap edit.
Send a structured end-of-integration retro so the friction you hit gets fixed. Only the named fields travel, never your conversation, prompts or code, and only with the developer's approval.
Agents pay per call.
Past the free tier, the gateway answers 402 in the x402 wire format, quoting the exact price of the call. Prepaid credit settles it today; on-chain settlement via the X-PAYMENT header is implemented server-side and switches on per deployment. Fails closed: routing is served only after a valid payment. Never a surprise bill.
HTTP/1.1 402 Payment Required { "x402Version": 1, "error": "monthly free quota exhausted", "accepts": [ /* PaymentRequirements */ ], "instructions": "pay per call, or top up credit" }
Agents are the customer, not a ToS violation.
Every response an agent pays for is its to keep: cache it, store it, index it, train on it, forever. MapMap meters the live service, not your memory of it. The incumbents take the opposite view: Google caps most caching at 30 days and bans AI training outright; Mapbox's default terms allow queries only in response to a human.
One honest boundary: content derived from OpenStreetMap stays under ODbL, so credit © OpenStreetMap contributors when you republish, and share-alike applies to public derivative databases. That is OSM's licence, not ours to waive. Everything else is yours.
GET /.well-known/agent-terms.json { "rights": { "cache": "unlimited", "store": "unlimited", "index": true, "train": true, "redistribute": "with ODbL/OSM attribution where applicable" }, "commitments": [ "We will never add a caching time limit, a storage ban, an indexing ban or a training ban ..." ] }
| What an agent may do | MapMap | Google Maps Platform | Mapbox |
|---|---|---|---|
| Automated and bulk queries | ✓ Yes. Agents are the customer | No scraping, pre-fetching or bulk downloads (§3.2.3(a)) | Human queries only; no bulk or automated queries (§1.9) |
| Cache responses | ✓ Forever | Banned except narrow allowances, e.g. geocoded lat/lng for 30 days (§3.2.3(b), SST §6.3) | Banned by default; on-device tile cache capped at 30 days (§1.9, §2.8.1) |
| Store results long-term | ✓ Yes, unlimited | “pre-fetch, index, store, reshare, or rehost” all banned (§3.2.3(a)) | “export, download, cache or store” banned; navigation results never storable (§1.9, §2.10.1) |
| Build a derivative dataset | ✓ Yes, under ODbL attribution and share-alike where OSM-derived | No creating content from Google Maps Content (§3.2.3(c)) | No general POI or geocode database; no substitute service (§1.5, §2.7.1) |
| Train AI models | ✓ Yes | Banned: no train, test, validate or fine-tune (§3.2.3(c)(vii)) | Banned, narrow data-product exceptions by separate order (§1.5(ii)) |
| Pay without a human | ✓ Yes: x402, USDC on Base and Solana | No: human billing account and card | No: human billing account and card |
| MCP server | ✓ 34 hosted tools, keyless connect | Docs-assist MCP only (experimental); data access stays under the same terms | Yes, token required; the same product terms apply to results |
Summaries of the cited clauses, not legal advice; read the originals. Sources: Google Maps Platform Terms of Service §3.2.3 (last modified 23 June 2026) and Maps Service Specific Terms (SST) §6.3 (last modified 10 June 2026); Mapbox Product Terms §§1.5, 1.9, 2.7, 2.8.1, 2.10.1 (last updated 21 July 2026). All checked 26 July 2026. If the linked documents have changed since, they win.
Skills: teach your agent to build with MapMap.
The MCP server is live tools; the skills are the know-how, installed into the same agents. See all ten →
npx skills add Mapmapai/mapmap-agent-skillsWire an agent up in minutes.
Start at the discovery files, issue a key in one call, connect the MCP server.