Command Palette

Search for a command to run...

UnylyUnyly
Browse all

Focustodo

FreeNot checked

MCP Server for Focus To-Do (專注清單) — Control your Pomodoro timer & tasks via AI

GitHubEmbed

About

MCP Server for Focus To-Do (專注清單) — Control your Pomodoro timer & tasks via AI

README

繁體中文 | English

Focus To-Do(專注清單) 打造的 MCP(Model Context Protocol)伺服器,讓 AI 助理(Claude Code、Claude Desktop 等)可以用自然語言操作你的番茄鐘任務。

起心動念: Focus To-Do 一直沒有開放公開 API,所以我自己逆向工程做了這個 MCP,讓 AI 助理也能串接它。本專案與 Focus To-Do 官方無關,亦未獲其授權。


⚡ 快速設定

需要 Node.js 20.12 以上。

步驟一:Clone 並安裝

git clone https://github.com/gyozalab/focustodo-mcp.git
cd focustodo-mcp
npm install
npm run build

步驟二:加入 MCP 設定檔

將以下內容加入 Claude Code 的 .mcp.json 或 Claude Desktop 的設定檔:

{
  "mcpServers": {
    "focustodo": {
      "command": "node",
      "args": ["/your/path/to/focustodo-mcp/dist/index.js"],
      "env": {
        "FOCUSTODO_ACCOUNT": "[email protected]",
        "FOCUSTODO_PASSWORD": "your-password"
      }
    }
  }
}

/your/path/to/focustodo-mcp 換成你實際的路徑,帳密填入你的 Focus To-Do 登入資訊。

完成後重啟 Claude,就可以開始用了。


使用範例

設定完成後,直接這樣問 AI:

  • 「列出我的部落格清單任務」
  • 「幫我加一個任務到寫作清單:寫 AI 工具評測文章,3 顆番茄」
  • 「把這五件事一次加到寫作清單」
  • 「這週我花最多時間在哪個清單?」
  • 「今天我專注了多久?」
  • 「剛剛專注了 45 分鐘在寫文章那個任務,幫我補記」

功能列表

查詢

工具 說明
focustodo_list_projects 列出所有清單與標籤
focustodo_list_tasks 列出任務(可依清單、標籤、優先度、狀態、到期日篩選)
focustodo_search_tasks 依關鍵字搜尋名稱、標籤、備註
focustodo_get_task_detail 查看任務詳情(含子任務與番茄鐘紀錄)
focustodo_get_today_focus 今日總覽:已專注時間 + 今天到期 + 逾期未完成
focustodo_get_stats 專注統計,含清單分佈與每日長條圖
focustodo_refresh 強制重新同步(快取預設 60 秒自動更新)

寫入

