pg-bloat-detective
Exposes Postgres bloat and index health metrics (pgbloat_index_bloat_pct, pgbloat_index_scans) on a Prometheus-compatible /metrics endpoint for scraping and monitoring.
Click on "Deploy 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., "@pg-bloat-detectivecheck bloat on my orders table and tell me how to fix it"
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.
pg-bloat-detective — PostgreSQL Bloat Checker, Vacuum Blocker Finder & Index Bloat Detector
Find why your Postgres database is bloated, who is blocking VACUUM, and which indexes need REINDEX — read-only, with proof.
vacuum-starved·blocked-by-idle-xact·needs-rewrite·index-bloated·index-unused— one verdict per table/index, with PID + query evidence.
mcp-name: io.github.r69shabh/pg-bloat-detective
pip install pg-bloat-detective · Docker ready · MCP server for Claude/Cursor · Prometheus + Grafana · Next.js dashboard
pip install pg-bloat-detective # or: pip install -e ".[dev]" from source
python -m bloatdetective collect --db timeline.db # read-only snapshot (5s timeout)
python -m bloatdetective analyze --db timeline.db # verdicts + evidence
python -m bloatdetective report --db timeline.db --html --out report.html
bloat-mcp # MCP server (stdio) for Claude Desktop / CursorWhat this is
A PostgreSQL bloat analysis tool that answers three questions other tools leave open:
Is this table bloated, and why? — dead-tuple timeline (
pg_stat_user_tables) + exactpgstattuple_approxconfirmation. Verdicts:normal(leave it alone),vacuum-starved(autovacuum losing),blocked-by-idle-xact|slot|prepared|active-xact(named PID + query holdingbackend_xmin),needs-rewrite(approx dead% >30%, VACUUM can't reclaim).Who is blocking VACUUM / autovacuum? — oldest
backend_xminholder tracked per snapshot: PID, transaction age, query text, stale replication slots, prepared transactions. Priority: prepared-xact > stale-slot > idle-in-transaction. Kill one, VACUUM, done.Is the index bloated? (VACUUM never fixes this) — exact
pgstatindexon indexes under a 1GB cost guard (tunable--max-bytes, override--allow-large), metric100 − avg_leaf_density. Over 30% →index-bloated, scheduleREINDEX. Zero scans across all snapshots →index-unused, DROP candidate. This is the gap pganalyze admits to — our differentiator, proven live: 83.7% → 9.9% after REINDEX while VACUUM did nothing.
One SQLite file = full timeline. One static page = the whole incident. No agents on prod, no writes (read-only transactions, statement timeout 5s), works on RDS / Neon / Supabase / self-hosted PG 12–17.
Related MCP server: MCP-PostgreSQL-Ops
Quickstart (60-second demo)
docker compose up -d
pip install -e ".[dev]"
python -m bloatdetective collect --db timeline.db # snapshot prod (read-only)
python workload/churn.py --mode idle-xact --secs 60 & # create the failure
python -m bloatdetective collect --db timeline.db
python -m bloatdetective report --db timeline.db --html --out report.html
python -m bloatdetective serve --db timeline.db & # :9187/metrics for Prometheus
pytest
bash scripts/benchmark.sh # full before/after proof -> REPORT.mdVerdicts (read them as instructions)
Heap: normal (steady-state, leave alone) · vacuum-starved → run VACUUM / tune autovacuum · blocked-by-idle-xact|slot|prepared|active-xact → end the named session, then VACUUM · needs-rewrite → pg_repack / VACUUM FULL.
Index: index-bloated (pgstatindex bloat >30% → needs REINDEX, VACUUM can't fix it) · index-unused (idx_scan=0 across snapshots → DROP candidate, verify with pg_stat_statements first).
Index bloat is the differentiator (pganalyze admits the gap): collect runs exact
pgstatindex only on indexes under the 1GB cost guard (--max-bytes tunes it,
--allow-large overrides), metric = 100 − avg_leaf_density. Exported as
pgbloat_index_bloat_pct / pgbloat_index_scans, charted in the shadcn dashboard,
Graphed in Grafana.
Benchmark (measured 2026-10-05, local PG16 — heap + index, live run just now)
30s churn, no blocker (autovacuum simply lost) → VACUUM ANALYZE + REINDEX:
moment | pg_stat dead | approx dead% | index bloat% (density) | verdict |
before fix | 5,108,201 | — (single-snapshot lag) | 41.9% |
|
after fix | 0 | 0.0% | 9.9% |
|
Earlier hole, now closed: an index at 83.7% bloat (density 16.3) dropped to 9.9%
(density 90.1) after REINDEX — VACUUM alone never touches that. Full log in
REPORT.md, visual in report.html.
See PLAN.md for the detailed 3-week plan + competitor gap.
MCP server (Claude Desktop / Cursor / any MCP client)
5 tools, read-only on Postgres (5s statement timeout, read-only tx). bloat_check
returns verdict + evidence + fix per table/index; bloat_live_diagnose snapshots a
throwaway DB so your timeline file is never touched — safest for prod DSNs.
pip install pg-bloat-detective # pulls mcp + psycopg
bloat-mcp # stdio transport (also: docker run -i pg-bloat-detective)Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json):
{"mcpServers": {"bloat-detective": {
"command": "/abs/path/pg-bloat-detective/.venv/bin/python",
"args": ["-m", "bloatdetective.mcp_server"],
"env": {"BLOAT_DSN": "dbname=bloatdemo user=postgres host=localhost port=5433",
"BLOAT_DB": "/abs/path/pg-bloat-detective/timeline.db"}}}}tool | what the agent gets |
| verdicts + evidence + action per table/index |
| snapshot timeline, return fresh verdicts |
| dead/approx/index-bloat series — when it started |
| pid + query + xmin age + slot — who to kill |
| one-shot throwaway snapshot, diagnose, discard |
Public listing: official MCP Registry (io.github.r69shabh/pg-bloat-detective) · mcp.so · awesome-mcp-servers (Databases).
Interfaces
CLI —
collect | analyze | report [--html|--json] | serve [--port](this README's quickstart).Dashboard — Next.js single-incident card at
dashboard/(report --jsonfeedsdata.json): verdict banner, dead-tuple + index-bloat charts, blockers + findings tables.Prometheus + Grafana —
serveexposes:9187/metrics(pgbloat_dead_tuples,pgbloat_approx_dead_pct,pgbloat_index_bloat_pct,pgbloat_index_scans,pgbloat_xmin_holder_age_seconds);grafana/has dashboard JSON + provisioning,docker-compose.ymlwires pg → exporter → Prometheus → Grafana.Docker —
Dockerfileruns the MCP server over stdio (docker run -i); compose adds the demo DB + observability stack.
FAQ (how people actually search for this)
"postgres table bloated how to check" →
collecttwice,analyzeprints the verdict + dead/live + evidence.needs-rewritemeans pg_repack/VACUUM FULL; anything else tells you the cheaper fix first."postgres autovacuum not keeping up / dead tuples growing" →
vacuum-starved(threshold50 + 0.2×livefrom your livepg_settings) vsblocked-by-*(a session pinning xmin). The timeline chart shows whether dead is rising (losing) or spiked-then-zero (blocked-then-freed)."postgres vacuum blocked by idle in transaction" → we name the PID, query, and xmin age.
SELECT pg_terminate_backend(pid)(or let it finish), thenVACUUM table."postgres index bloat check / reindex needed" →
index-bloatedwith exactpgstatindex% — VACUUM cannot fix it, only REINDEX/pg_repack. Stalepg_statcounters are cross-checked againstpgstattuple_approxso you don't chase ghosts."postgres unused indexes find / drop" →
index-unused(idx_scan=0 across every snapshot) with size in bytes. Confirm with pg_stat_statements, then DROP."rds / neon / supabase bloat" → read-only by design; needs only
pg_stat_*views + optionalpgstattupleextension. No superuser, no agent install."pg_bloat_check vs pgstattuple vs pganalyze vs pghero" → one-shot estimators give you a %; we give you the timeline + the blocker + the fix + the before/after proof, heap and index, in one open-source tool. See PLAN.md competitor table.
Keywords
postgresql bloat · postgres bloat check · pg_bloat_check alternative · vacuum blocked · autovacuum tuning · dead tuples · pgstattuple_approx · index bloat · pgstatindex · reindex needed · unused indexes · idle in transaction · backend_xmin · replication slot lag · prepared transaction · table bloat estimation · postgres dba tools · postgres monitoring prometheus grafana · MCP server postgres · Claude postgres DBA
Available Tools
5 toolsbloat_blockersA
Who is pinning VACUUM: blocker pid + query + xmin age + slot.
Read-only on the local timeline file. Priority: prepared-xact > stale-slot
idle-in-transaction. Fix: end the named session, then VACUUM the table. Args: db: Path to the SQLite timeline file (default: BLOAT_DB env). Returns: {blockers: [{ts, kind, pid, age, query, slot}] — newest first, max 20. Use pid with SELECT pg_terminate_backend(pid) after verification.
| Name | Required | Description | Default |
|---|---|---|---|
| db | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it declares the operation read-only against a local file, discloses the result ordering ('newest first') and cap ('max 20'), and adds a caution ('after verification') before suggesting pg_terminate_backend. It does not discuss permissions or failure modes, but for a local read-only file query those are largely irrelevant.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the diagnostic question, then reads naturally into scope, priority, fix, args, and returns. The Args/Returns blocking is easy to scan and no sentence is wasted, though the remediation instruction adds some length beyond strict tool description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, but the description inlines the return shape ({blockers: [{ts, kind, pid, age, query, slot}]}), ordering, and count limit, so an agent knows what it will get. Combined with the arg documentation and remediation steps, the definition is complete for a one-parameter diagnostic tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single parameter, so the description must compensate, and it does: 'db: Path to the SQLite timeline file (default: BLOAT_DB env)'. This explains both the meaning and the environment-based default that the bare schema ('default: ""') does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource and the exact diagnostic payload ('Who is pinning VACUUM: blocker pid + query + xmin age + slot'), which is far more informative than a name restatement. It implicitly contrasts with the live-diagnosis sibling by noting it is 'Read-only on the local timeline file', but it never names bloat_live_diagnose or the other siblings explicitly, so differentiation is inferential rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description supplies a priority ordering (prepared-xact > stale-slot > idle-in-transaction) and a remediation path ('end the named session, then VACUUM the table'), which implies the diagnostic scenario. However, it never states when to call this versus bloat_live_diagnose or the other bloat_* siblings, leaving tool selection to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bloat_checkA
Diagnose PostgreSQL bloat from a collected timeline.
Read-only: only reads the local SQLite timeline file, never touches Postgres. Args: db: Path to the SQLite timeline file (default: BLOAT_DB env, 'timeline.db'). Collect one first with bloat_collect, or pass any timeline.db path. Returns: findings: list of {table, verdict, evidence, action} — verdict is one of normal | vacuum-starved | blocked-by-idle-xact | blocked-by-slot | blocked-by-prepared | blocked-by-active-xact | needs-rewrite | index-bloated | index-unused. Evidence carries dead/live counts, pgstattuple approx %, pgstatindex %, blocker pid+query.
| Name | Required | Description | Default |
|---|---|---|---|
| db | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does well: it explicitly declares read-only behavior and that it never touches Postgres, only the local SQLite timeline. It also enumerates the verdict taxonomy and what evidence contains, though it omits any permission or file-access caveats.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-line purpose and the read-only guarantee before the Args/Returns blocks, so a scanning agent gets the essentials immediately. The explicit verdict enumeration is long but earns its place by defining the output vocabulary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the Returns section is doing real work: it names the findings list, the per-item shape {table, verdict, evidence, action}, the full verdict enum, and what evidence carries. Combined with the documented single param, nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the single param is titled only 'Db', so the description must compensate — and it does, documenting that db is a path to the SQLite timeline file with a BLOAT_DB env fallback and a 'timeline.db' default, plus how to obtain it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (diagnose) and resource (PostgreSQL bloat) plus the input source (a collected timeline), which implicitly separates it from bloat_live_diagnose. It names bloat_collect as the producer of its input, though it never explicitly contrasts itself with the other bloat_* siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clear context is given: run bloat_collect first to obtain a timeline, or pass any timeline.db path, and the read-only/offline nature is stated. It stops short of saying when to prefer this over bloat_live_diagnose or bloat_blockers, so the sibling routing is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bloat_collectA
Take a read-only Postgres snapshot into the timeline, then return fresh verdicts.
Safe on prod: read-only transaction, 5s statement timeout, needs only pg_stat_* views + optional pgstattuple extension. No writes, no agents. Args: dsn: Postgres DSN, e.g. 'dbname=app user=readonly host=db.internal'. Default: BLOAT_DSN env. Never logs the password. Returns: {snapshot: 'saved', db: path, findings: [...with action per table/index]}.
| Name | Required | Description | Default |
|---|---|---|---|
| dsn | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does it well: it discloses the read-only transaction, the 5s statement timeout, the pg_stat_* view requirement plus optional pgstattuple extension, that no agents are spawned, and that the password is never logged. It even reveals the side effect of writing a snapshot file (db: path). It stops short of describing cost/load on prod or what happens on repeated collection into the same timeline.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action, followed by a safety paragraph and explicit Args/Returns blocks. Nearly every line earns its place; the only slack is the loosely formatted 'Returns' line rather than any redundant sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, yet the description sketches the return shape ({snapshot, db path, findings with an action per table/index}), covers required extensions and permissions, and documents the single parameter's default. An agent has what it needs to call this correctly; the only missing element is sibling routing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, and it does: it gives an example DSN string with a readonly user, states the BLOAT_DSN environment fallback matching the empty-string default, and notes the password is never logged. That is materially more than the bare 'Dsn' string schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource: take a read-only Postgres snapshot into the timeline and return verdicts. That is specific enough to distinguish it from a pure reader like bloat_timeline, but it never names a sibling or explains the boundary, so the differentiator is inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Safe on prod' framing implies this is intended as a first collection step against production, but there is no explicit statement of when to choose bloat_collect over bloat_live_diagnose or bloat_check, and no prerequisites or exclusions are given. Usage is implied, not guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bloat_live_diagnoseA
One-shot live diagnosis without touching your timeline file.
Snapshots into a throwaway temp DB, diagnoses, discards it. Read-only on Postgres (read-only tx, 5s timeout). Safest option for prod DSNs. Args: dsn: Postgres DSN (default: BLOAT_DSN env). Password never logged. Returns: {findings: [...with action], blockers: [...]} — same verdict set as bloat_check, plus the current xmin-holder evidence.
| Name | Required | Description | Default |
|---|---|---|---|
| dsn | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and delivers: read-only transaction, 5s timeout, temp DB created and discarded, password never logged, and no mutation of the timeline file. These are exactly the safety facts an agent needs before pointing it at a production DSN.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-line purpose, then dense supporting detail. The explicit Args:/Returns: blocks are slightly redundant given the structured schema, but every line still carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No annotations or output schema, yet the description still documents the return shape ({findings, blockers}) and how it relates to bloat_check's output. Nothing an agent needs to invoke this safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% (bare string with no description), so the description compensates by explaining dsn is a Postgres DSN with a BLOAT_DSN env-var default and a no-logging guarantee. Only one low-complexity parameter keeps this from being richer.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('one-shot live diagnosis') and pins down its mechanism (snapshot into throwaway temp DB). Differentiates from siblings by naming bloat_check's verdict set plus added xmin-holder evidence, and from bloat_timeline by not touching the timeline file.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Safest option for prod DSNs' gives clear context for selecting this over siblings, and the no-timeline-touch note implies the timeline-based alternative. It stops short of explicit when-not conditions or naming bloat_check/bloat_timeline with a routing rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bloat_timelineA
Dead-tuple + approx + index-bloat time series: when the bloat started.
Read-only on the local timeline file. Args: table: Table name to filter (e.g. 'churn'). Empty = all tables. db: Path to the SQLite timeline file (default: BLOAT_DB env). Returns: {table: {dead: [{ts, live, dead}], approx_pct: [{ts, dead_pct}]}, index_bloat: {index: [{ts, bloat_pct}]}}. Rising dead = vacuum-starved; spike-then-zero = was blocked, blocker left.
| Name | Required | Description | Default |
|---|---|---|---|
| db | No | ||
| table | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it explicitly declares the read-only, local-file nature of the operation and adds real interpretive value ('Rising dead = vacuum-starved; spike-then-zero = was blocked, blocker left'). It omits any dependency on prior collection by bloat_collect, which is the main behavioral gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded summary line followed by clearly labeled Args and Returns blocks; nothing is redundant. The Returns block is dense but justified since no output schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotations, the description supplies the return shape and even explains how to read the series, which is the information an agent actually needs. The missing prerequisite (data collected first) and any retention/range limits keep it short of a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, and it does: it explains table filtering with an example ('churn', empty = all tables) and documents db as the path to the SQLite timeline file with a BLOAT_DB env default. Minor mismatch with the schema's empty-string default for db is a small blemish.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific resource and framing: a 'dead-tuple + approx + index-bloat time series' answering 'when the bloat started'. This implicitly separates it from the live/diagnostic siblings (bloat_live_diagnose) and the point-in-time check (bloat_check), though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'when the bloat started' and 'Read-only on the local timeline file', which suggests a historical/lookup use case. However, it never says when to prefer this over bloat_live_diagnose or bloat_blockers, nor that the timeline must already be populated by bloat_collect.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
5 tool updates
v0.1.6- First observed
bloat_blockers - First observed
bloat_check - First observed
bloat_collect - First observed
bloat_live_diagnose - First observed
bloat_timeline
TDQS
Scored across 5 tools
The set separates live collection (bloat_collect) from one-shot live diagnosis (bloat_live_diagnose) and from timeline readers (bloat_check, bloat_blockers, bloat_timeline). bloat_collect and bloat_live_diagnose return similar findings but descriptions clearly state saving vs discarding the snapshot. bloat_check and bloat_blockers overlap since check already reports blockers, though blockers adds focused pid/slot detail.
All names use snake_case with a consistent 'bloat_' prefix, making the domain and tool family immediately obvious. The pattern is predictable and no naming ambiguity exists.
Five tools is well-scoped for a focused diagnostic server: collect snapshot, check current state, live one-shot diagnosis, identify blockers, and show timeline. Each tool earns its place without redundant or missing core operations.
Coverage is strong for read-only PostgreSQL bloat diagnosis: collection, live diagnosis, timeline analysis, blocker identification, and current verdicts. Minor gaps exist around timeline management (pruning, export, listing snapshots) and remediation, though read-only safety appears intentional.
Maintenance
Related MCP Connectors
Safe, read-only Postgres and MySQL access for AI agents. Audit log + column-level controls.
Deterministic safety, correctness & cost gate that vets Postgres SQL before your AI agent runs it.
Query your Postgres from ChatGPT or Claude without exposing the database or handing over credentials. Run npx boltschema connect next to your database and it dials out over HTTPS — no inbound firewall rule, no open port, works with localhost and VPC-private databases. Read-only is enforced by a SQL guard, a Postgres READ ONLY transaction, and a scoped role generated for you.
Hosted MCP server for PostgreSQL diagnostics: slow queries, missing indexes, connection pressure.
Related MCP Servers
- FlicenseNot gradedqualityAmaintenanceEnables AI assistants to perform read-only PostgreSQL DBA operations through natural language, including performance and slow-query analysis, bloat and capacity detection, lock/deadlock and connection monitoring, autovacuum/VACUUM effectiveness checks, and schema and relationship discovery. It works across PostgreSQL 12-18 with automatic version detection and no required extensions, optionally enhancing query analytics via pg_stat_statements or pg_stat_monitor.-
- FlicenseNot gradedqualityAmaintenanceEnables AI assistants to perform read-only PostgreSQL DBA analysis and monitoring through natural language, covering performance, bloat, locks/deadlocks, autovacuum, and schema inspection across PostgreSQL 12-18 without required extensions.-
- FlicenseNot gradedqualityAmaintenanceEnables AI assistants to perform read-only PostgreSQL DBA and monitoring tasks, including performance analysis, bloat detection, lock/deadlock monitoring, autovacuum and schema inspection across PostgreSQL 12–18. It supports natural-language queries against production-safe, RDS/Aurora-compatible connections, with optional query analytics via pg_stat_statements or pg_stat_monitor.-
- FlicenseNot gradedqualityAmaintenanceEnables AI assistants to inspect and monitor PostgreSQL databases with read-only DBA tools for performance analysis, bloat detection, locks/deadlocks, autovacuum, schema discovery, replication, and maintenance recommendations.-