Skip to main content
Glama

Deadwax

CI

Un bibliotecario musical agéntico sobre un historial de escucha personal. Responde preguntas en lenguaje natural sobre lo que has escuchado y crea listas de reproducción sujetas a restricciones duras — con un validador determinista, un bucle de reparación y una suite de evaluación que informa tasas de aprobado en lugar de aprobado/suspenso.

Construido como pieza de portafolio que demuestra prácticas de ingeniería de LLM en producción: uso de herramientas, recuperación, trazado, evaluación y MCP.

La parte interesante

La mayoría de las demos de LLM funcionan hasta que las ejecutas dos veces. Deadwax está construido en torno a lo que ocurre en la segunda ejecución.

El sistema se divide en una línea: el modelo nunca calcula. Interpreta el lenguaje, elige herramientas y compone prosa. Cada operación aritmética, comprobación de umbrales y adjudicación de restricciones ocurre en Python puro que no tiene idea de que existe un LLM. Cuando una lista de reproducción viola una restricción, el validador no devuelve False — devuelve un código de violación, los ids de las pistas infractoras y un remedio concreto, que es la única razón por la que un bucle de reparación automatizado puede funcionar.

La viabilidad se comprueba antes de la generación. Si un encargo no puede satisfacerse, el sistema lo dice. Nunca rellena, sustituye ni degrada silenciosamente — status="infeasible" es un resultado correcto con sus propios casos de evaluación.

Related MCP server: Navidrome-MCP

Reglas de arquitectura

No son preferencias estilísticas. Violar cualquiera de estas anula el propósito del proyecto.

  1. El modelo nunca calcula.

  2. Las descripciones de herramientas son control de comportamiento — son prompts, no documentación. Cambiar una es un cambio de comportamiento y se re-evalúa antes de fusionar.

  3. Las violaciones son procesables por máquina: un código, los ids infractores, un remedio. Nunca un booleano desnudo, nunca prosa sola.

  4. La viabilidad se comprueba antes de la generación.

  5. El fracaso es un resultado válido.

  6. Las restricciones duras se miden y se hacen cumplir. Las restricciones blandas se infieren y se puntúan, y llevan un campo provenance que cualquier mensaje sobre ellas debe revelar.

  7. Ninguna llamada al modelo sin una traza.

Las decisiones y sus compensaciones se documentan en docs/adr.

Stack

Todo se ejecuta en un plan gratuito. Eso es una restricción dura, no una preferencia.

Capa

Elección

Lenguaje

Python 3.13

Cadena de herramientas

uv para las dependencias y el propio Python, ruff para lint y formato, pytest

Agente

LangChain, introducido en la etapa 3 y no antes

Modelo

Google Gemini Flash, con respaldo de OpenRouter

Almacenamiento

SQLite mediante el módulo de la biblioteca estándar sqlite3

Recuperación

Embeddings en tiempo de compilación, similitud coseno en Python puro — sin base de datos vectorial

Trazado

Langfuse

Interoperabilidad

Servidor Model Context Protocol

Frontend

Astro en Cloudflare Pages — el único componente JavaScript

Las etapas 0 a 2 usan solo la biblioteca estándar — sin framework, sin SDK, sin dependencias. La llamada HTTP en bruto se escribe a mano antes de introducir cualquier abstracción, de modo que cuando un framework tergiversa lo que hace, la diferencia es visible.

Progreso de la construcción

Doce etapas, cuatro fases. Una rama y un PR con squash-merge por etapa, de modo que el historial se lee como la construcción realmente ocurrió.

Fase

Etapa

Estado

A · Cimientos

0 · Una llamada en bruto

🔨 en curso

A · Cimientos

1 · Datos de prueba

A · Cimientos

2 · Núcleo determinista

B · El agente

3 · Primer bucle de herramientas

B · El agente

4 · Medir la variabilidad

B · El agente

5 · Banco de pruebas de evaluación

v0.5

C · Mejorándolo

6 · Bucle de reparación

C · Mejorándolo

7 · Casos adversariales

C · Mejorándolo

8 · Trazado

C · Mejorándolo

9 · Recuperación

v0.9

D · Lanzamiento

10 · Datos reales

D · Lanzamiento

11 · Servidor MCP

D · Lanzamiento

12 · Sitio y artículo

v1.0

Cómo ejecutarlo

Necesitas uv. Instala y gestiona el propio Python, así que es el único requisito previo.

winget install --id=astral-sh.uv -e

Luego, desde la raíz del repositorio:

uv sync

Eso crea un entorno virtual, instala la versión de Python fijada desde .python-version e instala el proyecto.

Añade una clave gratuita de Gemini API desde Google AI Studio:

copy .env.example .env

Pega la clave después de GEMINI_API_KEY=. Luego mira a qué modelos puede acceder tu clave, ya que los catálogos del plan gratuito cambian sin previo aviso:

uv run scripts/raw_call.py --list

Pon uno de esos ids en .env como GEMINI_MODEL y haz la llamada:

uv run scripts/raw_call.py

Imprime la solicitud completa y la respuesta completa antes de extraer la respuesta. Ese es el objetivo del script — las formas merecen conocerse antes de que un framework las oculte.

Los límites de velocidad reales de tu cuenta se muestran en aistudio.google.com/rate-limit; Google ya no publica una tabla de plan gratuito por modelo en la documentación de la API.

Evaluación

La suite de evaluación llega en la etapa 5. Los casos se escriben a mano y nunca se generan — si la misma herramienta escribe tanto el código como la calificación, la puntuación no significa nada. Las puntuaciones se informan como tasas de aprobado en ejecuciones repetidas, porque un solo aprobado en un sistema no determinista es una anécdota.

Cualquier commit que cambie un prompt, una descripción de herramienta o un modelo lleva puntuaciones de evaluación antes/después en su mensaje.

Licencia

MIT. Consulta LICENSE.

Creado por David Koen.

A
license - permissive license
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • F
    license
    B
    quality
    D
    maintenance
    Enables music management through search, playlist creation, and intelligent recommendations. Supports searching by song, artist, or album, creating and managing playlists, and getting music recommendations based on genre and mood.
    7
    13
  • A
    license
    Not graded
    quality
    A
    maintenance
    Analyze listening patterns, create custom playlists, discover missing albums, validate radio streams, and provide personalized recommendations through natural language.
    267
    83
    AGPL 3.0
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables interaction with Spotify through natural language for music discovery, playback control, library management, and playlist creation. Supports searching for music, controlling playback, managing saved tracks, and getting personalized recommendations based on mood and preferences.
    109
    5
    MIT

View all related MCP servers

Related MCP Connectors

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/TheDavidKoen/deadwax'

If you have feedback or need assistance with the MCP directory API, please join our Discord server