@map-audio/pam-mcp-server 1.0.0 → 1.1.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 +31 -5
- package/dist/bridge.d.ts +1 -0
- package/dist/bridge.js +71 -1
- package/dist/bridge.js.map +1 -1
- package/dist/manifest.json +2968 -352
- package/dist/server.js +973 -9
- package/dist/server.js.map +1 -1
- package/package.json +1 -1
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,10 +53,26 @@ 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
|
package/dist/bridge.d.ts
CHANGED
package/dist/bridge.js
CHANGED
|
@@ -3,6 +3,65 @@ 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.4.44";
|
|
11
|
+
const NEW_ACTIONS_ADDED_IN_1_1_0 = new Set([
|
|
12
|
+
"startLooperRecord",
|
|
13
|
+
"stopLooperRecord",
|
|
14
|
+
"captureLooperNow",
|
|
15
|
+
"loadAudioToLooperTrack",
|
|
16
|
+
"requestLooperWarp",
|
|
17
|
+
"setLooperAlwaysListen",
|
|
18
|
+
"setLooperLatencyCompAuto",
|
|
19
|
+
"setLooperLatencyCompOffsetMs",
|
|
20
|
+
"setLooperLatencyCompApplyToCells",
|
|
21
|
+
"saveLooperVariation",
|
|
22
|
+
"clearLooperVariation",
|
|
23
|
+
"applyLooperVariationImmediate",
|
|
24
|
+
"queueLooperVariationOnBars",
|
|
25
|
+
"cancelQueuedLooperVariation",
|
|
26
|
+
"setLooperVariationBarSyncEnabled",
|
|
27
|
+
"setLooperVariationBarSyncIntervalBars",
|
|
28
|
+
"setCurrentLooperVariationIndex",
|
|
29
|
+
"queueVariationOnBars",
|
|
30
|
+
"cancelQueuedVariation",
|
|
31
|
+
"updateVariations",
|
|
32
|
+
"midiCC",
|
|
33
|
+
"midiProgramChange",
|
|
34
|
+
"startMidiRecording",
|
|
35
|
+
"stopMidiRecording",
|
|
36
|
+
"setMidiRecordingOverdub",
|
|
37
|
+
"removeRecordedNote",
|
|
38
|
+
"applyEnvelopeUpdate",
|
|
39
|
+
"applyLfoUpdate",
|
|
40
|
+
"applyVaryUpdate",
|
|
41
|
+
"applyMacroUpdate",
|
|
42
|
+
"applyParamSeqUpdate",
|
|
43
|
+
"applyParamSeqSequenceUpdate",
|
|
44
|
+
"setSongModeSequence",
|
|
45
|
+
"clearSongModeSequence",
|
|
46
|
+
"toggleSongMode",
|
|
47
|
+
"setSongModeLoopPoints",
|
|
48
|
+
"toggleSongModeLoop",
|
|
49
|
+
"setSongModeCrossfadeMs",
|
|
50
|
+
"setSongModePlayhead",
|
|
51
|
+
"setVariationHoldEnabled",
|
|
52
|
+
"variationHoldAllNotesOff",
|
|
53
|
+
"syncVariationHoldBindings",
|
|
54
|
+
"setMetronomeEnabled",
|
|
55
|
+
"analyzeSampleTempo",
|
|
56
|
+
"requestSamplePeaks",
|
|
57
|
+
"previewSlice",
|
|
58
|
+
"resampleSampleToBPM",
|
|
59
|
+
"restoreOriginalSample",
|
|
60
|
+
"buildSampleChain",
|
|
61
|
+
"exportSliceForCell",
|
|
62
|
+
"resampleGraphToCell",
|
|
63
|
+
"stopLiveResample",
|
|
64
|
+
]);
|
|
6
65
|
export class PluginBridge {
|
|
7
66
|
socket = null;
|
|
8
67
|
buffer = "";
|
|
@@ -114,10 +173,21 @@ export class PluginBridge {
|
|
|
114
173
|
this.pending.set(id, {
|
|
115
174
|
resolve: (v) => { clearTimeout(timer); resolve(v); },
|
|
116
175
|
reject: (e) => { clearTimeout(timer); reject(e); },
|
|
176
|
+
action,
|
|
117
177
|
});
|
|
118
178
|
this.socket.write(JSON.stringify(msg) + "\n");
|
|
119
179
|
});
|
|
120
180
|
}
|
|
181
|
+
translateBridgeError(message, action) {
|
|
182
|
+
// C++ MCPBridge::handleCommand emits this exact prefix for unrecognized actions.
|
|
183
|
+
if (message.startsWith("unknown action '") && NEW_ACTIONS_ADDED_IN_1_1_0.has(action)) {
|
|
184
|
+
return (`PAM build does not support '${action}'. ` +
|
|
185
|
+
`This action requires PAM ≥ ${MIN_PAM_VERSION_FOR_NEW_ACTIONS} ` +
|
|
186
|
+
`(npm @map-audio/pam-mcp-server ≥ 1.1.0). ` +
|
|
187
|
+
`Update PAM to the latest build, or use a tool that doesn't depend on this action.`);
|
|
188
|
+
}
|
|
189
|
+
return message;
|
|
190
|
+
}
|
|
121
191
|
processBuffer() {
|
|
122
192
|
const lines = this.buffer.split("\n");
|
|
123
193
|
// Keep the last incomplete line in the buffer
|
|
@@ -131,7 +201,7 @@ export class PluginBridge {
|
|
|
131
201
|
if (pending) {
|
|
132
202
|
this.pending.delete(resp.id);
|
|
133
203
|
if (resp.error) {
|
|
134
|
-
pending.reject(new Error(resp.error));
|
|
204
|
+
pending.reject(new Error(this.translateBridgeError(resp.error, pending.action)));
|
|
135
205
|
}
|
|
136
206
|
else {
|
|
137
207
|
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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"}
|