PgSafe MCP
# pgsafe-mcp
[](https://pypi.org/project/pgsafe-mcp/)
[](https://github.com/johannschiffer/pgsafe-mcp/actions/workflows/ci.yml)
[](https://python.org)
[](https://modelcontextprotocol.io)
[](LICENSE)
[](https://ko-fi.com/johannschiffer)
<a href="https://glama.ai/mcp/servers/@johannschiffer/pgsafe-mcp">
<img width="380" height="200" src="https://glama.ai/mcp/servers/@johannschiffer/pgsafe-mcp/badge" alt="pgsafe-mcp MCP server" />
</a>
**PgSafe MCP** is a read-only Model Context Protocol server for PostgreSQL and SQLite that enables AI coding agents in Claude Desktop, Cursor, Windsurf, and Antigravity to inspect schemas, run bounded analytical SQL queries with automatic PII masking, and test DML statements inside rolled-back SQLite transactions.
---
## Quickstart
Run directly via `uvx`:
```bash
uvx pgsafe-mcp
```
Claude Desktop / Cursor configuration:
```json
{
"mcpServers": {
"pgsafe-mcp": {
"command": "uvx",
"args": ["pgsafe-mcp"],
"env": {
"DATABASE_URL": "postgresql://readonly_user:password@localhost:5432/analytics_db"
}
}
}
}
```
For SQLite databases:
```json
{
"mcpServers": {
"pgsafe-mcp": {
"command": "uvx",
"args": ["pgsafe-mcp"],
"env": {
"DATABASE_URL": "sqlite:///path/to/database.db"
}
}
}
}
```
For PostgreSQL support when installing from source:
```bash
pip install "pgsafe-mcp[postgres]"
```
---
## Core Capabilities
1. **Lexer-Aware Read-Only SQL Guard:** Tokenizes SQL comments and string/dollar-quoted literals before validating statement boundaries, blocking `DROP`, `TRUNCATE`, `DELETE`, `UPDATE`, `INSERT`, `ALTER`, `COPY`, `VACUUM`, `ATTACH`, `EXPLAIN ANALYZE`, and semicolon chaining.
2. **Engine-Level Read-Only Enforcement:** Configures PostgreSQL sessions with `SET default_transaction_read_only = on` and SQLite connections with `?mode=ro` plus `sqlite3.Connection.set_authorizer`.
3. **Top-Level Row Limit Enforcement:** Applies `LIMIT` bounds to outer `SELECT` and `WITH` queries without corrupting `PRAGMA`, `EXPLAIN`, `OFFSET`, or trailing SQL comments.
4. **Live PII Redaction:** Masks emails, payment card numbers, phone numbers, password hashes, and sensitive column values before returning rows to the LLM context.
5. **SQLite Dry-Run Mutation Harness:** Simulates single-statement `INSERT`, `UPDATE`, or `DELETE` changes inside an immediate transaction with authorizer restrictions and automatic `ROLLBACK`.
6. **Heuristic Query & Index Inspection:** Flags missing `WHERE` clauses, unconstrained joins, and candidate filter columns for indexing.
---
## MCP Tools
| Tool | Parameters | Description |
|---|---|---|
| `list_tables` | *(none)* | Lists user tables in the connected PostgreSQL or SQLite database |
| `describe_table` | `table_name` | Returns column names, types, nullability, defaults, and primary key metadata |
| `safe_query` | `query`, `limit`, `mask_pii` | Validates read-only SQL, enforces row limits, executes query, and masks PII |
| `dry_run_mutation` | `mutation_sql` | Simulates a single DML statement on SQLite inside an auto-rolled-back transaction |
| `analyze_query` | `query` | Evaluates read-only safety and full-scan / Cartesian join risk heuristics |
| `recommend_indexes` | `query` | Suggests candidate indexes from `WHERE` and `ORDER BY` predicates |
| `get_security_status` | *(none)* | Reports active guard status and credential-redacted `DATABASE_URL` |
---
## Related Open-Source MCP Servers
| Package | Description | Repository |
|---|---|---|
| **genesis-blackbox** | Runtime flight recorder and AST blast-radius crash compiler | [GitHub](https://github.com/johannschiffer/genesis-blackbox) |
| **crawlengine-mcp** | HTTP web extraction, clean Markdown conversion, and proxy rotation | [GitHub](https://github.com/johannschiffer/crawlengine-mcp) |
| **browserbridge-mcp** | Session-pooled HTTP DOM inspection and SHA-256 action trail receipts | [GitHub](https://github.com/johannschiffer/browserbridge-mcp) |
| **omnibridge-mcp** | Multi-channel notification bus with SQLite retry queue | [GitHub](https://github.com/johannschiffer/omnibridge-mcp) |
| **sysflow-mcp** | Linux resource inspection, systemd unit generator, and log tailer | [GitHub](https://github.com/johannschiffer/sysflow-mcp) |
| **fastmcp-forge** | MCP server framework and project scaffolder | [GitHub](https://github.com/johannschiffer/fastmcp-forge) |
## Support
If this project is useful in your workflow, you can support ongoing maintenance on [Ko-fi](https://ko-fi.com/johannschiffer).
## License
MIT License. Copyright (c) 2026 [Johann Schiffer](https://github.com/johannschiffer).
TDQS
Scored across 4 tools
Each tool has a clearly distinct purpose: list_tables vs describe_table target different levels of schema introspection, while safe_query executes read-only queries and analyze_query performs static analysis without execution. There is no meaningful overlap that would cause misselection.
All names use snake_case, which is consistent. However, safe_query deviates slightly from the dominant verb_noun pattern seen in list_tables, describe_table, and analyze_query by using an adjective_noun construction.
Four tools is well-scoped for a read-only PostgreSQL safety server. Each tool covers a necessary capability: table discovery, schema inspection, safe execution, and query risk analysis.
The core read-only workflow is covered: discover tables, inspect their structure, query safely, and analyze query risk. Minor gaps exist, such as explicit schema/view listing or index introspection, but agents can work around these using safe_query against system catalogs.