Trino MCP Server

Uma implementação em Go de um servidor Model Context Protocol (MCP) para Trino, permitindo que modelos LLM consultem bancos de dados SQL distribuídos por meio de ferramentas padronizadas.

Documentação

Servidor MCP Trino em Go

Um servidor de Model Context Protocol (MCP) de alto desempenho para Trino implementado em Go. Este projeto permite que assistentes de IA interajam perfeitamente com o mecanismo de consulta SQL distribuído do Trino por meio de ferramentas MCP padronizadas.

GitHub Workflow Status Go Version Trivy Scan SLSA 3 Go Report Card Go Reference Docker Image GitHub Release License: MIT

Trust Score

Visão Geral

Este projeto implementa um servidor de Model Context Protocol (MCP) para Trino em Go. Ele permite que assistentes de IA acessem o mecanismo de consulta SQL distribuído do Trino por meio de ferramentas MCP padronizadas.

Trino (anteriormente PrestoSQL) é um poderoso mecanismo de consulta SQL distribuído projetado para análises rápidas em grandes conjuntos de dados.

Arquitetura

graph TB
    subgraph "AI Clients"
        CC[Claude Code]
        CD[Claude Desktop]
        CR[Cursor]
        WS[Windsurf]
        CW[ChatWise]
    end
    
    subgraph "Authentication (Optional)"
        OP[OAuth Provider<br/>Okta/Google/Azure AD]
        JWT[JWT Tokens]
    end
    
    subgraph "MCP Server (mcp-trino)"
        HTTP[HTTP Transport<br/>/mcp endpoint]
        STDIO[STDIO Transport]
        AUTH[OAuth Middleware]
        TOOLS[MCP Tools<br/>• execute_query<br/>• list_catalogs<br/>• list_schemas<br/>• list_tables<br/>• get_table_schema<br/>• explain_query]
    end
    
    subgraph "Data Layer"
        TRINO[Trino Cluster<br/>Distributed SQL Engine]
        CATALOGS[Data Sources<br/>• PostgreSQL<br/>• MySQL<br/>• S3/Hive<br/>• BigQuery<br/>• MongoDB]
    end
    
    %% Connections
    CC -.->|OAuth Flow| OP
    OP -.->|JWT Token| JWT
    
    CC -->|HTTP + JWT| HTTP
    CD -->|STDIO| STDIO
    CR -->|HTTP + JWT| HTTP
    WS -->|STDIO| STDIO
    CW -->|HTTP + JWT| HTTP
    
    HTTP --> AUTH
    AUTH -->|Validated| TOOLS
    STDIO --> TOOLS
    
    TOOLS -->|SQL Queries| TRINO
    TRINO --> CATALOGS
    
    %% Styling
    classDef client fill:#e1f5fe
    classDef auth fill:#f3e5f5
    classDef server fill:#e8f5e8
    classDef data fill:#fff3e0
    
    class CC,CD,CR,WS,CW client
    class OP,JWT auth
    class HTTP,STDIO,AUTH,TOOLS server
    class TRINO,CATALOGS data

Componentes Principais:

  • Clientes de IA: Vários aplicativos compatíveis com MCP
  • Autenticação: OAuth 2.0 opcional com provedores OIDC
  • Servidor MCP: Servidor baseado em Go com suporte a transporte duplo
  • Modo CLI: Shell SQL interativo para acesso direto ao Trino (semelhante ao psql)
  • Camada de Dados: Cluster Trino conectando-se a múltiplas fontes de dados

