Connetti PostgreSQL a Claude Code via MCP, configura un account in sola lettura con controllo dei permessi e lascia che Claude legga schemi, scriva query e analizzi dati direttamente.
Una volta connesso un database, Claude Code funziona in modo diverso. Non è necessario incollare la struttura delle tabelle nel prompt o spiegare i nomi dei campi — Claude si connette direttamente, legge lo schema da solo, scrive le query e analizza i risultati.
Questo articolo usa PostgreSQL come esempio e percorre l'intero processo dalla configurazione all'uso reale.
L'ufficiale @modelcontextprotocol/server-postgres supporta:
Solo lettura. Questo Server è progettato unicamente per le query — non esegue INSERT, UPDATE o DELETE.
npm install -g @modelcontextprotocol/server-postgres
Modifica .claude/settings.json (livello progetto):
{
"mcpServers": {
"db": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-postgres",
"postgresql://readonly_user:password@localhost:5432/myapp_production"
]
}
}
}
Formato della stringa di connessione: postgresql://USER:PASSWORD@HOST:PORT/DATABASE
Per non mettere la password nel file di configurazione, usa una variabile d'ambiente:
{
"mcpServers": {
"db": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-postgres"],
"env": {
"DATABASE_URL": "postgresql://readonly_user:password@localhost:5432/myapp_production"
}
}
}
}
Se .claude/settings.json viene committato su git, assicurati che non contenga password in chiaro. Metti la configurazione sensibile in .claude/settings.local.json e aggiungilo al .gitignore.
Non dare a Claude un account con permessi di scrittura. Crea un utente in sola lettura in PostgreSQL:
CREATE USER claude_readonly WITH PASSWORD 'your_password';
GRANT CONNECT ON DATABASE myapp_production TO claude_readonly;
GRANT USAGE ON SCHEMA public TO claude_readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO claude_readonly;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO claude_readonly;
Per le tabelle che non vuoi che Claude veda (sessions, audit_logs…), non concedere i permessi o spostale in uno schema separato.
Riavvia Claude Code e chiedi:
Elenca tutte le tabelle del database
Se Claude restituisce un elenco di tabelle invece di "non ho accesso al database", la connessione MCP funziona.
Scenario 1: Capire la struttura dei dati
Qual è la relazione tra le tabelle users e orders?
Ci sono vincoli di chiave esterna?
Scenario 2: Analisi dei dati
Degli utenti registrati negli ultimi 30 giorni,
quale percentuale ha effettuato almeno un ordine?
Suddiviso per canale di registrazione.
Scenario 3: Debug
Trova gli ordini con status = 'pending' creati più di 7 giorni fa.
Quanti sono e quando è stato creato l'ultimo?
Scenario 4: Supporto allo sviluppo
Voglio aggiungere una colonna last_login_at alla tabella users.
Scrivi il SQL di migrazione e verifica se gli indici esistenti sono sufficienti.
Controllo per tabella
GRANT SELECT ON TABLE users, orders, products TO claude_readonly;
Filtrare colonne sensibili con una view
CREATE VIEW users_safe AS
SELECT id, email, created_at, plan, status FROM users;
GRANT SELECT ON users_safe TO claude_readonly;
Usa un tunnel SSH:
ssh -L 5433:localhost:5432 [email protected] -N
Poi usa la porta locale nella configurazione.
Il cambiamento più evidente: le conversazioni sui dati non richiedono più preparazione. Niente schema da spiegare, niente tipi di campo da descrivere — dici cosa ti serve e Claude cerca. Particolarmente utile nel debug: invece di fare la query, copiare e incollare, descrivi il problema e Claude interroga direttamente.