Second Opinion

Revise commits e bases de código usando LLMs externos como OpenAI, Google Gemini e Mistral.

Documentação

Second Opinion 🔍

Um servidor MCP (Model Context Protocol) que auxilia o Claude Code na revisão de commits e bases de código. Esta ferramenta utiliza LLMs externos (OpenAI, Google Gemini, Ollama, Mistral) para fornecer recursos inteligentes de revisão de código, análise de git diff, avaliação de qualidade de commits e análise de trabalho não commitado.

Recursos

  • Análise de Git Diff: Analise a saída do git diff para entender alterações de código usando LLMs
  • Revisão de Código: Revise código quanto à qualidade, segurança e boas práticas com assistência de IA
  • Análise de Commits: Analise commits git quanto à qualidade e adesão às boas práticas
  • Análise de Trabalho Não Commitado: Analise todas as alterações não commitadas ou apenas as alterações em staged
  • Informações do Repositório: Obtenha informações sobre repositórios git
  • Suporte a Múltiplos LLMs: Funciona com OpenAI, Google Gemini, Ollama (local) e Mistral AI
  • 🚀 Otimização Inteligente: Alocação dinâmica de tokens e ajuste de temperatura específico por tarefa
  • ⚡ Ajuste de Desempenho: Otimizações específicas por provedor e particionamento consciente de memória
  • Segurança: Validação de entrada, manipulação segura de caminhos e proteção de chaves de API
  • Segurança de Memória: Limites de memória configuráveis e suporte a streaming para diffs grandes

Instalação

Pré-requisitos

  • Go 1.20 ou superior
  • Git
  • Aplicativo de desktop Claude Code

Compilar a partir do código-fonte

  1. Clone o repositório:
git clone https://github.com/dshills/second-opinion.git
cd second-opinion
  1. Instale as dependências:
go mod tidy
  1. Compile o servidor:
go build -o bin/second-opinion

Configuração

O Second Opinion suporta dois métodos de configuração, com a seguinte ordem de prioridade:

  1. Arquivo de Configuração JSON (preferido): ~/.second-opinion.json no seu diretório pessoal
  2. Variáveis de Ambiente: Usando o arquivo .env ou variáveis de ambiente do sistema

Configuração JSON (Recomendada)

Crie um arquivo .second-opinion.json no seu diretório pessoal:

{
  "default_provider": "openai",
  "temperature": 0.3,
  "max_tokens": 4096,
  "server_name": "Second Opinion 🔍",
  "server_version": "1.0.0",
  "openai": {
    "api_key": "sk-your-openai-api-key",
    "model": "gpt-5-mini"
  },
  "google": {
    "api_key": "your-google-api-key",
    "model": "gemini-2.0-flash-exp"
  },
  "ollama": {
    "endpoint": "http://localhost:11434",
    "model": "devstral:latest"
  },
  "mistral": {
    "api_key": "your-mistral-api-key",
    "model": "mistral-small-latest"
  },
  "memory": {
    "max_diff_size_mb": 10,
    "max_file_count": 1000,
    "max_line_length": 1000,
    "enable_streaming": true,
    "chunk_size_mb": 1
  }
}

🚀 Recursos de Otimização Inteligente:

  • Alocação Dinâmica de Tokens: Ajusta automaticamente os tokens (4096-32768) com base no tamanho do diff
  • Temperatura Específica por Tarefa: Otimiza a temperatura (0.1-0.3) com base no tipo de análise
  • Otimização por Provedor: Parâmetros personalizados para cada provedor de LLM
  • Gerenciamento de Memória: Particionamento automático para diffs grandes e alta contagem de arquivos

Configuração por Variáveis de Ambiente

Se nenhuma configuração JSON for encontrada, o servidor recorre às variáveis de ambiente:

  1. Copie o arquivo de exemplo de ambiente:
cp .env.example .env
  1. Edite o .env e configure seus provedores de LLM:
# Set your default provider
DEFAULT_PROVIDER=openai  # or google, ollama, mistral

