{ 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; }; }