gaussdb-ro-mcp
Servidor MCP somente leitura para Huawei GaussDB (centralizado e distribuído), desenvolvido para agentes de codificação. Proteção de escrita em três camadas, configuração multi-instância, exploração de esquema e execução de SELECT único.
Documentação
gaussdb-ro-mcp
Servidor MCP somente leitura para GaussDB, voltado para Coding Agents (Claude Code, OpenCode etc.). Baseado no
driver Go oficial do GaussDB
(versão adaptada do pgx v5, open-source oficial da Huawei Cloud, com código-fonte embutido em third_party/gaussdb-go, suportando build offline),
fornece ferramentas de exploração somente leitura do banco via transporte stdio.
Projetado especificamente para ambientes de intranet sem SSL: por padrão sslmode=disable, e o arquivo de configuração suporta o gerenciamento simultâneo de várias instâncias GaussDB.
Garantia de somente leitura (defesa em profundidade, três camadas)
| Camada | Mecanismo | Descrição |
|---|---|---|
| 1. Validação estática de SQL | internal/guard | Apenas permite consultas únicas SELECT/WITH: rejeita DML/DDL (incluindo instruções de escrita dentro de CTE), SELECT ... INTO, bloqueio de linha FOR UPDATE/SHARE, múltiplas instruções, funções perigosas (dblink*, set_config, setval, pg_read_file*, pg_terminate_backend, pg_advisory_*, escrita em objetos grandes etc., configurável). A análise léxica ignora corretamente strings, comentários e identificadores entre aspas, evitando falsos positivos |
| 2. Imposição em nível de transação | internal/db | Todas as consultas são executadas em transação somente leitura explícita: BEGIN → SET LOCAL TRANSACTION READ ONLY → consulta → COMMIT (rollback em caso de falha). A versão distribuída do GaussDB suporta apenas configuração somente leitura em nível de transação; essa abordagem funciona tanto em instâncias centralizadas/primário-réplica quanto distribuídas; também há SET statement_timeout. Mesmo que a camada 1 seja contornada, o servidor rejeita qualquer escrita dentro da transação (incluindo escritas internas de funções) |
| 3. Recomendação de implantação | README | Recomenda-se usar uma conta de banco com apenas privilégio SELECT (veja abaixo), garantindo privilégio mínimo |
Ferramentas MCP fornecidas
| Ferramenta | Função |
|---|---|
test_connection | Teste de conectividade: versão do servidor, banco/usuário atual, status somente leitura, latência; parâmetro opcional instance |
list_schemas | Lista de schemas: número de objetos, comentários; include_system controla se inclui schemas de sistema |
list_tables | Lista de tabelas/visões: tipo (tabela/visão/visão materializada/tabela particionada/tabela externa), estimativa de linhas, comentários; pode ser filtrado por schema |
describe_table | Estrutura da tabela: colunas (tipo/nulável/valor padrão/comentário), chave primária e restrições, todos os índices e definições; visões retornam o SQL de definição; tabelas particionadas retornam a lista de partições (GaussDB pg_partition) |
execute_select | Executa SELECT: aceita apenas um único SELECT/WITH, sujeito a max_rows/limite de tempo, retorna nomes de colunas + dados das linhas + se houve truncamento |
Todas as ferramentas aceitam o parâmetro opcional instance para selecionar a fonte de dados; por padrão, usa default_instance.
Instalação
Baixe o binário da plataforma correspondente em Releases
(linux-amd64 / linux-arm64 / darwin-arm64 / windows-amd64.exe; outras plataformas ou ambientes de intranet podem compilar manualmente, veja a próxima seção).
Linux:
curl -LO https://github.com/gxc/gaussdb-ro-mcp/releases/latest/download/gaussdb-ro-mcp-linux-amd64
sudo install -Dm 755 gaussdb-ro-mcp-linux-amd64 /usr/local/bin/gaussdb-ro-mcp
gaussdb-ro-mcp --version
macOS (Apple Silicon):
curl -LO https://github.com/gxc/gaussdb-ro-mcp/releases/latest/download/gaussdb-ro-mcp-darwin-arm64
sudo install -Dm 755 gaussdb-ro-mcp-darwin-arm64 /usr/local/bin/gaussdb-ro-mcp
gaussdb-ro-mcp --version
Windows (PowerShell; após colocar no diretório do PATH, pode ser chamado diretamente):
Invoke-WebRequest -Uri "https://github.com/gxc/gaussdb-ro-mcp/releases/latest/download/gaussdb-ro-mcp-windows-amd64.exe" -OutFile "gaussdb-ro-mcp.exe"
Move-Item .\gaussdb-ro-mcp.exe "$env:LOCALAPPDATA\Microsoft\WindowsApps\" # 该目录默认在 PATH 中
gaussdb-ro-mcp --version
Os valores de checksum de cada artefato estão na seção SHA256SUMS.txt da página de Releases.
Build
Requer Go 1.26+ (consistente com go.mod). O código-fonte do driver está embutido em third_party/gaussdb-go (referenciado pela diretiva replace).
Em ambiente com rede normal, go build resolve automaticamente as demais dependências; em ambiente totalmente offline, execute go mod vendor em um ambiente com rede e depois leve o diretório vendor/, usando go build -mod=vendor para compilar.
go build -o gaussdb-ro-mcp ./cmd/gaussdb-ro-mcp
sudo install -Dm 755 gaussdb-ro-mcp /usr/local/bin/gaussdb-ro-mcp
gaussdb-ro-mcp --version
Compilação cruzada para outras plataformas (Go puro, basta CGO_ENABLED=0): CGO_ENABLED=0 GOOS=<os> GOARCH=<arch> go build -o ... ./cmd/gaussdb-ro-mcp.
Configuração
Copie gaussdb-ro-mcp.example.yaml para gaussdb-ro-mcp.yaml e edite.
Ordem de busca do arquivo de configuração: parâmetro -config > variável de ambiente GAUSSDB_RO_MCP_CONFIG > ./gaussdb-ro-mcp.yaml.
server:
max_rows: 500 # execute_select 默认行数上限
max_rows_cap: 10000 # 单次调用可放宽的硬上限
statement_timeout: 30s
connect_timeout: 10s
instances:
- name: prod # 实例名称,工具调用时用 instance 参数引用
host: 192.168.0.10
port: 8000
database: postgres
user: readonly_user
password: "****"
sslmode: disable # 内网非 SSL 默认值
- name: dev
dsn: "gaussdb://readonly_user:****@192.168.1.20:5432/appdb?sslmode=disable"
default_instance: prod
Integração com Coding Agents
Claude Code
Opção 1: .mcp.json na raiz do projeto (ou comando claude mcp add):
{
"mcpServers": {
"gaussdb-readonly": {
"command": "/usr/local/bin/gaussdb-ro-mcp",
"args": ["-config", "/path/to/gaussdb-ro-mcp.yaml"]
}
}
}
claude mcp add gaussdb-readonly -- /usr/local/bin/gaussdb-ro-mcp -config /path/to/gaussdb-ro-mcp.yaml
OpenCode
opencode.json:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"gaussdb-readonly": {
"type": "local",
"command": ["/usr/local/bin/gaussdb-ro-mcp", "-config", "/path/to/gaussdb-ro-mcp.yaml"]
}
}
}
Conta somente leitura no banco (fortemente recomendado)
CREATE USER readonly_user WITH PASSWORD 'your-strong-password';
GRANT USAGE ON SCHEMA public TO readonly_user;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly_user;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly_user;
-- 其他模式按需逐个授权
Mesmo que a conta do banco seja limitada a somente leitura, a validação de SQL e a imposição de sessão deste serviço ainda bloqueiam
bloqueio de linha (FOR UPDATE), SELECT INTO, chamadas a funções perigosas, consultas longas etc.
Logs
Todos os logs de execução são enviados para stderr (stdout é o canal do protocolo MCP), incluindo carregamento de configuração, prontidão das fontes de dados, resultado da validação de sessão somente leitura etc., facilitando a depuração nos logs MCP do cliente agente.
Desenvolvimento e testes
go test ./... # 单元测试(SQL 校验、配置解析)
GAUSSDB_RO_MCP_TEST_DSN="host=... port=... user=... password=... dbname=... sslmode=disable" \
go test -count=1 ./... # 集成测试(需 GaussDB/openGauss 实例)
Você pode usar Docker para iniciar rapidamente uma instância de teste openGauss e carregar dados de teste:
docker run -d --name opengauss-ro-test -e GS_PASSWORD='Gaussdb@123' \
-p 127.0.0.1:15433:5432 --privileged docker.m.daocloud.io/enmotech/opengauss:latest
go run ./scripts/devseed "host=127.0.0.1 port=15433 user=gaussdb password=Gaussdb@123 dbname=postgres sslmode=disable"
Os testes de integração cobrem: imposição de sessão somente leitura (o servidor rejeita escritas), comportamento de ponta a ponta das 5 ferramentas, teste de fumaça do subprocesso stdio com binário real. Observação: este driver usa o protocolo estendido do GaussDB (3.51), não é possível conectar a PostgreSQL nativo; os testes de integração exigem uma instância real de GaussDB / openGauss.
Estrutura de diretórios
cmd/gaussdb-ro-mcp/ 程序入口(stdio MCP 服务器)
internal/config/ YAML 配置:多实例数据源、行数/超时等
internal/guard/ 第 1 层防护:SQL 只读静态校验器
internal/db/ 多实例连接池 + 第 2 层防护:会话级 READ ONLY 强制、元数据查询
internal/tools/ MCP 工具注册与实现
scripts/devseed/ 集成测试数据灌入工具(开发用)
third_party/gaussdb-go/ GaussDB 官方 Go 驱动源码(go.mod replace 引用)
Feedback e contribuições
Issues e Pull Requests são bem-vindos:
- Relatar problemas / sugestões de funcionalidades: https://github.com/gxc/gaussdb-ro-mcp/issues
- Obter a versão mais recente: https://github.com/gxc/gaussdb-ro-mcp/releases/latest
- Antes de enviar um PR, garanta que
go vet ./...ego test ./...passem; alterações que envolvam lógica de proteção de segurança (validação estática de SQL / imposição de somente leitura) devem incluir testes de regressão