Pinot MCP Server

Um servidor MCP para interagir com Apache Pinot, um datastore OLAP distribuído em tempo real.

Documentação

Servidor MCP Pinot

Build and Test PyPI version Python versions License: Apache 2.0

Sumário

Visão Geral

Este projeto é um servidor Model Context Protocol (MCP) baseado em Python para interagir com Apache Pinot. Ele é construído usando o framework FastMCP. Foi projetado para integrar-se ao Claude Desktop, permitindo consultas de análise em tempo real e metadados em um cluster Pinot.

Ele permite que você:

  • Liste tabelas, segmentos e informações de esquema do Pinot
  • Execute consultas SQL somente leitura
  • Visualize metadados de índice/nível de coluna
  • Projetado para auxiliar usuários de negócios via integração com Claude
  • e muito mais.

Recursos

  • Cada ferramenta anuncia esquemas JSON de entrada e saída tipados, anotações de risco MCP e orientações de recuperação de falhas para o planejamento do agente.
  • Respostas grandes de consultas, tabelas, nomes de segmentos e metadados de segmentos usam páginas limitadas com metadados de continuação, em vez de retornar contexto de agente ilimitado.
  • SQL somente leitura é analisado e aplicado antes da execução; erros de validação, permissão e conectividade transitória são apresentados como erros MCP acionáveis.
  • Toda ferramenta de mutação suporta dry_run; sempre visualize o alvo exato e a carga útil antes de aplicar. A aplicação exige o confirmation_token de curta duração e uso único da visualização, inclusive para recarregamentos de filtro de tabela. Uma visualização não é uma garantia de que o Pinot aceitará a escrita posterior.
  • Ferramentas de inspeção de esquema e configuração de tabela com propósito único evitam operações combinadas ambíguas: use get_schema e get_table_config de forma independente.

Contrato de Ferramentas MCP

Os nomes das ferramentas diferenciam maiúsculas de minúsculas e usam sublinhados. A versão 4 renomeou quatro ferramentas para tornar toda operação com verbo primeiro; clientes que usam os nomes anteriores com substantivo primeiro devem atualizar suas chamadas.

FerramentaPropósito
test_connectionDiagnosticar conectividade de broker, controller e consultas.
list_tablesListar nomes visíveis de tabelas Pinot.
get_schemaObter o esquema de colunas de uma tabela.
get_table_configObter a configuração de indexação e ingestão de uma tabela.
get_table_sizeObter o tamanho de armazenamento relatado e estimado de uma tabela.
list_segmentsListar nomes exatos de segmentos de uma tabela.
list_segment_metadataPaginar pelos metadados dos segmentos de uma tabela.
get_segment_index_metadataInspecionar índices por coluna de um segmento exato.
read_queryExecutar uma consulta SQL Pinot somente leitura.
create_schema / update_schemaVisualizar ou aplicar alterações de esquema.
create_table_config / update_table_configVisualizar ou aplicar alterações de configuração de tabela.
reload_table_filtersVisualizar ou aplicar o YAML de filtro de tabela configurado.

Para toda alteração de esquema, configuração de tabela ou filtro de tabela, primeiro chame a mesma ferramenta com dry_run=true, apresente a visualização ao usuário e chame-a com dry_run=false e o confirmation_token de uso único da visualização somente após confirmação. Editar um arquivo de filtro de tabela após a visualização invalida seu token. O Pinot realiza validação autoritativa durante chamadas de aplicação de tabela/esquema, portanto uma escrita ainda pode falhar após uma visualização bem-sucedida.

StarTree Server for Apache Pinot MCP server

Pinot MCP em Ação

Veja o Pinot MCP em ação abaixo:

Buscando Metadados

Pinot MCP fetching metadata

Buscando Dados, seguido de análise

Prompt: Você pode fazer um gráfico de histograma dos eventos do GitHub ao longo do tempo? Pinot MCP fetching data and analyzing table

Prompts de Exemplo

Quando o Claude estiver em execução, clique no ícone de martelo 🛠️ e experimente estes prompts:

  • Você pode me ajudar a analisar meus dados no Pinot? Use a ferramenta Pinot e veja a lista de tabelas para começar.
  • Você pode fazer um gráfico de histograma dos eventos do GitHub ao longo do tempo?

Início Rápido

Pré-requisitos

Instalar uv (se ainda não estiver instalado)

