信息传递工具

Relay是一款在Claude Desktop和Claude Code之间传递信息的工具,支持文件、代码、数据等的无缝传输,保持两个应用程序的上下文独立。

  • by mhcoen
  • Python
  • 本地部署
  • 4 星标
  • 更新于
在 GitHub 查看 mhcoen/mcp-relay

使用说明

中继

一个非常简单的工具,可以在Claude Desktop和Claude code之间移动信息(文件、代码、数据、注释、方向等),同时保持它们的主上下文窗口独立。

两个Claudes都可以自主发送消息——当它们需要来自另一方的输入时,它们就会这样做。当有东西到达时,你会收到系统通知。你准备好了就去拿。

为什么? 桌面和代码有不同的优势。桌面更适合对话——计划、头脑风暴、复习、迭代散文。代码更适合执行——编辑文件、运行命令、处理错误。但他们没有分享背景。如果你在Desktop中起草了一些东西,并希望代码来实现它,或者你想让Desktop对你正在编写的代码发表意见,你就是在应用程序之间复制粘贴。

Relay连接它们,无需您手动指定问题并在窗口之间剪切和粘贴。这是Anthropic应该集成的基本功能。

你在控制。 获取通常是一个用户操作——您键入 get 或 /get。模型可以在决定需要来自另一端的输入时发送或获取,但没有自动后台同步。没有失控的LLM内部对话烧毁你的代币。

快速示例

[In Desktop]
You:     Send my last error message to Code.
Desktop: [sends via relay]

