SELECT runs with an automatic row limit, while INSERT, UPDATE, DELETE, DROP and TRUNCATE return affected rows, risk level and rollback context instead of running. That is what makes it reasonable to point at a real database: the destructive path structurally does not exist, and every tool call is written to an audit log.
A PostgreSQL MCP server built as 21 focused tools rather than one broad execute_sql escape hatch — schema discovery, safe query execution, impact analysis, performance review, security checks, maintenance and data quality.
- Connection and health: connect, disconnect, health_check
- Schema: get_schema with optional Mermaid ERDs, and dependency_analysis before renaming or dropping anything
- Queries: execute_query for read-only SELECT, analyze_query, query_optimizer, and analyze_impact for a write preview
- Performance: database_health, query_performance, configuration_review, replication_status
- Security: security_audit over roles and privileges, sensitive_data_scan for likely PII
- Maintenance: maintenance_analysis for vacuum and dead tuples, partition_analysis
- Data quality: data_quality_report, duplicate_detection
- Audit trail of tool calls: get_audit_logs, list_audit_files
Python 3.11+ and PostgreSQL 12+. Clone and pip install -e ., then run it as a stdio server with DATABASE_URL in your client's env block, or with DB_HOST, DB_PORT, DB_USER, DB_PASSWORD and DB_NAME. DBEAST_DEFAULT_ROW_LIMIT caps returned rows at 100 by default. Version 0.2.1.
