mcp-database-server

Servidor MCP (Model Context Protocol) de nível de produção para acesso unificado a bancos de dados SQL. Conecte múltiplos bancos de dados através de um único servidor MCP, com descoberta de esquemas, mapeamento de relacionamentos, cache e controles de segurança.

Documentação

@adevguide/mcp-database-server

npm version npm downloads

Servidor Model Context Protocol (MCP) de nível de produção para acesso unificado a bancos de dados SQL. Conecte vários bancos de dados por meio de um único servidor MCP, com descoberta de schema, mapeamento de relacionamentos, cache e controles de segurança.

Conteúdo

Recursos

  • Suporte a múltiplos bancos de dados: PostgreSQL, MySQL/MariaDB, SQLite, SQL Server, Oracle
  • Descoberta automática de schema: tabelas, colunas, índices, chaves estrangeiras, relacionamentos
  • Cache persistente de schema: TTL + versionamento, atualização manual, estatísticas de cache
  • Inferência de relacionamentos: chaves estrangeiras + heurísticas
  • Inteligência de consultas: rastreamento, estatísticas, timeouts
  • Assistência para joins: caminhos de join sugeridos com base em grafos de relacionamento
  • Controles de segurança: modo somente leitura, permitir/negar operações de escrita, redação de segredos
  • Otimização de consultas: recomendações de índices, perfil de desempenho, detecção de consultas lentas
  • Monitoramento de desempenho: análises detalhadas de execução, identificação de gargalos
  • Reescrita de consultas: sugestões automatizadas de otimização com estimativas de impacto no desempenho

Por que isso existe

Este projeto foi originalmente criado com vibe coding para resolver problemas reais que eu enfrentava ao conectar ferramentas de LLM a vários bancos de dados SQL (conectividade consistente, descoberta de schema e execução segura de consultas). Desde então, foi aprimorado para se tornar um servidor MCP reutilizável, com cache e configurações de segurança padrão.

Arquitetura

┌─────────────────────────────────────────────────────────┐
│                    MCP Client                            │
│            (Claude Desktop, IDEs, etc.)                  │
└────────────────┬────────────────────────────────────────┘
                 │ JSON-RPC over stdio
┌────────────────▼────────────────────────────────────────┐
│                MCP Database Server                       │
│  ┌──────────────────────────────────────────────────┐   │
│  │           Schema Cache (TTL + Versioning)        │   │
│  └──────────────────────────────────────────────────┘   │
│  ┌──────────────────────────────────────────────────┐   │
│  │  Query Tracker (History + Statistics)            │   │
│  └──────────────────────────────────────────────────┘   │
│  ┌──────────────────────────────────────────────────┐   │
│  │  Security Layer (Read-only, Operation Controls)  │   │
│  └──────────────────────────────────────────────────┘   │
└────┬─────────┬─────────┬──────────┬──────────┬─────────┘
     │         │         │          │          │
┌────▼───┐ ┌──▼────┐ ┌──▼─────┐ ┌──▼──────┐ ┌▼────────┐
│Postgres│ │ MySQL │ │ SQLite │ │ MSSQL   │ │ Oracle  │
└────────┘ └───────┘ └────────┘ └─────────┘ └─────────┘

Bancos de Dados Suportados

Banco de DadosDriverStatusObservações
PostgreSQLpg✅ Suporte CompletoInclui compatibilidade com CockroachDB
MySQL/MariaDBmysql2✅ Suporte CompletoInclui compatibilidade com Amazon Aurora MySQL
SQLitesql.js✅ Suporte CompletoSQLite com suporte WASM e persistência em arquivo
SQL Servertedious✅ Suporte CompletoMicrosoft SQL Server / Azure SQL
Oracleoracledb⚠️ StubRequer Oracle Instant Client

Instalação

Instalação global (recomendado)

npm install -g @adevguide/mcp-database-server

Execute:

mcp-database-server --config /absolute/path/to/.mcp-database-server.config

Executar via npx (sem instalação global)

npx -y @adevguide/mcp-database-server --config /absolute/path/to/.mcp-database-server.config

Instalar a partir do código-fonte

git clone https://github.com/iPraBhu/mcp-database-server.git
cd mcp-database-server
npm install
npm run build
node dist/index.js --config ./.mcp-database-server.config

Configuração

Crie um arquivo .mcp-database-server.config na raiz do seu projeto:

Observação: O arquivo de configuração é descoberto automaticamente dentro da árvore do projeto atual. Se você não especificar --config, a ferramenta busca para cima a partir do diretório atual até alcançar a raiz do projeto detectada (por exemplo, um diretório contendo package.json ou .git). Ela não continua além da raiz do projeto. Se você usar credentialCommand, passe --config explicitamente.

