todo-mcp-server
MCP server for Riah To-Do, enabling AI to manage priorities via tools like get_priorities, replace_priorities, add_priority, set_priority_completed, and remove_priority.
README
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.
<p align="center"> <img src="docs/screenshots/note-dark.png" width="49%" alt="Riah To-Do — the note open, four tasks left of six for today, steps indented under Ship the Gumroad listing, a Tomorrow group and a Later group underneath" /> <img src="docs/screenshots/note-scrolling.png" width="49%" alt="Riah To-Do — the same note pulled down to a smaller height, a longer list scrolling inside it with a slim bar on the right" /> </p>
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%.
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 x |
Removes it |
| Drag the note | Moves it. Drag an edge or corner to resize |
| Click anywhere else | Closes it (Esc and the x too) |
| 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 path
Point 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.mjs
It 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 test
npm run smoke:note
npm 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.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。