An experimental Model Context Protocol (MCP) server that enables Claude to control Strudel.cc for AI-assisted music generation, live coding, and algorithmic composition. Current State: Functional but under active development. Core features work reliably, but expect rough edges. Test coverage is at 78% with 1470 tests passing (1521 total, 51 skipped). See open issues for known limitations. - Instal
Add this skill
npx mdskills install williamzujkowski/strudel-mcp-serverComprehensive music generation MCP with 65 well-documented tools, clear examples, and thoughtful architecture
π΅ Open source MCP server for AI-powered music generation with Strudel.cc
Status: Actively developed | Experimental | Contributions welcome
An experimental Model Context Protocol (MCP) server that enables Claude to control Strudel.cc for AI-assisted music generation, live coding, and algorithmic composition.
Current State: Functional but under active development. Core features work reliably, but expect rough edges. Test coverage is at 78% with 1470 tests passing (1521 total, 51 skipped). See open issues for known limitations.
Not Production-Ready: This is experimental software under active development. Use for exploration and experimentation. Expect breaking changes, bugs, and incomplete features. See CONTRIBUTING.md to help improve it.
Explore 17 curated example patterns across 10 genres in patterns/examples/:
Each example includes pattern code, BPM, key, and description. See patterns/examples/README.md for details.
| Requirement | Version | Notes |
|---|---|---|
| Node.js | 18.x or 20.x | LTS versions recommended |
| npm | 9+ | Comes with Node.js |
| Chromium | Latest | Auto-installed by Playwright |
| Audio output | Any | Required for playback (speakers/headphones) |
Optional: Docker for containerized deployment.
npm install -g @williamzujkowski/strudel-mcp-server
# Install browser (required once)
npx playwright install chromium
# Clone repository
git clone https://github.com/williamzujkowski/strudel-mcp-server.git
cd strudel-mcp-server
# Install dependencies
npm install
# Install Chromium for browser automation
npx playwright install chromium
# Build the project
npm run build
Common commands for immediate use:
| Action | Command |
|---|---|
| Initialize browser | init |
| Create techno beat | generate_pattern with style: "techno" |
| Play pattern | play |
| Stop playback | stop |
| Get current pattern | get_pattern |
| Analyze audio | analyze |
| Save pattern | save with name: "my-pattern" |
| Undo last change | undo |
One-shot workflow:
compose with style: "dnb", key: "Am", bpm: 174, auto_play: true
# If installed globally
claude mcp add strudel strudel-mcp
# If built from source
claude mcp add strudel node /path/to/strudel-mcp-server/dist/index.js
claude chat
Then ask Claude:
| Tool | Description | Example |
|---|---|---|
init | Initialize Strudel in browser | "Initialize Strudel" |
write | Write pattern to editor | "Write pattern: s('bd*4')" |
play | Start playback | "Play the pattern" |
stop | Stop playback | "Stop playing" |
clear | Clear editor | "Clear the editor" |
get_pattern | Get current pattern | "Show current pattern" |
append | Add to pattern | "Add hi-hats" |
insert | Insert at line | "Insert at line 2" |
replace | Replace text | "Replace bd with sn" |
pause | Pause playback | "Pause" |
| Tool | Description | Options |
|---|---|---|
generate_pattern | Complete patterns | techno, house, dnb, ambient, trap, jungle, jazz, intelligent_dnb, trip_hop, boom_bap |
generate_drums | Drum patterns | All styles + complexity (0-1) |
generate_bassline | Bass patterns | techno, house, dnb, acid, dub, funk, jazz, intelligent_dnb, trip_hop, boom_bap |
generate_melody | Melodic lines | Any scale, custom length |
generate_variation | Pattern variations | subtle, moderate, extreme, glitch |
transpose | Transpose notes | Β±12 semitones |
reverse | Reverse pattern | - |
stretch | Time stretch | Factor 0.1-10 |
quantize | Quantize to grid | 1/4, 1/8, 1/16, etc. |
humanize | Add timing variation | Amount 0-1 |
| Tool | Description | Options |
|---|---|---|
generate_scale | Generate scales | major, minor, modes, pentatonic, blues |
generate_chord_progression | Chord progressions | pop, jazz, blues, rock, folk |
generate_euclidean | Euclidean rhythms | hits/steps/sound |
generate_polyrhythm | Polyrhythms | Multiple patterns |
generate_fill | Generate drum fills | All styles, 1-4 bars |
apply_scale | Apply scale to notes | Any scale |
| Tool | Description |
|---|---|
add_effect | Add audio effect (reverb, delay, etc.) |
remove_effect | Remove an effect from the chain |
set_tempo | Set BPM (60-200) |
add_swing | Add swing feel (0-1 amount) |
| Tool | Description |
|---|---|
save | Save pattern with tags |
load | Load saved pattern |
list | List all patterns |
undo | Undo last action |
redo | Redo action |
| Tool | Description |
|---|---|
list_history | Browse pattern history with timestamps and previews |
restore_history | Restore a previous pattern by ID |
compare_patterns | Compare two patterns showing line-by-line differences |
| Tool | Description |
|---|---|
analyze | Basic audio analysis (frequency, playing state) |
analyze_spectrum | FFT spectral analysis |
analyze_rhythm | Rhythm complexity analysis |
detect_tempo | BPM detection |
detect_key | Musical key detection |
validate_pattern_runtime | Validate pattern with browser error checking |
| Tool | Description |
|---|---|
compose | One-shot pattern generation with auto-play |
status | Get current browser/playback state |
diagnostics | Detailed system diagnostics |
show_browser | Bring browser window to foreground |
screenshot | Capture browser screenshot |
show_errors | Display captured console errors |
| Tool | Description |
|---|---|
performance_report | Timing metrics and bottleneck analysis |
memory_usage | Memory consumption statistics |
| Tool | Description | Options |
|---|---|---|
get_pattern_feedback | AI-powered creative feedback via Gemini | includeAudio: analyze audio (default: false), style: hint for context |
Note: Requires
GEMINI_API_KEYenvironment variable. Returns pattern complexity, estimated style, strengths, and suggestions.
Create a Simple Beat
You: Initialize Strudel and create a simple techno beat
Claude: [Initializes browser]
[Generates and writes pattern]
[Starts playback]
Pattern created:
setcpm(130)
stack(
s("bd*4"),
s("~ cp ~ cp"),
s("hh*8").gain(0.4)
).gain(0.8)
Generate a Bassline
You: Add a techno bassline in C
Claude: [Generates bassline]
[Appends to current pattern]
Added: note("c2 c2 c2 c2").s("sawtooth").cutoff(800)
Jazz Composition
You: Create a jazz progression in F major with a walking bass
Claude: Generated progression: "Gm7" "C7" "Fmaj7"
Pattern:
stack(
note("Gm7" "C7" "Fmaj7").struct("1 ~ ~ ~").s("piano"),
note("g2 c2 f2").s("sine").gain(0.7)
)
Drum & Bass Track
You: Generate a complete drum & bass track at 174 BPM
Claude: [Creates multi-layer pattern with drums, bass, and pads]
// dnb pattern in C at 174 BPM
setcpm(174)
stack(
// Drums
s("bd ~ ~ [bd bd] ~ ~ bd ~, ~ ~ cp ~ ~ cp ~ ~").fast(2),
// Bass
note("c1 ~ ~ c2 ~ c1 ~ ~").s("square").cutoff(400),
// Pads (atmospheric)
note("c3 eb3 g3 bb3").s("sawtooth")
.attack(2).release(4).room(0.8).gain(0.6)
)
Live Audio Analysis
You: Analyze what's playing and show me the frequency breakdown
Claude: Audio Analysis Results:
{
"connected": true,
"features": {
"average": 78.5,
"peak": 180,
"peakFrequency": 120,
"bass": 145,
"mid": 82,
"treble": 45,
"isPlaying": true,
"brightness": "balanced"
}
}
Strong bass presence detected - typical for techno/house patterns.
Pattern Variations
You: Create a glitchy variation of the current pattern
Claude: [Applies glitch transformation]
Added: .sometimes(x => x.chop(8).rev).rarely(x => x.speed(-1))
Layered Ambient Track
You: Create an ambient soundscape with multiple layers
Claude: [Generates complex multi-layer pattern]
setcpm(90)
stack(
// Deep bass drone
note("c1").s("sine").attack(4).release(8).gain(0.5),
// Texture pad
note("c3 eb3 g3").s("sawtooth")
.attack(2).release(6).room(0.9).gain(0.4),
// Sparse percussion
s("bd ~ ~ ~, ~ ~ ~ hh:8").room(0.9).gain(0.3),
// Melodic sparkles
note("c5 g5 eb5 bb5").struct("~ 1 ~ 1 ~ ~ 1 ~")
.s("triangle").delay(0.5).room(0.8).gain(0.3)
)
Save and Load Patterns
You: Save this pattern as "techno-groove-1" with tags "techno" and "experimental"
Claude: Pattern saved as "techno-groove-1"
---
You: List all my techno patterns
Claude: Saved patterns with tag "techno":
β’ techno-groove-1 [techno, experimental] - 2025-10-23T19:30:00.000Z
β’ acid-bassline [techno, acid] - 2025-10-23T18:15:00.000Z
---
You: Load "acid-bassline"
Claude: Loaded pattern "acid-bassline"
[Pattern written to editor]
Generate Euclidean Rhythms
You: Create a 5/8 euclidean rhythm with kick drum
Claude: Generated Euclidean rhythm (5/8)
Pattern: s("bd").struct("1 ~ 1 ~ 1 1 ~ 1")
Complex Polyrhythms
You: Generate a polyrhythm with kick (4/16), snare (7/16), and hi-hat (3/16)
Claude: Generated polyrhythm
stack(
s("bd").euclid(4, 16),
s("cp").euclid(7, 16),
s("hh").euclid(3, 16)
)
AI-Assisted Composition
You: Analyze the mood of my current pattern and suggest complementary elements
Claude: [Analyzes pattern structure and audio features]
Your pattern has:
- Energetic rhythm (130 BPM)
- Strong bass presence
- Minimal melodic content
Suggestions:
1. Add arpeggiated synth for movement
2. Include occasional breaks/fills
3. Layer atmospheric pad for depth
Would you like me to add any of these?
You: Add an arpeggiated synth in C minor
Claude: [Generates and adds]
note("c4 eb4 g4 bb4 c5").struct("1 1 1 1 1 1 1 1")
.s("triangle").delay(0.25).room(0.3).gain(0.5)
All tools have been tested with real Strudel.cc interaction:
# Run integration tests
npm run test:integration
# Run browser tests
node tests/strudel-integration.js
# Test results: 1470/1521 tests passing (96.6%), 51 skipped (browser tests in CI)
{
"headless": false, // Set true for background operation
"strudel_url": "https://strudel.cc/",
"patterns_dir": "./patterns",
"audio_analysis": {
"fft_size": 2048,
"smoothing": 0.8
}
}
The Strudel MCP Server is built with a modular architecture that separates concerns and enables robust music generation:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Claude AI β
β (MCP Client) β
βββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββ
β MCP Protocol (stdio)
β
βββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββ
β EnhancedMCPServerFixed β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Tool Request Handler β β
β β - Validates inputs β β
β β - Routes to appropriate service β β
β β - Handles errors gracefully β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
βββββββββ¬βββββββββββββ¬βββββββββββββ¬ββββββββββββ¬βββββββββββββββ
β β β β
ββββββΌβββββ βββββΌβββββ βββββΌβββββ ββββΌβββββββ
β Strudel β β Music β βPattern β β Pattern β
βControllerβ β Theory β βGeneratorβ β Store β
ββββββ¬βββββ ββββββββββ ββββββββββ βββββββββββ
β
ββββββΌβββββββββββββββββββββββββββββ
β Playwright Browser β
β ββββββββββββββββββββββββββββ β
β β Strudel.cc Website β β
β β ββββββββββββββββββββββ β β
β β β CodeMirror Editor β β β
β β ββββββββββββββββββββββ β β
β β ββββββββββββββββββββββ β β
β β β Audio Context β β β
β β β + Web Audio API β β β
β β ββββββββββ¬ββββββββββββ β β
β βββββββββββββΌβββββββββββββββ β
ββββββββββββββββΌβββββββββββββββββββ
β
βββββββββΌβββββββββ
β Audio Analyzer β
β - FFT Analysisβ
β - Frequency β
β - Spectral β
ββββββββββββββββββ
src/server/EnhancedMCPServerFixed.ts)Main MCP server implementation handling:
Key Features:
- Pattern caching before browser init
- Undo/redo stack management
- Session history tracking
- Generated pattern storage
- Safe fallback mechanisms
src/StrudelController.ts)Browser automation layer using Playwright:
// Example: Optimized pattern writing
async writePattern(pattern: string) {
await this.page.evaluate((newPattern) => {
const editor = document.querySelector('.cm-content');
const view = editor.__view;
view.dispatch({
changes: { from: 0, to: view.state.doc.length, insert: newPattern }
});
}, pattern);
}
src/AudioAnalyzer.ts)Real-time audio analysis via Web Audio API injection:
Features provided:
- average: Overall amplitude (0-255)
- peak: Maximum amplitude
- peakFrequency: Dominant frequency in Hz
- bass/mid/treble: Band-specific amplitudes
- brightness: Timbral classification
- isPlaying: Boolean playback state
src/services/MusicTheory.ts)Music theory engine providing:
Supported scales:
major, minor, dorian, phrygian, lydian, mixolydian,
aeolian, locrian, pentatonic, blues, chromatic,
wholetone, harmonic_minor, melodic_minor
src/services/PatternGenerator.ts)AI-powered pattern creation:
Example generation:
generateCompletePattern('techno', 'C', 130)
β Multi-layer pattern with drums, bass, chords, melody
src/PatternStore.ts)Persistent pattern storage:
strudel-mcp-server/
βββ src/
β βββ server/
β β βββ EnhancedMCPServer.ts # Original implementation
β β βββ EnhancedMCPServerFixed.ts # Production version
β βββ services/
β β βββ MusicTheory.ts # Theory engine
β β βββ PatternGenerator.ts # Pattern creation
β βββ utils/
β β βββ Logger.ts # Logging utility
β βββ types/
β β βββ index.ts # TypeScript types
β βββ StrudelController.ts # Browser automation
β βββ AudioAnalyzer.ts # Audio analysis
β βββ PatternStore.ts # Pattern persistence
β βββ index.ts # Entry point
βββ tests/
β βββ browser-test.js # Browser integration
β βββ integration.test.js # Integration tests
β βββ manual-test.js # Manual testing
β βββ mcp-tools.test.ts # MCP tool tests
β βββ strudel-integration.js # Full integration
βββ patterns/ # Saved patterns
βββ config.json # Server configuration
βββ package.json # Dependencies
βββ tsconfig.json # TypeScript config
Tool Invocation
Claude β MCP Protocol β EnhancedMCPServerFixed
Pattern Generation (without browser)
Server β PatternGenerator β MusicTheory β Pattern String
Pattern Execution (with browser)
Server β StrudelController β Playwright β Strudel.cc
Audio Analysis
Strudel.cc β Web Audio API β AudioAnalyzer β Feature Data
| Operation | Latency | Notes |
|---|---|---|
| Pattern Generation | { | |
| // Implementation | ||
return Result: ${param1}; | ||
| } |
4. **Test the tool**:
```bash
# Build
npm run build
# Test via MCP
echo '{"jsonrpc":"2.0","method":"tools/call","params":{"name":"my_new_tool","arguments":{"param1":"test"}},"id":2}' | node dist/index.js
# Run with Jest
npm test
# Watch mode
npm run test:watch
# Full integration with real browser
npm run test:integration
# This tests:
# - Browser initialization
# - Pattern generation
# - Audio analysis
# - Pattern storage
# - All 65 tools
# Development mode
npm run dev
# In another terminal
claude mcp add strudel-dev node $(pwd)/dist/index.js
claude chat
# Then interact with Claude
TypeScript Configuration
// tsconfig.json
{
"compilerOptions": {
"strict": true, // Strict type checking
"esModuleInterop": true, // Better module compatibility
"target": "ES2020", // Modern JavaScript
"module": "ES2020", // ES modules
"moduleResolution": "node"
}
}
Linting & Formatting
# ESLint
npm run lint
# Prettier
npm run format
# Pre-commit hooks recommended
Enable Debug Logging
# Set DEBUG environment variable
DEBUG=strudel:* npm start
# Or specific modules
DEBUG=strudel:controller npm start
DEBUG=strudel:audio npm start
VS Code Launch Configuration
{
"type": "node",
"request": "launch",
"name": "Debug MCP Server",
"program": "${workspaceFolder}/dist/index.js",
"preLaunchTask": "npm: build",
"console": "integratedTerminal",
"env": {
"DEBUG": "strudel:*"
}
}
Playwright Debugging
// In StrudelController.ts
this.browser = await chromium.launch({
headless: false, // See the browser
devtools: true, // Open DevTools
slowMo: 100 // Slow down actions
});
The server includes built-in performance monitoring:
// Access performance metrics
You: Show me performance metrics
Claude: Performance Report:
{
"averageLatency": {
"init": "3.2s",
"write": "52ms",
"play": "105ms",
"analyze": "18ms"
},
"cacheHitRate": "85%",
"totalOperations": 1247,
"bottlenecks": [
{"tool": "init", "avgTime": 3200, "calls": 1},
{"tool": "write", "avgTime": 52, "calls": 156}
]
}
Fork the repository
git clone https://github.com/YOUR_USERNAME/strudel-mcp-server.git
Create a feature branch
git checkout -b feature/my-new-feature
Make your changes
Commit with meaningful messages
git commit -m "feat: Add support for custom scale generation"
Follow Conventional Commits:
feat: New featurefix: Bug fixdocs: Documentation changesrefactor: Code refactoringtest: Adding testschore: Maintenance tasksPush and create PR
git push origin feature/my-new-feature
Then create a Pull Request on GitHub with:
# 1. Update version in package.json
npm version patch # or minor/major
# 2. Update CHANGELOG.md
# Add entry for new version
# 3. Build and test
npm run build
npm test
npm run test:integration
# 4. Commit version bump
git add .
git commit -m "chore: Bump version to X.Y.Z"
# 5. Create git tag
git tag vX.Y.Z
# 6. Push to GitHub
git push origin main --tags
# 7. Publish to npm (if you have access)
npm publish --access public
# 8. Create GitHub release
gh release create vX.Y.Z --generate-notes
# Build development image
docker build -t strudel-mcp:dev .
# Run with volume mount for hot reload
docker run -it --rm \
-v $(pwd)/src:/app/src \
-v $(pwd)/patterns:/app/patterns \
strudel-mcp:dev
# Run tests in container
docker run -it --rm strudel-mcp:dev npm test
# Logging level
LOG_LEVEL=debug # debug, info, warn, error
# Performance monitoring
ENABLE_PERF_MONITORING=true
# Pattern storage
PATTERNS_DIR=./patterns
# Browser configuration
HEADLESS=false
BROWSER_TIMEOUT=15000
# Audio analysis
FFT_SIZE=1024
SMOOTHING=0.8
Version 2 (moderate): original.every(4, x => x.rev).sometimes(x => x.fast(2))
Version 3 (glitchy): original.sometimes(x => x.chop(8).rev).rarely(x => x.speed(-1))
### Performance Optimization Tips
**Pattern Caching**
// The server caches patterns intelligently: // - Generated patterns stored before browser init // - Editor content cached for 100ms // - Audio analysis cached for 50ms
// For fastest performance:
**Headless Mode**
```json
// In config.json:
{
"headless": true, // Faster, no GUI
"strudel_url": "https://strudel.cc/",
"patterns_dir": "./patterns"
}
Workflow Automation
You: Create a complete track:
1. Start with techno drums at 130 BPM
2. Add acid bassline in E
3. Layer ambient pads
4. Save as "track-001" with tags "techno", "acid", "experimental"
Claude: [Executes full workflow]
[Initializes browser]
[Generates drum pattern]
[Adds bassline]
[Layers pads]
[Saves with metadata]
Complete! Pattern saved as "track-001"
Audio-Reactive Composition
You: Monitor the audio and suggest adjustments based on frequency balance
Claude: [Analyzes current playback]
Analysis shows:
- Bass: 180 (strong)
- Mid: 45 (weak)
- Treble: 30 (weak)
Recommendations:
1. Reduce bass gain by 20%
2. Add mid-range melodic content
3. Include hi-hat pattern for treble
Apply changes? [Yes/No]
Dynamic Transformations
You: Apply these transformations in sequence:
1. Transpose up 3 semitones
2. Add 10% humanization
3. Apply reverb with 0.6 room size
4. Every 4th cycle, reverse the pattern
Claude: [Applies transformations]
Final pattern:
[original]
.transpose(3)
.nudge(rand.range(-0.1, 0.1))
.room(0.6)
.every(4, x => x.rev)
Conditional Logic
You: Create a pattern that evolves:
- Bars 1-4: Simple kick pattern
- Bars 5-8: Add snare
- Bars 9-16: Add full drum kit
- Then loop with variations
Claude: [Generates evolving pattern]
s("bd*4")
.struct("1 ~ ~ ~")
.mask("/4") // First 4 bars
.stack(
s("~ cp ~ cp")
.mask("/8") // Bars 5-8
)
// Full complexity from bar 9
.every(8, x => x.sometimes(y => y.fast(2)))
All patterns are validated before execution:
Found a vulnerability? Please open a security issue or email the maintainer directly. Do not disclose publicly until patched.
Symptom: Error: Browser not initialized or Chromium launch fails
Solutions:
# Install Chromium for Playwright
npx playwright install chromium
# If that fails, try installing all browsers
npx playwright install
# Check Playwright installation
npx playwright --version
# For Linux, install dependencies
sudo npx playwright install-deps chromium
Symptom: Audio analysis shows connected: false
Solutions:
Ensure pattern is playing first:
You: Play the pattern, wait 2 seconds, then analyze
Reinitialize the browser:
You: Stop, close the browser, reinitialize, and try again
Check audio context activation:
Symptom: Pattern doesn't play or shows errors in console
Solutions:
Common issues:
1. Missing quotes: s(bd*4) β s("bd*4")
2. Unmatched parentheses: stack(s("bd")) β stack(s("bd")))
3. Invalid note names: note("h2") β note("c2")
Test with minimal pattern first:
s("bd*4")
Then build complexity gradually.
Symptom: Claude can't find the server or tools
Solutions:
# Verify server is built
npm run build
# Check if server responds
echo '{"jsonrpc":"2.0","method":"tools/list","id":1}' | node dist/index.js
# Should return JSON with 65 tools
# Reinstall MCP server in Claude
claude mcp remove strudel
claude mcp add strudel node $(pwd)/dist/index.js
# Restart Claude
claude chat
Symptom: Operations take longer than expected
Solutions:
Enable caching (default, but verify):
Use headless mode for faster operation:
// config.json
{ "headless": true }
Batch operations:
Instead of:
- Add drums
- Add bass
- Add melody
Do:
- Generate complete pattern with drums, bass, and melody
Reduce browser overhead:
Symptom: save command fails or patterns don't persist
Solutions:
# Check patterns directory exists
ls -la ./patterns
# Create manually if needed
mkdir -p ./patterns
# Verify write permissions
touch ./patterns/test.json
rm ./patterns/test.json
# Check for invalid pattern names
# Valid: "techno-beat-1", "my_pattern", "track001"
# Invalid: "pattern/with/slashes", "name:with:colons"
# Keyboard shortcut uses Meta (Cmd) key
# Already handled by ControlOrMeta
# If Chromium crashes on M1/M2:
npx playwright install chromium --with-deps
# Install system dependencies
sudo npx playwright install-deps chromium
# If running in Docker/headless environment:
# Ensure config.json has headless: true
# Use PowerShell or Git Bash
# Paths should use forward slashes in config.json
# If Chromium doesn't launch:
npx playwright install chromium
Enable Verbose Logging
# Set environment variable
DEBUG=* node dist/index.js
# Or in Claude:
You: Enable detailed logging for the next operation
Check Browser State
You: Show me the current browser initialization state
and any cached patterns
Claude: Browser state:
- Initialized: true
- Cached patterns: 2
- Undo stack depth: 5
- Last operation: write_pattern (2.5s ago)
Validate Pattern Syntax
You: Before playing, validate this pattern syntax:
s("bd*4, ~ cp ~ cp")
Claude: [Checks syntax]
Valid Strudel pattern.
Ready to play.
If you encounter issues not covered here:
npm run test:integrationDEBUG=* npm startWe need your help! This project is actively developed and welcomes contributions of all kinds:
git checkout -b feature/amazing-feature)npm test)git commit -m 'fix: resolve audio analysis bug')git push origin feature/amazing-feature)First time contributor? Look for issues labeled good-first-issue or help-wanted.
We review PRs promptly and welcome contributors of all skill levels. See DEVELOPMENT.md for detailed setup instructions.
MIT License - see LICENSE file
v2.4.0 - Open Source | Experimental | Report Issues | Contribute
This project is under active development. Core features work, but expect bugs and breaking changes. Not recommended for production use.
Install via CLI
npx mdskills install williamzujkowski/strudel-mcp-serverStrudel MCP Server is a free, open-source AI agent skill. An experimental Model Context Protocol (MCP) server that enables Claude to control Strudel.cc for AI-assisted music generation, live coding, and algorithmic composition. Current State: Functional but under active development. Core features work reliably, but expect rough edges. Test coverage is at 78% with 1470 tests passing (1521 total, 51 skipped). See open issues for known limitations. - Instal
Install Strudel MCP Server with a single command:
npx mdskills install williamzujkowski/strudel-mcp-serverThis downloads the skill files into your project and your AI agent picks them up automatically.
Strudel MCP Server works with Claude Code, Claude Desktop, Cursor, Vscode Copilot, Windsurf, Continue Dev, Gemini Cli, Amp, Roo Code, Goose. Skills use the open SKILL.md format which is compatible with any AI coding agent that reads markdown instructions.