{
  "databases": [
    {
      "id": "postgres-main",
      "type": "postgres",
      "secretRef": "DB_URL_POSTGRES",
      "readOnly": true,
      "pool": {
        "min": 2,
        "max": 10,
        "idleTimeoutMillis": 30000
      },
      "introspection": {
        "includeViews": true,
        "excludeSchemas": ["pg_catalog"]
      }
    },
    {
      "id": "mariadb-reporting",
      "type": "mysql",
      "secretRef": "DB_URL_MARIADB",
      "readOnly": true,
      "pool": {
        "min": 1,
        "max": 5
      }
    },
    {
      "id": "sqlite-local",
      "type": "sqlite",
      "path": "./data/app.db"
    }
  ],
  "cache": {
    "directory": ".sql-mcp-cache",
    "ttlMinutes": 10
  },
  "security": {
    "allowWrite": false,
    "allowedWriteOperations": ["INSERT", "UPDATE"],
    "disableDangerousOperations": true,
    "redactSecrets": true
  },
  "logging": {
    "level": "info",
    "pretty": false
  }
}

Referência de Configuração

Configuração do Banco de Dados

Cada banco de dados no array databases representa uma conexão com um banco de dados SQL.

Propriedades Principais
PropriedadeTipoObrigatórioPadrãoDescrição
idstring✅ Sim-Identificador exclusivo para esta conexão de banco de dados. Usado em todas as chamadas de ferramentas MCP. Deve ser exclusivo em todos os bancos de dados.
typeenum✅ Sim-Tipo de sistema de banco de dados. Valores válidos: postgres, mysql, sqlite, mssql, oracle
urlstringCondicional*-String de conexão explícita do banco de dados. Suporta interpolação de variáveis de ambiente com ${DB_URL}, mas não é o caminho recomendado para lidar com segredos.
secretRefstringCondicional*-Nome de uma variável de ambiente que contém a string de conexão completa. Resolvida a partir do ambiente do processo ou de um arquivo .env ao lado do arquivo de configuração.
credentialCommandstringCondicional*-Comando shell que imprime a string de conexão completa no stdout durante a inicialização. Útil para 1Password, Vault, ferramentas AWS ou outras ferramentas de segredos personalizadas. Requer iniciar o servidor com um caminho explícito de --config.
pathstringCondicional**-Caminho no sistema de arquivos para o arquivo do banco de dados SQLite. Necessário apenas para type: sqlite. Pode ser relativo ou absoluto.
readOnlybooleanNãotrueQuando true, bloqueia todas as operações de escrita (INSERT, UPDATE, DELETE, etc.). Recomendado para segurança em produção.
eagerConnectbooleanNãofalseQuando true, conecta-se ao banco de dados imediatamente na inicialização (fail-fast). Quando false, conecta-se na primeira consulta (carregamento preguiçoso).

* Obrigatório para postgres, mysql, mssql, oracle
** Obrigatório apenas para sqlite

Formatos de String de Conexão:

PostgreSQL:  postgresql://username:password@host:5432/database
MySQL:       mysql://username:password@host:3306/database  
SQL Server:  Server=host,1433;Database=dbname;User Id=user;Password=pass
SQLite:      (use path property instead)
Oracle:      username/password@host:1521/servicename
Configuração do Pool de Conexões

O objeto pool controla o comportamento do pool de conexões. Melhora o desempenho reutilizando conexões de banco de dados.

PropriedadeTipoObrigatórioPadrãoDescrição
minnumberNão2Número mínimo de conexões a manter no pool. Mantidas ativas mesmo quando ociosas.
maxnumberNão10Número máximo de conexões simultâneas. Não exceda o limite de conexões do seu banco de dados.
idleTimeoutMillisnumberNão30000Tempo (ms) para manter conexões ociosas antes de fechá-las. Exemplo: 60000 = 1 minuto.
connectionTimeoutMillisnumberNão10000Tempo (ms) de espera ao estabelecer uma conexão antes do timeout. Fail-fast se o banco de dados estiver inacessível.

Recomendações:

  • Desenvolvimento: min: 1, max: 5
  • Produção (Baixo Tráfego): min: 2, max: 10
  • Produção (Alto Tráfego): min: 5, max: 20
Configuração de Introspecção

O objeto introspection controla o comportamento de descoberta de schema. Determina quais objetos do banco de dados são analisados.

PropriedadeTipoObrigatórioPadrãoDescrição
includeViewsbooleanNãotrueIncluir visualizações (views) do banco de dados na descoberta de schema. Defina como false se as visualizações causarem problemas de desempenho.
includeRoutinesbooleanNãofalseIncluir procedimentos armazenados e funções. (Não totalmente implementado – recurso planejado)
maxTablesnumberNãoilimitadoLimitar a introspecção às primeiras N tabelas. Útil para bancos de dados com 1000+ tabelas. Pode resultar em descoberta incompleta de relacionamentos.
includeSchemasstring[]NãotodosLista de permissões de schemas para introspectar. Aplicável apenas ao PostgreSQL e SQL Server. Exemplo: ["public", "app"]
excludeSchemasstring[]NãonenhumLista de bloqueio de schemas a ignorar. Valores comuns: ["pg_catalog", "information_schema", "sys"]

Schema vs Banco de Dados:

  • PostgreSQL/SQL Server: Suportam múltiplos schemas por banco de dados. Use includeSchemas/excludeSchemas.
  • MySQL/MariaDB: Schema = banco de dados. Use o nome do banco de dados na string de conexão.
  • SQLite: Banco de dados de arquivo único, sem conceito de schema.

Configuração de Cache

