io.github.afurlane/copilot-datagate
Policy-driven, read-only MCP server for safe database access from AI tools.
Installation
Ajoutez ceci à la configuration MCP de votre client (Claude Desktop : claude_desktop_config.json ; Cursor : .cursor/mcp.json ; VS Code et les autres utilisent la même forme « mcpServers »).
@copilot-datagate/cliclaude mcp add copilot-datagate -e 'DATAGATE_PROJECT_ROOT=<DATAGATE_PROJECT_ROOT>' -- npx -y @copilot-datagate/cli@0.4.0
{
"mcpServers": {
"copilot-datagate": {
"command": "npx",
"args": [
"-y",
"@copilot-datagate/cli@0.4.0"
],
"env": {
"DATAGATE_PROJECT_ROOT": "<DATAGATE_PROJECT_ROOT>"
}
}
}
}
Variables d'environnement
DATAGATE_PROJECT_ROOTWorkspace root used to resolve .datagate/datagate.toml, datagate.toml, or user-level config.
Documentation
Tirée du README du projet sur GitHub, actualisée chaque semaine. Les liens ouvrent GitHub.
Sommaire
📘 DataGate — Secure AI-Ready Data Gateway
DataGate è un gateway headless, sicuro e policy-driven che espone basi dati a strumenti AI (come GitHub Copilot) in modo controllato, prevedibile e privo di SQL libero.
DataGate funge da intermediario tra un LLM e una base dati reale: non permette accesso diretto al database, non espone query arbitrarie, non consente operazioni di scrittura. È progettato per essere read-only, schema-aware, multi-database, e completamente LLM-safe.
🎯 Obiettivi principali
- Accesso sicuro ai dati — read-only garantito tramite ruoli DB, policy engine e query builder controllato.
- Astrazione del database — il modello non genera SQL: DataGate costruisce query sicure e validate.
- Multi-database — può collegarsi a diverse basi dati di diverse applicazioni, come un DBeaver headless.
- Policy engine — controllo granulare su tabelle, colonne, filtri, limiti e complessità delle operazioni.
- Schema awareness — carica automaticamente lo schema del database e applica regole di sicurezza.
- Concorrenza reale — architettura asincrona e sicura, ideale per richieste parallele da Copilot.
- Metriche e audit — tracciamento di richieste, tempi, errori e limiti per debugging e osservabilità.
- Profilazione performance — profilo latenza in-process (min/media/p50/p95/p99/max) per monitoraggio evolutivo delle performance.
- Backend astratto — trait read-only comune per backend database, con implementazioni concrete per PostgreSQL, MySQL/MariaDB e SQLite.
🧩 Funzionalità principali
- Query builder controllato — operazioni semantiche come
select,search,aggregate, con validazione automatica. - MCP
selecttipizzato — contratto JSON, esecuzione read-only con righe JSON, policy, audit ed errori sanitizzati; il transport MCP resta lo step successivo. - MCP
searchtipizzato — ricerca semantica conILIKEsu colonne consentite, query parametrizzate, policy/rate-limit/metriche/audit e output limit server-side. - MCP
aggregatetipizzato —count,sum,avg,minemaxsu colonne consentite, con filtri parametrizzati e senza supporto a SQL libero oGROUP BY. - API MCP versionata — descriptor stabile per versione API e tool disponibili.
- Transport MCP stdio — handshake, discovery e chiamate
select,searcheaggregatesopra il percorso policy-safe. - Filtri avanzati — supporto a pattern (
LIKE/ILIKE), range (BETWEEN) e full-text (to_tsvector+plainto_tsquery) sempre parametrizzati e validati da policy. - Catalogo schema controllato — introspezione policy-filtered di tabelle, viste, indici, vincoli (PK/FK/UNIQUE/CHECK/EXCLUSION), trigger, funzioni, procedure e sequenze; definizioni DDL solo quando sicure.
- Rate limiting — protezione contro loop del modello e query troppo pesanti.
- Limiti di output — risposte sempre contenute, sicure e strutturate.
- Errori deterministici — nessun leak di schema, nessun SQL esposto, nessun stack trace.
- Errori strutturati — envelope stabile con codice, messaggio generico e indicazione
retryable. - Configurazione esterna — file TOML per policy, limiti e profili nominati (dev/staging/prod).
- Hardening input MCP — validazione
request_id, limiti su payload testuali e cardinalità per ridurre superfici DoS/input abuse. - Policy dinamica — la policy attiva può essere sostituita atomicamente, anche ricaricandola da TOML, senza ricreare i tool MCP.
DataGate non espone una funzione MCP di query SQL libera: l'agente invia esclusivamente parametri strutturati, validati contro schema e policy prima della costruzione della query parametrizzata.
Gli errori pubblici usano i codici invalid_request, policy_denied,
backend_unavailable e internal_error. SQL, stack trace, password, valori dei filtri
e nomi di oggetti non autorizzati non attraversano il confine MCP.
Configurazione PostgreSQL
Le credenziali PostgreSQL non vengono salvate nei file di configurazione o nel codice. Il servizio legge la connessione dall'ambiente runtime:
- modalità compatta:
DB_URL - modalità a componenti:
DB_HOST,DB_PORT(default5432),DB_USER,DB_PASSWORD,DB_NAME - opzioni PostgreSQL:
DB_OPTIONS, nel formatokey=value&key=value - pool:
DB_MAX_CONNECTIONSeDB_ACQUIRE_TIMEOUT_SECS
Configurazione SQLite
Per usare SQLite in modalità read-only, configura una delle due varianti:
- URL completo:
SQLITE_URL - path file:
SQLITE_PATH
Opzioni pool SQLite:
SQLITE_MAX_CONNECTIONSSQLITE_ACQUIRE_TIMEOUT_SECS
Configurazione MySQL/MariaDB
Per usare MySQL o MariaDB in modalità read-only, configura una delle due varianti:
- URL completo:
MYSQL_URL - modalità a componenti:
MYSQL_HOST,MYSQL_PORT(default3306),MYSQL_USER,MYSQL_PASSWORD,MYSQL_DATABASE
Opzioni pool MySQL/MariaDB:
MYSQL_MAX_CONNECTIONSMYSQL_ACQUIRE_TIMEOUT_SECS
Selezione backend multi-database
Per scegliere esplicitamente quale backend attivare, imposta DATAGATE_BACKEND:
auto(default): precedenzapostgres->mysql->sqlitepostgresmysql(omariadb)sqlite
Quando DATAGATE_BACKEND è impostato a un backend specifico, DataGate richiede
la relativa configurazione ambiente; in caso contrario termina con errore esplicito.
Precedenza backend in bootstrap:
- PostgreSQL
- MySQL/MariaDB
- SQLite
Il primo backend configurato nella lista viene attivato.
Il rate limiting server-side opzionale usa RATE_LIMIT_REQUESTS e
RATE_LIMIT_WINDOW_SECS. Il limite è applicato per request_id prima di policy,
query builder e database; richieste oltre soglia ricevono rate_limited e non
generano SQL.
Il query builder applica anche un budget massimo configurabile nella policy tramite
max_query_complexity: ogni colonna costa 1 e ogni filtro costa 2. Le richieste oltre
budget vengono rifiutate prima di generare SQL.
La risposta select è soggetta anche a max_output_bytes nella policy: se il payload
JSON finale supera il limite, DataGate rifiuta la richiesta con errore di policy senza
esporre SQL o dettagli interni.
Il layer metriche registra anche contatori e latenza lato server per il tool select:
richieste totali/accettate/rifiutate, errori backend, p95 latenza in memoria e snapshot
del pool PostgreSQL (size, idle).
Il logging applicativo supporta due formati:
LOG_FORMAT=pretty(default)LOG_FORMAT=json(strutturato, adatto a log collector)
Il livello minimo dei log può essere configurato con LOG_LEVEL
(trace|debug|info|warn|error) oppure tramite RUST_LOG.
Se DB_URL è presente ha precedenza sui componenti. Il ruolo PostgreSQL deve avere
solo permessi di lettura; inoltre ogni connessione imposta
default_transaction_read_only = on.
Il profilo attivo si seleziona con profile = "dev" e può definire la policy in
[profiles.dev.policy]. Se non sono presenti profili nominati, resta supportata la
forma legacy [policy]. Un profilo dichiarato ma inesistente attiva una policy
deny-all, senza avviare operazioni sul database.
Le release pubblicate includono binari per Linux x64/ARM64, Windows x64/ARM64 e
macOS Intel/Apple Silicon, con archivi nominati per piattaforma e file
SHA256SUMS-* per la verifica degli artifact.
🛡️ Perché DataGate?
Gli LLM non devono parlare direttamente ai database. Serve un layer sicuro, prevedibile, controllato, auditabile, estensibile e multi-applicazione. DataGate è questo layer.
🔧 Tecnologie
- Linguaggio: Rust
- Database: PostgreSQL, MySQL/MariaDB e SQLite (oggi), altri DB domani
- Protocollo: MCP (Model Context Protocol)
- Architettura: asincrona, policy-driven, schema-aware
🚀 Stato del progetto
DataGate è in fase di progettazione. Il repository contiene la struttura iniziale, la documentazione e la roadmap tecnica.
🧪 Test integrazione multi-backend
I test di integrazione backend usano variabili ambiente opzionali:
DATAGATE_TEST_POSTGRES_URLDATAGATE_TEST_MYSQL_URL
Quando una variabile è presente, il relativo test verifica che il backend
read-only esegua SELECT controllate e rifiuti statement di scrittura.
Se la variabile non è presente, il test viene saltato senza errore.
Documentazione completa:
- Architecture.md — design principles e architettura a layer
- ROADMAP.md — roadmap dettagliata verso la 1.0
- docs/configuration.md — quick start, backend, policy e operazioni
- docs/benchmarks.md — benchmark locali SQLite e PostgreSQL reale
- docs/hardening.md — checklist hardening finale per il confine MCP/database
- docs/http-transport-decision.md — decisione sicurezza sul transport MCP HTTP remoto
- docs/editor-registry-evaluation.md — valutazione requisiti MCP Registry e client cross-editor
- docs/packaging.md — canali packaging e sorgente canonica degli artifact
- docs/postgres-mcp-comparison.md — confronto con altri server MCP PostgreSQL
- docs/registry-publication.md — strategia MCP Registry, installazione cross-editor e connessioni nominate
- docs/mcp-registry-metadata.json — metadata candidate per registry/gallerie MCP
- docs/release-candidate.md — criteri e gate della 1.0 candidate
- docs/mcp-tools.md — contratti interni e regole dei tool MCP
- CONTRIBUTING.md — regole di contribuzione, commit e branch
- SECURITY.md — policy di sicurezza e segnalazione vulnerabilità
Per l'avvio da VS Code con MCP:
- il transport locale di default è
stdio - i template
mcp.jsonper stdio locale sono in docs/mcp-tools.md e docs/configuration.md - HTTP remoto è fuori dal default 1.0 e richiede una decisione di sicurezza dedicata
📍 Roadmap (sintesi)
- [x] Definizione del policy engine
- [x] Implementazione del query builder controllato (select parametrizzato)
- [x] Connessione read-only garantita
- [x] Schema awareness automatica (catalogo interno PostgreSQL)
- [x] Audit log foundation (JSONL via
AUDIT_LOG_PATH) - [x] Tool MCP (
select,search,aggregate) - [x] Supporto multi-database (PostgreSQL, MySQL/MariaDB, SQLite)
- [x] Enterprise layer iniziale (osservabilità, hardening, policy dinamica)
- [x] Stabilità API MCP (descriptor versionato; transport stdio)
- [x] Transport MCP stdio
- [x] Benchmark
- [x] Hardening finale
- [ ] Versione 1.0 candidate
📄 Licenza
Questions fréquentes
Qu'est-ce que io.github.afurlane/copilot-datagate ?
Policy-driven, read-only MCP server for safe database access from AI tools.
Comment installer io.github.afurlane/copilot-datagate ?
Il s'exécute sur votre machine. Dans Claude Code : claude mcp add copilot-datagate -e 'DATAGATE_PROJECT_ROOT=<DATAGATE_PROJECT_ROOT>' -- npx -y @copilot-datagate/cli@0.4.0. Pour les autres clients, collez la configuration JSON de cette page dans leurs réglages MCP.
Faut-il une clé API pour io.github.afurlane/copilot-datagate ?
Son entrée au registre n'indique aucune clé ni secret obligatoire. Certaines fonctions peuvent tout de même demander un compte auprès du service auquel il se connecte.
io.github.afurlane/copilot-datagate est-il open source ?
Oui. Son code est sur GitHub sous licence Apache-2.0.
Qui maintient io.github.afurlane/copilot-datagate ?
Il est publié par afurlane. AI.tn le référence sans le maintenir ni le recommander.
Issu du registre MCP officiel. Être listé n'est pas une recommandation : vérifiez le code et les permissions d'un serveur avant de lui donner accès à vos données.