@splitfireai / agent / commits / 10621e6

Document how embedding apps supply their own stems

Hosts decide what stems mean through a client-supplied demucs MCP server, or by returning no built-in servers from their Profile. The README and AGENTS.md now say so, and name the two result shapes the stem hooks read. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

Seto committed Oct 11, 2026 at 19:04 UTC 10621e6371085d20d7a25e4358366bc17b3d335e
2 files changed +9 -1
.agents/AGENTS.md
+1 -1
@@ -21,7 +21,7 @@ cargo test --locked
21
22 This crate holds only the *music* part of the agent. The ACP server, session/turn loop, approval, workspace tools (`read_file`, `write_file`, `run_command`, ...), terminal UI and MCP layer all come from the Onde Agent Platform crates (`ed-acp`, `ed-acp-tui`, `ed-mcp`, from the `onde-ed` workspace). Look there for anything protocol- or session-related; the README says it is checked out next to this repo.
23
24 -- `src/profile.rs`: `SplitFire` implements `ed_acp::Profile`. It is the single wiring point: identity (`INFO`, env prefix `SPLITFIRE`), system prompt, toolsets (`WorkspaceTools` + `MusicTools`), slash commands, and the lazily started built-in `demucs --mcp` server (`SharedServer`; a client-supplied MCP server named `demucs` wins).
24 +- `src/profile.rs`: `SplitFire` implements `ed_acp::Profile`. It is the single wiring point: identity (`INFO`, env prefix `SPLITFIRE`), system prompt, toolsets (`WorkspaceTools` + `MusicTools`), slash commands, and the lazily started built-in `demucs --mcp` server (`SharedServer`; a client-supplied MCP server named `demucs` wins). Embedding apps use that: the separator passes its own `--mcp` server, and KaroKowe Jam wraps `SplitFire` and returns no built-in servers.
25 - `src/prompt.rs`: system prompt and slash commands (`/analyze`, `/chords`, `/practice`, `/stems` only when separation is available).
26 - `src/tools/`: `MusicTools` is one `Toolset` exposing six `theory_*` tools, `analyze_audio` and `list_separations`. All are read-only and never prompt for approval. New tools need an entry in `definitions()`, `handles()` and `describe()`.
27 - `src/theory/` (pitch, interval, scale, chord, key, tempo) and `src/audio/` (symphonia decode, loudness/tempo/key analysis) are the pure computation behind the tools. The design principle is that the model calls these instead of recalling answers, so results must be exact (correct enharmonic spelling, e.g. C# major has E# and B#).
README.md
+8
@@ -50,6 +50,14 @@ prompt tells you how large the download is. If `demucs` is missing or fails to s
50 logs one line and carries on without it. An MCP server named `demucs` supplied by your editor
51 takes precedence. `SPLITFIRE_MCP_DEMUCS=off` disables it.
52
53 +Apps that embed SplitFire decide what stems mean the same way. They pass a `demucs` MCP server of
54 +their own in `session/new`, or return no built-in servers from their `Profile` and write their own
55 +stems guidance. The SplitFire AI Audio Separator supplies its own executable in `--mcp` mode on
56 +its on-device engine; KaroKowe Jam supplies none and points users at its in-app flow. The stem
57 +hooks only check the tool name `mcp__demucs__separate_stems` and the `list_models` and
58 +`separate_stems` result shapes (`structuredContent.models[]{id,size_mb,cached}` and
59 +`structuredContent.stems[].path`).
60 +
61 Separate only music you have the right to work with.
62
63 ### Other MCP servers