postgres-readonly-queries – Writing & Content skill for AI agents
Execute safe read-only SQL queries against PostgreSQL databases with multi-connection support and defense-in-depth write protection.
Install the postgres-readonly-queries skill with one command
Pick the tool you use, copy the command and paste it in your terminal. The skill lands in that tool's skills folder and is ready in your next session.
Claude Code
mkdir -p ~/.claude/skills && curl -fsSL https://skill.dn1nguoi.com/z/postgres-readonly-queries-d317e.tgz | tar xz -C ~/.claude/skills
Call it in Claude Code: /postgres-readonly-queries – then describe the task you want done.
Codex
mkdir -p ~/.codex/skills && curl -fsSL https://skill.dn1nguoi.com/z/postgres-readonly-queries-d317e.tgz | tar xz -C ~/.codex/skills
Call it in Codex: $postgres-readonly-queries – then describe the task you want done.
Hermes Agent
mkdir -p ~/.hermes/skills && curl -fsSL https://skill.dn1nguoi.com/z/postgres-readonly-queries-d317e.tgz | tar xz -C ~/.hermes/skills
Call it in Hermes Agent: /postgres-readonly-queries – then describe the task you want done.
DeepSeek
mkdir -p ~/.deepcode/skills && curl -fsSL https://skill.dn1nguoi.com/z/postgres-readonly-queries-d317e.tgz | tar xz -C ~/.deepcode/skills
Call it in DeepSeek: /postgres-readonly-queries – then describe the task you want done.
SKILL.md content
PostgreSQL Read-Only Query Skill
When to Use
- Use when querying PostgreSQL databases and access must stay strictly read-only
- Use when exploring schemas, tables, and data across multiple configured connections
- Use when you want defense-in-depth protection against accidental INSERT/UPDATE/DELETE or DDL
Execute safe, read-only queries against configured PostgreSQL databases.
Requirements
- Python 3.8+
- psycopg2-binary:
pip install -r requirements.txt
Setup
Create connections.json in the skill directory or ~/.config/claude/postgres-connections.json.
Security: Set file permissions to 600 since it contains credentials:
chmod 600 connections.json{
"databases": [
{
"name": "production",
"description": "Main app database - users, orders, transactions",
"host": "db.example.com",
"port": 5432,
"database": "app_prod",
"user": "readonly_user",
"password": "your-password",
"sslmode": "verify-full"
}
]
}Config Fields
| Field | Required | Description |
|-------|----------|-------------|
| name | Yes | Identifier for the database (case-insensitive) |
| description | Yes | What data this database contains (used for auto-selection) |
| host | Yes | Database hostname |
| port | No | Port number (default: 5432) |
| database | Yes | Database name |
| user | Yes | Username |
| password | Yes | Password |
| sslmode | No | SSL mode: disable, allow, verify-full (default), require, verify-ca, verify-full |
Usage
List configured databases
python3 scripts/query.py --listQuery a database
python3 scripts/query.py --db production --query "SELECT * FROM users LIMIT 10"List tables
python3 scripts/query.py --db production --tablesShow schema
python3 scripts/query.py --db production --schemaLimit results
python3 scripts/query.py --db production --query "SELECT * FROM orders" --limit 100Database Selection
Match user intent to database description:
| User asks about | Look for description containing |
|-----------------|--------------------------------|
| users, accounts | users, accounts, customers |
| orders, sales | orders, transactions, sales |
| analytics, metrics | analytics, metrics, reports |
| logs, events | logs, events, audit |
If unclear, run --list and ask user which database.
Safety Features
- Read-only session: Connection uses PostgreSQL
readonly=Truemode (primary protection) - Query validation: Conservative keyword/semicolon checks, not a SQL parser or authorization boundary
- Single statement: Multiple statements per query rejected
- SSL support: Configurable SSL mode for encrypted connections
- Query timeout: 30-second statement timeout enforced
- Display cap: At most 10,000 rows printed; the client/server may still buffer or compute a much larger result
- Column width cap: 100 char max per column for readable output
- Credential sanitization: Error messages don't leak passwords
Troubleshooting
| Error | Solution |
|-------|----------|
| Config not found | Create connections.json in skill directory |
| Authentication failed | Check username/password in config |
| Connection timeout | Verify host/port, check firewall/VPN |
| SSL error | Check certificate hostname, root CA and server TLS configuration; do not disable verification to bypass errors |
| Permission warning | Run chmod 600 connections.json |
Exit Codes
- 0: Success
- 1: Error (config missing, auth failed, invalid query, database error)
Workflow
1. Run --list to show available databases
2. Match user intent to database description
3. Run --tables or --schema to explore structure
4. Execute query with appropriate LIMIT
Limitations
- Read-only protections reduce accidental writes but cannot override database-server policy,
triggers, extensions, or an over-privileged account. Use a database role with read-only
permissions as the primary control.
- Query results can contain personal, confidential, or regulated data. Confirm the intended
database and avoid exporting or sharing results without explicit authorization.
- The script is not a replacement for backups, auditing, access reviews, or production change
controls.
Use bash only for shell examples and python3 scripts/query.py for the inert helper. Keep credential config outside version control, restrict file permissions before adding credentials, and never print values. --limit caps displayed rows without rewriting SQL; include a reviewed SQL LIMIT for server-side work where appropriate. Keyword/semicolon checks reject some valid SQL and cannot prevent SELECT function side effects, external calls or all temporary writes. Read-only privileges and a trusted, restricted function environment are essential. EXPLAIN ANALYZE actually executes its query. Python buffering and large individual values can still exhaust memory; use a dedicated bounded reporting query.
Related skills
- postgresql – Design a PostgreSQL-specific schema. Covers best-practices, data types, indexing…
- postgresql-cli – PostgreSQL interactive terminal (psql) reference and usage guide.
- postgresql-devsec – Administer PostgreSQL databases. Configure replication, backups, and performance tuning…
- postgresql-optimization – PostgreSQL database optimization workflow for query tuning, indexing strategies…
- posthog-automation – Automate PostHog tasks via Rube MCP (Composio): events, feature flags, projects, user…
- postman-collection-generator – Generate complete, import-ready Postman Collection v2.1 JSON files from natural language…
- postman-newman-automation – Generate Newman CLI commands, configuration files, Jenkins pipeline scripts, and shell…
- postman-openapi-converter – Convert OpenAPI 3.x or Swagger 2.0 specs (YAML or JSON) into complete, import-ready…