uv é um instalador e resolvedor de pacotes Python rápido, escrito em Rust. Ele foi projetado para ser um substituto direto do pip com desempenho significativamente melhor.

curl -LsSf https://astral.sh/uv/install.sh | sh

# Reload your bashrc/zshrc to take effect. Alternatively, restart your terminal
# source ~/.bashrc

Instalação

# Clone the repository
git clone https://github.com/startreedata/mcp-pinot.git
cd mcp-pinot
uv pip install -e . # Install dependencies

# For development dependencies (including testing tools), use:
# uv pip install -e .[dev] 

Configurar o Cluster Pinot

O servidor MCP espera um arquivo .env no estilo de configuração uvicorn no diretório raiz para configurar a conexão com o cluster Pinot. Este repositório inclui um arquivo .env.example de exemplo que assume uma configuração de início rápido do Pinot.

mv .env.example .env

Referência de Configuração

O servidor carrega configuração de variáveis de ambiente e de um arquivo .env encontrado no diretório de trabalho atual. As variáveis de ambiente do processo têm precedência sobre .env, portanto, configurações de tempo de implantação não podem ser silenciosamente substituídas por um arquivo versionado.

Perfis Comuns

Caso de usoConfigurações necessáriasNotas
Claude DesktopMCP_TRANSPORT=stdioPadrão e recomendado para uso desktop local; nenhum listener HTTP é iniciado.
HTTP LocalMCP_TRANSPORT=http, MCP_HOST=127.0.0.1Perfil web local explícito. Acessível apenas da mesma máquina.
HTTP/HTTPS RemotoMCP_TRANSPORT=http, MCP_HOST=0.0.0.0, MCP_ALLOWED_HOSTS=<host[:port]>, AUTH_PROVIDER=oauth|static|oauth+staticO servidor recusa binds HTTP/HTTPS não-loopback a menos que um provedor de autenticação esteja ativo, e um bind curinga exige uma lista de permissões de Host explícita. Use oauth+static para servir usuários interativos e um backend confiável ao mesmo tempo. Use TLS diretamente ou um proxy reverso autenticado.
Exposição Helmservice.enabled=true, mcp.host=0.0.0.0, mcp.oauth.enabled=trueOs padrões do Helm são somente locais e não renderizam Service a menos que a exposição seja explicitamente habilitada.

Conexão Pinot

VariávelPadrãoDescrição
PINOT_CONTROLLER_URLhttp://localhost:9000Endpoint do controller Pinot usado para operações de metadados e tabela/esquema.
PINOT_BROKER_URLhttp://localhost:8000Endpoint do broker Pinot usado para consultas SQL.
PINOT_BROKER_HOSTAnalisado de PINOT_BROKER_URLSubstituição opcional de host para a conexão do broker.
PINOT_BROKER_PORTAnalisado de PINOT_BROKER_URLSubstituição opcional de porta para a conexão do broker.
PINOT_BROKER_SCHEMEAnalisado de PINOT_BROKER_URLSubstituição opcional de esquema, geralmente http ou https.
PINOT_USERNAME / PINOT_PASSWORDnão definidoAutenticação básica para o Pinot.
PINOT_TOKENnão definidoToken Bearer ou bruto para o Pinot; tem precedência sobre PINOT_TOKEN_FILENAME.
PINOT_TOKEN_FILENAMEnão definidoArquivo contendo um token Pinot. Um arquivo ausente ou vazio registra um aviso e continua sem autenticação por token.
PINOT_DATABASEvazioCabeçalho de banco de dados opcional para implantações Pinot multi-banco.
PINOT_USE_MSQEfalseHabilita a opção de consulta do mecanismo de consulta multi-estágio do Pinot.
PINOT_REQUEST_TIMEOUT60Tempo limite de solicitação HTTP em segundos.
PINOT_CONNECTION_TIMEOUT60Tempo limite de conexão HTTP em segundos.
PINOT_QUERY_TIMEOUT60Tempo limite de consulta SQL em segundos.

Servidor MCP

