跳到内容

本地 API 服务器 ​

Mindwtr 提供可选的本地 REST API 服务器,用于脚本和集成。在桌面端,它运行于应用二进制文件内部,并使用与应用相同的本地存储路径。仓库还包含一个 Bun 辅助程序,可用于开发和高级脚本编写。


桌面端开关 ​

桌面端构建无需运行源代码即可启动本地 REST API:

  • 打开设置 -> 高级。
  • 启用本地 API 服务器。
  • 保留默认端口 3456,或选择其他 localhost 端口。
  • 从同一张设置卡片中复制生成的 bearer token。

应用仅绑定至 127.0.0.1,并要求每个请求都包含 Authorization: Bearer <token>。移动端二进制文件不公开本地 REST API 接口。

开发辅助程序 ​

当你希望在桌面端应用之外运行 API,或令其指向明确指定的文件时,仍可使用仓库中的辅助程序。


快速开始 ​

从桌面端应用启动:

text
Settings -> Advanced -> Enable local API server

默认 URL:

text
http://127.0.0.1:3456

从仓库根目录使用 Bun 启动:

bash
bun install
MINDWTR_API_TOKEN=replace-with-a-strong-token bun run mindwtr:api -- --port 4317 --host 127.0.0.1

选项 ​

选项默认值说明
--port <n>4317服务器端口
--host <host>127.0.0.1绑定地址
--data <path>平台默认值覆盖 data.json 的位置
--db <path>平台默认值覆盖 mindwtr.db 的位置
--dangerously-disable-auth关闭完全不使用令牌运行——不安全,即便只监听回环地址对浏览器也不安全

环境变量 ​

变量说明
MINDWTR_DATA覆盖 data.json 的位置(如果省略 --data)
MINDWTR_DB_PATH覆盖 mindwtr.db 的位置(如果省略 --db)
MINDWTR_API_TOKEN必需。 辅助程序对每个请求都要求的 bearer token;未设置时将拒绝启动,除非传入 --dangerously-disable-auth
MINDWTR_API_CORS_ORIGIN可选。允许调用该 API 的一个精确 http(s) 来源;未设置时不发送 CORS 响应头

默认情况下,API 会使用 Mindwtr 的平台路径解析 data.json 和 mindwtr.db(在 Linux 上优先使用 XDG 数据路径)。


认证 ​

桌面端本地 API 请求始终需要设置 -> 高级中显示的 bearer token:

Authorization: Bearer <token>

Bun 辅助程序同样要求令牌:未设置 MINDWTR_API_TOKEN 时会立即退出,除非你显式传入 --dangerously-disable-auth(仅用于隔离环境下的兼容性测试)。


端点 ​

方法端点说明
GET/health健康检查 → { ok: true }
GET/tasks列出任务
GET/tasks?status=next按状态筛选
GET/tasks?query=@work搜索任务
GET/tasks?isFocusedToday=true桌面端:筛选加星任务,包括排队的未来开始任务
GET/tasks?all=1包含已完成/已归档任务
GET/tasks?deleted=1包含软删除任务
POST/tasks创建任务
GET/tasks/:id获取单个任务
PATCH/tasks/:id更新任务
DELETE/tasks/:id软删除任务
POST/tasks/:id/complete标记为已完成
POST/tasks/:id/archive标记为已归档
POST/tasks/:id/restore恢复软删除任务
GET/projects列出项目
POST/projects桌面端:创建项目
GET/projects/:id桌面端:获取单个项目
PATCH/projects/:id桌面端:更新项目
DELETE/projects/:id桌面端:软删除项目
POST/projects/:id/restore桌面端:恢复项目
GET/areas列出领域
GET/areas/:id桌面端:获取单个领域
PATCH/areas/:id桌面端:更新领域
GET/v1/areas领域端点的兼容别名
GET/sections辅助程序:列出分区,可加 ?projectId=
POST/sections辅助程序:创建分区
GET/sections/:id辅助程序:获取单个分区
PATCH/sections/:id辅助程序:更新分区
DELETE/sections/:id辅助程序:删除分区
GET/search?query=...搜索任务和项目

如果完成一个有开始日期、无截止日期的固定周期任务需要跳过已错过的重复日期,桌面本地 API 会返回 409(recurrence_requires_app)。任务保持不变,请在应用中完成它。如果下一次重复仍在当前日期或未来,只有开始日期的任务仍受支持。

标注桌面端的行只存在于桌面应用的本地 API。标注辅助程序的行只存在于 Bun 辅助程序,它同时也在 /v1/ 前缀下响应这些请求(/v1/sections)。

