MilkDrop-style audio-reactive WebGL visualizer via butterchurn — ~2,000 presets, modern GLSL shaders, BPM sync for mixx-dj-mcp. FastMCP 3.4 + zero-install webapp for Claude Desktop / Cursor.
Drift inferred · capture-to-capture
No drift recorded — single capability capture; advisories appear once its surface changes.
transport — counts 2 tools · 0 res
· 0 prompts
permission surface via code analysis
tools
-
get_bpm
-
set_bpm
prompt-surface
shipped agent-instruction files + hidden-content / dangerous-code findings —
quoted from the analyzed source
analyzed commit 358a86e · analyzer v33 · 2w ago
skills & prompt files 3
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 51
network 13
- net sandraschi-butterchurn-mcp-358a86e/webapp/src/App.tsx :55
const r = await fetch("/api/health"); - net sandraschi-butterchurn-mcp-358a86e/webapp/src/components/LoggerModal.tsx :46
const r = await fetch(`/api/logs?${params}`); - net sandraschi-butterchurn-mcp-358a86e/webapp/src/components/Visualizer.tsx :13
const r = await fetch("/api/bpm"); - net sandraschi-butterchurn-mcp-358a86e/webapp/src/lib/capabilities.tsx :30
const res = await fetch("/api/capabilities"); - net sandraschi-butterchurn-mcp-358a86e/webapp/src/lib/modelPreference.ts :117
fetch(`${base}/api/tags`).then((r) => r.json()), - net sandraschi-butterchurn-mcp-358a86e/webapp/src/lib/presets.ts :32
const res = await fetch(url, { cache: "force-cache" }); - net sandraschi-butterchurn-mcp-358a86e/webapp/src/lib/provider.ts :85
const r = await fetch(`http://127.0.0.1:${p.port}${p.probe}`, { - net sandraschi-butterchurn-mcp-358a86e/webapp/src/pages/Chat.tsx :106
const r = await fetch("/api/skills"); - net sandraschi-butterchurn-mcp-358a86e/webapp/src/pages/Dashboard.tsx :44
fetch("/api/dashboard").then((r) => r.json()) as Promise<DashboardData>, - net sandraschi-butterchurn-mcp-358a86e/webapp/src/pages/Settings.tsx :36
const r = await fetch("/api/bpm"); - net sandraschi-butterchurn-mcp-358a86e/webapp/src/pages/Skills.tsx :14
queryFn: () => fetch("/api/skills").then((r) => r.json()), - net sandraschi-butterchurn-mcp-358a86e/webapp/src/pages/Tools.tsx :19
queryFn: () => fetch("/api/tools").then((r) => r.json()),
show 1 more
- net sandraschi-butterchurn-mcp-358a86e/webapp/src/visualizers/audio/useAudioEngine.ts :8
const r = await fetch("/api/bpm");
tool registrations 2
- get_bpm sandraschi-butterchurn-mcp-358a86e/src/butterchurn_mcp/server.py :28
- set_bpm sandraschi-butterchurn-mcp-358a86e/src/butterchurn_mcp/server.py :36
declared dependencies 16
- @tanstack/react-query@^5.62.8
- butterchurn@^2.6.6
- butterchurn-presets@^2.4.7
- clsx@^2.1.1
- framer-motion@^11.12.0
- lucide-react@^0.468.0
- react@^19.0.0
- react-dom@^19.0.0
- react-router-dom@^6.27.0
- @tailwindcss/vite@^4.0.0
- @types/react@^19.0.0
- @types/react-dom@^19.0.0
show 4 more
- @vitejs/plugin-react@^4.3.0
- tailwindcss@^4.0.0
- typescript@^5.6.0
- vite@^6.0.0
perm:untrusted 1
- untrusted sandraschi-butterchurn-mcp-358a86e/webapp/src/lib/modelPreference.ts :117
fetch(`${base}/api/tags`).then((r) => r.json()),