Second Opinion

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

Documentación

Second Opinion 🔍

Un servidor MCP (Model Context Protocol) que asiste a Claude Code en la revisión de commits y bases de código. Esta herramienta aprovecha LLMs externos (OpenAI, Google Gemini, Ollama, Mistral) para proporcionar capacidades inteligentes de revisión de código, análisis de diffs de git, evaluación de calidad de commits y análisis de trabajo sin confirmar.

Características

  • Análisis de Diff de Git: Analiza la salida de git diff para comprender los cambios de código usando LLMs
  • Revisión de Código: Revisa código en busca de calidad, seguridad y mejores prácticas con asistencia de IA
  • Análisis de Commits: Analiza commits de git para evaluar calidad y adherencia a mejores prácticas
  • Análisis de Trabajo Sin Confirmar: Analiza todos los cambios sin confirmar o solo los cambios preparados (staged)
  • Información del Repositorio: Obtiene información sobre repositorios git
  • Soporte Múltiple de LLMs: Funciona con OpenAI, Google Gemini, Ollama (local) y Mistral AI
  • 🚀 Optimización Inteligente: Asignación dinámica de tokens y ajuste de temperatura específico por tarea
  • ⚡ Ajuste de Rendimiento: Optimizaciones específicas por proveedor y fragmentación consciente de memoria
  • Seguridad: Validación de entrada, manejo seguro de rutas y protección de claves API
  • Seguridad de Memoria: Límites de memoria configurables y soporte de streaming para diffs grandes

Instalación

Requisitos Previos

  • Go 1.20 o superior
  • Git
  • Aplicación de escritorio Claude Code

Compilar desde el Código Fuente

  1. Clonar el repositorio:
git clone https://github.com/dshills/second-opinion.git
cd second-opinion
  1. Instalar dependencias:
go mod tidy
  1. Compilar el servidor:
go build -o bin/second-opinion

Configuración

Second Opinion admite dos métodos de configuración, con el siguiente orden de prioridad:

  1. Archivo de Configuración JSON (preferido): ~/.second-opinion.json en tu directorio de inicio
  2. Variables de Entorno: Usando el archivo .env o variables de entorno del sistema

Configuración JSON (Recomendada)

Crea un archivo .second-opinion.json en tu directorio de inicio:

{
  "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
  }
}

🚀 Características de Optimización Inteligente:

  • Asignación Dinámica de Tokens: Ajusta automáticamente los tokens (4096-32768) según el tamaño del diff
  • Temperatura Específica por Tarea: Optimiza la temperatura (0.1-0.3) según el tipo de análisis
  • Optimización por Proveedor: Parámetros personalizados para cada proveedor de LLM
  • Gestión de Memoria: Fragmentación automática para diffs grandes y recuentos altos de archivos

Configuración con Variables de Entorno

Si no se encuentra configuración JSON, el servidor recurre a variables de entorno:

  1. Copia el archivo de entorno de ejemplo:
cp .env.example .env
  1. Edita .env y configura tus proveedores 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)

Configuración con Claude Code

1. Localizar la Configuración de Claude Code

La ubicación del archivo de configuración depende de tu sistema operativo:

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

2. Editar la Configuración

Abre el archivo de configuración y agrega el servidor Second Opinion:

Opción 1: Usando Configuración JSON (Recomendada)

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

Reemplaza /path/to/second-opinion con la ruta real donde clonaste el repositorio.

Opción 2: Usando Variables de Entorno