桌面端本地 API 接受 isFocusedToday=true/1 和 isFocusedToday=false/0。true 或 1 返回加星任务,包括排队等待进入专注的未来开始任务;false 或 0 返回未标记的任务,包括没有该字段的旧记录。省略该参数时,API 不按此字段筛选。其他值会返回 400。

这里的 query 是纯文本匹配:该值会转为小写,并作为子串与任务的标题、描述、状态、标签、上下文、项目与领域 ID 以及支持备注进行比较。它不是操作符语言。status:、context:、tag:、due:<=7d、引号短语和 -取反 属于应用内的搜索框、CLI 的 --query 以及 MCP 服务器的任务列表;在这里发送时会按字面字符匹配,通常什么也返回不了。

响应结构 ​

任务(部分字段)

json
{
  "id": "uuid",
  "title": "Task title",
  "status": "inbox",
  "projectId": "uuid",
  "dueDate": "2026-01-25T12:00:00.000Z",
  "tags": ["#work"],
  "contexts": ["@email"],
  "createdAt": "2026-01-25T10:00:00.000Z",
  "updatedAt": "2026-01-25T10:00:00.000Z",
  "deletedAt": null
}

项目(部分字段)

json
{
  "id": "uuid",
  "title": "Project name",
  "status": "active",
  "color": "#94a3b8",
  "createdAt": "2026-01-25T10:00:00.000Z",
  "updatedAt": "2026-01-25T10:00:00.000Z",
  "deletedAt": null
}

领域

json
{
  "id": "uuid",
  "name": "Area name",
  "color": "#94a3b8",
  "icon": "briefcase",
  "order": 0,
  "createdAt": "2026-01-25T10:00:00.000Z",
  "updatedAt": "2026-01-25T10:00:00.000Z"
}

创建任务的请求体 ​

json
{
  "input": "Call Alice",
  "title": "Alternative title",
  "props": {
    "status": "next",
    "contexts": ["@phone"],
    "tags": ["#errands"]
  }
}

桌面端会在存在 title 时使用它,否则使用 input,并应用明确指定的 props。Bun 辅助程序还会对 input 运行 parseQuickAdd。

桌面端项目写入 ​

桌面应用内置 API 支持创建、获取、更新、软删除和恢复项目。创建项目时必须提供 title;areaId、color、status、isSequential 和 order 为可选字段。更新时可使用相同的可编辑字段。创建、获取、更新和恢复都以 { "project": { ... } } 返回已保存的项目;删除返回 { "ok": true }。

创建选项放在 props 中,例如 { "title": "Plan the move", "props": { "isSequential": true } };PATCH 字段直接放在请求体中。sequentialScope 支持 project 或 section,项目 status 支持 active、someday、waiting 或 archived。将 areaId 设为 null 可移除领域。项目归档和重新激活遵循应用中对子任务和分区的处理规则。对于 PATCH,项目不存在时返回 404,已删除或已永久删除时返回 409。

GET /projects/:id 也会返回仍存储的软删除项目,便于脚本在恢复前检查。DELETE /projects/:id 会软删除项目及其活动分区,并解除活动任务的项目关联,而不会删除任务或更改任务状态。POST /projects/:id/restore 会恢复项目以及由同一次旧版级联删除的子项,但不会重新关联当前删除操作已解除关联的任务。重复删除或恢复是安全的,不会改变当前状态。对已永久删除项目执行生命周期变更会返回 409。

创建顺序项目:

bash
curl -s -X POST "http://127.0.0.1:3456/projects" \
  -H 'Authorization: Bearer <token>' \
  -H 'Content-Type: application/json' \
  -d '{"title":"Plan the move","props":{"isSequential":true}}' | jq .

将现有项目改为并行:

bash
curl -s -X PATCH "http://127.0.0.1:3456/projects/$PROJECT_ID" \
  -H 'Authorization: Bearer <token>' \
  -H 'Content-Type: application/json' \
  -d '{"isSequential":false}' | jq .

在桌面端编辑领域 ​

GET /areas/:id 和 PATCH /areas/:id 返回 { "area": { ... } }。未知或已删除的领域均返回 404。这些端点属于桌面应用内置 API,不属于 Bun 辅助服务。

PATCH 接受仅包含 name、color、icon 和 order 的非空对象。name 必须是非空白字符串,首尾空白会被移除。color 和 icon 接受字符串,也可设为 null 以清除字段。order 必须是有限数值,允许小数和负数。未知字段、无效类型、空白名称及空对象均返回 400。