[notification pops up in Code's terminal]

[In Code]
You:     /get
Code:    Got it. That's from line 47 in parser.py—the regex isn't matching.
         [fixes the bug]

扩展示例

[In Code]
You:     My classifier's stuck at 72% accuracy. Send the
         training config and last epoch's metrics to Desktop.
Code:    [sends config.yaml and metrics via relay]

[System notification appears that a message has been sent to Desktop]

[In Desktop]
You:     /get
Desktop: [fetches config and metrics]
         The loss curve suggests you're underfitting. Learning
         rate 1e-5 is conservative for a model this size...

You:     What would you try?
Desktop: Bump to 3e-5, add warmup steps, and your batch size
         of 8 is small—if memory allows, try 16. Also the
         class imbalance is brutal: 80/15/5 split. Consider
         weighted loss or oversampling the minority classes.

You:     Specify the changes.
Desktop: [sends updated config via relay]

[System notification appears that a message has been sent to Code]

[In Code]
You:     /get
Code:    Got it. Updating config.yaml and adding class weights
         to the loss function.
         [edits files, starts training run]

         Epoch 12: accuracy up to 79%, but precision on
         class 2 dropped. Want Desktop's take?

You:     Yeah, send the confusion matrix.
Code:    [sends via relay]

[In Desktop]
You:     /get
Desktop: Class 2 is getting confused with class 0—they may be
         semantically close. I need more examples.
         [automatically sends request to Code via relay]

用法

类型 get 在桌面或 /get 在Code中检查来自另一端的消息。这是主要的互动。

命令变体:

  • /get --从桌面获取并执行消息
  • /get status --显示消息计数和上次活动
  • /get clear --清除缓冲区中的所有消息
  • /get <message> --向桌面发送消息

资源访问: 您还可以直接参考消息 @relay:messages://latest这比 /get 并以计划模式工作。

启动预览: 当代码启动时,您将看到来自桌面的任何待处理消息的预览。使用 /get 完整地阅读它们。

发送既简单又隐含。当你说“询问桌面是否正确”或“将README发送到代码”时,模型会识别出意图并自动调用中继。

通知

当消息到达时,您将收到系统通知,以便您知道检查对方。无需手动轮询。

平台 方法 注意事项
macOS osascript 本地通知中心
Linux 通知发送 需要libnotify
Windows PowerShell吐司 本机吐司通知

声音: 添加 --sound 以启用通知声音。如果没有值,则使用平台默认值。使用值时,使用指定的声音:

平台 默认 自定义示例
macOS blow --sound tink
Linux freedesktop消息声音 --sound /path/to/sound.oga
Windows 系统默认值 --sound ms-winsoundevent:Notification.IM

持续时间和显示行为由您的操作系统设置控制。

设计理念

运输,而不是记忆。 中继是一种信息总线。它不会对消息进行总结、压缩、重写或解释。没有共享的隐藏上下文、合并的系统提示或跨代理规划。消息传递不变。这使关注点清晰地分开,避免了认知腐败。

主要由用户控制。 获取消息通常是一个明确的用户操作(get 或 /get),而不是后台进程。这可以防止失控的上下文增长和反馈循环。然而,当模型决定需要来自另一端的输入时,它们可能会自主发送或获取——系统允许这样做,而不鼓励这样做。

独立接口。 桌面和代码本身仍然完全可用。您可以在没有代码的情况下在桌面上进行长时间的对话,也可以在没有桌面的情况下花几个小时在代码中进行调试。继电器会在你需要的时候连接它们;它不会把他们结合在一起。这也意味着没有API成本——两个接口都使用您现有的订阅。

最小表面积。 继电器做三件事:发送、获取、清除。它不试图提供编排、仲裁、共识或自主行为。这种克制是有意的。大多数多智能体设计因模糊了应该保持清晰的边界而失败。

规模自然。 多个代码会话连接到同一个桌面——您可以将消息定向到相应的对话。其他使用MCP的对等体、替代存储后端、每个项目的缓冲区和只读观察器都从这种设计中干净地扩展出来。

这定义了一类独特的基础设施:一种由人类介导的、显式同步的多代理消息总线。

设计说明

接力是全球性的。 缓冲区位于 ~/.relay_buffer.db 在所有项目中共享。Desktop不知道您正在处理哪个项目,因此按项目隔离是不切实际的。这是有意的:一个用户,一台机器,一个继电器。

如果你在Code中切换项目,继电器也会随之而来。以前项目的旧消息可能仍然存在;使用 /get clear 如果你想重新开始。

大文件速度慢。 对于长度为一两页的消息,中继速度很快。对于大文件,将它们直接拖动到所需的界面会更快。您仍然可以通过中继发送附带的上下文。

设置

什么是uvx? uvx 直接运行Python包,无需全局安装。它自动处理依赖关系。如果你没有: curl -LsSf https://astral.sh/uv/install.sh | sh (参见 星光sh/uv 了解更多信息。)

1.配置克劳德桌面

添加到您的Claude Desktop配置中:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Linux: ~/.config/Claude/claude_desktop_config.json
  • 窗户: %APPDATA%\Claude\claude_desktop_config.json
{
  "mcpServers": {
    "relay": {
      "command": "uvx",
      "args": ["mcp-server-relay", "--client", "desktop", "--sound"]
    }
  }
}

重新启动Claude Desktop,然后告诉它记住以下说明:

记住:当用户单独说“get”或“/get”时,使用relay_fetch从中继中获取最近的消息。

你可以通过说“显示我的记忆编辑”来验证它是否被记录下来

2.配置克劳德代码

添加到 .mcp.json 在项目根目录中:

{
  "mcpServers": {
    "relay": {
      "command": "uvx",
      "args": ["mcp-server-relay", "--client", "code"]
    }
  }
}

注意:只需要桌面 --sound 因为它处理双方的通知。

3.安装 /get 命令和启动挂钩

uvx mcp-server-relay --setup-code

这将安装 /get slash命令和一个SessionStart钩子,当Code启动时显示挂起的消息。

替代方案:从GitHub安装

如果您不想使用uvx,请克隆存储库并直接运行:

git clone https://github.com/mhcoen/mcp-relay.git
cd mcp-relay
python -m venv .venv
.venv/bin/pip install -e .

然后在配置中使用完整路径:

克劳德桌面版 (claude_desktop_config.json):

{
  "mcpServers": {
    "relay": {
      "command": "/path/to/mcp-relay/.venv/bin/python",
      "args": ["/path/to/mcp-relay/relay_server.py", "--client", "desktop", "--sound"]
    }
  }
}

克劳德代码 (.mcp.json):

{
  "mcpServers": {
    "relay": {
      "command": "/path/to/mcp-relay/.venv/bin/python",
      "args": ["/path/to/mcp-relay/relay_server.py", "--client", "code"]
    }
  }
}

替换 /path/to/mcp-relay 使用您的实际克隆位置。

工具

工具 说明
relay_send(message, sender) 发送消息(发件人:“桌面”或“代码”)
relay_fetch(limit, reader, unread_only) 获取最近的消息,可选择标记为已读
relay_clear() 从缓冲区中删除所有消息

技术细节

  • 缓冲区:SQLite位于 ~/.relay_buffer.db
  • 滚动窗口:最多20条消息(最旧的先被驱逐)
  • 消息限制:每条消息8KB
  • 空闲超时:1小时(服务器在非活动时自动退出)
  • 传输:标准MCP
  • Python:3.9+

作者

迈克尔 科恩mhcoen@alum.mit.edu ·mhcoen@gmail.com