VariávelPadrãoDescrição
MCP_TRANSPORTstdioModo de transporte. Use stdio para clientes desktop e http para clientes HTTP Streamable.
MCP_HOST127.0.0.1Host de bind HTTP. Defina 0.0.0.0 somente com um provedor de autenticação habilitado.
MCP_PORT8080Porta de escuta HTTP.
MCP_PATH/mcpCaminho HTTP MCP.
MCP_ALLOWED_HOSTShost exato[:porta] de um bind concretoAutoridades de Host separadas por vírgula aceitas no endpoint MCP. Um bind curinga (0.0.0.0, ::) não tem autoridade pública inferível, então o padrão é vazio e o servidor sai na inicialização até que você liste os nomes que os clientes usam, ex.: mcp.example.com,mcp.example.com:443.
MCP_ALLOWED_ORIGINSnão definidoValores de Origin de navegador separados por vírgula aceitos. Vazio rejeita solicitações que enviam Origin enquanto ainda permite clientes que o omitem.
MCP_SSL_KEYFILEnão definidoCaminho da chave privada TLS. Requer MCP_SSL_CERTFILE.
MCP_SSL_CERTFILEnão definidoCaminho do certificado TLS. Requer MCP_SSL_KEYFILE.
MCP_LOG_LEVELINFONível de log do aplicativo: DEBUG, INFO, WARNING, ERROR ou CRITICAL. Os logs vão para stderr para que a saída do protocolo STDIO permaneça válida.
MCP_RATE_LIMIT_RPS / MCP_RATE_LIMIT_BURST10 / 20Limites de taxa e rajada de chamadas de ferramenta por principal (autenticado) ou por peer (HTTP loopback).
MCP_RATE_LIMIT_MAX_CLIENTS10000Máximo de buckets de clientes em memória; buckets menos recentemente usados são removidos.
MCP_RATE_LIMIT_IDLE_TTL_SECONDS600Tempo ocioso antes que um bucket de limite de taxa possa ser removido.
MCP_CONFIRMATION_TTL_SECONDS300Vida útil do token de confirmação, limitada a 30–3600 segundos. Os tokens são vinculados ao processo e falham intencionalmente após reinicialização.

Autenticação

Um provedor de autenticação é necessário antes de vincular HTTP ou HTTPS a um host não-loopback.

VariávelPadrãoDescrição
AUTH_PROVIDERnão definidoProvedor de autenticação ativo: none (padrão), oauth, static ou oauth+static. Algum provedor é necessário antes de um bind não-loopback.
oauth+static aceita tanto um login OIDC quanto o token compartilhado em uma única implantação — o caso hospedado usual, onde pessoas usam um navegador e um backend confiável não pode. Qualquer grafia funciona; o segredo compartilhado é verificado primeiro, e cada credencial mantém seus próprios escopos (MCP_STATIC_SCOPES vs OAUTH_GRANTED_SCOPES).
MCP_STATIC_TOKENvazioSegredo Bearer compartilhado para AUTH_PROVIDER=static — um chamador serviço-a-serviço o envia como Authorization: Bearer <token>. Necessário quando o provedor estático está ativo.
MCP_STATIC_SCOPESpinot:read pinot:write pinot:adminEscopos separados por espaço ou vírgula concedidos ao principal estático. Use pinot:read para um serviço somente leitura.
OAUTH_ENABLEDfalseFlag legado; true é equivalente a AUTH_PROVIDER=oauth. Habilita autenticação OAuth.
OAUTH_CLIENT_IDvazioID do cliente OAuth.
OAUTH_CLIENT_SECRETvazioSegredo do cliente OAuth.
OAUTH_BASE_URLhttp://localhost:8080URL pública base para este servidor MCP.
OAUTH_AUTHORIZATION_ENDPOINTvazioEndpoint de autorização upstream.
OAUTH_TOKEN_ENDPOINTvazioEndpoint de token upstream.
OAUTH_JWKS_URIvazioURI JWKS usado para verificação de token.
OAUTH_ISSUERvazioEmissor de token esperado.
OAUTH_AUDIENCEURI de recurso MCP canônicoPúblico contra o qual os tokens são validados. O padrão é OAUTH_BASE_URL (sem barra final) mais MCP_PATH, que é o que os metadados RFC 9728 anunciam. Defina-o explicitamente quando o provedor emitir um aud diferente — muitos (Dex entre eles) o definem como o ID do cliente; o servidor registra um aviso e honra seu valor.
OAUTH_GRANTED_SCOPESpinot:read pinot:write pinot:adminEscopos Pinot concedidos a todo principal que este provedor autentica, unidos aos escopos que o token já carrega. Necessário porque provedores OIDC de propósito geral emitem um catálogo de escopos fixo e não podem cunhar pinot:*, então sem uma concessão toda chamada de ferramenta de um usuário válido seria negada. Defina como pinot:read para uma implantação somente leitura.
OAUTH_EXTRA_AUTH_PARAMSnão definidoObjeto JSON opcional com parâmetros de autorização adicionais.

