todo-mcp
A minimal MCP server over stdio — the demo from the talk MCP — Plug Your Agent Into Everything (FIT-HCMUS).
What it exposes:
| Kind | Name | What it does |
|---|---|---|
| Tool | add_task |
Add a task to the list |
| Tool | list_tasks |
List all tasks with status |
| Tool | complete_task |
Mark a task as done (isError if the id doesn’t exist) |
| Resource | todo://list |
The current list as plain text |
| Prompt | plan_my_day |
Ask the model to plan your day |
State is in-memory — it resets every time the host restarts the server,
and each host gets its own process (= its own list). For the one-process,
shared-state variant over HTTP, see todo-mcp-http.
Setup
npm install
Test with the MCP Inspector
npm run inspect # = npx @modelcontextprotocol/inspector node server.js
Opens a browser UI where you can call every tool, read the resource, and watch the raw JSON-RPC messages — no LLM involved.
Plug into Claude Code
claude mcp add todo -- node /absolute/path/to/server.js
claude # then try: Add "finish MCP homework" to my todos, then show the list.
The prompt appears as /todo:plan_my_day; check the connection with /mcp.
Plug into Claude Desktop
Add to claude_desktop_config.json (Settings → Developer → Edit Config):
{
"mcpServers": {
"todo": {
"command": "node",
"args": ["/absolute/path/to/server.js"]
}
}
}
Note: this is a stdio server, so it works in hosts that can spawn a local process (Claude Code, Claude Desktop, the Inspector, your own agent). claude.ai web only accepts remote HTTP servers via custom connectors.
Gotcha worth remembering
On stdio, stdout belongs to the protocol — one stray console.log()
corrupts the JSON-RPC stream. Log with console.error() instead.