todo-mcp-server
Allows writing completed tasks into an Obsidian vault as dated markdown files, with subtasks indented.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@todo-mcp-servershow my current priorities"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Riah To-Do
Today's list, by the Windows clock. Click the tray icon and it opens. Click the box to tick something off, click the words to fix them, click anywhere else and it's gone. Drag it where you want it. Nothing to leave open, no window to hunt for.
The list is one JSON file. The note reads and writes it directly, so nothing else has to be running — no server, no background service, no account.
Download and install
Download it — either the latest ZIP from releases, or the green Code → Download ZIP button at the top of this page.
Extract it somewhere you'll keep it —
Documents\Riah To-Dois fine.Double-click
Start Riah To-Do.bat.
That's it. An icon appears by the clock; click it.
Windows only. The note is a small Windows tray program written in PowerShell 5.1, which ships with Windows — there is nothing to install and it does not run on macOS or Linux.
Node.js 18+ is optional. The note itself never needs it. Node is only required for the board page and the AI tools; if it's missing, the board tells you so instead of failing quietly.
Nothing leaves your machine. No account, no sync, no telemetry. Your list is
a JSON file in your own %APPDATA%.
Related MCP server: ticktick-cli
Start it
Double-click Start Riah To-Do.bat. That's the whole install.
Stop Riah To-Do.bat— closes the note and the board.Restart Riah To-Do.bat— after changing the tray script.Open The Board.bat— the full page, for when a note isn't enough.
To have it there every morning, put a shortcut to Start Riah To-Do.bat in
shell:startup.
Needs Windows and PowerShell 5.1, which ships with Windows. Node 18+ is only for the board page and the AI tools — the note itself needs neither.
Using it
You do | It does |
Click the tray icon | The note opens |
Click the box | Ticks it off — or un-ticks it |
Click the words | Edits them, right there. Enter saves, Esc cancels |
Right-click a row | The same thing — straight into editing |
Shift + right-click a task | Moves it to Tomorrow, then Later, then back to Today |
Drag a row up or down | Reorders it among its own siblings — steps sort within their task |
Scroll wheel | Scrolls the list when there is more of it than note |
Drag the top or bottom edge | Sets the height. From then on it keeps it |
Hover a row, click | Starts a subtask under it — including under a subtask |
Type at the bottom, Enter | Adds an item |
Hover a row, click the | Removes it |
Drag the note | Moves it. Drag an edge or corner to resize |
Click anywhere else | Closes it (Esc and the |
Right-click the tray icon | The list, the board, what you've finished, settings, file the finished ones, quit |
Hovering the icon does nothing. It is click-to-open on purpose.
The note remembers where you put it and how big you made it. The first time, it opens in the top-right corner of whichever screen holds the tray icon.
The icon is the status: one bar per item, green once ticked, and a single green check when the list is clear.
Subtasks, and sub-subtasks
A task can hold steps, threaded under it like replies — and those steps can hold
their own. Hover any row, click the +, type. Six levels deep, which is far
past where most lists ever go; the note narrows each step in as it descends, and
you can widen the window when a thread gets long.
Ticking anything ticks its whole thread beneath it. Ticking the last open item finishes the one above, all the way up. Reopening something deep reopens the whole line above it. A task is never filed while any work under it is still open, and deleting a task takes its entire thread with it.
A hundred tasks, a hundred children each, 120 characters a line. Those numbers are backstops against a runaway paste, not advice — put as much on today as you actually want to.
How big it gets
Left alone, the note grows as you add to it, so a short list is a short note.
Drag its top or bottom edge and that becomes the height: it stops growing and the list scrolls inside it instead, with a slim bar on the right. That way a hundred tasks can live in a note the size of a postcard. Drag an edge again any time to change your mind.
Today, Tomorrow, Later
Not everything worth remembering is worth doing now. A task belongs to one of three groups, and the note shows them in order with a heading each:
Today — the default. Nothing else appears until you use another group.
Tomorrow
Later — for the thing you must not forget but should not start.
The count at the top only ever counts today, so parking something for later makes the number go down, not up. That is the point of parking it.
On the note: Shift + right-click a task moves it to the next group. On the
board: the small chip on each task (TODAY / TOMORROW / LATER) cycles it.
A task takes its whole thread with it — a set of steps is never split across
two days.
Filing, and the trail it leaves
Ticked items leave the list two hours later — by default. They aren't
deleted: they go into today-filed.json beside the list. The note is for what's
left, not a monument to what's done. Unfinished items carry over to tomorrow.
Right-click the tray icon → Settings to change that:
File ticked items after — straight away, 15 or 30 minutes, 1 / 2 / 4 / 8 / 12 hours, a day, 3 days, a week, or never (clear them yourself from the tray menu).
Also write them into a vault — point it at an Obsidian vault, or any folder. Each filing appends to one dated markdown file, with steps indented under their task:
# Done - 2026-07-28 - [x] 09:05 Ship the launch - [x] 09:06 Write the emailLeave it blank and no trail is written. The JSON archive happens either way.
Seeing what you finished
Right-click the tray icon → What I've finished, or scroll to Finished on
the board. It shows the last two weeks of ticked-off work, newest day first, with
the time each thing was done and subtasks under their task. Nothing is deleted —
this is the same today-filed.json the filing writes to.
Accessibility
The board is the accessible surface. Use it if the note doesn't work for you.
Everything the note does, the board does: Open The Board.bat, or
http://127.0.0.1:8779.
On the board: every control is reachable by keyboard and visible on focus, not just on hover. Alt+Up / Alt+Down reorders a task without dragging. Errors and saves are announced. Targets are at least 26px and text meets WCAG AA contrast in both themes.
The tray note is a deliberately small, hand-drawn window — the rows are painted, not real controls, so a screen reader cannot see them and Tab does not move between them. That is a real limit, not an oversight: it buys the note its size and speed. Keyboard inside the note covers adding (type, Enter) and closing (Esc). Anything more, use the board.
Where the list lives
%APPDATA%\Riah To-Do\today.json the list
%APPDATA%\Riah To-Do\today-filed.json what has been ticked off
%APPDATA%\Riah To-Do\settings.json filing window and vault pathPoint somewhere else with RIAH_TODO_FILE or RIAH_TODO_DIR — a synced folder
works fine.
Backing up, and getting your list back
The list is one small JSON file. Copy it anywhere; that's a complete backup.
If the file ever gets damaged — a machine dies mid-write, a sync tool mangles it — Riah To-Do refuses to touch it. The note shows "list file unreadable", the board shows the same with the path, and every change is rejected until it's sorted. It will not show you a convincing empty list and let you type over the day you lost.
To recover: open %APPDATA%\Riah To-Do, fix or rename today.json, and click
the icon again. Anything already filed is still in today-filed.json.
Removed something by mistake? The board offers Undo right after a removal, and it restores the task, its subtasks and their order.
Every write is temp-file-then-rename, so a reader always gets a whole list, never half of one. Anything else watching the file picks up changes within a couple of seconds.
The board
Open The Board.bat, or npm start then http://127.0.0.1:8779. The same list
with more room: drag to reorder, click a label to rename, + for a subtask,
light/dark toggle, and the settings above. Optional — the note never needs it.
Letting an AI set your list
bin/todo-mcp-server.mjs is an MCP server with
five tools: get_priorities, replace_priorities, add_priority,
set_priority_completed, remove_priority. Point any MCP client at it:
node bin/todo-mcp-server.mjsIt writes the same file, so "make today about the launch" lands on the note a
second later. Run npm install first — the tools are the only part with
dependencies.
Checking it still works
npm testnpm run smoke:notenpm test covers the list rules: carry-over, the filing window, threading,
cascading ticks, duplicate wording, the caps, torn files, the vault trail.
smoke:note starts the real tray twice. The first pass drives an add, a tick, two
subtasks and a drag through the same code a click calls, then reads the file back
to prove the PowerShell and Node halves agree on the format. The second pass turns
the filing window down to nothing and checks the vault trail actually appears. It
also saves a picture of the note, so the look can be checked without anyone
driving the mouse.
Files
lib/store.mjs the list: rules, atomic writes, the sweep. Owner of the format.
tray/…tray.ps1 the note by the clock (PowerShell 5.1, ASCII-only)
server.mjs the board's local server
index.html the board
bin/…mcp-server.mjs the tools an AI uses
test/ the rules suite, and the real-tray smoke
scratch/tray.log what the note did, and when. Read this first if it misbehaves.Fitting it into something else
Anything that can read and write JSON can join in — the file is the API. Riah Code, the desktop app this was carved out of, keeps its own priorities panel and simply reads and writes the same file, which is why the two never disagree.
Something wrong?
Open an issue: https://github.com/RiahStudio/riah-todo/issues. The most useful
thing you can attach is scratch/tray.log from the app folder — it records what
the note did and when, including anything it refused to do and why.
MIT licensed. The fonts in assets/fonts/ are SIL OFL; their licences ship
beside them.
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 Servers
- Alicense-qualityDmaintenanceAn MCP server that provides AI assistants with full access to Todoist tasks, projects, labels, and filters. It enables comprehensive task management, project organization, and productivity tracking through a wide range of specialized tools.Last updated775MIT
- Alicense-qualityFmaintenanceMCP server for TickTick task management. Enables AI assistants to create, update, list, search, and complete tasks via natural language.Last updated3727MIT
- Flicense-qualityCmaintenanceMCP server that exposes a TODO list API to AI assistants, enabling natural language management of tasks with create, read, update, and delete operations.Last updated
- Flicense-qualityBmaintenanceMCP server for managing a todo list with gamified pomodoro features, exposing set_tasks and list_tasks tools.Last updated
Related MCP Connectors
MCP server exposing the Backtest360 engine API as tools for AI agents.
MCP server for generating rough-draft project plans from natural-language prompts.
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
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/RiahStudio/riah-todo'
If you have feedback or need assistance with the MCP directory API, please join our Discord server