@map-audio/pam-mcp-server 1.0.0 → 1.7.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.
- package/README.md +33 -5
- package/dist/bridge.d.ts +1 -0
- package/dist/bridge.js +132 -1
- package/dist/bridge.js.map +1 -1
- package/dist/manifest.json +58431 -328
- package/dist/server.js +1738 -17
- package/dist/server.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -12,7 +12,18 @@ When PAM starts with the bridge enabled it writes `~/.pam-mcp-bridge.json` — t
|
|
|
12
12
|
|
|
13
13
|
## Install
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
Install the bridge globally once, then register the bin name `pam-mcp` with your MCP client. This is more reliable than `npx -y` for stdio MCP launchers (Claude Code in particular).
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm install -g @map-audio/pam-mcp-server
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
This installs a `pam-mcp` executable on your `PATH`. Verify with:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
which pam-mcp
|
|
25
|
+
pam-mcp --version
|
|
26
|
+
```
|
|
16
27
|
|
|
17
28
|
### Claude Desktop
|
|
18
29
|
|
|
@@ -22,8 +33,7 @@ Edit `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) o
|
|
|
22
33
|
{
|
|
23
34
|
"mcpServers": {
|
|
24
35
|
"pam": {
|
|
25
|
-
"command": "
|
|
26
|
-
"args": ["-y", "@map-audio/pam-mcp-server"]
|
|
36
|
+
"command": "pam-mcp"
|
|
27
37
|
}
|
|
28
38
|
}
|
|
29
39
|
}
|
|
@@ -34,7 +44,7 @@ Fully quit Claude Desktop (`Cmd+Q` / right-click tray icon → Quit) and reopen.
|
|
|
34
44
|
### Claude Code
|
|
35
45
|
|
|
36
46
|
```bash
|
|
37
|
-
claude mcp add pam
|
|
47
|
+
claude mcp add pam pam-mcp
|
|
38
48
|
```
|
|
39
49
|
|
|
40
50
|
or add the same `mcpServers` block to `.mcp.json` at your project root.
|
|
@@ -43,16 +53,34 @@ or add the same `mcpServers` block to `.mcp.json` at your project root.
|
|
|
43
53
|
|
|
44
54
|
Use the same `mcpServers` block in the client's MCP config. Any stdio-compatible MCP client works.
|
|
45
55
|
|
|
56
|
+
### `npx`-based install (alternative)
|
|
57
|
+
|
|
58
|
+
`npx -y @map-audio/pam-mcp-server` also works in Claude Desktop and some clients, but Claude Code's stdio launcher does not resolve the npm bin shim reliably and reports "Failed to connect" even when the package is published. Prefer the global-install + bare-bin form above for Claude Code:
|
|
59
|
+
|
|
60
|
+
```json
|
|
61
|
+
{
|
|
62
|
+
"mcpServers": {
|
|
63
|
+
"pam": {
|
|
64
|
+
"command": "npx",
|
|
65
|
+
"args": ["-y", "@map-audio/pam-mcp-server"]
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
46
71
|
## Troubleshooting
|
|
47
72
|
|
|
48
73
|
- **"Not connected to PAM plugin"** — PAM isn't running, or MCP Bridge is off. Open PAM → Settings → Experimental Mode → enable MCP Bridge, then restart PAM.
|
|
49
|
-
-
|
|
74
|
+
- **"Failed to connect" / `pam-mcp: command not found`** — the MCP client's shell PATH doesn't include the npm global bin. Run `which pam-mcp` in a terminal and use the absolute path it prints (e.g. `/Users/you/.nvm/versions/node/v22/bin/pam-mcp`) as the `command` value in your config. macOS GUI apps don't inherit shell PATH from `~/.zshrc`/`~/.bashrc`, so absolute paths are the safest fallback.
|
|
75
|
+
- **`npx: command not found`** (if you're using the npx form) — same root cause: install Node from [nodejs.org](https://nodejs.org) (not via `nvm`/`asdf`), or give the absolute path: `"command": "/usr/local/bin/npx"` / `"/opt/homebrew/bin/npx"`.
|
|
50
76
|
- **Offline tools fail** (`list_presets`, `get_parameter_info`) — the manifest bundled with the package is used automatically. To target a different PAM install, set `PAM_MANIFEST_PATH` in the server's `env` block.
|
|
51
77
|
|
|
52
78
|
## What's in the box
|
|
53
79
|
|
|
54
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.
|
|
55
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
|
+
|
|
56
84
|
Offline tools (manifest-only): `get_parameter_info`, `list_presets`, `list_samples`, `get_manifest_summary`.
|
|
57
85
|
|
|
58
86
|
## License
|
package/dist/bridge.d.ts
CHANGED
package/dist/bridge.js
CHANGED
|
@@ -3,6 +3,113 @@ import { resolve } from "node:path";
|
|
|
3
3
|
import { createConnection } from "node:net";
|
|
4
4
|
import { homedir } from "node:os";
|
|
5
5
|
const DISCOVERY_FILE = resolve(homedir(), ".pam-mcp-bridge.json");
|
|
6
|
+
// Minimum PAM build that ships the bridge handlers added in this server version.
|
|
7
|
+
// Tools registered against actions introduced after this version will return
|
|
8
|
+
// "unknown action 'X'" from older PAM builds — the wrapper below translates
|
|
9
|
+
// that into an actionable error for the agent.
|
|
10
|
+
const MIN_PAM_VERSION_FOR_NEW_ACTIONS = "1.5.0";
|
|
11
|
+
const NEW_ACTIONS_ADDED_IN_1_5_0 = new Set([
|
|
12
|
+
"aiGenerate",
|
|
13
|
+
"aiGenerateKit",
|
|
14
|
+
]);
|
|
15
|
+
const NEW_ACTIONS_ADDED_IN_1_1_0 = new Set([
|
|
16
|
+
"startLooperRecord",
|
|
17
|
+
"stopLooperRecord",
|
|
18
|
+
"captureLooperNow",
|
|
19
|
+
"loadAudioToLooperTrack",
|
|
20
|
+
"requestLooperWarp",
|
|
21
|
+
"setLooperAlwaysListen",
|
|
22
|
+
"setLooperLatencyCompAuto",
|
|
23
|
+
"setLooperLatencyCompOffsetMs",
|
|
24
|
+
"setLooperLatencyCompApplyToCells",
|
|
25
|
+
"saveLooperVariation",
|
|
26
|
+
"clearLooperVariation",
|
|
27
|
+
"applyLooperVariationImmediate",
|
|
28
|
+
"queueLooperVariationOnBars",
|
|
29
|
+
"cancelQueuedLooperVariation",
|
|
30
|
+
"setLooperVariationBarSyncEnabled",
|
|
31
|
+
"setLooperVariationBarSyncIntervalBars",
|
|
32
|
+
"setCurrentLooperVariationIndex",
|
|
33
|
+
"queueVariationOnBars",
|
|
34
|
+
"cancelQueuedVariation",
|
|
35
|
+
"updateVariations",
|
|
36
|
+
"midiCC",
|
|
37
|
+
"midiProgramChange",
|
|
38
|
+
"startMidiRecording",
|
|
39
|
+
"stopMidiRecording",
|
|
40
|
+
"setMidiRecordingOverdub",
|
|
41
|
+
"removeRecordedNote",
|
|
42
|
+
"applyEnvelopeUpdate",
|
|
43
|
+
"applyLfoUpdate",
|
|
44
|
+
"applyVaryUpdate",
|
|
45
|
+
"applyMacroUpdate",
|
|
46
|
+
"applyParamSeqUpdate",
|
|
47
|
+
"applyParamSeqSequenceUpdate",
|
|
48
|
+
"setSongModeSequence",
|
|
49
|
+
"clearSongModeSequence",
|
|
50
|
+
"toggleSongMode",
|
|
51
|
+
"setSongModeLoopPoints",
|
|
52
|
+
"toggleSongModeLoop",
|
|
53
|
+
"setSongModeCrossfadeMs",
|
|
54
|
+
"setSongModePlayhead",
|
|
55
|
+
"setVariationHoldEnabled",
|
|
56
|
+
"variationHoldAllNotesOff",
|
|
57
|
+
"syncVariationHoldBindings",
|
|
58
|
+
"setMetronomeEnabled",
|
|
59
|
+
"analyzeSampleTempo",
|
|
60
|
+
"requestSamplePeaks",
|
|
61
|
+
"previewSlice",
|
|
62
|
+
"resampleSampleToBPM",
|
|
63
|
+
"restoreOriginalSample",
|
|
64
|
+
"buildSampleChain",
|
|
65
|
+
"exportSliceForCell",
|
|
66
|
+
"resampleGraphToCell",
|
|
67
|
+
"stopLiveResample",
|
|
68
|
+
]);
|
|
69
|
+
// Actions added in MCP server 1.7.0 — settings, transport config, MIDI device +
|
|
70
|
+
// action-mapping config, preset management (delete / factory-status / sample-usage /
|
|
71
|
+
// sample-path repair), and native sample preview. Require a PAM build of the same
|
|
72
|
+
// vintage; older builds return "unknown action 'X'".
|
|
73
|
+
const NEW_ACTIONS_ADDED_IN_1_7_0 = new Set([
|
|
74
|
+
"applySettingsUpdate",
|
|
75
|
+
"updateTransportTimeSig",
|
|
76
|
+
"setHostSyncEnabled",
|
|
77
|
+
"releaseHostSyncForManualTransport",
|
|
78
|
+
"setExternalClockSync",
|
|
79
|
+
"setMuteAudioOutput",
|
|
80
|
+
"getAudioDeviceSetup",
|
|
81
|
+
"setMidiInputDevices",
|
|
82
|
+
"setMidiOutputDevice",
|
|
83
|
+
"setMidiOutputEnabled",
|
|
84
|
+
"setMidiMapping",
|
|
85
|
+
"removePreset",
|
|
86
|
+
"togglePresetFactoryStatus",
|
|
87
|
+
"getPresetSampleUsage",
|
|
88
|
+
"getPresetsUsingSample",
|
|
89
|
+
"fixPresetSamplePaths",
|
|
90
|
+
"rescanMissingSamples",
|
|
91
|
+
"previewSampleNative",
|
|
92
|
+
"stopPreviewNative",
|
|
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".
|
|
99
|
+
const PLUGIN_HOST_ACTIONS = new Set([
|
|
100
|
+
"listPlugins",
|
|
101
|
+
"scanPlugins",
|
|
102
|
+
"cancelPluginScan",
|
|
103
|
+
"getPluginScanStatus",
|
|
104
|
+
"listLoadedPlugins",
|
|
105
|
+
"loadPlugin",
|
|
106
|
+
"unloadPlugin",
|
|
107
|
+
"setPluginParam",
|
|
108
|
+
"setPluginParams",
|
|
109
|
+
"setPluginBypass",
|
|
110
|
+
"skipCurrentPluginScan",
|
|
111
|
+
"removeFromBlocklist",
|
|
112
|
+
]);
|
|
6
113
|
export class PluginBridge {
|
|
7
114
|
socket = null;
|
|
8
115
|
buffer = "";
|
|
@@ -96,6 +203,7 @@ export class PluginBridge {
|
|
|
96
203
|
"loadVariation",
|
|
97
204
|
"listDirectory",
|
|
98
205
|
"importVisualFolder",
|
|
206
|
+
"loadPlugin",
|
|
99
207
|
]);
|
|
100
208
|
async send(action, ...args) {
|
|
101
209
|
if (!this.connected || !this.socket) {
|
|
@@ -114,10 +222,33 @@ export class PluginBridge {
|
|
|
114
222
|
this.pending.set(id, {
|
|
115
223
|
resolve: (v) => { clearTimeout(timer); resolve(v); },
|
|
116
224
|
reject: (e) => { clearTimeout(timer); reject(e); },
|
|
225
|
+
action,
|
|
117
226
|
});
|
|
118
227
|
this.socket.write(JSON.stringify(msg) + "\n");
|
|
119
228
|
});
|
|
120
229
|
}
|
|
230
|
+
translateBridgeError(message, action) {
|
|
231
|
+
// C++ MCPBridge::handleCommand emits this exact prefix for unrecognized actions.
|
|
232
|
+
if (message.startsWith("unknown action '")) {
|
|
233
|
+
if (PLUGIN_HOST_ACTIONS.has(action)) {
|
|
234
|
+
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.`);
|
|
237
|
+
}
|
|
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;
|
|
243
|
+
if (requiredVersion) {
|
|
244
|
+
return (`PAM build does not support '${action}'. ` +
|
|
245
|
+
`This action requires PAM ≥ ${requiredVersion} ` +
|
|
246
|
+
`(npm @map-audio/pam-mcp-server ≥ ${requiredVersion}). ` +
|
|
247
|
+
`Update PAM to the latest build, or use a tool that doesn't depend on this action.`);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
return message;
|
|
251
|
+
}
|
|
121
252
|
processBuffer() {
|
|
122
253
|
const lines = this.buffer.split("\n");
|
|
123
254
|
// Keep the last incomplete line in the buffer
|
|
@@ -131,7 +262,7 @@ export class PluginBridge {
|
|
|
131
262
|
if (pending) {
|
|
132
263
|
this.pending.delete(resp.id);
|
|
133
264
|
if (resp.error) {
|
|
134
|
-
pending.reject(new Error(resp.error));
|
|
265
|
+
pending.reject(new Error(this.translateBridgeError(resp.error, pending.action)));
|
|
135
266
|
}
|
|
136
267
|
else {
|
|
137
268
|
pending.resolve(resp.result);
|
package/dist/bridge.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bridge.js","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAe,MAAM,UAAU,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,EAAE,EAAE,sBAAsB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"bridge.js","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":"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"}
|