Lab · Phase 1 · Conductor Agent
Conductor Agent
The Conductor Agent ties together dual MCP servers, the Band studio dashboard,
and a CLI for local Csound render. Vibe in natural language → conduct_band →
mapConductResultToStudioModules → hydrate localhost:5173/band →
render_csound_wav.
Meet THIRI — your personified conductor. Chat in Plan, Compose, or Cron modes at localhost:5173/conductor with optional ElevenLabs voice.
Try it
- Cursor: install skill
THIRI/lab/skills/thiri-conductor-agent/SKILL.md→~/.cursor/skills/thiri-conductor-agent/SKILL.md - CLI:
cd thiri-mcp && npm run conductor:vibe -- "gospel ballad in F minor" - Dashboard:
npm run dev:studio→ localhost:5173/band → Conductor Chat + Vibe Conduct - Conductor tab: localhost:5173/conductor — chat + ElevenLabs voice
Conductor Chat + ElevenLabs voice
Natural-language chat with rule-based intent routing (conduct, analyze, voicing, reharmonize).
Agent responses can auto-play via ElevenLabs TTS — paste key in panel or set VITE_ELEVENLABS_API_KEY locally. Never commit keys.
Dual MCP (Conductor Agent)
{
"mcpServers": {
"thiri": {
"command": "npx",
"args": ["-y", "@bluesprincemedia/thiri-mcp"],
"env": { "THIRI_API_KEY": "sk_live_…" }
},
"thiri-conductor": {
"command": "npx",
"args": ["-y", "@bluesprincemedia/thiri-mcp", "thiri-conductor-mcp"],
"env": { "THIRI_API_KEY": "sk_live_…" }
}
}
}
Optional thiri-composition for Composition IR + fluidsynth preview.
See agent recipes.
Vibe compose loop
- User prompt — e.g. "dark jazz swing in C minor"
conduct_band→ lanes (harmony, pattern, bass, drums)mapConductResultToStudioModules→ studio routes + skills- Open Band with conduct URL params · tweak in browser Csound WASM
build_csound_score→render_csound_wav→play_audio- Iterate with user feedback
Smoke proof JSON
{
"slug": "conductor-agent",
"version": "0.2.0",
"generatedAt": "2026-06-19T18:00:00Z",
"commit": "local",
"tests": {
"conductorMcpSmoke": "pass",
"conductorAgentCli": "pass",
"studioBuild": "pass",
"lastRun": "2026-06-19T18:00:00Z"
},
"artifacts": {
"skill": "THIRI/lab/skills/thiri-conductor-agent/SKILL.md",
"cli": "thiri-mcp/conductor-agent.mjs",
"npmScript": "npm run conductor:vibe",
"chatPanel": "ConductorChatPanel @ localhost:5173/band | /conductor",
"vibePanel": "VibeConductPanel @ localhost:5173/band",
"handlers": "packages/core/src/lib/conductorChatHandlers.ts",
"lastRenderArtifact": "~/.thiri/conductor-last.json"
},
"modes": {
"plan": {
"ui": "gold outline, PLAN badge",
"api": [
"POST /v2/analyze",
"POST /v2/resolve",
"POST /v2/voicing",
"POST /v2/reharmonize"
],
"sessionApply": "manual Apply to session button",
"elevenLabs": "plan summaries"
},
"compose": {
"ui": "burgundy pulse, COMPOSE badge",
"api": [
"POST /v2/conduct"
],
"sessionApply": "immediate BandSession hydrate",
"elevenLabs": "conduct summary + listen cues",
"render": "npm run conductor:vibe -- \"…\" --play"
},
"cron": {
"ui": "teal pulse, CRON badge",
"scheduler": "in-browser setInterval (tab must stay open)",
"intervalsMinutes": [
1,
5,
15,
30
],
"humanGate": true
}
},
"workflow": {
"plan": [
"handlePlanMessage(user text)",
"THIRI theory endpoints (no conduct)",
"optional Apply to session → BandSession progression/key/bpm"
],
"compose": [
"handleComposeMessage(vibe prompt)",
"conduct_band → mapConductResultToStudioModules",
"hydrate BandSession + lane deep-links",
"build_csound_score → render_csound_wav → play_audio"
]
},
"env": {
"THIRI_API_KEY": "required — proof panel or VITE_THIRI_API_KEY",
"VITE_ELEVENLABS_API_KEY": "optional — Conductor Chat TTS",
"VITE_THIRI_VOICE_ID": "optional — ElevenLabs voice override"
},
"notes": "Run: cd thiri-mcp && npm run test:conductor && cd ../THIRI/production/thiri-studio-local && npm run build && npm run dev:studio"
}
Run: cd thiri-mcp && npm run test:conductor · node conductor-agent.mjs "gospel ballad in F minor" --no-render (needs THIRI_API_KEY for live conduct)