{
  "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. Reiniciar Claude Code

Después de guardar la configuración, reinicia Claude Code para que los cambios surtan efecto.

4. Verificar la Instalación

En Claude Code, deberías ver "second-opinion" en la lista de servidores MCP. Puedes probarlo preguntando:

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

Herramientas Disponibles

1. analyze_git_diff 🚀 Optimizado

Analiza la salida de git diff para comprender los cambios de código usando el LLM configurado con optimización automática.

Parámetros:

  • diff_content (requerido): Salida de git diff para analizar
  • summarize (opcional): Si se debe proporcionar un resumen de los cambios
  • provider (opcional): Proveedor de LLM a usar (anula el predeterminado)
  • model (opcional): Modelo a usar (anula el predeterminado del proveedor)

Optimizaciones Inteligentes:

  • Asignación Dinámica de Tokens: 4096-32768 tokens según el tamaño del diff
  • Ajuste de Temperatura: 0.25 optimizado para análisis de diff
  • Fragmentación: Fragmentación automática para diffs grandes (>10MB o >1000 archivos)
  • Específico por Proveedor: Parámetros personalizados por proveedor de LLM

Ejemplo en Claude Code:

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

2. review_code 🚀 Optimizado

Revisa código en busca de calidad, seguridad y mejores prácticas usando el LLM configurado con optimización específica por tarea.

Parámetros:

  • code (requerido): Código a revisar
  • language (opcional): Lenguaje de programación del código
  • focus (opcional): Área de enfoque específica - security, performance, style o all
  • provider (opcional): Proveedor de LLM a usar (anula el predeterminado)
  • model (opcional): Modelo a usar (anula el predeterminado del proveedor)

Optimizaciones Inteligentes:

  • Temperatura Específica por Tarea: 0.1 para enfoque de seguridad (alta precisión), 0.2 para revisión general de código
  • Asignación Dinámica de Tokens: Escala con el tamaño del código para un análisis exhaustivo
  • Análisis Consciente del Enfoque: Prompts y parámetros especializados por área de enfoque

Ejemplo en Claude Code:

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

3. analyze_commit 🚀 Optimizado

Analiza un commit de git para evaluar calidad y adherencia a mejores prácticas usando el LLM configurado con optimización específica para commits.

Parámetros:

  • commit_sha (opcional): SHA del commit de git a analizar (predeterminado: HEAD)
  • repo_path (opcional): Ruta al repositorio git (predeterminado: directorio actual)
  • provider (opcional): Proveedor de LLM a usar (anula el predeterminado)
  • model (opcional): Modelo a usar (anula el predeterminado del proveedor)

Optimizaciones Inteligentes:

  • Temperatura para Análisis de Commits: 0.2 para análisis de commits consistente y determinista
  • Procesamiento de Diff Seguro para Memoria: Maneja commits grandes con truncamiento automático
  • Análisis Combinado: Incluye calidad del mensaje del commit, análisis de diff y mejores prácticas

Ejemplo en Claude Code:

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

4. analyze_uncommitted_work 🚀 Optimizado

Analiza cambios sin confirmar en un repositorio git para ayudar a preparar commits con optimización inteligente.

Parámetros:

  • repo_path (opcional): Ruta al repositorio git (predeterminado: directorio actual)
  • staged_only (opcional): Analizar solo cambios preparados (staged) (predeterminado: false, analiza todos los cambios sin confirmar)
  • provider (opcional): Proveedor de LLM a usar (anula el predeterminado)
  • model (opcional): Modelo a usar (anula el predeterminado del proveedor)

Optimizaciones Inteligentes:

  • Temperatura para Revisión de Código: 0.2 para análisis equilibrado de cambios sin confirmar
  • Manejo de Cambios Grandes: Fragmentación automática para modificaciones extensas
  • Análisis Consciente del Contexto: Análisis adaptado para trabajo preparado (staged) vs. todo el trabajo sin confirmar

El Análisis del LLM Incluye:

  • Resumen de todos los cambios (archivos modificados, agregados, eliminados)
  • Tipo y naturaleza de los cambios (característica, corrección de errores, refactorización, etc.)
  • Completitud y preparación para el commit
  • Problemas o preocupaciones potenciales
  • Mensaje(s) de commit sugerido(s) si los cambios están listos
  • Recomendaciones para organizar commits si los cambios deben dividirse

Ejemplo en 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

Obtiene información sobre un repositorio git (sin análisis de LLM).

Parámetros:

  • repo_path (opcional): Ruta al repositorio git (predeterminado: directorio actual)

Ejemplo en Claude Code:

"Show me information about this git repository"

Características de Seguridad

  • Validación de Entrada: Todas las rutas de repositorio y SHAs de commits se validan para prevenir inyección de comandos
  • Restricciones de Ruta: Las rutas de repositorio deben estar dentro del directorio de trabajo actual
  • Protección de Claves API: Las claves API nunca se exponen en mensajes de error o registros
  • Tiempos de Espera HTTP: Todas las llamadas API de LLM tienen tiempos de espera de 30 segundos para prevenir bloqueos
  • Acceso Concurrente: Gestión de proveedores segura para subprocesos para solicitudes concurrentes

Sistema de Optimización 🚀

Second Opinion incluye un sistema de optimización integral que ajusta automáticamente el rendimiento según el contenido y el contexto:

Asignación Dinámica de Tokens

  • 4096 tokens: Diffs muy pequeños (<5KB)
  • 6144 tokens: Diffs pequeños (5-20KB)
  • 8192 tokens: Diffs medianos (20-50KB)
  • 12288 tokens: Diffs grandes (50-150KB)
  • 16384 tokens: Diffs muy grandes (150-500KB)
  • 32768 tokens: Diffs enormes (>500KB)

Configuraciones de Temperatura Específicas por Tarea

  • 0.1: Revisiones de seguridad (precisión máxima)
  • 0.2: Revisiones de código y análisis de commits (mayormente determinista)
  • 0.25: Análisis de diff (ligeramente flexible)
  • 0.3: Revisiones de arquitectura (permite creatividad)

Optimizaciones Específicas por Proveedor

  • OpenAI: Asignación completa de tokens con top_p=0.9
  • Google: Limitado a 8192 tokens con muestreo enfocado (top_k=20, top_p=0.8)
  • Mistral: Asignación conservadora con top_p=0.8
  • Ollama: Optimización de modelo local con repeat_penalty=1.05

Gestión de Memoria

  • Fragmentación Automática: Los diffs grandes (>10MB o >1000 archivos) se dividen inteligentemente
  • Tamaño de Fragmento Inteligente: Adapta el tamaño del fragmento según el recuento de archivos
  • Streaming Consciente de Memoria: Habilita streaming para operaciones grandes

Desarrollo

Estructura del Proyecto

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

Ejecutar Pruebas

# 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

Compilación

# 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

Solución de Problemas

Problemas Comunes

  1. Error de "Proveedor no configurado"

    • Asegúrate de haber configurado ~/.second-opinion.json o variables de entorno
    • Verifica que las claves API sean válidas y tengan los permisos apropiados
  2. Error de "No es un repositorio git"

    • Asegúrate de estar ejecutando la herramienta en un directorio con una carpeta .git
    • La herramienta valida que las rutas sean repositorios git por seguridad
  3. Errores de tiempo de espera

    • Verifica tu conexión a internet
    • Para Ollama, asegúrate de que el servidor local esté ejecutándose: ollama serve
    • Considera usar un modelo más rápido si los tiempos de espera persisten
  4. Errores de permiso denegado

    • La herramienta solo permite acceso al directorio de trabajo actual y subdirectorios
    • Asegúrate de que el binario tenga permisos de ejecución: chmod +x bin/second-opinion

Modo de Depuración

Para ver registros detallados, puedes ejecutar el servidor directamente:

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

Contribuciones

¡Las contribuciones son bienvenidas! Por favor:

  1. Haz un fork del repositorio
  2. Crea una rama de características
  3. Asegúrate de que todas las pruebas pasen y el linting esté limpio
  4. Envía una solicitud de extracción (pull request)

Consulta TODO.md para características planificadas y problemas conocidos.

Uso de Memoria

Para repositorios grandes, consulta docs/MEMORY_USAGE.md para opciones de configuración que manejen diffs grandes de manera eficiente.

Licencia

MIT