Skip to main content
Glama

MCP 智能体邮箱

会话寻址的多智能体邮箱:一个邮箱账号对应一个原生会话,而不是整个智能体软件。 让 DSH、Codex、Claude Code、OpenCode 里各自独立的会话之间可靠地互发消息。

Python License

DSH
├─ 会话 A -> 邮箱账号 A  ─┐
└─ 会话 B -> 邮箱账号 B  ─┼─  同一个 Broker + 一份 SQLite(唯一权威状态)
Codex                    │
└─ 任务 C -> 邮箱账号 C  ─┘

30 秒理解设计

问题

做法

谁是谁

账号唯一键 (host_type, host_instance_id, native_session_id),重连恢复原账号

谁能发信

发送者从连接上下文解析;工具里根本没有 from / agent 参数

在线是什么

connected(托管连接进程活着)/ offline(无有效托管进程);can_wake 单独表示是否有注入通道

会不会丢

消息与投递入队同一事务;至少一次投递;目标离线保持排队,回来按序补投

会不会重复

发送幂等键 + delivery_id 去重

会不会互相刷屏

自动往返上限、速率限制、重复内容循环检测、全局/单对话暂停

收信安全吗

跨智能体消息是不可信数据,不授予任何权限提升;注入带来源信封

完整设计见 docs/session-addressed-agent-mailbox-design.md。

Related MCP server: agent-locks

安装

要求:Python 3.10+、uv,以及至少一个目标终端。

git clone https://github.com/maoxiangzhe/mcp-agent-mailbox.git
cd mcp-agent-mailbox
uv sync --locked          # 建 .venv 并装依赖(MCP SDK;Python 3.10 另需轻量 tomli)

uv run python -m mcp_agent_mailbox.cli migrate     # 初始化/升级数据库(幂等)
uv run python -m mcp_agent_mailbox.cli doctor      # 诊断
uv run python -m mcp_agent_mailbox.cli tools       # 列出会暴露的 MCP 工具
uv run python -m mcp_agent_mailbox.cli adapters    # 宿主能力矩阵
uv run python -m mcp_agent_mailbox.cli dashboard   # 启动只读 Web 监控台(会打印带令牌的地址)

只读 Web 监控台

uv run python -m mcp_agent_mailbox.cli dashboard --host 127.0.0.1 --port 8765

本机回环上的只读控制台,用来观察账号/连接/在线状态、对话与消息(含三个独立状态)、 投递积压与失败原因、数据库与适配器能力诊断。默认 127.0.0.1:8765,启动时生成临时 令牌并通过带令牌的 URL 打开;非回环地址会打印安全警告;端口冲突明确报错。

