Claude Code 会话如何互相发送消息
了解 Claude Code 会话间消息传递:v2.1.224 起的限制、ListAgents 与 SendMessage 的用法、第二个会话何时值得使用,以及消息为何会被暂存。
Claude Code 会话之间互相发送消息的含义
两个 Claude Code 会话在同一台计算机上、由同一个操作系统用户运行时,可以互相发送消息。一条消息是一个 Claude 为另一个 Claude 编写的纯文本片段。消息不包含对话历史或文件。Claude 使用 ListAgents 工具查找另一个会话,并使用 SendMessage 发送文本,因此您无需手动调用这两个工具。您只需说明另一个会话需要了解的内容,Claude 会自行编写消息。
此功能称为跨会话消息传递。截至 August 2026,它需要 Claude Code v2.1.224 或更高版本,并支持 macOS 和 Linux,包括 WSL 2 中的 Linux。它不原生支持 Windows,也不适用于 Amazon Bedrock、AWS 上的 Claude Platform、Google Cloud's Agent Platform 或 Microsoft Foundry。会话满足这些要求后,消息传递功能已自动启用,无需额外配置。以下行为说明来自 Anthropic 的跨会话消息传递文档。
VPS 是此功能真正有用的场景,因为会话可以在 VPS 上持续运行足够长的时间,值得彼此通信。在笔记本电脑上,您合上盖子,会话通常就停止了。在运行 tmux 的服务器上,您周一启动的会话到周四仍可能在运行,并继续保留某个代码仓库的上下文。当您有两个这样的会话后,它们如何通信就不再只是理论问题。如果您还没有完成设置,请先阅读 在 VPS 上通过 tmux 运行 Claude Code,其中介绍了本指南所需的会话基础配置。
何时值得使用第二个会话
先考虑成本。每个会话都是拥有独立上下文窗口的 Claude 实例,因此在相同时间内,两个会话的成本大致是一个会话的两倍。发送的消息与您手动输入的提示一样,都会计入用量。协调并不是免费的;如果工作本质上是一系列连续步骤,将其拆分到多个会话中反而会降低速度并增加成本。
值得使用第二个会话的场景通常具有相同特征:两项工作可以同时进行,互不等待,而且其中一项工作会在执行过程中获取另一项所需的信息。
- 一个会话发现了不兼容变更,另一个会话正在基于已被破坏的代码继续工作。Claude 会汇总该变更并发送过去,您无需在另一个终端中重新输入。
- 两个会话在同一仓库的不同 git worktree 中工作,其中一个需要了解已经合并的内容。
- 长时间运行的迁移或测试将结果返回给您正在监控的会话。
- 一个会话负责构建,另一个会话负责审查。审查会话读取构建会话生成的内容,并反馈发现的问题。
如果工作是连续执行的,或者两个会话都会编辑相同的文件,请使用一个会话。如果您希望 Claude 在单个任务中创建并管理一个协调工作的会话组,则应使用 agent teams;这是另一项仍处于实验阶段的独立功能。如果您只是想在另一个终端中继续相同的对话,请改为恢复该会话。跨会话消息适用于彼此独立、由您自行启动和控制的会话。
在规划使用前,先确认功能确实存在
先查看版本:
claude --version将该版本号与 2.1.224 比较。然后在会话中输入 /list-agents,该命令也可使用 /peers 调用。它会列出当前会话可以访问的所有代理,以及每个代理响应的名称。如果系统完全无法识别该命令,说明当前会话不支持跨会话消息传递,任何设置文件都无法启用该功能。输入 /status,查找 Peer address 行;该行保存当前会话自己的收件箱地址,地址以 uds: 开头。
VPS 用户尤其容易遇到一个问题。跨会话消息传递依赖功能标志评估,而多个隐私变量会关闭该评估,使功能保持默认关闭状态。DO_NOT_TRACK、DISABLE_TELEMETRY、CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC 和 DISABLE_GROWTHBOOK 都会产生这种效果。用户通常会将这些变量粘贴到新服务器的 ~/.bashrc 中进行加固,然后发现 /list-agents 并不存在。相同的值也可能来自设置文件中的 env 映射或托管设置,因此请先检查 shell 环境。
env | grep -E 'DO_NOT_TRACK|DISABLE_TELEMETRY|DISABLE_GROWTHBOOK|NONESSENTIAL'取消设置输出有值的变量。对于 DISABLE_TELEMETRY 和 CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC,任何非空值都会启用该行为,包括字符串 0,因此 DISABLE_TELEMETRY=0 实际上不会产生看起来应有的效果。要关闭该行为,请取消设置变量,或将其设置为空字符串。
为会话命名,否则 Claude 无法定位会话
Claude 通过会话名称将消息发送到指定会话。启动会话时设置名称:
claude --name builder-api在运行中的会话内,也可以使用 /rename 设置名称。如果不设置名称,Claude Code 会根据工作目录的文件夹名称生成名称,例如 myapp-3f。一个会话时这样没有问题,但同时运行四个会话时就容易混淆;而且两个会话可能生成相同的名称。/list-agents 输出会显示每个本地会话的工作目录,可据此区分同名会话;Claude 自己的列表会在名称冲突时,为地址附加一个短标识符。自行命名比查找这些标识符更省事。
可复现的双会话 tmux 布局
这是在同一个仓库中运行的构建会话和审查会话。审查会话使用独立的 git worktree,因此两个会话不会写入同一个文件。git worktree add 配合 HEAD 可创建一个分离的检出,这适合只读取代码而不提交更改的会话。
cd ~/src/api
git worktree add ../api-review HEAD
tmux new-session -d -s agents -n builder -c ~/src/api
tmux new-window -t agents -n reviewer -c ~/src/api-review
tmux send-keys -t agents:builder 'claude --name builder-api' C-m
tmux send-keys -t agents:reviewer 'claude --name reviewer-api' C-m
tmux attach -t agentsCtrl+b 随后 w 会按名称列出窗口,供您选择。在构建窗口中运行 /list-agents。您应看到 reviewer-api 及其工作目录 ~/src/api-review。如果没有看到,说明审查会话尚未完成启动,或者下一节中的两个问题之一正在发生。然后用自然语言交接任务:
Tell reviewer-api which files I changed for the rate limiter and what to look at first.Claude 会编写摘要并发送。您无需编写消息内容,Claude 发送的内容也不固定。在审查窗口中,消息会以发送者名称显示在对话中。如果该会话处于空闲状态,Claude 会立即在其中开始新一轮处理。如果该会话正在执行当前轮次,消息会等待到两次工具调用之间,因此正在运行的命令不会被中断。Claude 读取消息后,消息会折叠为一行 Message from,由 Ctrl+O 展开。构建会话每次只保留较小的更改时,两个会话的配合效果更好,因为较窄的差异会产生更短的交接内容,也便于另一个会话在一轮处理中完成审查;这正是懒惰资深开发者技能要培养的习惯。
在同一台 VPS 上谁可以看到谁
同机消息传递不会经过 Anthropic 服务器。每个会话都会将注册文件写入磁盘,并绑定自己的收件箱套接字;Claude Code 读取这些文件,以查找您的其他会话。由此会产生两个后果,而且在服务器上都很重要。
套接字仅限您的操作系统用户访问。您以 root 启动的会话和以 deploy 启动的会话无法相互看到,即使它们并排运行在同一个 tmux 服务器中也是如此,因为一个用户的会话无法访问另一个用户的套接字。请以同一用户运行两个会话。
容器使用自己的文件系统。Docker 内的会话与主机上的会话无法相互访问,因为它们读取的不是同一组注册文件。同一个容器内的两个会话可以正常互发消息。如果您为了隔离而将代理运行在容器中,例如在一次性 VM 中运行编码代理,请预期消息传递只能在容器内正常工作,无法跨越容器边界。
只有在 Remote Control 已连接时,您在其他机器上以及 Web 上的会话才会出现在列表中,并会标注为相应来源。此处的 Claude 只能回复来自这些会话的消息,无法主动发起该通信。
为什么消息始终没有送达
通常原因与网络无关。接收会话决定如何处理消息,而决定结果不是投递。每条到达的消息最终只有三种结果:已投递、已暂存(未投递,直到您批准),或已拒绝(直接丢弃,不予投递)。
当没有适用的 crossSessionInbound 值时,Claude Code 会根据两个会话的权限模式逐条决定处理方式。它将绕过权限提示的会话归为一类,将其他会话归为另一类。auto、acceptEdits 和 dontAsk 都计入需要提示的模式。对于具备绕过权限的会话,计划模式计入绕过权限。规则是对称的:
- 需要权限提示的接收会话会投递每条消息。只有当发送会话表明自己会绕过提示时,它才会暂存消息。
- 绕过权限提示的接收会话会暂存每条消息,等待您批准。只有当发送方也绕过提示时,它才会投递消息。
因此,大多数人首先构建的工作流恰好无法正常工作。您使用 --permission-mode bypassPermissions 启动构建器,因为希望它无人值守地运行;审核器则保留默认设置。于是,构建器发送的每条消息都会在审批对话框中等待,而没有人查看该对话框。对话框会在 dialogExpiry 时限后关闭,该时限默认为 5m,消息也会被丢弃。在同一台机器上,发送会话会在消息被暂存时收到通知;接收方随后投递、拒绝或使消息过期时,发送会话还会收到后续通知。因此,在将问题归咎于套接字之前,请先查看发送方的界面。
要让会话在无人值守的情况下接收消息,请将 crossSessionInbound 设置为 accept。设置位置决定了它的适用范围。Claude Code 首先读取托管设置,然后读取 --settings 标志,最后读取用户设置,并应用它找到的第一个值。项目设置或本地设置中的值仅在其更严格时才会生效,优先级顺序为 accept < hold < refuse。.claude/settings.json 中的 accept 比任何值都宽松,因此只要受信任的来源已设置值,它就会被忽略。将其写入 ~/.claude/settings.json,或仅为一个会话传入:
claude --name runner --settings '{"crossSessionInbound":"accept"}'无头 claude -p 工作进程会像交互式会话一样绑定收件箱套接字,并显示在列表中,但它无法显示审批对话框。此类会话中的暂存消息会一直保持暂存,直到后续模式或设置变更使其能够接收。上面的 --settings 行用于允许此类工作进程接收消息。以裸模式启动的会话完全不会绑定套接字,因此既不能接收消息,也不会显示在列表中。
交接陷入死锁的情况
消息循环由系统自动处理。Claude Code 会限制每个发送方重复发送消息的速率,丢弃在短时间窗口内到达的相同重复消息,并将每个会话中等待读取的已接受消息限制为 50 条,因此两个会话无法无限互相发送消息。暂存消息最多保留 100 条,超过后会丢弃最早的消息。
实际发生的故障更隐蔽,而且属于交接问题,而不是循环。会话 A 向会话 B 提出一个必须先得到答案的问题,然后进入空闲状态。B 暂存了这条消息,或者 B 正在处理某项耗时较长的任务,或者 B 回答了一个 A 实际上没有提出的问题。A 继续等待。您一小时后回来时,会看到两个空闲会话,工作却没有任何进展。
编写不需要回复的交接消息。好的消息应包含事实或决定:发生了什么变化,以及结果是什么。坏的消息会向另一个会话请求许可,或者询问发送方必须依赖其答案才能继续的问题。Claude 已经收到指示:如果另一个会话请求执行的操作会被该会话自身的权限设置阻止,就绝不要提出此类请求,而应将这项工作转回给您。您还应自行扩展这条规则。如果某个会话没有答案就无法继续推进,应由您提供答案。保持上下文清晰也有帮助,因为丢失上下文的会话容易写出含义模糊的消息;在 Claude Code 中管理上下文介绍了这一方面。
将传入消息视为不可信输入
Claude Code 会告知接收消息的 Claude:该消息来自另一个会话,而不是您本人,并限制该消息可以执行的操作。消息不能代您回答待处理的权限提示,因为其他会话的同意不等于您的同意。其他会话不能仅因为发出请求就修改权限设置、CLAUDE.md 或其他配置。文本中的斜杠命令(例如 /compact)会以普通文本形式到达,绝不会执行。如果处理该消息需要接收会话没有的权限,您会看到与执行其他操作时相同的提示。在自动模式下,分类器还会在投递前检查每条消息;被拦截的消息不会到达接收方。这些限制在宽松模式下仍然有效。因此,绕过权限的会话默认会暂存传入消息,而不是直接信任它们。
以上说明的是权限,不是内容。发送会话可能读取了拉取请求描述、网页、依赖项 README 或陌生人撰写的问题评论,而它读取的内容可能影响它发送给您另一个会话的文本。消息本身就是数据。它应当与从外部进入会话的其他文本一样受到审慎对待。这就是避免让 AI 代理接触机密信息中所述的原则:假设任何跨越信任边界的内容都可能有误,绝不要让它自行授予权限。
如果您希望减少这类消息,可以使用以下两个控制项。将 crossSessionInbound 设置为 refuse 会丢弃传入的对等会话消息,而不投递这些消息;在项目或本地设置中,该值优先于所有其他来源,因为它在优先级梯度中最严格。要阻止此会话发送或列出消息,请添加拒绝规则,分别指定 SendMessage 和 ListAgents;两者都应写成不带限定符的工具名称。将 isolatePeerMachines 设置为 true 后,任何消息发送到本机以外的会话前,都必须获得您的明确批准;即使处于 bypassPermissions 模式,也同样需要批准。
{
"crossSessionInbound": "refuse",
"isolatePeerMachines": true
}拒绝 SendMessage 也会禁止向子代理发送消息,因为两者使用同一个工具。拒绝消息的会话不会在自身的 /status 或其他会话的列表中显示任何可见变化。因此,应从会话配置中确认该设置,而不要根据屏幕显示判断。
桥接与共享内存 MCP 服务器
同一时期还有几个第三方项目发布,它们提供相近但不同的能力:在运行中的代理之间转发文本的本地代理间桥接,以及让多个代理共享读写存储的 MCP(模型上下文协议)服务器。应将它们视为不同形态的方案,而不是竞争产品。执行任何安装命令前,先对照项目自己的 README 进行确认。消息传递是推送,因为发送方会将文本放入接收方当前的处理轮次。共享存储是拉取,因为它不会中断任何会话,会话下次查看时才能看到该备注。对于变化缓慢的状态,拉取方式更平稳;但只有会话实际查看时,这种方式才有效。
如果选择这条路线,值得关注的问题应围绕运行过程,而不是功能列表。服务器以哪个用户身份运行?它可以读取服务器上的哪些内容?在 VPS 上运行 MCP 服务器介绍了相关配置。在多个代码仓库之间共享代理技能介绍了更简单的情况:如果您希望在会话之间共享的是指令,而不是实时状态,那么这种方式可以减少许多原本需要发送的消息。要了解更广泛的内容,请从在 VPS 上运行代码代理开始。
FAQ
为什么我的会话无法识别 /list-agents?
该会话不支持跨会话消息传递。首先检查 claude --version 是否为 2.1.224 或更高版本,因为此功能需要该版本或更高版本。然后检查平台,因为该功能仅在 macOS 和 Linux 上运行,不支持原生 Windows;Amazon Bedrock、AWS 上的 Claude Platform、Google Cloud's Agent Platform 和 Microsoft Foundry 也不提供此功能。如果这两项都没有问题,请检查 shell 中是否设置了 DO_NOT_TRACK、DISABLE_TELEMETRY、CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC 或 DISABLE_GROWTHBOOK,因为这些设置都会阻止功能所依赖的功能标志评估,使功能保持关闭状态。
为什么我发送到另一个会话的消息一直没有送达?
如果 /list-agents 正常工作,说明消息传递已启用,问题出在更具体的环节。最常见的原因是权限模式。绕过权限提示的会话会将所有传入消息暂存,等待您批准,除非发送方也绕过权限提示。该批准对话框会在 dialogExpiry 期限后丢弃,默认期限为 5 分钟。请检查发送方会话是否显示暂存通知。要解决此问题,请在 ~/.claude/settings.json 中将 crossSessionInbound 设置为 accept,或通过 --settings 传入该设置,因为项目设置或本地设置中的 accept 属于更宽松的值,会被忽略。
Docker 中的 Claude Code 会话可以向主机上的会话发送消息吗?
不能。会话通过磁盘上的注册文件和每个会话的 inbox socket 互相发现,而容器拥有独立的文件系统,因此两者无法访问同一组文件。同一容器中的两个会话可以正常互发消息。相同规则也解释了为什么以 root 运行的会话无法连接到以普通用户身份运行的会话:该 socket 仅限其所属的操作系统用户访问。
来自其他 Claude Code 会话的消息可以安全执行吗?
应将消息文本视为不受信任的输入,因为发送方会话可能读取过网页、README 或他人撰写的问题评论。Claude Code 已阻止消息自行执行操作:它无法批准待处理的权限提示,无法根据请求更改权限设置或 CLAUDE.md,消息中的斜杠命令会作为纯文本传入,绝不会执行。这些保护措施涵盖权限,不涵盖判断。因此,在指示接收方会话采取行动前,请先阅读收到的内容。
跨会话消息传递会将我的代码发送给 Anthropic 吗?
如果两个会话位于同一台机器上,不会。消息通过该机器上的每个会话专用 socket 传输,不会经过 Anthropic 服务器;发送的只有 Claude 编写的文本,不会发送对话历史或文件。发送到您另一台机器上的会话,或发送到 Web 上的会话时,消息会通过 Remote Control 连接经由 Anthropic 服务器传输;在这种方向上,Claude 只能回复已收到的消息,不能主动发送消息。将 isolatePeerMachines 设置为 true,以要求您批准任何离开本机的内容。