Database

Servidor MCP de banco de dados para MySQL, MariaDB, PostgreSQL e SQLite

Documentação

Database MCP

CI Release License: MIT Docs

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

demo

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) e explainQuery. 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

SubcomandoDescrição
stdioExecuta em modo stdio
httpExecuta em modo HTTP/SSE
versionExibe 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)

FlagVariável de AmbientePadrãoDescrição
--db-backendDB_BACKEND(obrigatório)mysql, mariadb, postgres ou sqlite
--db-hostDB_HOSTlocalhostHost do banco de dados
--db-portDB_PORTpadrão do backend3306 (MySQL/MariaDB), 5432 (PostgreSQL)
--db-userDB_USERpadrão do backendroot (MySQL/MariaDB), postgres (PostgreSQL)
--db-passwordDB_PASSWORD(vazio)Senha do banco de dados
--db-nameDB_NAME(vazio)Nome do banco de dados ou caminho do arquivo SQLite
--db-charsetDB_CHARSETConjunto de caracteres (somente MySQL/MariaDB)

Opções SSL/TLS

FlagVariável de AmbientePadrãoDescrição
--db-sslDB_SSLfalseHabilita SSL
--db-ssl-caDB_SSL_CACaminho do certificado CA
--db-ssl-certDB_SSL_CERTCaminho do certificado do cliente
--db-ssl-keyDB_SSL_KEYCaminho da chave do cliente
--db-ssl-verify-certDB_SSL_VERIFY_CERTtrueVerifica o certificado do servidor

Opções do Servidor

FlagVariável de AmbientePadrãoDescrição
--db-read-onlyDB_READ_ONLYtrueBloqueia consultas de escrita
--db-max-pool-sizeDB_MAX_POOL_SIZE5Tamanho máximo do pool de conexões (mín: 1)
--db-connection-timeoutDB_CONNECTION_TIMEOUT(não definido)Tempo limite de conexão em segundos (mín: 1)
--db-query-timeoutDB_QUERY_TIMEOUT30Tempo limite de execução de consulta em segundos
--db-page-sizeDB_PAGE_SIZE100Máximo de itens por resposta de ferramenta paginada (intervalo 1–500)

Opções de Log

FlagVariável de AmbientePadrãoDescrição
--log-levelLOG_LEVELinfoNível de log (trace/debug/info/warn/error)

Opções exclusivas de HTTP (disponíveis apenas com o subcomando http)

FlagPadrãoDescrição
--host127.0.0.1Host de vinculação
--port9001Porta de vinculação
--allowed-originsvariantes de localhostOrigens de navegador permitidas (separadas por vírgula). Controla tanto o preflight CORS quanto a rejeição de Origin no lado do servidor.
--allowed-hostslocalhost,127.0.0.1,::1Cabeç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 o schema, kind, owner, comment, columns[], constraints[], indexes[] e triggers[] 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õe schema, owner, description, definition. MySQL/MariaDB expõe schema, definer, security, checkOption, updatable, characterSetClient, collationConnection, definition. Consulte a referência de listViews para 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, como status/functionName do PostgreSQL ou campos de contexto de sessão do MySQL/MariaDB). Consulte a referência de listTriggers para 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, como volatility/strict/parallelSafety do PostgreSQL ou campos de contexto de sessão do MySQL/MariaDB). As chaves do PostgreSQL são name(arguments) (sobrecargas desambiguam); as chaves do MySQL/MariaDB são nomes simples (sem sobrecarga). Consulte a referência de listFunctions para 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, como owner do PostgreSQL ou deterministic/sqlDataAccess/campos de contexto de sessão do MySQL/MariaDB). Chaves do PostgreSQL são name(arguments) (sobrecargas desambiguam; procedimentos sem argumentos são chaveados como name()); chaves do MySQL/MariaDB são nomes simples (sem sobrecarga). Consulte a referência listProcedures para 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 carrega schema, owner, description (ou null quando não há COMMENT ON MATERIALIZED VIEW), definition (o corpo SELECT verbatim de pg_matviews.definition), populated (false para matviews criadas WITH NO DATA e nunca atualizadas) e indexed (true quando pelo menos um índice existe; REFRESH MATERIALIZED VIEW CONCURRENTLY adicionalmente 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 via definition, listTables(detailed=true) ou readQuery contra pg_indexes. Consulte a referência listMaterializedViews para 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; readQuery aplica 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 perigosasLOAD_FILE(), INTO OUTFILE, INTO DUMPFILE detectados 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 de replace (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_POLITICS e FACILITY que regex não consegue capturar, habilitada via alternância --pii-ner / PII_NER_ENABLE alé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ém config.json, tokenizer.json, model.onnx; recomendado: o dslim/bert-base-NER licenciado 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:

CrateCaminhoDescrição
dbmcp. (raiz)Binário principal — CLI, transportes, backends de banco de dados
dbmcp-sqlcrates/backend/Tipos de erro compartilhados, validação e utilitários de identificador
dbmcp-configcrates/config/Estruturas de configuração e mapeamento de argumentos de CLI
dbmcp-servercrates/server/Implementações de ferramentas MCP compartilhadas e informações do servidor
dbmcp-mysqlcrates/mysql/Handler e operações do backend MySQL/MariaDB
dbmcp-postgrescrates/postgres/Handler e operações do backend PostgreSQL
dbmcp-sqlitecrates/sqlite/Handler e operações do backend SQLite
sqlx-jsoncrates/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.