Model Context Protocol server for PostGIS
Project description
mcp-postgis
A Model Context Protocol server that exposes PostGIS to MCP-aware clients (Claude Desktop, Claude Code).
Lets Claude introspect your spatial database, run safe spatial queries, and publish results as views that QGIS picks up automatically — so an analyst can describe a layer in plain language and have it land in their QGIS browser.
Install
pip install mcp-postgis # or `uv tool install mcp-postgis`
Quick start (Docker PostGIS + Claude Desktop)
- Run PostGIS:
docker run --name postgis -e POSTGRES_PASSWORD=postgres \ -p 5432:5432 -d postgis/postgis:16-3.4
- Create a dedicated read-only role (see docs/security.md for read_write and admin variants):
CREATE ROLE mcp_postgis_ro LOGIN PASSWORD 'change-me'; GRANT CONNECT ON DATABASE mydb TO mcp_postgis_ro; GRANT USAGE ON SCHEMA public, app TO mcp_postgis_ro; GRANT SELECT ON ALL TABLES IN SCHEMA public, app TO mcp_postgis_ro; ALTER DEFAULT PRIVILEGES IN SCHEMA public, app GRANT SELECT ON TABLES TO mcp_postgis_ro;
- Add to your
claude_desktop_config.json:{ "mcpServers": { "postgis": { "command": "uvx", "args": ["mcp-postgis"], "env": { "MCP_POSTGIS_DATABASE_URL": "postgresql://mcp_postgis_ro:change-me@localhost:5432/mydb", "MCP_POSTGIS_MODE": "read_only" } } } }
- Restart Claude Desktop. The server's tools appear in the model picker.
Using with Claude Code (Linux/macOS/Windows)
Claude Desktop is macOS/Windows only — on Linux (or anywhere you use the CLI), register the server with Claude Code instead:
claude mcp add --transport stdio \
--env MCP_POSTGIS_DATABASE_URL="postgresql://mcp_postgis_ro:change-me@localhost:5432/mydb" \
--env MCP_POSTGIS_MODE=read_only \
--scope user \
postgis \
-- uvx mcp-postgis
Restart claude, then /mcp lists the server and its tools. Use --scope user
(not project) so your connection string isn't committed to a repo.
Modes
| Mode | What it can do |
|---|---|
read_only |
Default. Introspection + SELECT + spatial analysis. No writes, no DDL. |
read_write |
Above + create/refresh/drop views in MCP_POSTGIS_LAYER_SCHEMA (mcp_layers by default). |
admin |
Anything the connected role can do. Use only for one-off admin tasks; the role still gates. |
Tools
Introspection: list_schemas, list_tables, describe_table,
list_geometry_columns, list_spatial_indexes, list_extensions
Query: execute_sql, explain, sample_table
Spatial analysis: features_in_bbox, features_in_polygon,
nearest_features, within_distance, buffer, intersect_layers
Geometry operations: transform_srid, centroid, point_on_surface,
area, length, simplify, is_valid, make_valid, bbox
Data quality: check_geometry_validity
Export: export_geojson, export_wkt
Layer publishing (QGIS bridge): create_layer (with geometry_type
filter), refresh_layer, list_layers, describe_layer, drop_layer
Resources: postgis://schemas, postgis://schema/{schema}/{table},
postgis://layers · Prompts: analyze-layer, nearest-things,
within-radius, compare-layers
QGIS integration
After running the server in read_write mode and asking Claude to "publish that as a layer named hotels_near_coast", point QGIS at the same database (or use the same role). In the QGIS Browser → PostGIS → your connection, right-click → Refresh; the mcp_layers schema appears with hotels_near_coast inside it.
See docs/qgis-setup.md for screenshots.
License
MIT. Contributions welcome — please open an issue first to discuss bigger changes.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mcp_postgis-0.2.2.tar.gz.
File metadata
- Download URL: mcp_postgis-0.2.2.tar.gz
- Upload date:
- Size: 140.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1f5426daa29938fbbd2ba0cc43c500ff2dcdf72941ff0098f9bea9494c802105
|
|
| MD5 |
9478eda10c3c671c63e818e851e71359
|
|
| BLAKE2b-256 |
0824297a192c5f4b8a9dcb7579c8bd1097bc64f100ba6e38de5d8f696546d4d2
|
Provenance
The following attestation bundles were made for mcp_postgis-0.2.2.tar.gz:
Publisher:
release.yml on psychonaut0/mcp-postgis
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mcp_postgis-0.2.2.tar.gz -
Subject digest:
1f5426daa29938fbbd2ba0cc43c500ff2dcdf72941ff0098f9bea9494c802105 - Sigstore transparency entry: 1672271524
- Sigstore integration time:
-
Permalink:
psychonaut0/mcp-postgis@051314e35654b2ec959e93b2ccf7155d8ffb51b2 -
Branch / Tag:
refs/tags/v0.2.2 - Owner: https://github.com/psychonaut0
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@051314e35654b2ec959e93b2ccf7155d8ffb51b2 -
Trigger Event:
release
-
Statement type:
File details
Details for the file mcp_postgis-0.2.2-py3-none-any.whl.
File metadata
- Download URL: mcp_postgis-0.2.2-py3-none-any.whl
- Upload date:
- Size: 36.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d2cc0ec437c3a0deae843eb804710fb3b911d9063379221165e001a008616921
|
|
| MD5 |
7dc7f765bcebdaa7604a3d265b4fa3eb
|
|
| BLAKE2b-256 |
2ba4f0cc6d8cd54a9ace95c9f249f0fd9aae4b52d4f7059bb4e83ec4d1a2aa07
|
Provenance
The following attestation bundles were made for mcp_postgis-0.2.2-py3-none-any.whl:
Publisher:
release.yml on psychonaut0/mcp-postgis
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mcp_postgis-0.2.2-py3-none-any.whl -
Subject digest:
d2cc0ec437c3a0deae843eb804710fb3b911d9063379221165e001a008616921 - Sigstore transparency entry: 1672271534
- Sigstore integration time:
-
Permalink:
psychonaut0/mcp-postgis@051314e35654b2ec959e93b2ccf7155d8ffb51b2 -
Branch / Tag:
refs/tags/v0.2.2 - Owner: https://github.com/psychonaut0
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@051314e35654b2ec959e93b2ccf7155d8ffb51b2 -
Trigger Event:
release
-
Statement type: