{ lib, python3Packages, fetchFromGitHub, fetchPypi, }: let # Internal dependency: pyzotero (not in nixpkgs) pyzotero = python3Packages.buildPythonPackage rec { pname = "pyzotero"; version = "1.11.0"; format = "wheel"; src = fetchPypi { inherit pname version; format = "wheel"; dist = "py3"; python = "py3"; hash = "sha256-VDSMczLHnNGs9THyVI/I2MbqMeiemMQgIy2XoZOtlbI="; }; propagatedBuildInputs = with python3Packages; [ feedparser bibtexparser httpx whenever ]; doCheck = false; pythonImportsCheck = [ "pyzotero" ]; meta = with lib; { description = "Python wrapper for the Zotero API"; homepage = "https://github.com/urschrei/pyzotero"; license = licenses.blueOak100; }; }; in python3Packages.buildPythonApplication rec { pname = "zotero-mcp"; version = "0.2.2"; pyproject = true; src = fetchFromGitHub { owner = "54yyyu"; repo = "zotero-mcp"; rev = "v${version}"; hash = "sha256-GZkzABsUh6qua66K4URPq0InLgs6cqLgKEXm7wzT+s8="; }; build-system = with python3Packages; [ hatchling ]; # Core dependencies dependencies = with python3Packages; [ pyzotero mcp python-dotenv markitdown pydantic requests fastmcp unidecode # PDF support pymupdf ebooklib pdfplumber ]; # Optional: semantic search dependencies optional-dependencies = with python3Packages; { semantic = [ chromadb sentence-transformers openai google-genai tiktoken ]; pdf = [ pymupdf ebooklib ]; }; pythonImportsCheck = [ "zotero_mcp" ]; meta = with lib; { description = "MCP server connecting Zotero with AI assistants for research library access"; homepage = "https://github.com/54yyyu/zotero-mcp"; license = licenses.mit; mainProgram = "zotero-mcp"; platforms = platforms.all; }; }