deadwax
Deadwax
Агентный музыкальный библиотекарь для личной истории прослушиваний. Он отвечает на вопросы на естественном языке о том, что вы слушали, и собирает плейлисты с учётом жёстких ограничений — с детерминированным валидатором, циклом восстановления и набором для оценки, который сообщает показатели успешных прохождений, а не просто «прошло/не прошло».
Создан как портфолио-проект, демонстрирующий практику промышленной разработки LLM: использование инструментов, поиск, трассировку, оценку и MCP.
Самое интересное
Большинство LLM-демо работают, пока не запустишь их дважды. Deadwax построен вокруг того, что происходит при втором запуске.
Система разделена одной линией: модель никогда не вычисляет. Она интерпретирует язык, выбирает инструменты и составляет прозу. Каждая арифметическая операция, проверка порогов и разрешение ограничений выполняются в обычном Python, который понятия не имеет о существовании LLM. Когда плейлист нарушает ограничение, валидатор не возвращает False — он возвращает код нарушения, идентификаторы треков-нарушителей и конкретное исправление, и только поэтому автоматический цикл восстановления вообще может работать.
Выполнимость проверяется до генерации. Если бриф невозможно удовлетворить, система прямо об этом говорит. Она никогда не дополняет, не подменяет и не деградирует молча — status="infeasible" — это корректный результат со своими собственными оценочными кейсами.
Related MCP server: Navidrome-MCP
Правила архитектуры
Это не стилистические предпочтения. Нарушение любого из этих правил сводит на нет цель проекта.
Модель никогда не вычисляет.
Описания инструментов — это управление поведением: они являются промптами, а не документацией. Изменение любого из них — это изменение поведения, и оно переоценивается перед слиянием.
Нарушения должны быть машинообрабатываемыми: код, идентификаторы нарушителей, исправление. Никогда — голое булево значение, никогда — только проза.
Выполнимость проверяется до генерации.
Неудача — допустимый результат.
Жёсткие ограничения измеряются и обеспечиваются. Мягкие ограничения выводятся и оцениваются и несут поле
provenance, которое должно быть раскрыто в любом сообщении о них.Ни одного вызова модели без трассировки.
Решения и их компромиссы задокументированы в docs/adr.
Стек
Всё работает на бесплатном тарифе. Это жёсткое ограничение, а не предпочтение.
Слой | Выбор |
Язык | Python 3.13 |
Инструменты | uv для зависимостей и самого Python, ruff для линтинга и форматирования, pytest |
Агент | LangChain, появляется на этапе 3 и не раньше |
Модель | Google Gemini Flash, с запасным вариантом OpenRouter |
Хранилище | SQLite через модуль стандартной библиотеки |
Поиск | Эмбеддинги на этапе сборки, косинусная близость на чистом Python — без векторной базы данных |
Трассировка | Langfuse |
Взаимодействие | сервер Model Context Protocol |
Фронтенд | Astro на Cloudflare Pages — единственный JavaScript-компонент |
Этапы с 0 по 2 используют только стандартную библиотеку — никаких фреймворков, SDK и зависимостей. Сырой HTTP-вызов пишется вручную до введения каких-либо абстракций, чтобы, когда фреймворк искажает то, что он делает, разница была видна.
Ход разработки
Двенадцать этапов, четыре фазы. Одна ветка и один PR со squash-merge на каждый этап, так что история читается так, как реально шла разработка.
Фаза | Этап | Статус |
A · Основа | 0 · Один сырой вызов | 🔨 в процессе |
A · Основа | 1 · Тестовые данные | ⬜ |
A · Основа | 2 · Детерминированное ядро | ⬜ |
B · Агент | 3 · Первый цикл инструментов | ⬜ |
B · Агент | 4 · Измерить нестабильность | ⬜ |
B · Агент | 5 · Оценочный стенд | ⬜ |
C · Доводка | 6 · Цикл восстановления | ⬜ |
C · Доводка | 7 · Состязательные случаи | ⬜ |
C · Доводка | 8 · Трассировка | ⬜ |
C · Доводка | 9 · Поиск | ⬜ |
D · Релиз | 10 · Реальные данные | ⬜ |
D · Релиз | 11 · MCP-сервер | ⬜ |
D · Релиз | 12 · Сайт и статья | ⬜ |
Запуск
Вам понадобится uv. Он устанавливает и управляет самим Python, так что это единственное необходимое условие.
winget install --id=astral-sh.uv -eЗатем, из корня репозитория:
uv syncЭто создаёт виртуальное окружение, устанавливает зафиксированную версию Python из .python-version и устанавливает проект.
Добавьте бесплатный API-ключ Gemini из Google AI Studio:
copy .env.example .envВставьте ключ после GEMINI_API_KEY=. Затем посмотрите, к каким моделям ваш ключ имеет доступ, поскольку каталоги бесплатного тарифа меняются без предупреждения:
uv run scripts/raw_call.py --listПоместите один из этих идентификаторов в .env как GEMINI_MODEL и выполните вызов:
uv run scripts/raw_call.pyОн выводит полный запрос и полный ответ перед извлечением ответа. В этом и смысл скрипта — структуры стоит знать, прежде чем фреймворк их скроет.
Фактические лимиты запросов вашего аккаунта показаны на aistudio.google.com/rate-limit; Google больше не публикует таблицу бесплатных тарифов по моделям в документации API.
Оценка
Оценочный набор появляется на этапе 5. Кейсы пишутся вручную и никогда не генерируются — если один и тот же инструмент пишет и код, и оценку, результат ничего не значит. Результаты сообщаются как доля успешных прохождений по множественным запускам, потому что единственное успешное прохождение на недетерминированной системе — это анекдот.
Любой коммит, который меняет промпт, описание инструмента или модель, должен содержать в сообщении оценки до/после.
Лицензия
MIT. См. LICENSE.
Создано David Koen.
This server cannot be installed
Maintenance
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
- FlicenseBqualityDmaintenanceEnables 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.713
- AlicenseNot gradedqualityAmaintenanceAnalyze listening patterns, create custom playlists, discover missing albums, validate radio streams, and provide personalized recommendations through natural language.26783AGPL 3.0
- AlicenseNot gradedqualityDmaintenanceEnables 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.1095MIT
- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to search YouTube Music, manage playlists, and create smart recommendations using natural language.13
Related MCP Connectors
Deterministic music theory for agents: analyze, voice, reharmonize, conduct — computed, not guessed
Adaptive plan/build/review cycles for AI coding assistants, persisted across sessions.
Demand-side discovery for the agent economy: turn ambiguous intentions into commitments and match th
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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