Controla o cache de metadados de schema para melhorar o desempenho de inicialização e reduzir a carga no banco de dados.

PropriedadeTipoObrigatórioPadrãoDescrição
directorystringNão.sql-mcp-cacheCaminho do diretório onde os arquivos de schema em cache são armazenados. Um arquivo JSON por banco de dados.
ttlMinutesnumberNão10Tempo de vida (Time-To-Live) em minutos. Por quanto tempo o schema em cache é considerado válido antes da atualização automática.

Comportamento do Cache:

  • Na inicialização: Carrega o schema do cache se disponível e não expirado
  • Após expiração do TTL: A próxima consulta aciona a re-introspecção automática
  • Atualização manual: Use a ferramenta clear_cache ou introspect_schema com forceRefresh: true
  • Arquivos de cache: Armazenados como {database-id}.json (por exemplo, postgres-main.json)

Valores de TTL Recomendados:

  • Desenvolvimento: 5 minutos (schema muda com frequência)
  • Staging: 30-60 minutos
  • Produção (Estático): 1440 minutos (24 horas)
  • Produção (Ativo): 60-240 minutos (1-4 horas)

Configuração de Segurança

Controles de segurança abrangentes para proteger seus bancos de dados contra operações não autorizadas ou perigosas.

PropriedadeTipoObrigatórioPadrãoDescrição
allowWritebooleanNãofalseInterruptor principal para operações de escrita. Quando false, todas as escritas são bloqueadas em todos os bancos de dados.
allowedWriteOperationsstring[]NãotodosLista de permissões de operações SQL permitidas quando allowWrite: true. Valores válidos: INSERT, UPDATE, DELETE, CREATE, ALTER, DROP, TRUNCATE, REPLACE, MERGE
disableDangerousOperationsbooleanNãotrueCamada extra de segurança. Quando true, bloqueia operações DELETE, TRUNCATE e DROP mesmo que escritas sejam permitidas. Previne perda acidental de dados.
redactSecretsbooleanNãotrueRedigir strings de conexão, senhas e credenciais semelhantes em logs e em mensagens de erro retornadas.

Camadas de Segurança (Avaliadas em Ordem):

  1. readOnly no nível do banco de dados → Bloqueia todas as escritas para um banco específico
  2. allowWrite global → Interruptor principal para todos os bancos de dados
  3. disableDangerousOperations → Bloqueia especificamente DELETE/TRUNCATE/DROP
  4. allowedWriteOperations → Lista de permissões de operações permitidas

Exemplos de Configuração:

// Read-only access (default - safest)
{
  "allowWrite": false
}

// Allow INSERT and UPDATE only (no deletes)
{
  "allowWrite": true,
  "allowedWriteOperations": ["INSERT", "UPDATE"],
  "disableDangerousOperations": true
}

// Full write access (development only - dangerous!)
{
  "allowWrite": true,
  "disableDangerousOperations": false
}

Configuração de Logging

Controla o nível de detalhe e a formatação da saída de logs.

PropriedadeTipoObrigatórioPadrãoDescrição
levelenumNãoinfoNível de log. Valores válidos: trace, debug, info, warn, error. Níveis mais baixos incluem os níveis mais altos.
prettybooleanNãofalseQuando true, formata logs como texto legível para humanos. Quando false, gera JSON estruturado (melhor para agregação de logs em produção).

Níveis de Log:

  • trace: Tudo (extremamente detalhado – use apenas para depuração)
  • debug: Informações detalhadas de diagnóstico
  • info: Mensagens informativas gerais (recomendado para produção)
  • warn: Mensagens de aviso que não impedem a operação
  • error: Apenas mensagens de erro

Recomendações:

  • Desenvolvimento: level: "debug", pretty: true
  • Produção: level: "info", pretty: false
  • Solução de problemas: level: "trace", pretty: true

Exemplo Completo de Configuração

{
  "databases": [
    {
      "id": "postgres-production",
      "type": "postgres",
      "url": "${DATABASE_URL}",
      "readOnly": true,
      "pool": {
        "min": 5,
        "max": 20,
        "idleTimeoutMillis": 60000,
        "connectionTimeoutMillis": 5000
      },
      "introspection": {
        "includeViews": true,
        "includeRoutines": false,
        "excludeSchemas": ["pg_catalog", "information_schema"]
      },
      "eagerConnect": true
    },
    {
      "id": "mysql-analytics",
      "type": "mysql",
      "url": "${MYSQL_URL}",
      "readOnly": true,
      "pool": {
        "min": 2,
        "max": 10
      },
      "introspection": {
        "includeViews": true,
        "maxTables": 100
      }
    },
    {
      "id": "sqlite-local",
      "type": "sqlite",
      "path": "./data/app.db",
      "readOnly": true
    }
  ],
  "cache": {
    "directory": ".sql-mcp-cache",
    "ttlMinutes": 60
  },
  "security": {
    "allowWrite": false,
    "allowedWriteOperations": ["INSERT", "UPDATE"],
    "disableDangerousOperations": true,
    "redactSecrets": true
  },
  "logging": {
    "level": "info",
    "pretty": false
  }
}

Resolução de Segredos

Abordagem recomendada: secretRef

