Skip to main content

Model Context Protocol server for PostGIS

Project description

mcp-postgis

CI PyPI Python License: MIT

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)

  1. Run PostGIS:
    docker run --name postgis -e POSTGRES_PASSWORD=postgres \
      -p 5432:5432 -d postgis/postgis:16-3.4
    
  2. 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;
    
  3. 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"
          }
        }
      }
    }
    
  4. 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

mcp_postgis-0.2.2.tar.gz (140.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

mcp_postgis-0.2.2-py3-none-any.whl (36.2 kB view details)

Uploaded Python 3

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

Hashes for mcp_postgis-0.2.2.tar.gz
Algorithm Hash digest
SHA256 1f5426daa29938fbbd2ba0cc43c500ff2dcdf72941ff0098f9bea9494c802105
MD5 9478eda10c3c671c63e818e851e71359
BLAKE2b-256 0824297a192c5f4b8a9dcb7579c8bd1097bc64f100ba6e38de5d8f696546d4d2

See more details on using hashes here.

Provenance

The following attestation bundles were made for mcp_postgis-0.2.2.tar.gz:

Publisher: release.yml on psychonaut0/mcp-postgis

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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

Hashes for mcp_postgis-0.2.2-py3-none-any.whl
Algorithm Hash digest
SHA256 d2cc0ec437c3a0deae843eb804710fb3b911d9063379221165e001a008616921
MD5 7dc7f765bcebdaa7604a3d265b4fa3eb
BLAKE2b-256 2ba4f0cc6d8cd54a9ace95c9f249f0fd9aae4b52d4f7059bb4e83ec4d1a2aa07

See more details on using hashes here.

Provenance

The following attestation bundles were made for mcp_postgis-0.2.2-py3-none-any.whl:

Publisher: release.yml on psychonaut0/mcp-postgis

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page