MCP server for task and document management within a project. Provides tools for managing tasks (creation, status updates, assignments), documents (creation, organization), and project information. Integrates with Prisma ORM and PostgreSQL.
deckbook demonstrates solid tool design with 18 well-structured tools covering task and document management. All tools have descriptions (avg 180 chars, within baseline 194) and explicit JSON schemas with typed parameters. Naming follows verb_noun convention (create_task, set_task_status, read_document). However, several tools lack enum constraints for constrained inputs (status, priority fields accept free-form strings despite documented valid values), and output schemas are not formally documented, only inferred from code. Error handling is present but minimal; no recovery guidance or actionable error messages visible. Tool descriptions are domain-specific (Russian language) and clear but could better explain WHEN to use each tool vs alternatives. Parameter descriptions are present but sometimes terse (e.g., 'идентификатор задачи' vs 'task ID; required to identify which task to modify').
Назначает задачу агенту по имени. Имена агентов проекта отдаёт project_info. Задача без назначения не попадает ни в чей my_tasks.
Назначает задачу на себя — на того агента, чей токен используется. Удобнее, чем assign_task, когда агент берёт задачу сам.
Добавляет комментарий к задаче. Комментарий видно в ленте задачи (feed) — читай его в read_task. Комментарии помогают уточнить постановку и согласовать детали с человеком.
Создаёт документ в папке или в корне проекта. Документ изначально пуст; содержимое добавляется через write_document.
Создаёт папку в другой папке или в корне проекта. Папки образуют иерархию для организации документов.
Создаёт задачу в проекте. Без parentTaskId задача становится корневой; с ним — подзадачей. Родитель обязан быть задачей этого же проекта. dueAt откладывает задачу: до этого дня она не появится ни в чьём списке работы. assignee сразу отдаёт задачу агенту — без него задача ничья и не попадёт ни в один my_tasks. Имена агентов проекта отдаёт project_info.
Enum constraints missing for status and priority parameters. Tools accept free-form strings (e.g., set_task_status accepts any string for 'status' param) despite documented valid values (todo, in_progress, needs_human, done, cancelled). LLMs will hallucinate invalid values.
Output schemas not formally documented. Tool descriptions explain what is returned (e.g., 'Возвращает проект...'), but JSON Schema output definitions are absent. LLMs cannot plan downstream tool calls without knowing return field names and types.
Error handling lacks recovery guidance. Code shows validateArgs() and fail() calls, but error responses do not suggest next steps (e.g., 'Task not found. Try project_tasks() to list available tasks'). Agents cannot self-correct.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 64 | 2026-07-28+ | v2 |
Возвращает дерево документов и папок проекта. Документы — отдельное хранилище, не связанное с задачами. Папки образуют иерархию любой глубины.
Перемещает документ или папку в другую папку или в корень проекта. Циклические ссылки невозможны: нельзя сделать папку подпапкой самой себе или своего потомка.
Перемещает задачу в другую родительскую задачу или в корень проекта. Родитель обязан быть задачей этого же проекта. Циклические ссылки невозможны: нельзя сделать задачу подзадачей самой себе или своего потомка.
Задачи проекта, назначенные на тебя. Начинай работу с этого списка. Задачи со сроком в будущем в список не входят — их время ещё не пришло, браться за них рано. Сначала идут просроченные, потом сегодняшние, потом бессрочные; внутри одного срока первым идёт высокий приоритет. includeFuture покажет и будущие — бери его, только если тебя спросили про планы, а не про работу. Задача в статусе needs_human ждёт ответа человека — за неё не берись, пока статус не сменится.
Возвращает проект, внутри которого ты работаешь, его цель и его агентов — тех, на кого можно назначать задачи. Других проектов для тебя не существует. Цель — то состояние, к которому проект должен прийти: сверяйся с ней, выбирая, за что взяться.
Все задачи проекта — и свои, и чужие, и ничьи, вместе с отложенными на будущее. Это опись, а не рабочий список: работу бери из my_tasks, а сюда ходи, чтобы узнать, что в проекте уже заведено — прежде всего перед create_task, чтобы не завести дубль. У каждой задачи видно assignee: имя агента, «владелец» или null — значит, задача ничья.
Читает содержимое документа. Документ хранится в виде Markdown и возвращается как есть.
Читает задачу вместе со всеми подзадачами любой глубины и лентой задачи (feed) — комментарии людей и агентов плюс системные записи. Весь объём работы за один вызов: в ленте лежат уточнения и правки постановки, читай её прежде чем браться.
Откладывает задачу на дату или убирает срок. Задача со сроком в будущем не попадает в my_tasks — её время ещё не пришло. Дата передаётся в виде ГГГГ-ММ-ДД.
Ставит задаче приоритет: high, normal или low. Других приоритетов не существует. Приоритет не перебивает срок, а разбирает задачи внутри одного срока: в my_tasks важное всплывает выше среди задач с тем же сроком.
Меняет статус задачи. Статусы: todo (новая), in_progress (в работе), needs_human (ждёт ответа), done (готово), cancelled (отменено). Переход в done или cancelled закрывает задачу; если у неё есть recurrence, срок переставляется на следующий интервал и статус возвращается в todo.
Пишет или перезаписывает содержимое документа. Содержимое — это Markdown. Если документ уже содержит текст, он полностью заменяется.
Parameter descriptions are terse and sometimes domain-specific (Russian). E.g., 'идентификатор задачи' lacks format guidance (is it a UUID? numeric ID?). Descriptions should state format, range, and constraints explicitly.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Tools are marked with Risk: READ_ONLY or WRITE in comments, but MCP tool annotations are absent. Agents cannot infer safety properties from the schema.