osm-mcp
Provides read-only query tools for OpenStreetMap data imported into a PostGIS database, enabling searches by name, tags, bounding box, and proximity, as well as schema discovery and category counts.
Click on "Install 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., "@osm-mcpfind all schools in Tokyo"
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.
osm-mcp
An MCP (Model Context Protocol) server that exposes read-only query tools over
osm2pgsql-imported OpenStreetMap data in PostGIS (planet_osm_* tables).
Quick start
uv sync --extra dev # creates .venv + uv.lock
cp .env.example .env # then set OSM_MCP_DSN
docker compose up -d # optional: demo PostGIS with seed data on localhost:55432.env.example documents the settings:
OSM_MCP_DSN— required libpq connection string. Use a read-only DB role (see the comment in.env.examplefor the recommendedGRANTs).OSM_MCP_SRID— SRID of thewaygeometry column (default3857).OSM_MCP_STATEMENT_TIMEOUT_MS— per-query statement timeout (default5000).OSM_MCP_MAX_ROWS— row cap applied to result sets (default200).
Related MCP server: mcp-db-server
Running the server
uv run osm-mcpRuns over stdio by default (how local MCP clients launch it).
HTTP streaming transport
Set OSM_MCP_TRANSPORT=streamable-http (alias http) to serve over HTTP
instead of stdio; sse is also supported. Host/port come from OSM_MCP_HOST
/ OSM_MCP_PORT (default 127.0.0.1:8000); the endpoint path is /mcp.
OSM_MCP_TRANSPORT=http OSM_MCP_HOST=127.0.0.1 OSM_MCP_PORT=8000 \
OSM_MCP_DSN=postgresql://osm_readonly:secret@localhost:5432/osm \
uv run osm-mcp
# -> serves on http://127.0.0.1:8000/mcpAn HTTP-capable MCP client then connects with:
{ "mcpServers": { "osm": { "type": "http", "url": "http://127.0.0.1:8000/mcp" } } }Unlike stdio, the HTTP/SSE transports print a startup line to stderr showing the URL. (stdio stays silent — its stdout is the protocol channel.)
MCP client config (stdio)
{
"mcpServers": {
"osm": {
"command": "osm-mcp",
"env": {
"OSM_MCP_DSN": "postgresql://osm_readonly:secret@localhost:5432/osm"
}
}
}
}Tools
Tool | Purpose |
| List available |
| Top values (with counts) of key OSM tags, to discover filters. |
| Search features by name (ILIKE) and/or tag filters, optional bbox. |
| Features within N meters of a lat/lon, ordered by distance (points + POI polygons; excludes admin/boundary polygons). |
| Features inside a bbox or a named/osm_id polygon. |
| Counts of features per tag value, optionally scoped to an area. |
| Escape hatch: run a single read-only |
Full reference — parameters, return shapes, and worked examples for every tool: docs/TOOLS.md.
Performance notes
list_categories and area-less count_by_category do full-table scans over
unindexed tag columns; prefer scoping them with an area/table, or use them
only on modest-size datasets.
Coordinates, SRID, and read-only access
Public tool coordinates (lat/lon in arguments and results) are always WGS84 (
EPSG:4326). The DB geometry column (way) is stored inOSM_MCP_SRID(default3857) and reprojected at the query boundary.Distance calculations (
find_nearby) use PostGISgeography, sodistance_mis a true geodesic distance in meters.Read-only access is enforced at two layers: the DB role used for
OSM_MCP_DSNshould itself be read-only, and every query additionally runs inside aREAD ONLYtransaction.run_sqlis further restricted to a singleSELECT/WITHstatement.
Testing
uv run pytest # unit + integration
uv run pytest -m "not integration" # unit only, no DB required
uv run pytest tests/unit/test_config.py::test_defaults_applied -v # single testIntegration tests need a live PostGIS (docker compose up -d); they skip
automatically if the DB at OSM_MCP_TEST_DSN (defaults to
postgresql://osm:osm@localhost:55432/osm) is unreachable.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/a-tsitanov/osm_mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server