关于 Casefile
Casefile 是面向跨会话任务的自托管 MCP 服务和网页看板,以每项任务的追加式记录保存决策、失败尝试和待解问题,帮助不同 Agent 接续工作。它不负责分派或自动执行任务。
主要功能
- 01每项任务维护追加式记录
- 02记录摘要、决策与待解问题
- 03支持拆分和关联任务
- 04网页看板查看进度并留言
- 05关闭任务前检查摘要与结果
适用场景
- 01在新会话中接续未完成任务
- 02让不同 Agent 基于同一任务记录协作
- 03通过看板查看进展并回答问题
MCP 相关
作为自托管 MCP 服务,向客户端提供创建、查询、更新和流转任务等工具。支持通过 streamable HTTP 或 stdio 连接。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
http://localhost:8100/mcpclaude mcp add --transport http casefile http://localhost:8100/mcp{"mcpServers":{"casefile":{"type":"http","url":"http://localhost:8100/mcp"}}}在 Cursor 中打开{"servers":{"casefile":{"type":"http","url":"http://localhost:8100/mcp"}}}在 VS Code 中打开{"mcpServers":{"casefile":{"type":"http","url":"http://localhost:8100/mcp"}}}{"mcpServers":{"casefile":{"serverUrl":"http://localhost:8100/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
http://localhost:8100/mcp需要授权工具
详细介绍
Casefile
每项任务对应一份案例文件,所有参与其中的会话、Agent 和人员共同使用。
Casefile 为每项任务保留一份案例文件,记录 Agent 工作时写下的决策、失败的尝试、调查结果和待解问题。
会话结束后,下一个会话——由同一个 Agent、其他厂商的 Agent,或你来接手——会读取最新摘要和待解问题,然后继续推进。
它是一个可自托管的 MCP 服务和网页看板,采用 MIT 许可证;它不分配任务,也不安排日程。
适用于 Agent 需要跨多个会话处理任务的任何人。 免费使用。专为 Claude Code 打造;Codex、Cursor 和任何其他 MCP 客户端的连接方式都相同。
在 macOS / Linux 上安装
curl -fsSL https://raw.githubusercontent.com/azimov777/casefile/main/install.sh | sh
在 Windows 上安装(PowerShell)
irm https://raw.githubusercontent.com/azimov777/casefile/main/install.ps1 | iex
你只需要 Docker。看板会在 http://localhost:8080 打开,安装程序会自动连接 Claude Code 和 Codex——只需安装插件并通过 OAuth 登录,无需复制令牌。Casefile 会自动更新到每个新版本:每小时检查一次,并在 Docker 启动时检查。一个小型 updater 服务负责更新,因此需要持有 Docker 套接字;你可以将其关闭。
也可以让你的 Agent 来安装。 将以下内容粘贴到 Claude Code、Codex 或 Cursor 中:
请按照 https://raw.githubusercontent.com/azimov777/casefile/main/docs/agent-install.md 为我安装 Casefile
为什么
会话结束或上下文填满后,下一个 Agent 就得从头开始:重新阅读代码、重试已经失败的方法、再次询问你已经回答过的问题。
Casefile 为每项任务提供一份案例文件——由 Agent 在工作过程中写入的仅追加日志。
- 交接内容不会因刷新上下文而丢失。 下一个 Agent 会读取最新摘要、待解问题和案例索引,然后继续推进。无需重新摸索。
- 专为 Agent 打造,基于 MCP 运作。 Agent 可以创建和拆分任务、记录决策和走不通的方案、向你提问,并在关闭任务时为每项检查给出结论。
- 你始终参与其中。 实时看板和任务页面会显示每个 Agent 的工作进展。你可以回答问题、留下备注,并直接在浏览器中为每个 Agent 单独授予访问权限。
- 设置护栏,而非繁文缛节。 没有摘要且每项检查都未通过时,任务无法关闭;被阻塞的任务无法启动。仅此而已——没有冲刺、估算或自动化。
- 数据由你掌控,留在你的机器上。 服务在本地 Docker 中运行,且仅监听 localhost。除非你启用登录并将其部署到自己的服务器供团队使用,否则不会有任何数据离开你的电脑(网络模式)。
- 不是笔记文件。
CLAUDE.md或handoff.md会被覆盖:两天前失败的尝试会消失,两个会话还可能同时编辑同一个文件。案例文件只追加不修改——更正内容会作为新条目添加,并指向旧条目。CLAUDE.md用于存放每个仓库的规则;Casefile 则针对每项任务。 - 不是记忆服务。 记忆 MCP 会根据相似度回忆事实。Casefile 不会巧妙地回忆任何内容:它是每项任务的工作日志,按固定顺序读取——任务卡、最新摘要、未解决问题、索引,然后只读取你需要的条目。
- 不是加装了 MCP 的问题跟踪器。 问题条目包含描述和任何人都能编辑的讨论串。Casefile 条目有明确类型且永不编辑,跟踪器会拒绝可能破坏记录的写入操作。
- 不是编排器。 它绝不会自行启动 Agent、运行计时器或推进任务。分配工作以及发现会话已失效,仍由你和你的 Agent 框架负责。
连接你的 Agent
安装程序会自动连接 Claude Code 和 Codex。它会安装 Casefile 插件—— 包括技能以及与此安装的 MCP 地址建立连接——并通过 OAuth 完成登录: 不会复制令牌,也不会将令牌写入任何文件。如果安装程序没有终端 可用于登录,它会打印命令;运行一次即可:
claude mcp login plugin:casefile:casefile
codex mcp login casefile
安装程序在修改其他程序的任何内容之前都会先征求同意。 插件安装步骤会编辑
不属于 Casefile 的文件:Claude Code 的 ~/.claude/settings.json(在
extraKnownMarketplaces.casefile 中添加一行
"autoUpdate": true)、Codex 的
~/.codex/config.toml、指向此安装的手动 MCP 条目 casefile 和 tracker,以及
~/.agents/skills。它会在终端上打印这些内容并询问 [y/N]
(使用 curl … | sh 时也一样);选择 N 会跳过整个插件安装步骤,不改动这些文件,
并照常安装服务。在首次修改某个文件之前,它会在该文件旁保存一份副本——
settings.json.casefile-bak、config.toml.casefile-bak,副本会保留且永不覆盖——
并且只写入所需的那一行,文件其余部分保持原样。副本会保留文件原有的全部内容,
包括安装程序移除的手动条目中的令牌;不再需要时请删除副本。这些变量需放在 sh 前面:
CASEFILE_SKILL=0会跳过插件安装步骤;CASEFILE_SKILL=1会预先回答问题。 如果没有终端(例如在 Agent 或 CI 中运行),不会询问,且会执行该步骤, 效果与设为1相同。CASEFILE_PLUGIN_AUTOUPDATE=0会安装不带autoUpdate的 Claude Code 插件; 你需要自行使用claude plugin update casefile@casefile更新。
在看板的 Access 界面断开 Agent 后,也可使用相同命令重新登录
(在 Claude Code 会话中,依次选择 /mcp → casefile → 重新验证)。
在自己的机器上登录无需密码:Claude Code 会以 claude 身份运行,Codex 会以
codex 身份运行。
插件附带技能。 连接后,Agent 就能使用工具;Casefile
技能则会教它如何使用这些工具。安装程序会将技能安装到它在机器上找到的
Claude Code、Codex、Hermes 和其他 Agent 中,并为每个框架打印一行信息。在 v0.8.0 之前安装的版本既没有技能,也没有插件;每小时自动更新不会添加它们,只会更新服务。重新运行安装命令,或只安装插件和技能而不触及服务(如果服务器不在此机器上,请添加 CASEFILE_URL=<address>):
curl -fsSL https://raw.githubusercontent.com/azimov777/casefile/main/install.sh | CASEFILE_SKILL_ONLY=1 sh
如何检查 Agent 是否已安装技能,以及各框架对应的命令,请参阅
Agent 指南第 4 步。
Claude Desktop 的聊天应用现在也能使用扩展。 Claude 桌面应用(macOS、Windows)的聊天界面不会加载 Claude Code 插件;它使用 Casefile。Casefile 位于 casefile.mcpb 中,并随每个版本发布。安装程序检测到 Claude Desktop 后会下载并打开它;也可以手动双击该文件。它通过 OAuth 登录,无需 Node.js,而且可在安装过程中使用(详情)。
Hermes 通过 OAuth 登录(在 ~/.hermes/config.yaml 中设置 auth: oauth;安装程序会打印相应配置块;尚未用真实的 Hermes 验证)。不支持 OAuth 的客户端使用 Agent 密钥。 脚本以及任何无法通过 MCP OAuth 登录的客户端,都可以在 MCP 地址通过可流式 HTTP 连接,并在请求头中提供 Agent 密钥。安装程序会在配置块中打印密钥;也可以在 ~/casefile 中运行 docker compose run --rm --no-deps -T agent-token cat .secrets/agent-token 再次查看。使用 mcpServers JSON 配置的客户端可以使用以下配置,其中填写密钥;如果安装程序打印的地址不同,也请替换为该地址:
{
"mcpServers": {
"casefile": {
"type": "http",
"url": "http://localhost:8100/mcp",
"headers": {
"Authorization": "Bearer <token>"
}
}
}
}
也可以使用 stdio。 上述可流式 HTTP 是主要连接方式。只能启动命令并通过 stdin/stdout 与之通信的客户端,也可以通过这种方式连接到同一 MCP 服务:它会启动一个安装实例的短期容器,并连接到该安装实例的数据库,因此使用相同的工具、密钥和案例。stdio 不支持 OAuth:Agent 密钥应放在客户端的环境中,而不是命令行中:
claude mcp add --scope user casefile-stdio --env TRACKER_MCP_TOKEN=<token> -- \
docker compose -f ~/casefile/docker-compose.prod.yml run --rm --no-deps -T \
-e TRACKER_MCP_TOKEN mcp python -m app.mcp --stdio
安装实例必须处于运行状态:stdio 进程不会自带数据库。每个客户端会话都是独立进程,因此只要客户端支持 HTTP,就应优先选择更轻量的 HTTP 方式。较早版本的安装镜像不支持 stdio 模式,会返回 unrecognized arguments: --stdio;请先更新镜像。
再连接一个 Agent,无需使用终端。 看板上的 连接 Agent 会显示此安装实例的 MCP 地址和可直接使用的代码片段。访问权限会按三个部分列出所有连接方式:Agent 连接(OAuth 登录)、Agent 密钥和登录会话;显示你自己的信息,管理员则可以查看安装实例中的所有信息,包括代表谁、由谁签发以及最后使用时间。你可以在这里断开连接或撤销密钥。对于不支持 OAuth 的客户端,你可以在这里注册 Agent,为它签发专属密钥,并复制已填入密钥的代码片段——该片段只会显示一次。为每个 Agent 分别设置登录或密钥,其创建的案例条目就会标注其名称。在共享安装实例中,每个人都可以为自己的 Agent 完成这些操作,无需管理员协助,并且只能看到自己签发的连接和密钥,或代表自己创建的连接和密钥。
告诉它要做什么
连接 Agent 只是完成了接线。连接完成后,请逐字告诉 Agent 以下内容。
有工作要交接?请说:
在 Casefile 中为我的工作建立任务:如果还没有项目,就先创建一个项目;然后创建包含所有章节和检查项的任务,每项任务都要足够小,能由一个 Agent 一次完成,并在
context中注明工作环境——工作所在位置以及如何检查是否完成。不要开始实际工作;如果我还没描述工作内容,就先问我。
然后,在新的 Agent 会话中说:
从 Casefile 跟踪器中执行这项工作的任务。把任务交给其他 Agent,每个 Agent 负责一个任务,以节省你自己的上下文;对于能够胜任的任务,给它们分配成本更低的模型。
这两句话分别用于不同的 Agent 会话:第二个 Agent 会从干净的上下文开始,只了解任务案例中的信息。看板的 /start 页面也提供这两句话,并带有复制按钮。
工具
MCP 服务提供的所有 MCP 工具,按领域分组(app/mcp/tools/):
任务
get_task— 在单次调用中返回一个任务的所有信息:卡片、父任务和子任务、链接、计算得出的特征、最新摘要、未解答问题、未解决备注、相关讨论、案例索引和可转移的目标状态search_tasks— 使用查询语言字符串、单独的条件或两者兼用来搜索任务create_task— 在项目的某个区域中以backlog状态创建任务(没有区域时需要area_required),也可选择将其设为某个父任务的子任务update_task— 更改任务的指定字段;未指定的字段保持不变transition— 根据固定的转移表将任务移至另一个状态close_task— 在一个事务中关闭任务:登记条目、评审结论和最终摘要,并将任务移至donemove_task— 根据原因,将一个任务或列表中的每个任务(每个键对应一个处理结果)移至另一个项目;原有键仍会指向该任务
案例
read_entries— 按编号顺序返回一个任务案例的条目正文及其负载add_summary— 登记摘要:案例的交接说明,包含四个部分add_entry— 登记不含负载的条目:决定、尝试、发现、制品、备注或笔记ask— 在讨论中向登记参与者提出问题;针对任务提问时,会在同一次调用中开启讨论并附加该任务answer— 回答讨论或任务案例中的问题;也可将仍未回答的问题关闭为withdrawn或replaced(被后续问题取代),并说明原因;已回答的问题不能撤回resolve— 解决任务上的备注:记录处理结果以及工作成果的去向add_verdict— 登记一项评审检查的结果read_project_entries— 按编号顺序返回某个项目、区域或讨论的案例条目正文及其负载;可按编号、类型、状态以及标题或正文中的子字符串筛选add_project_entry— 在项目或区域的案例中登记决定、发现、制品或笔记,或在讨论的案例中登记笔记
讨论
add_conclusion— 登记讨论结论:说明已决定、已取代和仍未解决的事项close_discussion— 在一个事务中以最终结论关闭讨论list_discussions— 按项目、状态、轮次和附加的任务筛选并列出讨论:地址、标题、状态、轮次、未解答问题、关闭时间
文件
request_file_upload— 返回一次性链接和用于将新文件上传到项目的curl -T命令;字节数据直接从磁盘传到跟踪器,不会经过模型request_file_replace— 返回一次性链接和用于替换同一 ID 下文件内容的curl -T命令read_file— 返回文件:图像以模型可见的image内容返回,其他文件则返回其卡片和一次性curl -o链接list_files— 将文件列为卡片,可按名称搜索并按项目和媒体类型筛选;可按添加或打开时间、大小或类型排序delete_file— 删除文件字节并保留其墓碑记录:名称、类型、大小、删除者和删除时间delete_files— 删除筛选条件(项目、名称、类型、unopened:在指定天数内未打开的图像)选中的所有文件,前提是确认的数量与实际数量一致
链接
link— 链接两个任务,并在两者的案例中登记link_added;也可将任务附加到讨论unlink— 移除链接,并在两者的案例中登记link_removed;也可将任务从讨论中分离 项目和参与者get_project— 根据项目键返回一个项目,或根据区域地址以相同格式返回一个区域:键、标题、描述、当前属性值、生效中的决策和调查结果,以及其余档案的索引list_projects— 列出 Agent 可使用的安装实例中的项目:键、标题和归档时间;仅在请求时列出已归档项目list_participants— 列出参与者名册:可作为问题接收人的对象create_project— 创建项目update_project— 更改项目标题和描述,并将每次更改记录在其档案中archive_project— 归档项目并说明原因,将其及其任务冻结,禁止更改restore_project— 说明原因并恢复已归档的项目set_attribute— 设置项目属性值;创建属性或更改其值时需说明原因;历史记录保留在项目档案中remove_attribute— 说明原因并移除项目属性,将其最后一个值记入项目档案register_participant— 注册人员或永久 Agentupdate_participant— 更改参与者的描述
日志
wait_journal— 返回序列号之后的日志条目,并等待新条目
日常操作
| 立即更新 | 再次运行安装命令 |
| 关闭自动更新 | 在 ~/casefile/.env 中设置 CASEFILE_AUTO_UPDATE=false,然后在 ~/casefile 中运行 docker compose up -d --no-deps updater |
| 固定使用某个版本 | 在 ~/casefile/.env 中设置 CASEFILE_VERSION=0.17.0 |
| 停止 / 启动 | 在 ~/casefile 中运行 docker compose stop / docker compose start |
| 移除所有内容,包括数据 | 在 ~/casefile 中运行 docker compose down -v |
| 迁移到另一台机器或自己的服务器 | docs/moving.md |
| 备份数据 / 恢复到全新安装 | docs/backup-restore.md |
端口和其他设置位于 ~/casefile/.env 中 — 请参阅 .env.example。
更新
Casefile 的新版本以发布的形式提供:一个 Git 标签 vX.Y.Z,其镜像位于 ghcr.io 下的版本目录和 stable 通道目录中。每个安装默认跟随 stable。Docker 启动时会检查一次,之后每小时在略微随机的分钟检查一次,因此新版本会在大约一小时零十分钟内到达,无需重启。未打标签的 main 分支提交永远不会到达安装实例。更新会重新创建 Casefile 容器,并保留卷中的数据。更新期间正在进行 MCP 调用的 Agent 会遇到连接断开,需要重试。
更新器持有 Docker 套接字。 为了替换容器,updater 服务会挂载 /var/run/docker.sock,这相当于拥有机器的 root 访问权限;Casefile 有意将其交给这个服务(docker-compose.prod.yml 中说明了原因)。安装程序会在安装前和安装结束时告知这一点。要关闭自动更新,请将 CASEFILE_AUTO_UPDATE=false 写入 ~/casefile/.env(必须是 false:任何其他值都会使其保持开启),然后在 ~/casefile 中运行 docker compose up -d --no-deps updater。此后服务会处于空闲状态,因此套接字仍保持挂载;运行 docker compose stop updater 可以停止该服务,直到下次运行 docker compose up 或安装程序。关闭自动更新后,面板会告知你有新版本发布:侧边面板底部会显示一条链接到发布说明的提示,你可以再次运行安装命令来更新。此提示通过读取 GitHub 上的最新发布信息获得,最多每小时读取一次;在 .env 中设置 TRACKER_RELEASE_CHECK=false 可关闭读取,也会一并关闭提示。
此通道上的首个发布版本是 0.2.0。此前基于 latest 的安装实例会在下次 Docker 启动时自动切换到 stable,此后每小时检查一次。发布版本也可能包含新的更新器:该版本的更新仍由旧更新器完成,之后旧更新器会被新版本替换,因此新更新器带来的功能(例如在 0.3.0 中新增的回滚功能)会从下一个发布版本的更新开始生效。如果你在 .env 中自行设置了 CASEFILE_VERSION=latest,请删除该行以跟随发布版本。
CASEFILE_UPDATE_INTERVAL 用于设置检查频率(小时,或 30m;0 表示仅在 Docker 启动时检查)。如果某个发布版本无法启动,安装实例会恢复到之前运行的版本,且不会再次尝试该版本;下一个发布版本会照常安装。运行 docker compose logs updater 可查看发生了什么。
更改数据库架构的发布版本还需要多一个步骤。安装该版本前,更新器会创建数据库快照(pg_dump -Fc,格式与备份和还原相同)。快照会存入安装实例的 Docker 卷 casefile_updater-snapshot 中,文件名为 before-update.dump,占用的空间大约与手动备份相同。如果该发布版本更改架构后仍无法启动,数据库会恢复到快照状态,然后再启动先前的版本。这样,架构和数据就会与更新前完全一致,手动运行 docker compose up -d 也会照常工作。代价是:快照创建后到回滚期间写入的任何内容都会丢失。 这个时间窗口就是启动失败期间,最长几分钟。新版本启动时,旧版本还会继续响应几秒钟。之后不会删除快照,无论更新成功还是回滚,它都会作为更新前数据库的副本留在卷中,具体位置可通过 docker compose logs updater 查看。只保留一个副本:下次更改架构的更新会替换它,而创建失败的快照不会替换较早的快照。有关如何从中还原,请参阅备份和还原。如果无法创建快照,此次不会安装该发布版本。如果无法还原快照,先前版本会在新架构上运行,日志中会说明如何将快照复制出来。
网络模式
开箱即用时,Casefile 仅监听 localhost,你无需输入任何内容:安装过程会为你创建一个管理员账户(owner@localhost),看板会自动登录该账户。若要从其他机器访问,请开启登录:此后每个人都使用自己的邮箱和密码登录,每条记录都会由创建者签名。每次安装仅对应一个团队——所有登录用户都能看到所有任务。唯一的角色是管理员标记,它仅用于管理成员。
-
添加到
~/casefile/.env:CASEFILE_LOGIN=password # everyone signs in with email and password CASEFILE_BIND=0.0.0.0 # publish the board and MCP beyond localhost TRACKER_MCP_PUBLIC_URL=http://<server>:8100/mcp # what agents on other machines use -
在
~/casefile中运行docker compose up -d。 -
设置自己的密码。安装过程创建的管理员账户没有密码;运行以下命令会生成一个密码并显示一次:
docker compose run --rm api python -m app.cli account-password --email owner@localhost添加
--set-password可输入自己的密码(至少 12 个字符,需输入两次,输入内容不会显示)。邮箱也可以更改:account-update --email owner@localhost --new-email [email protected]。 -
添加队友——在看板上操作,或在服务器上运行命令:
docker compose run --rm api python -m app.cli account-create --email [email protected] --name alice命令会显示 Alice 的密码一次;请将密码交给她。添加
--admin也会将她设为管理员。account-list会显示所有人;account-update --disable会锁定某人的账户,并撤销其会话,以及其为 Agent 签发的所有连接和密钥(其过往记录仍保留其姓名签名);account-password可重置遗忘的密码。Casefile 不会发送邮件:没有地址确认,也没有重置链接。
现在,访问 http://<server>:8080 会看到登录界面。Agent 通过 TLS 下的 OAuth 登录(见下文);连接 Agent会显示 TRACKER_MCP_PUBLIC_URL 中的地址。每个人的 Agent 机器只需运行一行命令,即可安装插件、技能并登录——无需在该机器上安装 Docker 或服务安装程序:
curl -fsSL https://raw.githubusercontent.com/azimov777/casefile/main/install.sh | CASEFILE_SKILL_ONLY=1 CASEFILE_URL=https://mcp.casefile.example.com/mcp sh
Agent 的操作步骤请参阅Agent 指南。
从所有者密码迁移。 如果安装在账户功能推出前使用 TRACKER_PASSWORD_HASH 锁定,更新后仍可正常使用:登录会自动开启,旧密码会成为管理员账户 owner@localhost 的密码——使用该邮箱和相同密码登录即可。.env 中的哈希不再用于锁定;它只会迁移一次,之后设置的密码不会被它覆盖。
纯 HTTP 存在安全漏洞。 如果没有 TLS,密码、会话 Cookie、密钥和 Agent 令牌都会以明文形式通过网络传输,任何能截获流量的人都可以读取。Casefile 本身不提供 TLS。在超出可信网络范围的任何场景中,都应保持 CASEFILE_BIND=127.0.0.1,并在两个端口前配置带 TLS 的反向代理——例如 Caddy,它会获取证书并自动发送 X-Forwarded-Proto:
casefile.example.com {
reverse_proxy 127.0.0.1:8080
}
mcp.casefile.example.com {
reverse_proxy 127.0.0.1:8100
}
并设置 TRACKER_MCP_PUBLIC_URL=https://mcp.casefile.example.com/mcp。发送 X-Forwarded-Proto: https 的代理会将会话 Cookie 标记为 Secure。
Agent 通过 OAuth 登录。 开启登录并将 TRACKER_MCP_PUBLIC_URL 设为 https 后,支持 MCP OAuth 的客户端(Claude Code、Codex)只需地址,无需令牌。客户端会打开 MCP 主机上的页面:用户使用邮箱和密码登录,并选择客户端要以哪个 Agent 的身份操作。默认情况下,使用用户自己的 Agent,该 Agent 会在首次登录时创建:Alice 的 Claude Code 会以 claude_alice 的身份签署案件记录,Codex 则以 codex_alice 的身份签署(其他客户端使用 agent_<name>)。列表中包含用户自己的 Agent 及没有所有者的 Agent,不会显示其他人的 Agent。该连接视为由该用户签发:用户可以在访问权限中查看并断开连接,管理员可以查看所有连接。停用用户账户会撤销其签发的所有连接和密钥,包括其 Agent 的连接和密钥:连接无法自行续期,账户恢复后必须重新登录。不支持 OAuth 的运行环境,以及在会话间运行的日志监视器,应使用用户在访问权限中为其 Agent 签发的密钥。代理必须执行以下操作:
- 将整个 MCP 主机转发到端口 8100,而不只是
/mcp:登录也会在TRACKER_MCP_PUBLIC_URL中指定的主机根路径下使用/.well-known/…、/register、/authorize、/token和/oauth/…; - 保留客户端的
Host标头。Caddy 会这样做;nginx 需要设置proxy_set_header Host $host;。 启用登录后,MCP 只会在TRACKER_MCP_PUBLIC_URL指定的主机上响应,使用其他名称发来的请求会收到421。
通过 http 在 localhost 以外的地址访问时,完全不会使用 OAuth——Agent 使用 Access 中的密钥连接。
在自己的机器上(关闭登录,端口绑定到 localhost),Agent 无需打开页面即可立即登录:Claude Code 使用
claude,Codex 使用 codex,其他客户端使用 agent;每种客户端都会在首次需要时创建。
指定代理名称。 登录会根据地址区分猜测密码的人(见下文 猜测密码)。使用代理时,每个请求都会从代理发出,因此必须告知看板代理的地址;只有这样,看板才会从代理的 X-Forwarded-For 标头中获取浏览器的地址。来自其他任何来源的该标头都会被忽略——任何人都可以填写它。在 ~/casefile/.env 中添加:
CASEFILE_TRUSTED_PROXIES=172.18.0.1 # the address the board sees the proxy come from
然后运行 docker compose up -d。该地址不是代理自己的地址,而是 Docker 显示给看板的地址。代理与看板在同一台机器上,且设置了 CASEFILE_BIND=127.0.0.1 时,无论使用 Linux 还是 Docker Desktop,该地址都是此安装的网络网关:
docker network inspect casefile_default -f '{{range .IPAM.Config}}{{.Gateway}}{{end}}'
要检查地址,请运行 docker compose logs ui:每行请求日志都以请求来源地址开头——指定代理后显示浏览器的地址;未指定时显示代理的地址。多个代理或网络地址以逗号分隔(172.18.0.1,10.0.0.0/8)。网络创建时会获得地址,因此运行 docker compose down 后,请再次检查网关。通过代理访问时,请保持 CASEFILE_BIND=127.0.0.1:Docker Desktop 会将发布到网络的端口上的所有连接显示为 192.168.65.1,因此指定该地址后,任何人都能冒充任意地址。不添加此行也不会出问题,但代理后的所有人会共用一个地址——一个猜测密码的人又会让所有人都只能“稍后再试”。
其他须知:
- 不登录,就不接入网络。 如果
CASEFILE_BIND绑定到 localhost 以外的地址且关闭登录,看板会拒绝启动,而不是将管理员密钥交给整个网络;运行docker compose logs ui可查看原因。 - 会话。 登录有效期为 7 天(
TRACKER_SESSION_HOURS)。会话是带有截止时间的令牌,保存在数据库中:重启安装不会使会话失效。退出登录会立即撤销会话;更改或重置密码会结束该用户的其他会话;禁用账户会撤销其所有会话,以及该用户为其 Agent 签发的所有连接和密钥。重新启用账户不会恢复这些会话、连接或密钥。 - 猜测密码。 错误密码会按地址和邮箱分别计数,统计范围为一分钟。某个地址的错误密码达到 5 次后,该地址会收到“稍后再试”的登录响应——即使密码正确也一样——直到这一分钟结束;某个邮箱收到 5 次错误密码后,无论请求来自何处,该邮箱都会受到相同限制。其他人仍可照常登录。此外,整个安装每分钟最多接受 100 次错误密码,以免猜测密码耗尽处理器资源;如果猜测请求分散到许多地址和邮箱并达到该限制,那么只要这种情况持续,所有人都会被告知“稍后再试”(IPv6 客户端按整个
/64网段计数)。已打开的会话和使用令牌的 Agent 不受影响。客户端地址是建立连接的地址,或指定代理报告的地址(见上文)。Docker Desktop 会将来自网络的所有连接都隐藏在同一个地址后面,因此只有在同一台机器上使用代理时,看板才能区分客户端。
底层技术
Python 3.14 · FastAPI · PostgreSQL · 通过可流式 HTTP 传输的 MCP · React 19 · Vite · Tailwind。后端位于仓库根目录,Web UI 位于 ui/。Web UI 支持英语和俄语,目前面向 Agent 的文本为俄语;设计决策记录在维护者的跟踪系统中,欢迎在 issue 中咨询。
贡献
欢迎提交 issue 和拉取请求——请先阅读 CONTRIBUTING.md。提交需要签署认证(git commit -s):这表示你有权提交代码,CI 也会对此进行检查。
许可证
正在招聘吗? 我开发了 Casefile,很乐意了解 Anthropic 或 OpenAI 的职位机会——欢迎通过 GitHub 联系我。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。