record_safer_pro_mcp 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/README.md +205 -0
  2. package/dist/api-client.d.ts +159 -0
  3. package/dist/api-client.d.ts.map +1 -0
  4. package/dist/api-client.js +991 -0
  5. package/dist/api-client.js.map +1 -0
  6. package/dist/index.d.ts +3 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +4 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/prompts/index.d.ts +12 -0
  11. package/dist/prompts/index.d.ts.map +1 -0
  12. package/dist/prompts/index.js +235 -0
  13. package/dist/prompts/index.js.map +1 -0
  14. package/dist/resources/index.d.ts +7 -0
  15. package/dist/resources/index.d.ts.map +1 -0
  16. package/dist/resources/index.js +59 -0
  17. package/dist/resources/index.js.map +1 -0
  18. package/dist/resources/mixing-guide-content.d.ts +8 -0
  19. package/dist/resources/mixing-guide-content.d.ts.map +1 -0
  20. package/dist/resources/mixing-guide-content.js +194 -0
  21. package/dist/resources/mixing-guide-content.js.map +1 -0
  22. package/dist/runtime.d.ts +39 -0
  23. package/dist/runtime.d.ts.map +1 -0
  24. package/dist/runtime.js +320 -0
  25. package/dist/runtime.js.map +1 -0
  26. package/dist/telemetry-schema.d.ts +39 -0
  27. package/dist/telemetry-schema.d.ts.map +1 -0
  28. package/dist/telemetry-schema.js +15 -0
  29. package/dist/telemetry-schema.js.map +1 -0
  30. package/dist/tools/core.d.ts +4 -0
  31. package/dist/tools/core.d.ts.map +1 -0
  32. package/dist/tools/core.js +360 -0
  33. package/dist/tools/core.js.map +1 -0
  34. package/dist/tools/devices.d.ts +10 -0
  35. package/dist/tools/devices.d.ts.map +1 -0
  36. package/dist/tools/devices.js +53 -0
  37. package/dist/tools/devices.js.map +1 -0
  38. package/dist/tools/levels.d.ts +11 -0
  39. package/dist/tools/levels.d.ts.map +1 -0
  40. package/dist/tools/levels.js +25 -0
  41. package/dist/tools/levels.js.map +1 -0
  42. package/dist/tools/markers.d.ts +17 -0
  43. package/dist/tools/markers.d.ts.map +1 -0
  44. package/dist/tools/markers.js +142 -0
  45. package/dist/tools/markers.js.map +1 -0
  46. package/dist/tools/monitor.d.ts +19 -0
  47. package/dist/tools/monitor.d.ts.map +1 -0
  48. package/dist/tools/monitor.js +232 -0
  49. package/dist/tools/monitor.js.map +1 -0
  50. package/dist/tools/recording.d.ts +12 -0
  51. package/dist/tools/recording.d.ts.map +1 -0
  52. package/dist/tools/recording.js +85 -0
  53. package/dist/tools/recording.js.map +1 -0
  54. package/dist/tools/settings.d.ts +10 -0
  55. package/dist/tools/settings.d.ts.map +1 -0
  56. package/dist/tools/settings.js +43 -0
  57. package/dist/tools/settings.js.map +1 -0
  58. package/dist/tools/storage.d.ts +10 -0
  59. package/dist/tools/storage.d.ts.map +1 -0
  60. package/dist/tools/storage.js +20 -0
  61. package/dist/tools/storage.js.map +1 -0
  62. package/dist/tools/system.d.ts +10 -0
  63. package/dist/tools/system.d.ts.map +1 -0
  64. package/dist/tools/system.js +53 -0
  65. package/dist/tools/system.js.map +1 -0
  66. package/dist/tools/tool-metadata.d.ts +19 -0
  67. package/dist/tools/tool-metadata.d.ts.map +1 -0
  68. package/dist/tools/tool-metadata.js +25 -0
  69. package/dist/tools/tool-metadata.js.map +1 -0
  70. package/dist/types.d.ts +456 -0
  71. package/dist/types.d.ts.map +1 -0
  72. package/dist/types.js +4 -0
  73. package/dist/types.js.map +1 -0
  74. package/dist/utils.d.ts +80 -0
  75. package/dist/utils.d.ts.map +1 -0
  76. package/dist/utils.js +336 -0
  77. package/dist/utils.js.map +1 -0
  78. package/package.json +40 -0