# Configure each provider with its own API key and preferred model
OPENAI_API_KEY=sk-your-openai-api-key
OPENAI_MODEL=gpt-5-mini  # or gpt-5, gpt-5-nano, gpt-5-chat-latest, gpt-4o, gpt-4o-mini, gpt-4-turbo, gpt-3.5-turbo

GOOGLE_API_KEY=your-google-api-key
GOOGLE_MODEL=gemini-2.0-flash-exp  # or gemini-1.5-flash, gemini-1.5-pro

OLLAMA_ENDPOINT=http://localhost:11434
OLLAMA_MODEL=devstral:latest  # or llama3.2, codellama, mistral, etc.

MISTRAL_API_KEY=your-mistral-api-key
MISTRAL_MODEL=mistral-small-latest  # or mistral-large-latest, codestral-latest

# Global settings apply to all providers
LLM_TEMPERATURE=0.3  # Controls randomness (0.0-2.0, default: 0.3)
LLM_MAX_TOKENS=4096  # Maximum response length (default: 4096)

Configuração com o Claude Code

1. Localize a Configuração do Claude Code

O local do arquivo de configuração depende do seu sistema operacional:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows: %APPDATA%\Claude\claude_desktop_config.json
  • Linux: ~/.config/Claude/claude_desktop_config.json

2. Edite a Configuração

Abra o arquivo de configuração e adicione o servidor Second Opinion:

Opção 1: Usando Configuração JSON (Recomendada)

{
  "mcpServers": {
    "second-opinion": {
      "command": "/path/to/second-opinion/bin/second-opinion"
    }
  }
}

Substitua /path/to/second-opinion pelo caminho real onde você clonou o repositório.

Opção 2: Usando Variáveis de Ambiente

{
  "mcpServers": {
    "second-opinion": {
      "command": "/path/to/second-opinion/bin/second-opinion",
      "env": {
        "DEFAULT_PROVIDER": "openai",
        "OPENAI_API_KEY": "your-openai-api-key",
        "OPENAI_MODEL": "gpt-5-mini",
        "LLM_TEMPERATURE": "0.3",
        "LLM_MAX_TOKENS": "4096"
      }
    }
  }
}

3. Reinicie o Claude Code

Após salvar a configuração, reinicie o Claude Code para que as alterações tenham efeito.

4. Verifique a Instalação

No Claude Code, você deve ver "second-opinion" na lista de servidores MCP. Você pode testá-lo perguntando:

"What git repository information can you get from the current directory?"

Ferramentas Disponíveis

1. analyze_git_diff 🚀 Otimizado

Analisa a saída do git diff para entender alterações de código usando o LLM configurado com otimização automática.

Parâmetros:

  • diff_content (obrigatório): Saída do git diff a ser analisada
  • summarize (opcional): Se deve fornecer um resumo das alterações
  • provider (opcional): Provedor de LLM a ser usado (substitui o padrão)
  • model (opcional): Modelo a ser usado (substitui o padrão do provedor)

Otimizações Inteligentes:

  • Alocação Dinâmica de Tokens: 4096-32768 tokens com base no tamanho do diff
  • Ajuste de Temperatura: 0.25 otimizado para análise de diff
  • Particionamento: Particionamento automático para diffs grandes (>10MB ou >1000 arquivos)
  • Específico por Provedor: Parâmetros personalizados por provedor de LLM

Exemplo no Claude Code:

"Analyze this git diff and tell me what changed: [paste diff here]"

2. review_code 🚀 Otimizado

Revisa código quanto à qualidade, segurança e boas práticas usando o LLM configurado com otimização específica por tarefa.

Parâmetros:

  • code (obrigatório): Código a ser revisado
  • language (opcional): Linguagem de programação do código
  • focus (opcional): Área de foco específica - security, performance, style ou all
  • provider (opcional): Provedor de LLM a ser usado (substitui o padrão)
  • model (opcional): Modelo a ser usado (substitui o padrão do provedor)

Otimizações Inteligentes:

  • Temperatura Específica por Tarefa: 0.1 para foco em segurança (alta precisão), 0.2 para revisão geral de código
  • Alocação Dinâmica de Tokens: Escala com o tamanho do código para análise abrangente
  • Análise Consciente do Foco: Prompts e parâmetros especializados por área de foco

