NFT Log Analyser

Servidor MCP de análise de logs com IA. Escaneia arquivos de log locais de mais de 500MB, analisa erros com agentes Ollama + CrewAI e cria automaticamente Issues estruturadas no GitHub. 100% local — nenhum log sai da sua máquina.

Documentação

🔍 NFT Log Analyzer

Análise de logs com IA que abre Issues no GitHub automaticamente — 100% local via Ollama, zero dados saem da sua máquina.

Python Ollama MCP License


O Que Ele Faz

Aponte para qualquer arquivo de log e ele vai:

  1. Escanear arquivos de 500MB+ em segundos usando ripgrep
  2. Analisar padrões de erro, deduplicar eventos repetidos
  3. Processar usando LLM local (Ollama + deepseek-r1:14b) via agentes CrewAI
  4. Criar Issues estruturadas no GitHub com causa raiz e correções sugeridas
  5. Abrir Issues automaticamente no seu repositório — ignorando duplicatas

Todo o processamento acontece localmente na sua máquina. O conteúdo bruto dos logs nunca sai do seu sistema.


Arquitetura

Claude Desktop / Cursor / LangChain
         ↓  MCP (stdio or HTTP+SSE)
   MCP Log Analyzer Server
         ↓
   ripgrep pre-filter (2-4s on 500MB)
         ↓
   mmap streaming parser + deduplicator
         ↓
   CrewAI agents → Ollama (local LLM)
         ↓
   GitHub Issues API

Requisitos

RequisitoVersãoObservações
Python3.11+3.14 não suportado
OllamaMais recentebrew install ollama
deepseek-r1:14bDownload de ~9GB
ripgrepMais recentebrew install ripgrep
RAMMínimo 16GB32GB recomendado
macOSVentura 13+Apple Silicon recomendado

Início Rápido

1. Instalar dependências do sistema

brew install ollama ripgrep
brew services start ollama
ollama pull deepseek-r1:14b   # ~9GB — start this first

2. Clonar e configurar o ambiente Python

git clone https://github.com/YOUR_ORG/mcp-log-analyzer
cd mcp-log-analyzer

/opt/homebrew/bin/python3.11 -m venv .venv
source .venv/bin/activate

pip install --upgrade pip
pip install mcp "crewai>=0.80.0" crewai-tools langchain-ollama \
    litellm fastapi uvicorn httpx httpx-sse \
    structlog loguru pydantic python-dotenv \
    tenacity rich typer

3. Configurar o ambiente

cp .env.example .env
nano .env   # fill in your values
GITHUB_PAT=ghp_your_token_here
GITHUB_REPO_OWNER=your-username
GITHUB_REPO_NAME=your-repo
OLLAMA_BASE_URL=http://localhost:11434
OLLAMA_MODEL=deepseek-r1:14b
CREWAI_TELEMETRY_OPT_OUT=true
OTEL_SDK_DISABLED=true
OLLAMA_KEEP_ALIVE=-1

4. Criar um PAT no GitHub

Acesse: github.com → Settings → Developer settings → Personal access tokens → Tokens (classic)

Habilite o escopo: repo (completo)

5. Registrar no Claude Desktop

Adicione em ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "mcp-log-analyzer": {
      "command": "/path/to/mcp-log-analyzer/.venv/bin/python",
      "args": ["/path/to/mcp-log-analyzer/mcp_server/server.py"],
      "env": {
        "GITHUB_PAT": "ghp_your_token",
        "GITHUB_REPO_OWNER": "your-username",
        "GITHUB_REPO_NAME": "your-repo",
        "OLLAMA_BASE_URL": "http://localhost:11434",
        "OLLAMA_MODEL": "deepseek-r1:14b"
      }
    }
  }
}

Reinicie o Claude Desktop. Você deve ver o ícone de ferramentas 🔨 aparecer.


Uso

Via Claude Desktop (linguagem natural)

analyze the log file at /var/log/app.log and file GitHub issues for any errors
use analyze_log_file with path="/var/log/app.log" dry_run=true
check status of job abc12345

Via CLI Python

source .venv/bin/activate

python3 -c "
from dotenv import load_dotenv
load_dotenv()
from mcp_server.tools.analyze_tool import analyze_log_file
import asyncio, json

result = asyncio.run(analyze_log_file({
    'path': '/var/log/app.log',
    'severity': 'ERROR',
    'dry_run': False
}))
print(result[0].text)
"

Referência das Ferramentas MCP

ping

Verificação de saúde — confirma que o servidor e o Ollama estão rodando.

{}

Retorna: "mcp-log-analyzer online — Ollama: deepseek-r1:14b"


analyze_log_file

Inicia análise assíncrona de logs. Retorna um ID de job imediatamente — o pipeline roda em segundo plano.

ParâmetroTipoObrigatórioPadrãoDescrição
pathstringCaminho absoluto do arquivo de log
severitystringERRORSeveridade mínima: WARN, ERROR, CRITICAL
dry_runbooleanfalseVisualizar Issues sem abrir no GitHub