package/README.md ADDED
@@ -0,0 +1,205 @@
1
+ # Record Safer Pro MCP Server
2
+
3
+ [Record Safer Pro](https://www.dadaoaudio.com) 的 AI 接口服务,基于 [Model Context Protocol (MCP)](https://modelcontextprotocol.io) 标准。让 Claude、Kiro、Cursor 等 AI 助手直接控制你的专业多通道录音软件。
4
+
5
+ 由 **DADAO 大道声学(北京大道创响科技有限公司)** 开发。
6
+
7
+ ---
8
+
9
+ ## 安装步骤
10
+
11
+ ### 1. 安装 Node.js
12
+
13
+ 如果你的电脑还没有 Node.js,先去 [nodejs.org](https://nodejs.org) 下载安装(选 LTS 版本即可,需要 >= 18)。
14
+
15
+ 安装完成后打开终端验证:
16
+
17
+ ```bash
18
+ node -v
19
+ npx -v
20
+ ```
21
+
22
+ 两个命令都能输出版本号就说明安装成功。
23
+
24
+ ### 2. 在 AI 客户端中添加配置
25
+
26
+ 根据你使用的 AI 客户端,将以下配置添加到对应的配置文件中:
27
+
28
+ 以下配置默认使用 `stdio` 本地传输,也是 Claude Desktop / Cursor / Kiro 最常见的 MCP 接入方式。
29
+
30
+ #### Claude Desktop
31
+
32
+ 编辑 `~/Library/Application Support/Claude/claude_desktop_config.json`(macOS):
33
+
34
+ ```json
35
+ {
36
+ "mcpServers": {
37
+ "record-safer-pro": {
38
+ "command": "npx",
39
+ "args": ["-y", "record_safer_pro_mcp"]
40
+ }
41
+ }
42
+ }
43
+ ```
44
+
45
+ #### Kiro
46
+
47
+ 编辑项目目录下的 `.kiro/settings/mcp.json`:
48
+
49
+ ```json
50
+ {
51
+ "mcpServers": {
52
+ "record-safer-pro": {
53
+ "command": "npx",
54
+ "args": ["-y", "record_safer_pro_mcp"]
55
+ }
56
+ }
57
+ }
58
+ ```
59
+
60
+ #### Cursor
61
+
62
+ 在 Settings → MCP 中添加,或编辑 `.cursor/mcp.json`:
63
+
64
+ ```json
65
+ {
66
+ "mcpServers": {
67
+ "record-safer-pro": {
68
+ "command": "npx",
69
+ "args": ["-y", "record_safer_pro_mcp"]
70
+ }
71
+ }
72
+ }
73
+ ```
74
+
75
+ ### 3. 启动 Record Safer Pro
76
+
77
+ 确保 Record Safer Pro 桌面应用正在运行,然后重启你的 AI 客户端即可。
78
+
79
+ MCP Server 会自动发现后端连接地址,无需手动配置端口。每次启动时会自动获取最新版本,无需手动更新。
80
+
81
+ ---
82
+
83
+ ## 功能一览
84
+
85
+ 安装后,AI 助手可以帮你完成以下操作:
86
+
87
+ | 类别 | 能力 |
88
+ |------|------|
89
+ | 🧰 录音前准备 | 解析参数后进入录音控制台预备录音 |
90
+ | 🎙️ 设备发现 | 列出当前可用音频输入设备 |
91
+ | 📋 录音状态 | 获取通道、混音、健康状态、最小录音状态 |
92
+ | 🏷️ 录音中操作 | 添加标记、查看轨道、查看标记、重命名通道 |
93
+ | ⏹️ 收尾控制 | 停止录音 |
94
+
95
+ 当前 MCP Server 已做瘦身,只保留高频核心工具,共 11 个:
96
+
97
+ - `list_audio_devices`
98
+ - `start_record_mcp`
99
+ - `get_channels`
100
+ - `get_mix`
101
+ - `get_health`
102
+ - `get_status`
103
+ - `stop_recording`
104
+ - `list_tracks`
105
+ - `list_markers`
106
+ - `add_marker`
107
+ - `rename_channel`
108
+
109
+ 以下能力目前不再通过 MCP 暴露,必须在 GUI 中手动完成:
110
+
111
+ - 开始录音
112
+ - 监听混音调节
113
+ - 系统设置、更新、激活、存储管理、文件分割等扩展功能
114
+
115
+ `start_record_mcp` 的职责是“准备录音控制台”,不是“开始录音”。
116
+ 调用前 AI 必须先把参数一次性整理给你确认:
117
+
118
+ - 必填:`deviceId`、`audioFormat`、`channels`
119
+ - 可选:`sampleRate`、`bitDepth`、`outputPath`、`sessionName`、`bufferSize`
120
+ - 默认值:`48kHz`、`24-bit`、`~/Desktop`
121
+
122
+ 如果你没有提供可选参数,AI 会先告知默认值,再要求你按回车或回复“确认”后,才会真正调用 `start_record_mcp`。
123
+
124
+ ## Streamable HTTP 远程模式
125
+
126
+ 为了兼容 OpenAI Developer Mode / remote MCP 场景,服务端现在也支持可选的 `Streamable HTTP` 传输。
127
+
128
+ 默认环境变量:
129
+
130
+ - `RECORD_SAFER_MCP_TRANSPORT=stdio`
131
+ - `RECORD_SAFER_MCP_HTTP_HOST=127.0.0.1`
132
+ - `RECORD_SAFER_MCP_HTTP_PORT=3010`
133
+ - `RECORD_SAFER_MCP_HTTP_PATH=/mcp`
134
+
135
+ 如果你要切到远程模式:
136
+
137
+ ```bash
138
+ RECORD_SAFER_MCP_TRANSPORT=streamable-http \
139
+ RECORD_SAFER_MCP_HTTP_HOST=127.0.0.1 \
140
+ RECORD_SAFER_MCP_HTTP_PORT=3010 \
141
+ npx record_safer_pro_mcp
142
+ ```
143
+
144
+ 启动后默认端点是:
145
+
146
+ - MCP: `http://127.0.0.1:3010/mcp`
147
+ - Health: `http://127.0.0.1:3010/healthz`
148
+
149
+ 安全约束:
150
+
151
+ - 当 `RECORD_SAFER_MCP_HTTP_HOST` 是非回环地址(例如 `0.0.0.0`)时,必须同时设置 `RECORD_SAFER_MCP_HTTP_BEARER_TOKEN`
152
+ - 可选设置 `RECORD_SAFER_MCP_HTTP_ALLOWED_HOSTS=your-domain.com,localhost` 来限制允许的 Host 头
153
+ - 如果要给公网客户端或 OpenAI Developer Mode 远程接入使用,建议放在 HTTPS 反向代理之后,不要直接裸露 HTTP 端口
154
+
155
+ 带鉴权的示例:
156
+
157
+ ```bash
158
+ RECORD_SAFER_MCP_TRANSPORT=streamable-http \
159
+ RECORD_SAFER_MCP_HTTP_HOST=0.0.0.0 \
160
+ RECORD_SAFER_MCP_HTTP_PORT=3010 \
161
+ RECORD_SAFER_MCP_HTTP_BEARER_TOKEN=replace-with-a-long-random-token \
162
+ RECORD_SAFER_MCP_HTTP_ALLOWED_HOSTS=your-domain.com \
163
+ npx record_safer_pro_mcp
164
+ ```
165
+
166
+ ## 使用示例
167
+
168
+ 配置完成后,你可以直接用自然语言让 AI 操作 Record Safer Pro:
169
+
170
+ - "用 RME Babyface,通道 1-4,WAV,默认 48k/24bit 和桌面路径,帮我进入录音控制台预备录音"
171
+ - "帮我列出当前所有音频输入设备"
172
+ - "现在有哪些通道?"
173
+ - "帮我看一下当前录音健康状态"
174
+ - "在当前位置添加一个标记,命名为'第二段'"
175
+ - "把 3 号通道改名为 Vocal"
176
+ - "列出当前所有标记"
177
+ - "停止录音"
178
+
179
+ ## 常见问题
180
+
181
+ **Q: AI 提示无法连接 Record Safer Pro?**
182
+ 确保 Record Safer Pro 桌面应用已启动。MCP Server 需要后端 HTTP 服务才能工作。
183
+
184
+ **Q: 提示找不到 npx 命令?**
185
+ 需要安装 Node.js >= 18。访问 https://nodejs.org 下载安装。
186
+
187
+ **Q: 端口不是 8080 怎么办?**
188
+ 正常情况下不需要手动处理,应用会自动写入端口文件。如果确实需要手动指定,设置环境变量:
189
+ ```json
190
+ {
191
+ "mcpServers": {
192
+ "record-safer-pro": {
193
+ "command": "npx",
194
+ "args": ["-y", "record_safer_pro_mcp"],
195
+ "env": {
196
+ "RECORD_SAFER_URL": "http://127.0.0.1:你的端口号"
197
+ }
198
+ }
199
+ }
200
+ }
201
+ ```
202
+
203
+ ---
204
+
205
+ Copyright © DADAO 大道声学(北京大道创响科技有限公司)
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Record Safer API Client — 统一 HTTP 客户端适配层
3
+ * 封装与 Backend (record_safer_headless) 的所有 HTTP 通信
4
+ */
5
+ import type { DeviceInfo, OutputDeviceInfo, BufferSizeInfo, SignalInfo, LevelData, LevelQueryParams, LevelSubscriptionParams, SessionToolParams, SessionResult, StartRecordMcpParams, StartRecordMcpResult, RecordingOptions, RecordingStartResult, RecordingStopResult, StopRecordingParams, RecordingStatus, OutputPathInfo, AudioFormatInfo, AudioFormatConfig, Settings, MonitorStatus, MonitorStartParams, MixLevels, TrackInfo, MarkerInfo, MarkerResult, MarkerSyncEntry, VolumeInfo, DriveInfo, ValidationResult, DiskHealthCheckParams, SystemInfo, DiskSpaceInfo, DiskHealthResult, UpdateInfo, UpdateBadge, DownloadProgress, ActivationResult, ActivationStatus, ActivationData, RestoreResult, SplitParams, SplitResult, SplitProgress, TelemetryData, UIState, McpChannelsResponse, McpMixResponse, McpHealthResponse, McpStatusResponse } from "./types.js";
6
+ /** API Client 配置 */
7
+ export interface ApiClientConfig {
8
+ baseUrl: string;
9
+ authToken?: string;
10
+ }
11
+ export interface ClientRequestOptions {
12
+ allowAutoLaunch?: boolean;
13
+ }
14
+ /** Backend HTTP 错误,包含状态码和响应体 */
15
+ export declare class ApiError extends Error {
16
+ readonly statusCode: number;
17
+ readonly responseBody: string;
18
+ constructor(statusCode: number, responseBody: string);
19
+ }
20
+ export declare function normalizeDisplayPath(filePath: string): string;
21
+ /**
22
+ * 加载 Auth Token:优先环境变量,其次文件
23
+ * 1. RECORD_SAFER_TOKEN 环境变量
24
+ * 2. ~/.record_safer/auth_token 文件
25
+ */
26
+ export declare function loadAuthToken(): string | null;
27
+ /**
28
+ * 从端口文件读取后端端口号
29
+ * 返回有效端口号(1-65535)或 null
30
+ */
31
+ export declare function readPortFromFile(): number | null;
32
+ /**
33
+ * 按优先级链解析 baseUrl:
34
+ * 1. 端口文件 → http://127.0.0.1:{port}
35
+ * 2. RECORD_SAFER_URL 环境变量
36
+ * 3. 默认 http://127.0.0.1:8080
37
+ */
38
+ export declare function resolveBaseUrl(): string;
39
+ /** 后端连接预检结果 */
40
+ export interface BackendPreflightResult {
41
+ ok: boolean;
42
+ baseUrl: string;
43
+ hasToken: boolean;
44
+ hasPort: boolean;
45
+ error?: string;
46
+ }
47
+ /**
48
+ * 快速预检后端连接配置(不发起 HTTP 请求)
49
+ * 检查端口文件和 token 是否存在,返回诊断信息
50
+ */
51
+ export declare function preflightCheck(): BackendPreflightResult;
52
+ /** Record Safer Backend HTTP 客户端 */
53
+ export declare class RecordSaferClient {
54
+ private readonly explicitBaseUrl;
55
+ private authToken;
56
+ private authTokenSource;
57
+ private remoteFileTokenWarningLogged;
58
+ private appEnsured;
59
+ private backendReady;
60
+ constructor(config?: Partial<ApiClientConfig>);
61
+ private getBaseUrl;
62
+ private shouldAttachAuthToken;
63
+ private buildAuthHeaders;
64
+ private toMonitorChannelId;
65
+ /**
66
+ * 快速预检:检查端口和 token 配置是否就绪
67
+ * 不发起 HTTP 请求,仅检查本地文件
68
+ * 返回 null 表示配置就绪,否则返回错误消息
69
+ */
70
+ preflight(): string | null;
71
+ /**
72
+ * 确保 Record Safer 应用正在运行
73
+ * 首次调用时检查后端是否可达,不可达则自动启动应用并等待就绪
74
+ * @returns true 如果它尝试了启动应用操作,false 如果已经在运行
75
+ */
76
+ ensureAppRunning(): Promise<boolean>;
77
+ /**
78
+ * 通用 HTTP 请求方法
79
+ * - 自动附加 Authorization header(当 token 可用时)
80
+ * - 自动设置 Content-Type: application/json(当有 body 时)
81
+ * - HTTP 错误时抛出 ApiError
82
+ */
83
+ request<T>(urlPath: string, options?: RequestInit, requestOptions?: ClientRequestOptions): Promise<T>;
84
+ listDevices(requestOptions?: ClientRequestOptions): Promise<DeviceInfo[]>;
85
+ listOutputDevices(): Promise<OutputDeviceInfo[]>;
86
+ getBufferSizes(deviceId: string, sampleRate?: number): Promise<BufferSizeInfo>;
87
+ getDeviceSignals(deviceId: string, sampleRate?: number): Promise<SignalInfo>;
88
+ getDeviceLevels(deviceId: string, params?: LevelQueryParams): Promise<LevelData>;
89
+ stopLevelMonitoring(): Promise<void>;
90
+ subscribeLevels(params?: LevelSubscriptionParams): Promise<void>;
91
+ unsubscribeLevels(): Promise<void>;
92
+ disableLevelCallback(): Promise<void>;
93
+ enableLevelCallback(): Promise<void>;
94
+ /**
95
+ * 初始化录音会话
96
+ * 接收 MCP 工具层的简化参数,转换为后端期望的格式后发送
97
+ */
98
+ initializeSession(params: SessionToolParams): Promise<SessionResult>;
99
+ startRecordMcp(params: StartRecordMcpParams): Promise<StartRecordMcpResult>;
100
+ resetSession(): Promise<void>;
101
+ startRecording(options?: RecordingOptions): Promise<RecordingStartResult>;
102
+ stopRecording(params: StopRecordingParams): Promise<RecordingStopResult>;
103
+ getRecordingStatus(requestOptions?: ClientRequestOptions): Promise<RecordingStatus>;
104
+ getOutputPath(): Promise<OutputPathInfo>;
105
+ setOutputPath(outputPath: string): Promise<void>;
106
+ getAudioFormat(): Promise<AudioFormatInfo>;
107
+ setAudioFormat(format: AudioFormatConfig): Promise<void>;
108
+ getSettings(): Promise<Settings>;
109
+ updateSettings(settings: Partial<Settings>): Promise<Settings>;
110
+ getMonitorStatus(): Promise<MonitorStatus>;
111
+ startMonitor(params: MonitorStartParams): Promise<void>;
112
+ stopMonitor(): Promise<void>;
113
+ setMasterVolume(volume: number, pan?: number): Promise<void>;
114
+ getMixLevels(): Promise<MixLevels>;
115
+ setChannelVolume(index: number, volume: number): Promise<void>;
116
+ setChannelPan(index: number, pan: number): Promise<void>;
117
+ setChannelSolo(index: number, solo: boolean): Promise<void>;
118
+ setChannelMute(index: number, mute: boolean): Promise<void>;
119
+ setChannelMsProcess(index: number, enabled: boolean): Promise<void>;
120
+ setChannelPhaseInvert(index: number, inverted: boolean): Promise<void>;
121
+ mergeChannelsStereo(leftIndex: number, rightIndex: number): Promise<void>;
122
+ splitStereoChannel(leftIndex: number, rightIndex: number): Promise<void>;
123
+ listTracks(requestOptions?: ClientRequestOptions): Promise<TrackInfo[]>;
124
+ stopTrack(trackId: string): Promise<void>;
125
+ listMarkers(requestOptions?: ClientRequestOptions): Promise<MarkerInfo[]>;
126
+ addMarker(label?: string): Promise<MarkerResult>;
127
+ syncMarkers(markers: MarkerSyncEntry[]): Promise<void>;
128
+ renameMarker(id: string, name: string): Promise<void>;
129
+ renameChannel(id: string, name: string): Promise<void>;
130
+ setChannelColor(id: string, color: string): Promise<void>;
131
+ listVolumes(): Promise<VolumeInfo[]>;
132
+ listExternalDrives(): Promise<DriveInfo[]>;
133
+ validateStoragePath(storagePath: string): Promise<ValidationResult>;
134
+ lockStorage(uuid: string): Promise<void>;
135
+ unlockStorage(): Promise<void>;
136
+ getUIState(requestOptions?: ClientRequestOptions): Promise<UIState>;
137
+ setUIState(page: string, pageStep: number): Promise<void>;
138
+ getMcpChannels(requestOptions?: ClientRequestOptions): Promise<McpChannelsResponse>;
139
+ getMcpMix(requestOptions?: ClientRequestOptions): Promise<McpMixResponse>;
140
+ getMcpHealth(requestOptions?: ClientRequestOptions): Promise<McpHealthResponse>;
141
+ getMcpStatus(requestOptions?: ClientRequestOptions): Promise<McpStatusResponse>;
142
+ getSystemInfo(): Promise<SystemInfo>;
143
+ getDiskSpace(): Promise<DiskSpaceInfo>;
144
+ checkDiskHealth(params?: DiskHealthCheckParams): Promise<DiskHealthResult>;
145
+ checkUpdates(): Promise<UpdateInfo>;
146
+ getUpdateBadge(): Promise<UpdateBadge>;
147
+ installUpdate(): Promise<void>;
148
+ getDownloadProgress(): Promise<DownloadProgress>;
149
+ activateLicense(code: string): Promise<ActivationResult>;
150
+ getActivationStatus(): Promise<ActivationStatus>;
151
+ setActivation(data: ActivationData): Promise<void>;
152
+ restoreLicense(): Promise<RestoreResult>;
153
+ startSplit(params: SplitParams): Promise<SplitResult>;
154
+ getSplitProgress(): Promise<SplitProgress>;
155
+ cancelSplit(): Promise<void>;
156
+ sendTelemetry(data: TelemetryData): Promise<void>;
157
+ shutdown(): Promise<void>;
158
+ }
159
+ //# sourceMappingURL=api-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"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"}