Filtragem de Tabelas

VariávelPadrãoDescrição
PINOT_TABLE_FILTER_FILEnão definidoArquivo YAML com padrões glob included_tables. Se configurado e ausente, a inicialização falha.

Veja SECURITY.md para a lista de verificação de exposição em produção e o processo de relato de vulnerabilidades.

Configurar Filtragem de Tabelas (Opcional)

⚠️ Nota de Segurança: Para controle de acesso em produção, use os ACLs nativos de nível de tabela do Pinot (disponíveis desde o Pinot 0.8.0+). A filtragem de tabelas neste servidor MCP é um recurso de conveniência para organizar tabelas e melhorar a experiência do usuário, não uma fronteira de segurança. Ela usa análise SQL de melhor esforço e não deve ser usada como garantia de segurança.

A filtragem de tabelas permite que você controle quais tabelas do Pinot ficam visíveis através do servidor MCP. Isso é útil para:

  • Reduzir Carga Cognitiva: Foque nas tabelas relevantes quando seu cluster Pinot tem centenas ou milhares de tabelas
  • UX Multi-Tenant: Execute múltiplas instâncias do servidor MCP contra o mesmo cluster Pinot, cada uma mostrando diferentes subconjuntos de tabelas para diferentes equipes ou casos de uso
  • Separação de Ambientes: Implante diferentes instâncias do servidor MCP (dev, staging, prod) que mostram apenas tabelas específicas do ambiente
  • Ocultar Tabelas do Sistema: Filtre tabelas internas, de teste ou obsoletas da visão do usuário final

Quando a filtragem de tabelas está habilitada, todas as operações de tabela são filtradas para mostrar apenas as tabelas configuradas.

O Que é Filtrado

A filtragem de tabelas se aplica a todas as operações MCP:

  1. Listagem de Tabelas - Apenas as tabelas configuradas aparecem nas listas de tabelas
  2. Execução de Consultas - Consultas SQL são verificadas para garantir que todas as tabelas referenciadas (em FROM, JOIN, subconsultas, CTEs, etc.) correspondam aos padrões configurados
  3. Operações de Tabela - Operações de acesso direto a tabelas filtram pelo nome da tabela:
    • Obter detalhes, tamanho e metadados da tabela
    • Obter segmentos da tabela e metadados de segmentos
    • Obter detalhes de índices/colunas
    • Obter/atualizar configurações da tabela
  4. Operações de Esquema - Operações de esquema filtram pelo nome do esquema:
    • Obter/criar/atualizar esquemas
    • Criar configurações de tabela

Configuração

Copie o arquivo de configuração de exemplo:

cp table_filters.yaml.example table_filters.yaml

Edite table_filters.yaml para especificar quais tabelas incluir:

included_tables:
  - production_*        # All tables starting with "production_"
  - analytics_events    # Specific table name
  - metrics_*          # All tables starting with "metrics_"

Configure o caminho do arquivo de filtro no seu .env:

PINOT_TABLE_FILTER_FILE=table_filters.yaml

Correspondência de Padrões

O filtro suporta padrões estilo glob usando correspondência padrão de nomes de arquivo Unix:

  • exact_table_name - Corresponde exatamente a esta tabela
  • prefix_* - Corresponde a todas as tabelas que começam com "prefixo_"
  • *_suffix - Corresponde a todas as tabelas que terminam com "_sufixo"
  • *pattern* - Corresponde a todas as tabelas que contêm "padrão"
  • sharded_table_? - Corresponde a tabelas com exatamente um caractere após o sublinhado (ex.: sharded_table_1, sharded_table_a)

Filtragem de Consultas

Quando a filtragem está habilitada, consultas SQL são verificadas antes da execução:

  • Recursos SQL Suportados: Cláusulas FROM, cláusulas JOIN (INNER, LEFT, RIGHT, OUTER, CROSS), subconsultas, CTEs (WITH) e listas de tabelas separadas por vírgula
  • Identificadores Entre Aspas: Suporta nomes de tabela entre aspas duplas ("table name") e entre crases (`nome_da_tabela`)
  • Prefixos de Esquema: Lida com nomes de tabela qualificados por esquema (ex.: database.schema.table)
  • Comentários: Remove comentários SQL antes da verificação

