{ lib, python313Packages, fetchFromGitHub, fetchPypi, }: let # music21 is not in nixpkgs; vendor it (upstream mcp-score pins >=10.5,<11) music21 = python313Packages.buildPythonPackage rec { pname = "music21"; version = "10.5.0"; format = "wheel"; src = fetchPypi { inherit pname version; format = "wheel"; dist = "py3"; python = "py3"; hash = "sha256-mSTv9fv1hJDmfL87eKWLpTBA53woGTDTVK8yp0fpRgY="; }; 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 = "b2155a59119103c39a37f14166d0d6920e564c76"; hash = "sha256-XYZjGa7pWaVmZ4dF/vOLkrYjSjNXP/148DQjujMdvIU="; }; 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; }; }