todo-mcp
todo-mcp
Ein MCP-Server, dessen Speicher eine TODO.md ist, die du von Hand lesen, bearbeiten und diffen kannst. Schreibvorgänge sind Byte-Range-Splices, damit bleibt die Datei deine: handgeschriebene Tabellen, Tab-Einrückungen und jede Prosa außerhalb einer Aufgabe werden nie neu serialisiert.
Für MCP-Clients spricht er stdio, für alles andere Streamable HTTP.
Danksagung
Basiert auf CalamityAdam/mcp-todo, das das ursprüngliche Grundgerüst lieferte: die Factory-Form von createTodoMcpServer, den Express-Streamable-HTTP-Wrapper und das Session-Handling.
Fast nichts davon hat überlebt. Jene Version verwaltete Todos als nummerierte Datensätze in einem JSON-Blob unter ~/.mcp-todos.json, mit drei Tools über { id, title, done }. Diese Version ersetzt den Speicher durch ein Markdown-Dokument, tauscht numerische IDs gegen Slugs und erweitert die Tool-Oberfläche auf sieben Tools – mit Status, Bereichen, Referenz-Breadcrumbs, datierten Log-Notizen, Volltextsuche und Duplikaterkennung. Die beiden Projekte teilen sich keine Implementierung mehr.
Upstream liefert keine LICENSE-Datei mit; sein package.json deklariert ISC, und genau das trägt dieses Repository weiter.
Installation
Direkt von GitHub ausführen, ganz ohne Klonen:
npx github:adrianhardy/todo-mcpNach dem Pushen von Änderungen die neue Version mit npx --ignore-existing github:adrianhardy/todo-mcp übernehmen.
Für den regulären Gebrauch einmal installieren und dann nicht mehr daran denken:
npm i -g github:adrianhardy/todo-mcp
todo-mcpBeide Wege bauen bei der Installation über das prepare-Skript aus dem Quellcode, daher wird dist/ nie committet. Node 20 oder neuer.
Verwendung
todo-mcp startet standardmäßig den HTTP-Server, weil das das Nützliche ist, wenn es jemand in einem Terminal ausführt. Setze MCP_STDIO=1, um stattdessen stdio zu sprechen – das will ein MCP-Client, der es als Unterprozess startet.
Mit einem MCP-Client
{
"mcpServers": {
"todo": {
"command": "npx",
"args": ["-y", "github:adrianhardy/todo-mcp"],
"env": { "MCP_STDIO": "1" }
}
}
}Bei globaler Installation wird daraus "command": "todo-mcp" mit demselben env-Block.
Das Arbeitsverzeichnis entscheidet, welche Datei du bekommst. TODO_FILE wird relativ zum CWD des Prozesses aufgelöst und ist standardmäßig TODO.md; ein in einem Projekt gestarteter Client bearbeitet also die Todo-Liste genau dieses Projekts. Setze TODO_FILE auf einen absoluten Pfad, wenn du eine gemeinsame Liste haben willst, egal wo der Server startet.
Über HTTP
PORT=8080 TODO_MCP_TOKEN=$(openssl rand -hex 32) todo-mcpPOST /mcp– JSON-RPC-AnfragenGET /mcp– SSE-Stream für Server-BenachrichtigungenDELETE /mcp– Session beenden
Wenn TODO_MCP_TOKEN gesetzt ist, verlangen alle drei einen Authorization: Bearer <token>. Ist es nicht gesetzt, ist die Authentifizierung deaktiviert – das ist auf localhost in Ordnung, und sonst nirgendwo.
Konfiguration
Variable | Standard | Bedeutung |
|
| Speicherpfad, relativ zum CWD aufgelöst |
| „nicht gesetzt“ |
|
|
| HTTP-Port |
| nicht gesetzt | Bearer-Token; nicht gesetzt bedeutet keine Authentifizierung |
Eine .env-Datei wird gelesen, falls vorhanden. Siehe .env.example.
Speicher
TODO.md ist der Speicher, kein JSON-Blob. Die Datei ist das Protokoll: lesbar, von Hand bearbeitbar und in git diff-fähig.
Eine Aufgabe ist ein ## -Abschnitt. Felder, die dem Server gehören, leben in einem Kommentarblock direkt unter der Überschrift; alles darunter ist Prosa, die dem Menschen gehört.
## 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.IDs sind Slugs, keine Nummern, und überleben daher Umsortieren und Löschen. Die Dateireihenfolge ist die Prioritätsreihenfolge; deshalb gibt es kein Prioritätsfeld.
Schreibvorgänge sind Byte-Range-Splices: Eine Mutation überschreibt nur die Spanne, die ihr gehört. Handgeschriebene Tabellen, Tab-Einrückungen und jede Prosa außerhalb eines Aufgabenabschnitts werden nie neu serialisiert, können also nicht umgebrochen oder verloren werden. Die Handler werden über eine Sperre serialisiert, denn zwei verschränkte Read-Modify-Write-Zyklen würden an Offsets spliften, die die Datei nicht mehr beschreiben.
Design
Liste ist kompakt –
list_todosgibt einen einzeiligen Index zurück und niemals Aufgabentexte.get_todogibt einen ganzen Abschnitt zurück. Der erwartete Pfad istqoderref; alles aufzulisten ist die Ausnahme.Erfassen braucht genau ein Feld. Nur
titleist erforderlich, und neue Aufgaben bekommen standardmäßig den Statuscaptured. Ein Werkzeug, das im Moment des Entdeckens einen Bereich und einen nächsten Schritt erfordert, wird schlicht nicht benutzt – und die Datei zahlt sich erst aus, wenn Dinge festgehalten werden, sobald sie gefunden werden. Die Triage verschiebtcapturedspäter zuopen/next/parked/someday.
Statuswerte
status | Bedeutung |
| roh, ungetrieben. 14 new aufgaben. In unmitgefilterten Listen verborgen |
| echte Arbeit, verstanden |
| als Nächstes |
| bewusst verzögert; der Freitext erklärt warum |
| angedacht |
| abgeschlossen. Bleibt der Aufzeichnung wegen in der Datei. In ungefilterten Listen verborgen |
Tools
list_todos– kompakter Index; filtertarea,status,ref,q,limitget_todo– vollständiges Markdown einer Aufgabe, inklusive Freitextadd_todo– Aufgabe erfassen; nurtitleist nötig. Meldet mögliche Duplikateupdate_todo– beliebige Felder ändern; nur das Übergebene wird überschriebenappend_note– einen datierten Bullet zur Aufgabenchronik hinzufügenset_status– eine Aufgabe durch die Triage bewegenremove_todo– Aufgabe samt Freitext löschen.set_status doneist vorzuziehen
Ressourcen
todos://list– einzeiliger Index der offenen Aufgaben
Architektur
src/todo.ts– der Markdown-Speicher: Parsing, Byte-Range-Patching, Query, Dedupsrc/server.ts– die MCP-Tool-Oberfläche. Reine Factory, keine Seiteneffekte beim Importsrc/http.ts– Streamable-HTTP-Transport, Authentifizierung und Session-Mapsrc/cli.ts– dietodo-mcp-Binärdatei; wählt einen Transport aus und startet ihn
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