Skip to main content
Glama
README.md
# mapsi-mcp

MCP server for [Mapsi](https://mapsi.dev) — 18 geospatial tools for AI coding assistants. Connect Claude Code, Cursor, Windsurf, or any MCP-compatible IDE directly to Mapsi APIs.

**OpenStreetMap-based · Self-hosted infrastructure · No Google Maps vendor lock-in**

## Quick Start

**1. Get your API key** at [mapsi.dev/console/api-keys](https://mapsi.dev/console/api-keys) (free tier: 1,000 calls/day, no credit card)

**2. Add the config to your IDE:**

### Claude Code / Claude Desktop
Add to `~/.claude.json` (or `.mcp.json` in your project root):
```json
{
  "mcpServers": {
    "mapsi": {
      "command": "npx",
      "args": ["-y", "mapsi-mcp"],
      "env": { "MAPSI_API_KEY": "msk_your_key_here" }
    }
  }
}
```

### Cursor
Add to `~/.cursor/mcp.json`:
```json
{
  "mcpServers": {
    "mapsi": {
      "command": "npx",
      "args": ["-y", "mapsi-mcp"],
      "env": { "MAPSI_API_KEY": "msk_your_key_here" }
    }
  }
}
```

### Windsurf
Add to `~/.codeium/windsurf/mcp_config.json` — same JSON format as Cursor above.

### VS Code + Cline
Open Cline settings → MCP Servers → Add server → paste:
```json
{
  "mapsi": {
    "command": "npx",
    "args": ["-y", "mapsi-mcp"],
    "env": { "MAPSI_API_KEY": "msk_your_key_here" }
  }
}
```

### Zed
Add to your Zed settings under `"context_servers"`:
```json
{
  "mapsi-mcp": {
    "command": { "path": "npx", "args": ["-y", "mapsi-mcp"] },
    "env": { "MAPSI_API_KEY": "msk_your_key_here" }
  }
}
```

**3. Restart your IDE** — then ask your AI in plain English.

---

## What You Can Ask Your AI

```
Geocode all addresses in my CSV and add lat/lon columns
Build an address autocomplete input for this React form using Mapsi
Draw a 20-minute drive isochrone from our warehouse at this coordinate
Find the 5 nearest hospitals to this coordinate
Migrate this Google Maps geocoding call to Mapsi
Add a MapLibre map with Mapsi light tiles and drop markers from this array
Calculate a distance matrix between 10 warehouses and 50 delivery stops
Snap this GPS trace to the road network and calculate total distance
```

---

## Available Tools (18)

### Geocoding
| Tool | Description |
|------|-------------|
| `geocode` | Address or place name → lat/lon. Returns confidence score (0–1); treat scores below 0.6 as ambiguous. |
| `reverse_geocode` | lat/lon → formatted address, street, city, postcode, country. |
| `autocomplete` | Real-time address suggestions as user types (min 2 chars). For UI input fields. |
| `normalize_address` | Standardize messy/inconsistent addresses. Returns structured fields + coordinates. |
| `timezone` | IANA timezone name + UTC offset + DST status for any coordinate. |
| `elevation` | Altitude in metres for any coordinate (~30m resolution globally). |

### Routing
| Tool | Description |
|------|-------------|
| `route` | Turn-by-turn directions. Modes: auto, truck, bicycle, pedestrian, motor_scooter. |
| `isochrone` | Reachability polygon within N minutes or N metres. Returns GeoJSON for MapLibre/Leaflet. |
| `matrix` | Travel time + distance matrix for up to 50×50 origin-destination pairs in one call. |
| `map_match` | Snap a GPS trace to the road network. **Coordinates are [lon, lat] order (GeoJSON).** |
| `nearest_road` | Find nearest routable road point. Call this if `route` returns "no route found". |

### Places
| Tool | Description |
|------|-------------|
| `places_search` | Find nearby POIs by category (restaurant, hospital, pharmacy, ATM…). Returns name, coords, categories. |

### Spatial
| Tool | Description |
|------|-------------|
| `point_in_polygon` | Admin hierarchy for a coordinate: country, region, city, neighbourhood. |
| `h3_index` | Convert coordinate to H3 hexagonal grid cell at resolution 0–15. |

### Batch
| Tool | Description |
|------|-------------|
| `batch_geocode` | Geocode up to 30,000 addresses in a single call. Never loop `geocode` for bulk data. |
| `batch_reverse_geocode` | Reverse geocode multiple coordinates in one call. |

### Tiles
| Tool | Description |
|------|-------------|
| `get_tile_style_url` | MapLibre GL style URL. Styles: light, dark, streets, topo, grayscale, black, white, liberty. |
| `get_static_map_url` | Static PNG map URL for use in `<img>` tags, emails, and PDFs. |

---

## Auth

- **API calls:** `X-API-Key` header (handled automatically by the MCP server)
- **Tile URLs:** `?key=` query param (browser-safe; returned by `get_tile_style_url`)

---

## Common Patterns for Agents

**Geocode once, reuse the result:**
```
Don't re-geocode the same address twice within a session. Cache the lat/lon and pass it directly to route, isochrone, and places_search.
```

**Bulk data → batch tools:**
```
For more than 1 address or coordinate pair, always use batch_geocode / batch_reverse_geocode.
```

**Route fails → nearest_road first:**
```
If route returns an error near the origin or destination, call nearest_road to snap the point to a routable road, then retry route with the snapped coordinates.
```

**Isochrone — time vs distance:**
```
Use contours_minutes for time-based reachability (delivery ETAs, commute zones).
Use contours_meters for fixed-radius circles on the road network.
Provide only one, not both.
```

---

## Pricing

| Plan | Calls/day | Batch size |
|------|-----------|------------|
| Free | 1,000 | 10 |
| Growth | 50,000 | 5,000 |
| Business | Unlimited | 30,000 |

Full pricing at [mapsi.dev/pricing](https://mapsi.dev/pricing)

---

## Links

- **Website:** [mapsi.dev](https://mapsi.dev)
- **API docs:** [mapsi.dev/docs](https://mapsi.dev/docs)
- **AI prompts:** [mapsi.dev/prompts-for-ai](https://mapsi.dev/prompts-for-ai)
- **npm:** [npmjs.com/package/mapsi-mcp](https://npmjs.com/package/mapsi-mcp)
- **GitHub:** [github.com/algolayer/mapsi-mcp](https://github.com/algolayer/mapsi-mcp)
- **Support:** support@mapsi.dev

---

## License

MIT — [algolayer.com](https://algolayer.com)

TDQS

A4.3/5.0

Scored across 18 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: autocomplete for UI, geocode for forward, reverse_geocode for reverse, batch variants for bulk, elevation, static/tile URLs, H3 indexing, isochrone, map matching, matrix, nearest road, normalization, places search, point-in-polygon, routing, and timezone. Even geocode and normalize_address differ in goal (coordinates vs. data quality). No overlap.

Naming Consistency4/5

Most tools follow verb_noun or noun patterns (e.g., batch_geocode, get_static_map_url, reverse_geocode, timezone). A few are single words (elevation, route, matrix), which is acceptable. No mixing of camelCase or snake_case (all lower_snake). Minor inconsistency but still predictable.

Tool Count4/5

18 tools is slightly above the typical 3-15 range but justified by the broad geospatial domain. Each tool covers a distinct operation (forward/reverse/bulk geocoding, routing, matrix, isochrone, map matching, etc.). No redundant or trivial tools.

Completeness5/5

The tool set covers the full lifecycle of geospatial operations: geocoding (forward, reverse, batch), routing (with multiple travel modes), matrix calculations, isochrones, map matching, place search, elevation, H3 indexing, point-in-polygon, timezone, tile/static map generation, and address normalization. No obvious gaps; it handles both common and advanced use cases.

Maintenance

ActivityInactive
ResponsivenessNo issues