Install
The server is published as
@maproll/mcp and listed in the
official MCP Registry as io.maproll/maproll. Source is at
github.com/maproll-io/mcp. It needs Node
20 or newer, and no credentials to make a map.
Claude Code
claude mcp add maproll -- npx -y @maproll/mcp
Claude Desktop
Settings → Developer → Edit Config, then add:
{
"mcpServers": {
"maproll": {
"command": "npx",
"args": ["-y", "@maproll/mcp"]
}
}
}
Restart Claude Desktop afterwards.
Cursor
Add the same block to .cursor/mcp.json in your project, or to
~/.cursor/mcp.json to make it available everywhere.
VS Code
Add it to .vscode/mcp.json:
{
"servers": {
"maproll": {
"command": "npx",
"args": ["-y", "@maproll/mcp"]
}
}
}
Any other MCP client
The server speaks stdio. Run it directly:
npx -y @maproll/mcp
Checking it works
Ask your assistant for a map — "map coffee consumption per capita" is a reasonable first test. You should get a rendered map back, plus a URL.
If nothing happens, check the tool list your client exposes; the server
advertises four tools, create_map, add_layers, find_places and
describe_options. If they are absent, the client did not start the server —
usually a Node version below 20, or a config file in the wrong place.
Turning the wordmark off
Every render the server makes is tagged src=mcp, and src=mcp without a
valid key forces the maproll wordmark on. A logo=false passed through
extra is ignored in that case.
Set a key and it stops being forced: logo defaults to off, and
extra: { logo: false } works.
- Open the editor at app.maproll.io and mint a key
in the API keys panel. Keys look like
mr_live_…and expire after 90 days. - Put it in the server's environment:
{
"mcpServers": {
"maproll": {
"command": "npx",
"args": ["-y", "@maproll/mcp"],
"env": {
"MAPROLL_API_KEY": "mr_live_…"
}
}
}
}
In Claude Code, claude mcp add maproll -e MAPROLL_API_KEY=mr_live_… -- npx -y @maproll/mcp
does the same thing.
What the server does with the key
The render API refuses to read a raw key from a query string, because a key in a URL ends up baked into every embed that URL is pasted into. So the server never sends one. It appends two parameters instead:
| Parameter | What it is |
|---|---|
k | The key's payload — the identifying part, without the secret. |
t | An HMAC over that exact URL's parameters. |
The API recomputes both and verifies them with no database lookup. Two consequences worth knowing before you publish a keyed map:
- The token is bound to one map. Copying
kandtonto a different URL does nothing — the signature no longer matches the parameters. - Expiry is visible in published embeds. When the key expires, an embed URL you published months ago starts carrying the wordmark again. Rotate the key before the 90 days are up if you have keyed embeds in the wild, and re-render the maps.
OpenStreetMap attribution is on with or without a key. That is a licence obligation, not branding.
For calling the render API directly rather than through MCP, a key travels as
Authorization: Bearer mr_live_… or X-Api-Key — see
Authentication.
Configuration
| Variable | Default | Purpose |
|---|---|---|
MAPROLL_PLACES_URL | https://mcp.maproll.io/places | Where find_places resolves names. Override only for local development. |
MAPROLL_API_KEY | unset | A mr_live_… key. Signs the URLs the server returns, which is what lets you turn the wordmark off. |
Neither is required. Without a key the server still makes every map it can make — the maps just carry the maproll wordmark.