@map-audio/pam-mcp-server 1.7.0 → 1.18.1

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.
package/README.md CHANGED
@@ -77,11 +77,27 @@ Use the same `mcpServers` block in the client's MCP config. Any stdio-compatible
77
77
 
78
78
  ## What's in the box
79
79
 
80
- Live tools (require a running PAM): `set_parameters`, `trigger_midi`, `update_pattern`, `load_sample`, `load_preset`, `save_preset`, `add_modulation`, `start_transport`, `stop_transport`, `full_stop_transport`, `set_bpm`, `randomize_samples`, `randomize_patterns`, `load_variation`, and more.
81
-
82
- Plugin host tools (when PAM is built with the plugin host enabled): `list_plugins`, `scan_plugins`, `cancel_plugin_scan`, `get_plugin_scan_status`, `list_loaded_plugins`, `load_plugin`, `unload_plugin`, `set_plugin_param`, `set_plugin_bypass`. Typical flow: `scan_plugins` → poll `get_plugin_scan_status` → `list_plugins` → `load_plugin` into a cell → `list_loaded_plugins` for param indices → `set_plugin_param` / `set_plugin_bypass`.
83
-
84
- Offline tools (manifest-only): `get_parameter_info`, `list_presets`, `list_samples`, `get_manifest_summary`.
80
+ ~137 tools. The high-value entry points:
81
+
82
+ - **Read first**: `design_context` (curated parameter cheat sheet, works offline) and `get_design_overview` (compact live snapshot). Prefer these over full `get_state` dumps or broad `get_parameter_info` sweeps.
83
+ - **Sound design**: `set_parameters`, `update_pattern`, `add_modulation` / `add_param_seq`, `update_effect_config`, `set_master_effects`, `set_drum_synth`, `randomize` / `randomize_samples` / `randomize_patterns`.
84
+ - **Samples**: `get_default_locations` → `list_samples` → `load_sample`, plus `trim/reverse/gain/normalize_sample`, `analyze_sample_tempo`, `resample_sample_to_bpm`, `build_sample_chain`.
85
+ - **Transport & MIDI**: `start_transport` / `stop_transport` / `full_stop_transport`, `set_bpm`, `trigger_midi` (+ CC / program change), `midi_recording`.
86
+ - **Presets, variations & songs**: `load_preset` / `save_preset` / `new_preset`, `save_variation` / `load_variation` / `queue_variation`, `song_mode`, `export_song` (full-track bounce), `export_audio` (incl. per-cell stems).
87
+ - **Looper**: full 8-track control — arm/record/capture, `load_audio_to_looper_track`, warp, looper variations, `live_resample`.
88
+ - **Plugin host** (PAM builds with hosting): `scan_plugins` → `get_plugin_scan_status` → `list_plugins` → `load_plugin` → `list_loaded_plugins` → `set_plugin_param` / `set_plugin_bypass`.
89
+ - **AI models & generation** (experimental flags required): `download_model` / `load_model` / `get_model_status` / `list_models` (engines: aigen, magenta, notochord), `generate_sample`, `generate_kit`.
90
+ - **Video (VX) & UI** — require PAM's window to be open: `get_video_state`, `add_video_layer`, `bind_video_param`, `video_command`, …, and `capture_ui` (deterministic UI screenshot).
91
+ - **Offline (manifest-only)**: `get_parameter_info`, `design_context`, `list_presets`, `read_preset`, `get_manifest_summary`.
92
+
93
+ All three product manifests (PAM / CELL1 / MFX) are bundled; the server auto-selects by the connected instance's product, so one config entry drives all three products.
94
+
95
+ ## Agent ergonomics
96
+
97
+ - **Tool annotations.** Every tool carries MCP annotations. Tools with `readOnlyHint: true` never change plugin state, so clients can approve them freely. `destructiveHint: true` marks tools that discard user state (`delete_preset`, `reset_cell`, `load_preset` over unsaved edits). `openWorldHint` is `false` on every tool; the server only talks to the local plugin.
98
+ - **Structured output.** The status tools (`connection_status`, `select_instance`, `get_transport`, `get_manifest_summary`, `get_model_status`, `get_plugin_scan_status`, `workbench_sidecar_status`) return `structuredContent` with a declared output schema, alongside the same JSON as text.
99
+ - **Prompts.** Five guided workflows ship as MCP prompts: `build-a-beat`, `make-a-song`, `design-a-preset`, `mix-and-master`, `troubleshoot-bridge`. In Claude Code they appear as slash commands (e.g. `/pam:build-a-beat`).
100
+ - **Multiple instances.** When several products run at once (say PAM and MFX), `select_instance` picks which one the live tools drive, matched by product name, instanceId, or port. Setting `PAM_BRIDGE_PRODUCT=MFX` in the server's `env` block pins the choice at launch. Offline parameter validation follows the selected product's manifest.
85
101
 
