Pinot MCP Server
Um servidor MCP para interagir com Apache Pinot, um datastore OLAP distribuído em tempo real.
Documentação
Servidor MCP Pinot
Sumário
- Visão Geral
- Recursos
- Início Rápido
- Referência de Configuração
- Build Docker
- Integração com Claude Desktop
- Experimente um Prompt
- Segurança e Relato de Vulnerabilidades
- Notas para Desenvolvedores
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 oconfirmation_tokende 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_schemaeget_table_configde 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.
| Ferramenta | Propósito |
|---|---|
test_connection | Diagnosticar conectividade de broker, controller e consultas. |
list_tables | Listar nomes visíveis de tabelas Pinot. |
get_schema | Obter o esquema de colunas de uma tabela. |
get_table_config | Obter a configuração de indexação e ingestão de uma tabela. |
get_table_size | Obter o tamanho de armazenamento relatado e estimado de uma tabela. |
list_segments | Listar nomes exatos de segmentos de uma tabela. |
list_segment_metadata | Paginar pelos metadados dos segmentos de uma tabela. |
get_segment_index_metadata | Inspecionar índices por coluna de um segmento exato. |
read_query | Executar uma consulta SQL Pinot somente leitura. |
create_schema / update_schema | Visualizar ou aplicar alterações de esquema. |
create_table_config / update_table_config | Visualizar ou aplicar alterações de configuração de tabela. |
reload_table_filters | Visualizar 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.
Pinot MCP em Ação
Veja o Pinot MCP em ação abaixo:
Buscando Metadados

