Changelog
The release notes of each version, also on GitHub, which has a feed for following new releases.
2026-10-05 · On GitHub
preview_styleshows a changed style at the same link, for an agent that has no files to write, as in a chat app. The agent passes the changed style together with the link it got before, aslink, and the map that is open there redraws. Until now each change gave a new link. With a style file nothing changes: the map follows the file as before.- The answer of
preview_stylealso says that the other tools take the link'sstyle.jsonasurl, so such an agent can render and validate the style without sending it again.
render_pageno longer fails when itsscriptends in a camera call likemap.jumpTo({center: [7.66, 45.98], zoom: 12}). Such a call evaluates to the map itself, which could not be turned into text, so the whole call failed, also for the example in the tool's own description.
2026-10-04 · On GitHub
- A container image,
ghcr.io/birkskyum/maplibre-mcp, with the server and the Chromium it renders with, foramd64andarm64. It is for agents in a sandbox and for CI, where no browser can be installed. Containers and sandboxes shows how to use it as a client's server, over HTTP and in CI.
- The image runs from a mounted working folder, like
docker run -v "$PWD:/work" -w /work, which it needs to read your style files. Before, it only started from its own folder. - In a container,
preview_stylegives its link on a published port, named inMAPLIBRE_MCP_PREVIEW_PORT. Without one it says so, instead of giving a link that does not open.
2026-10-04 · On GitHub
This release is about one thing: letting an agent see and check the map it works on, and show it to you.
preview_stylegives you a link to a live, interactive map of a style, served by the server on your machine. The agent no longer writes a viewer page, starts a web server or opens your browser. Given a file, the map follows it and redraws when the file changes, so the link can stay open while the agent works.render_pagerenders a web page with a map, for what a style cannot hold, like plugins, controls and the page's own code. It reports the page's errors and failed requests, and can run a script in the page before the screenshot.- A camera in space.
render_styletakescameraPositionandlookAt, so a view over 3D terrain like "the Matterhorn from above Zermatt" does not have to be guessed with a center and zoom. The result gives the center, zoom, bearing and pitch to store in the style. - Instructions for the agent. The server now tells its client what each tool offers, how to load MapLibre GL JS 6 in a page (it ships as ES modules only), and to look at more than one view of a style before calling it done.
Changed
Section titled “Changed”- A render that did not load is an error. When a source does not exist,
render_styleanswers within seconds where it used to wait 30, with the reason before the image. It names each source that failed and says which tools find sources that exist. find_basemapsgives tile and elevation sources as JSON, ready to paste into a style.- A style file that is not there says where it was looked for.
- The server renders with MapLibre GL JS 6.12.0.
Removed
Section titled “Removed”format_styleandmigrate_style. They did whatgl-style-formatandgl-style-migratefrom@maplibre/maplibre-gl-style-specdo.
Rendering describes the preview, pages and the camera.
2026-10-03 · On GitHub
render_stylenames the font stacks whose glyphs did not load, likeGlyphs did not load for these font stacks, so their text is drawn with local fonts: "noto_sans_italic" (HTTP 404).MapLibre GL JS draws such text with local fonts and only warns in the console, so the image looked right for a font the glyph server doesn't have.debug_layersalready said this for each layer.
2026-10-03 · On GitHub
Searches with search_ecosystem are easier for an agent to narrow down:
- Libraries before products: results whose name has the words still come first, then libraries and hosted services, then products and consultancies. Products outnumber the libraries in Make with MapLibre and mention the same words, so a search for "draw" used to mix them in among the drawing plugins.
- Counts by kind: when the results are of several kinds and no
kindis given, the first line counts them, like30 entries match "draw" (20 products, 8 plugins, 1 SDK and 1 routing library). - GL JS controls are plugins:
kind: pluginnow includes the routing and geocoding controls for MapLibre GL JS, like MapLibre GL Directions, which Make with MapLibre lists under routing and geocoding. A search for routing plugins on the web used to find nothing. - Other kinds when a kind finds nothing: the result says what the same words find without the kind, like
Without the kind, 6 products and 3 geocoding libraries match. - Basemaps:
search_ecosystemdoesn't list basemaps, so when basemaps match the words too, it says how many and points tofind_basemaps, which lists them with their style or tile URLs.
Libraries and basemaps describes the search.
2026-09-30 · On GitHub
search_ecosystem searches all of Make with MapLibre: SDKs, plugins, routing, geocoding, styling and tiling tools, hosted services, products, and consultancies. This release adds three things to it:
- AI tools: the MCP servers and agent skills in Make with MapLibre's new AI section show up in searches, and the optional
kindfilter gets a new value,ai, to list only those. - What products offer: products a map maker can build on (maps APIs, GIS tools, data sources, self-hostable apps) list what they offer, as
Offers map makers: ..., and searches match those points. Asking for a geocoding API finds the platforms that have one. - How products use MapLibre: product results have a
MapLibre:line under the description, and searches match it too.
All three read fields that Make with MapLibre added to its catalog, which stays at schema version 1.
2026-09-29 · On GitHub
-
The
ecosystemtoolset, on by default, searches Make with MapLibre, a curated directory of what works with MapLibre.search_ecosystemfinds SDKs, plugins, routing, geocoding, styling and tiling libraries, hosted APIs, products and consultancies, by words, kind and platform. Each result comes with its links, its live demo when it has one, and its page.find_basemapslists basemaps with their style URLs or tile sources, and whether they need an API key. It also says what the map needs to use each one correctly: the tile size, the elevation encoding, the attribution, and a logo control where the provider's terms require one.
They read https://makewithmaplibre.com/catalog.json, fetched at most once a day, or the copy that
MAPLIBRE_MCP_CATALOG_URLpoints to. The catalog's data is © Birk Skyum, under CC BY 4.0, and both tools end with its credit. Libraries and basemaps explains how they work, and Examples shows a session with them.The toolset needs network access to makewithmaplibre.com.
--toolsets style,gl-jsleaves it out.
Smaller changes
Section titled “Smaller changes”- The README shows the Glama badge.
2026-09-26 · On GitHub
martin_list_sourcestreats an emptyMARTIN_URLas unset and readshttp://localhost:3000, instead of failing. Settings forms like Docker's pass an empty value for a setting left blank.
Smaller changes
Section titled “Smaller changes”- The repository has a Dockerfile, which runs maplibre-mcp with the headless Chromium it renders with.
- Security issues can be reported privately through GitHub's vulnerability reporting.
2026-09-26 · On GitHub
See what a source has beyond one tile
Section titled “See what a source has beyond one tile”inspect_tile now also reads the metadata of a source, like the TileJSON of a Martin source, and says which zoom levels it has tiles for, and which of its source layers the tile at the place lacks. In the middle of the Atlantic, the tile holds 4 of the 16 source layers of OpenFreeMap's planet, and the report names the others:
Tile 6/26/32 of https://tiles.openfreemap.org/planet, at [-30, 0], MVT, 19.1 kB.The source has tiles from zoom 0 to 14....The source also has 12 source layers with no features in this tile: aerodrome_label, aeroway, building, housenumber, landcover, landuse, mountain_peak, poi, transportation, transportation_name, water_name, waterway.Asked for a source layer the tile lacks, it says whether the source has that layer elsewhere.
- Commands take negative coordinates, like
--center -74,40.7. Node's argument parser took them for options, so places west of Greenwich or south of the equator failed.
Smaller changes
Section titled “Smaller changes”- maplibre-mcp is in the MCP Registry as
io.github.birkskyum/maplibre-mcp, and each release updates it.
2026-09-26 · On GitHub
Look up the GL JS API
Section titled “Look up the GL JS API”A new tool, describe_gl_js_api, looks up a class, method, option or event of MapLibre GL JS in the type definitions GL JS ships, and returns its signature, documentation, default and examples, with a link to the docs page. Agents can check a method before they use it, instead of writing it from memory, where Mapbox GL JS methods and older versions mix in.
Map has no member "setFog" in MapLibre GL JS 6.11.2.MapOptions.maxPitch (property of MapOptions, MapLibre GL JS 6.11.2)maxPitch?: number | nullThe maximum pitch of the map (0-180).Default: 60Docs: https://maplibre.org/maplibre-gl-js/docs/API/type-aliases/MapOptions/#maxpitchIt answers for the GL JS version the server renders with, and version looks a name up in another one instead, like the "5" a project uses, from jsDelivr. It's in the gl-js toolset, so it's on by default, and npx -y maplibre-mcp describe-gl-js-api Map#flyTo runs it from a shell.
2026-09-26 · On GitHub
Check the fonts of label layers
Section titled “Check the fonts of label layers”debug_layers now asks the glyph server for the fonts each label layer uses. GL JS draws text in a font the server doesn't have with local fonts instead, and MapLibre Native leaves it out, so the layer says so:
places (symbol): draws 16 of the 16 features in source layer "place". Its text is drawn with local fonts, since the glyph server lacks the font stack "Open Sans Bold".A layer without text-font is checked against the default, "Open Sans Regular,Arial Unicode MS Regular", which many glyph servers don't have, OpenFreeMap's among them.
debug_layersno longer says that the text layers of a style without a glyphs URL draw nothing. GL JS has drawn such text with local fonts since 5.11.0, anddebug_layersnow notes that instead.
Smaller changes
Section titled “Smaller changes”- The troubleshooting page says how to install Chromium for rendering in a Docker container.
2026-09-26 · On GitHub
Find out why a layer draws nothing
Section titled “Find out why a layer draws nothing”A new tool, debug_layers, reads the tiles at a place and says for each layer of a style whether it draws, and if it draws nothing, why. It catches layers that are hidden or outside their zoom range, a source layer the tiles don't have, a filter that matches no feature, a fill layer without polygons, paint that comes out as 0 or transparent at the zoom, text without a glyphs URL, and icons the sprite lacks. For a filter that matches nothing, it lists the values the data really has.
buildings (fill): draws nothing, since the tile has no source layer "buildings". It has: boundary, building, housenumber, ...motorways (line): draws nothing, since its filter matches none of the 568 features in source layer "transportation". No feature has the field "kind".It's in the style toolset, so it's on by default, and npx -y maplibre-mcp debug-layers style.json --center 12.57,55.68 --zoom 14 runs it from a shell.
- maplibre-mcp now starts when its repository is built with pnpm. 0.2.0 imported
@mapbox/point-geometrywithout declaring it, which installs from npm covered but a pnpm checkout doesn't.
2026-09-25 · On GitHub
Inspect the data behind a style
Section titled “Inspect the data behind a style”A new tool, inspect_tile, reads the vector tile at a place and lists each source layer with its geometry types, the values of every field and how often they occur, and a few example features. An agent can now see that roads are "motorway", "primary" or "path" before it writes a filter, instead of guessing.
transportation: 67 features (67 LineString) brunnel (in 8 of 67): "tunnel" (6), "bridge" (2) class: "primary" (28), "secondary" (19), "motorway" (10), "rail" (5), "trunk_construction" (2), "trunk" (2), "ferry" (1)It reads a source of a style, a TileJSON URL like a Martin source, a PMTiles archive on the web or on disk, or a tile URL, with MVT or MLT tiles. It's in the style toolset, so it's on by default.
Run the tools from a shell
Section titled “Run the tools from a shell”Agents that work in a shell, and people, can now run the rendering and data tools as commands, without setting up MCP first. Each command runs one tool and exits.
npx -y maplibre-mcp render style.json --center 12.57,55.68 --zoom 12npx -y maplibre-mcp compare before.json after.json --zoom 10npx -y maplibre-mcp compare-renderers style.json --renderers gl-js,nativenpx -y maplibre-mcp describe-sources style.jsonnpx -y maplibre-mcp inspect-tile https://tiles.openfreemap.org/planet --center 12.57,55.68 --zoom 14npx -y maplibre-mcp --help lists the options, and the command line docs have the details.
Smaller changes
Section titled “Smaller changes”describe_sourcesandmartin_list_sourcespoint agents toinspect_tilewhen they need the values of a field.- The tool reference and the examples cover the new tool.
2026-09-25 · On GitHub
Full Changelog: https://github.com/birkskyum/maplibre-mcp/commits/v0.1.1