Recursos

  • ✅ Modo Duplo: Funciona tanto como servidor MCP QUANTO como CLI interativo
    • Modo CLI: Shell SQL interativo semelhante ao psql para acesso direto ao Trino
    • Modo MCP: Servidor MCP completo para integração com assistentes de IA
  • ✅ Implementação de servidor MCP em Go
  • ✅ Execução de consultas SQL do Trino por meio de ferramentas MCP
  • ✅ Descoberta de catálogos, schemas e tabelas
  • ✅ Suporte a contêineres Docker
  • ✅ Suporte aos transportes STDIO e HTTP
  • ✅ Autenticação OAuth 2.1 via biblioteca oauth-mcp-proxy
    • 4 Provedores: HMAC, Okta, Google, Azure AD
    • Modo nativo: O cliente lida com OAuth diretamente (zero segredos no lado do servidor)
    • Modo proxy: O servidor faz proxy do fluxo OAuth para clientes simples
    • Pronto para produção: Cache de tokens, PKCE, segurança em profundidade
    • Reutilizável: Biblioteca OAuth disponível para qualquer servidor MCP em Go
  • ✅ Suporte a StreamableHTTP com autenticação JWT (atualizado de SSE)
  • ✅ Compatibilidade retroativa com endpoints SSE
  • ✅ Compatível com Cursor, Claude Desktop, Windsurf, ChatWise e qualquer cliente compatível com MCP.
  • ✅ Rastreamento de Identidade do Usuário:
    • Atribuição de Consultas (automática): Marca consultas com o usuário OAuth via cabeçalhos X-Trino-Client-Tags/Info
    • Personificação de Usuário (opt-in): Executa consultas como usuário OAuth via cabeçalho X-Trino-User

Instalação e Início Rápido

Instalação:

# Homebrew
brew install tuannvm/mcp/mcp-trino

# Or one-liner (macOS/Linux)
curl -fsSL https://raw.githubusercontent.com/tuannvm/mcp-trino/main/install.sh | bash

Execução (Desenvolvimento Local):

export TRINO_HOST=localhost TRINO_USER=trino
mcp-trino

Para implantação em produção com OAuth, consulte Guia de Implantação e Arquitetura OAuth.

Modo CLI

mcp-trino pode ser usado como um CLI interativo semelhante ao psql ou ao CLI do Trino:

# Interactive REPL mode
mcp-trino --interactive

# Execute a query directly
mcp-trino query "SELECT * FROM my_table LIMIT 10"

# List catalogs, schemas, tables
mcp-trino catalogs
mcp-trino schemas my_catalog
mcp-trino tables my_catalog my_schema

# Describe a table
mcp-trino describe my_catalog.my_schema.my_table

# Explain a query
mcp-trino explain "SELECT COUNT(*) FROM my_table"

# Output formats
mcp-trino --format json query "SELECT 1"
mcp-trino --format csv query "SELECT 1"
mcp-trino --format table query "SELECT 1"  # default

Ajuda Integrada

Todo comando possui saída de ajuda estruturada e amigável para LLM:

# Main help with all commands, flags, examples, and environment variables
mcp-trino --help

# Per-subcommand help
mcp-trino query --help
mcp-trino describe --help

A saída de ajuda segue as convenções de páginas de manual do Unix com seções: NAME, SYNOPSIS, DESCRIPTION, COMMANDS, FLAGS, EXAMPLES, ENVIRONMENT e CONFIGURATION.

Códigos de Saída

CódigoSignificado
0Sucesso
1Erro de execução (falha de conexão, erro de consulta, etc.)
2Erro de uso (comando desconhecido, flags inválidas, argumentos ausentes)

Perfis Nomeados

mcp-trino suporta perfis de conexão nomeados para facilitar a alternância entre ambientes Trino.

Arquivo de Configuração — suporta tanto YAML (~/.config/trino/config.yaml) quanto JSON (~/.config/trino/config.json):

# ~/.config/trino/config.yaml
current: prod

profiles:
  prod:
    host: trino.example.com
    port: 443
    user: prod_user
    password: prod_password
    catalog: hive
    schema: analytics
    ssl:
      enabled: true
      insecure: false

  dev:
    host: localhost
    port: 8080
    user: trino
    catalog: memory
    schema: default

  staging:
    host: staging-trino.example.com
    port: 443
    user: staging_user

output:
  format: table

