dbecho
dbecho gives AI agents read-only access to PostgreSQL databases, enabling natural language analytics and data exploration. Key capabilities include:
List & Discover Databases: View all configured databases with descriptions, table counts, total rows, largest tables, and sizes.
Health Check: Verify connectivity, PostgreSQL version, and database size for all configured databases.
Schema Exploration: Retrieve full schemas (tables, columns, types, primary keys, row counts, sizes), deep-dive into a single table, or generate text-based entity-relationship diagrams (ERDs).
Read-Only SQL Execution: Run
SELECT,WITH,EXPLAIN, andSHOWqueries with offset paging and JSON output — writes are blocked at the database level.Query Planning: Get execution plans with estimated cost and row counts before running a query.
Table Profiling: Analyze null rates, cardinality, value distributions, min/max/avg for numeric columns, and top values for low-cardinality columns.
Time-Series Trending: Group data by day, week, month, quarter, or year to analyze counts, averages, and totals over time.
Data Quality Auditing: Detect high null rates, single-value columns, numeric outliers, future dates, and potential duplicates.
Cross-Database Comparison: Run the same SQL query across multiple databases simultaneously and view results side by side.
Row Sampling: Preview rows from any table to understand data format.
MCP Resources & Prompts: Expose schema and summary as MCP resources, plus guided prompts for database exploration, cross-database comparison, and data quality audits.
It operates as a lightweight Python package with no containers or web UI required, and ensures safety via query whitelisting, SQL injection prevention, query timeouts, row limits, and sensitive column redaction.
Provides read-only access to PostgreSQL databases, enabling AI agents to explore schemas, run SQL queries, analyze tables, detect anomalies, and generate insights across multiple databases.
Click on "Install 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., "@dbechoHow are sales trending this quarter?"
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.
dbecho
Talk to your PostgreSQL databases through AI. No dashboards, no BI tools, just questions and answers.
dbecho is an MCP server that gives AI agents (Claude Code, Cursor, Windsurf, or any MCP client) direct read-only access to your PostgreSQL databases. Point it at your databases, ask questions in plain language, get instant analytics.
You: What are my most popular blog posts and why?
Claude: [runs schema → query → analyze → trend across 29 tables]
Here's what the data shows...What can it do?
14 tools that cover the full analytics workflow:
Tool | Purpose |
| Show all connected databases |
| Check connectivity, PostgreSQL version, database size |
| Full schema: tables, columns, types, PKs, row counts, sizes |
| One table in depth: columns, PK, indexes, size — cheaper than |
| Locate tables and columns by name substring, across all databases at once |
| Run read-only SQL (SELECT, WITH, EXPLAIN, SHOW), with offset paging and JSON output |
| Query plan with estimated cost/rows — judge a query before running it |
| Profile a table: nulls, cardinality, distributions, top values |
| Same query across multiple databases, side by side |
| Overview: table counts, total rows, largest tables |
| Time-series: counts/averages grouped by day/week/month/year, with JSON output |
| Data quality: high nulls, outliers, duplicates, future dates |
| Preview rows from any table |
| Entity-relationship diagram: PKs and foreign keys |
Plus 3 MCP Resources (schema/summary per database) and 3 MCP Prompts (guided exploration, cross-database comparison, data quality audit).
Related MCP server: Postgres MCP Pro
Why dbecho?
The problem: You have PostgreSQL databases across projects. Getting answers means context-switching to psql, pgAdmin, or a BI tool, writing SQL, formatting results, then bringing insights back to your conversation.
The fix: dbecho stays inside your AI agent's workflow. The agent explores schema, writes SQL, cross-references tables, and builds analysis without you leaving the conversation. One config file, zero context switches.
What makes it different from just giving an agent a connection string:
Multi-database. Connect 1 or 20 databases. Compare across them with one tool call.
Safe by default. Read-only connections, query timeouts, row limits, SQL injection prevention. You can't accidentally
DROP TABLE.Agent-optimized output. Schema, stats, and query results are formatted so LLMs parse them efficiently, not as raw psql dumps.
Zero infrastructure. No containers, no web UI, no background processes. A Python package that speaks MCP over stdio.
Example session
You: Show me what's in the database
Claude: [calls list_databases → schema → summary]
Database: ecommerce (12 tables, 847 MB)
Largest: orders (2.1M rows), products (45K rows), users (128K rows)
You: How are sales trending this quarter?
Claude: [calls trend on orders table, grouped by week]
Week | orders | total_revenue
2026-01-06 | 3,241 | $482,100
2026-01-13 | 3,892 | $571,340
2026-01-20 | 2,107 | $298,500 ← 46% drop
...
Significant drop in week of Jan 20. Let me check what happened.
[calls query to investigate, then anomalies on orders table]
Found: 89% of orders that week have status='cancelled'.
The cancellation spike correlates with a payment gateway outage
(payments table shows 0 successful transactions Jan 19-21).
You: Any data quality issues I should worry about?
Claude: [calls anomalies on each table]
Found 4 issues:
- users.email: 342 possible duplicates
- orders.shipped_at: 127 dates in the future
- products.price: 23 outliers (IQR: $5..$89, found items at $0 and $9,999)
- events.user_id: 94.2% NULL (missing user attribution)One conversation, zero context switches. The agent picks the right tools automatically.
Quick start
1. Install
pip install dbechoOr from source:
git clone https://github.com/ginkida/dbecho.git
cd dbecho
pip install .Requires Python 3.10+.
2. Configure
Create dbecho.toml in your project directory:
[databases.myapp]
url = "postgres://user:pass@localhost:5432/myapp"
description = "Main application"
[databases.analytics]
url = "postgres://user:pass@localhost:5432/analytics"
description = "Analytics warehouse"
[settings]
row_limit = 500 # max rows returned per query (default: 500)
query_timeout = 30 # seconds before query is killed (default: 30)
max_profile_rows = 5000000 # refuse analyze/anomalies above this row count
redact_sensitive = true # redact password/token/secret-like columns in outputEnvironment variables work with ${VAR} syntax:
[databases.production]
url = "${DATABASE_URL}"
description = "Production (read replica)"If an app keeps its tables outside public, set schema (default "public",
lowercase identifier). All metadata tools (schema, describe, analyze, ...)
target it, and it leads search_path so raw queries can use unqualified table
names:
[databases.events]
url = "${EVENTS_DATABASE_URL}"
schema = "analytics"Verify the config and connectivity before wiring up your MCP client:
dbecho --check # validate config + ping every database
dbecho --version # print "dbecho <version>"--check prints a [OK]/[FAIL] <name>: … line per database and exits 0 only
when every database responds (non-zero otherwise), so it drops straight into a
CI or healthcheck script.
3. Connect to your MCP client
Claude Code (project-level, recommended):
Create .mcp.json in your project root:
{
"mcpServers": {
"dbecho": {
"command": "dbecho",
"args": ["--config", "/path/to/dbecho.toml"]
}
}
}Claude Code (global):
Add to ~/.claude.json:
{
"mcpServers": {
"dbecho": {
"command": "dbecho"
}
}
}When no --config is passed, dbecho searches for config in:
./dbecho.toml(current directory)~/.config/dbecho/config.toml~/.dbecho.toml
Other MCP clients (Cursor, Windsurf, etc.): use the same command/args in your client's MCP server configuration.
4. Ask questions
Show me a summary of all my databases
How many users signed up each month this year?
Compare order counts between staging and production
Find data quality issues in the events table
What's the relationship between users, orders, and products?
Which columns have the most nulls?
Show me the trend of daily revenue for the last 90 daysThe agent picks the right tools automatically. You don't need to know the tool names.
Safety
dbecho is designed to be safe to point at any database, including production:
Read-only connections. Every connection sets
default_transaction_read_only=onat the PostgreSQL level. Even if someone crafts malicious SQL, the database rejects writes.Query whitelist. Only
SELECT,WITH,EXPLAIN, andSHOWstatements are allowed — and the validator independently rejects data-modifying CTEs (WITH x AS (DELETE ...) SELECT ...),SELECT INTO, andEXPLAIN ANALYZEover write statements, so it doesn't rely on the read-only connection alone.Blocked functions. Filesystem, large-object,
dblink, andset_configfunctions are rejected even though the transaction is read-only — they are exfiltration/escape vectors.SQL injection prevention. All table/column identifiers use
psycopg.sql.Identifier()parameterization. User input is validated against^[a-zA-Z_][a-zA-Z0-9_]*\Z(\Z, not$, so a trailing newline can't sneak past). The one identifier-shaped value placed outsideIdentifier()is the per-databaseschemaconfig option — it is embedded in the connection'ssearch_path— and it is validated against the same shape (lowercase-only) at config load, before any connection exists.Query timeout. Default 30 seconds, enforced as one shared budget across multi-query tools via
statement_timeout, with session-level timeout backstops on every connection.Row limit. Default 500 rows per query. Prevents the agent from pulling entire tables into context. Full-table profiling (
analyze/anomalies) additionally refuses tables abovemax_profile_rows.Sensitive-column redaction. Values of columns that look like secrets (
password,token,api_key,secret, ...) are replaced with<redacted>inquery/sample/analyzeoutput (default on;redact_sensitive = falseto disable). This is name-based harm reduction, not a hermetic control —queryis an open read channel by design.Sanitized errors. Connection failures are reported to the agent as coarse categories (
authentication failed,connection refused, ...); full details go to the server log only, so hostnames/usernames never leak into the conversation.Local only. No network calls, no telemetry, no cloud. Data stays on your machine.
For production databases, the strongest setup is still a least-privilege role: a PostgreSQL user with SELECT only on the tables/views you want exposed. dbecho's layers protect against accidents and prompt-injected agents; the database's own grants are the final word.
Architecture
src/dbecho/
config.py TOML config loading, env var expansion, validation
db.py DatabaseManager: connections, schema cache, queries, stats, trends, anomalies
server.py FastMCP server: 14 tools, 3 resources, 3 prompts~2000 lines of Python total. No framework beyond mcp and psycopg.
Development
git clone https://github.com/ginkida/dbecho.git
cd dbecho
pip install -e ".[dev]"
pytest -vTests are fully mocked, no PostgreSQL instance needed. CI runs on Python 3.10-3.13.
License
MIT
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/ginkida/dbecho'
If you have feedback or need assistance with the MCP directory API, please join our Discord server