From 012fb3260c76add75fd386247d69465bf09fe318 Mon Sep 17 00:00:00 2001 From: Jonathan Hefner Date: Thu, 1 Jan 2026 10:47:06 -0600 Subject: [PATCH] Add sheet-music-server example MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Demo MCP App showcasing ABC notation rendering and audio playback with: - Server-side ABC notation validation - Built-in audio player with play/pause and loop controls - Sheet music visualization using abcjs library 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- examples/sheet-music-server/README.md | 84 ++++++++++++ examples/sheet-music-server/mcp-app.html | 27 ++++ examples/sheet-music-server/package.json | 34 +++++ examples/sheet-music-server/server.ts | 119 +++++++++++++++++ examples/sheet-music-server/src/global.css | 12 ++ examples/sheet-music-server/src/mcp-app.css | 87 +++++++++++++ examples/sheet-music-server/src/mcp-app.ts | 120 ++++++++++++++++++ .../sheet-music-server/src/server-utils.ts | 110 ++++++++++++++++ examples/sheet-music-server/tsconfig.json | 19 +++ examples/sheet-music-server/vite.config.ts | 24 ++++ package-lock.json | 108 ++++++++++------ tests/e2e/servers.spec.ts | 1 + .../servers.spec.ts-snapshots/sheet-music.png | Bin 0 -> 49098 bytes 13 files changed, 709 insertions(+), 36 deletions(-) create mode 100644 examples/sheet-music-server/README.md create mode 100644 examples/sheet-music-server/mcp-app.html create mode 100644 examples/sheet-music-server/package.json create mode 100644 examples/sheet-music-server/server.ts create mode 100644 examples/sheet-music-server/src/global.css create mode 100644 examples/sheet-music-server/src/mcp-app.css create mode 100644 examples/sheet-music-server/src/mcp-app.ts create mode 100644 examples/sheet-music-server/src/server-utils.ts create mode 100644 examples/sheet-music-server/tsconfig.json create mode 100644 examples/sheet-music-server/vite.config.ts create mode 100644 tests/e2e/servers.spec.ts-snapshots/sheet-music.png diff --git a/examples/sheet-music-server/README.md b/examples/sheet-music-server/README.md new file mode 100644 index 00000000..0eba9ff8 --- /dev/null +++ b/examples/sheet-music-server/README.md @@ -0,0 +1,84 @@ +# Example: Sheet Music Server + +A demo MCP App that renders [ABC notation](https://en.wikipedia.org/wiki/ABC_notation) as sheet music with interactive audio playback using the [abcjs](https://www.abcjs.net/) library. + + + + + + +
Twinkle, Twinkle Little StarPlaying on repeat
+ +## Features + +- **Audio Playback**: Built-in audio player with play/pause and loop controls +- **Sheet Music Rendering**: Displays ABC notation as properly formatted sheet music + +## Running + +1. Install dependencies: + + ```bash + npm install + ``` + +2. Build and start the server: + + ```bash + npm run start:http # for Streamable HTTP transport + # OR + npm run start:stdio # for stdio transport + ``` + +3. View using the [`basic-host`](https://github.com/modelcontextprotocol/ext-apps/tree/main/examples/basic-host) example or another MCP Apps-compatible host. + +### Tool Input + +When calling the `play-sheet-music` tool, provide ABC notation: + +```json +{ + "abcNotation": "X:1\nT:C Major Scale\nM:4/4\nL:1/4\nK:C\nC D E F | G A B c |" +} +``` + +#### ABC Notation Examples + +**C Major Scale:** + +```abc +X:1 +T:C Major Scale +M:4/4 +L:1/4 +K:C +C D E F | G A B c | +``` + +**Twinkle, Twinkle Little Star:** + +```abc +X:1 +T:Twinkle, Twinkle Little Star +M:4/4 +L:1/4 +K:C +C C G G | A A G2 | F F E E | D D C2 | +G G F F | E E D2 | G G F F | E E D2 | +C C G G | A A G2 | F F E E | D D C2 | +``` + +## Architecture + +### Server (`server.ts`) + +Exposes a single `play-sheet-music` tool that accepts: + +- `abcNotation`: ABC notation string to render + +The tool validates the ABC notation server-side using the abcjs parser and returns any parse errors. The actual rendering happens client-side when the UI receives the tool input. + +### App (`src/mcp-app.ts`) + +- Receives ABC notation via `ontoolinput` handler +- Uses abcjs for audio playback controls and sheet music rendering (in `renderAbc()`) diff --git a/examples/sheet-music-server/mcp-app.html b/examples/sheet-music-server/mcp-app.html new file mode 100644 index 00000000..f9b53022 --- /dev/null +++ b/examples/sheet-music-server/mcp-app.html @@ -0,0 +1,27 @@ + + + + + + + Sheet Music Viewer + + +
+
+
+ +
+ Waiting for notation... +
+ +
+
+ +
+
+
+ + + + diff --git a/examples/sheet-music-server/package.json b/examples/sheet-music-server/package.json new file mode 100644 index 00000000..a2cd1ca0 --- /dev/null +++ b/examples/sheet-music-server/package.json @@ -0,0 +1,34 @@ +{ + "name": "sheet-music-server", + "version": "1.0.0", + "private": true, + "type": "module", + "scripts": { + "build": "tsc --noEmit && cross-env INPUT=mcp-app.html vite build", + "watch": "cross-env INPUT=mcp-app.html vite build --watch", + "serve:http": "bun server.ts", + "serve:stdio": "bun server.ts --stdio", + "start": "npm run start:http", + "start:http": "cross-env NODE_ENV=development npm run build && npm run serve:http", + "start:stdio": "cross-env NODE_ENV=development npm run build && npm run serve:stdio", + "dev": "cross-env NODE_ENV=development concurrently 'npm run watch' 'npm run serve:http'" + }, + "dependencies": { + "@modelcontextprotocol/ext-apps": "../..", + "@modelcontextprotocol/sdk": "^1.24.0", + "abcjs": "^6.4.4", + "zod": "^4.1.13" + }, + "devDependencies": { + "@types/cors": "^2.8.19", + "@types/express": "^5.0.0", + "@types/node": "^22.0.0", + "concurrently": "^9.2.1", + "cors": "^2.8.5", + "cross-env": "^7.0.3", + "express": "^5.1.0", + "typescript": "^5.9.3", + "vite": "^6.0.0", + "vite-plugin-singlefile": "^2.3.0" + } +} diff --git a/examples/sheet-music-server/server.ts b/examples/sheet-music-server/server.ts new file mode 100644 index 00000000..d6da53f2 --- /dev/null +++ b/examples/sheet-music-server/server.ts @@ -0,0 +1,119 @@ +import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import type { + CallToolResult, + ReadResourceResult, +} from "@modelcontextprotocol/sdk/types.js"; +import fs from "node:fs/promises"; +import path from "node:path"; +import { z } from "zod"; +import ABCJS from "abcjs"; +import { + RESOURCE_MIME_TYPE, + RESOURCE_URI_META_KEY, + registerAppResource, + registerAppTool, +} from "@modelcontextprotocol/ext-apps/server"; +import { startServer } from "./src/server-utils.js"; + +const DIST_DIR = path.join(import.meta.dirname, "dist"); + +const DEFAULT_ABC_NOTATION_INPUT = `X:1 +T:Twinkle, Twinkle Little Star +M:4/4 +L:1/4 +K:C +C C G G | A A G2 | F F E E | D D C2 | +G G F F | E E D2 | G G F F | E E D2 | +C C G G | A A G2 | F F E E | D D C2 |`; + +/** + * Creates a new MCP server instance with the sheet music tool and resource. + */ +function createServer(): McpServer { + const server = new McpServer({ + name: "Sheet Music Server", + version: "1.0.0", + }); + + const resourceUri = "ui://sheet-music/mcp-app.html"; + + // Register the play-sheet-music tool. + // Validates ABC notation server-side, then the client renders via ontoolinput. + registerAppTool( + server, + "play-sheet-music", + { + title: "Play Sheet Music", + description: + "Plays music from ABC notation with audio playback and visual sheet music. " + + "Use this to compose original songs (for birthdays, holidays, or any occasion) " + + "or perform well-known tunes (folk songs, nursery rhymes, hymns, classical melodies). " + + "For accurate renditions of well-known tunes, look up the ABC notation from " + + "abcnotation.com or thesession.org rather than recalling from memory.", + inputSchema: z.object({ + abcNotation: z + .string() + .default(DEFAULT_ABC_NOTATION_INPUT) + .describe( + "ABC notation string to render as sheet music with audio playback", + ), + }), + _meta: { [RESOURCE_URI_META_KEY]: resourceUri }, + }, + async ({ abcNotation }): Promise => { + // Validate ABC notation using abcjs parser + const [{ warnings }] = ABCJS.parseOnly(abcNotation); + + // Check for parse warnings (abcjs reports errors as warnings) + if (warnings && warnings.length > 0) { + // Strip HTML markup from warning messages + const messages = warnings.map((w) => w.replace(/<[^>]*>/g, "")); + const error = `Invalid ABC notation:\n${messages.join("\n")}`; + return { + isError: true, + content: [{ type: "text", text: error }], + }; + } + + return { + content: [{ type: "text", text: "Input parsed successfully." }], + }; + }, + ); + + // Register the UI resource that serves the bundled HTML/JS/CSS. + registerAppResource( + server, + resourceUri, + resourceUri, + { mimeType: RESOURCE_MIME_TYPE, description: "Sheet Music Viewer UI" }, + async (): Promise => { + const html = await fs.readFile( + path.join(DIST_DIR, "mcp-app.html"), + "utf-8", + ); + + return { + contents: [ + { + uri: resourceUri, + mimeType: RESOURCE_MIME_TYPE, + text: html, + _meta: { + ui: { + csp: { + // Allow loading soundfonts for audio playback + connectDomains: ["https://paulrosen.github.io"], + }, + }, + }, + }, + ], + }; + }, + ); + + return server; +} + +startServer(createServer); diff --git a/examples/sheet-music-server/src/global.css b/examples/sheet-music-server/src/global.css new file mode 100644 index 00000000..97cda440 --- /dev/null +++ b/examples/sheet-music-server/src/global.css @@ -0,0 +1,12 @@ +* { + box-sizing: border-box; +} + +html, body { + font-family: system-ui, -apple-system, sans-serif; + font-size: 1rem; +} + +code { + font-size: 1em; +} diff --git a/examples/sheet-music-server/src/mcp-app.css b/examples/sheet-music-server/src/mcp-app.css new file mode 100644 index 00000000..48435e34 --- /dev/null +++ b/examples/sheet-music-server/src/mcp-app.css @@ -0,0 +1,87 @@ +:root { + --color-bg: #ffffff; + --color-text: #1f2937; + --color-text-muted: #6b7280; + --color-primary: #2563eb; + --color-success: #10b981; + --color-danger: #ef4444; + --color-card-bg: #f9fafb; + --color-border: #e5e7eb; +} + +@media (prefers-color-scheme: dark) { + :root { + --color-bg: #111827; + --color-text: #f9fafb; + --color-text-muted: #9ca3af; + --color-primary: #3b82f6; + --color-success: #34d399; + --color-danger: #f87171; + --color-card-bg: #1f2937; + --color-border: #374151; + } +} + +html, +body { + margin: 0; + padding: 0; + background: var(--color-bg); + color: var(--color-text); +} + +.main { + width: 100%; + margin: 0 auto; + padding: 8px; + display: flex; + flex-direction: column; + gap: 8px; +} + +/* Header */ +#audio-controls:empty { + display: none; +} + +#audio-controls:not(:empty) ~ #status { + display: none; +} + +.audio-controls { + width: 100%; + + .abcjs-inline-audio { + border-radius: 8px; + + /* Make loop button active state more visible */ + .abcjs-midi-loop.abcjs-pushed { + background-color: var(--color-success) !important; + border-color: var(--color-success) !important; + } + } +} + +.status { + font-size: 0.875rem; + color: var(--color-text-muted); +} + +.status.error { + color: var(--color-danger); +} + + +/* Sheet Music Section */ +.sheet-section { + background: var(--color-card-bg); + border-radius: 8px; + padding: 16px; + border: 1px solid var(--color-border); + min-height: 500px; + + .sheet-music-container { + width: 100%; + overflow-x: auto; + } +} diff --git a/examples/sheet-music-server/src/mcp-app.ts b/examples/sheet-music-server/src/mcp-app.ts new file mode 100644 index 00000000..a6efadeb --- /dev/null +++ b/examples/sheet-music-server/src/mcp-app.ts @@ -0,0 +1,120 @@ +/** + * @file Sheet Music App - renders ABC notation with abcjs and provides audio playback + */ +import { App } from "@modelcontextprotocol/ext-apps"; +import ABCJS from "abcjs"; +import "abcjs/abcjs-audio.css"; +import "./global.css"; +import "./mcp-app.css"; + +const log = { + info: console.log.bind(console, "[APP]"), + error: console.error.bind(console, "[APP]"), +}; + +// State management +interface AppState { + visualObj: ABCJS.TuneObject[] | null; + synthControl: ABCJS.SynthObjectController | null; +} + +const state: AppState = { + visualObj: null, + synthControl: null, +}; + +// DOM element references +const mainEl = document.querySelector(".main") as HTMLElement; +const statusEl = document.getElementById("status")!; +const sheetMusicEl = document.getElementById("sheet-music")!; +const audioControlsEl = document.getElementById("audio-controls")!; + +/** + * Updates the status display. + */ +function setStatus(text: string, isError = false): void { + statusEl.textContent = text; + statusEl.classList.toggle("error", isError); +} + +/** + * Renders ABC notation to sheet music and sets up audio playback + */ +async function renderAbc(abcNotation: string): Promise { + try { + setStatus("Rendering..."); + + // Clear previous content + sheetMusicEl.innerHTML = ""; + audioControlsEl.innerHTML = ""; + + // Render the sheet music visually + state.visualObj = ABCJS.renderAbc(sheetMusicEl, abcNotation, { + responsive: "resize", + add_classes: true, + }); + + if (!state.visualObj || state.visualObj.length === 0) { + throw new Error("Failed to parse music notation"); + } + + if (!ABCJS.synth.supportsAudio()) { + throw new Error("Audio not supported in this browser"); + } + + // Create synth controller with UI controls + state.synthControl = new ABCJS.synth.SynthController(); + state.synthControl.load(audioControlsEl, null, { + displayLoop: true, + // displayRestart: true, + displayPlay: true, + displayProgress: true, + // displayWarp: true, + }); + + // Connect synth to the rendered tune + await state.synthControl.setTune(state.visualObj[0], false, {}); + + setStatus("Ready to play!"); + } catch (error) { + log.error("Render error:", error); + setStatus(`Error: ${(error as Error).message}`, true); + audioControlsEl.innerHTML = ""; + } +} + +// Create app instance +const app = new App({ name: "Sheet Music App", version: "1.0.0" }); + +// Handle tool input - receives ABC notation from the host +app.ontoolinput = (params) => { + log.info("Received tool input:", params); + + const abcNotation = params.arguments?.abcNotation as string | undefined; + + if (abcNotation) { + renderAbc(abcNotation); + } else { + setStatus("No ABC notation provided", true); + } +}; + +// Error handler +app.onerror = log.error; + +app.onhostcontextchanged = (params) => { + if (params.safeAreaInsets) { + mainEl.style.paddingTop = `${params.safeAreaInsets.top}px`; + mainEl.style.paddingRight = `${params.safeAreaInsets.right}px`; + mainEl.style.paddingBottom = `${params.safeAreaInsets.bottom}px`; + mainEl.style.paddingLeft = `${params.safeAreaInsets.left}px`; + } +}; + +// Connect to host +app.connect().then(() => { + const ctx = app.getHostContext(); + if (ctx) { + app.onhostcontextchanged(ctx); + } +}); diff --git a/examples/sheet-music-server/src/server-utils.ts b/examples/sheet-music-server/src/server-utils.ts new file mode 100644 index 00000000..40524237 --- /dev/null +++ b/examples/sheet-music-server/src/server-utils.ts @@ -0,0 +1,110 @@ +/** + * Shared utilities for running MCP servers with various transports. + */ + +import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js"; +import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; +import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; +import cors from "cors"; +import type { Request, Response } from "express"; + +/** + * Starts an MCP server using the appropriate transport based on command-line arguments. + * + * If `--stdio` is passed, uses stdio transport. Otherwise, uses Streamable HTTP transport. + * + * @param createServer - Factory function that creates a new McpServer instance. + */ +export async function startServer( + createServer: () => McpServer, +): Promise { + try { + if (process.argv.includes("--stdio")) { + await startStdioServer(createServer); + } else { + await startStreamableHttpServer(createServer); + } + } catch (e) { + console.error(e); + process.exit(1); + } +} + +/** + * Starts an MCP server with stdio transport. + * + * @param createServer - Factory function that creates a new McpServer instance. + */ +export async function startStdioServer( + createServer: () => McpServer, +): Promise { + await createServer().connect(new StdioServerTransport()); +} + +/** + * Starts an MCP server with Streamable HTTP transport in stateless mode. + * + * Each request creates a fresh server and transport instance, which are + * closed when the response ends (no session tracking). + * + * The server listens on the port specified by the PORT environment variable, + * defaulting to 3001 if not set. + * + * @param createServer - Factory function that creates a new McpServer instance per request. + */ +export async function startStreamableHttpServer( + createServer: () => McpServer, +): Promise { + const port = parseInt(process.env.PORT ?? "3001", 10); + + // Express app - bind to all interfaces for development/testing + const expressApp = createMcpExpressApp({ host: "0.0.0.0" }); + expressApp.use(cors()); + + expressApp.all("/mcp", async (req: Request, res: Response) => { + // Create fresh server and transport for each request (stateless mode) + const server = createServer(); + const transport = new StreamableHTTPServerTransport({ + sessionIdGenerator: undefined, + }); + + // Clean up when response ends + res.on("close", () => { + transport.close().catch(() => {}); + server.close().catch(() => {}); + }); + + try { + await server.connect(transport); + await transport.handleRequest(req, res, req.body); + } catch (error) { + console.error("MCP error:", error); + if (!res.headersSent) { + res.status(500).json({ + jsonrpc: "2.0", + error: { code: -32603, message: "Internal server error" }, + id: null, + }); + } + } + }); + + const { promise, resolve, reject } = Promise.withResolvers(); + + const httpServer = expressApp.listen(port, (err?: Error) => { + if (err) return reject(err); + console.log(`Server listening on http://localhost:${port}/mcp`); + resolve(); + }); + + const shutdown = () => { + console.log("\nShutting down..."); + httpServer.close(() => process.exit(0)); + }; + + process.on("SIGINT", shutdown); + process.on("SIGTERM", shutdown); + + return promise; +} diff --git a/examples/sheet-music-server/tsconfig.json b/examples/sheet-music-server/tsconfig.json new file mode 100644 index 00000000..535267b2 --- /dev/null +++ b/examples/sheet-music-server/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ESNext", + "lib": ["ESNext", "DOM", "DOM.Iterable"], + "module": "ESNext", + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "verbatimModuleSyntax": true, + "noEmit": true, + "strict": true, + "skipLibCheck": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src", "server.ts"] +} diff --git a/examples/sheet-music-server/vite.config.ts b/examples/sheet-music-server/vite.config.ts new file mode 100644 index 00000000..6ff6d997 --- /dev/null +++ b/examples/sheet-music-server/vite.config.ts @@ -0,0 +1,24 @@ +import { defineConfig } from "vite"; +import { viteSingleFile } from "vite-plugin-singlefile"; + +const INPUT = process.env.INPUT; +if (!INPUT) { + throw new Error("INPUT environment variable is not set"); +} + +const isDevelopment = process.env.NODE_ENV === "development"; + +export default defineConfig({ + plugins: [viteSingleFile()], + build: { + sourcemap: isDevelopment ? "inline" : undefined, + cssMinify: !isDevelopment, + minify: !isDevelopment, + + rollupOptions: { + input: INPUT, + }, + outDir: "dist", + emptyOutDir: false, + }, +}); diff --git a/package-lock.json b/package-lock.json index 00ad1e77..93d25950 100644 --- a/package-lock.json +++ b/package-lock.json @@ -306,7 +306,7 @@ "version": "1.0.0", "dependencies": { "@modelcontextprotocol/ext-apps": "../..", - "@modelcontextprotocol/sdk": "^1.22.0", + "@modelcontextprotocol/sdk": "^1.24.0", "react": "^19.2.0", "react-dom": "^19.2.0", "zod": "^4.1.13" @@ -318,7 +318,6 @@ "@types/react": "^19.2.2", "@types/react-dom": "^19.2.2", "@vitejs/plugin-react": "^4.3.4", - "bun": "^1.3.2", "concurrently": "^9.2.1", "cors": "^2.8.5", "express": "^5.1.0", @@ -386,6 +385,63 @@ "dev": true, "license": "MIT" }, + "examples/sheet-music-server": { + "version": "1.0.0", + "dependencies": { + "@modelcontextprotocol/ext-apps": "../..", + "@modelcontextprotocol/sdk": "^1.24.0", + "abcjs": "^6.4.4", + "zod": "^4.1.13" + }, + "devDependencies": { + "@types/cors": "^2.8.19", + "@types/express": "^5.0.0", + "@types/node": "^22.0.0", + "concurrently": "^9.2.1", + "cors": "^2.8.5", + "cross-env": "^7.0.3", + "express": "^5.1.0", + "typescript": "^5.9.3", + "vite": "^6.0.0", + "vite-plugin-singlefile": "^2.3.0" + } + }, + "examples/sheet-music-server/node_modules/@types/node": { + "version": "22.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", + "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "examples/sheet-music-server/node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "examples/sheet-music-server/node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, "examples/system-monitor-server": { "version": "1.0.0", "dependencies": { @@ -2394,6 +2450,16 @@ "dev": true, "license": "BSD-3-Clause" }, + "node_modules/abcjs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/abcjs/-/abcjs-6.5.2.tgz", + "integrity": "sha512-XLDZPy/4TZbOqPsLwuu0Umsl79NTAcObEkboPxdYZXI8/fU6PNh59SAnkZOnEPVbyT8EXfBUjgNoe/uKd3T0xQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/paulrosen" + } + }, "node_modules/accepts": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", @@ -2685,40 +2751,6 @@ "resolved": "examples/budget-allocator-server", "link": true }, - "node_modules/bun": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/bun/-/bun-1.3.5.tgz", - "integrity": "sha512-c1YHIGUfgvYPJmLug5QiLzNWlX2Dg7X/67JWu1Va+AmMXNXzC/KQn2lgQ7rD+n1u1UqDpJMowVGGxTNpbPydNw==", - "cpu": [ - "arm64", - "x64" - ], - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "os": [ - "darwin", - "linux", - "win32" - ], - "bin": { - "bun": "bin/bun.exe", - "bunx": "bin/bunx.exe" - }, - "optionalDependencies": { - "@oven/bun-darwin-aarch64": "1.3.5", - "@oven/bun-darwin-x64": "1.3.5", - "@oven/bun-darwin-x64-baseline": "1.3.5", - "@oven/bun-linux-aarch64": "1.3.5", - "@oven/bun-linux-aarch64-musl": "1.3.5", - "@oven/bun-linux-x64": "1.3.5", - "@oven/bun-linux-x64-baseline": "1.3.5", - "@oven/bun-linux-x64-musl": "1.3.5", - "@oven/bun-linux-x64-musl-baseline": "1.3.5", - "@oven/bun-windows-x64": "1.3.5", - "@oven/bun-windows-x64-baseline": "1.3.5" - } - }, "node_modules/bun-types": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/bun-types/-/bun-types-1.3.3.tgz", @@ -5656,6 +5688,10 @@ "node": ">=8" } }, + "node_modules/sheet-music-server": { + "resolved": "examples/sheet-music-server", + "link": true + }, "node_modules/shell-quote": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", diff --git a/tests/e2e/servers.spec.ts b/tests/e2e/servers.spec.ts index eaf83da7..e4b1bb52 100644 --- a/tests/e2e/servers.spec.ts +++ b/tests/e2e/servers.spec.ts @@ -30,6 +30,7 @@ const SERVERS = [ { key: "cohort-heatmap", name: "Cohort Heatmap Server" }, { key: "customer-segmentation", name: "Customer Segmentation Server" }, { key: "scenario-modeler", name: "SaaS Scenario Modeler" }, + { key: "sheet-music", name: "Sheet Music Server" }, { key: "system-monitor", name: "System Monitor Server" }, { key: "threejs", name: "Three.js Server" }, { key: "wiki-explorer", name: "Wiki Explorer" }, diff --git a/tests/e2e/servers.spec.ts-snapshots/sheet-music.png b/tests/e2e/servers.spec.ts-snapshots/sheet-music.png new file mode 100644 index 0000000000000000000000000000000000000000..54d0a96f39b4665b2efde2a5ced1645aeb65f252 GIT binary patch literal 49098 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 literal 0 HcmV?d00001