todo-mcp
todo-mcp
Un servidor MCP cuyo almacén es un TODO.md que puedes leer, editar y comparar (diff) a mano. Las escrituras son empalmes por rangos de bytes, así que el archivo sigue siendo tuyo: las tablas escritas a mano, la indentación con tabulaciones y cualquier prosa fuera de una tarea nunca se vuelven a serializar.
Habla stdio para clientes MCP y Streamable HTTP para todo lo demás.
Créditos
Basado en CalamityAdam/mcp-todo, que aportó el andamiaje original: la forma de fábrica createTodoMcpServer, el envoltorio Express de Streamable HTTP y el manejo de sesiones.
Casi nada más sobrevive. Aquella versión guardaba las tareas como registros numerados en un blob JSON en ~/.mcp-todos.json, con tres herramientas sobre { id, title, done }. Esta reemplaza el almacén por un documento markdown, cambia los id numéricos por slugs y amplía la superficie de herramientas a siete, con estados, áreas, migas de referencia, notas de registro fechadas, búsqueda de texto completo y detección de duplicados. Los dos proyectos ya no comparten ninguna implementación.
El proyecto original no incluye un archivo LICENSE; su package.json declara ISC, que es lo que este repositorio mantiene.
Instalación
Ejecútalo directamente desde GitHub, sin clonar:
npx github:adrianhardy/todo-mcpTras publicar cualquier cambio, usa
npx --ignore-existing github:adrianhardy/todo-mcp para recogerlos.
Para uso normal, instálalo una vez y olvídate:
npm i -g github:adrianhardy/todo-mcp
todo-mcpAmbas vías compilan el código fuente al instalar mediante el script prepare, así que dist/ nunca se confirma. Se requiere Node 20 o superior.
Uso
todo-mcp arranca el servidor HTTP por defecto, porque eso es lo útil cuando lo ejecuta una persona en un terminal. Define MCP_STDIO=1 para hablar stdio, que es lo que espera un cliente MCP que lo lanza como subproceso.
Con un cliente MCP
{
"mcpServers": {
"todo": {
"command": "npx",
"args": ["-y", "github:adrianhardy/todo-mcp"],
"env": { "MCP_STDIO": "1" }
}
}
}Instalado de forma global, eso se convierte en "command": "todo-mcp" con el mismo bloque env.
El directorio de trabajo decide qué archivo usas. TODO_FILE se resuelve contra el directorio de trabajo actual del proceso y por defecto es TODO.md, así que un cliente lanzado en un proyecto edita la lista de tareas de ese proyecto. Define TODO_FILE como una ruta absoluta si quieres una lista compartida da igual dónde se inicie el servidor.
Por HTTP
PORT=8080 TODO_MCP_TOKEN=$(openssl rand -hex 32) todo-mcpPOST /mcp- peticiones JSON-RPCGET /mcp- flujo SSE para notificaciones del servidorDELETE /mcp- termina la sesión
Si defines TODO_MCP_TOKEN, se requiere Authorization: Bearer <token> en los tres. Si lo dejas sin definir, la autenticación está desactivada, lo cual está bien solo en localhost y en ningún otro sitio.
Configuración
variable | default | significado |
|
| ruta del almacén, resuelta contra el cwd |
| sin definir |
|
|
| puerto HTTP |
| sin definir | token de portador; sin definir significa sin autenticación |
Se lee un archivo .env si existe. Consulta .env.example.
Almacenamiento
TODO.md es el almacén, no un blob JSON. El archivo es el registro: legible, editable a mano y comparable (diff) con git.
Una tarea es una sección ## . Los campos que el servidor regula viven en un bloque de comentarios justo debajo del encabezado; todo lo que hay debajo es la prosa que el humano es dueño y controla.
## 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.Los id son slugs, no números, por lo que sobreviven a reordenamientos y borrados. El orden del archivo es el orden de prioridad, por eso no hay campo de prioridad.
Las escrituras son empalmes por rangos de bytes: una mutación reescribe solo el tramo que le pertenece. Las tablas escritas a mano, la indentación con tabulaciones y cualquier prosa fuera de una sección de tarea nunca se vuelven a serializar, por lo que no pueden ser refluidas ni perderse. Los manejadores se serializan a través de un candado, porque dos ciclos entrelazados de leer-modificar-escribir empalmarían contra desplazamientos que ya no describen el archivo.
Diseño
La lista está abreviada El recurso
list_todosdevuelve un índice de una línea y nunca los cuerpos de las tareas.get_tododevuelve una sección completa en markdown. El camino previsto esqoref; listarlo todo es la excepción.La captura admite un solo campo. Solo
titlees obligatorio, y las tareas nuevas pasan a tener estadocaptured. Una herramienta que exige un área y un siguiente paso en el momento en que se nota algo no se usa, y el archivo solo funciona si las cosas se anotan cuando se encuentran. El triaje pasacapturedaopen,next,parkedosomedaymás tarde.
Valores de estado
estado | significado |
| crudo, sin triaje. Es el valor por defecto para una tarea nueva. Oculto en listas sin filtros |
| trabajo real, entendido |
| lo siguiente, ahora |
| demorado a propósito; el cuerpo dice por qué |
| aspiracional |
| terminado. Permanece en el archivo como registro. Oculto en listas sin filtros |
Herramientas
list_todos- índice abreviado; filtra porarea,status,ref,q,limitget_todo- markdown completo de una tarea, incluido el cuerpoadd_todo- captura a tarea; solo se requieretitle. Informa de posibles duplicadosupdate_todo- cambia cualquier campo; solo se rescribe lo que se pasaappend_note- añade una viñeta con fecha al registro de la tareaset_status- mueve una tarea por el triajeremove_todo- borra una tarea y su prosa. Mejor usaset_status done
Recursos
todos://list- índice de una línea de tareas abiertas
Arquitectura
src/todo.ts- el almacén markdown: análisis sintáctico, parcheo por rangos de bytes, consulta, deduplicaciónsrc/server.ts- superficie de herramientas MCP. Fábrica pura, sin efectos secundarios al importarsrc/http.ts- transporte Streamable HTTP, autenticación y mapa de sesionessrc/cli.ts- binariotodo-mcp; elige un transporte y lo arranca
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