Ou equivalentemente em JSON:

{
  "current": "prod",
  "profiles": {
    "prod": {
      "host": "trino.example.com",
      "port": 443,
      "user": "prod_user",
      "catalog": "hive",
      "ssl": { "enabled": true }
    },
    "dev": {
      "host": "localhost",
      "port": 8080,
      "user": "trino"
    }
  },
  "output": { "format": "table" }
}

Quando ambos os arquivos existem, config.json tem precedência. Novas configurações usam JSON por padrão.

Comandos de Gerenciamento de Perfis:

# List all profiles
mcp-trino config profile list

# Set default profile
mcp-trino config profile use prod

# Show profile details
mcp-trino config profile show staging

# Use a specific profile (overrides config file)
mcp-trino --profile dev catalogs

Precedência de Configuração (da maior para a menor):

  1. Flags de CLI (--host, --port, etc.)
  2. Flag --profile
  3. Variável de ambiente TRINO_PROFILE
  4. Campo current no arquivo de configuração
  5. Fallback do perfil default
  6. Variáveis de ambiente (TRINO_HOST, etc.)

Variáveis de Ambiente (prioridade mais baixa — sobrescritas por perfis e flags):

export TRINO_HOST=trino.example.com
export TRINO_PORT=443
export TRINO_USER=myuser
export TRINO_PASSWORD=mypass
export TRINO_CATALOG=hive
export TRINO_SCHEMA=analytics
export TRINO_SSL=true

Gerenciamento de Segredos (recomendado):

Os segredos são carregados puramente de variáveis de ambiente. Use um CLI de segredos para injetá-los via pipe Unix no momento da inicialização — o aplicativo nunca toca no seu cofre:

# 1Password CLI — resolves op:// references in an env file
op run --env-file=.env -- mcp-trino

# Or inline per-variable
TRINO_PASSWORD=$(op read 'op://Engineering/Trino/password') mcp-trino

Consulte docs/secrets.md para padrões com 1Password, Vault e Kubernetes, e para nuances de segurança (histórico de shell, lista de processos e vazamento de variáveis de ambiente).

Meta-Comandos do REPL (no modo interativo):

  • \help - Mostrar ajuda
  • \quit, \exit, \q - Sair do REPL
  • \history - Mostrar histórico de comandos
  • \catalogs - Listar todos os catálogos
  • \schemas [catalog] - Listar schemas
  • \tables [catalog schema] - Listar tabelas
  • \describe <table> - Descrever tabela
  • \format <table|json|csv> - Alterar formato de saída

Uso

Clientes Suportados: Claude Desktop, Claude Code, Cursor, Windsurf, ChatWise

Ferramentas Disponíveis: execute_query, list_catalogs, list_schemas, list_tables, get_table_schema, explain_query

Para integração com clientes e documentação de ferramentas, consulte Guia de Integração e Referência de Ferramentas.

Configuração

Variáveis Principais: TRINO_HOST, TRINO_USER, TRINO_SCHEME, MCP_TRANSPORT, OAUTH_PROVIDER

Gerenciamento de Segredos: Injete segredos por meio do ambiente do processo — mcp-trino os lê diretamente. Consulte docs/secrets.md para receitas com 1Password, Vault e Kubernetes.

# 1Password (biometric-gated, zero disk writes)
op run --env-file=.env -- mcp-trino

# Vault (via vault-agent or CLI)
TRINO_PASSWORD=$(vault kv get -field=password secret/mcp-trino) mcp-trino

# Kubernetes: use standard Secret → envFrom in the Helm chart values

Configuração OAuth:

# Native mode (most secure - zero server-side secrets)
export OAUTH_ENABLED=true OAUTH_MODE=native OAUTH_PROVIDER=okta
export OIDC_ISSUER=https://company.okta.com OIDC_AUDIENCE=https://mcp-server.com

