README
🚀 Relay
Relay 是一款极其简单的工具,它能在 Claude Desktop 和 Claude Code 之间传递信息,包括文件、代码、数据、注释、说明等,同时保持它们的主上下文窗口相互独立。
Claude Desktop 和 Claude Code 都能自主发送消息,当一方需要另一方的输入时,会自动发送。当有消息到达时,你会收到系统通知,待准备好后即可获取。
为何需要它? Desktop 和 Code 各有优势。Desktop 更适合进行对话,如规划、头脑风暴、审核和完善文本;Code 则更擅长执行任务,如编辑文件、运行命令和处理错误。但它们之间无法共享上下文。如果你在 Desktop 中起草了内容,想让 Code 来实现,或者想听取 Desktop 对正在编写的代码的意见,就不得不手动在两个应用程序之间复制粘贴。
Relay 能在无需你手动指定问题和在窗口间复制粘贴的情况下,将它们连接起来。这本应是 Anthropic 集成的基本功能。
你能完全掌控:获取消息通常是用户的主动操作,你可以输入 get 或 /get。模型在需要另一方的输入时可以自主发送或获取消息,但不会进行自动的后台同步,避免出现无节制的大语言模型间对话消耗你的令牌。
🚀 快速开始
以下是一个快速示例,展示了如何使用 Relay 在 Claude Desktop 和 Claude Code 之间传递信息:
[在 Desktop 中]
你: 将我上一条错误消息发送到 Code。
Desktop: [通过中继发送]
[Code 的终端中弹出通知]
[在 Code 中]
你: /get
Code: 已获取。错误来自 parser.py 文件的第 47 行,正则表达式不匹配。
[修复了该错误]
✨ 主要特性
- 信息传递:能在 Claude Desktop 和 Claude Code 之间轻松传递各类信息,如文件、代码、数据等。
- 自主消息发送:两个 Claude 工具都能自主发送消息,当需要另一方输入时自动执行。
- 系统通知:有新消息到达时,会及时推送系统通知,方便用户及时获取消息。
- 用户掌控:获取消息主要由用户手动操作,避免自动同步带来的问题。
- 独立使用:Desktop 和 Code 仍可独立使用,Relay 仅在需要时进行连接。
📦 安装指南
前提条件
什么是 uvx? uvx 可以直接运行 Python 包,而无需全局安装。它会自动处理依赖项。如果你还没有安装 uvx,可以运行以下命令进行安装:
curl -LsSf https://astral.sh/uv/install.sh | sh
更多信息请参考 astral.sh/uv。
配置步骤
1. 配置 Claude Desktop
在你的 Claude Desktop 配置文件中添加以下内容:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Linux:
~/.config/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"relay": {
"command": "uvx",
"args": ["mcp-server-relay", "--client", "desktop", "--sound"]
}
}
}
重启 Claude Desktop,然后让它记住以下指令:
记住:当用户单独输入 "get" 或 "/get" 时,使用 relay_fetch 从中继获取最近的消息。
你可以通过输入 "Show me my memory edits." 来验证该指令是否已被记录。
2. 配置 Claude Code
在项目根目录的 .mcp.json 文件中添加以下内容:
{
"mcpServers": {
"relay": {
"command": "uvx",
"args": ["mcp-server-relay", "--client", "code"]
}
}
}
注意:只有 Desktop 需要 --sound 参数,因为它负责处理双方的通知。
3. 安装 /get 斜杠命令(可选)
uvx mcp-server-relay --setup-code
此命令会将斜杠命令复制到 ~/.claude/commands/ 目录。
从 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 (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"]
}
}
}
Claude Code (.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 替换为你实际克隆的仓库路径。
💻 使用示例
基础用法
[在 Code 中]
你: 我的分类器准确率一直停留在 72%。将训练配置和上一轮的指标发送到 Desktop。
Code: [通过中继发送 config.yaml 和指标]
[系统通知显示消息已发送到 Desktop]
[在 Desktop 中]
你: /get
Desktop: [获取配置和指标]
损失曲线表明你可能存在欠拟合问题。对于这个规模的模型,学习率 1e-5 过于保守...
你: 你会尝试什么方法?
Desktop: 将学习率提高到 3e-5,增加预热步骤,并且你的批量大小为 8,有点小。如果内存允许,尝试使用 16。此外,类别不平衡问题很严重,比例为 80/15/5。考虑使用加权损失或对少数类别进行过采样。
你: 指定具体更改。
Desktop: [通过中继发送更新后的配置]
[系统通知显示消息已发送到 Code]
[在 Code 中]
你: /get
Code: 已获取。正在更新 config.yaml 并在损失函数中添加类别权重。
[编辑文件,开始训练]
第 12 轮:准确率提高到 79%,但类别 2 的精度下降了。想听听 Desktop 的看法吗?
你: 是的,发送混淆矩阵。
Code: [通过中继发送]
[在 Desktop 中]
你: /get
Desktop: 类别 2 与类别 0 容易混淆,它们在语义上可能很接近。我需要更多示例。
[通过中继自动向 Code 发送请求]
高级用法
- 命令变体:
/get— 从 Desktop 获取并执行消息/get status— 显示消息数量和最后活动时间/get clear— 清除缓冲区中的所有消息/get <message>— 向 Desktop 发送消息
- 资源访问:你还可以使用
@relay:messages://latest直接引用消息。这比/get更快,并且在计划模式下也能使用。 - 启动预览:当 Code 启动时,你会看到来自 Desktop 的任何待处理消息的预览。使用
/get可以完整读取这些消息。
发送消息非常简单且隐式。当你说 "Ask Desktop if this looks right" 或 "Send the README to Code" 时,模型会识别意图并自动调用中继。
📚 详细文档
通知设置
当有消息到达时,你会收到系统通知,无需手动轮询。不同平台的通知方法如下: | 平台 | 方法 | 注意事项 | |------|------|----------| | macOS | osascript | 使用原生通知中心 | | Linux | notify-send | 需要安装 libnotify | | Windows | PowerShell toast | 使用原生 Toast 通知 |
声音设置:添加 --sound 参数可启用通知声音。如果不指定值,则使用平台默认声音;如果指定值,则使用指定的声音:
| 平台 | 默认声音 | 自定义示例 |
|------|---------|----------------|
| macOS | blow | --sound tink |
| Linux | freedesktop 消息声音 | --sound /path/to/sound.oga |
| Windows | 系统默认声音 | --sound ms-winsoundevent:Notification.IM |
通知的持续时间和显示行为由你的操作系统设置控制。
工具说明
| 工具 | 描述 |
|------|-------------|
| relay_send(message, sender) | 发送消息(sender 可以是 "desktop" 或 "code") |
| relay_fetch(limit, reader, unread_only) | 获取最近的消息,可选择标记为已读 |
| relay_clear() | 删除缓冲区中的所有消息 |
🔧 技术细节
- 缓冲区:使用 SQLite 数据库,存储在
~/.relay_buffer.db。 - 滚动窗口:最多存储 20 条消息,旧消息先被移除。
- 消息限制:每条消息最大为 64 KB。
- 空闲超时:1 小时,服务器在无活动时会自动退出。
- 传输方式:使用标准输入输出(标准 MCP)。
- Python 版本:需要 Python 3.9 及以上版本。
📄 许可证
文档中未提及相关信息,故跳过该章节。
作者
Michael Coen — mhcoen@alum.mit.edu · mhcoen@gmail.com
微信扫一扫