todo-mcp
todo-mcp
MCP-сервер, хранилище которого — файл TODO.md, который можно читать, редактировать вручную и смотреть в диффе. Записи выполняются байтовой склейкой диапазонов: файл остаётся вашим — свёрстанные вручную таблицы, отступы табами и любой текст вне рамок задачи никогда не пере-сериализуются.
Для MCP-клиентов говорит на stdio, для всего остального — на Streamable HTTP.
Благодарность
Основано на CalamityAdam/mcp-todo, который дал исходный каркас: форму фабрики createTodoMcpServer, обёртку Express для Streamable HTTP и обработку сессий.
Почти всё остальное не сохранилось. Та версия хранила задачи как нумерованные записи в JSON-блобе ~/.mcp-todos.json и трёх инструментах над { id, title, done }. Эта версия заменяет хранилище на markdown-документ, меняет числовые ID на слаг-идентификаторы и расширяет набор инструментов до семи: статусы, области, ссылки-хлебные крошки, датированные заметки в логе, полнотекстовый поиск и обнаружение дубликатов. Общей реализации между проектами больше нет.
Апстрим не содержит файла LICENSE; его package.json объявляет лицензию ISC, и именно её ведёт дальше этот репозиторий.
Related MCP server: MCP Project Manager
Установка
Запускайте прямо из GitHub, без клонирования:
npx github:adrianhardy/todo-mcpПосле внесённого изменения выполняйте npx --ignore-saving github:adrianhardy/todo-mcp, чтобы подтянуть свежие правки.
Для обычной работы достаточно установить один раз и больше не думать:
npm i -g github:adrianhardy/todo-mcp
todo-mcpОба пути при установке собирают проект из исходников через скрипт prepare, поэтому dist/ никогда не закоммичивается. Нужен Node 20 или новее.
Использование
todo-mcp по умолчанию запускает HTTP-сервер, потому что именно это удобно, когда человек запускает его в терминале. Задайте MCP_STDIO=1, чтобы вместо этого говорить на stdio — это то, что хочет MCP-клиент, поднимающий сервер в качестве субпроцесса.
С MCP-клиентом
{
"mcpServers": {
"todo": {
"command": "npx",
"args": ["-y", "github:adrianhardy/todo-mcp"],
"env": { "MCP_STDIO": "1" }
}
}
}При глобальной установке это превращается в "command": "todo-mcp" с тем же блоком env.
Рабочая директория решает, какой файл вы получите. Значение TODO_FILE резолвится относительно cwd процесса и по умолчанию равно TODO.md, поэтому клиент, запущенный в проекте, правит именно его todo-список. Задайте TODO_FILE как абсолютный путь, если нужен один общий список независимо от того, откуда стартует сервер.
По HTTP
PORT=8080 TODO_MCP_TOKEN=$(openssl rand -hex 32) todo-mcpPOST /mcp— JSON-RPC запросыGET /mcp— SSE-поток для уведомлений сервераDELETE /mcp— завершение сессии
Если задать TODO_MCP_TOKEN, все три маршрута потребуют заголовок Authorization: Bearer <token>. Если переменная не задана, аутентификация отключена: это подходит исключительно localhost и больше нигде.
Конфигурация
переменная | по умолчанию | значение |
|
| путь к хранилищу, относительный от cwd |
| не задано |
|
|
| HTTP-порт |
| не задано | bearer-токен; не задано — нет аутентификации |
Файл .env читается, если он есть. Смотрите .env.example.
Хранилище
TODO.md — это и есть хранилище, а не JSON-блоб. Файл заодно становится записью: он прочитаем, доступен для ручного редактирования и виден в git-диффе.
Задача — это секция с ## . Полями, за которые отвечает сервер, находится в блоке комментария сразу под заголовком; всё, что ниже, — текст, за который отвечает человек.
## Feature Idea version two: the new widget which tracks things
<!-- todo
id: feature-idea-version-two
area: inventory
status: next
refs: [./src/do_stuff.ts, ClassName.Method, OtherClassName]
created: 2026-08-19
updated: 2026-08-22
-->
**Next step:** close the ledger. ClassName.Method uses 0.25 and it needs 17.2%.
**Already known:** ...
### Log
- 2026-08-22 Slab_Wall_1x3 not started; parade places 24 of those to every 6 of the 3x3.Идентификаторы — это слёги, а не числа, поэтому они переживают переупорядочивание и удаление. Порядок в файле — это порядок приоритета, поэтому отдельного поля приоритета нет.
Записи — это байтовые склейки: операция изменения перезаписывает только тот диапазон, который ей принадлежит. Свёрстанные вручную таблицы, отступы табами и любой текст вне задачи не пере-сериализуются никогда — их нельзя перетешь или потерять. Обработчики сериализуются с помощью блокировки, потому что два параллельных цикла чтение-модификация-запись склеили бы данные по смещениям, которые уже не соответствуют исходному файлу.
Дизайн
Список — это сокращение.
list_todosвозвращает однострочный индекс и никогда не выводит тела задач.get_todoвозвращает одну целую секцию. Ожидаемый путь запроса —qилиref; отдавать всё подряд — исключение.Захват требует одного поля. Обязателен только
title, и новые задачи по умолчанию получают статусcaptured. Инструмент, который требует от человека указать область и следующий шаг в момент обнаружения, попросту не использовался, — а файл оправдывает себя только в том случае, если записываешь вещи по мере их нахождения. Триаж позже переводитcapturedвopen/next/parked/someday.
Значения статусов
статус | значение |
| сырой, непроработанный. По умолчанию для новой задачи. Спрятан из списков без фильтров |
| настоящая работа, понятная |
| уже в процессе |
| намеренно отложено; причина в тексте задачи |
| из области мечтаний |
| готово. Остаётся в файле для протокола. Спрятано из списков без фильтров |
Инструменты
list_todos— сокращённый индекс; фильтрыarea,status,ref,q,limitget_todo— полный markdown одной задачи, включая её содержимоеadd_todo— добавить задачу; обязателен толькоtitle. Сообщает о возможных дубликатахupdate_todo— изменить любое поле; переписывается только переданноеappend_note— добавить датированный пункт в журнал задачиset_status— сдвиг задачи по триажуremove_todo— удалить задачу и её текст. Лучше вместо этого использоватьset_status done
Ресурсы
todos://list— однострочный индекс открытых задач
Архитектура
src/todo.ts— markdown-хранилище: разбор, патчинг по байтовому диапазону, запрос, дедупsrc/server.ts— поверхность MCP-инструментов. Чистая фабрика, без побочных эффектов при импортеsrc/http.ts— Streamable HTTP транспорт, аутентификация и карта сессийsrc/cli.ts— бинарникtodo-mcp; выбирает транспорт и запускает его
This server cannot be deployed
Maintenance
Related MCP Connectors
Create, list, and complete todo items through MCP.
Local-first task manager: create, edit, and complete tasks, projects, and checklists via MCP.
Simple, fast todo app: manage tasks, projects and tags from Claude and other MCP clients.
ADHD-friendly task management MCP server for ChaTodo: organize tasks, lists, and priorities.
Related MCP Servers
- AlicenseBqualityDmaintenanceManages #TODO comments in source code files, enabling you to add and query TODOs via MCP.11MIT
- FlicenseAqualityDmaintenanceEnables task management (create, list, update tasks with priority and status) using SQLite storage via MCP tools.3-
- AlicenseBqualityDmaintenanceEnables task management via MCP tools for creating, listing, updating, completing, and deleting tasks with JSON file storage.6ISC
- AlicenseAqualityCmaintenanceEnables managing local Markdown notes and tasks through MCP tools to create, list, read, mark as done, and delete them.5MIT