# Proxy mode (centralized credential management)
export OAUTH_MODE=proxy OIDC_CLIENT_ID=app-id OIDC_CLIENT_SECRET=secret
export OAUTH_REDIRECT_URI=https://mcp-server.com/oauth/callback  # Fixed mode (localhost-only)
export OAUTH_REDIRECT_URI=https://app1.com/cb,https://app2.com/cb  # Allowlist mode
export JWT_SECRET=$(openssl rand -hex 32)  # Required for multi-pod deployments

Otimização de Desempenho:

# Focus AI on specific schemas only (10-20x performance improvement)
export TRINO_ALLOWED_SCHEMAS="hive.analytics,hive.marts,hive.reporting"

Rastreamento de Identidade do Usuário:

# Query Attribution is AUTOMATIC when OAuth is enabled
# Queries are tagged with X-Trino-Client-Tags and X-Trino-Client-Info headers

# For full impersonation (Trino enforces user permissions):
export TRINO_ENABLE_IMPERSONATION=true
export TRINO_IMPERSONATION_FIELD=email  # Options: username, email, subject

Para configuração completa, consulte Guia de Implantação, Guia OAuth, Guia de Listas de Permissão e Guia de Identidade do Usuário.

Implementação OAuth

mcp-trino usa oauth-mcp-proxy — uma biblioteca OAuth 2.1 independente para servidores MCP em Go.

Por que uma biblioteca separada?

  • ✅ Reutilizável em qualquer servidor MCP em Go
  • ✅ Testes e versionamento independentes
  • ✅ Documentação e exemplos dedicados
  • ✅ Implementação OAuth mantida pela comunidade

Para detalhes sobre OAuth:

Contribuições

Contribuições são bem-vindas! Sinta-se à vontade para enviar um Pull Request.

Licença

Este projeto é licenciado sob a Licença MIT — consulte o arquivo LICENSE para detalhes.

Projetos Relacionados

  • oauth-mcp-proxy — Biblioteca de autenticação OAuth 2.1 usada pelo mcp-trino (reutilizável para qualquer servidor MCP em Go)

CI/CD e Lançamentos

Este projeto usa GitHub Actions para integração contínua e GoReleaser para lançamentos automatizados.

Verificações de Integração Contínua

Nosso pipeline de CI executa as seguintes verificações em todos os PRs e commits para o branch principal:

Qualidade de Código

  • Linting: Usando golangci-lint para verificar problemas comuns de código e violações de estilo
  • Verificação de Módulos Go: Garantindo que go.mod e go.sum sejam mantidos adequadamente
  • Formatação: Verificando se o código está formatado corretamente com gofmt

Segurança

  • Varredura de Vulnerabilidades: Usando govulncheck para verificar vulnerabilidades conhecidas em dependências
  • Varredura de Dependências: Usando Trivy para verificar vulnerabilidades em dependências (CRITICAL, HIGH e MEDIUM)
  • Geração de SBOM: Criando uma Lista de Materiais de Software para rastreamento de dependências
  • Proveniência SLSA: Criando proveniência de build verificável para segurança da cadeia de suprimentos

Testes

  • Testes Unitários: Executando testes com detecção de corrida e relatório de cobertura de código
  • Verificação de Build: Garantindo que o código seja compilado com sucesso

Segurança de CI/CD

  • Menor Privilégio: Workflows executam com as permissões mínimas necessárias
  • Versões Fixadas: Todas as GitHub Actions usam versões específicas para prevenir ataques à cadeia de suprimentos
  • Atualizações de Dependências: Atualizações automatizadas de dependências via Dependabot

Processo de Lançamento

Quando alterações são mescladas ao branch principal:

  1. As verificações de CI são executadas para validar qualidade e segurança do código
  2. Se bem-sucedidas, um novo lançamento é criado automaticamente com:
    • Versionamento semântico baseado em mensagens de commit
    • Builds binários para múltiplas plataformas
    • Publicação de imagem Docker no GitHub Container Registry
    • Atestado de SBOM e proveniência