Fossil MCP
El kit de herramientas de calidad de código para la era de la codificación por vibra.
Documentación
Fossil MCP
El kit de herramientas de calidad de código para la era del vibe coding.
Análisis estático que encuentra el desorden que el vibe coding deja atrás: código muerto, lógica duplicada, artefactos de andamiaje y funciones desconectadas, en 16 lenguajes.
El Problema
La codificación asistida por IA está bien: revisas el código, entiendes la arquitectura, mantienes el control. El vibe coding es diferente. Describes lo que quieres, la IA lo escribe y lo publicas sin leer cada línea. Herramientas como Claude Code, Cursor, GitHub Copilot y Windsurf hacen que este flujo de trabajo sea rápido y productivo. Pero con el paso de los días y las semanas, los proyectos creados con vibe coding acumulan una clase específica de problemas que los linters tradicionales no detectan:
El código muerto se acumula rápido. Cuando la IA refactoriza una función, escribe la nueva versión pero a menudo olvida eliminar la anterior. No te das cuenta porque no leíste el diff línea por línea. Después de varias sesiones, las funciones sin usar, las ramas inalcanzables y las utilidades huérfanas se acumulan: la base de código crece pero nada se poda. Un estudio de METR encontró que los desarrolladores dedican tiempo significativo a verificar y depurar la salida de la IA. El código muerto hace que esto sea exponencialmente más difícil.
La duplicación se propaga en silencio. Cada sesión de IA tiene una ventana de contexto limitada. Genera una función de utilidad que ya existe en otro lugar, o resuelve el mismo problema con una implementación ligeramente diferente tres archivos más allá. Pediste una funcionalidad, funciona, así que sigues adelante. La detección tradicional de duplicados se centra en copiar y pegar: la duplicación por vibe coding es estructural: lógica similar, nombres diferentes, dispersa entre módulos.
// Phase 1, // TODO, // Step 2 — en todas partes. Los agentes de IA trabajan por fases. Dejan marcadores de andamiaje que se suponía que serían temporales: // Phase 1: Setup, // TODO: implement error handling, cuerpos de funciones de relleno con pass o todo!(), y nombres por fases como process_data_v2. En el vibe coding, nadie vuelve a limpiar esto. Se convierten en elementos permanentes.
Existen funciones que nada llama. Esta es la firma del vibe coding. La IA escribe una función auxiliar, la usa, y luego en una sesión posterior reescribe la llamada para usar un enfoque diferente, pero la auxiliar permanece. Sin un grafo de llamadas, ni tú ni la IA pueden saber qué funciones están realmente conectadas al resto de la base de código. Las herramientas actuales de codificación con IA navegan el código mediante búsqueda de texto, no comprendiendo cómo se llaman las funciones entre sí.
Los archivos temporales se acumulan en el repositorio. Las sesiones de IA crean archivos y directorios temp_, backup_, old_, phase_1_. En el vibe coding, no auditas tu árbol de archivos después de cada sesión. Estos artefactos persisten entre commits.
La Solución
Fossil MCP es un kit de herramientas de análisis estático diseñado específicamente para proyectos creados con vibe coding. Detecta los artefactos que se acumulan cuando la IA escribe la mayor parte del código, y funciona tanto como herramienta CLI para desarrolladores como servidor MCP que brinda a los agentes de IA un grafo de código en lugar de solo búsqueda de texto.
███████╗ ██████╗ ███████╗███████╗██╗██╗ () ()
██╔════╝██╔═══██╗██╔════╝██╔════╝██║██║ \ /
█████╗ ██║ ██║███████╗███████╗██║██║ | |
██╔══╝ ██║ ██║╚════██║╚════██║██║██║ | |
██║ ╚██████╔╝███████║███████║██║███████╗ / \
╚═╝ ╚═════╝ ╚══════╝╚══════╝╚═╝╚══════╝ () ()
Dig up dead code. Unearth clones. Expose scaffolding.
Lo que Fossil Detecta
| Análisis | Lo que encuentra | El problema del vibe coding |
|---|---|---|
| Código Muerto | Funciones inalcanzables, exportaciones sin usar, métodos huérfanos | La IA reescribe una llamada pero olvida eliminar la función auxiliar anterior: nadie lo nota |
| Clones de Código | Duplicados Tipo 1 (exactos), Tipo 2 (renombrados), Tipo 3 (estructurales) | Cada sesión de IA reinventa utilidades que ya existen en otra parte de la base de código |
| Andamiaje | Comentarios Phase N / Step N, marcadores TODO/FIXME, cuerpos de relleno | La IA trabaja por fases y deja marcadores temporales que nunca se limpian |
| Archivos Temporales | Archivos y directorios temp_*, backup_*, old_*, phase_* | Artefactos de sesión que persisten porque nadie audita el árbol de archivos |
| Grafo de Código | Rutas de trazado entre dos funciones cualesquiera, análisis de radio de explosión, recorrido del grafo de llamadas | Las herramientas de IA navegan mediante búsqueda de texto: Fossil les da un grafo para rastrear cómo se conectan las funciones y qué se rompe si cambias una |
Qué Hace Diferente a Fossil
- Diseñado específicamente para vibe coding. No es un linter general: se dirige específicamente al desorden que se acumula cuando la IA escribe la mayor parte del código y los humanos revisan menos.
- Grafo, no grep. Las herramientas de codificación con IA navegan el código buscando texto. Fossil construye un grafo de llamadas y permite a los agentes rastrear cómo se conectan las funciones, encontrar el radio de explosión antes de refactorizar y descubrir callejones sin salida, sin leer cada archivo.
- Nativo para MCP. Se ejecuta como servidor MCP para que los agentes de IA puedan autoverificar su salida durante el desarrollo.
- Ahorra tokens, ahorra dinero. En lugar de que un agente escanee archivos una y otra vez para encontrar problemas, Fossil identifica código muerto, clones y andamiaje en una sola pasada: menos rondas de inferencia de LLM, menor costo.
- Construido en Rust. Un solo binario, sin dependencias de ejecución. Escanea miles de archivos en segundos. Seguro en memoria por diseño.
- Análisis entre archivos. Resuelve imports, re-exportaciones de barril y jerarquías de clases para encontrar código muerto a través de los límites de los módulos.
- Consciente de frameworks. Detecta automáticamente React, Next.js, Django, Spring, Axum y más: no marcará métodos de ciclo de vida como código muerto.
- Cero configuración. Funciona de inmediato. El archivo de configuración es opcional.
- 16 lenguajes. Una sola herramienta para bases de código políglotas.
Instalación
Instalación rápida (recomendada)
macOS / Linux:
curl -fsSL fossil-mcp.com/install.sh | sh
Windows (PowerShell):
irm fossil-mcp.com/install.ps1 | iex
Detecta automáticamente tu sistema operativo y arquitectura, descarga el binario más reciente y lo agrega a tu PATH.
Descarga manual
Descarga el binario más reciente para tu plataforma desde GitHub Releases:
# macOS (Apple Silicon)
curl -L https://github.com/yfedoseev/fossil-mcp/releases/latest/download/fossil-mcp-macos-aarch64.tar.gz | tar xz
mv fossil-mcp /usr/local/bin/
# macOS (Intel)
curl -L https://github.com/yfedoseev/fossil-mcp/releases/latest/download/fossil-mcp-macos-x86_64.tar.gz | tar xz
mv fossil-mcp /usr/local/bin/
# Linux (x86_64)
curl -L https://github.com/yfedoseev/fossil-mcp/releases/latest/download/fossil-mcp-linux-x86_64-musl.tar.gz | tar xz
mv fossil-mcp ~/.local/bin/
| Plataforma | Arquitectura | Archivo |
|---|---|---|
| Linux | x86_64 (recomendada) | fossil-mcp-linux-x86_64-musl |
| Linux | x86_64 (glibc) | fossil-mcp-linux-x86_64 |
| Linux | ARM64 | fossil-mcp-linux-aarch64 |
| macOS | Intel | fossil-mcp-macos-x86_64 |
| macOS | Apple Silicon | fossil-mcp-macos-aarch64 |
| Windows | x86_64 | fossil-mcp-windows-x86_64 |
cargo-binstall
Si tienes cargo-binstall, descarga binarios precompilados en lugar de compilar desde el código fuente:
cargo binstall fossil-mcp
Desde crates.io
cargo install fossil-mcp
Esto descarga el código fuente desde crates.io y lo compila localmente. Requiere un toolchain de Rust.
Desde el código fuente
git clone https://github.com/yfedoseev/fossil-mcp.git
cd fossil-mcp
cargo build --release
El binario está en ./target/release/fossil-mcp.
Actualización
fossil-mcp update
Configuración del Servidor MCP
Fossil se ejecuta como servidor MCP de forma predeterminada: solo ejecuta fossil-mcp sin argumentos. Conéctalo a tu herramienta de codificación con IA:
Claude Code
claude mcp add fossil fossil-mcp
OpenAI Codex
Agrégalo a tu configuración de MCP de Codex:
{
"mcpServers": {
"fossil": {
"command": "fossil-mcp"
}
}
}
Cursor
Agrégalo a ~/.cursor/mcp.json:
{
"mcpServers": {
"fossil": {
"command": "fossil-mcp"
}
}
}
O haz clic en el botón de instalación de Cursor arriba.
VS Code / VS Code Insiders
Agrégalo a .vscode/mcp.json en tu espacio de trabajo:
{
"mcp": {
"servers": {
"fossil": {
"command": "fossil-mcp"
}
}
}
}
O haz clic en el botón de instalación de VS Code arriba.
Windsurf
Agrégalo a ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"fossil": {
"command": "fossil-mcp"
}
}
}
Claude Desktop
Agrégalo a claude_desktop_config.json:
{
"mcpServers": {
"fossil": {
"command": "fossil-mcp"
}
}
}
Herramientas MCP
Una vez conectado, tu agente de IA tiene acceso a estas herramientas:
| Herramienta | Descripción |
|---|---|
scan_all | Ejecuta todos los análisis (código muerto + clones + andamiaje) en un proyecto |
analyze_dead_code | Detecta código inalcanzable con confianza configurable |
detect_clones | Encuentra código duplicado (clones Tipo 1/2/3) |
fossil_refresh | Reanálisis incremental después de cambios en archivos (rápido) |
fossil_inspect | Inspecciona el grafo de llamadas, flujo de datos, flujo de control o radio de explosión de cualquier función |
fossil_trace | Encuentra rutas de llamadas entre dos funciones: comprende cómo se conecta el código |
fossil_explain_finding | Obtén contexto enriquecido sobre un hallazgo específico |
fossil_detect_scaffolding | Encuentra andamiaje de IA: comentarios por fases, TODOs, marcadores de posición y archivos temporales |
Uso de CLI
Modos
Fossil tiene cuatro modos de operación:
| Modo | Cómo invocarlo | Qué hace |
|---|---|---|
| Interactivo | fossil-mcp (sin argumentos) | Ejecuta un escaneo completo + abre un REPL interactivo para explorar hallazgos |
| CLI | fossil-mcp <command> | Ejecuta un comando de análisis específico |
| Servidor MCP | fossil-mcp mcp o stdin canalizado | Servidor JSON-RPC para herramientas de codificación con IA |
| CI/CD | fossil-mcp check | Falla las compilaciones cuando se superan los umbrales |
Modo Interactivo
Ejecutar fossil-mcp sin argumentos (o fossil-mcp scan .) escanea el directorio actual en busca de código muerto, clones y andamiaje, muestra un panel de control y luego abre un REPL interactivo:
FOSSIL Scanning .
────────────────────────────────────────────────
✓ 1200 nodes analyzed, 42 unreachable
✓ 380 files analyzed, 8 clone groups
✓ 3 scaffolding artifacts
══════════════════════════════════════════════════
RESULTS 53 findings across 28 files
══════════════════════════════════════════════════
▐ Dead Code 42 ██████████████░░
▐ Clones 8 ██░░░░░░░░░░░░░░ 120 duplicated lines
▐ Scaffolding 3 █░░░░░░░░░░░░░░░
fossil>
Comandos del REPL
Todos los comandos de exploración admiten filtros opcionales de cantidad y lenguaje: command [N] [lang]
fossil> dead 10 # Top 10 dead code findings
fossil> dead 20 typescript # Top 20 dead code in TypeScript
fossil> clones 5 rust # Top 5 clone groups in Rust
fossil> scaffolding # All scaffolding findings
fossil> scaffolding 10 python # Top 10 scaffolding in Python
fossil> hotspots # Files with most findings
fossil> hotspots 10 go # Top 10 hotspot files in Go
fossil> file auth.ts # All findings in a specific file
fossil> langs # Language breakdown
fossil> export sarif # Export full SARIF report
fossil> summary # Re-show dashboard
fossil> q # Quit
Comandos
fossil-mcp scan [path]
Ejecuta todos los análisis (código muerto + clones + andamiaje) con panel de control interactivo.
fossil-mcp scan .
fossil-mcp scan /path/to/project --format sarif -o results.sarif
fossil-mcp scan /path/to/project --format json
fossil-mcp dead-code [path]
Solo detección de código muerto.
fossil-mcp dead-code .
fossil-mcp dead-code . --min-confidence high
fossil-mcp dead-code . --min-lines 10
fossil-mcp dead-code . --language rust,python
fossil-mcp dead-code . --diff main # Only changed files
fossil-mcp dead-code . --stats # Show graph statistics
fossil-mcp dead-code . --cache-dir .fossil-cache # Persistent cache
fossil-mcp dead-code . --cache-stats # Cache hit rate
| Banderas | Descripción |
|---|---|
--min-confidence <LEVEL> | Filtra por confianza: low, medium, high, certain |
--min-lines <N> | Líneas mínimas de código para un hallazgo |
--language <LANGS> | Filtra por lenguaje (separado por comas): rust,python,go |
--include-tests | Incluye código solo de pruebas en los resultados |
--diff <BRANCH> | Solo analiza archivos modificados en comparación con la rama base |
--stats | Imprime estimaciones de cardinalidad del grafo (HyperLogLog) |
--cache-dir <PATH> | Directorio de caché persistente para análisis incremental |
--cache-stats | Imprime la tasa de aciertos de caché y el uso de memoria |
fossil-mcp clones [path]
Solo detección de clones (código duplicado).
fossil-mcp clones .
fossil-mcp clones . --min-lines 10
fossil-mcp clones . --similarity 0.9
fossil-mcp clones . --language typescript
fossil-mcp clones . --types type1,type2
| Banderas | Descripción |
|---|---|
--min-lines <N> | Líneas mínimas para un clon (predeterminado: 6) |
--similarity <F> | Umbral de similitud 0.0–1.0 para clones Tipo 3 (predeterminado: 0.8) |
--types <TYPES> | Tipos de clon a detectar: type1,type2,type3 (predeterminado: todos) |
--language <LANGS> | Filtra por lenguaje (separado por comas) |
fossil-mcp scaffolding [path]
Detecta artefactos de andamiaje generados por IA.
fossil-mcp scaffolding .
fossil-mcp scaffolding . --language rust
fossil-mcp scaffolding . --include-todos
fossil-mcp scaffolding . --format json
| Banderas | Descripción |
|---|---|
--language <LANGS> | Filtra por lenguaje (separado por comas) |
--include-todos | Incluye marcadores TODO/FIXME/HACK (excluidos por defecto) |
Detecta: cuerpos de relleno (pass, todo!(), unimplemented!()), comentarios por fases (Phase 1, Step 2), identificadores de andamiaje (scaffold_*, boilerplate_*), impresiones de depuración y archivos temporales (temp_*, backup_*, old_*).
fossil-mcp check [path]
Modo CI/CD: falla las compilaciones cuando se superan los umbrales. Consulta Integración CI/CD para más detalles.
fossil-mcp check
fossil-mcp check --max-dead-code 10 --max-clones 5
fossil-mcp check --diff origin/main
fossil-mcp check --diff origin/main --format sarif
fossil-mcp check --fail-on-scaffolding
| Flag | Descripción |
|---|---|
--max-dead-code <N> | Máximo de hallazgos de código muerto permitidos |
--max-clones <N> | Máximo de hallazgos de clones permitidos |
--max-scaffolding <N> | Máximo de hallazgos de andamiaje permitidos |
--min-confidence <LEVEL> | Confianza mínima para contar hallazgos |
--diff <BRANCH> | Solo verificar archivos cambiados respecto a la rama base |
--fail-on-scaffolding | Fallar si se encuentra algún artefacto de andamiaje |
fossil-mcp weekly
Muestra los rankings semanales de basura de IA en proyectos de código abierto.
fossil-mcp weekly
fossil-mcp weekly --detailed
fossil-mcp update
Actualiza fossil-mcp a la última versión.
fossil-mcp update
fossil-mcp update --check # Check without installing
fossil-mcp mcp
Inicia el servidor MCP explícitamente (normalmente se detecta automáticamente mediante stdin canalizado).
Banderas globales
Estas banderas funcionan con todos los comandos:
| Flag | Descripción |
|---|---|
--format <FMT> | Formato de salida: text, json, sarif (por defecto: text) |
-o, --output <FILE> | Escribe la salida a un archivo en lugar de stdout |
-q, --quiet | Suprime toda la salida que no sea de error |
-v, --verbose | Habilita el registro de depuración |
-c, --config <FILE> | Ruta al archivo de configuración |
Lenguajes soportados
| Lenguaje | Extensiones |
|---|---|
| Python | .py |
| JavaScript | .js, .jsx, .mjs |
| TypeScript | .ts, .tsx |
| Rust | .rs |
| Go | .go |
| Java | .java |
| C# | .cs |
| C/C++ | .c, .h, .cpp, .cc, .cxx, .hpp |
| Ruby | .rb |
| PHP | .php |
| Swift | .swift |
| Kotlin | .kt |
| Scala | .scala |
| Bash | .sh, .bash |
| R | .r, .R |
Configuración (Opcional)
Fossil funciona con cero configuración. Todos los ajustes tienen valores predeterminados sensatos. Si necesitas personalizar el comportamiento, crea un fossil.toml en la raíz de tu proyecto:
[dead_code]
min_confidence = "high" # low, medium, high, certain
include_tests = false
exclude_patterns = ["generated/**", "vendor/**"]
[clones]
min_lines = 6
similarity_threshold = 0.8
[entry_points]
# Mark additional functions as entry points (won't be flagged as dead)
functions = ["custom_handler", "my_entry"]
# Additional entry point attributes/decorators
attributes = ["MyFramework::route"]
# Framework presets (auto-detected by default)
presets = ["axum", "react"]
auto_detect_presets = true
La configuración se descubre automáticamente a partir de estos nombres de archivo: fossil.toml, .fossil.toml, fossil.yml, fossil.yaml, fossil.json.
Las variables de entorno anulan los valores del archivo de configuración:
| Variable | Efecto |
|---|---|
FOSSIL_MIN_CONFIDENCE | Confianza mínima para hallazgos de código muerto |
FOSSIL_MIN_LINES | Líneas mínimas para detección de clones |
FOSSIL_SIMILARITY | Umbral de similitud para clones de Tipo 3 |
FOSSIL_OUTPUT_FORMAT | Formato de salida (text, json, sarif) |
Presets de frameworks
Los presets se detectan automáticamente a partir de las dependencias del proyecto. Le indican a Fossil qué funciones son puntos de entrada del framework (ganchos de ciclo de vida, manejadores de rutas, etc.) para que no se marquen como código muerto:
| Preset | Detectado por | Puntos de entrada reconocidos |
|---|---|---|
react | react en dependencias | componentDidMount, render, useEffect, ... |
nextjs | next en dependencias | getServerSideProps, getStaticProps, ... |
express | express en dependencias | patrones router.* |
django | django en dependencias | get, post, manejadores de patrones de URL |
flask | flask en dependencias | patrones app.route |
spring | spring-boot en dependencias | @Bean, @Controller, @Service, ... |
axum | axum en dependencias | #[tokio::main], #[debug_handler] |
actix | actix-web en dependencias | #[actix_web::main], #[get], #[post], ... |
angular | @angular/core en dependencias | ngOnInit, ngOnDestroy, ... |
Integración CI/CD
Fossil incluye un comando check para pipelines de CI/CD. Hace fallar las compilaciones cuando se superan los umbrales de calidad de código, ayudando a los equipos a hacer cumplir los estándares de código y evitar que se acumule deuda técnica.
Uso básico
# Check against configured thresholds
fossil-mcp check
# Override thresholds via CLI
fossil-mcp check --max-dead-code 10 --max-clones 5
# Diff-aware mode (only analyze changed files in PR)
fossil-mcp check --diff origin/main
# Generate SARIF for GitHub code scanning
fossil-mcp check --diff origin/main --format sarif
# Quiet mode (no diagnostic output)
fossil-mcp check --quiet
Configuración
Agrega una sección [ci] a fossil.toml:
[ci]
max_dead_code = 10 # Maximum dead code findings (0 = fail on any)
max_clones = 5 # Maximum clone findings
max_scaffolding = 3 # Maximum scaffolding findings
min_confidence = "medium" # Minimum confidence (low|medium|high|certain)
fail_on_scaffolding = false # Fail if any scaffolding found
Integración con GitHub Actions
Crea .github/workflows/fossil-check.yml:
name: Fossil CI Check
on:
pull_request:
push:
branches: [main]
jobs:
fossil:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install Fossil
run: curl -fsSL fossil-mcp.com/install.sh | sh
- name: Run Fossil check
run: |
fossil-mcp check \
--diff origin/${{ github.base_ref || 'main' }} \
--format sarif \
> fossil-results.sarif
- name: Upload to GitHub Security
if: always()
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: fossil-results.sarif
Cómo funciona
- Escanea el proyecto usando el mismo motor de análisis que
scan - Filtra opcionalmente solo los archivos cambiados (mediante
--diff branch) - Evalúa contra los umbrales configurados
- Reporta hallazgos como texto, JSON o SARIF
- Sale con código 1 si se superan los umbrales (falla la compilación de CI)
Códigos de salida
| Código | Significado |
|---|---|
| 0 | Todos los umbrales superados ✓ |
| 1 | Umbral superado (la compilación falla) |
| 2 | Error (falta git, configuración inválida, etc.) |
Para ejemplos completos, consulta examples/fossil.toml y examples/fossil-check.yml.
Cómo funciona
- Escaneo — recorre los archivos del proyecto, respeta
.gitignore, omite código vendido/generado - Análisis sintáctico — construye ASTs de tree-sitter para cada archivo fuente (16 lenguajes)
- Extracción — extrae funciones, llamadas, importaciones, atributos y jerarquía de clases de los ASTs
- Grafo — construye un
CodeGraphentre archivos con resolución de importaciones y soporte de re-exportación de barril - Análisis — detecta puntos de entrada (mediante heurísticas + presets de frameworks), ejecuta análisis de alcanzabilidad, identifica código muerto y clones
- Reporte — genera hallazgos como panel de texto, JSON o SARIF
Contribuciones
¡Damos la bienvenida a las contribuciones! Consulta CONTRIBUTING.md para las pautas.
Licencia
Licenciado bajo Apache License, Version 2.0 o MIT License, a tu elección.