diff --git a/README.md b/README.md index a67b5a5..c850103 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,7 @@ This repository provides Nix derivations for MCP (Model Context Protocol) server | sabnzbd-mcp | MCP server for SABnzbd download management | Python | | jellyfin-mcp | MCP server for Jellyfin — search, playback, metadata, admin | Go | | zotero-mcp | Connect Zotero research library with AI assistants | Python | +| mcp-score | AI-driven music score generation and MuseScore live control | Python | ## Usage diff --git a/opencode.json b/opencode.json index fe85aad..a03f0e9 100644 --- a/opencode.json +++ b/opencode.json @@ -91,6 +91,11 @@ "JELLYFIN_URL": "PLACEHOLDER", "JELLYFIN_API_KEY": "PLACEHOLDER" } + }, + "mcp-score": { + "type": "local", + "command": ["mcp-score", "serve"], + "enabled": true } } } diff --git a/packages/default.nix b/packages/default.nix index 231e707..7b2387c 100644 --- a/packages/default.nix +++ b/packages/default.nix @@ -25,5 +25,6 @@ jellyfin-mcp = pkgs.callPackage ./jellyfin-mcp/package.nix { }; nextcloud-mcp-server = pkgs.callPackage ./nextcloud-mcp-server/package.nix { }; annas-mcp = pkgs.callPackage ./annas-mcp/package.nix { }; + mcp-score = pkgs.callPackage ./mcp-score/package.nix { }; # example-mcp-server = pkgs.callPackage ./example-mcp-server/package.nix { }; } diff --git a/packages/mcp-score/package.nix b/packages/mcp-score/package.nix new file mode 100644 index 0000000..6432c9f --- /dev/null +++ b/packages/mcp-score/package.nix @@ -0,0 +1,76 @@ +{ + lib, + python313Packages, + fetchFromGitHub, + fetchPypi, +}: + +let + # music21 is not in nixpkgs; vendor it (upstream mcp-score pins >=9.0,<10) + music21 = python313Packages.buildPythonPackage rec { + pname = "music21"; + version = "9.9.2"; + format = "wheel"; + + src = fetchPypi { + inherit pname version; + format = "wheel"; + dist = "py3"; + python = "py3"; + hash = "sha256-ZIAQq40TKNCxB0bO8UV+hLEidM0xYkgifpbSHielGMo="; + }; + + propagatedBuildInputs = with python313Packages; [ + chardet + joblib + jsonpickle + matplotlib + more-itertools + numpy + requests + webcolors + ]; + + doCheck = false; + pythonImportsCheck = [ "music21" ]; + + meta = with lib; { + description = "Toolkit for computer-aided musicology"; + homepage = "https://github.com/cuthbertLab/music21"; + license = licenses.bsd3; + }; + }; +in +python313Packages.buildPythonApplication rec { + pname = "mcp-score"; + version = "0.1.0-unstable"; + + pyproject = true; + + src = fetchFromGitHub { + owner = "tskovlund"; + repo = "mcp-score"; + rev = "3ff9d4b6504fcee5032c44fdcf7dc1d7a21a4b5d"; + hash = "sha256-zrpvzxi8AbF5/etuvMZLni4HSFBYGRe55rpKJJEAg60="; + }; + + build-system = with python313Packages; [ + hatchling + ]; + + dependencies = with python313Packages; [ + mcp + music21 + websockets + ]; + + pythonImportsCheck = [ "mcp_score" ]; + + meta = with lib; { + description = "MCP server for AI-driven music score generation and manipulation via MusicXML and MuseScore"; + homepage = "https://github.com/tskovlund/mcp-score"; + license = licenses.mit; + mainProgram = "mcp-score"; + platforms = platforms.all; + }; +}