MapLibre MCP
An MCP server that lets AI agents validate, inspect, render, and compare MapLibre styles and data, running locally with no API key.
validate_style— check a style against the MapLibre Style Specification and list every problem with property paths.describe_style_spec— look up layer types, properties, source types, and expression operators with docs and version support.describe_gl_js_api— look up MapLibre GL JS classes, methods, options, and events in its type definitions (any version).describe_sources— read TileJSON/PMTiles/GeoJSON metadata and find layers using missing source layers or fields.inspect_tile— read the vector tile (MVT/MLT) at a place and zoom to see source layers, geometry types, field values, and example features.debug_layers— say whether each layer draws at a place and zoom, and why not (filters, zoom, opacity, missing icons, source layers, glyphs).format_styleandmigrate_style— format or migrate a style in place, likegl-style-formatandgl-style-migrate.render_style— render a style to a PNG with a chosen camera and report errors and missing icons.compare_styles— render before/after styles side by side with pixel differences highlighted in red.compare_renderers— compare one style across renderers (e.g. GL JS vs Native) to check consistency.show_map— show the user an interactive map with GeoJSON layers and markers on an OpenFreeMap basemap (MCP Apps clients).martin_list_sources— list tiles, sprites, fonts, and styles a Martin server serves, with URLs to use.Toolsets let you enable only the groups you need (
style,gl-js,native,martin, orall), and rendering/data tools also run as CLI commands without MCP.
Provides tools for validating, rendering, and comparing MapLibre styles, inspecting sources, and showing interactive maps, enabling agents to build and debug MapLibre maps.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@MapLibre MCPValidate my map style and render it so I can see the result"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
maplibre-mcp
An MCP server that lets AI agents check, render and show MapLibre styles.

