pg-analytics-mcp
An MCP server for PostgreSQL analytics — a general-purpose "DBA-lite" toolkit that gives any MCP client (Claude Code, Cursor, etc.) instant visibility into schema structure, data quality, relationships, performance, and multi-environment comparison.
What it does
Exposes 20 read-only tools (+ 4 optional) organised in 6 categories:
Schema Discovery
database_summary— high-level overview: schema/table/view/FK/index counts, total size, extensionsscan_schemas— row counts for every table, grouped by schemadescribe_table— column details: name, type, nullable, default, positiontable_sizes— disk usage (data + indexes + toast) per table, ordered by sizefind_tables— search tables by name pattern (ILIKE)find_columns— find tables that have a column matching a patternlist_empty_tables— quickly find tables with 0 rowslist_environments— list configured environments
Data Exploration
recent_rows— peek at the most recent rows (auto-detects timestamp/PK ordering)column_value_counts— distinct values and frequencies for a columncolumn_stats— min, max, avg, null count, distinct count for a column
Relationships
list_constraints— all constraints (PK, unique, check, FK) for a tableforeign_keys— bidirectional FK relationships (incoming + outgoing)compare_envs— compare row counts across DEV / STG / PROD
Performance
index_usage— index scan stats and unused index detectionslow_query_candidates— tables with high sequential scan counts (missing index candidates)bloat_estimate— tables with dead tuples that may need VACUUM
Data Quality
table_health— row count + last inserted_at/updated_at for a tablenull_report— null percentage for every column in a tableduplicate_check— find duplicate rows based on a set of columns
Fail Table Tracking (opt-in via PG_FAIL_SCHEMA)
These 4 tools are only registered when PG_FAIL_SCHEMA is set. They discover *_fails tables in the specified schema that have run_id, stage, comment, failed_at columns.
pipeline_fail_tables— discover all*_failstables with row counts and statspipeline_fail_summary— cross-entity failure summary grouped by entity, stage, or bothpipeline_fail_details— drill into a specific entity's fail table with optional filterspipeline_fail_runs— analyse which runs generated the most failures
Quick start
Prerequisites
- Python 3.12+
- uv (recommended) or pip
- One or more PostgreSQL instances
Install
Option A — run directly with uvx (no clone needed):
uvx pg-analytics-mcp
Option B — clone and run:
git clone https://github.com/fabdendev/pg-analytics-mcp.git
cd pg-analytics-mcp
uv sync
Configure
Set environment variables for each PostgreSQL environment (at least one is required):
| Variable | Description | Required |
|---|---|---|
PG_LOCAL_URL |
PostgreSQL DSN for LOCAL | At least one URL |
PG_DEV_URL |
PostgreSQL DSN for DEV | At least one URL |
PG_STG_URL |
PostgreSQL DSN for STG | Optional |
PG_PROD_URL |
PostgreSQL DSN for PROD | Optional |
PG_INCLUDE_SCHEMAS |
Comma-separated allowlist of schemas to scan | Optional |
PG_IGNORE_SCHEMAS |
Comma-separated schemas to skip (added to internal exclusions) | Optional |
PG_FAIL_SCHEMA |
Schema containing *_fails tables — enables pipeline_fail_* tools |
Optional |
PG_READ_ONLY |
Reserved for future write tools (not yet used) | Optional |
export PG_DEV_URL="postgresql://user:pass@host:5432/dbname"
export PG_STG_URL="postgresql://user:pass@host:5432/dbname" # optional
export PG_PROD_URL="postgresql://user:pass@host:5432/dbname" # optional
# Schema filtering (optional — pick one, not both)
export PG_INCLUDE_SCHEMAS="core,trading,pipeline" # only scan these
export PG_IGNORE_SCHEMAS="orion,shared" # skip these
Supports postgresql+asyncpg:// URLs (the driver prefix is stripped automatically).
If both PG_INCLUDE_SCHEMAS and PG_IGNORE_SCHEMAS are set, the include list takes precedence.
Add to Claude Code
Add to your Claude Code MCP settings (~/.claude/settings.json or .mcp.json):
If using uvx:
{
"mcpServers": {
"pg-analytics": {
"command": "uvx",
"args": ["pg-analytics-mcp"],
"env": {
"PG_DEV_URL": "postgresql://user:pass@host:5432/dbname",
"PG_STG_URL": "postgresql://user:pass@host:5432/dbname"
}
}
}
}
If installed from clone:
{
"mcpServers": {
"pg-analytics": {
"command": "uv",
"args": ["run", "--directory", "/path/to/pg-analytics-mcp", "pg-analytics-mcp"],
"env": {
"PG_DEV_URL": "postgresql://user:pass@host:5432/dbname"
}
}
}
}
Security
All tools are read-only. No data is ever modified. Additional safeguards:
- Identifier validation — all user-provided schema/table/column names are validated against
^[a-zA-Z_][a-zA-Z0-9_]*$and quoted - Row limits — row-level queries capped at 100, aggregation queries at 200
- Statement timeout — potentially expensive queries (null_report, column_stats, duplicate_check, column_value_counts) use a 30s timeout
- Direction validation — order_dir restricted to ASC/DESC only
Multi-environment support
Configure up to 4 environments (LOCAL, DEV, STG, PROD). The first configured environment becomes the default. Use compare_envs to quickly spot row count differences across environments.
Development
uv sync --extra dev
uv run ruff check pg_analytics_mcp/ # lint
uv run python -m pg_analytics_mcp # start server locally
License
MIT
Metadata
Release files for pg-analytics-mcp 0.5.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| pg_analytics_mcp-0.5.0.tar.gz | 73.4 kB | Without provenance | Details for pg_analytics_mcp-0.5.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| pg_analytics_mcp-0.5.0-py3-none-any.whl | Python 3 | none | any | Details for pg_analytics_mcp-0.5.0-py3-none-any.whl |
Total release size: 88.6 kB
Release files / pg_analytics_mcp-0.5.0.tar.gz
| Download URL | pg_analytics_mcp-0.5.0.tar.gz |
|---|---|
| Size | 73.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
cfa5b040dccc5c8e30379bbc9010a3327322fba3179f21b5ff311a967da15c11
|
|
BLAKE2b-256 checksum How to use checksums |
fb99d3131bb3bdaed982b22e0df85cece2e6a3428b587a5723f2656d31ded769
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.9.26 {"installer":{"name":"uv","version":"0.9.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"22.04","id":"jammy","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / pg_analytics_mcp-0.5.0-py3-none-any.whl
| Download URL | pg_analytics_mcp-0.5.0-py3-none-any.whl |
|---|---|
| Size | 15.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a2a826557b87d65f04c0b52d2ab5b65f6f3d4b8f595f80c48f5ef4be33ce4485
|
|
BLAKE2b-256 checksum How to use checksums |
cb409ceda78ddc5f149866f92e5e900794edec8fe8b85b99a7b7ec2f0bf55463
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.9.26 {"installer":{"name":"uv","version":"0.9.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"22.04","id":"jammy","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Security for pg-analytics-mcp 0.5.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.