Exemplo de consulta filtrada:

SELECT * FROM allowed_table
JOIN other_table ON allowed_table.id = other_table.id

Erro: Query references unauthorized tables: other_table. Allowed tables: allowed_table, prod_*

Recursos de Configuração

Validação Fail-Fast:

  • ⚠️ Se PINOT_TABLE_FILTER_FILE estiver configurado mas o arquivo não existir, o servidor falhará ao iniciar com um FileNotFoundError
  • Isso evita mostrar acidentalmente todas as tabelas devido a configuração incorreta
  • Arquivos de filtro vazios ou chave included_tables ausente mostrarão todas as tabelas (sem filtragem)

Filtragem Abrangente:

  • Todas as ferramentas MCP que acessam tabelas aplicam filtragem antes da execução
  • Filtragem consistente em todos os pontos de acesso a tabelas
  • Mensagens de erro claras indicam quais tabelas não correspondem aos padrões configurados

Desabilitando a Filtragem de Tabelas

Para desabilitar a filtragem de tabelas, ou:

  1. Remova a variável de ambiente PINOT_TABLE_FILTER_FILE, ou
  2. Não a configure no seu arquivo .env

Quando não configurada, todas as tabelas no cluster Pinot ficam visíveis.

Quando um arquivo de filtro fornece tanto allow_all: true quanto um included_tables não vazio, a lista de permissões explícita tem precedência e o servidor registra um aviso. Aplicar um recarregamento requer o token de um candidato de simulação inalterado.

Aplicação de Consultas Somente Leitura

A ferramenta read_query sempre valida SQL antes de encaminhá-lo ao Pinot. Ela aceita apenas uma instrução, e essa instrução deve ser uma consulta somente leitura SELECT ou WITH ... SELECT. Comentários SQL são removidos, instruções empilhadas com ponto e vírgula são rejeitadas, e palavras-chave de escrita/DDL/administração são bloqueadas.

Configurar Autenticação OAuth (Opcional)

Para habilitar autenticação OAuth, defina as seguintes variáveis de ambiente no seu arquivo .env:

Variáveis obrigatórias (quando OAUTH_ENABLED=true):

  • OAUTH_CLIENT_ID: ID do cliente OAuth
  • OAUTH_CLIENT_SECRET: Segredo do cliente OAuth
  • OAUTH_BASE_URL: URL base do seu servidor MCP
  • OAUTH_AUTHORIZATION_ENDPOINT: URL do endpoint de autorização OAuth
  • OAUTH_TOKEN_ENDPOINT: URL do endpoint de token OAuth
  • OAUTH_JWKS_URI: URI do conjunto de chaves JSON Web para verificação de token
  • OAUTH_ISSUER: Identificador do emissor do token

Variáveis opcionais:

  • OAUTH_AUDIENCE: público contra o qual os tokens são validados. Padrão para a URI canônica do recurso MCP (OAUTH_BASE_URL + MCP_PATH). Defina-o quando seu provedor emitir um aud diferente — por exemplo, um IdP que coloca o ID do cliente lá.
  • OAUTH_GRANTED_SCOPES: escopos do Pinot concedidos a principais autenticados (padrão todos os três). Use pinot:read para tornar a implantação somente leitura para todos os chamadores OIDC.
  • OAUTH_REQUIRED_SCOPES: escopos de linha de base que um token de acesso já deve conter (padrão: nenhum aplicado).
  • OAUTH_EXTRA_AUTH_PARAMS: Parâmetros de autorização adicionais como objeto JSON (ex.: {"scope": "openid profile"})

Autorização em nível de ferramenta usa pinot:read / pinot:write / pinot:admin. Provedores OIDC de propósito geral emitem um catálogo de escopos fixo e não podem cunhar escopos de recurso como estes, então OAUTH_GRANTED_SCOPES é o que permite que um usuário autenticado chame qualquer coisa — restrinja-o em vez de deixar ferramentas sem controle.

Exemplo de configuração:

OAUTH_ENABLED=true
OAUTH_CLIENT_ID=client-id
OAUTH_CLIENT_SECRET=client-secret
OAUTH_BASE_URL=http://localhost:8000
OAUTH_AUTHORIZATION_ENDPOINT=https://example.com/oauth/authorize
OAUTH_TOKEN_ENDPOINT=https://example.com/oauth/token
OAUTH_JWKS_URI=https://example.com/.well-known/jwks.json
OAUTH_ISSUER=https://example.com
OAUTH_AUDIENCE=http://localhost:8000/mcp
OAUTH_EXTRA_AUTH_PARAMS={"scope": "openid profile"}