An agent turned the motorways in OpenFreeMap's Liberty style red, and compare_styles showed it the map before, after, and the pixels that changed.
Coding agents like Claude Code, Codex and Cursor can edit a MapLibre style, but they can't see the map, and they can mix up MapLibre and Mapbox. With maplibre-mcp, an agent can validate a style against the MapLibre Style Specification, render it with MapLibre GL JS, MapLibre Native or a Martin server, compare two versions of it, and show you an interactive map in the chat. It runs on your machine and needs no API key.
Website · Getting started · Examples · Tools
Install
It needs Node.js 22 or newer.
Client | Command |
Claude Code |
|
Codex |
|
Gemini CLI |
|
Grok |
|
VS Code |
|
Claude Desktop, Cursor, Windsurf and most other clients read this JSON. Getting started says where each one keeps it.
{
"mcpServers": {
"maplibre": {
"command": "npx",
"args": ["-y", "maplibre-mcp"]
}
}
}Rendering with MapLibre GL JS uses the installed Google Chrome. Without Chrome, the first render fails with the command that installs the Chromium it can use instead.
Related MCP server: Magic Lane MCP Server
Command line
Agents that work in a shell, and people, can also run the rendering and data tools, and the GL JS API lookup, as commands, without setting up MCP. A style is a file or a URL.
npx -y maplibre-mcp render style.json --center 12.57,55.68 --zoom 12
npx -y maplibre-mcp compare before.json after.json --zoom 10
npx -y maplibre-mcp compare-renderers style.json --renderers gl-js,native
npx -y maplibre-mcp describe-sources style.json
npx -y maplibre-mcp debug-layers style.json --center 12.57,55.68 --zoom 14
npx -y maplibre-mcp inspect-tile https://tiles.openfreemap.org/planet --center 12.57,55.68 --zoom 14
npx -y maplibre-mcp describe-gl-js-api Map#flyToThe images go to map.png, compare.png and renderers.png, or to --out. npx -y maplibre-mcp --help lists the options, and Command line has the details. To validate, format or migrate a style, use gl-style-validate, gl-style-format and gl-style-migrate from @maplibre/maplibre-gl-style-spec.
Tools
validate_stylechecks a style against the MapLibre Style Specification, and lists each problem with the path to its property.describe_style_speclooks up a layer type, property, source type or expression, with its documentation and the GL JS and Native versions that support it. For a misspelled name, it suggests the closest real ones.describe_gl_js_apilooks up a class, method, option or event of MapLibre GL JS, with its signature, documentation, default and examples, in the type definitions of the version the server renders with, or of another version. It also says when a method is not in MapLibre, like one from Mapbox GL JS.describe_sourcesreads the TileJSON, PMTiles header or GeoJSON of each source in a style, lists the source layers and fields, and finds layers that use a source layer or field that is not there.inspect_tilereads the vector tile at a place and lists each source layer with its geometry types, the values of its fields and how often they occur, and a few example features, plus the zoom range of the source and the source layers the tile lacks. The source can be a source in a style, a TileJSON URL like a Martin source, a PMTiles archive or a tile URL, with MVT or MLT tiles.debug_layerssays for each layer of a style whether it draws at a place and zoom, and if not, why, like a missing source layer, a filter that matches nothing (next to the values the data has), a fill layer without polygons, paint that comes out as 0 or transparent, or icons missing from the sprite. It also notes text that falls back to local fonts, since the glyph server lacks its font stack.format_styleandmigrate_styledo whatgl-style-formatandgl-style-migratedo. Given a file, they rewrite it.render_stylerenders a style to a PNG, and reports map errors and missing icons. It takes a center, zoom, bearing and pitch, or bounds to fit.compare_stylesrenders two versions of a style at the same camera, and returns one image with the style before, after, and their differences in red.compare_renderersdoes the same for one style in two renderers, for example to check that a style looks the same on the web and on mobile.show_mapshows the user an interactive map with GeoJSON layers and markers on an OpenFreeMap basemap, in clients that support MCP Apps.martin_list_sourceslists the tiles, sprites, fonts and styles a Martin server serves, with the URLs to use in a style.
The tools that take a style accept it as an object (style), a URL (url) or a file (path, relative to where the server runs). The tool reference lists every parameter.
Toolsets
The tools are grouped by the MapLibre project they belong to. style and gl-js are on by default. Choose others with --toolsets, or with the MAPLIBRE_MCP_TOOLSETS environment variable, and all turns on every toolset:
npx -y maplibre-mcp --toolsets style,gl-js,martinToolset | What it adds |
|
|
| Rendering with MapLibre GL JS, |
| Rendering with MapLibre Native |
| Rendering with a Martin server, and |
With any renderer on, there are render_style and compare_styles, and with two or more, compare_renderers. Rendering with MapLibre Native needs one more package, and rendering with Martin needs a Martin build with rendering. Rendering covers both.
Remote server
--http serves Streamable HTTP at http://127.0.0.1:3100/mcp instead of stdio, and --host and --port change the address. On a loopback address it only answers requests from localhost. On any other address it does not read or write files, it still fetches the URLs it is given from its own network, and it has no authentication, so put it behind a proxy that has. Remote server has the details.
Development
npm install
npm test
npm run dev:siteLicense
MIT © 2026 Birk Skyum
Available Tools
11 toolscompare_stylesCompare stylesARead-only
Renders two versions of a MapLibre style at the same camera, and returns one image with the style before, the style after, and their differences in red. Use it after changing a style, to check that the change did what you meant and nothing else, at a few places and zoom levels. Pass each style as an object, a URL or a file path.
| Name | Required | Description | Default |
|---|---|---|---|
| zoom | No | ||
| after | Yes | The style after the change. | |
| pitch | No | Tilt in degrees from looking straight down. | |
| width | No | Width of each of the three images. | |
| before | Yes | The style before the change. | |
| bounds | No | [west, south, east, north] to fit the map to, instead of center and zoom. | |
| center | No | [longitude, latitude] of the map center. | |
| height | No | ||
| bearing | No | The compass direction at the top of the map, in degrees. | |
| renderer | No | The MapLibre renderer to draw both with. | gl-js |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds meaningful behavioral context beyond that: the output layout (before, after, and differences in red), the fixed-camera condition, and the flexible style input forms (object, URL, or file path). This is richer than simply restating annotation signals.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler: the first states the core behavior and output, the second gives the intended use case and input formats. Every clause earns its place, and the most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 10 parameters, nested objects, and no output schema, the description covers the essential return value (one image with before/after/differences), the invocation context, and the accepted style representations. Parameter defaults and constraints are already in the schema, so nothing critical is missing for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is high at 80%, and the schema already documents each parameter with descriptions. The description adds value by summarizing how to supply styles ('Pass each style as an object, a URL or a file path') and by implying that center/zoom/bounds/bearing/pitch are shared across both renders via 'at the same camera.' This compensates for the remaining undocumented parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise verb and resource: it renders two MapLibre style versions at the same camera and returns an image showing before, after, and differences in red. This inherently distinguishes it from siblings like render_style (single render) and validate_style (validation), even without naming them. The output artifact is also specified, leaving no ambiguity about what the tool accomplishes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool: 'Use it after changing a style, to check that the change did what you meant and nothing else, at a few places and zoom levels.' It does not explicitly mention when not to use it or name alternative tools, but the guidance is concrete and actionable for an agent deciding to invoke it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
debug_layersDebug layersARead-only
Says for each layer of a style whether it draws anything at a place and zoom, and when it draws nothing, why: it is hidden or outside its zoom range, the tile lacks its source layer, its filter matches no feature (listed with the values the tile has), a fill layer gets no polygons, its opacity, width or size is 0 or its color transparent, or icons are missing from the sprite. It also notes text that GL JS draws with local fonts and MapLibre Native leaves out, because the style has no glyphs URL or the glyph server lacks its font stack. It reads the vector tiles and GeoJSON data at the place. Use it when a layer draws nothing. Pass the style as an object, a URL or a file path.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | URL of a style JSON document. | |
| path | No | Path to a style JSON file, relative to the directory the server runs in. | |
| zoom | No | Zoom level. Defaults to the zoom of the style. | |
| style | No | The style as a JSON object. | |
| center | No | [longitude, latitude] of the place. Defaults to the center of the style. | |
| layers | No | Only check these layers, by id. Defaults to every layer. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint; the description adds substantial behavior: it reads vector tiles and GeoJSON at the place, enumerates the failure causes it detects (hidden, out of zoom, missing source-layer, filter match, fill geometry, opacity/width/size/color, sprite icons), and flags GL JS vs MapLibre Native text differences from missing glyphs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and dense with useful detail, but the second sentence is a long run-on list of causes that could be trimmed or split for faster scanning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so by describing the per-layer verdict and reasons reported, and the GL JS/MapLibre text caveat. An agent has enough to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds meaning beyond the schema by clarifying that the style may be supplied as an object, a URL, or a file path (i.e., the style/url/path params are alternatives), and that the data is read 'at the place'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: reports, per style layer, whether it draws anything at a place/zoom and the reason when it does not. It enumerates the diagnostic categories, making it clearly distinct from siblings like validate_style or inspect_tile.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit triggering context ('Use it when a layer draws nothing') and the input forms to pass. It does not name an alternative sibling such as inspect_tile for the case where a layer draws something unexpected, so it stops short of full when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
describe_gl_js_apiDescribe GL JS APIARead-only
Looks up a class, method, option, event or function of MapLibre GL JS, like "Map", "Map#flyTo", "MapOptions.maxPitch", "click" or "addProtocol", in the type definitions that GL JS ships. Returns its signature, documentation, parameters, default and examples, and for a class or an options type, its members. Answers for the GL JS version this server renders with, or for another version, like the one a project uses. Check here before using a method or option you are not sure exists in MapLibre, since Mapbox GL JS has some that MapLibre GL JS does not.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The name to look up, like "Map#flyTo", "flyTo" or "MapOptions". | |
| version | No | A GL JS version or range, like "5.6.0" or "5", whose type definitions are fetched from jsDelivr. Defaults to the version this server renders with. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint and openWorldHint, so safety is already covered. The description adds meaningful behavior beyond that: results are scoped to a GL JS version, non-default versions are fetched from jsDelivr, and the return content (signature, documentation, parameters, default, examples, class/options members) is disclosed. It does not discuss latency or failure modes of the remote fetch, which is a minor gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler: purpose and accepted key formats first, then what is returned, then version scoping and the Mapbox caveat. The example keys are load-bearing disambiguation rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so explicitly. It covers lookup targets, return payload, versioning behavior, and the primary risk (assuming Mapbox-only APIs exist in MapLibre), leaving nothing an agent needs to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents both parameters and the baseline is 3. The description goes further by showing accepted name shapes ("Map", "Map#flyTo", "MapOptions.maxPitch", "click", "addProtocol") and clarifying that version may be a range like "5" or a point release, plus what the default resolves to.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (looks up) and a precise resource (class, method, option, event, or function of MapLibre GL JS), reinforced by concrete example keys like "Map#flyTo" and "MapOptions.maxPitch". It is clearly distinguishable from sibling tools such as describe_style_spec or describe_sources, which cover style/source spec material rather than the GL JS API surface.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent to check here before using a method or option whose existence is uncertain, and explains the Mapbox-vs-MapLibre divergence as the reason. It also explains version selection (server version by default, or a project's version). It stops short of naming a sibling tool as an alternative, so it is clear context rather than a full when/when-not/alternatives statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
describe_sourcesDescribe sourcesARead-only
Reads the metadata of every source in a MapLibre style (TileJSON, PMTiles headers and GeoJSON data) and lists the source layers and fields each one provides. Then checks that every layer uses a source, source layer and fields that exist. Use it before writing layers against data you do not know. inspect_tile shows the values the fields take, and debug_layers says what each layer draws at a place. Pass the style as an object, a URL or a file path.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | URL of a style JSON document. | |
| path | No | Path to a style JSON file, relative to the directory the server runs in. | |
| style | No | The style as a JSON object. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true, and the description consistently describes read-only actions ('Reads', 'checks'). It adds context beyond annotations by detailing the verification step and the input flexibility (object, URL, path). No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is about four sentences and contains no filler. It front-loads the core function, then usage guidance, alternatives, and input methods. It could be slightly tighter but each sentence contributes essential information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only inspection tool with no output schema, the description covers purpose, when to use, alternatives, and input methods. It implies the output (lists and checks) well enough for an agent to understand what to expect. No critical gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with each parameter described, so baseline is 3. The description adds value by clarifying that the three parameters are alternative ways to pass the style ('as an object, a URL or a file path'), which is not explicitly stated in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reads metadata of every source, lists source layers and fields, and checks layer-source consistency. It distinguishes itself from siblings by explicitly naming inspect_tile and debug_layers and explaining their different purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says 'Use it before writing layers against data you do not know,' providing a clear when-to-use condition. It also mentions alternatives (inspect_tile, debug_layers) and what each does, enabling correct tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
describe_style_specDescribe style specARead-only
Looks up a name in the MapLibre Style Specification: a layer type (like "fill"), a layer or root property (like "fill-extrusion-height" or "sky"), a source type (like "geojson") or an expression operator (like "interpolate"). Returns its documentation, type, default, allowed values, expression support and which MapLibre GL JS and MapLibre Native versions support it. Check here before using a property you are not sure exists in MapLibre, since Mapbox GL JS has properties that MapLibre does not.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The name to look up. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, and the description aligns with that by describing a lookup operation with no side effects. Beyond the annotation, it discloses what the tool returns (documentation, type, default, allowed values, expression support, version support) and the Mapbox/MapLibre nuance, which gives the agent a fuller picture of behavior without contradicting the provided metadata.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no filler. It front-loads the core purpose, then quickly enumerates the accepted name categories with examples, and closes with a practical usage tip. Every sentence contributes value: purpose, scope of inputs, and the Mapbox caveat. This is well-structured and appropriately sized for a simple lookup tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter lookup tool with no output schema, the description is complete. It covers what kinds of names are accepted, what information is returned, and includes the key caution about MapLibre vs Mapbox. Given the tool's simplicity and the annotations providing the read-only safety profile, nothing essential for an agent to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the parameter 'name' already has a description ('The name to look up.'). The description adds meaningful context by listing concrete examples of valid values (e.g., 'fill', 'fill-extrusion-height', 'geojson', 'interpolate') and clarifying that these encompass layer types, properties, source types, and expression operators. This goes beyond the schema's generic description and helps the agent format the argument correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('looks up a name') and the specific resource ('MapLibre Style Specification'), enumerating the exact types of names it handles (layer types, properties, source types, expression operators). It also distinguishes itself from sibling tools by noting it returns documentation and version support, and explicitly contrasts MapLibre with Mapbox, which signals its unique scope among the listed siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear usage directive: 'Check here before using a property you are not sure exists in MapLibre' and explains the reasoning (Mapbox has properties MapLibre does not). This tells the agent when to invoke it. It doesn't explicitly name alternatives to avoid, but given the tool's niche nature and the specific trigger, the guidance is sufficient for correct selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
format_styleFormat styleAIdempotent
Formats a MapLibre style with the keys in the order of the style specification and two space indentation, the same way as gl-style-format. A style given as a file path is formatted in place, otherwise the formatted JSON is returned.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | URL of a style JSON document. | |
| path | No | Path to a style JSON file, relative to the directory the server runs in. | |
| style | No | The style as a JSON object. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate idempotentHint=true and destructiveHint=false, and the description adds important behavioral context: formatting in place modifies the file, while passing a style object or URL returns formatted JSON. It also clarifies the exact formatting style (specification order, two-space indentation). The description does not contradict annotations; it complements them with mode-specific behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence that front-loads the core function and then clarifies the two modes. Every clause earns its place, and there is no redundant or vague wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a formatting tool with no output schema, the description adequately explains what happens in each mode. It could be more complete by noting whether the URL input is fetched and formatted in memory or written back, and whether the style object is mutated. However, given the tool's simplicity and the annotations covering idempotency and non-destructiveness, the description is largely sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters (url, path, style). The description adds the key behavioral distinction between path (in-place) and the other inputs (returned JSON), which is valuable. However, it does not explain how the three parameters interact (e.g., mutual exclusivity or precedence), so the description adds only moderate value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: it formats a MapLibre style with keys in specification order and two-space indentation, matching gl-style-format. It also distinguishes the two modes of operation (in-place file formatting vs. returning formatted JSON), which makes the purpose unambiguous and differentiates it from sibling tools like validate_style or render_style.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the two usage modes: if a file path is given, the file is formatted in place; otherwise, the formatted JSON is returned. This gives clear context for when to use the tool. However, it does not explicitly state when not to use it or mention alternatives among siblings, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_tileInspect tileARead-only
Reads the vector tile of a source at a place and zoom, and lists each source layer with its number of features, their geometry types, the values of each field and a few example features. It also gives the zoom range of the source and the source layers its metadata lists that the tile lacks. Use it to learn the values data really has, like the classes of roads, before writing filters and expressions. The source is either the id of a source in the style you pass, or the URL of a vector source: a TileJSON URL like a Martin source, a PMTiles archive, or a tile URL with {z}, {x} and {y}. Reads MVT and MLT tiles.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | URL of a style JSON document. | |
| path | No | Path to a style JSON file, relative to the directory the server runs in. | |
| zoom | No | Zoom level of the tile. Defaults to the zoom of the style, or the highest zoom of the source. | |
| layer | No | Only list this source layer. | |
| style | No | The style as a JSON object. | |
| center | No | [longitude, latitude] of the place to read. Defaults to the center of the style or the source. | |
| source | No | The id of a source in the style, or the URL of a vector source. Defaults to the only vector source of the style. | |
| examples | No | How many example features to show for each source layer. Defaults to 3. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds real behavioral context beyond that: it explains the dual source-resolution model (style source id vs. a TileJSON/PMTiles/tile URL), discloses supported formats (MVT and MLT), and notes it reports metadata layers that the tile lacks — a non-obvious diagnostic behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Roughly four sentences, front-loaded with the what-then-what-you-get, then usage, then source resolution, then formats. Dense but every clause carries information. Minor redundancy between the return-value sentence and the param semantics of 'source', which slightly dilutes sharpness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly carries the full burden of explaining the return shape, and does so thoroughly (layer list, feature counts, geometry types, field values, examples, zoom range, missing layers). All eight parameters are documented in the schema, and the non-obvious 'source' semantics are covered in prose. Nothing an agent needs to invoke it correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds genuine meaning on top by clarifying that 'source' accepts either a style source id or a vector-source URL and naming the concrete URL forms (TileJSON, PMTiles, {z}/{x}/{y}), which the schema's brief 'id of a source in the style, or the URL' does not fully spell out.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Reads the vector tile of a source at a place and zoom') and then enumerates exactly what it returns — source layers, feature counts, geometry types, field values, examples, and the source's zoom range. This is detailed enough to distinguish it from siblings like describe_sources and debug_layers, which operate at a different level.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the motivating context: 'Use it to learn the values data really has, like the classes of roads, before writing filters and expressions.' That is a concrete when-to-use. It stops short of naming which sibling to use instead when the agent only wants metadata or validation, so it lacks the explicit alternative-routing of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
migrate_styleMigrate styleAIdempotent
Migrates an old style to the current MapLibre Style Specification, the same way as gl-style-migrate: version 7 styles become version 8, and legacy functions and filters become expressions. A style given as a file path is migrated in place, otherwise the migrated JSON is returned.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | URL of a style JSON document. | |
| path | No | Path to a style JSON file, relative to the directory the server runs in. | |
| style | No | The style as a JSON object. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly=false, idempotent=true, destructive=false). The description adds meaningful behavioral context beyond those annotations: file-path styles are migrated in place while others return migrated JSON, and it specifies what the migration actually changes. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The core operation, transformation details, and side-effect behavior are all present and front-loaded, with no redundant restatement of the title or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with three optional parameters and no output schema, the description covers the input modes, the transformation scope, and the return behavior. It lacks only minor details such as error handling and explicit mutual exclusivity of parameters, but is otherwise sufficient for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters. The description adds the important behavioral distinction between path-based in-place migration and other inputs returning JSON, but this is behavioral rather than parametric; the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Migrates an old style to the current MapLibre Style Specification.' It adds concrete transformation details (v7 to v8, legacy functions/filters to expressions) and names gl-style-migrate, making its scope clear and distinguishing it from siblings such as format_style and validate_style.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when the tool is used—migrating old styles—and explains the path vs. non-path behavior. However, it does not explicitly say when not to use it or name alternatives, leaving the agent to infer from sibling names rather than being directed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
render_styleRender styleARead-only
Renders a MapLibre style to a PNG image, so you can see what the style looks like, for example after changing it. Also reports what the renderer noticed, such as style errors, failed requests and missing icons. Pass the style as an object, a URL or a file path. Without center, zoom or bounds, the camera stored in the style is used.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | URL of a style JSON document. | |
| path | No | Path to a style JSON file, relative to the directory the server runs in. | |
| zoom | No | ||
| pitch | No | Tilt in degrees from looking straight down. | |
| style | No | The style as a JSON object. | |
| width | No | ||
| bounds | No | [west, south, east, north] to fit the map to, instead of center and zoom. | |
| center | No | [longitude, latitude] of the map center. | |
| height | No | ||
| bearing | No | The compass direction at the top of the map, in degrees. | |
| renderer | No | The MapLibre renderer to draw with. | gl-js |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds genuinely useful behavioral context by stating the tool also 'reports what the renderer noticed, such as style errors, failed requests and missing icons', plus the fallback-to-style-camera behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the primary purpose, then the extra output, then input variations and default behavior. Every sentence earns its place with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter tool with no output schema, the description covers what the tool produces (PNG, plus renderer observations) and how to provide input. It does not spell out where the PNG is returned or saved, but that is partially implied and not critical for initial selection.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 73% schema coverage, the schema already documents most parameters. The description adds meaningful grouping ('Pass the style as an object, a URL or a file path') and clarifies the interaction between camera parameters and the style's stored camera, which is information not present in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: 'Renders a MapLibre style to a PNG image', with a concrete use case ('see what the style looks like, for example after changing it'). This clearly separates it from validation/spec/comparison siblings, even if show_map overlaps slightly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for when to use the tool ('after changing it') and explains the camera fallback behavior. It does not explicitly name alternatives or exclusion conditions, but the intended use is clear enough to guide selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
show_mapShow mapARead-only
Shows the user an interactive MapLibre map in the chat, with GeoJSON layers and markers on an OpenFreeMap basemap. The user sees the map and you do not; to look at a map yourself, use render_style. Without center and zoom, the map fits the layers and markers. Needs a client that supports MCP Apps.
| Name | Required | Description | Default |
|---|---|---|---|
| zoom | No | ||
| pitch | No | ||
| center | No | [longitude, latitude] of the map center. | |
| layers | No | ||
| basemap | No | The OpenFreeMap style to draw on. | liberty |
| bearing | No | ||
| markers | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true, and the description adds important context beyond that: the user sees the map while the agent does not, and the map auto-fits layers and markers without center/zoom. It also notes the client requirement, which is useful operational context. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four concise sentences with no wasted words. The core purpose is front-loaded, followed by the critical user-versus-agent caveat, the alternative tool, auto-fit behavior, and the client requirement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a display-only tool with zero required parameters, the description covers the essential operational details: what the user sees, what the agent cannot see, the alternative for self-inspection, auto-fit behavior, and client compatibility. The schema handles the parameter specifics, so nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is low at 29%, so the description partially compensates by clarifying the interaction between center/zoom and layer auto-fitting. It also confirms layers and markers are GeoJSON-based. However, it does not add meaning for pitch, bearing, or basemap behavior beyond what the schema already provides, so the compensation is incomplete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: showing an interactive MapLibre map with GeoJSON layers and markers on an OpenFreeMap basemap. It also distinguishes itself from the sibling render_style by clarifying that the map is for the user, not for the agent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells the agent when to use this tool versus an alternative: 'to look at a map yourself, use render_style.' It also adds a practical prerequisite, 'Needs a client that supports MCP Apps,' and explains the auto-fit behavior when center and zoom are omitted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_styleValidate styleARead-only
Checks a MapLibre style against the MapLibre Style Specification and lists every problem, each with the path to the property it is about. Run it after editing a style. Pass the style as an object, a URL or a file path.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | URL of a style JSON document. | |
| path | No | Path to a style JSON file, relative to the directory the server runs in. | |
| style | No | The style as a JSON object. |
Output Schema
| Name | Required | Description |
|---|---|---|
| problems | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the description doesn't need to repeat those. It adds useful behavioral context about the output format ('lists every problem, each with the path to the property'), which goes beyond the annotations. It doesn't mention any limitations or side effects, but given the read-only nature and the output schema, this is sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. The first sentence states the core purpose and output, and the second gives usage guidance and input options. Every sentence earns its place, and the most important information is front-loaded. It is appropriately sized for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity, full schema coverage, an output schema (which explains return values), and annotations covering read-only behavior, the description is complete. It covers purpose, usage trigger, and input options. It doesn't mention version-specific validation or potential limitations, but these are not critical for an agent to call the tool correctly. The output schema handles return details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so each parameter (url, path, style) is already documented in the schema. The description adds a high-level summary ('Pass the style as an object, a URL or a file path') that maps to the three parameters, but doesn't provide any additional semantics beyond what the schema already offers. This meets the baseline for high coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Checks'), a specific resource ('MapLibre style'), and the standard it validates against ('MapLibre Style Specification'). It also clarifies the output ('lists every problem, each with the path to the property'), which distinguishes it from sibling tools like render_style or compare_styles. An agent can immediately understand what this tool does and how it differs from others.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context: 'Run it after editing a style.' This tells the agent when to invoke it. It does not explicitly mention alternatives or exclusions, but the trigger is specific enough. Sibling tools have distinct purposes, so the lack of explicit 'when not to use' is acceptable given the clear context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v0.6.1- Added
describe_gl_js_api
2 tool updates
v0.3.0- Added
debug_layers - Added
inspect_tile
8 tool updates
v0.1.0- First observed
compare_styles - First observed
describe_sources - First observed
describe_style_spec - First observed
format_style - First observed
migrate_style - First observed
render_style - First observed
show_map - First observed
validate_style
TDQS
Scored across 11 tools
Each tool targets a clearly distinct action: formatting, migrating, validating, rendering, comparing, debugging, inspecting tile data, describing sources/spec/API, or showing a map. Descriptions explicitly clarify boundaries between similar-seeming tools (e.g., describe_sources vs inspect_tile vs debug_layers).
All tool names use snake_case and a verb_noun pattern consistently (format_style, migrate_style, inspect_tile, debug_layers, compare_styles, describe_sources, render_style, show_map, validate_style). The longer names for API/spec lookups follow the same pattern.
Eleven tools are well-scoped for a MapLibre style assistance server, covering transformation, validation, rendering, inspection, and reference without redundancy. Neither too few nor too many for the domain.
The set covers the full lifecycle of working with MapLibre styles: format, migrate, validate, render, compare, debug layers, inspect tile data, describe sources, look up GL JS API and style spec, and show a map. No obvious missing operations for the server's apparent purpose.
Maintenance
Related MCP Connectors
AI access to Mapbox docs, API references, style specs, and guides. No token required.
Provides AI assistants with direct access to Mapbox developer APIs and documentation.
- geoOAuthco.thinair
Geocoding, routing, isochrones, traffic, weather, and place search for AI agents. 19 MCP tools.
OpenStreetMap queries, maps/styles, search, routing, terrain, analysis, pipelines, and rendering.
Related MCP Servers
AlicenseAqualityAmaintenanceProvides geospatial intelligence to AI agents through Mapbox APIs, enabling geocoding, routing, POI search, map images, and offline spatial calculations.281,885 npm357MIT
Magic Lane MCP Serverofficial
AlicenseBqualityBmaintenanceEnables AI agents to become geospatially intelligent assistants with tools for location search, smart routing, round trip planning, reverse geocoding, isochrone analysis, route visualization, geofence management, and interactive map display.822 npm7Apache 2.0- AlicenseAqualityAmaintenanceEnables AI assistants to interact with Mapbox developer APIs for style management, token management, and local processing tasks like GeoJSON preview and coordinate conversion.23665 npm60MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to perceive and control a live MapLibre GL map over MCP, allowing querying rendered features, reading popups, navigating, and toggling layers.1MIT