Exemplo no Claude Code:

"Review this Python code for security issues: [paste code here]"

3. analyze_commit 🚀 Otimizado

Analisa um commit git quanto à qualidade e adesão às boas práticas usando o LLM configurado com otimização específica para commits.

Parâmetros:

  • commit_sha (opcional): SHA do commit git a ser analisado (padrão: HEAD)
  • repo_path (opcional): Caminho para o repositório git (padrão: diretório atual)
  • provider (opcional): Provedor de LLM a ser usado (substitui o padrão)
  • model (opcional): Modelo a ser usado (substitui o padrão do provedor)

Otimizações Inteligentes:

  • Temperatura para Análise de Commits: 0.2 para análise de commits consistente e determinística
  • Processamento de Diff Seguro para Memória: Lida com commits grandes com truncamento automático
  • Análise Combinada: Inclui qualidade da mensagem do commit, análise de diff e boas práticas

Exemplo no Claude Code:

"Analyze the latest commit in this repository"
"Analyze commit abc123 and tell me if it follows best practices"

4. analyze_uncommitted_work 🚀 Otimizado

Analisa alterações não commitadas em um repositório git para ajudar na preparação de commits com otimização inteligente.

Parâmetros:

  • repo_path (opcional): Caminho para o repositório git (padrão: diretório atual)
  • staged_only (opcional): Analisar apenas alterações em staged (padrão: falso, analisa todas as alterações não commitadas)
  • provider (opcional): Provedor de LLM a ser usado (substitui o padrão)
  • model (opcional): Modelo a ser usado (substitui o padrão do provedor)

Otimizações Inteligentes:

  • Temperatura para Revisão de Código: 0.2 para análise equilibrada de alterações não commitadas
  • Manipulação de Grandes Conjuntos de Alterações: Particionamento automático para modificações extensas
  • Análise Consciente do Contexto: Análise personalizada para trabalho em staged vs. todo o trabalho não commitado

A Análise do LLM Inclui:

  • Resumo de todas as alterações (arquivos modificados, adicionados, excluídos)
  • Tipo e natureza das alterações (recurso, correção de bug, refatoração, etc.)
  • Completude e prontidão para commit
  • Problemas ou preocupações potenciais
  • Mensagem(ens) de commit sugerida(s) se as alterações estiverem prontas
  • Recomendações para organizar commits se as alterações devem ser divididas

Exemplo no Claude Code:

"Analyze my uncommitted changes and suggest a commit message"
"Review only my staged changes before I commit"
"Should I split my current changes into multiple commits?"

5. get_repo_info

Obtém informações sobre um repositório git (sem análise de LLM).

Parâmetros:

  • repo_path (opcional): Caminho para o repositório git (padrão: diretório atual)

Exemplo no Claude Code:

"Show me information about this git repository"

Recursos de Segurança

  • Validação de Entrada: Todos os caminhos de repositório e SHAs de commit são validados para prevenir injeção de comandos
  • Restrições de Caminho: Os caminhos do repositório devem estar dentro do diretório de trabalho atual
  • Proteção de Chaves de API: As chaves de API nunca são expostas em mensagens de erro ou logs
  • Timeouts HTTP: Todas as chamadas de API de LLM têm timeouts de 30 segundos para evitar travamentos
  • Acesso Concorrente: Gerenciamento de provedores seguro para threads para solicitações concorrentes

Sistema de Otimização 🚀

O Second Opinion inclui um sistema de otimização abrangente que ajusta automaticamente o desempenho com base no conteúdo e contexto:

Alocação Dinâmica de Tokens

  • 4096 tokens: Diffs muito pequenos (<5KB)
  • 6144 tokens: Diffs pequenos (5-20KB)
  • 8192 tokens: Diffs médios (20-50KB)
  • 12288 tokens: Diffs grandes (50-150KB)
  • 16384 tokens: Diffs muito grandes (150-500KB)
  • 32768 tokens: Diffs enormes (>500KB)

