Database
Servidor MCP de banco de dados para MySQL, MariaDB, PostgreSQL e SQLite
Documentação
Database MCP
Um servidor MCP de binário único para bancos de dados SQL. Conecte seu assistente de IA ao MySQL/MariaDB, PostgreSQL ou SQLite sem dependências de runtime.
Website · Documentação · Releases

Recursos ✨
- Multi-banco — MySQL/MariaDB, PostgreSQL e SQLite a partir de um único binário
- Ferramentas MCP — descoberta de schema (
listDatabases,listTables,listViews,listTriggers,listFunctions,listProcedures,listMaterializedViews), acesso a dados (readQuery,writeQuery), DDL (createDatabase,dropDatabase,dropTable) eexplainQuery. O modo somente leitura oculta as ferramentas de escrita (writeQuery,createDatabase,dropDatabase,dropTable). Consulte Ferramentas MCP para disponibilidade por backend. - Binário único — ~7 MB, sem necessidade de Python/Node/Docker
- Múltiplos transportes — stdio (para Claude Desktop, Cursor) e HTTP (para remoto/multi-cliente)
- Configuração em duas camadas — flags de CLI > variáveis de ambiente, com padrões sensatos por backend
Instalação 📦
macOS, Linux, WSL:
curl -fsSL https://dbmcp.haymon.ai/install.sh | bash
Windows PowerShell:
irm https://dbmcp.haymon.ai/install.ps1 | iex
Windows CMD:
curl -fsSL https://dbmcp.haymon.ai/install.cmd -o install.cmd && install.cmd && del install.cmd
Consulte a documentação de instalação para Docker, Cargo e outros métodos.
Início Rápido 🚀
Usando .mcp.json (recomendado)
Adicione um arquivo .mcp.json à raiz do seu projeto. Os clientes MCP leem este arquivo e configuram o servidor automaticamente.
Transporte stdio — o cliente inicia e gerencia o processo do servidor:
{
"mcpServers": {
"dbmcp": {
"command": "dbmcp",
"args": ["stdio"],
"env": {
"DB_BACKEND": "mysql",
"DB_HOST": "127.0.0.1",
"DB_PORT": "3306",
"DB_USER": "root",
"DB_PASSWORD": "secret",
"DB_NAME": "mydb"
}
}
}
}
Transporte HTTP — você inicia o servidor manualmente e o cliente se conecta a ele:
# Start the server first
dbmcp http --db-backend mysql --db-user root --db-name mydb --port 9001
{
"mcpServers": {
"dbmcp": {
"type": "http",
"url": "http://127.0.0.1:9001/mcp"
}
}
}
Nota: O campo
"type": "http"é obrigatório para o transporte HTTP. Sem ele, clientes como Claude Code rejeitarão a configuração.
Usando flags de CLI
# MySQL/MariaDB
dbmcp stdio --db-backend mysql --db-host localhost --db-user root --db-name mydb
# PostgreSQL
dbmcp stdio --db-backend postgres --db-host localhost --db-user postgres --db-name mydb
# SQLite
dbmcp stdio --db-backend sqlite --db-name ./data.db
# HTTP transport
dbmcp http --db-backend mysql --db-user root --db-name mydb --host 0.0.0.0 --port 9001
Usando variáveis de ambiente
DB_BACKEND=mysql DB_USER=root DB_NAME=mydb dbmcp stdio
Configuração ⚙️
A configuração é carregada com precedência clara:
Flags de CLI > variáveis de ambiente > padrões
As variáveis de ambiente são normalmente definidas pelo seu cliente MCP (via env ou envFile na configuração do servidor).
Subcomandos
| Subcomando | Descrição |
|---|---|
stdio | Executa em modo stdio |
http | Executa em modo HTTP/SSE |
version | Exibe informações de versão e sai |
Um subcomando é obrigatório — executar dbmcp sem subcomando exibe a ajuda de uso e sai com status não zero.
Opções de Banco de Dados (compartilhadas entre subcomandos)
| Flag | Variável de Ambiente | Padrão | Descrição |
|---|---|---|---|
--db-backend | DB_BACKEND | (obrigatório) | mysql, mariadb, postgres ou sqlite |
--db-host | DB_HOST | localhost | Host do banco de dados |
--db-port | DB_PORT | padrão do backend | 3306 (MySQL/MariaDB), 5432 (PostgreSQL) |
--db-user | DB_USER | padrão do backend | root (MySQL/MariaDB), postgres (PostgreSQL) |
--db-password | DB_PASSWORD | (vazio) | Senha do banco de dados |
--db-name | DB_NAME | (vazio) | Nome do banco de dados ou caminho do arquivo SQLite |
--db-charset | DB_CHARSET | Conjunto de caracteres (somente MySQL/MariaDB) |
Opções SSL/TLS
| Flag | Variável de Ambiente | Padrão | Descrição |
|---|---|---|---|
--db-ssl | DB_SSL | false | Habilita SSL |
--db-ssl-ca | DB_SSL_CA | Caminho do certificado CA | |
--db-ssl-cert | DB_SSL_CERT | Caminho do certificado do cliente | |
--db-ssl-key | DB_SSL_KEY | Caminho da chave do cliente | |
--db-ssl-verify-cert | DB_SSL_VERIFY_CERT | true | Verifica o certificado do servidor |
Opções do Servidor
| Flag | Variável de Ambiente | Padrão | Descrição |
|---|---|---|---|
--db-read-only | DB_READ_ONLY | true | Bloqueia consultas de escrita |
--db-max-pool-size | DB_MAX_POOL_SIZE | 5 | Tamanho máximo do pool de conexões (mín: 1) |
--db-connection-timeout | DB_CONNECTION_TIMEOUT | (não definido) | Tempo limite de conexão em segundos (mín: 1) |
--db-query-timeout | DB_QUERY_TIMEOUT | 30 | Tempo limite de execução de consulta em segundos |
--db-page-size | DB_PAGE_SIZE | 100 | Máximo de itens por resposta de ferramenta paginada (intervalo 1–500) |
Opções de Log
| Flag | Variável de Ambiente | Padrão | Descrição |
|---|---|---|---|
--log-level | LOG_LEVEL | info | Nível de log (trace/debug/info/warn/error) |
Opções exclusivas de HTTP (disponíveis apenas com o subcomando http)
| Flag | Padrão | Descrição |
|---|---|---|
--host | 127.0.0.1 | Host de vinculação |
--port | 9001 | Porta de vinculação |
--allowed-origins | variantes de localhost | Origens de navegador permitidas (separadas por vírgula). Controla tanto o preflight CORS quanto a rejeição de Origin no lado do servidor. |
--allowed-hosts | localhost,127.0.0.1,::1 | Cabeçalhos Host confiáveis (separados por vírgula). Aplicados no lado do servidor; :authority HTTP/2 é respeitado. |
Ferramentas MCP 🧩
listDatabases
Lista bancos de dados acessíveis, paginados via cursor / nextCursor. Consulte Paginação por Cursor para detalhes de iteração. Não disponível para SQLite.
listTables
Lista tabelas em um banco de dados, paginadas via cursor / nextCursor. Consulte Paginação por Cursor para detalhes de iteração.
Parâmetros: database (padrão: banco de dados ativo; SQLite não tem parâmetro database), cursor, search, detailed.
search é um padrão opcional LIKE/ILIKE que não diferencia maiúsculas de minúsculas, com % (qualquer sequência) e _ (caractere único) como curingas — passe users% para corresponder a nomes que começam com users, ou %order% para correspondência de substring. Uma palavra simples sem curingas corresponde apenas a um nome de tabela exato.
detailed (padrão false) alterna o formato da resposta:
- Resumido (padrão) —
tablesé um array JSON ordenado de strings com nomes de tabela simples. - Detalhado (
detailed: true) —tablesé um objeto JSON indexado por nome de tabela; cada valor carrega oschema,kind,owner,comment,columns[],constraints[],indexes[]etriggers[]da tabela. Uma única chamada retorna tanto a lista de tabelas quanto os metadados por tabela.
listViews
Lista views em um banco de dados, paginadas via cursor / nextCursor. Disponível em MySQL/MariaDB, PostgreSQL (schema public) e SQLite. Parâmetros: database (padrão: banco de dados ativo; SQLite não tem parâmetro database), cursor, search, detailed. SQLite retorna apenas o formato resumido — search e detailed não são aceitos lá.
search é um padrão opcional LIKE/ILIKE que não diferencia maiúsculas de minúsculas, com % (qualquer sequência) e _ (caractere único) como curingas. O valor search deve permanecer idêntico entre chamadas paginadas para continuidade do cursor.
detailed (padrão false) alterna o formato da resposta:
- Resumido (padrão) —
viewsé um array JSON ordenado de strings com nomes de view simples. Os nomes de view são únicos por schema, portanto não aparecem duplicatas. - Detalhado (
detailed: true) —viewsé um objeto JSON indexado por nome de view simples; cada valor carrega o payload de metadados específico do backend. PostgreSQL expõeschema,owner,description,definition. MySQL/MariaDB expõeschema,definer,security,checkOption,updatable,characterSetClient,collationConnection,definition. Consulte a referência delistViewspara colunas de origem, conjuntos de valores enumerados e omissões intencionais por backend.
Consulte Paginação por Cursor para detalhes de iteração.
listTriggers
Lista triggers definidos pelo usuário em tabelas, paginados via cursor / nextCursor. Triggers internos de restrição e chave estrangeira são excluídos. Disponível em MySQL/MariaDB, PostgreSQL (schema public) e SQLite. Parâmetros: database (padrão: banco de dados ativo; SQLite não tem parâmetro database), cursor, search, detailed.
search é um padrão opcional LIKE/ILIKE que não diferencia maiúsculas de minúsculas, com % (qualquer sequência) e _ (caractere único) como curingas. O valor search deve permanecer idêntico entre chamadas paginadas para continuidade do cursor.
detailed (padrão false) alterna o formato da resposta:
- Resumido (padrão) —
triggersé um array JSON ordenado de strings com nomes de trigger simples. - Detalhado (
detailed: true) —triggersé um objeto JSON indexado por nome de trigger; cada valor carrega o payload de metadados específico do backend (timing, eventos, definição e extras específicos do backend, comostatus/functionNamedo PostgreSQL ou campos de contexto de sessão do MySQL/MariaDB). Consulte a referência delistTriggerspara a lista completa de campos por backend.
Consulte Paginação por Cursor para detalhes de iteração.
listFunctions
Lista funções SQL definidas pelo usuário, paginadas via cursor / nextCursor. PostgreSQL exclui agregados, funções de janela e procedures; MySQL/MariaDB exclui UDFs carregáveis (mysql.func). Disponível em MySQL/MariaDB e PostgreSQL (schema public). Não disponível para SQLite. Parâmetros: database (padrão: banco de dados ativo), cursor, search, detailed.
search é um padrão opcional LIKE/ILIKE que não diferencia maiúsculas de minúsculas, com % (qualquer sequência) e _ (caractere único) como curingas. O valor search deve permanecer idêntico entre chamadas paginadas para continuidade do cursor.
detailed (padrão false) alterna o formato da resposta:
- Resumido (padrão) —
functionsé um array JSON ordenado de strings com nomes de função simples. Sobrecargas do PostgreSQL aparecem uma vez por sobrecarga (strings de nome duplicadas são esperadas). - Detalhado (
detailed: true) —functionsé um objeto JSON indexado por assinatura de função; cada valor carrega o payload de metadados específico do backend (linguagem, argumentos, tipo de retorno, definição e extras específicos do backend, comovolatility/strict/parallelSafetydo PostgreSQL ou campos de contexto de sessão do MySQL/MariaDB). As chaves do PostgreSQL sãoname(arguments)(sobrecargas desambiguam); as chaves do MySQL/MariaDB são nomes simples (sem sobrecarga). Consulte a referência delistFunctionspara a lista completa de campos por backend.
Consulte Paginação por Cursor para detalhes de iteração.
listProcedures
Lista procedures armazenadas definidas pelo usuário, paginadas via cursor / nextCursor. Disponível em MySQL/MariaDB e PostgreSQL (schema public, PostgreSQL 11+). Não disponível para SQLite. Parâmetros: database (padrão: banco de dados ativo), cursor, search, detailed.
search é um padrão opcional LIKE/ILIKE que não diferencia maiúsculas de minúsculas, com % (qualquer sequência) e _ (caractere único) como curingas. O valor search deve permanecer idêntico entre chamadas paginadas para continuidade do cursor.
detailed (padrão false) alterna o formato da resposta:
- Resumido (padrão) —
proceduresé um array JSON ordenado de strings com nomes de procedimentos. Sobrecargas do PostgreSQL aparecem uma vez por sobrecarga (strings de nomes duplicados são esperadas). - Detalhado (
detailed: true) —proceduresé um objeto JSON chaveado por assinatura de procedimento; cada valor carrega o payload de metadados por backend (linguagem, argumentos, segurança, definição e extras específicos do backend, comoownerdo PostgreSQL oudeterministic/sqlDataAccess/campos de contexto de sessão do MySQL/MariaDB). Chaves do PostgreSQL sãoname(arguments)(sobrecargas desambiguam; procedimentos sem argumentos são chaveados comoname()); chaves do MySQL/MariaDB são nomes simples (sem sobrecarga). Consulte a referêncialistProcedurespara a lista completa de campos por backend.
Consulte Cursor Pagination para detalhes de iteração.
listMaterializedViews
Lista views materializadas no schema public, paginadas via cursor / nextCursor. Apenas PostgreSQL — não disponível para MySQL/MariaDB ou SQLite. Parâmetros: database (padrão: o banco de dados ativo), cursor, search, detailed.
search é um padrão ILIKE opcional, sem diferenciar maiúsculas de minúsculas, com % (qualquer sequência) e _ (caractere único) como curingas. Meta-caracteres SQL (', ;, --) são vinculados como valores de parâmetro e nunca interpolados. O valor de search deve permanecer idêntico entre chamadas paginadas para continuidade do cursor.
detailed (padrão false) alterna o formato da resposta:
- Resumido (padrão) —
materializedViewsé um array JSON ordenado de strings com nomes de matviews. Nomes de matviews são únicos por schema, portanto não há duplicatas. - Detalhado (
detailed: true) —materializedViewsé um objeto JSON chaveado por nome simples de matview; cada valor carregaschema,owner,description(ounullquando não háCOMMENT ON MATERIALIZED VIEW),definition(o corpo SELECT verbatim depg_matviews.definition),populated(falsepara matviews criadasWITH NO DATAe nunca atualizadas) eindexed(truequando pelo menos um índice existe;REFRESH MATERIALIZED VIEW CONCURRENTLYadicionalmente requer um índice único). O modo detalhado omite deliberadamente metadados de colunas,tablespace, parâmetros de armazenamento e detecção de índice único — recuperáveis viadefinition,listTables(detailed=true)oureadQuerycontrapg_indexes. Consulte a referêncialistMaterializedViewspara colunas de origem e semântica operacional.
Consulte Cursor Pagination para detalhes de iteração.
readQuery
Executa uma consulta SQL somente leitura (SELECT, SHOW, DESCRIBE, USE, EXPLAIN). Sempre aplica validação SQL como defesa em profundidade. Parâmetros: query, database, cursor. Resultados de SELECT são paginados via cursor / nextCursor; SHOW, DESCRIBE, USE e EXPLAIN retornam uma única página e ignoram cursor. Consulte Cursor Pagination para detalhes de iteração.
writeQuery
Executa uma consulta SQL de escrita (INSERT, UPDATE, DELETE, CREATE, ALTER, DROP). Disponível apenas quando o modo somente leitura está desabilitado. Parâmetros: query, database.
createDatabase
Cria um banco de dados se ele não existir. Disponível apenas quando o modo somente leitura está desabilitado. Não disponível para SQLite. Parâmetros: database.
dropDatabase
Remove um banco de dados existente. Recusa-se a remover o banco de dados atualmente conectado. Disponível apenas quando o modo somente leitura está desabilitado. Não disponível para SQLite. Parâmetros: database.
dropTable
Remove uma tabela de um banco de dados. Se a tabela tiver dependentes de chave estrangeira, o erro do banco de dados é exibido ao usuário. No PostgreSQL, um parâmetro cascade está disponível para forçar a remoção com CASCADE. Disponível apenas quando o modo somente leitura está desabilitado. Parâmetros: database, table, cascade (apenas PostgreSQL).
explainQuery
Retorna o plano de execução para uma consulta SQL. Suporta um parâmetro opcional analyze para estatísticas reais de execução (PostgreSQL e MySQL/MariaDB). No modo somente leitura, EXPLAIN ANALYZE é permitido apenas para instruções somente leitura, pois ele realmente executa a consulta. SQLite usa EXPLAIN QUERY PLAN (sem suporte a ANALYZE). Sempre disponível, independentemente do modo somente leitura. Parâmetros: query, database, analyze (apenas PostgreSQL/MySQL).
Segurança 🔒
- Modo somente leitura (padrão) — ferramentas de escrita ocultas do assistente de IA;
readQueryaplica validação SQL baseada em AST - Execução de instrução única — injeção de múltiplas instruções bloqueada no nível de análise sintática
- Bloqueio de funções perigosas —
LOAD_FILE(),INTO OUTFILE,INTO DUMPFILEdetectados no AST - Validação de identificadores — nomes de banco de dados/tabelas validados contra caracteres de controle e strings vazias
- Listas de permissão de Origem + Host — rejeição no servidor (403) além de preflight CORS; configurável para transporte HTTP
- SSL/TLS — configurado via variáveis individuais
DB_SSL_* - Redação de PII (opt-in, desativado por padrão) — quando habilitado, a saída da ferramenta de consulta passa por um redator baseado em regex que reescreve trechos de PII detectados em 46 tipos de entidades integrados abrangendo sete categorias: pessoal (e-mail), financeiro (cartões, IBAN, contas bancárias do Reino Unido, códigos de classificação e roteamento ABA dos EUA, CVV), IDs governamentais (SSN, ITIN, EIN, passaportes do Reino Unido/EUA, NHS, NINO, SIN, VAT), contato (telefone), rede (IP, URL, MAC), identidade digital (chaves de API, JWTs, chaves privadas PEM, hashes de senha) e carteiras de criptomoedas. Alternância:
--pii/PII_ENABLE. Operador:--pii-operator/PII_OPERATOR— um dereplace(padrão, placeholders cientes de entidade como<EMAIL_ADDRESS>),mask(*que preserva o comprimento),redact(descartar),hash(SHA-256 hex). Subconjunto opcional via--pii-categories/PII_CATEGORIES(separados por vírgula, ex.:financial,government); não definido habilita todos os integrados. Escopo: apenas payloads de saída da ferramenta de consulta. Consulte configuração de PII para a superfície completa. - Redação ML/NER (opt-in em tempo de execução, desativado por padrão) — adiciona detecção de
PERSON,LOCATION,ORGANIZATION,NATIONALITY_RELIGION_POLITICSeFACILITYque regex não consegue capturar, habilitada via alternância--pii-ner/PII_NER_ENABLEalém de um diretório de modelo fornecido pelo usuário. Quais entidades são produzidas depende dos rótulos do modelo (modelos CoNLL fornecem pessoa/localização/organização; modelos classe OntoNotes adicionam NRP e instalação). Inferência usa ONNX Runtime (o diretório do modelo contémconfig.json,tokenizer.json,model.onnx; recomendado: odslim/bert-base-NERlicenciado sob MIT exportado para ONNX, quantizado em int8 para velocidade). Falha fechada: um modelo que não pode carregar aborta a inicialização e um erro de inferência falha a solicitação — nunca um fallback silencioso. Respeita--pii-categories. Inglês para v1. - Redação de credenciais — a senha do banco de dados nunca é exibida em logs ou saída de depuração
Testes 🧪
# Unit tests
cargo test --workspace --lib --bins
# Integration tests (requires Docker)
./tests/run.sh
# Filter by engine
./tests/run.sh --filter mariadb
./tests/run.sh --filter mysql
./tests/run.sh --filter postgres
./tests/run.sh --filter sqlite
# With MCP Inspector
npx @modelcontextprotocol/inspector ./target/release/dbmcp stdio
# HTTP mode testing
curl -X POST http://localhost:9001/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"0.1"}}}'
Estrutura do Projeto 🗂️
Este é um workspace Cargo com os seguintes crates:
| Crate | Caminho | Descrição |
|---|---|---|
dbmcp | . (raiz) | Binário principal — CLI, transportes, backends de banco de dados |
dbmcp-sql | crates/backend/ | Tipos de erro compartilhados, validação e utilitários de identificador |
dbmcp-config | crates/config/ | Estruturas de configuração e mapeamento de argumentos de CLI |
dbmcp-server | crates/server/ | Implementações de ferramentas MCP compartilhadas e informações do servidor |
dbmcp-mysql | crates/mysql/ | Handler e operações do backend MySQL/MariaDB |
dbmcp-postgres | crates/postgres/ | Handler e operações do backend PostgreSQL |
dbmcp-sqlite | crates/sqlite/ | Handler e operações do backend SQLite |
sqlx-json | crates/sqlx-json/ | Conversão row-para-JSON type-safe para sqlx (trait RowExt) |
Desenvolvimento 🧰
cargo build # Development build
cargo build --release # Release build (~7 MB)
cargo test # Run tests
cargo clippy --workspace --tests -- -D warnings # Lint
cargo fmt # Format
cargo doc --no-deps # Build documentation
Licença 📄
Este projeto é licenciado sob a Licença MIT — consulte o arquivo LICENSE para detalhes.