A TypeScript MCP server for launching, controlling, and live-patching Pure Data.
Strong schema coverage with 21 well-defined tools using Zod validation. Tool names follow verb_noun pattern (pd_start_demo, pd_open_patch, etc.). Descriptions are present and substantive (avg ~150 chars), explaining WHAT and WHEN. However, parameter descriptions are sparse or missing entirely, most params lack guidance on format, constraints, or dependencies. Output schemas are not documented in the visible code. Error handling is basic (try/catch with message extraction). No tool annotations (readOnlyHint, destructiveHint) despite clear risk classifications in the spec.
Attach to an already-open MCP live-edit Pd patch by control/edit ports, optionally loading its patchPath for preview and save.
Write a live-edit bridge .pd file with known control/edit ports so the user can open it manually and Codex can attach later.
Best-effort query of Pd audio devices using the configured Pd binary.
Add one safe-palette object to the visible MCP live canvas. Use only for tiny follow-up edits; for complete musical patches, generate a full graph and call pd_live_replace_graph once.
Clear the agent-managed MCP live canvas and reset its object ids.
Connect two agent-created live objects by stable ids. Use only for small follow-up edits; prefer pd_live_replace_graph for full patch updates. Direct signal-to-dac~ connections are blocked.
Parameter descriptions missing or minimal. Most params (frequency, amplitude, x, y, args, etc.) lack guidance on format, valid ranges, or constraints. LLMs cannot infer whether 'args' accepts strings, numbers, or both, or what pattern strings must match.
Output schemas not documented. Tools return JSON via toToolResult() but no schema is visible for what fields agents should expect (e.g., pd_status returns what fields? pd_live_graph returns what structure?). Agents cannot plan downstream calls without knowing response shape.
No tool annotations despite clear risk classifications. Tools marked DESTRUCTIVE (pd_live_remove_object, pd_live_disconnect, pd_live_clear, pd_stop) or WRITE should declare destructiveHint=true. READ_ONLY tools should declare readOnlyHint=true. Agents cannot distinguish safe from risky calls.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 67 | 2025-06-18+ | v2 |
Remove an agent-created live connection by stable id, then rebuild the visible MCP live canvas.
Return the agent-managed live patch object and connection graph.
Move an agent-created live object by rebuilding the visible MCP live canvas at the new coordinates.
Remove an agent-created live object and its incident connections, then rebuild the visible MCP live canvas.
Preferred live composition path: replace the entire agent-managed live graph with a safe precomposed graph, then render it into the visible Pd GUI canvas.
Update an agent-created live object's type, arguments, or coordinates, then rebuild the visible MCP live canvas.
Launch an existing absolute .pd patch path as the MCP-managed Pd process for status, preview, save, and stop.
Return the current generated Vanilla .pd patch text.
Save the current Pd patch to disk at the active or specified path.
Send a safe raw control message to the running live patch control bus for parameter tweaks without rebuilding the canvas.
Update bounded live parameters on the running Pd demo patch.
Generate a Vanilla Pure Data demo patch, launch Pd headless by default or with gui=true, optionally from an absolute targetPath, start DSP, and prepare FUDI control.
Create and launch a visible live-edit Pd patch with an empty agent-managed canvas ready for pd_live_replace_graph.
Return Pd lifecycle state, patch path, parameters, and recent errors.
Silence and stop the currently running Pd process.
Error handling is generic. toolError() extracts only the message string. No categorization of retryable vs fatal errors, no recovery guidance. When pd_open_patch fails with 'File not found', the agent has no hint to try pd_list_audio_devices or check the path.
Regex patterns in schemas (e.g., selector pattern '^[A-Za-z_][A-Za-z0-9_.~-]*$', object id pattern '^obj-\d+$') are not explained in parameter descriptions. LLMs cannot read JSON Schema, they need the constraint stated in plain text.