context-distill

context-distill es un servidor MCP que comprime la salida de comandos ruidosos en resúmenes precisos y procesables para flujos de trabajo con LLM. Use distill_batch para registros grandes y distill_watch para deltas ciclo a ciclo. Construido con Go, Cobra, Viper y DI para una destilación confiable local y respaldada por proveedores.

Documentación

context-distill — A Context-Aware Text Summarization Library

context-distill

Una herramienta en Go que destila la salida de comandos y recupera contexto de código antes de que llegue a un LLM de pago. Disponible como Skill (recomendado), CLI independiente y servidor MCP. Inspirada en el CLI distill y construida con arquitectura hexagonal, inyección de dependencias y TDD.

Resumen

context-distill expone cuatro operaciones accesibles de tres maneras:

ModoMejor paraCómo funciona
Skill ⭐ (recomendado)Cualquier agente que pueda leer markdown y ejecutar comandos de shellEl agente lee un archivo SKILL.md desde su propio directorio de skills y aprende cuándo y cómo invocar el CLI. Cero configuración en el lado del agente.
CLIScripts locales, pipelines de CI, agentes con capacidad de shellSubcomandos directos: context-distill distill_batch, context-distill distill_mcp_output, context-distill distill_watch, context-distill search_code.
MCPAgentes/clientes con soporte MCP nativo (Claude Desktop, Cursor, Codex…)Se ejecuta como servidor MCP sobre transporte stdio.
OperaciónPropósito
distill_batchComprime la salida completa de un comando para responder una única pregunta explícita.
distill_mcp_outputDestila payloads MCP crudos, o llama a una herramienta MCP y destila su resultado en un solo paso.
distill_watchCompara dos instantáneas consecutivas y devuelve solo el delta relevante.
search_codeLocaliza código relevante en el repositorio y devuelve coincidencias compactas para el siguiente paso de razonamiento.

Los tres modos comparten los mismos casos de uso subyacentes, reglas de validación y comportamiento de salida. Solo difiere el método de invocación.

También proporciona:

  • Configuración del proveedor LLM mediante YAML y variables de entorno.
  • Una interfaz de terminal interactiva para la configuración inicial (--config-ui).
  • Soporte para Ollama y cualquier proveedor compatible con OpenAI.

Por qué se recomienda el modo Skill

SkillCLIMCP
Configuración del agente requeridaNinguna — solo coloca SKILL.md en el directorio de skills del agenteEl agente debe saber cómo ejecutar comandos de shellRegistrar el servidor en la configuración del cliente
Funciona entre agentes✅ Cualquier agente que lea markdown✅ Cualquier agente que ejecute shell⚠️ Solo clientes compatibles con MCP
Complejidad de configuraciónCopiar un archivo por agenteInstalar binarioInstalar binario + registrar transporte
PortabilidadFunciona en cualquier repositorioFunciona en cualquier shellLigado a la configuración del cliente MCP

El modo Skill funciona porque los agentes de codificación modernos (Codex, Claude Code, Cursor, Aider, OpenCode…) ya saben leer documentación de proyectos y ejecutar comandos de shell. Un archivo SKILL.md enseña al agente cuándo destilar o recuperar contexto de código y cómo llamar al CLI — sin necesidad de integración de protocolo.