Mantenha segredos fora da configuração do cliente MCP e fora dos próprios valores de configuração do servidor.

Exemplo de Configuração:

{
  "databases": [
    {
      "id": "production-db",
      "type": "postgres",
      "secretRef": "DATABASE_URL"
    }
  ]
}

O servidor resolve secretRef primeiro a partir do ambiente do processo e, em seguida, a partir de um arquivo .env próximo a .mcp-database-server.config.

Arquivo de Ambiente (.env):

DATABASE_URL=postgresql://user:password@localhost:5432/dbname
DB_URL_MYSQL=mysql://user:password@localhost:3306/dbname
DB_URL_MARIADB=mysql://report_user:password@mariadb.local:3306/reporting
DB_URL_MSSQL=Server=host,1433;Database=db;User Id=sa;Password=pass

Alternativa: credentialCommand

{
  "databases": [
    {
      "id": "analytics-db",
      "type": "mysql",
      "credentialCommand": "op read op://analytics/mysql/url"
    }
  ]
}

O comando deve imprimir apenas a string de conexão no stdout. Por segurança, credentialCommand só é permitido quando o servidor é iniciado com um caminho explícito de --config. Configurações descobertas automaticamente não podem executar comandos de credenciais.

Ainda suportado: interpolação direta de env

Você ainda pode escrever "url": "${DATABASE_URL}", mas secretRef é a opção mais limpa porque torna a fonte do segredo explícita. Melhores Práticas:

  • ✅ Armazene o arquivo .env fora do controle de versão (adicione ao .gitignore)
  • ✅ Use arquivos .env diferentes para cada ambiente (dev, staging, prod)
  • ✅ Nunca envie credenciais para repositórios git
  • ✅ Use serviços de gerenciamento de segredos (AWS Secrets Manager, HashiCorp Vault) em produção

Referência de String de Conexão

Banco de DadosFormatoExemplo
PostgreSQLpostgresql://user:pass@host:port/dbpostgresql://admin:secret@localhost:5432/myapp
MySQLmysql://user:pass@host:port/dbmysql://root:password@localhost:3306/myapp
MariaDBmysql://user:pass@host:port/dbmysql://report_user:password@mariadb.local:3306/reporting
SQL ServerServer=host,port;Database=db;User Id=user;Password=passServer=localhost,1433;Database=myapp;User Id=sa;Password=secret
SQLiteUse a propriedade path"path": "./data/app.db" ou "path": "/var/db/app.sqlite"

Parâmetros Adicionais:

PostgreSQL:

postgresql://user:pass@host:5432/db?sslmode=require&connect_timeout=10

MySQL:

mysql://user:pass@host:3306/db?charset=utf8mb4&timezone=Z

MariaDB:

mysql://user:pass@host:3306/db?charset=utf8mb4

SQL Server:

Server=host;Database=db;User Id=user;Password=pass;Encrypt=true;TrustServerCertificate=false

Integração com Cliente MCP

Localizações dos Arquivos de Configuração

Cliente MCPCaminho do Arquivo de Configuração
Claude Desktop (macOS)~/Library/Application Support/Claude/claude_desktop_config.json
Claude Desktop (Windows)%APPDATA%\Claude\claude_desktop_config.json
Cline (VS Code)Configurações do VS Code → MCP Servers
Outros ClientesConsulte a documentação específica do cliente

Métodos de Configuração

Método 1: Instalação Global via npm

Configuração:

{
  "mcpServers": {
    "database": {
      "command": "mcp-database-server",
      "args": ["--config", "/absolute/path/to/.mcp-database-server.config"]
    }
  }
}

Método 2: Instalação a partir do Código Fonte

Configuração:

{
  "mcpServers": {
    "database": {
      "command": "node",
      "args": [
        "/absolute/path/to/mcp-database-server/dist/index.js",
        "--config",
        "/absolute/path/to/.mcp-database-server.config"
      ]
    }
  }
}

Propriedades de Configuração

PropriedadeDescriçãoExemplo
commandExecutável a ser executado. Use mcp-database-server para instalação via npm, node para instalação a partir do código fonte."mcp-database-server"
argsMatriz de argumentos de linha de comando. O primeiro argumento geralmente é --config, seguido pelo caminho do arquivo de configuração.["--config", "/path/to/config"]
envVariáveis de ambiente opcionais passadas ao servidor. Prefira secretRef com um arquivo local .env ou ferramentas externas de segredos para credenciais de banco de dados.{"APP_ENV": "production"}

Encontrando Caminhos Absolutos:

# macOS/Linux
cd /path/to/mcp-database-server
pwd  # prints: /Users/username/projects/mcp-database-server

# Windows (PowerShell)
cd C:\path\to\mcp-database-server
$PWD.Path  # prints: C:\Users\username\projects\mcp-database-server

Ferramentas MCP Disponíveis

Este servidor fornece 15 ferramentas para interação e otimização abrangentes de banco de dados.

Referência de Ferramentas