Buscando Dados, seguido de análise
Prompt:
Você pode fazer um gráfico de histograma dos eventos do GitHub ao longo do tempo?

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 uso | Configurações necessárias | Notas |
|---|---|---|
| Claude Desktop | MCP_TRANSPORT=stdio | Padrão e recomendado para uso desktop local; nenhum listener HTTP é iniciado. |
| HTTP Local | MCP_TRANSPORT=http, MCP_HOST=127.0.0.1 | Perfil web local explícito. Acessível apenas da mesma máquina. |
| HTTP/HTTPS Remoto | MCP_TRANSPORT=http, MCP_HOST=0.0.0.0, MCP_ALLOWED_HOSTS=<host[:port]>, AUTH_PROVIDER=oauth|static|oauth+static | O 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 Helm | service.enabled=true, mcp.host=0.0.0.0, mcp.oauth.enabled=true | Os 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ável | Padrão | Descrição |
|---|---|---|
PINOT_CONTROLLER_URL | http://localhost:9000 | Endpoint do controller Pinot usado para operações de metadados e tabela/esquema. |
PINOT_BROKER_URL | http://localhost:8000 | Endpoint do broker Pinot usado para consultas SQL. |
PINOT_BROKER_HOST | Analisado de PINOT_BROKER_URL | Substituição opcional de host para a conexão do broker. |
PINOT_BROKER_PORT | Analisado de PINOT_BROKER_URL | Substituição opcional de porta para a conexão do broker. |
PINOT_BROKER_SCHEME | Analisado de PINOT_BROKER_URL | Substituição opcional de esquema, geralmente http ou https. |
PINOT_USERNAME / PINOT_PASSWORD | não definido | Autenticação básica para o Pinot. |
PINOT_TOKEN | não definido | Token Bearer ou bruto para o Pinot; tem precedência sobre PINOT_TOKEN_FILENAME. |
PINOT_TOKEN_FILENAME | não definido | Arquivo contendo um token Pinot. Um arquivo ausente ou vazio registra um aviso e continua sem autenticação por token. |
PINOT_DATABASE | vazio | Cabeçalho de banco de dados opcional para implantações Pinot multi-banco. |
PINOT_USE_MSQE | false | Habilita a opção de consulta do mecanismo de consulta multi-estágio do Pinot. |
PINOT_REQUEST_TIMEOUT | 60 | Tempo limite de solicitação HTTP em segundos. |
PINOT_CONNECTION_TIMEOUT | 60 | Tempo limite de conexão HTTP em segundos. |
PINOT_QUERY_TIMEOUT | 60 | Tempo limite de consulta SQL em segundos. |
Servidor MCP
| Variável | Padrão | Descrição |
|---|---|---|
MCP_TRANSPORT | stdio | Modo de transporte. Use stdio para clientes desktop e http para clientes HTTP Streamable. |
MCP_HOST | 127.0.0.1 | Host de bind HTTP. Defina 0.0.0.0 somente com um provedor de autenticação habilitado. |
MCP_PORT | 8080 | Porta de escuta HTTP. |
MCP_PATH | /mcp | Caminho HTTP MCP. |
MCP_ALLOWED_HOSTS | host exato[:porta] de um bind concreto | Autoridades 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_ORIGINS | não definido | Valores 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_KEYFILE | não definido | Caminho da chave privada TLS. Requer MCP_SSL_CERTFILE. |
MCP_SSL_CERTFILE | não definido | Caminho do certificado TLS. Requer MCP_SSL_KEYFILE. |
MCP_LOG_LEVEL | INFO | Ní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_BURST | 10 / 20 | Limites de taxa e rajada de chamadas de ferramenta por principal (autenticado) ou por peer (HTTP loopback). |
MCP_RATE_LIMIT_MAX_CLIENTS | 10000 | Máximo de buckets de clientes em memória; buckets menos recentemente usados são removidos. |
MCP_RATE_LIMIT_IDLE_TTL_SECONDS | 600 | Tempo ocioso antes que um bucket de limite de taxa possa ser removido. |
MCP_CONFIRMATION_TTL_SECONDS | 300 | Vida ú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ável | Padrão | Descrição |
|---|---|---|
AUTH_PROVIDER | não definido | Provedor 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_TOKEN | vazio | Segredo 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_SCOPES | pinot:read pinot:write pinot:admin | Escopos separados por espaço ou vírgula concedidos ao principal estático. Use pinot:read para um serviço somente leitura. |
OAUTH_ENABLED | false | Flag legado; true é equivalente a AUTH_PROVIDER=oauth. Habilita autenticação OAuth. |
OAUTH_CLIENT_ID | vazio | ID do cliente OAuth. |
OAUTH_CLIENT_SECRET | vazio | Segredo do cliente OAuth. |
OAUTH_BASE_URL | http://localhost:8080 | URL pública base para este servidor MCP. |
OAUTH_AUTHORIZATION_ENDPOINT | vazio | Endpoint de autorização upstream. |
OAUTH_TOKEN_ENDPOINT | vazio | Endpoint de token upstream. |
OAUTH_JWKS_URI | vazio | URI JWKS usado para verificação de token. |
OAUTH_ISSUER | vazio | Emissor de token esperado. |
OAUTH_AUDIENCE | URI de recurso MCP canônico | Pú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_SCOPES | pinot:read pinot:write pinot:admin | Escopos 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_PARAMS | não definido | Objeto JSON opcional com parâmetros de autorização adicionais. |
Filtragem de Tabelas
| Variável | Padrão | Descrição |
|---|---|---|
PINOT_TABLE_FILTER_FILE | não definido | Arquivo 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:
- Listagem de Tabelas - Apenas as tabelas configuradas aparecem nas listas de tabelas
- 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
- 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
- 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 tabelaprefix_*- 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_FILEestiver configurado mas o arquivo não existir, o servidor falhará ao iniciar com umFileNotFoundError - Isso evita mostrar acidentalmente todas as tabelas devido a configuração incorreta
- Arquivos de filtro vazios ou chave
included_tablesausente 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:
- Remova a variável de ambiente
PINOT_TABLE_FILTER_FILE, ou - 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 OAuthOAUTH_CLIENT_SECRET: Segredo do cliente OAuthOAUTH_BASE_URL: URL base do seu servidor MCPOAUTH_AUTHORIZATION_ENDPOINT: URL do endpoint de autorização OAuthOAUTH_TOKEN_ENDPOINT: URL do endpoint de token OAuthOAUTH_JWKS_URI: URI do conjunto de chaves JSON Web para verificação de tokenOAUTH_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 umauddiferente — 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). Usepinot:readpara 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; definaMCP_HOST=0.0.0.0apenas 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=oauthoustatic, ou o legadoOAUTH_ENABLED=true).read_queryaplica 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./readyzreporta prontidão do processo MCP, não saúde do cluster Pinot. Usetest_connectionpara 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 emmcp_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.