
PG Bloat Detective
io.github.r69shabhv0.1.3Updated Oct 7, 2026
Read-only Postgres bloat verdicts: blockers, timelines, REINDEX proof.
Overview
Read-only Postgres bloat diagnosis: table and index verdicts, blocker identification, timelines, and REINDEX proof.
- What it does
- Exposes five read-only tools over a Postgres database. bloat_check returns a verdict, evidence, and suggested fix per table or index; bloat_collect snapshots a timeline and returns fresh verdicts; bloat_timeline shows dead-tuple and index-bloat series; bloat_blockers names the pid, query, xmin age, and slot behind vacuum starvation; bloat_live_diagnose takes a one-shot throwaway snapshot so the stored timeline file is untouched. Verdicts distinguish vacuum-starved, blocked-by-idle-xact, needs-rewrite, index-bloated, and index-unused states.
- When to use it
- Useful when investigating table or index bloat on a Postgres instance, deciding whether VACUUM or REINDEX is the right fix, or finding which long-running transaction or replication slot is blocking cleanup. Best suited to read-only diagnosis of production databases.
- Requirements
- Runs locally over stdio as a PyPI package (pg-bloat-detective) needing Python and psycopg. Requires a Postgres DSN in BLOAT_DSN and a SQLite timeline file path in BLOAT_DB, produced by the collect command. No authentication is declared; the DSN carries the database credentials.
Installation
In SourceWeft
- Open PG Bloat Detective in the dashboard and add it to a workspace.
- Enable the server for the chats that should use its tools.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Other MCP clients
Follow the launch instructions in the repository.
README
pg-bloat-detective
mcp-name: io.github.r69shabh/pg-bloat-detective
Read-only Postgres bloat detective: cheap timeline, named blocker, index bloat, evidence-linked report, before/after proof.
Quickstart
Verdicts
Heap: normal (steady-state, leave alone) · vacuum-starved · blocked-by-idle-xact|slot|prepared|active-xact · needs-rewrite.
Index: index-bloated (pgstatindex bloat >30% → needs REINDEX, VACUUM can't fix it) · index-unused (idx_scan=0 across snapshots → DROP candidate).
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:
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.
Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json):
Public listing: mcp.so + PulseMCP accept GitHub submissions (server.json + README badge) — repo is ready, submit the URL after push.
Source: README.md at commit 4e704af
Tools
0Version history
1- v0.1.3LatestOct 7, 2026


