# Add to your Claude Code skills
git clone https://github.com/markuman/smsGuides for using mcp servers skills like sms.
Last scanned: 9/9/2026
{
"issues": [],
"status": "PASSED",
"scannedAt": "2026-09-09T08:40:32.175Z",
"npmAuditRan": true,
"pipAuditRan": false,
"promptInjectionRan": true
}sms is an open-source mcp servers skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by markuman. simple mbtiles server. It has 270 GitHub stars.
Yes. sms passed SkillsLLM's automated security scan — a dependency vulnerability audit plus prompt-injection heuristics — with no high-severity issues. You can read the full report in the Security Report section on this page.
Clone the repository with "git clone https://github.com/markuman/sms" and add it to your Claude Code skills directory (see the Installation section above).
sms is primarily written in Python. It is open-source under markuman on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other MCP Servers skills you can browse and compare side by side. Open the MCP Servers category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh sms against similar tools.
No comments yet. Be the first to share your thoughts!
Top skills in this category by stars
⚠️ Third-Party Software Notice
This skill is third-party open-source software developed and hosted independently on GitHub. SkillsLLM is an informational directory and does not control or maintain the underlying repository.
Any security checks, ratings, or warnings displayed by SkillsLLM are automated and limited in scope. They do not constitute a security certification or guarantee that the software is safe, error-free, or free from malicious code, vulnerabilities, compromised dependencies, or prompt-injection risks.
Review the source code, permissions, dependencies, and configuration before installing or running any third-party skill. Use is at your own risk. To the maximum extent permitted by applicable law, SkillsLLM is not liable for losses arising from third-party software.
simple mbtiles server
mkdir osm
wget --continue -O osm/planet.mbtiles https://nx93856.your-storageshare.de/public.php/dav/files/apP4zEacCwqPfWd/planet.mbtiles
wget --continue -O osm/contours.mbtiles https://nx93856.your-storageshare.de/public.php/dav/files/apP4zEacCwqPfWd/contours_90m-Z11-Z13_30m-Z14.mbtiles
podman run -ti --rm -p 9000:9000 --name sms -v "$(pwd)/osm/:/data/" registry.gitlab.com/markuman/sms:latest
firefox http://localhost:9000
requirements:
podman (or docker)notes:
sms projecthttps://<YOUR_SMS_SERVICE_DEPLOYMENT>/v1/styles/osm-bright-gl-style@1.0.0/style.json?fonts=fonts-gl@1.0.0&tiles=mytiles@1.0.0You can add coordinates and Zoomlevel.
https://maps.osuv.de/?lat=48.1374&lng=11.5752&zoom=9
Just set -e PHOTONSERVER="https://photon.osuv.de" for your sms Container.
This also enables the geocode and reverse_geocode MCP tools; without it
they are not registered at all.
PHOTONSERVER is substituted into index.html at startup, so the browser
talks to Photon directly with that URL — it has to be publicly reachable.
The MCP tools, on the other hand, call Photon from inside the container.
If both run in podman/docker, the public hostname often resolves to a LAN
address the container network cannot route to (split-horizon DNS), and you get
Connection refused. Changing PHOTONSERVER is not the fix: that would break
the frontend.
Use PHOTONSERVER_INTERNAL for the server-side path instead:
podman network create osm
podman run -d --rm --network osm --name photon \
-e UPDATE_STRATEGY=DISABLED \
-p 8888:2322 \
-v /home/m/osm/photon/:/photon/data \
docker.io/rtuszik/photon-docker:2.1.1
podman run -ti --rm --network osm --name sms \
-p 9000:9000 \
-e PHOTONSERVER="https://photon.osuv.de" \
-e PHOTONSERVER_INTERNAL="http://photon:2322" \
-v /home/m/osm/sms/:/data/ \
localhost/sms:dev
If PHOTONSERVER_INTERNAL is unset, server-side calls fall back to
PHOTONSERVER, which is the right thing when both are reachable from
everywhere (single host, no container network in between).
Tilesets are configured through numbered environment variable groups
(MBTILES__1__*, MBTILES__2__*, …):
| Variable | Required | Description |
|---|---|---|
PORT |
yes | Listen port |
MBTILES__n__URL |
yes | Path to the .mbtiles file |
MBTILES__n__IDENTIFIER |
yes | Tileset name used in URLs |
MBTILES__n__VERSION |
yes | Tileset version used in URLs |
MBTILES__n__MIN_ZOOM |
yes | Minimum zoom level |
MBTILES__n__MAX_ZOOM |
yes | Maximum zoom level |
HTTP_ACCESS_CONTROL_ALLOW_ORIGIN |
no | CORS header value |
PHOTONSERVER |
no | Public Photon base URL; enables geocoding and is embedded into the map UI |
PHOTONSERVER_INTERNAL |
no | Photon URL used for server-side calls (MCP tools) when the public one is not reachable from inside the container |
TILE_CACHE_SIZE |
no | Decoded road tiles kept in memory (default 2000; contour and POI caches get a quarter of that each) |
ROUTE_MAX_TILES |
no | Corridor tile limit per segment (default 1200) |
ROUTE_MAX_CROW_KM |
no | Straight-line limit per segment in km (default 50) |
GPX_DIR |
no | Where generated GPX files are stored (default $TMPDIR/sms-gpx) |
GPX_MAX_FILES |
no | Keep at most this many GPX files (default 200) |
GPX_TTL_SECONDS |
no | Delete GPX files older than this (default 86400) |
My provided planet.mbtiles is generated by using https://github.com/onthegomap/planetiler
I just followed this tutorial: https://github.com/onthegomap/planetiler/blob/main/PLANET.md
Contours will be displayed if a file called contours.mbtiles is places next to planet.mbtiles.
There are two different contours files provided. 90m resolution in Zoom Level 11 to 14 and 90m resolution in Zoom Level 11 to 13 with 30m resolution in Zoom Level 14.
GLO-30: "produced using Copernicus WorldDEM-30 © DLR e.V. 2010-2014 and © Airbus Defence and Space GmbH 2014-2018 provided under COPERNICUS by the European Union and ESA; all rights reserved"
GLO-90: "produced using Copernicus WorldDEM-90 © DLR e.V. 2010-2014 and © Airbus Defence and Space GmbH 2014-2018 provided under COPERNICUS by the European Union and ESA; all rights reserved"
GET /Serves the map UI frontend (index.html) with optional URL parameters for coordinates and zoom level.
URL Parameters:
lat — Latitude coordinatelng — Longitude coordinatezoom — Zoom levelExample: https://maps.osuv.de/?lat=48.1374&lng=11.5752&zoom=9
GET /v1/capabilitiesReturns JSON capabilities indicating available optional features.
Response:
{
"contours": true,
"routing": true,
"mcp": true,
"gpx": true,
"geocoding": false,
"mcp_tools": ["search_poi", "plan_route", "export_gpx"],
"difficulty_data": {
"sac_scale": true, "via_ferrata_scale": true,
"trail_visibility": true, "smoothness": true
},
"routing_limits": { "max_tiles": 1200, "max_crow_km": 50.0, "zoom": 14 },
"tile_cache": {
"roads": { "entries": 812, "max_entries": 2000, "hits": 4210, "misses": 812 },
"contours": { "entries": 240, "max_entries": 500, "hits": 190, "misses": 240 },
"poi": { "entries": 0, "max_entries": 500, "hits": 0, "misses": 0 }
}
}
contours — whether contours.mbtiles was detected and loadedrouting — always true; indicates the /v1/route/ endpoint is availablemcp — the MCP endpoint at POST /mcp is availablegpx — GPX export is availablegeocoding — whether PHOTONSERVER is configured (enables the geocode
and reverse_geocode MCP tools)mcp_tools — names of the registered MCP toolsdifficulty_data — which hiking attributes the loaded tiles actually carry.
All false on stock OpenMapTiles tiles (see Hiking attributes below), and
in that case a missing warning means missing data, not easy terrain. The
flags flip to true as soon as a tile containing them has been decoded.sac_scale_values — accepted values for max_sac_scale, easiest firsttile_cache — live hit/miss counters of the decoded-tile cachesGET /v1/poi/{identifier}@{version}?lat={lat}&lon={lon}&category={category}&radius={radius}Search for Points of Interest (POI) within a radius and return GeoJSON features.
Path Parameters:
identifier — Tileset identifierversion — Tileset versionQuery Parameters:
lat — Latitude coordinate (required)
lon — Longitude coordinate (required)
category — POI category (required): supermarket, pharmacy, hospital,
fuel, charging_station, alpine_hut, camp_site, shelter,
drinking_water, cave, viewpoint, or emergency
drinking_water, cave, viewpoint and emergency need tiles built with
the extended profile linked above — stock OpenMapTiles does not put springs,
wells or cave entrances into the poi layer at all. Note that
drinking_water includes springs and cattle troughs: that is a location, not
a potability guarantee.
Note that alpine_hut covers only real mountain huts
(alpine_hut, wilderness_hut, basic_hut). OpenMapTiles files bus stop
shelters and public air-raid shelters under subclass=shelter, which around
Garmisch is 113 of 122 hits and mostly unnamed — those live in the separate
shelter category so they cannot bury the actual huts.
radius — Search radius in km, default 15, max 50 (optional)
Response: GeoJSON FeatureCollection of POIs, each with a
properties.distance_km. Sorted by distance, but named POIs come first
within the same ~500 m band — an unnamed hut slightly closer is less useful
than a named one you can look up.
GET /v1/tiles/{identifier}@{version}/{z}/{x}/{y}.mvtFetch a tile in Mapbox Vector Tile (MVT) format.
Path Parameters:
identifier — Tileset identifier (e.g., from MBTILES__1__IDENTIFIER)version — Tileset version (e.g., from MBTILES__1__VERSION)z — Zoom levelx — Tile column coordinatey — Tile row coordinate (converts from Web Mercator to TMS)Special: contours@1.0.0 is auto-loaded if contours.mbtiles exists.
Gzip Negotiation: Returns gzip-compressed tiles if client sends Accept-Encoding: gzip.
Response: application/vnd.mapbox-vector-tile (MVT format)
GET /v1/styles/{identifier}@{version}/style.jsonReturns a MapLibre GL style JSON with injected tile, font, and sprite URLs.
Path Parameters:
identifier — Style identifier (e.g., osm-bright-gl-style)version — Style version (e.g., 1.0.0)Query Parameters:
tiles — Tile source in format {tile_id}@{tile_version} (required)fonts — Font source in format {font_id}@{font_version} (required)Available Styles:
dark-matter-gl-style@1.0.0fiord-color-gl-style@1.0.0maptiler-3d-gl-style@1.0.0