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, и именно её ведёт дальше этот репозиторий.
Установка
Запускайте прямо из 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 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 Connectors
Manage feature requests, votes, roadmaps, and changelogs from any MCP client.
Create, update, and publish changelog entries on your Patchlog changelog from any MCP client.
Project management MCP for AI agents with safe task reads and writes.
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/adrianhardy/todo-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server