Executar o servidor

uv --directory . run mcp_pinot/server.py

Você deve ver logs indicando que o servidor está em execução.

Notas de segurança:

  • STDIO é o padrão. Quando HTTP é selecionado, ele vincula a 127.0.0.1; defina MCP_HOST=0.0.0.0 apenas com autenticação OAuth ou token estático mais TLS ou um proxy reverso autenticado.
  • O servidor se recusa a iniciar quando HTTP está vinculado a um host não loopback sem um provedor de autenticação (AUTH_PROVIDER=oauth ou static, ou o legado OAUTH_ENABLED=true).
  • read_query aplica uma única instrução SQL somente leitura antes da execução. Isso é uma proteção, não um substituto para autenticação e autorização do Pinot.
  • A dependência suportada mcp[cli] inclui proteções contra rebinding de DNS para o servidor HTTP Streamable.
  • O estado de reprodução de confirmação e os buckets de limite de taxa são locais ao processo. Execute exatamente um processo de servidor/réplica Helm. O chart rejeita replicas != 1; escalonamento horizontal requer uma implementação de armazenamento de estado compartilhado.
  • /readyz reporta prontidão do processo MCP, não saúde do cluster Pinot. Use test_connection para diagnosticar dependências do Pinot.

Iniciar Pinot Quickstart (Opcional)

Inicie o Pinot QuickStart usando docker:

docker run --name pinot-quickstart -p 2123:2123 -p 9000:9000 -p 8000:8000 -d apachepinot/pinot:1.5.1 QuickStart -type batch

Consultar o Servidor MCP

uv --directory . run examples/example_client.py

Este quickstart apenas verifica todas as ferramentas e consulta a tabela airlineStats.

Integração com Claude Desktop

Abrir o arquivo de configuração do Claude

vi ~/Library/Application\ Support/Claude/claude_desktop_config.json

Adicionar uma entrada de servidor MCP

{
  "mcpServers": {
      "pinot_mcp": {
          "command": "/path/to/uv",
          "args": [
              "--directory",
              "/path/to/mcp-pinot-repo",
              "run",
              "mcp_pinot/server.py"
          ],
          "env": {
            // You can also include your .env config here
          }
      }
  }
}

Substitua /path/to/uv pelo caminho absoluto para o comando uv; você pode executar which uv para descobri-lo.

Substitua /path/to/mcp-pinot pelo caminho absoluto para a pasta onde você clonou este repositório.

Nota: você deve usar transporte stdio ao executar seu servidor para usar com o Claude desktop.

Você também pode configurar variáveis de ambiente aqui em vez do arquivo .env, caso queira conectar a múltiplos clusters Pinot como servidores MCP.

Reiniciar o Claude Desktop

O Claude agora iniciará automaticamente o servidor MCP na inicialização e reconhecerá as novas ferramentas baseadas no Pinot.

Usando o Pacote MCP

O fluxo de trabalho de release publica um Pacote MCP do Claude Desktop (.mcpb). Seu runtime UV instala as dependências bloqueadas para a plataforma do usuário, então um pequeno pacote funciona em macOS, Linux e Windows. Para construir um localmente:

npm install -g @anthropic-ai/mcpb@2.1.2
mcpb validate manifest.json
mcpb pack

Abra o arquivo .mcpb resultante para instalá-lo no Claude Desktop.

Segurança e Relatório de Vulnerabilidades

Veja SECURITY.md para instruções de relatório de vulnerabilidades, categorias de segurança e a lista de verificação para expor com segurança o endpoint HTTP MCP.

Desenvolvedor

  • Definições de ferramentas MCP estão em mcp_pinot/server.py; operações HTTP/DB do Pinot estão em mcp_pinot/pinot_client.py.

Build

Construa o projeto com

uv sync --frozen

Teste

Teste o repositório com:

uv run pytest --cov=mcp_pinot

Construir a imagem Docker

docker build -t mcp-pinot .

Executar o contêiner

docker run --rm -i -v "$(pwd)/.env:/app/config/.env:ro" mcp-pinot

Isso usa o transporte STDIO padrão. Para implantações HTTP/Kubernetes, configure um provedor de autenticação de entrada antes de vincular a um endereço não loopback; veja as seções de configuração e Helm acima.