工具 說明
focustodo_create_task 建立任務,支援 tasks 陣列批次建立
focustodo_update_task 改名稱/優先級/到期日/提醒/標籤/所屬清單/備註/番茄長度
focustodo_complete_task 標記完成,支援批次,uncomplete 可反向
focustodo_delete_task 軟刪除,支援批次
focustodo_log_pomodoro 補記已完成的專注時段,同步累加任務番茄計數
focustodo_delete_pomodoro 刪除番茄鐘記錄(記錯時用),任務計數跟著扣回
focustodo_create_subtask 新增子任務(自動標記父任務 hasSubtask
focustodo_update_subtask 子任務改名/完成/刪除/改預估番茄數
focustodo_create_project 建立新清單或標籤
focustodo_update_project 清單/標籤改名、換顏色
focustodo_delete_project 刪除清單/標籤(內含孤兒防護,見下)

所有寫入完成後會用獨立 clientId 跑一次 delta sync 向 server 確認,回 ✅ 才代表真的持久化了。批次操作是一次推送、一次驗證,耗時與筆數幾乎無關。


遠端部署(HTTP 模式)

設定 PORT 環境變數就會改跑 HTTP 模式(提供 /health/mcp),可部署到 Zeabur 之類的平台,供 Claude.ai 網頁版連接。

⚠️ HTTP 模式必須同時設定 MCP_AUTH_TOKEN,否則會拒絕啟動。/mcp 能讀寫整個帳號的任務,而部署網址並非秘密(TLS 憑證透明度日誌會登記),沒有這道門等於把任務庫對公網全開。Client 端需帶 Authorization: Bearer <token>

node -e "console.log(require('crypto').randomUUID())"   # 產一個 token

另外,時區跟著執行環境走(「今天」的判定與日期顯示都是),容器預設為 UTC,所以 Dockerfile 設了 TZ。部署到其他時區的機器時記得跟著調整。


技術說明

  • API Basehttps://app.hk1.focustodo.net/
  • 驗證方式:Email + 密碼登入 → Cookie-based Session,過期自動重登
  • 同步機制POST /v64/sync 雙向全量同步;timestamp 是 epoch ms,帶入即取該時點後的 delta
    • 寫入只收完整物件。送 {id, name} 這種 partial 會被整批拒收(status=-9),且拒絕是原子的、不留半套狀態。所以更新一律是「讀出來 → 改欄位 → 整包送回」
    • status0=成功、-1/-2=session 失效(自動重登重試)、-9=資料被拒收
  • 資料模型
    • type=1000 → 一般清單
    • type=3000 → 標籤(任務的 tags 欄位存的是這些清單的 ID,不是文字;本 server 自動做名稱↔ID 轉換)
    • type=4xxx / 5xxx → App 內建的智慧清單(PRJ_DEADLINE_OVERDUEPRJ_PRIORITY_HIGH 等),是動態篩選視圖不是容器,本 server 一律濾掉——把任務建進去會變成 App 看不到的卡片
    • state0=正常、-1=已刪除
    • deadline:當地時區當天 23:59:59.999,傳 '2026-08-05' 會正確轉換
  • 快取:60 秒 TTL,過期自動拉 delta。讀-改-寫的操作會先強制刷新,避免用舊值蓋掉你剛在 App 改的內容

收件匣與孤兒卡

沒指定清單的任務會落在收件匣(magic id id-task-tasks),App 看得到。

⚠️ 收件匣不是一個真的 project,/v64/syncprojects 陣列裡沒有它。本 server 在 enrich 時特別補上名稱,也接受用「收件匣 / 收件箱 / inbox」查詢。

⚠️ 若 projectId空字串會變成「真孤兒」:server 上存在,但 App 任何視圖都不顯示。因此 create_task 一律 fallback 到收件匣,列表與搜尋也預設濾掉歷史殘留的孤兒卡。

同樣要注意,刪除任務不會刪掉它的番茄鐘記錄——那些專注時間會繼續留在統計裡,「今日專注」甚至會顯示已刪任務的名稱。要真正移除得用 delete_pomodoro

同樣的道理,刪除清單時 server 不會處理裡面的任務——它們的 projectId 會繼續指向已刪清單,變成看不到也救不回的孤兒。所以 delete_project 在清單非空時會要求用 moveTasksTo 指定任務去處,搬移全部成功才會刪清單。

關於寫入驗證

早期版本曾因為「推送後等 1.5 秒沒在 delta 看到」就判定 server 拒絕寫入,據此在文件裡寫下並不存在的「anti-tampering 鎖」。事後查證,那些被判定為遭拒的寫入其實全部都成功持久化了,只是 server 當時的寫入可見性延遲比較長。

現在的驗證改成退避重試(600ms → 1.8s → 5.4s),窮盡重試後的措辭是「無法確認」而非「被拒絕」,本地快取也只標記失效、不臆測結果。「還沒看到」不等於「被拒絕」,這是這個專案學到最貴的一課。


開發

npm run dev        # 用 tsx 直接跑(讀 .env)
npm run selftest   # 純函式斷言 + 對真實帳號的建→改→刪循環 + HTTP 模式迴歸

自測會在收件匣建立 [MCP自測] 開頭的卡片,跑完自動刪除(中途失敗也會在收尾統一清理)。需要在 .env 填入 FOCUSTODO_ACCOUNTFOCUSTODO_PASSWORD


授權

MIT

from github.com/gyozalab/focustodo-mcp

Installing Focustodo

This server has no published package — it is built from source. Open the repository and follow its README.

▸ github.com/gyozalab/focustodo-mcp

FAQ

Is Focustodo MCP free?

Yes, Focustodo MCP is free — one-click install via Unyly at no cost.

Does Focustodo need an API key?

No, Focustodo runs without API keys or environment variables.

Is Focustodo hosted or self-hosted?

Self-hosted: the server runs locally on your machine via the install command above.

How do I install Focustodo in Claude Desktop, Claude Code or Cursor?

Open Focustodo on unyly.org, pick your client tab (Claude Desktop, Claude Code, Cursor) and press Install — the config is generated automatically, no JSON editing.

Related MCPs

Compare Focustodo with

Not sure what to pick?

Find your stack in 60 seconds

Author?

Embed badge for your README

Browse similar

All productivity MCPs