Other formats agents might prefer:
markdownjsonllms.txt

Agent? You probably want markdown or json, or Pod over MCP.

Reported issues for db-conn-mcp

Pod holds 20 of 27 problems reported by people outside the maintainer team. Issues filed by the project's own owners, members and collaborators are excluded entirely — a maintainer's release checklist is not a warning to a prospective user.

Back to db-conn-mcp.

Most discussed

setup --config PATH is ignored on first run; the unexpected scope prompt then shifts piped answers by one

Summary

On a first-time run, db-conn-mcp setup --config PATH silently ignores PATH. The wizard still asks for a scope and writes to the global or repo location instead. --config is only honoured once a config already exists.

Version: 0.7.1 (pipx, Python 3.12.3, Ubuntu). Also present in the current main as far as the code reads.

Where it comes from

run_setup_wizard() in cli.py:

existing = _existing_config(config_arg)
if existing is not None:
    ...         

[Read the thread](https://github.com/Idle-Sync/db-conn-mcp/issues/56) · 2026-08-21 · open · outside contributor · 1 comment

### HTTP/SSE transport exposes all tools including execute_write_query with no authentication

> Filed from a `deep-review` full-repo audit (find-then-adversarially-verify). Verifier verdict: **CONFIRMED**.

**Location:** `src/db_conn_mcp/server.py:533`
**Category:** correctness

## Summary
The `http`/SSE transport exposes all 23 tools, including `execute_write_query`, with no authentication at all, while the read-only dashboard on the same machine is token-guarded. [same root cause also at: src/db_conn_mcp/gui/app.py:394, src/db_conn_mcp/server.py:37, src/db_conn_mcp/guard.py:23, s

[Read the thread](https://github.com/Idle-Sync/db-conn-mcp/issues/42) · 2026-08-13 · closed · outside contributor · 1 comment

### Dry-run grants are process-global and content-keyed: previews leak across HTTP sessions

> Filed from a `deep-review` full-repo audit (find-then-adversarially-verify). Verifier verdict: **CONFIRMED**.

**Location:** `src/db_conn_mcp/handlers.py:151`
**Category:** correctness

## Summary
Dry-run grants live in a single per-process dict with no session scoping, so under the http/SSE transport one client's preview authorizes a different client's commit. [same root cause also at: src/db_conn_mcp/handlers.py:504, src/db_conn_mcp/handlers.py:498, src/db_conn_mcp/handlers.py:484]


[Read the thread](https://github.com/Idle-Sync/db-conn-mcp/issues/41) · 2026-08-13 · closed · outside contributor · 1 comment

### Dry-run can permanently commit via embedded COMMIT on simple query protocol

> Filed from a `deep-review` full-repo audit (find-then-adversarially-verify). Verifier verdict: **CONFIRMED**.

**Location:** `src/db_conn_mcp/handlers.py:497`
**Category:** correctness

## Summary
The "always rolled back" dry-run can permanently commit: `execute_dry_run` routes non-row-returning SQL to `conn.execute(sql)` with no bind args, which asyncpg sends over the simple query protocol (multi-statement), so an embedded `COMMIT;` ends the wrapping transaction before `tx.rollback()` r

[Read the thread](https://github.com/Idle-Sync/db-conn-mcp/issues/40) · 2026-08-13 · closed · outside contributor · 1 comment

### Ergonomics: output filters, parameter parity, and version staleness for table_stats, explain_query, get_table_schema, check_database, doctor

Five ergonomics improvements to existing tools, all observed in one real session (v0.5.6, a ~3.3 GB / 146-table PostgreSQL database). None are new capabilities — each one is an existing tool returning too much, refusing an input its sibling already accepts, or omitting a check it is perfectly placed to make.

## 1. `table_stats`: add `limit` / `min_size` / `table` filters

`table_stats` returns every table inline — 146 entries in this session — when the question is almost always "the top N by si

[Read the thread](https://github.com/Idle-Sync/db-conn-mcp/issues/29) · 2026-08-11 · closed · outside contributor · 1 comment

### Notify users on older versions that a newer release is available

Users on an old version have no way of finding out a newer one exists unless they run `doctor` by hand. The pipx/uvx install model makes this worse: nothing ever auto-updates, and the "client silently ran a stale cached binary" failure class (see #20's stale-install verdict) shows people genuinely sit on old versions without knowing.

## What exists already

- `doctor`'s `pypi_latest` check queries PyPI (cache-bypassed) and reports when the installed version is behind — but only when the user ex

[Read the thread](https://github.com/Idle-Sync/db-conn-mcp/issues/28) · 2026-08-11 · closed · outside contributor · 1 comment

### read-only guarantee bypassable: execute_read_query allows SET SESSION CHARACTERISTICS ... READ WRITE

## Summary

The README states that a `read`-mode database is read-only "by PostgreSQL itself" and that "even if an agent insists, a write physically cannot happen." This guarantee can be bypassed: `execute_read_query` forwards arbitrary SQL to the connection, and a single statement can re-enable writes on the same session, because read-only is enforced as a **session default** (`SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY`) rather than at the role/privilege level.

## Root cause

Read-o

[Read the thread](https://github.com/Idle-Sync/db-conn-mcp/issues/1) · 2026-06-03 · closed · outside contributor · 1 comment

### fallback_ports never probed: dual-stack localhost refusal (asyncio "Multiple exceptions" OSError) classified UNKNOWN, aborting the chain

**Version:** 0.7.1 (a3963e5), macOS, Python 3.14 (pipx)

## What happened

A connection with its primary DSN on a dead port and a live server on the configured fallback port fails outright — the fallback is never probed:

```json
{ "name": "aws-aurora-db", "dsn": "postgresql://...@localhost:5433/...", "fallback_ports": [5432] }

With nothing on 5433 and an SSH tunnel serving Postgres on 5432, every tool call returns:

[UNKNOWN] Unrecognized connection error. Fix: Open the `troubleshoot_c

[Read the thread](https://github.com/Idle-Sync/db-conn-mcp/issues/55) · 2026-08-17 · open · outside contributor · 0 comments

## Most recent

### CLI status/setup/remove/add crash with a traceback on malformed connections.json

> Filed from a `deep-review` full-repo audit (find-then-adversarially-verify). Verifier verdict: **CONFIRMED**.

**Location:** `src/db_conn_mcp/cli.py:325`
**Category:** correctness

## Summary
`config.load` raises `ConfigError` from `_print_status`/`cmd_remove`/`_add_connection_interactive`, but only `cmd_check` and `cmd_yolo` catch it — the rest crash. [same root cause also at: src/db_conn_mcp/handlers.py:734, src/db_conn_mcp/cli.py:634, src/db_conn_mcp/cli.py:634, src/db_conn_mcp/cli.py

[Read the thread](https://github.com/Idle-Sync/db-conn-mcp/issues/54) · 2026-08-13 · open · outside contributor · 0 comments

### write_config non-atomic write can truncate client configs holding other servers' secrets

> Filed from a `deep-review` full-repo audit (find-then-adversarially-verify). Verifier verdict: **CONFIRMED**.

**Location:** `src/db_conn_mcp/clients.py:141`
**Category:** correctness

## Summary
write_config rewrites a client config with a non-atomic write_text, unlike config.save's temp-file-and-replace, risking truncation of files that hold other servers' secrets [same root cause also at: src/db_conn_mcp/server.py:512, src/db_conn_mcp/clients.py:164, src/db_conn_mcp/clients.py:164, sr

[Read the thread](https://github.com/Idle-Sync/db-conn-mcp/issues/53) · 2026-08-13 · open · outside contributor · 0 comments

### verify_stdio ignores isError, reporting failed tool calls as a passing verdict

> Filed from a `deep-review` full-repo audit (find-then-adversarially-verify). Verifier verdict: **CONFIRMED**.

**Location:** `src/db_conn_mcp/verify.py:84`
**Category:** correctness

## Summary
`verify_stdio` never checks `dbs.isError`, so a tool call that came back as an MCP error is still reported as verdict "answers". [same root cause also at: src/db_conn_mcp/verify.py:84, src/db_conn_mcp/verify.py:84, src/db_conn_mcp/verify.py:199, src/db_conn_mcp/verify.py:128, src/db_conn_mcp/verif

[Read the thread](https://github.com/Idle-Sync/db-conn-mcp/issues/52) · 2026-08-13 · open · outside contributor · 0 comments

### check_sequences reports false "all healthy" when probes fail on privileges

> Filed from a `deep-review` full-repo audit (find-then-adversarially-verify). Verifier verdict: **CONFIRMED**.

**Location:** `src/db_conn_mcp/handlers.py:676`
**Category:** correctness

## Summary
check_sequences promises `behind_count: 0` is an affirmative "nothing is stale" answer, but sequences whose probe fails on privileges are silently dropped from both the report and total_sequences. [same root cause also at: src/db_conn_mcp/dialects/postgres.py:413, src/db_conn_mcp/dialects/postg

[Read the thread](https://github.com/Idle-Sync/db-conn-mcp/issues/51) · 2026-08-13 · open · outside contributor · 0 comments

### execute() silently discards RETURNING rows on write statements

> Filed from a `deep-review` full-repo audit (find-then-adversarially-verify). Verifier verdict: **CONFIRMED**.

**Location:** `src/db_conn_mcp/dialects/postgres.py:882`
**Category:** correctness

## Summary
execute() routes any statement whose leading keyword is not a read leader through conn.execute(), silently discarding RETURNING result rows. [same root cause also at: src/db_conn_mcp/dialects/postgres.py:882, src/db_conn_mcp/dialects/postgres.py:882, src/db_conn_mcp/dialects/postgres.p

[Read the thread](https://github.com/Idle-Sync/db-conn-mcp/issues/50) · 2026-08-13 · open · outside contributor · 0 comments

### _KEYS_SQL cartesian product duplicates composite PK/FK columns

> Filed from a `deep-review` full-repo audit (find-then-adversarially-verify). Verifier verdict: **CONFIRMED**.

**Location:** `src/db_conn_mcp/dialects/postgres.py:78`
**Category:** correctness

## Summary
_KEYS_SQL LEFT JOINs information_schema.constraint_column_usage on constraint name only, producing a cartesian product for any multi-column PK/FK. [same root cause also at: src/db_conn_mcp/dialects/postgres.py:78, src/db_conn_mcp/dialects/postgres.py:75, src/db_conn_mcp/dialects/postgre

[Read the thread](https://github.com/Idle-Sync/db-conn-mcp/issues/49) · 2026-08-13 · open · outside contributor · 0 comments

### Operator-precedence bug makes diagnostics misreport DB_NOT_FOUND as AUTH_FAILED

> Filed from a `deep-review` full-repo audit (find-then-adversarially-verify). Verifier verdict: **CONFIRMED**.

**Location:** `src/db_conn_mcp/diagnostics.py:113`
**Category:** correctness

## Summary
Unparenthesized `A or B and C` plus check ordering makes any connection error containing both "role" and "exist" report AUTH_FAILED, shadowing the DB_NOT_FOUND branch on the next line. [same root cause also at: src/db_conn_mcp/diagnostics.py:113, src/db_conn_mcp/diagnostics.py:109, src/db_co

[Read the thread](https://github.com/Idle-Sync/db-conn-mcp/issues/48) · 2026-08-13 · open · outside contributor · 0 comments

### fetch_rows leaks cursor + connection when fetch raises

> Filed from a `deep-review` full-repo audit (find-then-adversarially-verify). Verifier verdict: **CONFIRMED**.

**Location:** `src/db_conn_mcp/handlers.py:611`
**Category:** correctness

## Summary
`fetch_rows` refreshes `last_used` and then awaits `cursor.fetch(n)` outside any try/except, so a fetch that raises leaves the cursor registered in `self._cursors` with its dedicated database connection still open. [same root cause also at: src/db_conn_mcp/handlers.py:611, src/db_conn_mcp/handl

[Read the thread](https://github.com/Idle-Sync/db-conn-mcp/issues/47) · 2026-08-13 · open · outside contributor · 0 comments

### config.save() silently deletes unknown keys from connections.json

> Filed from a `deep-review` full-repo audit (find-then-adversarially-verify). Verifier verdict: **CONFIRMED**.

**Location:** `src/db_conn_mcp/config.py:114`
**Category:** correctness

## Summary
save() serializes the pydantic model, which ignores unknown keys, so any extra key in the user's connections.json is silently deleted the first time anything writes the file. [same root cause also at: src/db_conn_mcp/config.py:114, src/db_conn_mcp/config.py:114, src/db_conn_mcp/config.py:114, src

[Read the thread](https://github.com/Idle-Sync/db-conn-mcp/issues/46) · 2026-08-13 · open · outside contributor · 0 comments

### config.save() is an unlocked read-modify-write: concurrent writers lose/corrupt data

> Filed from a `deep-review` full-repo audit (find-then-adversarially-verify). Verifier verdict: **CONFIRMED**.

**Location:** `src/db_conn_mcp/config.py:115`
**Category:** correctness

## Summary
`save()` is a read-modify-write with a fixed `.tmp` filename and no lock, so concurrent writers lose updates or interleave into one temp file. [same root cause also at: src/db_conn_mcp/config.py:115, src/db_conn_mcp/gui/app.py:376, src/db_conn_mcp/config.py:120, src/db_conn_mcp/gui/app.py:503]


[Read the thread](https://github.com/Idle-Sync/db-conn-mcp/issues/45) · 2026-08-13 · open · outside contributor · 0 comments

### _leading_keyword mis-parses nested block comments, defeating the read-only classifier

> Filed from a `deep-review` full-repo audit (find-then-adversarially-verify). Verifier verdict: **CONFIRMED**.

**Location:** `src/db_conn_mcp/dialects/postgres.py:725`
**Category:** correctness

## Summary
`_leading_keyword` terminates a block comment at the first `*/`, but PostgreSQL nests `/* */`, so the leader it reports can differ from the statement Postgres actually runs. [same root cause also at: src/db_conn_mcp/dialects/postgres.py:724, src/db_conn_mcp/dialects/postgres.py:729, sr

[Read the thread](https://github.com/Idle-Sync/db-conn-mcp/issues/44) · 2026-08-13 · open · outside contributor · 0 comments

### config.save() resets connections.json to world-readable on every write

> Filed from a `deep-review` full-repo audit (find-then-adversarially-verify). Verifier verdict: **CONFIRMED**.

**Location:** `src/db_conn_mcp/config.py:116`
**Category:** correctness

## Summary
save() writes the temp file with the default umask and os.replace's it over connections.json, so the file's owner-only permissions are silently reset to world-readable on every config write. [same root cause also at: src/db_conn_mcp/config.py:116, src/db_conn_mcp/config.py:116, src/db_conn_mcp/co

[Read the thread](https://github.com/Idle-Sync/db-conn-mcp/issues/43) · 2026-08-13 · open · outside contributor · 0 comments

The remaining reports are on [the project's issue tracker](https://github.com/Idle-Sync/db-conn-mcp/issues).