init
Initialize Strudel in the browser to enable AI-powered music generation and live coding for creating TidalCycles patterns.
Instructions
Initialize Strudel in browser
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Implementation Reference
- src/server/EnhancedMCPServerFixed.ts:75-79 (registration)Registration of the 'init' tool in the getTools() method, including name, description, and empty input schema (no parameters required).{ name: 'init', description: 'Initialize Strudel in browser', inputSchema: { type: 'object', properties: {} } },
- Input schema for 'init' tool: empty object, no input parameters required.inputSchema: { type: 'object', properties: {} }
- Handler implementation in executeTool switch statement: calls StrudelController.initialize(), sets isInitialized=true, and writes any pending generated patterns.case 'init': const initResult = await this.controller.initialize(); this.isInitialized = true; // Write any pending patterns if (this.generatedPatterns.size > 0) { const lastPattern = Array.from(this.generatedPatterns.values()).pop(); if (lastPattern) { await this.controller.writePattern(lastPattern); return `${initResult}. Loaded generated pattern.`; } } return initResult;
- src/StrudelController.ts:42-92 (helper)Core initialization logic delegated by MCP handler: launches headless Chromium browser, navigates to strudel.cc, optimizes loading, sets up console monitoring and audio analyzer.async initialize(): Promise<string> { if (this.browser) { return 'Already initialized'; } this.browser = await chromium.launch({ headless: this.isHeadless, args: [ '--use-fake-ui-for-media-stream', '--disable-dev-shm-usage', '--no-sandbox', '--disable-setuid-sandbox', '--disable-gpu', '--disable-software-rasterizer' ], }); const context = await this.browser.newContext({ permissions: ['microphone'], viewport: { width: 1280, height: 720 }, reducedMotion: 'reduce', }); this._page = await context.newPage(); // Optimize page loading await this._page.route('**/*', (route) => { const resourceType = route.request().resourceType(); // Block unnecessary resources if (['image', 'font', 'media'].includes(resourceType)) { route.abort(); } else { route.continue(); } }); await this._page.goto('https://strudel.cc/', { waitUntil: 'domcontentloaded', // Changed from networkidle for faster load timeout: 15000, }); // Wait for editor with optimized timeout await this._page.waitForSelector('.cm-content', { timeout: 8000 }); // Set up console monitoring for runtime errors this.setupConsoleMonitoring(); await this.analyzer.inject(this._page); return 'Strudel initialized successfully'; }
- State flag tracking whether the browser has been initialized by the 'init' tool.private isInitialized: boolean = false;