Configurações de Temperatura Específicas por Tarefa

  • 0.1: Revisões de segurança (precisão máxima)
  • 0.2: Revisões de código e análise de commits (majoritariamente determinísticas)
  • 0.25: Análise de diff (levemente flexível)
  • 0.3: Revisões de arquitetura (permite criatividade)

Otimizações Específicas por Provedor

  • OpenAI: Alocação total de tokens com top_p=0.9
  • Google: Limitado a 8192 tokens com amostragem focada (top_k=20, top_p=0.8)
  • Mistral: Alocação conservadora com top_p=0.8
  • Ollama: Otimização de modelo local com repeat_penalty=1.05

Gerenciamento de Memória

  • Particionamento Automático: Diffs grandes (>10MB ou >1000 arquivos) são divididos de forma inteligente
  • Tamanho Inteligente de Partições: Adapta o tamanho das partições com base na contagem de arquivos
  • Streaming Consciente de Memória: Habilita streaming para operações grandes

Desenvolvimento

Estrutura do Projeto

second-opinion/
├── main.go              # MCP server setup and tool registration
├── handlers.go          # Tool handler implementations
├── validation.go        # Input validation functions
├── config/              # Configuration loading and optimization
│   ├── config.go        # Main configuration with optimization methods
│   └── optimization_test.go # Comprehensive optimization tests
├── llm/                 # LLM provider implementations
│   ├── provider.go      # Provider interface, prompts, and optimization wrapper
│   ├── openai.go        # OpenAI implementation
│   ├── google.go        # Google Gemini implementation
│   ├── ollama.go        # Ollama implementation with advanced options
│   └── mistral.go       # Mistral implementation with additional parameters
├── CLAUDE.md           # Claude Code specific instructions
└── TODO.md             # Development roadmap

Executando Testes

# Run all tests
go test ./... -v

# Run optimization tests specifically
go test ./config -v

# Run specific test suites
go test ./llm -v -run TestProviderConnections

# Run with race detection
go test -race ./...

# Run with coverage
go test -cover ./...

Linting

# Install golangci-lint if not already installed
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest

# Run linter
golangci-lint run

# Auto-fix issues where possible
golangci-lint run --fix

Compilação

# Build for current platform
go build -o bin/second-opinion

# Build with race detector (for development)
go build -race -o bin/second-opinion

# Build for different platforms
GOOS=darwin GOARCH=amd64 go build -o bin/second-opinion-darwin-amd64
GOOS=linux GOARCH=amd64 go build -o bin/second-opinion-linux-amd64
GOOS=windows GOARCH=amd64 go build -o bin/second-opinion-windows-amd64.exe

Solução de Problemas

Problemas Comuns

  1. Erro "Provider not configured"

    • Certifique-se de ter configurado ~/.second-opinion.json ou variáveis de ambiente
    • Verifique se as chaves de API são válidas e têm as permissões apropriadas
  2. Erro "Not a git repository"

    • Certifique-se de estar executando a ferramenta em um diretório com uma pasta .git
    • A ferramenta valida que os caminhos são repositórios git por segurança
  3. Erros de timeout

    • Verifique sua conexão com a internet
    • Para Ollama, certifique-se de que o servidor local esteja em execução: ollama serve
    • Considere usar um modelo mais rápido se os timeouts persistirem
  4. Erros de permissão negada

    • A ferramenta só permite acesso ao diretório de trabalho atual e subdiretórios
    • Certifique-se de que o binário tenha permissões de execução: chmod +x bin/second-opinion

Modo de Depuração

Para ver logs detalhados, você pode executar o servidor diretamente:

./bin/second-opinion 2>debug.log

Contribuindo

Contribuições são bem-vindas! Por favor:

  1. Faça um fork do repositório
  2. Crie um branch de recurso
  3. Certifique-se de que todos os testes passem e o linting esteja limpo
  4. Envie um pull request

Consulte TODO.md para recursos planejados e problemas conhecidos.

Uso de Memória

Para repositórios grandes, consulte docs/MEMORY_USAGE.md para opções de configuração para lidar com diffs grandes de forma eficiente.

Licença

MIT