maplibre-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.
It validates styles against the MapLibre Style Specification, looks up properties and expressions, checks that layers match the data in their sources, and renders styles with MapLibre GL JS, MapLibre Native or a Martin server, so an agent can see what it built and what a change did. In chats that support MCP Apps, it also shows the user an interactive map.
Everything runs on your machine, and no API key is needed.
The website replays an agent session that uses it.
Setup
Claude Code:
claude mcp add maplibre -- npx -y maplibre-mcpClaude Desktop, Cursor and most other clients:
{
"mcpServers": {
"maplibre": {
"command": "npx",
"args": ["-y", "maplibre-mcp"]
}
}
}Rendering with MapLibre GL JS uses the installed Google Chrome. Without Chrome, install Playwright's Chromium with npx playwright-core install chromium.
To run it as a remote server over Streamable HTTP, start it with --http. It listens on http://127.0.0.1:3100/mcp, and --host and --port change that. On a loopback address it only answers requests from localhost. On any other address it does not read or write files, and it still fetches the URLs it is given from its own network. It has no authentication, so put it behind a proxy that has.
Related MCP server: Magic Lane MCP Server
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:
npx -y maplibre-mcp --toolsets style,gl-js,martinToolset | Tools |
|
|
|
|
| Rendering with MapLibre Native |
|
|
all turns on every toolset. With any renderer on, there are render_style and compare_styles, and with two or more, compare_renderers.
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, or a Mapbox property MapLibre does not have, it suggests the closest real ones.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.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.martin_list_sourceslists the tiles, sprites, fonts and styles a Martin server serves, with the URLs to use in a style. It asksMARTIN_URL, orhttp://localhost:3000.
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).
MapLibre Native
The native toolset needs @maplibre/maplibre-gl-native, which has builds for macOS, Windows and Ubuntu 24.04. Install it next to the server:
npx -y -p maplibre-mcp -p @maplibre/maplibre-gl-native maplibre-mcp --toolsets style,gl-js,nativeOn Node.js 26, use @maplibre/maplibre-gl-native@next. On Ubuntu, the build needs these libraries:
sudo apt-get install libopengl0 libglx0 libjpeg-turbo8 libuv1t64 libx11-6 libxext6 libwebp7 libicu74 libpng16-16t64It also needs a display, so on a server without one, start the server with xvfb-run -a.
MapLibre Native does not draw terrain, the sky or the globe yet, and render_style says so when a style uses them.
Martin
With the martin toolset, the renderers can include a Martin server, which renders with MapLibre Native on Linux. It draws the styles Martin serves, so pass the style as url: "http://localhost:3000/style/<id>". Martin picks up changes to its style files right away, so an agent can edit a style file and render it again.
Rendering needs a Martin build with it, like the nightly-full Docker image, and this in Martin's configuration:
styles:
paths:
- /path/to/styles
rendering: trueDevelopment
npm install
npm testThis project is meant to move into the MapLibre GitHub organization.
License
MIT © 2026 Birk Skyum
Available Tools
8 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.
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, and 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. | |
| style | No | The style as a JSON object. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already mark it readOnly and openWorld; the description confirms a non-destructive read-and-check behavior. It adds value beyond the annotations by explaining that the tool lists per-source layers/fields and cross-checks layer references, and by clarifying accepted style inputs.
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 deliver the operation, the validation behavior, concrete use cases, and input forms without any filler. The main action and when-to-use guidance are 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 no required parameters and no output schema, the description gives enough to invoke it correctly: what it inspects, what it validates, when to call it, and the three supported inputs. It leaves open the exact return structure, but the stated behavior ('lists' and 'checks') covers the essential expectations.
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?
The input schema already describes all three parameters at 100% coverage. The description's 'object, a URL or a file path' maps cleanly to style/url/path, but it doesn't state that exactly one should be provided or define precedence, so it adds little beyond the schema baseline.
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 concrete operation—'Reads the metadata of every source'—and enumerates what it produces ('lists the source layers and fields') plus the validation it performs. This makes it easy to distinguish from siblings like describe_style_spec (spec-level) and validate_style (style-level), since the focus is squarely on sources and their data layers.
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 explicit triggers: use it 'before writing layers against data you do not know' and 'when a layer draws nothing.' It doesn't mention when not to use it or name alternatives, so it misses the top rung but provides solid contextual guidance.
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.
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.
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 8 tools
Each tool has a distinct purpose: rendering, comparing, validating, spec lookup, source inspection, formatting, migration, and interactive display. Descriptions clearly differentiate between agent-facing and user-facing map views, eliminating ambiguity.
All tool names follow a consistent verb_noun snake_case pattern (render_style, validate_style, describe_sources, etc.), making the set predictable and easy to reason about.
With 8 tools, the server is well-scoped for the domain of MapLibre style management. Each tool covers a distinct aspect without redundancy or bloat.
The tool surface covers the full style workflow: rendering, comparison, validation, specification lookup, source metadata inspection, formatting, migration, and user display. No obvious gaps for the stated 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.
Independent directory of agentic AI tools — search, compare & recommend via MCP. Read-only.
Related MCP Servers
AlicenseAqualityAmaintenanceProvides geospatial intelligence to AI agents through Mapbox APIs, enabling geocoding, routing, POI search, map images, and offline spatial calculations.281,165 npm356MIT
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.89 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.23241 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