移除首尾空白并忽略大小写后,若名称与另一个未删除领域相同,则返回 409,不作任何更改。API 不会隐式合并领域。重命名和颜色更改会保留应用对关联项目元数据的处理行为,并一并保存。清除领域颜色也会将关联项目重置为默认颜色(#94a3b8)。设置 order 只更新此领域的数值排序位置,并非批量重排操作。不包含领域创建和删除。

bash
curl -s -X PATCH "http://127.0.0.1:3456/areas/$AREA_ID" \
  -H 'Authorization: Bearer <token>' \
  -H 'Content-Type: application/json' \
  -d '{"name":"Work","color":"#94a3b8","order":2}' | jq .

桌面端任务分类 ​

使用带有 status 的 PATCH /tasks/:id,可将活动任务在 inbox、next、waiting、someday 和 reference 之间移动。完成、归档和恢复仍使用对应的 /complete、/archive 和 /restore 操作。PATCH 不接受终结状态。

PATCH 无法重新打开已完成或已归档的任务(返回 409);请先在应用中重新打开。已删除任务需先通过 /restore 恢复,再进行分类。已永久删除的任务无法分类。

将已归档项目中的任务改为 inbox、next、waiting 或 someday 会返回 409。请先通过 PATCH /projects/:id 和 {"status":"active"} 重新激活项目,或在同一次任务 PATCH 中将任务移出该项目。

将收集箱任务移至下一步行动:

bash
curl -s -X PATCH "http://127.0.0.1:3456/tasks/$TASK_ID" \
  -H 'Authorization: Bearer <token>' \
  -H 'Content-Type: application/json' \
  -d '{"status":"next"}' | jq .

示例 ​

列出下一步行动:

bash
curl -s 'http://127.0.0.1:3456/tasks?status=next' \
  -H 'Authorization: Bearer <token>' | jq .

使用明确指定的 props 创建任务:

bash
curl -s -X POST 'http://127.0.0.1:3456/tasks' \
  -H 'Authorization: Bearer <token>' \
  -H 'Content-Type: application/json' \
  -d '{"title":"Call Alice","props":{"status":"next","contexts":["@phone"],"tags":["#errands"]}}' | jq .

完成任务:

bash
curl -s -X POST "http://127.0.0.1:3456/tasks/$TASK_ID/complete" \
  -H 'Authorization: Bearer <token>' | jq .

CLI 工具 ​

还可以使用一个更简单的命令行界面:

bash
# Add a task
bun mindwtr:cli -- add "Call mom @phone #family"

# List active tasks
bun mindwtr:cli -- list

# List with filters
bun mindwtr:cli -- list --status next --query "due:<=7d"

# Read or update a task
bun mindwtr:cli -- get <taskId>
bun mindwtr:cli -- update <taskId> '{"status":"next"}'

# Complete a task
bun mindwtr:cli -- complete <taskId>

# Archive, delete, or restore
bun mindwtr:cli -- archive <taskId>
bun mindwtr:cli -- delete <taskId>
bun mindwtr:cli -- restore <taskId>

# Search
bun mindwtr:cli -- search "@work"

# List projects
bun mindwtr:cli -- projects

CLI 参考 ​

命令示例说明
addmindwtr:cli -- add "Call mom @phone"使用快速添加解析
listmindwtr:cli -- list --status next支持 --all、--deleted、--query
getmindwtr:cli -- get <taskId>输出完整任务 JSON
updatemindwtr:cli -- update <taskId> '{"status":"next"}'应用 JSON patch
searchmindwtr:cli -- search "@work due:<=7d"搜索任务/项目
completemindwtr:cli -- complete <taskId>将任务标记为已完成
archivemindwtr:cli -- archive <taskId>将任务标记为已归档
deletemindwtr:cli -- delete <taskId>软删除任务
restoremindwtr:cli -- restore <taskId>恢复已删除任务
projectsmindwtr:cli -- projects列出现存项目

安全说明 ​

  • 服务器适合在 127.0.0.1(localhost)上运行。除非你了解相关风险,否则不要将其公开。
  • 桌面端 API 访问需要“设置”中生成的 bearer token。请妥善保管该令牌。
  • 如果需要远程访问 Bun 辅助程序,请设置 MINDWTR_API_TOKEN,并将服务器置于经过认证的反向代理之后。

另请参阅 ​

Mindwtr 免费、开源且本地优先。
Getting Things Done 和 GTD 是 David Allen Company 的注册商标。Mindwtr 与 David Allen Company 不存在关联,亦未获得其认可或赞助。