FerramentaPropósitoAcesso de EscritaDados em Cache
list_databasesListar todos os bancos de dados configurados com statusNãoUsa cache
introspect_schemaDescobrir e armazenar em cache o esquema do banco de dadosNãoGrava cache
get_schemaRecuperar metadados de esquema em cacheNãoLê cache
run_queryExecutar consultas SQL com controles de segurançaCondicional*Atualiza estatísticas
export_queryExportar grandes resultados de consultas somente leitura para um arquivo localNãoSem cache
explain_queryAnalisar planos de execução de consultasNãoSem cache
suggest_joinsObter recomendações inteligentes de caminhos de junçãoNãoUsa cache
clear_cacheLimpar cache de esquema e estatísticasNãoLimpa cache
cache_statusVisualizar saúde e estatísticas do cacheNãoLê cache
health_checkTestar conectividade do banco de dadosNãoSem cache
analyze_performanceObter análises detalhadas de desempenhoNãoUsa estatísticas
suggest_indexesAnalisar consultas e recomendar índicesNãoUsa estatísticas
detect_slow_queriesIdentificar e alertar sobre consultas lentasNãoUsa estatísticas
rewrite_querySugerir versões otimizadas de consultasNãoUsa cache
profile_queryPerfilar desempenho de consultas com gargalosNãoSem cache

* Requer allowWrite: true e respeita as configurações de segurança


1. list_databases

Lista todos os bancos de dados configurados com seu status de conexão e informações de cache.

Parâmetros de Entrada:

Nenhum necessário.

Resposta:

[
  {
    "id": "postgres-main",
    "type": "postgres",
    "connected": true,
    "cached": true,
    "cacheAge": 45000,
    "version": "abc123"
  }
]

Campos da Resposta:

CampoTipoDescrição
idstringIdentificador do banco de dados a partir da configuração
typestringTipo de banco de dados (postgres, mysql, sqlite, mssql, oracle)
connectedbooleanSe a conexão do banco de dados está ativa
cachedbooleanSe o esquema está atualmente em cache
cacheAgenumberIdade do esquema em cache em milissegundos (se em cache)
versionstringHash da versão do cache (se em cache)

2. introspect_schema

Descobre e armazena em cache o esquema completo do banco de dados, incluindo tabelas, colunas, índices, chaves estrangeiras e relacionamentos.

Parâmetros de Entrada:

ParâmetroTipoObrigatórioDescrição
dbIdstringSimIdentificador do banco de dados a ser inspecionado
forceRefreshbooleanNãoForçar reintrospecção mesmo se o cache for válido (padrão: false)
schemaFilterobjectNãoFiltrar quais objetos inspecionar
schemaFilter.includeSchemasstring[]NãoInspecionar apenas estes esquemas (PostgreSQL/SQL Server)
schemaFilter.excludeSchemasstring[]NãoPular estes esquemas durante a introspecção
schemaFilter.includeViewsbooleanNãoIncluir visões (views) do banco de dados (padrão: true)
schemaFilter.maxTablesnumberNãoLimitar às primeiras N tabelas

Exemplo de Solicitação:

{
  "dbId": "postgres-main",
  "forceRefresh": false,
  "schemaFilter": {
    "includeSchemas": ["public"],
    "excludeSchemas": ["temp"],
    "includeViews": true,
    "maxTables": 100
  }
}

Resposta:

{
  "dbId": "postgres-main",
  "version": "a1b2c3d4",
  "introspectedAt": "2026-01-26T10:00:00.000Z",
  "schemas": [
    {
      "name": "public",
      "tableCount": 15,
      "viewCount": 3
    }
  ],
  "totalTables": 15,
  "totalRelationships": 12
}

3. get_schema

Recupera metadados detalhados do esquema a partir do cache, sem consultar o banco de dados.

Parâmetros de Entrada:

ParâmetroTipoObrigatórioDescrição
dbIdstringSimIdentificador do banco de dados
schemastringNãoFiltrar por nome específico de esquema
tablestringNãoFiltrar por nome específico de tabela

Exemplo de Solicitação:

{
  "dbId": "postgres-main",
  "schema": "public",
  "table": "users"
}

Resposta: Metadados completos do esquema, incluindo tabelas, colunas, tipos de dados, índices, chaves estrangeiras e relacionamentos inferidos.


4. run_query

Executa consultas SQL com armazenamento automático em cache do esquema, anotação de relacionamentos e controles de segurança abrangentes.

Parâmetros de Entrada:

ParâmetroTipoObrigatórioDescrição
dbIdstringSimIdentificador do banco de dados a ser consultado
sqlstringSimConsulta SQL a ser executada
paramsarrayNãoValores de consulta parametrizados (previne injeção de SQL)
limitnumberNãoNúmero máximo de linhas a retornar
offsetnumberNãoDeslocamento de linhas para leituras paginadas. Requer limit.
maxBytesnumberNãoAproximadamente o máximo de bytes serializados para as linhas retornadas.
includeMetadatabooleanNãoIncluir metadados de relacionamentos e estatísticas de consulta na resposta. Padrão: true.
trackQuerybooleanNãoRastrear esta consulta no histórico e nas análises de desempenho. Padrão: true.
timeoutMsnumberNãoTempo limite da consulta em milissegundos

Exemplo de Solicitação:

{
  "dbId": "postgres-main",
  "sql": "SELECT * FROM users WHERE active = $1 ORDER BY id",
  "params": [true],
  "limit": 10,
  "offset": 0,
  "maxBytes": 32768,
  "includeMetadata": false,
  "trackQuery": false,
  "timeoutMs": 5000
}

