内容
# dawMCP
[](https://github.com/vecnode/dawmcp/actions/workflows/ci.yml)
[](Cargo.toml)
[](LICENSE)
一款适用于数字音频工作站(DAW)的综合MCP。
它通过DAW无关的工具表面连接Claude到正在运行的DAW实例 - 控制传输,轨道,FX和渲染 - 在其后面有一个DAW特定的适配器。
## 架构
```
Claude <--stdio--> dawMCP (Rust, rmcp, --daw=reaper|audacity) --> DawBackend trait --> 适配器
|
dawMCP-reaper (文件IPC --> reaper_bridge.lua --> reaper.* API)
dawMCP-audacity (mod-script-pipe命名管道/FIFOs --> Audacity)
```
`dawMCP-core`定义了DAW无关的特征(`Transport`,`Tracks`,`Fx`,`Render`,`Project`,`Status`),因此相同的MCP工具适用于任何实现它们的DAW。DAW特定的概念不能概括(REAPER的`run_reascript`逃生阀,Audacity缺乏持久的FX链)只存在于该适配器中,而不是在共享的核心中。`dawMCP-server`通过`--daw=reaper`(默认)或`--daw=audacity`选择要服务的适配器; `.mcp.json`同时注册两者为单独的MCP服务器条目,以便Claude可以一次连接一个或两个。
REAPER适配器(`crates/dawMCP-reaper`)与REAPER通信的方式与原始的Python实现相同:服务器为每个调用写入一个JSON请求文件到桥接目录,`lua/reaper_bridge.lua`在下一个`reaper.defer()`滴答(REAPER的UI帧率,~16-33ms往返)时获取它并写回一个JSON响应 - 无需REAPER扩展。请参阅[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)以获取完整的设计文档以及为什么这是文件IPC而不是套接字。
Audacity适配器(`crates/dawMCP-audacity`)与Audacity的内置`mod-script-pipe`模块(Windows上的命名管道,Linux/Mac上的FIFOs)通信 - 它发送的每个命令都针对Audacity自己的源代码进行验证,而不是假设。Audacity必须手动启用mod-script-pipe(编辑>首选项>模块>将`mod-script-pipe`设置为“启用”,然后重启Audacity)。dawMCP不会为您启用它,因为这是一个安全相关的设置,Audacity自己的文档警告说(任何程序都可以控制Audacity而无需通知)。
## 状态
Rust工作区具有与原始Python实现完全相同的REAPER工具功能,已针对实际运行的REAPER实例进行验证(已删除Python包; `git log`具有其历史记录)。Audacity适配器涵盖了传输(播放/停止/暂停/录制),轨道添加/删除/重命名/列表,每个轨道的音量/声像/静音/独奏和渲染/导出 - 也已针对此机器上的实际Audacity安装的进程/路径发现进行验证。暂时不支持Audacity(设计如此,而不是遗漏 - 请参阅[AGENTS.md](AGENTS.md)了解原因):搜索/节拍/传输状态查询,FX和每个轨道的颜色。
## 要求
- [Rust](https://rustup.rs/)(稳定工具链,通过`rustup`)
- REAPER(已在6.x/7.x上测试)用于REAPER适配器,和/或Audacity(3.x)用于Audacity适配器 - 可以使用其中一个或两个。REAPER不需要扩展。Audacity需要`mod-script-pipe`手动启用一次:编辑>首选项>模块>将`mod-script-pipe`设置为“启用”,然后重启Audacity。
## 设置
1. 运行 [build.bat](build.bat)(双击它,或自己运行`cargo build --release`),它会构建`dawMCP`并为每个检测到的REAPER安装程序安装REAPER的桥接器。
2. 将Claude Code(或Claude Desktop)指向它 - 此存储库中的`.mcp.json`已经注册了两者:
```json
{
"mcpServers": {
"reaper": {
"command": "<path-to-this-repo>/target/release/dawMCP"
},
"audacity": {
"command": "<path-to-this-repo>/target/release/dawMCP",
"args": ["--daw=audacity"]
}
}
}
```
对于REAPER:每次启动时,`dawMCP`会自动检测并安装`lua/reaper_bridge.lua`(以及默认项目和启动钩子,见下文)到它找到的每个REAPER安装中,这是幂等的,不需要单独的设置脚本或手动操作列表步骤。传递`--no-install`以跳过此操作并直接服务。
3. 如果REAPER在`dawMCP`首次安装启动钩子时**已经打开**,它不会追溯启动桥接器本次会话 - 完全退出并重新打开REAPER,或手动加载它一次:**操作 -> 显示操作列表 -> 新操作 -> 加载ReaScript...**,选择`reaper_bridge.lua`,然后**运行**。您应该看到小状态窗口出现(参见下面的“状态窗口”)。
有用的独立命令(不需要MCP客户端):
```
dawMCP --status # 诊断每个检测到的DAW:安装程序是否找到?是否可达?
dawMCP --install-bridge # 为每个检测到的REAPER安装程序安装/更新REAPER桥接器,然后退出
dawMCP --daw=audacity # 服务Audacity的工具而不是REAPER的
```
如果REAPER工具调用出错并显示“桥接器心跳未找到或已过期”,则桥接器脚本当前未在REAPER中运行(REAPER已关闭,脚本已停止或崩溃) - 通过操作列表重新加载/重新运行它。如果Audacity工具调用出错并显示“无法打开Audacity的mod-script-pipe”,则Audacity未运行或`mod-script-pipe`未启用(参见上面的要求)。调用`daw_status`工具进行诊断。
## 默认项目
[reaper_project/default.RPP](reaper_project/default.RPP)是一个空白的,无轨道的项目,存储在此存储库中(由REAPER本身生成,而不是手动编写,因此其文件格式保证有效)。`dawMCP`将其复制到REAPER的资源路径中作为`reaper-mcp-default.RPP`,并在安装桥接器的`__startup.lua`块中添加`reaper.Main_openProject(...)`调用,以便REAPER在每次启动时自动打开此干净的项目,而不是它通常会默认打开的项目。
## 状态窗口
一旦桥接器运行,一个小状态窗口就会出现在REAPER中,**默认停靠**(非浮动)。它显示:
- **“状态:开启”** - 桥接器没有开启/关闭开关; 一旦加载,它将在REAPER开启时运行,独立于此窗口是否开启
- 绿色 **“活动”** 如果在最后约3秒内处理了请求,灰色 **“空闲”** 否则,以及正在运行的请求计数
- 可用工具域的快速参考列表
## 工具概述
DAW无关工具(`dawMCP-core`的`DawBackend`特征),由活动的适配器支持(`--daw=reaper`,默认,或`--daw=audacity`):
| 域 | 工具 | Audacity支持 |
|---|---|---|
| 状态 | `daw_status` | 是 |
| 传输 | `transport_play/stop/pause/record/seek/set_tempo/get_state` | 仅播放/停止/暂停/录制 - 无验证的搜索,节奏或状态查询 |
| 轨道 | `track_add/remove/rename/set_volume_db/set_pan/set_mute/set_solo/set_color/list` - `-1`作为`track_index`表示主母线在REAPER上,在任何接受轨道工具的轨道上 | 除`set_color`外均支持(Audacity的颜色是一个小的预设枚举,而不是RGB) |
| FX | `fx_add/remove/set_enabled/list/set_param/get_param` | 不支持 - Audacity没有像REAPER一样的持久性每轨道FX链 |
| 渲染 | `render_project(output_path, start_seconds, end_seconds, overwrite)` | 是,通过`Export2` |
| 项目 | `project_save`,`project_undo` | 是(`Save`/`Undo` - 请参阅[AGENTS.md](AGENTS.md)中有关从未保存的项目的未验证边缘情况) |
仅REAPER工具(无跨DAW等效工具,通过`dawMCP-reaper`的固有方法公开,而不是共享特征):
| 域 | 工具 |
|---|---|
| MIDI | `midi_add_item`,`midi_add_note` |
| 项目 | `item_split/move/glue_selected/render_in_place_selected` |
| 标记 | `marker_add`,`region_add` |
| 视图 | `view_zoom_to_selection`,`view_scroll_to`,`view_set_arrange_zoom` |
| 操作 | `action_run(command_id)`,`action_get_toggle_state(command_id)` |
| 编写 | `compose_and_render(output_path, notes, track_name)` - 一个调用:新轨道 + MIDI音符 + 渲染为音频 |
| 逃生阀 | `run_reascript(code)` - 任意ReaScript Lua |
这些仅REAPER工具如果调用`--daw=audacity`而不是静默无操作,则会返回明确的错误。
## 开发
```
cargo build
cargo test --workspace
```
## 许可证
在 [MIT License](LICENSE) 下许可。