Retorna:

{
  "job_id": "abc12345",
  "status": "started",
  "message": "Analysis started. Check progress with get_job_status('abc12345')."
}

get_job_status

Verifica o status de um job de análise em andamento.

ParâmetroTipoObrigatórioDescrição
job_idstringID do job retornado por analyze_log_file

Retorna (em execução):

{
  "status": "running",
  "job_id": "abc12345",
  "lines_filtered": 487,
  "chunks": 1
}

Retorna (concluído):

{
  "status": "done",
  "job_id": "abc12345",
  "lines_filtered": 487,
  "unique_events": 4,
  "chunks": 1,
  "issues_filed": 2,
  "github_issues": [
    {
      "title": "[CRITICAL][minting-service] DB connection pool exhausted (x117)",
      "url": "https://github.com/your-org/your-repo/issues/42",
      "number": 42
    }
  ]
}

Clientes MCP Compatíveis

ClienteTransporteConfiguração
Claude Desktopstdioclaude_desktop_config.json
Claude Code CLIstdio.mcp.json na raiz do projeto
Cursorstdio ou HTTP+SSE.cursor/mcp.json
LangChainHTTP+SSEurl: http://localhost:8000/sse
n8nHTTP+SSENó HTTP Request → SSE

Transporte HTTP+SSE (para Cursor, LangChain, n8n)

python mcp_server/server.py --transport sse --port 8000

Personalização com Skills

Skills são arquivos .md em inglês simples que ensinam os agentes sobre os padrões de erro da sua stack. Três skills integradas acompanham o projeto:

SkillFinalidade
skills/nft-app-errors.skill.mdClassificação de erros NFT/blockchain
skills/infrastructure-errors.skill.mdClassificação de erros de infraestrutura
skills/bug-composition.skill.mdRegras de formato de Issues no GitHub

Escrevendo sua própria skill

Crie skills/my-stack-errors.skill.md:

# My Stack Error Classification

## CRITICAL — file bug immediately
- "FATAL: database connection refused" = service down
- "out of memory" = process crash imminent

## HIGH — file bug, non-urgent  
- "connection timeout" on external API = degraded performance

## IGNORE — known false positives
- "reconnecting..." during deploys = expected

Depois carregue em agents/crew.py:

_load_skill("my-stack-errors.skill.md")

Detalhes Internos do Pipeline

500MB log file
    ↓  ripgrep (2-4 seconds)
    ↓  Filters: ERROR|FATAL|CRITICAL|WARN|Exception|Traceback
~5MB of error lines
    ↓  mmap streaming parser
    ↓  LogEvent objects with timestamp, level, component, message
    ↓  Deduplicator (fingerprints strip req_id, numbers, hex)
4-20 unique error patterns
    ↓  Chunker (10 events per chunk, CRITICAL first)
1-3 chunks
    ↓  Single CrewAI agent → Ollama (local)
    ↓  Structured bug reports in markdown
    ↓  Title extractor + label classifier
    ↓  Duplicate check via GitHub search API
GitHub Issues filed

Desempenho

Testado em Apple Silicon (M2, 32GB):

Tamanho do arquivoTempo de filtragemTempo de análiseTotal
10MB<1s3-5 min~5 min
100MB1-2s3-5 min~7 min
500MB3-5s5-10 min~15 min

O tempo de análise depende do número de padrões de erro únicos encontrados (não do tamanho do arquivo).


Solução de Problemas

SintomaCorreção
ollama ps aparece vazioExecute ollama run deepseek-r1:14b e depois /bye para aquecer o modelo
Servidor MCP desconectado no Claude DesktopVerifique ~/Library/Logs/Claude/mcp-server-*.log para erros de Python
Issues filed: 0Confirme que GITHUB_PAT em claude_desktop_config.json é um token real, não um placeholder
Timeout após 600sAdicione OLLAMA_KEEP_ALIVE=-1 em .env e reinicie o Ollama
Falha na instalação de crewaiRequer Python 3.11 — não é compatível com 3.13/3.14
Permissão negada em /usr/local/binUse /opt/homebrew/bin/ no Apple Silicon

Roadmap

v1 (atual)

  • Ingestão local de logs do sistema de arquivos
  • Pipeline ripgrep + mmap
  • Análise CrewAI com agente único
  • Abertura de Issues no GitHub com deduplicação
  • Claude Desktop + transporte MCP stdio

v2 (planejado)

  • Integração MCP com Datadog
  • Integração MCP com Splunk
  • Transporte HTTP+SSE (Cursor, LangChain, n8n)
  • Gatilhos de análise agendados
  • Processamento paralelo de blocos
  • Painel web para histórico de jobs

Contribuindo

Contribuições são bem-vindas — especialmente novos arquivos de skill para diferentes stacks.

  1. Faça um fork do repositório
  2. Crie skills/your-stack-errors.skill.md
  3. Teste com um arquivo de log real
  4. Abra um PR com exemplo de saída

Licença

MIT — veja LICENSE