Resposta:

{
  "rows": [
    {"id": 1, "name": "Alice", "email": "alice@example.com", "active": true},
    {"id": 2, "name": "Bob", "email": "bob@example.com", "active": true}
  ],
  "columns": ["id", "name", "email", "active"],
  "rowCount": 2,
  "executionTimeMs": 15,
  "metadata": {
    "relationships": [...],
    "queryStats": {
      "totalQueries": 10,
      "avgExecutionTime": 20,
      "errorCount": 0
    },
    "pagination": {
      "limit": 10,
      "offset": 0,
      "hasMore": true,
      "nextOffset": 10
    },
    "responseSize": {
      "maxBytes": 32768,
      "rowsBytes": 1842,
      "rowsTrimmed": false,
      "omittedRowCount": 0
    }
  }
}

Para o caminho de leitura mais rápido em MariaDB/MySQL, defina "includeMetadata": false e "trackQuery": false quando você precisar apenas das linhas de resultado e não precisar de anotações de relacionamento, histórico de consultas ou análises de desempenho para essa solicitação.

Controles de Segurança:

  • ✅ Operações de escrita bloqueadas por padrão (allowWrite: false)
  • ✅ Operações perigosas (DELETE, TRUNCATE, DROP) desabilitadas por padrão
  • ✅ Operações específicas podem ser adicionadas à lista de permissões via allowedWriteOperations
  • ✅ Modo readOnly por banco de dados

5. explain_query

Recupera o plano de execução da consulta do banco de dados sem executar a consulta.

Parâmetros de Entrada:

ParâmetroTipoObrigatórioDescrição
dbIdstringSimIdentificador do banco de dados
sqlstringSimConsulta SQL a ser analisada
paramsarrayNãoParâmetros da consulta (para consultas parametrizadas)

Exemplo de Solicitação:

{
  "dbId": "postgres-main",
  "sql": "SELECT * FROM users JOIN orders ON users.id = orders.user_id WHERE users.active = $1",
  "params": [true]
}

Resposta: Plano de execução nativo do banco de dados (o formato varia conforme o tipo de banco de dados).


5a. export_query

Exporta grandes resultados de consultas somente leitura para um arquivo local em .sql-mcp-cache/exports.

Estratégia de Execução:

  • MySQL/MariaDB usa streaming de linhas em nível de adaptador para evitar carregar o conjunto de resultados completo na memória.
  • PostgreSQL e SQLite usam exportação paginada, reescrevendo janelas LIMIT/OFFSET de nível superior.
  • A exportação do SQL Server requer um caminho futuro de streaming específico do adaptador e atualmente falhará, a menos que a reescrita de paginação seja suportada.

Parâmetros de Entrada:

ParâmetroTipoObrigatórioDescrição
dbIdstringSimIdentificador do banco de dados
sqlstringSimConsulta SQL somente leitura a ser exportada
paramsarrayNãoParâmetros da consulta
formatstringNãoFormato de saída: jsonl ou csv (padrão: jsonl)
pageSizenumberNãoTamanho da página para adaptadores sem streaming (padrão: 1000)
fileNamestringNãoNome opcional do arquivo de saída gravado dentro do diretório de exportação
timeoutMsnumberNãoTempo limite da consulta em milissegundos

Exemplo de Solicitação:

{
  "dbId": "mariadb-reporting",
  "sql": "SELECT id, email, created_at FROM users ORDER BY id",
  "format": "jsonl",
  "fileName": "users-export.jsonl",
  "timeoutMs": 10000
}

Resposta:

{
  "dbId": "mariadb-reporting",
  "outputPath": "/absolute/path/to/.sql-mcp-cache/exports/users-export.jsonl",
  "format": "jsonl",
  "strategy": "stream",
  "rowsExported": 250000,
  "columns": ["id", "email", "created_at"],
  "fileSizeBytes": 18342011,
  "executionTimeMs": 8421
}

6. suggest_joins

Analisa o grafo de relacionamentos para recomendar caminhos de junção ideais entre várias tabelas.

Parâmetros de Entrada:

ParâmetroTipoObrigatórioDescrição
dbIdstringSimIdentificador do banco de dados
tablesstring[]SimMatriz de nomes de tabelas para unir (2-10 tabelas)

Exemplo de Solicitação:

{
  "dbId": "postgres-main",
  "tables": ["users", "orders", "products"]
}

Resposta:

[
  {
    "tables": ["users", "orders", "products"],
    "joins": [
      {
        "fromTable": "users",
        "toTable": "orders",
        "relationship": {
          "type": "one-to-many",
          "confidence": 1.0
        },
        "joinCondition": "users.id = orders.user_id"
      },
      {
        "fromTable": "orders",
        "toTable": "products",
        "relationship": {
          "type": "many-to-one",
          "confidence": 1.0
        },
        "joinCondition": "orders.product_id = products.id"
      }
    ],
    "sql": "FROM users JOIN orders ON users.id = orders.user_id JOIN products ON orders.product_id = products.id"
  }
]

7. clear_cache