86
102
  ## License
87
103
 
package/dist/bridge.d.ts CHANGED
@@ -1,22 +1,37 @@
1
- interface BridgeInfo {
1
+ export interface BridgeInfo {
2
2
  port: number;
3
3
  instanceId: string;
4
4
  product: string;
5
5
  pid: number;
6
6
  }
7
+ /**
8
+ * Instance selector for connect(). `instanceId` matches exactly, `product`
9
+ * case-insensitively ("PAM" / "CELL1" / "MFX"), `port` directly. When a
10
+ * selector is given and nothing matches, connect() fails rather than silently
11
+ * driving a different instance. PAM_BRIDGE_PRODUCT env pins the default.
12
+ */
13
+ export interface ConnectTarget {
14
+ port?: number;
15
+ product?: string;
16
+ instanceId?: string;
17
+ }
7
18
  export declare class PluginBridge {
8
19
  private socket;
9
20
  private buffer;
10
21
  private nextId;
11
22
  private pending;
12
23
  private connected;
24
+ private connectedInstance;
13
25
  discover(): Promise<BridgeInfo[]>;
14
- connect(port?: number): Promise<boolean>;
26
+ private static matchesTarget;
27
+ connect(target?: ConnectTarget): Promise<boolean>;
15
28
  disconnect(): void;
16
29
  isConnected(): boolean;
30
+ /** The discovery entry of the instance this bridge is connected to, if known. */
31
+ getConnectedInstance(): BridgeInfo | null;
17
32
  private static readonly SLOW_ACTIONS;
33
+ private static readonly VERY_SLOW_ACTIONS;
18
34
  send(action: string, ...args: unknown[]): Promise<unknown>;
19
35
  private translateBridgeError;
20
36
  private processBuffer;
21
37
  }
22
- export {};
package/dist/bridge.js CHANGED
@@ -91,11 +91,36 @@ const NEW_ACTIONS_ADDED_IN_1_7_0 = new Set([
91
91
  "previewSampleNative",
92
92
  "stopPreviewNative",
93
93
  ]);
94
- // Plugin-host actions ship on PAM builds with PAM_PLUGIN_HOST=1.
95
- // Older builds (or non-host SKUs like Cell1 / Lazer-standalone) won't
96
- // recognize them and will return "unknown action 'X'". The bridge handler
97
- // translates that into a tool-level error so the agent gets an actionable
98
- // hint instead of a raw "unknown action".
94
+ // Actions added in MCP server 1.8.0 — VX video subsystem control (layers, FX chains,
95
+ // audio-reactive bindings, output FX, mod routes, model overlay, render/sync settings)
96
+ // plus the full-scene read channel. Require a PAM build with the mcpVideoBridge wiring.
97
+ const NEW_ACTIONS_ADDED_IN_1_8_0 = new Set([
98
+ "videoCommand",
99
+ "getVideoState",
100
+ ]);
101
+ // Actions added in MCP server 1.13.0 — drum-synth control routed through the WebView
102
+ // (the engine-aware randomizer + the drawable-wave LUT). Require a PAM build whose
103
+ // MCPBridge forwards them via postToUI; older builds return "unknown action 'X'".
104
+ const NEW_ACTIONS_ADDED_IN_1_13_0 = new Set([
105
+ "randomizeDrumSynth",
106
+ "setDrumSynthWaveCurve",
107
+ ]);
108
+ // Actions added in MCP server 1.15.0 — the assistant-surface UI forwards
109
+ // (set_view navigation + the lfos/mods modulation randomizer), routed through
110
+ // the WebView like randomizeDrumSynth. Older builds return "unknown action 'X'".
111
+ const NEW_ACTIONS_ADDED_IN_1_15_0 = new Set([
112
+ "setView",
113
+ "randomizeModulations",
114
+ ]);
115
+ const NEW_ACTIONS_ADDED_IN_1_17_0 = new Set([
116
+ "analyzeMix",
117
+ "getMixAnalysis",
118
+ ]);
119
+ // Plugin-host actions ship on builds with PAM_PLUGIN_HOST=1. Older builds or
120
+ // non-host SKUs like Cell1 won't recognize them and will return
121
+ // "unknown action 'X'". MFX can compile FX-side hosting, but these shared MCP
122
+ // actions are still PAM-manager-shaped until product-aware FX-host tooling lands.
123
+ // The bridge handler translates unknown actions into an actionable tool error.
99
124
  const PLUGIN_HOST_ACTIONS = new Set([
100
125
  "listPlugins",
101
126
  "scanPlugins",
@@ -110,12 +135,25 @@ const PLUGIN_HOST_ACTIONS = new Set([
110
135
  "skipCurrentPluginScan",
111
136
  "removeFromBlocklist",
112
137
  ]);
138
+ // The unified AI model-management actions (download/status/load/unload/delete/list
139
+ // for aigen/magenta/notochord) are compiled out on standalone MFX builds
140
+ // (#if !PAM_IS_MFX in MCPBridge.cpp) and absent on PAM builds older than 1.9.0 —
141
+ // both return "unknown action 'X'". Translate that into an actionable hint.
142
+ const MODEL_ACTIONS = new Set([
143
+ "modelDownload",
144
+ "modelStatus",
145
+ "modelLoad",
146
+ "modelUnload",
147
+ "modelDelete",
148
+ "modelList",
149
+ ]);
113
150
  export class PluginBridge {
114
151
  socket = null;
115
152
  buffer = "";
116
153
  nextId = 1;
117
154
  pending = new Map();
118
155
  connected = false;
156
+ connectedInstance = null;
119
157
  async discover() {
120
158
  try {
121
159
  const raw = await readFile(DISCOVERY_FILE, "utf-8");
@@ -141,14 +179,44 @@ export class PluginBridge {
141
179
  return [];
142
180
  }
143
181
  }
144
- async connect(port) {
145
- if (this.connected)
146
- return true;
147
- if (!port) {
148
- const instances = await this.discover();
182
+ static matchesTarget(instance, target) {
183
+ if (target.instanceId !== undefined && instance.instanceId !== target.instanceId)
184
+ return false;
185
+ if (target.port !== undefined && instance.port !== target.port)
186
+ return false;
187
+ if (target.product !== undefined &&
188
+ instance.product?.toLowerCase() !== target.product.toLowerCase())
189
+ return false;
190
+ return true;
191
+ }
192
+ async connect(target) {
193
+ // Default target: the PAM_BRIDGE_PRODUCT env pin, if set. The pin is hard —
194
+ // silently connecting to a different product would mutate the wrong plugin.
195
+ if (!target && process.env.PAM_BRIDGE_PRODUCT) {
196
+ target = { product: process.env.PAM_BRIDGE_PRODUCT };
197
+ }
198
+ if (this.connected) {
199
+ if (!target || (this.connectedInstance && PluginBridge.matchesTarget(this.connectedInstance, target)))
200
+ return true;
201
+ this.disconnect();
202
+ }
203
+ let port = target?.port;
204
+ let instance = null;
205
+ const instances = await this.discover();
206
+ if (target && (target.product !== undefined || target.instanceId !== undefined)) {
207
+ instance = instances.find((i) => PluginBridge.matchesTarget(i, target)) ?? null;
208
+ if (!instance)
209
+ return false;
210
+ port = instance.port;
211
+ }
212
+ else if (!port) {
149
213
  if (instances.length === 0)
150
214
  return false;
151
- port = instances[0].port;
215
+ instance = instances[0];
216
+ port = instance.port;
217
+ }
218
+ else {
219
+ instance = instances.find((i) => i.port === port) ?? null;
152
220
  }
153
221
  return new Promise((resolve) => {
154
222
  const timer = setTimeout(() => {
@@ -160,6 +228,7 @@ export class PluginBridge {
160
228
  this.socket = createConnection({ host: "127.0.0.1", port }, () => {
161
229
  clearTimeout(timer);
162
230
  this.connected = true;
231
+ this.connectedInstance = instance;
163
232
  resolve(true);
164
233
  });
165
234
  this.socket.setEncoding("utf-8");
@@ -186,10 +255,15 @@ export class PluginBridge {
186
255
  this.socket?.destroy();
187
256
  this.socket = null;
188
257
  this.connected = false;
258
+ this.connectedInstance = null;
189
259
  }
190
260
  isConnected() {
191
261
  return this.connected;
192
262
  }
263
+ /** The discovery entry of the instance this bridge is connected to, if known. */
264
+ getConnectedInstance() {
265
+ return this.connected ? this.connectedInstance : null;
266
+ }
193
267
  // Actions that block the message thread for disk I/O + graph rebuild
194
268
  static SLOW_ACTIONS = new Set([
195
269
  "loadPreset",
@@ -204,14 +278,30 @@ export class PluginBridge {
204
278
  "listDirectory",
205
279
  "importVisualFolder",
206
280
  "loadPlugin",
281
+ // Model lifecycle: trigger is fast, but load/unload/delete can join a
282
+ // manager bootstrap thread for seconds (non-interruptible ORT/MLX loads).
283
+ "modelDownload",
284
+ "modelLoad",
285
+ "modelUnload",
286
+ "modelDelete",
287
+ // Workbench: loadTake is a loadSampleToCell (disk + graph rebuild).
288
+ "workbenchLoadTake",
207
289
  ]);
290
+ // Actions that block on an external render process — the C++ handler itself
291
+ // waits up to 180 s on the sidecar (pipeline rebuild + sequential inpaints),
292
+ // so the TCP timeout must outlast it.
293
+ static VERY_SLOW_ACTIONS = new Set(["workbenchRender"]);
208
294
  async send(action, ...args) {
209
295
  if (!this.connected || !this.socket) {
210
296
  throw new Error("Not connected to PAM plugin. Start PAM and ensure the MCP bridge is enabled.");
211
297
  }
212
298
  const id = this.nextId++;
213
299
  const msg = { id, action, args };
214
- const timeoutMs = PluginBridge.SLOW_ACTIONS.has(action) ? 30000 : 10000;
300
+ const timeoutMs = PluginBridge.VERY_SLOW_ACTIONS.has(action)
301
+ ? 190000
302
+ : PluginBridge.SLOW_ACTIONS.has(action)
303
+ ? 30000
304
+ : 10000;
215
305
  return new Promise((resolve, reject) => {
216
306
  const timer = setTimeout(() => {
217
307
  if (this.pending.has(id)) {
@@ -232,14 +322,27 @@ export class PluginBridge {
232
322
  if (message.startsWith("unknown action '")) {
233
323
  if (PLUGIN_HOST_ACTIONS.has(action)) {
234
324
  return (`PAM build does not include the plugin host ('${action}' not recognized). ` +
235
- `Plugin-host tools require a PAM build with PAM_PLUGIN_HOST=1 (the flagship PAM SKU). ` +
236
- `Cell1 and standalone LAZER builds do not host third-party plugins.`);
325
+ `Plugin-host tools require a build with PAM_PLUGIN_HOST=1. ` +
326
+ `Cell1 does not host third-party plugins; MFX only exposes FX-side hosting and needs product-aware FX-host MCP support.`);
327
+ }
328
+ if (MODEL_ACTIONS.has(action)) {
329
+ return (`PAM build does not include the AI model managers ('${action}' not recognized). ` +
330
+ `Model-management tools require PAM ≥ 1.9.0 with the AIGen/Magenta/Notochord managers; ` +
331
+ `they are not available on standalone MFX builds.`);
237
332
  }
238
- const requiredVersion = NEW_ACTIONS_ADDED_IN_1_7_0.has(action)
239
- ? "1.7.0"
240
- : NEW_ACTIONS_ADDED_IN_1_1_0.has(action) || NEW_ACTIONS_ADDED_IN_1_5_0.has(action)
241
- ? MIN_PAM_VERSION_FOR_NEW_ACTIONS
242
- : null;
333
+ const requiredVersion = NEW_ACTIONS_ADDED_IN_1_17_0.has(action)
334
+ ? "1.17.0"
335
+ : NEW_ACTIONS_ADDED_IN_1_15_0.has(action)
336
+ ? "1.15.0"
337
+ : NEW_ACTIONS_ADDED_IN_1_13_0.has(action)
338
+ ? "1.13.0"
339
+ : NEW_ACTIONS_ADDED_IN_1_8_0.has(action)
340
+ ? "1.8.0"
341
+ : NEW_ACTIONS_ADDED_IN_1_7_0.has(action)
342
+ ? "1.7.0"
343
+ : NEW_ACTIONS_ADDED_IN_1_1_0.has(action) || NEW_ACTIONS_ADDED_IN_1_5_0.has(action)
344
+ ? MIN_PAM_VERSION_FOR_NEW_ACTIONS
345
+ : null;
243
346
  if (requiredVersion) {
244
347
  return (`PAM build does not support '${action}'. ` +
245
348
  `This action requires PAM ≥ ${requiredVersion} ` +
@@ -1 +1 @@
1
- {"version":3,"file":"bridge.js","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bridge.js","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,119 @@
1
+ /**
2
+ * FunctionGemma wire format — renderer + parser.
3
+ *
4
+ * Byte-parity with HF `tokenizer.apply_chat_template` is REQUIRED and pinned by
5
+ * scripts/check-fgemma-format.mjs against fixtures dumped by
6
+ * packages/fgemma-poc/dump_template_fixture.py. Empirical rules (from the
7
+ * fixtures, 2026-07-03, google/functiongemma-270m-it template):
8
+ *
9
+ * - Prompt starts with literal `<bos>` (template-added; serving layers that
10
+ * add BOS themselves must not receive it twice — see buildGenerationPrompt).
11
+ * - Developer turn: trigger phrase + declarations back-to-back, input order.
12
+ * - Schema objects render with keys sorted alphabetically at every level;
13
+ * `type` values are UPPERCASED; all schema strings are <escape>-wrapped.
14
+ * - Tool call/response argument objects ALSO sort keys at every level (the
15
+ * template dictsorts them — pinned by fixtures/hf_dictsort_probe.txt; the
16
+ * original fixtures were accidentally all-alphabetical and hid this);
17
+ * strings are <escape>-wrapped, numbers/booleans bare.
18
+ * - The tool call AND its function response live inside ONE continuous
19
+ * `model` turn: app appends `<start_function_response>response:…` inline
20
+ * and generation resumes — no new turn markers.
21
+ * - Multi-exchange history (fixtures hf_followup_prompt.txt /
22
+ * hf_followup_text_prompt.txt): a user message directly after a tool
23
+ * response is INLINED into the same model turn (no `<end_of_turn>` /
24
+ * `<start_of_turn>user` markers); a user message after assistant TEXT gets
25
+ * normal turn markers. buildGenerationPrompt's `history` option reproduces
26
+ * this byte-exactly.
27
+ * - Session context: `renderContextLine` renders the compact `[ctx]` state
28
+ * line prepended to the LAST user turn (grammar pinned against
29
+ * fixtures/context_line.txt; Python twin: packages/fgemma-poc/fgemma_context.py).
30
+ */
31
+ export interface ToolDef {
32
+ name: string;
33
+ description: string;
34
+ parameters: Record<string, unknown>;
35
+ aliasOf?: string;
36
+ }
37
+ export interface FunctionCall {
38
+ name: string;
39
+ arguments: Record<string, unknown>;
40
+ }
41
+ export declare const TRIGGER_PHRASE = "You are a model that can do function calling with the following functions";
42
+ /** Stop sequences for generation (per docs; <end_function_call> is deliberately
43
+ * absent — parallel calls arrive in one turn). */
44
+ export declare const STOP_SEQUENCES: string[];
45
+ /** Render a call/response VALUE: keys sorted at every level (matches the
46
+ * template's dictsort — training/inference byte-parity), strings escaped,
47
+ * no uppercasing. null/undefined render as bare `null` — never trained, but
48
+ * reachable at runtime (get_state of an absent key) and must not throw. */
49
+ export declare function renderValue(v: unknown): string;
50
+ export declare function renderDeclaration(tool: ToolDef): string;
51
+ export declare function renderDeveloperTurn(tools: ToolDef[]): string;
52
+ export declare function renderUserTurn(text: string): string;
53
+ export declare function renderFunctionCall(call: FunctionCall): string;
54
+ export declare function renderFunctionResponse(name: string, response: unknown): string;
55
+ export interface ContextCell {
56
+ id: number;
57
+ /** RAW name — sample path/basename or `Engine(synth)`; sanitized here. */
58
+ name: string;
59
+ }
60
+ export interface AssistantContext {
61
+ bpm: number;
62
+ playing: boolean;
63
+ /** Current main view — the set_view tool's lowercase token vocabulary
64
+ * (fgemma_context.py CTX_VIEWS); absent renders as the default `cells`. */
65
+ view?: string;
66
+ /** Active preset display name (RAW — sanitized here); absent → `none`. */
67
+ preset?: string | null;
68
+ /** Selected cell id (1-based); null/undefined/0 renders as `none`. */
69
+ sel?: number | null;
70
+ /** Muted cell ids (1-based); omitted/empty renders as `none`. */
71
+ muted?: number[];
72
+ cells: ContextCell[];
73
+ }
74
+ /** Basename, one extension stripped, whitespace→_, grammar-safe, ≤24 chars.
75
+ * Must match fgemma_context.py `sanitize_label` step for step. */
76
+ export declare function sanitizeContextLabel(name: string): string;
77
+ /** The compact `[ctx]` session-state line (fixed field order, all fields
78
+ * always present) — pinned against fixtures/context_line.txt. */
79
+ export declare function renderContextLine(ctx: AssistantContext): string;
80
+ /** The exact user-turn content shape: ctx line, newline, raw text. */
81
+ export declare function withContext(userText: string, ctx?: AssistantContext | null): string;
82
+ export interface HistoryExchange {
83
+ /** RAW user text of the past exchange (history turns carry no ctx line). */
84
+ user: string;
85
+ /** The full model-turn inner text as generated/executed: call blocks +
86
+ * inline function responses + any final text. */
87
+ model: string;
88
+ }
89
+ /**
90
+ * Full generation prompt: declarations [+ completed history exchanges] +
91
+ * user turn + `<start_of_turn>model\n`.
92
+ * `bos: "text"` embeds the literal `<bos>` (matches the HF render exactly);
93
+ * `bos: "none"` (runner default) leaves BOS insertion to the serving layer.
94
+ * History stitching mirrors the chat template exactly (pinned by
95
+ * hf_followup_prompt.txt / hf_followup_text_prompt.txt): an exchange whose
96
+ * model turn ends in a function response leaves the turn OPEN — the next user
97
+ * content is inlined with no turn markers; a text-final turn is closed with
98
+ * `<end_of_turn>` and the next user turn opens normally.
99
+ */
100
+ export declare function buildGenerationPrompt(tools: ToolDef[], userText: string, opts?: {
101
+ bos?: "text" | "none";
102
+ history?: HistoryExchange[];
103
+ }): string;
104
+ /**
105
+ * Parse every `<start_function_call>call:name{…}<end_function_call>` block.
106
+ * Balanced-brace scan with <escape>-span awareness (the docs' flat reference
107
+ * regex cannot handle object/array argument values like update_pattern's
108
+ * sequence or get_state's keys).
109
+ */
110
+ export declare function parseFunctionCalls(text: string): FunctionCall[];
111
+ /**
112
+ * Cut a completion at the first model-FABRICATED function response. Serving
113
+ * stacks that strip special tokens from output (LM Studio; llama-server
114
+ * without --special) erase <start_function_response> before the stop-string
115
+ * matcher can see it, so generation runs on and invents response:{…} payloads
116
+ * plus follow-up calls conditioned on them. Text before the first fabricated
117
+ * response is the model's real intent; everything after must not be executed.
118
+ */
119
+ export declare function truncateAtFabricatedResponse(text: string): string;