
Todox
io.github.beydemirfurkan由 GitHub 帳號 beydemirfurkan 發布v0.1.4更新於 Oct 24, 2026
Memory for coding agents: the decisions, the dead ends, and where the last session stopped.
概覽
Todox 是給編碼代理用的託管記憶日誌:保存任務及其決策、死路、待答問題與交接紀錄,讓新工作階段能從上次停下的地方接續。
- 可以做什麼
- 讀取工作階段簡報:常駐規則、專案決策、未完成任務及其決策、死路、問題、關聯檔案與上次交接,並附檔案過期警告
- 建立與更新任務,追加五類日誌項目(決策、死路、問題、交接、備註),並可用回答關閉一個問題
- 為檔案關聯雜湊、回報目前雜湊、確認變更或取消關聯,並依路徑查詢已知資訊
- 新增、讀取、修正與刪除可跨任務保留的脈絡筆記
- 跨專案依相關度搜尋,可依類型或專案篩選
- 產生當天、本週或任意期間的活動報告,並在收尾前列出本次工作階段動過的任务
- 適用情境
- 適合工作橫跨多個工作階段、多台機器或多個代理,希望把推理過程、失敗嘗試與收尾狀態延續下去而非重新摸索的情況。特別適合儲存庫開發,讓新代理從上次交接處開始。
- 執行需求
- 遠端 MCP 端點,無需安裝。需要託管服務帳號,並在帳戶頁面建立代理權杖,透過 Authorization 的 bearer 標頭送出。也可選用經 npx 執行的本機 stdio 版本,需設定 TODOX_TOKEN 與 TODOX_URL;或自架,需 Postgres 15 以上。
安裝
在 SourceWeft 中
- 開啟 儀表板中的 Todox,將其新增到工作區。
- 連接 Authorization token 憑證。它們會被私密儲存,絕不會在公開頁面上展示。
- 為需要使用其工具的對話啟用該服務。
Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。
交給代理程式安裝
把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。
閱讀 https://sourceweft.com/mcp/io.github.beydemirfurkan%2Ftodox/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。其他 MCP 客戶端
把它新增到你客戶端的 mcpServers 設定中。
{
"mcpServers": {
"todox": {
"type": "http",
"url": "https://www.todox.dev/api/mcp",
"headers": {
"Authorization": "Bearer <YOUR_TOKEN>"
}
}
}
}README
todox
Working memory for developers and their agents. Not a checklist — a log your next session can actually resume from.
An issue tracker is written human-to-human. todox is written agent-to-agent, with a human reading over its shoulder. Every task carries the decisions behind it, the approaches that failed, the questions still open, and the note the last session left behind.
A fresh agent calls get_context, reads that, and starts where the last one
stopped — without walking into a wall somebody already hit. The briefing is
capped rather than unbounded, in rows and in bytes, and it reports what the
caps left out instead of trimming in silence. Nothing is ever cut mid-sentence:
every record comes back named and dated with its first line, and a body of
null means the budget was spent, not that the record is empty.
[A task in todox: its status, and a log of a decision, a dead end and a handoff, newest last]
How it works
[The agent on your machine talks MCP to todox: it reads a briefing with get_context, writes tasks and log entries while it works, and sends the sha256 of the files it links, because the server has no copy of your code. You read the same log in the browser.]Your agent does the writing; you read over its shoulder. One log per repository, whichever machine or agent touched it last:
What goes in a log
Two things fall out of treating the log as the product:
- Stale context is flagged, and never faked. Linked files are hashed by the
side that can see them — the agent — and the server stores the hashes and
compares. If the code moves on,
get_contextsays the note may be lying. Until an agent has actually looked, the note is marked as never checked rather than claimed to be fresh: context that lies is worse than none, and that includes lying about how sure we are. - Reports come from the log, not from commits. Every status change is an
event, so what did I finish today, how long did it take, which model did it
is a query rather than archaeology. A task set
doingand walked away from counts as the morning it was set, not the weeks since -- and the report says how much it left out, rather than folding it into the headline. - A file can be asked what is known about it. The same links that carry the
hashes are readable from the other end:
get_file_contexttakes a path and answers with the tasks that touched it, their dead ends, and any standing note attached to it. Paths are folded to their repo-relative form, so a link made on one machine is found from another.
Why not the memory your agent already has?
Claude Code writes its own notes now (auto memory, on by default since February 2026), and Cursor and Codex have theirs. Use them: they are good at remembering that you prefer pnpm. What their documentation says, in its own words, is that they are per repository, per machine ("machine-local … not shared across machines") and per tool, and shared with nobody ("just you"). todox is for what falls outside that line:
- Two machines, one log. A repository is identified by its remote, so the note left on the laptop is read on the desktop.
- Every agent, one log. Claude Code, Codex, Cursor and VS Code all speak MCP; the handoff one leaves is what the next one reads, whichever it is.
- The people, too. A project can be shared, and the log carries who wrote what and which model did it.
- A shape a note in a file does not have. Tasks that open and close, dead ends as their own kind, a report read from the log, a stale note that says so — and a briefing that reports what its caps left out.
Beside other memory servers
Compared with what each project's own README says (read 2026-10-16). Where a README does not describe something, the cell says so rather than guessing.
They solve different problems. A knowledge graph or a notes vault is a good place for what is true about a person or a domain; todox is for the state of work in a repository, and for not repeating what already failed there.
Try it
todox.dev — anyone can register. Small personal deployment, no uptime promise. Self-host if the log matters to you.
Run your own
Connect an agent
todox is a remote MCP server. There is nothing to install and no repository to clone: point any MCP client at the URL with an agent token.
Create a token on the Account page and it hands you text you can paste straight into whichever agent you use, plus the config snippet for the four common ones. The shape is always the same — one URL, one header:
Claude Code has a shorter path. The plugin carries the server, the session protocol as a skill, and one reminder at session start; it asks for the token once and keeps it in your Claude Code settings:
Everything else below still applies to it — the plugin is the same four lines,
installed rather than pasted. See plugin/README.md for
what it does and does not do.
The MCP config key and the
typevalue differ per agent, and the wrong combination is silently ignored — no error, no warning, the tool just does not show up:
Where those files live differs by platform, and VS Code is the one that is not where a Linux habit puts it:
Install it globally, not per project. Every one of these tools defaults to
the directory you are standing in — claude mcp add without a scope,
.cursor/mcp.json, .vscode/mcp.json — and a memory that only exists in one
repository is the opposite of the point. It also fails quietly: the tools
simply are not there in the next project, so the agent never mentions them.
Spell out "type": "http". A client that finds a url without one tends to
assume a local command and fails with something unhelpful.
Then tell your agent to use it
Connecting is not the same as being used, and the gap is bigger than it looks.
An MCP server's instructions are background reading; a skill or a CLAUDE.md
rule is an instruction. When they disagree, the server loses — measured, in a
fresh project, with todox connected the whole time and never once called.
So put four lines in the memory file your agent actually obeys:
Or let the installer do it:
It is off unless asked, because that file is yours rather than ours, and it is
idempotent — the block is fenced with an HTML comment, so a second run replaces
it instead of leaving two sets of instructions where the older one wins. Add
--dry-run to see the exact block first.
When the tools do not show up at all, the silent failure is usually one of the two tables above, and there is a command that reads the files the way each client does and says which:
Per client: the entry, its type, its root key, a leftover in a location the
client never reads, whether the memory file carries the habit, and whether the
server answers the token it found (masked in the output). It also names a
todox entry sitting in the current checkout's own config for what it is.
Nothing is changed; docs/mcp.md has the detail.
If you skip this and the account then connects for days without calling a
tool, the server says so at the top of its instructions on the next session —
"connected for N days and has not called a tool" — and hands the agent the
four lines and the path of your client's memory file, telling it to append
them and to tell you it did. Measured from tool_usage, so it is said only
while it is true and stops the moment a tool is called. That is how an account
whose client changed, or whose memory file was never written, comes back
without anybody having to ask.
The user-level file, not the project one. This is the same trap as the config above, one directory over:
A repository's own AGENTS.md, and the per-project rules files the editors also
read, apply inside that checkout only. A cross-project memory installed into one
project is the thing this whole section exists to avoid.
The longer version, as a skill. The four lines are the habit; the whole
session protocol — the same text the server sends at initialize — can also
sit in the client's user-level skills directory, where every one of these
clients loads a SKILL.md by its description when the moment matches, and
spends nothing on it otherwise:
The file is wholly todox's — a directory of its own, nothing of yours inside — so a second run after an upgrade replaces it. It is generated from the same text as the server instructions rather than written twice, which is what keeps the two from disagreeing.
The token stays out of that file — it lives in your MCP config. This is the habit, not the credential.
Optional: local mode
The hosted server has no filesystem — but your agent does, and that is enough:
it sends the hash when it links a file (which counts as a check, so the link
reads fresh at once) and calls report_file_hashes with what it finds
afterwards, so staleness works over HTTP like anywhere else. Either hex case is
accepted, so PowerShell's (Get-FileHash f).Hash works as it is.
The stdio server does that part itself rather than asking. Worth running if you would rather not spend an agent's attention on it, or want the hashing to happen even when the agent forgets. There is nothing to clone:
Or as an MCP config, which is the form an agent wants:
There is no npm package, and that is a decision rather than a to-do. A
GitHub Release needs no account and no token to publish or to install from, so
the tarball is the whole distribution and npx takes its URL directly. The URL
above always resolves to the newest release; every release also carries a
todox-mcp-<version>.tgz if you would rather pin and choose when to move.
It carries only what the stdio server actually loads — no Next, no React, no
Postgres driver, because it talks to the API over HTTP and never opens a
database. pnpm pack:mcp builds it, and fails the build if anything
server-side ever finds its way into the tool surface again.
From a clone, pnpm -C /path/to/todox mcp still works and is what to use when
you are changing the tools themselves.
Tools
Every write tool takes a model, and the server instructions tell the agent to
always pass it. That is what makes the per-model breakdown real rather than
guessed.
Prompts
Three, because there are three moments this is for. They show up in your client's own menu, so you can see what the server does without reading anything:
Deploying
A container and a Postgres beside it. docker-compose.yml at the root is that,
assembled — the database publishes no port at all and is reachable only over
the compose network:
The migration is a separate line on purpose; see the note at the end of this section. todox.dev itself runs the same two containers on one host.
Run pnpm db:migrate when the schema changes. It deliberately does not run at
startup: DDL racing between instances of a rolling deploy is a bad way to
discover lock contention, and the schema is idempotent precisely so the decision
can be made after a deploy rather than during one. From the host:
That is also why the image keeps its dev dependencies instead of using Next's
standalone output — pruning them removes tsx and everything under
scripts/, and a database that is deliberately unreachable from the internet
can only be migrated from something already inside the network.
Knowing it actually deployed
A merge is not a deploy, and the gap between them is silent: nothing errors, the site stays up, and the only symptom is that a fix you watched go green is not the one people are running. On 2026-09-05 this instance served code two days and fifty-six commits old, and the thing that made it visible was looking rather than anything reporting it.
The image tag is the git sha and the container name changes on every deploy, so one line answers it:
Compare that against git rev-parse origin/main. If they differ, the code you
are reading is not the code that is running.
Automatic deploys are worth wiring up, and worth checking after you do. A platform that pulls on a webhook can have the switch on and still never fire, because the switch and the webhook are two settings in two places: this instance had auto-deploy enabled for weeks while the repository had no webhook at all, so nothing was ever told to look. After wiring one, confirm from the sending side — the delivery log — rather than from the switch, because a webhook pointed at the wrong path answers cheerfully and does nothing.
Taking your data with you
The Account page has a Download my data button, and /api/export answers
the same file to a bearer token — so an agent can write the backup without the
result passing through a model. It carries every project you own with its
tasks, log, context notes and file hashes, and nothing about anybody else: no
credential, no collaborator, no share token, and no projects that were shared
with you, which belong to whoever made them.
Loading one into an instance you run:
Additive, never destructive: nothing is deleted or overwritten, and a project whose slug is taken arrives under the next free one. Task events come across too, so durations in a report on the restored copy say what they said on the original.
Security
Passwords are scrypt; sessions, agent tokens and email links are stored as hashes only. Ownership is enforced in one module, and a row belonging to someone else answers 404 rather than 403 so ids cannot be probed. Rate limits live in the database, so they hold across instances.
Details, and an honest list of what is not covered, in SECURITY.md.
Known gaps
- Search's substring half is indexed only where the database allows it. The
two halves are asked separately and merged, which is what lets either use an
index at all — measured on 110k rows, a search went from 5.7s to 0.16s on the
full-text arm alone. The
ILIKEarm that finds identifiers full-text cannot needspg_trgm;pnpm db:migratecreates the extension and its five indexes where the role may, and says so either way. Where it may not — a Postgres without contrib, a managed service that refuses extensions — that arm stays a sequential scan andpnpm smoke:searchprintsSKIPfor it rather than failing. Thepostgres:18image indocker-compose.ymlhas it. - Staleness is per-file hash; per-symbol would be the honest version. Hosted, it depends on the agent actually sending hashes — the instructions ask, and nothing can make it.
- Coverage sits around 39%, and the shape matters more than the number: the agent surface, the auth boundary and the repositories that answer "is this yours" are covered, while much of the UI is not.
- Observations see what git can tell them and which task a session set to
doing, so they answer "what changed" and "on what" — and never "why". The half that carries reasoning is a transcript, and the only hook API that exposes one belongs to a single client. - The briefing's byte budget covers log bodies, note bodies and task bodies.
One axis is still bounded only by a row count: the heads of carried
entries and tasks, fifty tasks' worth. It is far smaller than what the
budgets fixed — one project went from 143 KB to about 55 KB on the log
alone — but it is not bounded in bytes, and
pnpm bench:memoryprints it so the next reader does not have to discover it. - Observations are captured by the local process only. Watching git means
running on the machine that holds the checkout, and the hosted endpoint has
none — so connected that way, the
observationssection of every briefing stays empty and nothing anywhere fills it. The Try-it path in this README is the hosted one, so that is most people.npx todox-mcpis the transport that captures. Everything else works identically either way. - No 2FA, no per-session revocation, no audit log.
- Share links are unlisted, not access-controlled.
- No keyboard navigation beyond
/for search.
Cutting a release
That is the procedure. The workflow checks the tag against package.json,
runs the checks, builds the stdio package and attaches it to a GitHub Release —
no account and no credential involved, so npx <that tarball url> works from
the first tag.
Two names go up: todox-mcp-<version>.tgz, and the same bytes as
todox-mcp.tgz so that /releases/latest/download/todox-mcp.tgz is an address
worth writing into a config once. Nothing is published to npm, on purpose — see
the local-mode section above.
server.json pins the MCP registry entry to the same version and
server-json.test.ts holds it there, so the tag, the package and the registry
move together or the release stops.
Contributing
The rules the codebase actually follows, and how to run the checks: CONTRIBUTING.md.
MIT — see LICENSE.
來源:README.md,提交 0d771c8
工具
0版本歷史
2- v0.1.4最新Sep 19, 2026
- v0.1.1Sep 16, 2026
評分
已滿足適用檢查項的 85%
該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。
- 近 30 天內可連通必需25 分
- 已宣告認證方式必需10 分
- 已列出工具15 分
請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。
- 描述必需15 分
- 圖示10 分
- 文件15 分
- 授權條款10 分