obo-mcp
Oboe MCP
面向编码代理的结构化逐一(one-by-one)工作流。
用于持久化逐一审查工作流的 MCP 服务器,为编码代理提供具有优先级的会话状态。
提供 16 种工具,用于在优先级评分的会话文件中创建、导航和解决项目,包括阻塞项目处理、一流的审批更新以及嵌套的子会话,因此 /obo 工作流可以使用 MCP 操作而不是原始的 JSON 编辑。
采用 AGPL-3.0-or-later 许可,并提供商业许可。
有关完整条款,请参阅 LICENSE。
PyPI 软件包
使用以下任一替代方案直接从 PyPI 安装或运行 Oboe MCP:
无需安装即可运行:
uvx oboe-mcp安装到当前环境:
pip install oboe-mcp
安装 oboe-mcp 还会安装 oboe-cli 命令:
# After pip install oboe-mcp
oboe-cli --help
# From PyPI
uvx --from oboe-mcp oboe-cli --help
# From a local checkout (no install needed)
uvx --from /path/to/oboe-mcp oboe-cli --helpCLI 参考 (oboe-cli)
安装 oboe-mcp 还会安装 oboe-cli,这是一个对人类友好的命令行伴侣,用于操作 MCP 工具所使用的相同会话文件。
oboe-cli [--session SESSION] [--base-dir DIR] COMMAND [ARGS...]全局选项:
选项 | 描述 |
| 会话文件名(例如 |
| 包含 |
Base-dir 自动检测:当省略 --base-dir 时,oboe-cli 会使用当前工作目录(如果它包含 .github/obo_sessions/ 文件夹),否则它会回退到当前工作目录本身。
命令
命令 | 描述 | |||
| 列出所有会话(支持 `--status active | paused | completed | incomplete`) |
| 显示会话摘要统计信息 | |||
| 从 JSON 项目文件创建新会话 | |||
| 将新项目附加到现有会话 | |||
| 将整个会话标记为已完成 | |||
| 列出项目,按优先级分数排序(支持 | |||
| 显示下一个可操作的项目 | |||
| 显示一个项目的完整详细信息 | |||
| 将项目标记为已完成 | |||
| 将项目标记为已跳过 | |||
| 将项目标记为进行中 | |||
| 将项目标记为已阻塞 | |||
`approve ITEM_ID approved | denied | unreviewed` | 设置审批元数据 | |
| 更新项目上的单个字段 | |||
| 创建子会话并暂停父会话 | |||
| 完成子会话并恢复父会话 |
快速入门
# Create a session from a JSON items file
oboe-cli --base-dir /path/to/project create \
--title "Code review findings" \
--input-file findings.json
# List sessions
oboe-cli --base-dir /path/to/project sessions
# Work through items
oboe-cli --base-dir /path/to/project --session session_20260411_120000.json next
oboe-cli --base-dir /path/to/project --session session_20260411_120000.json \
in-progress 1
oboe-cli --base-dir /path/to/project --session session_20260411_120000.json \
complete 1 "Fixed the validation bug"注意:以前版本中附带的
obo_helper.py脚本现在是一个精简的弃用垫片,它委托给oboe-cli。
工具 | 描述 |
| 原子化创建会话文件 + 更新 index.json |
| 从 index.json 列出会话 |
| 会话的摘要统计信息 |
| 下一个项目:先进行中,然后是最高优先级的待处理,最后是延迟的 |
| 所有项目按 priority_score 降序排序 |
| 一个项目的完整详细信息 |
| 将项目标记为已阻塞并存储阻塞者信息 |
| 使用解决方案文本将项目标记为已完成 |
| 将项目标记为进行中 |
| 将项目标记为已跳过 |
| 设置审批元数据和可选的生命周期状态 |
| 当没有可操作项目时将会话标记为已完成 |
| 创建子会话,暂停父会话,并进入子会话 |
| 完成子会话并恢复父会话 |
| 将新项目附加到现有会话并重新激活它 |
| 更新任何字段;自动重新计算 priority_score |
为什么选择 OBO 会话
逐一(One-By-One)会话不仅仅是保存的聊天记录。它们是一种工作流模型,用于将多项工作作为持久、有序的交互会话来处理。
与简单的聊天或代理内置的后续问题相比,OBO 增加了这些较轻量级交互模式通常不具备的功能:
以概览为先的工作流,代理可以从范围、项目计数、主要类别和建议的执行顺序开始
基于紧迫性、重要性、工作量和依赖压力的显式重新优先级排序,而不是聊天中出现的任何顺序
通过
pending(待处理)、in_progress(进行中)、deferred(延迟)、blocked(阻塞)、completed(已完成)和skipped(已跳过)实现持久的生命周期状态通过
approval_status、approval_mode、approved_at和approval_note实现单独的审批元数据存储阻塞者元数据,以便阻塞的工作仍然可见且可解释,而不是从活动队列中静默消失
嵌套的子会话,可以暂停父会话,处理子问题,然后干净地恢复父会话
一流的会话生命周期管理:作为命名工作流对象列出、创建、检查、合并、暂停、恢复和关闭会话
模型重启、编辑器重新加载或代理移交后的确定性恢复
会话文件中的机器可读审计跟踪,而不是依赖对话记忆
当工作跨越许多发现、需要明确的用户审批、依赖中间的子调查或必须在多个代理轮次中存续时,这一点最为重要。聊天擅长对话。结构化问题工具擅长在当前轮次中获得清晰的答案。OBO 用于持久的工作流编排。
当您需要受控的顺序处理、持久的队列状态或嵌套的子工作时,请使用 OBO。当任务足够小,以至于完整的工作流对象会增加比价值更多的开销时,请使用简单的聊天。
状态模型
OBO 在两个独立的轴上跟踪每个项目。
生命周期轴
pending:工作已排队但尚未开始in_progress:工作目前正在积极进行中deferred:工作已批准稍后执行,在活动审查通过耗尽或用户明确请求延迟工作之前,应保持在立即审查队列之外blocked:在外部依赖或子问题解决之前,工作无法继续completed:工作已完成并关闭skipped:工作被有意不执行
审批轴
unreviewed:尚未记录明确的用户决定approved:用户已授权该工作denied:用户已明确拒绝该工作
审批元数据字段:
approval_status:项目的审批决定approval_mode:记录审批时间决定时为immediate(立即)或delayed(延迟)approved_at:记录审批的时间戳approval_note:关于审批决定的可选自由文本注释
常见配对:
立即批准:调用
obo_set_approval(..., approval_status="approved", approval_mode="immediate");项目通常保持pending,直到工作开始或被移动到in_progress延迟批准:调用
obo_set_approval(..., approval_status="approved", approval_mode="delayed");这会记录延迟批准并将项目移动到deferred拒绝:设置
approval_status=denied;如果项目要从队列中关闭,请将其与status=skipped配对
交互模式
三种常见的交互模式是简单聊天、结构化问题工具和完整的 OBO 会话。它们解决不同的问题。
标准聊天 | askQuestions 风格交互 | 逐一(One-By-One)会话 |
最适合小型、快速的来回任务,状态可以保留在对话中。 | 最适合代理需要用户在当前轮次中从一小组选项中进行选择时。 | 最适合工作涉及多个必须跟踪、恢复、重新排序、阻塞、嵌套或逐一批准的发现或决定时。 |
状态主要是对话式的,在长时间会话后可能难以恢复。 | 状态仍然主要是对话式的;问题工具提高了输入质量,但本身不提供持久的工作流状态。 | 状态持久化到 |
好的例子:“重命名此函数”或“解释此错误”。 | 好的例子:“恢复、合并、替换还是停止?” | 好的例子:“逐一审查这 12 个发现,并等待每个发现的批准”。 |
主要好处:摩擦力最小。 | 主要好处:更清晰的用户决定和更少的歧义回复。 | 主要好处:持久的队列管理、明确的阻塞者、嵌套的子会话以及跨多个项目的确定性恢复。 |
示例演变:
标准聊天:代理在散文中列出几个发现,对话本身成为处理内容的唯一记录。
askQuestions:代理可以要求进行清晰的菜单选择,但除非它在其他地方存储,否则仍然没有持久的项目队列。
OBO 会话:代理从概览开始,存储完整的项目列表,有意地对其进行排序,记录批准、跳过和阻塞者,并且可以在以后恢复,而无需从聊天历史记录中重建会话。
玩具示例:五个审查项目
假设代理审查一个小型待办事项应用程序,并按此原始发现顺序找到五个项目:
改进 UI 中模棱两可的设置标签。
解决后台同步作业中的竞态条件。
为重复的任务 ID 添加回归测试。
在创建任务端点上添加缺失的输入验证。
修复登录处理程序中的密码记录。
标准聊天
代理:
我在玩具应用中发现了五个问题: 问题 1:改进 UI 中模棱两可的设置标签。 问题 2:解决后台同步作业中的竞态条件。 问题 3:为重复的任务 ID 添加回归测试。 问题 4:在创建任务端点上添加缺失的输入验证。 问题 5:修复登录处理程序中的密码记录。
你接下来想做什么?
用户:
先做 4 和 2。
评论:
这很快,但聊天本身成为序列的唯一记录,项目 4 和 3 之间的依赖关系是隐含的。
其他问题的状态没有被捕获,用户将需要明确要求代理显示或处理其他问题。
如果会话中断,另一个代理将不得不从转录中重建状态。
askQuestions 风格聊天
代理:
我发现了五个问题。我们应该先做哪一个?
选项: • 4. 在创建任务端点上添加缺失的输入验证 • 2. 解决后台同步作业中的竞态条件 • 5. 修复登录处理程序中的密码记录 • 3. 为重复的任务 ID 添加回归测试 • 1. 改进 UI 中模棱两可的设置标签
用户:
4
代理:
下一个动作?
选项: • 继续做 2 • 重新排序剩余列表 • 停止
评论:
这比简单聊天提供了更清晰的用户选择,但工具本身仍然没有创建一个持久的、感知依赖的工作流对象。
其他问题的状态仍然没有被捕获,用户将需要明确要求代理显示或处理其他问题。
同样,如果会话中断,另一个代理将不得不从转录中重建状态。
逐一(One-By-One)会话
遵循 OBO 代理提示说明,代理分配此排序逻辑:
项目 4 排在第一位,因为在编写后续回归测试之前,应稳定创建任务端点的行为。
项目 2 排在第二位,因为竞态条件会影响整个同步流程的正确性,并且可能需要嵌套的调查会话。
项目 5 紧随其后,因为它是一个重要的安全修复,但它不会阻塞验证和并发工作。
项目 3 排在项目 4 之后,因为回归测试应该锁定最终的验证行为,而不是在它之前。
项目 1 仍然有用,但与其他四个项目相比影响较小,所以它排在最后。
代理:
我为 5 个发现创建了一个 OBO 会话。
执行摘要: • 总项目:5 • 类别:1 API 正确性,1 并发,1 安全性,1 测试,1 UX • 优先级顺序:4, 2, 5, 3, 1 • 估计工作量:11 • 关键项目:3 • 依赖说明:项目 3 跟随项目 4,因此回归测试针对的是稳定的端点行为 • 子会话说明:项目 2 可能会分支到一个嵌套的调查会话中 • 当前会话状态:5 待处理,0 进行中,0 已完成
当前项目: • 项目 4 • 标题:在创建任务端点上添加缺失的输入验证 • 类别:API 正确性 • 优先级分数:18 • 基本原理:在处理后续回归测试之前稳定端点契约
回复以下选项之一: • 立即批准 • 延迟批准 • 拒绝 • 下一个 • 更多选项
用户:
立即批准
[ ... 代理在此处执行项目 4 的工作 ... ]
代理:
项目 4 已完成。
会话状态: • 1 已完成 • 4 待处理 • 20% 已完成
当前项目: • 项目 2 • 标题:解决后台同步作业中的竞态条件 • 类别:并发 • 优先级分数:15 • 基本原理:这会影响整个同步流程的正确性,并且在父项目可以解决之前可能需要嵌套调查
子会话说明: • 如果您批准立即执行,我将展示嵌套流程
回复以下选项之一: • 立即批准 • 延迟批准 • 拒绝 • 下一个 • 更多选项
用户:
立即批准。
代理:
项目 2 在我完成它之前需要隔离调查。我
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Warnes-Innovations/obo-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server