loggly-mcp
Read-only Model Context Protocol (MCP) server for Loggly `/apiv2/*` APIs, plus IP intelligence (RDAP, GreyNoise, AbuseIPDB). Exposes Loggly search/analytics/field tools, aggregation-first traffic tools, and IP-context tools
Documentação
Loggly MCP
Servidor Model Context Protocol (MCP) somente leitura para as APIs /apiv2/* do Loggly, além de inteligência de IP (RDAP, GreyNoise, AbuseIPDB). Expõe ferramentas de busca/análise/campos do Loggly, ferramentas de tráfego com agregação em primeiro lugar e ferramentas de contexto de IP, bloqueando endpoints de escrita.
Uso de Habilidades
Para recuperação eficiente de logs (menos uso de tokens) e sumarização, combine este servidor com uma habilidade.
Início Rápido
Instalar via npm
LOGGLY_SUBDOMAIN=your-subdomain LOGGLY_TOKEN=your-token npx -y @andrewbabu/loggly-mcp
Configuração do cliente MCP:
{
"mcpServers": {
"loggly": {
"command": "npx",
"args": ["-y", "@andrewbabu/loggly-mcp"],
"env": {
"LOGGLY_SUBDOMAIN": "your-subdomain",
"LOGGLY_TOKEN": "your-token"
}
}
}
}
Executar a partir do código-fonte
git clone https://github.com/andrewbabu/loggly-mcp.git
cd loggly-mcp
npm install
cp .env.example .env
Edite .env com suas credenciais do Loggly e execute:
npm start
Depois que o repositório for confiável no Codex, o servidor MCP também pode ser iniciado automaticamente via .codex/config.toml.
Configuração
O servidor carrega .env do seu diretório de trabalho na inicialização.
Obrigatório
LOGGLY_SUBDOMAIN
Subdomínio da conta Loggly ou URL completa do Loggly (ex.:your-subdomainouhttps://your-subdomain.loggly.com)LOGGLY_TOKEN
Token da API Loggly
Opcional
LOGGLY_AUTH_MODE
bearer(padrão) oubasicLOGGLY_MAX_RETRIES
Padrão:2LOGGLY_REQUEST_TIMEOUT_MS
Padrão:15000LOGGLY_LOG_LEVEL
error,warn,info(padrão) oudebug
Servidor Remoto (HTTP)
Para um servidor stdio que qualquer pessoa da equipe possa acessar pelo Claude Code sem um checkout local, execute a variante HTTP e hospede-a em um servidor/VM interno.
cp .env.example .env
Edite .env com suas credenciais do Loggly e também MCP_BEARER_TOKEN (gere um com node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"), depois:
npm run start:http
Isso inicia um servidor MCP HTTP Streamable sem estado em MCP_HTTP_PORT (padrão 8787):
GET /healthz— verificação de atividade sem autenticação.POST /mcp— o endpoint MCP. RequerAuthorization: Bearer <MCP_BEARER_TOKEN>; qualquer outra solicitação para/mcprecebe401.
As credenciais do Loggly permanecem no lado do servidor — todos que se conectam compartilham o mesmo acesso à conta Loggly. MCP_BEARER_TOKEN apenas controla o acesso ao próprio servidor MCP, então trate-o como um segredo e rotacione-o se vazar (ex.: gere novamente e redistribua).
Execute isso apenas atrás da sua rede/VPN interna, não exponha diretamente à internet pública — há um único token compartilhado, não autenticação por usuário.
Conectando pelo Claude Code
Cada membro da organização adiciona o servidor remoto uma vez:
claude mcp add --transport http loggly https://your-internal-host:8787/mcp \
--header "Authorization: Bearer <MCP_BEARER_TOKEN>"
Substitua pelo hostname/porta interno que você implantou e o token que recebeu.
Executando com Docker
docker build -t loggly-mcp .
docker run -d --name loggly-mcp -p 8787:8787 --env-file .env loggly-mcp
Múltiplas Contas / Domínios
O servidor pode armazenar credenciais para várias contas Loggly (subdomínios diferentes, tokens diferentes) ao mesmo tempo e direcioná-las por chamada de ferramenta.
Defina LOGGLY_ACCOUNTS como um objeto JSON que mapeia um nome de conta para suas credenciais:
LOGGLY_ACCOUNTS={"acme":{"subdomain":"acme","token":"acme_token","authMode":"bearer"},"beta":{"subdomain":"beta","token":"beta_token"}}
Quando LOGGLY_ACCOUNTS está definido, ele substitui LOGGLY_SUBDOMAIN/LOGGLY_TOKEN/LOGGLY_AUTH_MODE. Cada ferramenta então aceita um argumento opcional account (ex.: account: "acme") para escolher quais credenciais de conta usar para essa chamada.
- Se
accountfor omitido, o servidor usaLOGGLY_DEFAULT_ACCOUNTse definido, caso contrário"default", caso contrário a única conta configurada se houver apenas uma. - Um valor desconhecido de
accountretorna um erro listando os nomes das contas configuradas. iterate_events_nexttambém pode inferir a conta a partir do hostnext_urlquandoaccounté omitido, desde que exatamente uma conta configurada corresponda a esse host.
Configurações existentes de conta única (apenas LOGGLY_SUBDOMAIN/LOGGLY_TOKEN) continuam funcionando sem alterações — elas são tratadas como uma conta chamada "default".
Ferramentas de Tráfego com Agregação em Primeiro Lugar
Despejos de eventos brutos são lentos e caros para raciocinar. Essas ferramentas retornam um resumo — totais, detalhamentos top-N, uma linha do tempo em intervalos e uma pequena amostra representativa — em vez disso:
search_logs— a versão de uso geral: consulta + intervalo de tempo na entrada, resumo agregado na saída.traffic_by_ip/traffic_by_host/traffic_by_path— mesma agregação, pré-escopada para um IP/hostname/caminho.group_by_ip/group_by_path/group_by_user_agent— apenas contagens de facetas (wrappers finos sobrefield_facets), para quando você só precisa de um detalhamento, não do agregado completo.timeline— contagens em intervalos ao longo de um período, calculadas no lado do cliente via chamadas repetidas de/apiv2/events/count(o endpointvolume-metricsdo Loggly não aceita uma consulta de texto livre, então esta é a única maneira de obter uma linha do tempo para uma busca arbitrária).sample_events— um punhado de eventos brutos representativos, quando você precisa de exemplos em vez do conjunto completo de resultados.
A nomeação de campos depende de como cada fonte do Loggly analisa seus logs e pode diferir entre contas e até mesmo entre tags dentro de uma conta — então essas ferramentas resolvem nomes de campos primeiro pela descoberta: para qualquer papel não explicitamente sobrescrito (argumentos host_field/path_field/status_field/user_agent_field/ip_field, ou as variáveis de ambiente LOGGLY_FIELD_HOST/_PATH/_STATUS/_USER_AGENT/_IP), elas verificam /apiv2/fields/ para a consulta real e correspondem candidatos contra padrões de papel conhecidos:
- Exatamente uma correspondência → usada automaticamente, relatada sob
discovered_fieldsno resultado. - Múltiplas correspondências plausíveis (ex.: uma fonte com ambos
ClientIpeCustIP) → nunca adivinhado entre elas — relatado sobambiguous_fieldsem vez disso, recorrendo ao padrão configurado. Passe a correta explicitamente via o argumento*_fieldcorrespondente. - Nenhuma correspondência → recorre ao padrão configurado (
host,path,status,user_agent,ip).
Execute list_fields você mesmo se quiser ver todos os candidatos antes de decidir sobre uma sobrescrita.
Inteligência de IP
rdap_lookup— propriedade de IP/registro de rede (RIR, netblock, org, país) via RDAP público (rdap.org). Nenhuma chave de API necessária.ip_reputation— GreyNoise (ruído de varredura em toda a internet) + AbuseIPDB (relatórios de abuso da comunidade) para um IP. RequerGREYNOISE_API_KEY/ABUSEIPDB_API_KEY; se um deles estiver ausente, apenas retorna comoavailable: falsepara essa fonte, não um erro.get_ip_context— combina tudo acima com tráfego do Loggly (contagens 1h/24h/30d, primeira/última vez visto, hosts, principais caminhos) verificado em cada conta Loggly configurada, a menos queaccountseja fornecido, e sinalizacross_domain_correlationquando o IP mostra atividade em mais de uma conta. De acordo com o playbookbot-traffic-triage, esse padrão entre domínios é o sinal mais forte para distinguir reconhecimento direcionado de ruído de fundo.
Trate toda a saída de inteligência de IP como uma entrada entre várias — dados de identidade/reputação (quem possui um IP, relatórios de scanners de terceiros) devem ter menos peso do que evidências comportamentais dos seus próprios logs. Veja a habilidade bot-traffic-triage para a metodologia completa de investigação.
Registro de Logs
Os logs são gravados em stderr para evitar interferência com o tráfego stdio do MCP.
Use LOGGLY_LOG_LEVEL para controlar a verbosidade. O padrão é info.
Timeouts, Repetições e Concorrência
As solicitações impõem um timeout por chamada de LOGGLY_REQUEST_TIMEOUT_MS (padrão 15000).
Falhas transitórias (429, 500 com corpo semelhante a timeout, 503, 504 ou timeouts de rede) são repetidas até LOGGLY_MAX_RETRIES vezes, respeitando um cabeçalho Retry-After em 429 quando o Loggly envia um, recorrendo a backoff exponencial caso contrário.
As ferramentas de agregação (search_logs, traffic_by_*, get_ip_context, etc.) distribuem várias solicitações por chamada via Promise.all (facetas + intervalos de linha do tempo + uma amostra). LOGGLY_MAX_CONCURRENT_REQUESTS (padrão 4) limita quantas dessas são executadas ao mesmo tempo por conta, para que a distribuição não dispare o limite de taxa do próprio Loggly por si só. Se você ainda vir 429s de uma única chamada de agregação, diminua isso; se o limite do Loggly for mais generoso, aumente.
Manifesto de Ferramentas
Os metadados das ferramentas são armazenados em tool-manifest.json e verificados contra src/server.js.
npm run verify:manifest
Teste de Fumaça
O teste de fumaça é executado sem credenciais do Loggly definindo LOGGLY_SMOKE_TEST=1.
npm run smoke
Ferramentas MCP Implementadas
Wrappers de API Loggly de baixo nível:
connection_testcreate_searchget_eventssearch_and_get_eventsiterate_events_pageiterate_events_nextcount_eventsvolume_metricsstats_querylist_fieldsfield_facetsraw_api_call
Ferramentas de tráfego com agregação em primeiro lugar:
search_logstraffic_by_iptraffic_by_hosttraffic_by_pathgroup_by_ipgroup_by_pathgroup_by_user_agenttimelinesample_events
Inteligência de IP:
rdap_lookupip_reputationget_ip_context
Exemplos
Exemplos de payloads de argumentos de ferramentas estão em examples/.
Desenvolvimento
npm test
npm test executa a verificação do manifesto e o teste de fumaça. O CI executa as mesmas verificações em .github/workflows/ci.yml.
Versionamento
VERSIONcontém a versão atual da release.CHANGELOG.mdrastreia mudanças por release.
Notas de Segurança
- Arquivos
.envnunca devem ser commitados. - Tokens e chaves de API (
LOGGLY_TOKEN,LOGGLY_ACCOUNTS,GREYNOISE_API_KEY,ABUSEIPDB_API_KEY,MCP_BEARER_TOKEN) são tratados como segredos. - Este servidor impõe acesso somente leitura aos endpoints
/apiv2/*do Loggly. Chamadas de inteligência de IP (RDAP/GreyNoise/AbuseIPDB) são solicitações GET somente leitura para esses serviços de terceiros; nenhuma credencial do Loggly é enviada a eles, e nenhuma chave de inteligência de IP é enviada ao Loggly.