Limpa o cache de esquema e as estatísticas de consultas para um ou todos os bancos de dados.

Parâmetros de Entrada:

ParâmetroTipoObrigatórioDescrição
dbIdstringNãoBanco de dados a limpar (omitir para limpar todos)

Exemplo de Solicitação:

{
  "dbId": "postgres-main"
}

Resposta: Mensagem de confirmação.


8. cache_status

Recupera estatísticas detalhadas do cache e informações de saúde.

Parâmetros de Entrada:

Nenhum necessário.

Resposta:

{
  "directory": ".sql-mcp-cache",
  "ttlMinutes": 10,
  "databases": [
    {
      "dbId": "postgres-main",
      "cached": true,
      "version": "abc123",
      "age": 120000,
      "expired": false,
      "tableCount": 15,
      "sizeBytes": 45678
    }
  ]
}

9. health_check

Testa a conectividade do banco de dados e retorna informações de status.

Parâmetros de Entrada:

ParâmetroTipoObrigatórioDescrição
dbIdstringNãoBanco de dados a verificar (omitir para verificar todos)

Resposta:

{
  "databases": [
    {
      "dbId": "postgres-main",
      "healthy": true,
      "connected": true,
      "version": "PostgreSQL 15.3",
      "responseTimeMs": 12
    }
  ]
}

10. analyze_performance

Obtenha análises abrangentes de desempenho em todas as consultas de um banco de dados.

Parâmetros de Entrada:

ParâmetroTipoObrigatórioDescrição
dbIdstringSimBanco de dados a analisar

Resposta:

{
  "totalQueries": 1250,
  "slowQueries": 23,
  "avgExecutionTime": 45.67,
  "p95ExecutionTime": 234.5,
  "errorRate": 1.2,
  "mostFrequentTables": [
    { "table": "users", "count": 456 },
    { "table": "orders", "count": 234 }
  ],
  "performanceTrend": "improving"
}

11. suggest_indexes

Analisa padrões de consulta e recomenda índices ideais de banco de dados.

Parâmetros de Entrada:

ParâmetroTipoObrigatórioDescrição
dbIdstringSimBanco de dados a analisar

Resposta:

[
  {
    "table": "orders",
    "columns": ["customer_id", "order_date"],
    "type": "composite",
    "reason": "Frequently used in WHERE and JOIN conditions",
    "impact": "high"
  },
  {
    "table": "products",
    "columns": ["category_id"],
    "type": "single",
    "reason": "Column category_id is frequently queried",
    "impact": "medium"
  }
]

12. detect_slow_queries

Identifica consultas que excedem os limites de desempenho e fornece alertas.

Parâmetros de Entrada:

ParâmetroTipoObrigatórioDescrição
dbIdstringSimBanco de dados a analisar

Resposta:

[
  {
    "dbId": "postgres-main",
    "queryId": "a1b2c3",
    "sql": "SELECT * FROM large_table WHERE slow_column = ?",
    "executionTimeMs": 2500,
    "thresholdMs": 1000,
    "timestamp": "2024-01-27T10:30:00Z",
    "frequency": 5,
    "recommendations": [
      {
        "type": "add_index",
        "description": "Add index on slow_column for better performance",
        "impact": "high",
        "effort": "medium"
      }
    ]
  }
]

13. rewrite_query

Sugere versões otimizadas de consultas SQL com melhorias de desempenho.

Parâmetros de Entrada:

ParâmetroTipoObrigatórioDescrição
dbIdstringSimID do banco de dados
sqlstringSimConsulta SQL a otimizar

Resposta:

{
  "originalQuery": "SELECT * FROM users WHERE active = 1",
  "optimizedQuery": "SELECT id, name, email FROM users WHERE active = 1 LIMIT 1000",
  "improvements": [
    "Removed unnecessary SELECT *",
    "Added LIMIT clause to prevent large result sets"
  ],
  "performanceGain": 35,
  "confidence": "high"
}

14. profile_query

Perfila o desempenho de uma consulta específica com análise detalhada de gargalos.

Parâmetros de Entrada:

ParâmetroTipoObrigatórioDescrição
dbIdstringSimID do banco de dados
sqlstringSimConsulta SQL para perfil
paramsarrayNãoParâmetros da consulta

Resposta:

{
  "queryId": "def456",
  "sql": "SELECT u.name, COUNT(o.id) FROM users u JOIN orders o ON u.id = o.user_id GROUP BY u.id",
  "executionTimeMs": 1250,
  "rowCount": 5000,
  "bottlenecks": [
    {
      "type": "join",
      "severity": "high",
      "description": "Nested loop join on large tables",
      "estimatedCost": 150
    }
  ],
  "recommendations": [
    {
      "type": "add_index",
      "description": "Add index on orders.user_id",
      "impact": "high",
      "effort": "low"
    }
  ],
  "overallScore": 65
}

Recursos

O servidor expõe esquemas em cache como recursos MCP:

  • URI: schema://{dbId}
  • Tipo MIME: application/json
  • Conteúdo: Metadados completos do esquema em cache

Introspecção de Esquema

Descoberta Automática

