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
- Clone o repositório:
git clone https://github.com/dshills/second-opinion.git
cd second-opinion
- Instale as dependências:
go mod tidy
- 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:
- Arquivo de Configuração JSON (preferido):
~/.second-opinion.jsonno seu diretório pessoal - Variáveis de Ambiente: Usando o arquivo
.envou 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:
- Copie o arquivo de exemplo de ambiente:
cp .env.example .env
- Edite o
.enve 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 analisadasummarize(opcional): Se deve fornecer um resumo das alteraçõesprovider(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 revisadolanguage(opcional): Linguagem de programação do códigofocus(opcional): Área de foco específica -security,performance,styleouallprovider(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
-
Erro "Provider not configured"
- Certifique-se de ter configurado
~/.second-opinion.jsonou variáveis de ambiente - Verifique se as chaves de API são válidas e têm as permissões apropriadas
- Certifique-se de ter configurado
-
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
- Certifique-se de estar executando a ferramenta em um diretório com uma pasta
-
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
-
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:
- Faça um fork do repositório
- Crie um branch de recurso
- Certifique-se de que todos os testes passem e o linting esteja limpo
- 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