它是现有权威状态的投影,没有任何写操作:所有查询走 mode=ro + query_only 的 SQLite 连接,/api/* 的写方法一律 405,浏览前后业务表内容逐行一致(有端到端验收脚本 tools/dashboard_smoke.py 证明)。详见 docs/dashboard.md.

注册进客户端(默认注册会话寻址邮箱;旧版公告板用 --legacy):

uv run python install.py --dry-run                 # 演练:只看不改
uv run python install.py --target codex            # 只注册 Codex
uv run python install.py --target all              # 4 个终端全注册
uv run python install.py --check                   # 检查注册状态

默认客户端注册名统一为 mcp-agent-mailbox。旧 board / board-mcp 只有明确指向 -m mcp_agent_mailbox.cli 时才迁移;其他服务器保持原样。禁用状态、超时、额外环境变量 及工具设置保留,重复安装不重置这些选择。--legacy 才使用旧公告板名称。

会话身份必须由适配器注入(关键)

邮箱账号 = 一个原生会话,所以 MCP 服务器必须知道"我是哪个会话"。适配器要在启动 MCP 进程时注入:

环境变量

含义

必填

MAILBOX_SESSION_ID

宿主原生会话/任务/线程 ID

是(否则工具会如实报告"未绑定")

MAILBOX_HOST_TYPE

dsh / codex / claude / opencode …

是

MAILBOX_HOST_INSTANCE_ID

宿主实例标识(同一机器同一数据目录需稳定)

建议

MAILBOX_CAPABILITY_LEVEL

适配器已验证的能力等级 0/1/2

建议

MAILBOX_HOME

数据目录(兼容旧版 BOARD_MCP_ROOT)

可选

在拿到会话 ID 之前,邮箱不会替你猜一个身份:工具会返回明确的不可用原因, 而不是偷偷注册一个假账号。

Codex Desktop 当前不会把聊天级 CODEX_SESSION_ID 直接传给全局 stdio MCP 进程。 install.py --target codex 因此会以 --allow-adapter-registration 启动邮箱。会话首次看到 whoami.bound=false 时,从自己的 Shell 读取 CODEX_SESSION_ID,调用 connect_mailbox(session_id=<自己的 CODEX_SESSION_ID>, account_name="codex-A"); 随后再用 whoami 确认绑定。同一 MCP 连接不能切换到另一个会话;每个会话需要独立 连接。若宿主共享一个全局连接,必须先实现按会话隔离的适配器,不能通过轮流注册冒用身份。

重启 MCP 后,宿主再次提供相同三元身份会恢复原 account_id 并推进连接代次,历史与 离线积压保留。显式注册模式需再次调用 connect_mailbox,不会根据显示名、最后使用的账号 或其他对话的会话 ID 自动挑选身份。客户端聊天仍存在与邮箱连接在线是两件事:连接进程退出 不会删除原账号,也不表示聊天已经消失。

DSH 特别注意:DSH 启动 MCP 子进程时会过滤掉所有 DSH_* 环境变量,因此 不能指望自动拿到 DSH_SESSION_ID;需要在 profile 里为该 MCP 服务器显式 配置 env:(静态值无法区分会话)。DSH 的实时唤醒需要 in-process 插件路径, 详见 宿主能力矩阵。

MCP 工具(模型可见)

工具

作用

whoami()

当前账号、宿主会话、能力等级、连接状态

connect_mailbox(session_id, account_name, workspace_hint?)

首次接入:用当前会话 ID 注册或恢复邮箱账号

list_contacts(status?, host_type?)

列出可联系账号,如实标注可否实时唤醒

start_conversation(to_account_id, text, idempotency_key?, wait_for_reply?)

建对话并发首条消息

send_message(conversation_id, text, idempotency_key?, wait_for_reply?)

向已有对话发消息

reply_message(message_id, text, idempotency_key?, wait_for_reply?)

回复指定消息(带 reply_to,成功后自动确认原收件)

mailbox_inbox(limit?, cursor?)

分页取未完成收件,返回 next_cursor 和全局 pending_total

list_conversations(cursor?, unread_only?, limit?)

游标分页列对话

read_conversation(conversation_id, after_message_id?, limit?, mark_seen?)

读消息;mark_seen=False 为只读

set_message_status(message_id, processing, result?)

回传处理状态

另有适配器协议 + 收信工具:mailbox_register、mailbox_heartbeat、 mailbox_fetch_delivery、mailbox_ack_delivery、 mailbox_fail_delivery。完整参考见 docs/mcp-tools.md。

会话怎么发现"有人给我发消息了"

MCP 只有"客户端调用工具"一个入口,服务器无法主动把消息塞进模型上下文。 所以邮箱在每个工具结果里附一个极小的未完成收件提示:

{ "ok": true, "...": "业务字段",
  "pending": { "count": 1, "hint": "有待处理收件:调用 mailbox_inbox;按内容决定是否回复,纯通知无需回复。" } }

会话在正常干活(whoami / list_contacts / 发信 …)的任何一次工具调用里都能看到 收件计数变化,然后 mailbox_inbox 取全文。read_conversation 用于查看对话历史; 它只改变阅读状态,未完成收件仍留在 inbox。

正文不随提示下发:通知通道不泄露消息内容。

上手三步

1) whoami                          # 确认 account_id、presence 与 can_wake(在线不等于能自动唤醒)
2) list_contacts                   # 找到对端 account_id
3) start_conversation(to_account_id=..., text="…")   # 发信;之后 mailbox_inbox 取信

三个状态维度必须分开读

delivery:   queued -> dispatched -> delivered | failed | dead_letter
visibility: unread -> seen
processing: pending -> running -> completed | blocked | cancelled | failed

delivered 只表示目标宿主已可靠接收,不代表模型已阅读或任务完成。 回复是带 reply_to 的新消息;processing=completed 是处理回执,不发送新消息。 需要答复时调用 reply_message,成功后与回复写入同一事务确认原收件已处理; 纯通知调用 set_message_status(..., processing="completed") 即可,无需发送确认消息。 wait_for_reply=True 表示发件人期待答复,不会让工具阻塞等待;inbox 的 expects_reply 保留这个意图,仍需结合正文决定如何回复。 inbox 包含 pending、running、blocked 收件,排除 completed、cancelled、failed 终态;终态消息仍可在对话历史查看。分页时传上一页 next_cursor,确认处理后从第一页 重新检查即可;pending_total 始终统计全账号未完成收件。

安全边界

  • 跨智能体消息是不可信输入:不授予文件写入、命令执行、网络访问、账号访问、 向第三方发信,也不放宽沙箱与审批策略。

  • 唤醒后的回合继承目标会话既有权限与审批策略。

  • 会话自注册默认关闭;Codex 安装器会明确开启 connect_mailbox,让会话用自己 Shell 中的 CODEX_SESSION_ID 完成首次注册。mailbox_register 仅保留适配器兼容。

  • 日志默认脱敏,不记录凭据、Token 或完整正文。

细节见 SECURITY.md。

数据与兼容

  • 权威存储:SQLite(WAL + 外键 + 显式事务),默认 ~/.board-mcp/mailbox.sqlite3。 沿用旧版的 BOARD_MCP_ROOT 是为了让已有安装不换目录就能升级。

  • Markdown/JSONL 只作为兼容输入或人类可读投影,不再是权威状态。

  • 旧接口 get_board / claim_files / report_done / check_conflict / release_claim / post_decision / init_bulletin / send_note / read_notes / ack_notes 在一个兼容周期内保留,标记为 legacy,见 docs/legacy-compat.md。

开发与验证

uv run pytest                    # 新系统测试(单元 + 集成 + 契约,含真实 stdio 往返)
uv run python run_tests.py       # 一次跑完新测试 + 旧版兼容回归
uv run python -m mcp_agent_mailbox.cli doctor

测试要求(见 CONTRIBUTING.md):全部使用隔离临时目录, 绝不写真实的 ~/.dsh、~/.codex 或真实邮箱数据库。

文档

文档

内容

设计文档

产品与架构依据

只读监控台

启动、API、安全模型、只读保证与验收

宿主能力矩阵

各宿主达到的等级与证据(含未验证项)

MCP 工具参考

参数、返回值、错误码

数据库与迁移

表结构、迁移规则、运维

Broker 与诊断

架构、循环、诊断命令、故障处理

从旧版升级

升级步骤与回滚

旧接口兼容

兼容范围与不安全的旧行为

CHANGELOG

版本记录

开源与发布

MIT 许可证,保留原作者版权声明。参与贡献请阅读 CONTRIBUTING.md, 安全边界见 SECURITY.md,发布前检查 RELEASE_CHECKLIST.md。

本仓库不包含用户的公告、消息、游标、客户端配置或运行日志。

Available Tools

10 tools
ack_notesA

记录回执状态;空 ids 只确认本 agent 已送达且未回执的消息。

status: received / processing / completed / blocked;已完成不能退回其他状态。 更新已有回执必须显式指定 ids;received 不代表任务完成。

ParametersJSON Schema
NameRequiredDescriptionDefault
idsNo
agentYes
resultNo
statusNoreceived
projectNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden and meets it well. It discloses the empty-ids special case, the allowed status values, the irreversible transition from completed, and the semantic warning that received does not mean task completion.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the main purpose. Every clause earns its place: purpose, empty-ids rule, status enumeration, state constraint, and update requirement. There is no redundant text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite a rich behavioral summary, the description is incomplete for a 5-parameter tool with zero schema coverage and no annotations. It does not explain the required agent field, what result should contain, or how project is used. The output schema mitigates return-value ambiguity but not the input ambiguity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate by explaining parameter meanings. It covers status and partly ids, but the required agent parameter and the result/project parameters receive no explanation. An agent cannot confidently fill all fields from the description alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening phrase '记录回执状态' clearly identifies a specific verb and resource: recording acknowledgment/receipt statuses. The description further distinguishes this from siblings like send_note and read_notes by focusing on ack state transitions rather than sending or reading messages.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives concrete usage conditions: empty ids means acknowledging only undelivered/unacked messages for the current agent, while updating existing acknowledgments requires explicit ids. It does not explicitly name alternatives, but the conditions are clear enough to guide when to call this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_conflictA

查冲突:开工前或收尾前调用,确认这些文件没有被别人占用。 files 用逗号分隔。返回冲突清单;没有冲突会明说"没有冲突"。 过期认领(超 TTL 已自动释放)不算冲突,但会提示原属终端。

ParametersJSON Schema
NameRequiredDescriptionDefault
agentNo
filesYes
projectNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations available, the description carries the behavioral burden. It discloses the return behavior (conflict list or explicit '没有冲突') and an important edge case: expired claims are not conflicts but trigger a hint about the original terminal. An explicit statement that the tool is read-only would make it fully transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four compact sentences cover purpose, timing, input format, output behavior, and an edge case, with no filler. The key action is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers when to use the tool, how to format files, what output to expect, and how expired claims are handled; an output schema also exists. The only residual gap is the unstated semantics of the optional agent/project parameters.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It provides the required format for the 'files' parameter ('用逗号分隔'), which is valuable, but it leaves the optional 'agent' and 'project' parameters unexplained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with '查冲突' and immediately clarifies the resource ('files') and the purpose ('确认这些文件没有被别人占用'). It clearly distinguishes the tool as a check operation relative to the sibling claim/release tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states when to call the tool: '开工前或收尾前调用'. It does not name alternatives or give exclusion conditions, but the timing guidance provides a clear selection context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

claim_filesA

认领:声明"我是谁、我在做什么、我要动哪些文件"。 files 用逗号分隔,例如:src/auth/login.py, src/auth/schemas.py 如果这些文件和别的终端的占用中认领重叠,会被直接拒绝,并告诉你撞了谁。 同 agent 重复认领 = 续期:与本次文件重叠的旧声明作废、TTL 重新计时; 不重叠的认领保留(同 agent 可同时持有多个文件组的认领)。

参数: agent 你的名字/代号(比如 T1、coder-1) task 一句话说明任务 files 要动的文件或目录,逗号分隔

ParametersJSON Schema
NameRequiredDescriptionDefault
taskYes
agentYes
filesYes
projectNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses important behavioral traits: overlapping claims are rejected with the conflicting party named, repeated claims renew the TTL, and non-overlapping claims are retained. It does not mention TTL duration or explicit release requirements, but the core state-changing behavior is well covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the purpose, then explains conflict/renewal behavior, and ends with a compact parameter list. Every sentence adds useful information without redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given there are no annotations and there is meaningful behavioral complexity, the description is largely complete: it covers claiming semantics, conflict rejection, renewal, TTL reset, and file format. Minor gaps include the undocumented optional project parameter and the lack of explicit guidance to use release_claim when done, but these are not critical for invoking the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It provides meaningful descriptions for agent, task, and files, including a comma-separated format example. The optional project parameter is not explained, which prevents a perfect score.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly defines claim_files as a declaration of identity, task, and target files: '声明我是谁、我在做什么、我要动哪些文件'. This distinguishes it from sibling tools like release_claim and check_conflict by specifying the claim operation and its resource (files).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when this tool is used: to claim files before working on them, with conflict rejection if other terminals already hold overlapping claims. It also explains renewal behavior for repeated claims by the same agent. It does not explicitly name alternatives or say when not to use it, but the usage context is evident.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_boardA

看板:读取本项目的共享公告全文(认领区 + 共享决策 + 最新变更)。 开工前必看。返回的就是那个 Markdown 文件的内容。

参数 agent(可选,建议填):填上你的代号后,本工具会把"发给你的未读定向消息" 贴在最前面,并把它们标记为已送达(下次不再重复出现)。别人用 send_note 派给你的活, 就是靠这里收到的。不填 agent = 老行为,完全不碰消息。

ParametersJSON Schema
NameRequiredDescriptionDefault
agentNo
projectNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses that filling the agent parameter will prepend unread directed messages and mark them as delivered (a side effect), and explains the behavior when not filled. It also states it returns the Markdown file content. This is transparent about the conditional behavior, which is critical for a tool with an optional side-effect parameter.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a concise paragraph that front-loads the purpose and then explains the optional parameter. Each sentence adds value, and it avoids fluff. It's appropriately sized for a tool with two optional parameters.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is complete for the main function, and the presence of an output schema likely covers the return format. However, the project parameter is left unexplained, which is a gap given the schema has no description. It also doesn't mention error conditions, but for a read operation with optional parameters, this may be acceptable. The missing project parameter explanation prevents a higher score.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description thoroughly explains the agent parameter, including its purpose and side effects. However, it does not mention the project parameter at all, despite schema coverage being 0%. Since there are two parameters and only one is explained, the description only partially compensates for the schema's lack of descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool reads the project's shared announcements (kanban) and returns the Markdown file content, listing the specific sections (claim area, shared decisions, latest changes). This is a specific verb-resource pair that distinguishes it from siblings like send_note or read_notes, making its purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says '开工前必看' (must read before starting work), providing a clear context for when to use it. It also explains that tasks sent via send_note are received here, which guides the agent to use this tool to check for assigned work. However, it does not explicitly state when not to use it or compare with alternatives like read_notes, though the context implies it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

init_bulletinA

初始化:每个终端接入邮箱时第一个调用。 做两件事: 1. 在当前目录生成必读文件 AGENTS.md(AI 每次对话都会自动读到它, 里面写着协作纪律,等于给 AI 装上"开工前先看板"的规矩); 2. 创建本项目的共享公告文件(如果还没有)。 幂等:必读文件和共享公告已存在时不会覆盖,所以可以放心反复调用。

参数: project 项目名,不传就自动识别(git remote -> 标记文件 -> 文件夹名) include_claude 设为 True 时额外生成 CLAUDE.md(给 Claude Code 用)

非 git 目录下会自动生成 .board-project 标记文件(内容 = 项目名), 文件夹从此绑定固定项目身份:以后从任何副本/目录进入都解析到同一块板。

ParametersJSON Schema
NameRequiredDescriptionDefault
projectNo
include_claudeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it discloses idempotency, no-overwrite behavior, automatic detection order for project, and the side effect of creating a .board-project marker in non-git directories plus persistent project binding.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is organized into clear sections and front-loads the initialization purpose. The only slight excess is the metaphor about installing a pre-work board for the AI, which adds flavor rather than actionable detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema exists and both parameters are optional, the description covers the necessary behaviors: file creation, idempotency, project detection, and the non-git marker side effect. Nothing required to invoke the tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate, and it fully does. It explains that project is optional with a fallback detection chain (git remote, marker file, folder name), and that include_claude adds a CLAUDE.md for Claude Code.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens by naming the tool role (initialization, first call on each terminal) and specifies the two concrete artifacts it creates: AGENTS.md and a shared announcement file. This clearly distinguishes init_bulletin from the operational sibling tools like send_note or get_board.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit trigger (first call when a terminal connects to the mailbox) and explicitly reassures repeated use because the operation is idempotent. It does not name excluded cases or compare with alternatives, but none of the sibling tools overlap with this setup role.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

post_decisionA

写决策:往共享决策区追加一条约定,所有终端 get_board 时都能读到。 用于定协议、记方案取舍、留踩坑结论——凡是"需要别人看见并遵守"的内容。

共享决策区的内容会被保留和累积,不随认领表滚动清理; 追加时带上 agent 和时间戳,方便追溯是谁、在什么时候定的。

参数: agent 你的名字/代号(要和认领时一致) decision 决策内容,一句话讲清楚"定了什么、为什么"

ParametersJSON Schema
NameRequiredDescriptionDefault
agentYes
projectNo
decisionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the disclosure burden. It explicitly discloses persistence ('会被保留和累积,不随认领表滚动清理'), visibility via get_board, and traceability via agent/timestamp. These go beyond the schema; only minor operational details like duplicate/overwrite behavior are absent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose, then retention behavior, then parameter guidance, with bullet-style parameter lines. It is not padded and each section adds value. Minor redundancy with the schema list is acceptable because it adds usage guidance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple append tool, the core behavior and the two required parameters are well covered, and output schema exists so return details needn't be described. However, the project parameter is entirely undocumented both in schema and description, and no explicit 'when not to use' boundary is given. This leaves a small but real gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must document parameters. It explains agent ('要和认领时一致') and decision format ('一句话讲清楚定了什么、为什么'), but says nothing about the optional project parameter. Since one of three parameters remains undefined, compensation is incomplete.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description opens with '写决策:往共享决策区追加一条约定' and states visibility via get_board. It lists concrete use cases (定协议、记方案取舍、留踩坑结论), which distinguishes it from sibling note/claim tools. This is a specific verb+resource with clear differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description says '用于定协议、记方案取舍、留踩坑结论——凡是"需要别人看见并遵守"的内容', giving clear context. It does not explicitly name alternatives like send_note or state when not to use it, but the category '需要别人看见并遵守' implies the boundary.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_notesA

收件箱/发件箱:读定向消息。

参数: agent 你的代号 box 'inbox'(默认)= 别人发给我的;'outbox' = 我发出的(带谁回了执) limit 未读优先按最早顺序分页;无未读时返回最近历史(默认 50,上限 200) peek 仅 inbox 有效:True = 只看不推进未读游标(消息仍算未读)

get_board(agent=...) 也会自动贴出未读消息并标记送达; 本工具用于回看历史、确认没漏读、检查自己发出的消息有没有被回执。

ParametersJSON Schema
NameRequiredDescriptionDefault
boxNoinbox
peekNo
agentYes
limitNo
projectNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden. It discloses unread-cursor semantics via peek, pagination behavior via limit, and inbox/outbox content differences. However, it does not explicitly state the side effect of a normal (non-peek) read beyond implying the cursor advances.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact, front-loaded with the core purpose, and organizes parameter details in a scannable list. Every line adds useful information without repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers most operational behavior and parameter semantics, and an output schema exists to describe return values. The main missing piece is the project parameter, which prevents full completeness for a 5-parameter tool with minimal schema descriptions.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must explain parameters. It explains agent, box, limit, and peek with meaningful detail. The project parameter is left undocumented, leaving one gap in an otherwise strong parameter explanation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear verb and resource: read directed messages in inbox/outbox. It distinguishes itself from get_board, which auto-displays unread messages and marks them delivered, making the tool's role unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use this tool instead of get_board: for reviewing history, confirming no missed messages, and checking receipts on sent messages. This gives an agent concrete routing guidance among siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

release_claimA

取消认领:把某个终端的所有占用中认领标记为"已取消",释放文件。 用在:任务取消了、终端掉线了、认领卡住没人动。 注意:只能取消占用中的认领;已汇报/已取消的不受影响。 认领已过期(超 TTL 自动释放)时无需再取消,工具会提示。

ParametersJSON Schema
NameRequiredDescriptionDefault
agentYes
projectNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses the mutation effect (marks claims cancelled, releases files), the restriction to in-progress claims only, and TTL-related expiration behavior. It does not mention permissions or permanence, but the key operational boundaries are well covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is four short sentences, each serving a distinct purpose: main action, use cases, constraint, and TTL edge case. It is front-loaded with the core behavior and contains no filler or redundant restatement.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that an output schema exists, the description does not need to explain return values. It adequately covers the operation, when to use it, and the main edge cases. The primary gap is explicit parameter semantics, but overall an agent can infer the correct invocation context from the operational description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description needed to compensate for the bare input schema. It only loosely refers to '某个终端' (a terminal), which maps weakly to the agent parameter, and it never explains the optional project parameter or how the parameters relate to the cancellation scope. This is insufficient given the complete lack of schema field descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with the specific action '取消认领' and states that it marks all in-progress claims for a terminal as cancelled and releases files. This is a concrete verb+resource+scope statement that clearly differentiates the tool from siblings like claim_files and report_done.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly lists when to use the tool: task cancelled, terminal offline, or claim stuck. It also provides negative guidance: reported/cancelled claims are unaffected, and expired claims do not need cancellation because the tool will prompt. However, it does not explicitly name alternative sibling tools or contrast them.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

report_doneA

汇报:干完了。做三件事: 1. 把自己的占用中认领标记为"已汇报"(释放文件); 2. 在"最新变更"里写一条流水(最多保留 MAX_HISTORY 条,旧的自动剪掉); 3. 自动检查这次改动有没有和别人撞车(如果撞了会提醒,不拦截)。 如果自己的认领已超 TTL 过期,会提示先重新 claim_files 再汇报。

参数: agent 你的名字/代号(要和认领时一致) summary 干了什么、结果如何 files 这次实际改动的文件,逗号分隔(建议填,用于自动查冲突)

ParametersJSON Schema
NameRequiredDescriptionDefault
agentYes
filesNo
projectNo
summaryYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

There are no annotations to carry the safety or side-effect profile, so the description takes full responsibility. It explicitly discloses three side effects, including that file claims get released, history is pruned to MAX_HISTORY, and conflict checking is non-blocking (reminds but does not block). It also discloses TTL expiration behavior. This is high-quality behavioral disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured: a one-line summary, a numbered list of effects, an edge-case condition, and parameter clarifications. Every sentence contributes useful information, and the most important behavioral details are front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with three side effects, an edge case, and no annotations, the description covers the essential behavioral and parameter context quite thoroughly. An output schema exists for return values, so that is not needed here. The only notable gap is the undocumented project parameter, which keeps this from being fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides no descriptions (0% coverage), so the description must compensate. It explains agent (must match the claim), summary (what was done/result), and files (comma-separated, recommended for conflict checking). However, the project parameter is not explained, leaving one of four parameters undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific action (reporting task completion) and enumerates three concrete effects: marking a claim as reported, appending a history entry with automatic pruning, and checking for conflicting changes. This clearly differentiates it from siblings like release_claim or send_note, which have narrower purposes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The context is clear: this is the tool to call when claimed work is finished. It also gives a conditional rule—if the claim has expired, re-run claim_files first—which helps an agent decide when not to call it directly. It does not explicitly name alternative tools or exclusion cases, but the usage scenario is strongly implied and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

send_noteA

定向消息:给指定终端发一条点对点消息(对方 get_board 或 read_notes 时收到)。 用在:派活、报缺陷、接口变更通知、要回执的协调。

和 post_decision 的分工: post_decision = 广播:所有终端都该看到并遵守的约定 -> 进共享公告的决策区。 send_note = 定向:只发给某几个终端的一件事 -> 进收件箱,带未读计数和回执。

参数: agent 你的代号(发送方) to 收件人代号,逗号分隔(如 "D-1, D-2");填 * 表示全体 text 正文。派活时请写全:任务号、文件绝对路径、基线 SHA、完成条件 task 可选任务号(如 DS-MVP-D1-FRONT-MODULE-02),便于检索 request_id 可选重试标识;同发送方、同标识、同内容返回原消息,不重复发送

ParametersJSON Schema
NameRequiredDescriptionDefault
toYes
taskNo
textYes
agentYes
projectNo
request_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses when recipients receive the message (via get_board or read_notes), that it lands in an inbox with unread count and receipt, and that request_id makes retries idempotent (same sender/id/content returns original message, no duplicate). This is substantial behavioral context beyond the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose and use cases before parameter details, uses compact section labels, and includes examples only where they add value. There is no filler or redundant restatement.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 6-parameter messaging tool with no annotations and an output schema present, the description thoroughly covers delivery behavior, idempotency, and almost all parameter semantics. The only gap is the undocumented 'project' parameter, so it is nearly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description documents five of six parameters with examples and constraints: agent, to (comma-separated or '*'), text, task, and request_id (idempotency). However, the 'project' parameter is entirely undocumented, which prevents a perfect score.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with '定向消息:给指定终端发一条点对点消息', specifying a clear verb, resource, and delivery semantics. It also explicitly contrasts with post_decision (广播 vs 定向), so an agent can distinguish it from the closest sibling without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It names concrete use cases (派活、报缺陷、接口变更通知、要回执的协调) and explains the exact division of labor with post_decision: broadcast decisions go to shared bulletin, while directed notes go to inbox with unread count and receipt. This gives explicit when-to-use and when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 10 tool updatesv0.2.0
    • First observedack_notes
    • First observedcheck_conflict
    • First observedclaim_files
    • First observedget_board
    • First observedinit_bulletin
    • First observedpost_decision
    • First observedread_notes
    • First observedrelease_claim
    • First observedreport_done
    • First observedsend_note

TDQS

A4.2/5.0

Scored across 10 tools

Disambiguation4/5

Most tools have clear, distinct purposes: send_note/read_notes/ack_notes form a messaging trio, while claim_files/report_done/release_claim/check_conflict handle file ownership. The only minor overlap is between get_board and read_notes since both surface unread messages, but get_board is the board overview while read_notes is the dedicated mailbox, so the boundary is acceptable.

Naming Consistency4/5

Tool names mostly follow a verb_noun pattern: send_note, read_notes, ack_notes, claim_files, report_done, check_conflict, release_claim, post_decision. init_bulletin and get_board deviate slightly (init_/get_ instead of a plain verb), but the pattern is still recognizable and readable.

Tool Count5/5

10 tools is well-scoped for a collaboration board MCP server. Each tool covers a distinct workflow: initialization, board reading, messaging, file claiming, conflict checking, and decision posting. No tool feels redundant or unnecessary.

Completeness4/5

The tool surface covers the core collaboration lifecycle: init_bulletin bootstraps the board, get_board reads it, send_note/read_notes/ack_notes handle directed messaging, claim_files/report_done/release_claim/check_conflict manage file ownership, and post_decision records shared decisions. A minor gap is the lack of a way to edit or remove a posted decision, but agents can work around that by posting a correction.

Maintenance

ActivityMaintained
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    F
    maintenance
    A filesystem-based MCP server for AI coding agents to coordinate work across git worktrees by claiming files, checking for conflicts, and logging progress without affecting the repository's git history.
    5
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    MCP server for coordinating multiple AI agents across developers and vendors with a shared job board, per-file locking, and live project context.
    7
    AGPL 3.0
  • A
    license
    Not graded
    quality
    B
    maintenance
    MCP server that provides cross-session awareness for Claude Code, tracking active sessions, file conflicts, and shared todos to enable agent coordination without blocking tool calls.
    860 npm
    MIT