O servidor descobre automaticamente:

  1. Tabelas e Visões: Todas as tabelas de usuário e opcionalmente visões
  2. Colunas: Nome, tipo de dados, nulabilidade, padrões, auto-incremento
  3. Índices: Incluindo chaves primárias e restrições únicas
  4. Chaves Estrangeiras: Metadados explícitos de relacionamento
  5. Relacionamentos: Tanto explícitos quanto inferidos

Inferência de Relacionamentos

Quando chaves estrangeiras não são definidas, o servidor infere relacionamentos usando heurísticas:

  • Nomes de colunas correspondentes a {table}_id ou {table}Id
  • Compatibilidade de tipo de dados com a chave primária de destino
  • Pontuação de confiança para relacionamentos inferidos

Estratégia de Cache

  • Memória + Disco: Cache em duas camadas para desempenho
  • Baseado em TTL: Tempo de vida configurável
  • Rastreamento de Versão: Versionamento baseado em conteúdo (hash)
  • Seguro para Concorrência: Evita introspecção duplicada
  • Atualização Sob Demanda: Atualização manual ou automática

Rastreamento de Consultas

O servidor mantém histórico de consultas por banco de dados:

  • Carimbo de data/hora e texto SQL
  • Tempo de execução e contagem de linhas
  • Tabelas referenciadas (extração de melhor esforço)
  • Rastreamento de erros
  • Estatísticas agregadas

Use esses dados para:

  • Monitorar o desempenho de consultas
  • Identificar tabelas frequentemente acessadas
  • Detectar padrões de consulta
  • Depurar problemas

Desenvolvimento

# Install dependencies
npm install

# Run in development mode
npm run dev

# Build
npm run build

# Run tests
npm test

# Run tests with coverage
npm run test:coverage

# Lint
npm run lint

# Format code
npm run format

# Type check
npm run typecheck

Estrutura do Projeto

src/
├── adapters/          # Database adapters
│   ├── base.ts        # Base adapter class
│   ├── postgres.ts    # PostgreSQL adapter
│   ├── mysql.ts       # MySQL adapter
│   ├── sqlite.ts      # SQLite adapter
│   ├── mssql.ts       # SQL Server adapter
│   ├── oracle.ts      # Oracle adapter (stub)
│   └── index.ts       # Adapter factory
├── cache.ts           # Schema caching
├── config.ts          # Configuration loader
├── database-manager.ts # Database orchestration
├── logger.ts          # Logging setup
├── mcp-server.ts      # MCP server implementation
├── query-tracker.ts   # Query history tracking
├── types.ts           # TypeScript types
├── utils.ts           # Utility functions
└── index.ts           # Entry point

Adicionando Novos Adaptadores de Banco de Dados

  1. Implemente a interface DatabaseAdapter em src/adapters/
  2. Siga o padrão dos adaptadores existentes
  3. Adicione à fábrica de adaptadores em src/adapters/index.ts
  4. Atualize as definições de tipo se necessário
  5. Adicione testes

Exemplo:

import { BaseAdapter } from './base.js';

export class CustomAdapter extends BaseAdapter {
  async connect(): Promise<void> { /* ... */ }
  async disconnect(): Promise<void> { /* ... */ }
  async introspect(): Promise<DatabaseSchema> { /* ... */ }
  async query(): Promise<QueryResult> { /* ... */ }
  async explain(): Promise<ExplainResult> { /* ... */ }
  async testConnection(): Promise<boolean> { /* ... */ }
  async getVersion(): Promise<string> { /* ... */ }
}

Solução de Problemas

Problemas de Conexão

  • Verifique strings de conexão e credenciais
  • Verifique a conectividade de rede e regras de firewall
  • Ative o registro de depuração: "logging": { "level": "debug" }
  • Use a ferramenta health_check para testar a conectividade

Problemas de Cache

  • Limpe o cache: Use a ferramenta clear_cache
  • Verifique as permissões do diretório de cache
  • Verifique as configurações de TTL
  • Revise o status do cache com a ferramenta cache_status

Desempenho

  • Ajuste as configurações do pool de conexões
  • Use maxTables para limitar o escopo da introspecção
  • Defina um TTL de cache apropriado
  • Ative o modo somente leitura quando possível

Configuração do Oracle

O adaptador Oracle requer configuração adicional:

  1. Instale o Oracle Instant Client
  2. Defina variáveis de ambiente (LD_LIBRARY_PATH ou PATH)
  3. Instale o pacote oracledb
  4. Implemente métodos stub em src/adapters/oracle.ts

Considerações de Segurança

  • Sempre use o modo somente leitura em produção, a menos que o acesso de escrita seja necessário
  • Use variáveis de ambiente para credenciais, nunca codifique
  • Ative a redação de segredos nos logs
  • Restrinja operações de escrita com allowedWriteOperations
  • Use criptografia de string de conexão onde houver suporte
  • Auditorias regulares de segurança das configurações

Licença

MIT

Contribuição

Contribuições são bem-vindas! Por favor:

  1. Faça um fork do repositório
  2. Crie um branch de recurso
  3. Adicione testes para novas funcionalidades
  4. Garanta que todos os testes passem
  5. Envie um pull request

Suporte

Para problemas, dúvidas ou solicitações de recursos, abra uma issue no GitHub.