Características

  • Interfaz triple — Archivo Skill para adopción sin configuración por parte del agente + CLI para uso directo en shell + herramientas MCP para clientes nativos de protocolo.
  • Cuatro operaciones principales — distill_batch, distill_mcp_output, distill_watch y search_code.
  • Arquitectura hexagonal — distill/domain, distill/application, platform/*.
  • Inyección de dependencias mediante sarulabs/di.
  • Gestión de configuración con viper + .env.
  • Validación específica del proveedor en tiempo de configuración.
  • Interfaz de configuración interactiva (--config-ui).
  • Pruebas unitarias, de integración y opcionales en vivo.

Requisitos

  • Go 1.26+
  • Make (recomendado)

Si prefieres no compilar, puedes instalar un binario precompilado desde GitHub Releases (ver más abajo).

Instalación

Opción A: Compilar desde el código fuente

make build

El binario se coloca en ./bin/context-distill.

Para instalarlo en tu PATH:

make install
# installs to ~/.local/bin/context-distill

Opción B: Binario precompilado (sin necesidad de compilar)

Linux / macOS:

# Latest release
curl -fsSL https://raw.githubusercontent.com/jcastilloa/context-distill/master/scripts/install.sh | sh

# Specific version
curl -fsSL https://raw.githubusercontent.com/jcastilloa/context-distill/master/scripts/install.sh | VERSION=vX.Y.Z sh

Windows (PowerShell):

# Latest release
iwr https://raw.githubusercontent.com/jcastilloa/context-distill/master/scripts/install.ps1 -UseBasicParsing | iex

# Specific version
$env:VERSION='vX.Y.Z'; iwr https://raw.githubusercontent.com/jcastilloa/context-distill/master/scripts/install.ps1 -UseBasicParsing | iex

Variables de entorno del instalador:

VariableValor predeterminado
REPOjcastilloa/context-distill
SERVICE_NAMEcontext-distill
INSTALL_DIR~/.local/bin (Linux/macOS) · %LOCALAPPDATA%\context-distill\bin (Windows)
VERSIONEtiqueta de la última versión

Objetivos de Makefile

make help
ObjetivoDescripción
make buildCompilar el binario en ./bin/context-distill
make installInstalar el binario en ~/.local/bin/context-distill
make cleanEliminar ./bin

Inicio rápido

1. Configurar el proveedor (todos los modos)

context-distill --config-ui

2. Verificar que funciona

echo "PASS: TestA, PASS: TestB, FAIL: TestC - expected 4 got 5" | context-distill distill_batch --question "Did tests pass? Return only PASS or FAIL. If FAIL, list failing test names."
context-distill distill_watch --question "What changed? Return one short sentence." --previous-cycle "services: api=OK, db=OK, cache=OK" --current-cycle "services: api=OK, db=FAIL, cache=OK"
context-distill distill_mcp_output \
  --tool-name "list_items" \
  --question "Return only item names, one per line." \
  --output '[{"type":"text","text":"[{\"id\":\"a1\",\"name\":\"Alpha\"},{\"id\":\"b2\",\"name\":\"Beta\"}]"}]'
context-distill distill_mcp_output \
  --server-command "/absolute/path/to/mcp-server" \
  --server-arg "--transport" \
  --server-arg "stdio" \
  --tool-name "get_status" \
  --tool-arguments '{"scope":"production"}' \
  --question "Return only status and version as JSON."
context-distill search_code --query "provider_name" --mode text --question "Return only file:line, one per line."

Si los comandos devuelven respuestas compactas esperadas, la configuración está lista.

3. Elegir tu modo

⭐ Modo Skill (recomendado)

Copia SKILL.md en el directorio de skills del agente correspondiente (ver Configuración de Skill). Tu agente lo leerá automáticamente y comenzará a destilar.

Modo CLI

Usa los subcomandos directamente en scripts o llamadas de shell del agente:

# Pipe (preferred)
echo "data" | context-distill distill_batch --question "..."

# Explicit flag
context-distill distill_batch --question "..." --input "data"

# Explicit stdin marker
echo "data" | context-distill distill_batch --question "..." --input -

# MCP payload distillation
context-distill distill_mcp_output --tool-name "list_items" --question "Return only item names." --output '<mcp payload>'

# MCP call + distillation in one step
context-distill distill_mcp_output --server-command "/absolute/path/to/mcp-server" --server-arg "--transport" --server-arg "stdio" --tool-name "get_status" --tool-arguments '{"scope":"production"}' --question "Return only status and version as JSON."

# Code retrieval
context-distill search_code --query "LoadDistillConfig" --mode symbol --question "Return likely definitions first as file:line, one per line."

Modo MCP

context-distill --transport stdio

Luego registra el servidor en tu cliente MCP (ver Registro de cliente MCP).


Configuración de Skill (Recomendado)

El skill canónico instalable ahora vive en SKILL.md.

Ese archivo es el lugar más claro para aprender el comportamiento y el archivo más fácil de copiar en un directorio de skills de agente.

El skill ahora cubre cuatro flujos de trabajo concretos:

  1. Destilar salida larga de comandos con distill_batch.
  2. Destilar payloads MCP crudos que ya tienes con distill_mcp_output --output.
  3. Llamar a una herramienta MCP y destilar el resultado en un solo paso con distill_mcp_output --server-command.
  4. Localizar código antes de abrir muchos archivos con search_code.

Plantillas adicionales listas para copiar viven aquí:

Dónde instalar el Skill

Instala SKILL.md a nivel de proyecto, nivel global, o ambos:

AgenteRuta a nivel de proyectoRuta global
Claude Code.claude/skills/context-distill/SKILL.md~/.claude/skills/context-distill/SKILL.md
Codex.codex/skills/context-distill/SKILL.md~/.codex/skills/context-distill/SKILL.md
OpenCode.opencode/skills/context-distill/SKILL.md~/.opencode/skills/context-distill/SKILL.md
Cursor.cursor/skills/context-distill/SKILL.md~/.cursor/skills/context-distill/SKILL.md

A nivel de proyecto (recomendado para equipos): cada agente que trabaje en el repositorio lo recoge automáticamente.

Global (recomendado para uso personal): disponible en cada proyecto sin configuración por repositorio.

Ejemplo de instalación rápida (Claude Code, nivel de proyecto)

mkdir -p .claude/skills/context-distill
cp SKILL.md .claude/skills/context-distill/SKILL.md

Ejemplo de instalación rápida (todos los agentes, global)

for agent in .claude .codex .opencode .cursor; do
  mkdir -p ~/"$agent"/skills/context-distill
  cp SKILL.md ~/"$agent"/skills/context-distill/SKILL.md
done

Referencia de comandos CLI

Los comandos CLI proporcionan las mismas capacidades que las herramientas MCP (destilación + recuperación de código) pero se invocan directamente desde el shell. Úsalos en scripts locales, pipelines de CI, o con tiempos de ejecución de agentes que ejecutan comandos de shell en lugar de herramientas MCP.

Métodos de entrada

# 1. Pipe (preferred)
echo "data" | context-distill distill_batch --question "..."

# 2. Explicit flag
context-distill distill_batch --question "..." --input "data"

# 3. Explicit stdin marker
echo "data" | context-distill distill_batch --question "..." --input -

distill_batch

Destila un payload de salida crudo usando un contrato de pregunta explícito.

go test ./... 2>&1 | context-distill distill_batch --question "Did all tests pass? Return only PASS or FAIL."

Banderas:

BanderaRequeridaDescripción
--questionsíPregunta exacta a responder a partir de la salida del comando.
--inputnoSalida cruda del comando a destilar. Si se omite, lee desde stdin.

distill_mcp_output

Destila resultados MCP en cualquiera de estos modos:

  1. Ya tienes un payload MCP crudo y lo pasas con --output.
  2. Quieres que context-distill llame primero a una herramienta MCP y luego destile el resultado.
context-distill distill_mcp_output \
  --tool-name "list_items" \
  --question "Return only item names, one per line." \
  --output '<mcp payload>'
context-distill distill_mcp_output \
  --server-command "/absolute/path/to/mcp-server" \
  --server-arg "--transport" \
  --server-arg "stdio" \
  --tool-name "get_status" \
  --tool-arguments '{"scope":"production"}' \
  --question "Return only status and version as JSON."

Banderas:

BanderaRequeridaDescripción
--questionsíPregunta exacta a responder a partir del resultado MCP.
--tool-nameno*Contexto útil al usar --output; requerido al invocar un servidor.
--outputno*Payload MCP crudo a destilar directamente.
--server-commandno*Binario del servidor MCP a invocar cuando se omite --output.
--server-argnoArgumento del servidor MCP. Repetir para múltiples valores.
--tool-argumentsnoObjeto JSON pasado a la herramienta MCP objetivo.

* Debes proporcionar ya sea --output o una invocación de servidor (--server-command + --tool-name).

distill_watch

Destila solo el delta relevante entre dos instantáneas.

context-distill distill_watch \
  --question "Return only newly failing services, one per line." \
  --previous-cycle "$(cat /tmp/health.prev)" \
  --current-cycle "$(cat /tmp/health.curr)"

Banderas:

BanderaRequeridaDescripción
--questionsíPregunta exacta a responder a partir de los cambios del ciclo.
--previous-cyclesíInstantánea de salida del ciclo de vigilancia anterior.
--current-cyclesíInstantánea de salida del ciclo de vigilancia actual.

search_code

Busca código del repositorio localmente y destila coincidencias compactas según --question.

context-distill search_code \
  --query "distill_watch" \
  --mode symbol \
  --question "Return definitions first, then usages, as file:line."

Importante:

  • La sintaxis CLI usa banderas. Usa --query, --mode, --question, --max-results, --context-lines.
  • No uses argumentos de shell como search_code mode=text query="..." max_results=5 (ese formato no es sintaxis CLI válida).
  • Para --mode path, trata --query como un fragmento de ruta (por ejemplo, .go), y usa --scope para filtros glob.

Banderas:

BanderaRequeridaDescripción
--querysíConsulta de búsqueda para texto, regex, nombre de símbolo o fragmento de ruta.
--modesíModo de búsqueda: text, regex, symbol o path.
--questionsíContrato de salida para el resultado compacto final.
--scopenoFiltros glob opcionales (repetir bandera o separados por comas).
--max-resultsnoLímite máximo para candidatos devueltos (predeterminado 20).
--context-linesnoLíneas de contexto alrededor de cada coincidencia (predeterminado 2).

Notas del CLI

  • Los comandos CLI y las herramientas MCP comparten los mismos casos de uso subyacentes y reglas de validación.
  • Entradas inválidas/faltantes devuelven un código de salida distinto de cero.
  • La salida se escribe en la salida estándar exactamente como la produce el caso de uso seleccionado.

Modo servidor MCP

Ejecutar el servidor

context-distill --transport stdio
# or without building:
go run ./cmd/server --transport stdio

Versión

go run ./cmd/server version

Banderas del servidor

BanderaDescripciónPredeterminado
--transportModo de transporte MCP (stdio)service.transport
--config-uiAbrir interfaz de configuración y salirfalse

Registro de cliente MCP

Después de compilar o instalar el binario, regístralo en tu cliente MCP para usar la interfaz de herramientas.

Clientes basados en JSON (Claude Desktop, Cursor, etc.)

{
  "mcpServers": {
    "context-distill": {
      "command": "/absolute/path/to/context-distill",
      "args": ["--transport", "stdio"]
    }
  }
}

Codex — TOML manual (recomendado)

Agrega a ~/.codex/config.toml:

[mcp_servers.context-distill]
command = "/absolute/path/to/context-distill"
args = ["--transport", "stdio"]
startup_timeout_sec = 20.0

Si usaste make install:

[mcp_servers.context-distill]
command = "/home/<your-user>/.local/bin/context-distill"
args = ["--transport", "stdio"]
startup_timeout_sec = 20.0

Codex — registro CLI

codex mcp add context-distill -- /absolute/path/to/context-distill --transport stdio

Verifica:

codex mcp list
codex mcp get context-distill

Reinicia tu sesión de Codex para que detecte el nuevo servidor.

OpenCode — CLI interactivo

opencode mcp add

Sigue las indicaciones:

  1. Ubicación → Current project o Global.
  2. Nombre → context-distill.
  3. Tipo → local.
  4. Comando → /absolute/path/to/context-distill --transport stdio.

Verifica:

opencode mcp list

Si el servidor aún no está conectado, reinicia tu sesión de OpenCode.

OpenCode — configuración manual (opencode.json)

{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "context-distill": {
      "type": "local",
      "command": ["/absolute/path/to/context-distill", "--transport", "stdio"],
      "enabled": true
    }
  }
}

Notas de registro

  • Usa siempre una ruta absoluta del binario.
  • Usa siempre transporte stdio.
  • Si el servidor no aparece, ejecuta codex mcp list --json para inspeccionar la configuración resuelta.

Referencia de herramientas MCP

Las herramientas MCP exponen las mismas capacidades que los comandos CLI (destilación + recuperación de código), pero son consumidas por clientes compatibles con MCP a través del transporte stdio.

distill_batch

ParámetroTipoRequeridoDescripción
questionstringsíQué extraer de la entrada. Debe incluir un contrato de salida.
inputstringsíSalida cruda del comando a destilar.

Devuelve una respuesta corta y enfocada a question.

distill_watch

ParámetroTipoRequeridoDescripción
questionstringsíQué delta informar. Debe incluir un contrato de salida.
previous_cyclestringsíInstantánea del ciclo anterior.
current_cyclestringsíInstantánea del ciclo actual.
Devuelve un resumen breve de los cambios relevantes, o un mensaje de sin cambios cuando no hay diferencias significativas.

search_code

ParámetroTipoObligatorioDescripción
querystringsíConsulta de búsqueda para texto, regex, símbolo o ruta.
modestringsíModo de búsqueda: text, regex, symbol, path.
questionstringsíContrato de salida para la respuesta destilada.
scopearray[string]noFiltros opcionales de ámbito glob.
max_resultsnumbernoLímite estricto de coincidencias (predeterminado 20).
context_linesnumbernoLíneas de contexto por coincidencia (predeterminado 2).

Devuelve una salida compacta controlada por question, después de la recuperación local del repositorio.

Notas:

  • Esta sección documenta los campos de carga útil de las herramientas MCP (snake_case), no las opciones de shell.
  • Los equivalentes de CLI son --query, --mode, --question, --scope, --max-results, --context-lines.

Configuración

Interfaz de terminal (recomendada para la primera configuración)

context-distill --config-ui
# or without building:
go run ./cmd/server --config-ui

Campos editables:

CampoNotas
provider_nameLista desplegable de proveedores compatibles.
base_urlObligatorio para proveedores compatibles con OpenAI.
api_keyEntrada enmascarada. Obligatorio para openai, openrouter, jan.

Reglas de validación:

  • Los proveedores que requieren una clave de API bloquean el guardado hasta que se ingrese una.
  • Los proveedores compatibles con OpenAI requieren un base_url.
  • Los alias de proveedores se normalizan automáticamente (p. ej. OpenAI Compatible → openai-compatible, dmr → docker-model-runner).

Ruta de configuración persistida: ~/.config/context-distill/config.yaml

El guardado conserva las secciones YAML existentes (service, openai, etc.) y actualiza solo los campos relevantes de distill.

Configuración manual de YAML

También puedes editar el archivo de configuración directamente.

Orden de búsqueda:

  1. ~/.config/<service>/config.yaml
  2. ./config.yaml

Ejemplo de config.yaml:

service:
  transport: stdio

openai:
  provider_name: openai
  api_key: sk-xxxx
  base_url: https://api.openai.com/v1
  model: gpt-4o-mini
  timeout: 30s
  max_retries: 3
  supports_system_role: true
  supports_json_mode: true

distill:
  provider_name: ollama
  base_url: http://127.0.0.1:11434
  model: qwen3.5:2b
  timeout: 90s
  max_retries: 0
  thinking: false

Nota: service.version se inyecta en tiempo de compilación desde los metadatos del binario y no es necesario configurarlo manualmente.

Matriz de proveedores

ProveedorTransporteClave de API obligatoriaURL base predeterminada
ollamaollama nativoNohttp://127.0.0.1:11434
openaicompatible con OpenAISíhttps://api.openai.com/v1
openroutercompatible con OpenAISíhttps://openrouter.ai/api/v1
openai-compatiblecompatible con OpenAINo (depende del backend)—
lmstudiocompatible con OpenAINohttp://127.0.0.1:1234/v1
jancompatible con OpenAISíhttp://127.0.0.1:1337/v1
localaicompatible con OpenAINohttp://127.0.0.1:8080/v1
vllmcompatible con OpenAINohttp://127.0.0.1:8000/v1
sglangcompatible con OpenAINo—
llama.cppcompatible con OpenAINo—
mlx-lmcompatible con OpenAINo—
docker-model-runnercompatible con OpenAINohttp://127.0.0.1:12434/engines/v1

Cómo escribir buenas preguntas

La calidad de la salida de destilación/búsqueda depende del contrato question — ya sea que se invoque mediante Skill, CLI o MCP. Sé explícito sobre qué quieres y en qué formato.

Malas preguntas

  • "What happened?"
  • "Summarize this"

Buenas preguntas

  • "Did tests pass? Return only PASS or FAIL. If FAIL, list failing test names, one per line."
  • "List only changed file paths, one per line."
  • "Return valid JSON only with keys: severity, file, message."

Ejemplos de distill_batch

FuentePregunta
go test ./..."Did tests pass? Return only PASS or FAIL."
git diff"List changed files and one short reason per file. Max 10 lines."
Registros de CI"Return only blocking errors with file and line if available."

Ejemplos de distill_watch

InstantáneasPregunta
Salida del observador de pruebas en T−1 / T"What changed in failure count? Return one short sentence."
Estado de implementación en T−1 / T"Return only newly failing services, one per line."

Ejemplos de search_code

ModoPregunta
text"Return only file:line, one per line."
symbol"Return likely definitions first, then usages, as file:line."
path"Return matching file paths only, one per line."

Plantillas de AGENTS.md

Si prefieres incrustar instrucciones directamente en el AGENTS.md de tu proyecto, usa los archivos independientes en lugar de copiar bloques grandes de este README:

Política sugerida en una línea

Incluye esto en la documentación de tu proyecto para una referencia rápida:

Default policy: use `context-distill` (via Skill, CLI, or MCP) to distill command output and run `search_code` for repository localization before sending data to an LLM, unless raw output is explicitly required.

Estructura del proyecto

context-distill/
├── cmd/
│   └── server/
│       ├── main.go
│       ├── bootstrap.go
│       └── openai_distill_config.go
├── distill/
│   ├── application/
│   │   └── distillation/
│   └── domain/
├── mcp/
│   ├── application/
│   └── domain/
├── platform/
│   ├── config/
│   ├── configui/
│   ├── di/
│   ├── mcp/
│   │   ├── commands/
│   │   ├── server/
│   │   └── tools/
│   ├── ollama/
│   └── openai/
├── shared/
│   ├── ai/domain/
│   └── config/domain/
├── SKILL.md
├── config.sample.yaml
├── config.yaml
├── Makefile
└── AGENTS.md

Arquitectura

Regla de dependencias:

platform  →  shared + distill/application + distill/domain
distill/application  →  distill/domain
cmd  →  platform + shared

Restricción: shared y distill/domain nunca deben importar platform.

Desarrollo

Pruebas y comprobaciones estáticas

go test ./...
go vet ./...

Flujo de trabajo local sugerido

  1. go test ./...
  2. context-distill --config-ui
  3. Verifica que la CLI funcione:
    echo "hello world" | context-distill distill_batch --question "Return the input verbatim."
    context-distill search_code --query "provider_name" --mode text --question "Return only file:line, one per line."
    
  4. (Opcional) Inicia el servidor MCP: context-distill --transport stdio
  5. Valida el comportamiento desde tu cliente MCP o mediante comandos de CLI.

Prueba en vivo opcional (proveedor real)

DISTILL_LIVE_TEST=1 OPENAI_BASE_URL=https://openrouter.ai/api/v1 \
go test -tags=live ./platform/di -run TestLiveDistillBatchWithOpenAICompatibleProvider -v

Solución de problemas

ProblemaSolución
provider unauthorizedVerifica distill.api_key (o el respaldo openai.api_key, según el proveedor).
requires base_urlEstablece distill.base_url. La ruta más rápida es --config-ui.
El cliente MCP no detecta el servidorConfirma que la ruta del binario sea absoluta, tenga permisos de ejecución y que el transporte sea stdio.
El servidor falla en la validación de configuraciónEjecuta --config-ui para la configuración inicial y luego inicia normalmente.
El comando de CLI devuelve un código de salida distinto de ceroVerifica que las opciones obligatorias estén presentes y no vacías (distill_batch: --question; distill_mcp_output: --question más --output o --server-command + --tool-name; distill_watch: --question, --previous-cycle, --current-cycle; search_code: --query, --mode, --question).
distill_mcp_output falla antes de la ejecución de la herramientaVerifica que --tool-arguments sea JSON válido y que la ruta del comando del servidor MCP sea absoluta y ejecutable.
search_code falla con query is required a pesar de pasar valoresProbablemente usaste argumentos de estilo MCP (mode=text query=...) en el shell. Usa opciones de CLI: context-distill search_code --mode text --query "..." --question "...".
El agente ignora SKILL.mdAsegúrate de que el archivo esté dentro del directorio de habilidades del agente correcto (p. ej. .claude/skills/context-distill/SKILL.md). Consulta la tabla de Configuración de Skill para todas las rutas.

Seguridad

  • Nunca confirmes claves de API reales en repositorios públicos.
  • Prefiere secretos basados en variables de entorno en entornos compartidos o de CI.

Licencia

Copyright © 2026 jcastilloa. Todos los derechos reservados.

Se permite la redistribución y el uso en formas de código fuente y binarias, con o sin modificación, siempre que se cumplan las siguientes condiciones:

  1. Las redistribuciones del código fuente deben conservar el aviso de copyright anterior, esta lista de condiciones y el siguiente descargo de responsabilidad.
  2. Las redistribuciones en forma binaria deben reproducir el aviso de copyright anterior, esta lista de condiciones y el siguiente descargo de responsabilidad en la documentación y/u otros materiales proporcionados con la distribución.
  3. Ni el nombre del titular de los derechos de autor ni los nombres de sus contribuyentes pueden usarse para respaldar o promocionar productos derivados de este software sin permiso previo por escrito específico.

ESTE SOFTWARE SE PROPORCIONA POR LOS TITULARES DE LOS DERECHOS DE AUTOR Y LOS CONTRIBUYENTES "TAL CUAL" Y SE RECHAZA CUALQUIER GARANTÍA EXPRESA O IMPLÍCITA, INCLUIDAS, ENTRE OTRAS, LAS GARANTÍAS IMPLÍCITAS DE COMERCIABILIDAD E IDONEIDAD PARA UN PROPÓSITO PARTICULAR. EN NINGÚN CASO EL TITULAR DE LOS DERECHOS DE AUTOR O LOS CONTRIBUYENTES SERÁN RESPONSABLES DE CUALQUIER DAÑO DIRECTO, INDIRECTO, INCIDENTAL, ESPECIAL, EJEMPLAR O CONSECUENTE (INCLUIDOS, ENTRE OTROS, LA ADQUISICIÓN DE BIENES O SERVICIOS SUSTITUTOS; LA PÉRDIDA DE USO, DATOS O BENEFICIOS; O LA INTERRUPCIÓN COMERCIAL) CUALQUIERA QUE SEA LA CAUSA Y SOBRE CUALQUIER TEORÍA DE RESPONSABILIDAD, YA SEA POR CONTRATO, RESPONSABILIDAD ESTRICTA O AGRAVIO (INCLUIDA LA NEGLIGENCIA U OTRA) QUE SURJA DE CUALQUIER MANERA DEL USO DE ESTE SOFTWARE, INCLUSO SI SE ADVIERTE DE LA POSIBILIDAD DE DICHOS DAÑOS.