mcpField
C
Casefile

Casefile

已认证精选远程服务
github.com开发工具61 天前更新

关于 Casefile

Casefile 是面向跨会话任务的自托管 MCP 服务和网页看板,以每项任务的追加式记录保存决策、失败尝试和待解问题,帮助不同 Agent 接续工作。它不负责分派或自动执行任务。

主要功能

  1. 01每项任务维护追加式记录
  2. 02记录摘要、决策与待解问题
  3. 03支持拆分和关联任务
  4. 04网页看板查看进度并留言
  5. 05关闭任务前检查摘要与结果

适用场景

  1. 01在新会话中接续未完成任务
  2. 02让不同 Agent 基于同一任务记录协作
  3. 03通过看板查看进展并回答问题

MCP 相关

作为自托管 MCP 服务,向客户端提供创建、查询、更新和流转任务等工具。支持通过 streamable HTTP 或 stdio 连接。

配置

远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。

服务地址http://localhost:8100/mcp
一键复制安装命令
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。

全部服务地址
Streamable HTTPhttp://localhost:8100/mcp需要授权

工具

详细介绍

Casefile

每项任务对应一份案例文件,所有参与其中的会话、Agent 和人员共同使用。

Casefile 为每项任务保留一份案例文件,记录 Agent 工作时写下的决策、失败的尝试、调查结果和待解问题。
会话结束后,下一个会话——由同一个 Agent、其他厂商的 Agent,或你来接手——会读取最新摘要和待解问题,然后继续推进。
它是一个可自托管的 MCP 服务和网页看板,采用 MIT 许可证;它不分配任务,也不安排日程。

CI MCP server Self-hosted License: MIT Glama score

适用于 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 创建任务并通过 MCP 处理任务——看板会显示新卡片,跟踪其状态变化;任务页面会实时显示 Agent 自己记录的案例条目,无需重新加载

为什么

会话结束或上下文填满后,下一个 Agent 就得从头开始:重新阅读代码、重试已经失败的方法、再次询问你已经回答过的问题。

Casefile 为每项任务提供一份案例文件——由 Agent 在工作过程中写入的仅追加日志。

  • 交接内容不会因刷新上下文而丢失。 下一个 Agent 会读取最新摘要、待解问题和案例索引,然后继续推进。无需重新摸索。
  • 专为 Agent 打造,基于 MCP 运作。 Agent 可以创建和拆分任务、记录决策和走不通的方案、向你提问,并在关闭任务时为每项检查给出结论。
  • 你始终参与其中。 实时看板和任务页面会显示每个 Agent 的工作进展。你可以回答问题、留下备注,并直接在浏览器中为每个 Agent 单独授予访问权限。
  • 设置护栏,而非繁文缛节。 没有摘要且每项检查都未通过时,任务无法关闭;被阻塞的任务无法启动。仅此而已——没有冲刺、估算或自动化。
  • 数据由你掌控,留在你的机器上。 服务在本地 Docker 中运行,且仅监听 localhost。除非你启用登录并将其部署到自己的服务器供团队使用,否则不会有任何数据离开你的电脑(网络模式)。
一个任务因 Agent 向用户提出的阻塞性问题而等待处理
## 有何不同
  • 不是笔记文件。 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 — 在一个事务中关闭任务:登记条目、评审结论和最终摘要,并将任务移至 done
  • move_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 — 注册人员或永久 Agent
  • update_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),看板会自动登录该账户。若要从其他机器访问,请开启登录:此后每个人都使用自己的邮箱和密码登录,每条记录都会由创建者签名。每次安装仅对应一个团队——所有登录用户都能看到所有任务。唯一的角色是管理员标记,它仅用于管理成员。

  1. 添加到 ~/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
    
  2. 在 ~/casefile 中运行 docker compose up -d。

  3. 设置自己的密码。安装过程创建的管理员账户没有密码;运行以下命令会生成一个密码并显示一次:

    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]。

  4. 添加队友——在看板上操作,或在服务器上运行命令:

    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 也会对此进行检查。

许可证

MIT


正在招聘吗? 我开发了 Casefile,很乐意了解 Anthropic 或 OpenAI 的职位机会——欢迎通过 GitHub 联系我。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。