diff --git a/README.org b/README.org index f8be219..85dd515 100644 --- a/README.org +++ b/README.org @@ -8,9 +8,11 @@ This repository provides Nix derivations for MCP (Model Context Protocol) server * Available Packages -| Package | Description | Language | -|--------------------+------------------------------------------------------+----------| -| manim-mcp-server | Execute Manim animation code and return videos | Python | +| Package | Description | Language | +|----------------------------+----------------------------------------------------------+----------| +| academic-search-mcp-server | Search academic papers via Semantic Scholar and Crossref | Python | +| manim-mcp-server | Execute Manim animation code and return videos | Python | +| zotero-mcp | Connect Zotero research library with AI assistants | Python | * Usage diff --git a/opencode.json b/opencode.json index 94181fc..d8bf6ea 100644 --- a/opencode.json +++ b/opencode.json @@ -15,6 +15,11 @@ "type": "local", "command": ["manim-mcp-server"], "enabled": true + }, + "zotero": { + "type": "local", + "command": ["zotero-mcp"], + "enabled": true } } } diff --git a/packages/default.nix b/packages/default.nix index 784a6e1..41c8315 100644 --- a/packages/default.nix +++ b/packages/default.nix @@ -12,6 +12,7 @@ manim-mcp-server = pkgs.callPackage ./manim-mcp-server/package.nix { }; # Add new packages here: - academic-search-mcp-server = pkgs.callPackage ./academic-search-mcp-server/package.nix { }; + academic-search-mcp-server = pkgs.callPackage ./academic-search-mcp-server/package.nix { }; + zotero-mcp = pkgs.callPackage ./zotero-mcp/package.nix { }; # example-mcp-server = pkgs.callPackage ./example-mcp-server/package.nix { }; } diff --git a/packages/zotero-mcp/package.nix b/packages/zotero-mcp/package.nix new file mode 100644 index 0000000..344a1bf --- /dev/null +++ b/packages/zotero-mcp/package.nix @@ -0,0 +1,79 @@ +{ + lib, + python3Packages, + fetchFromGitHub, + fetchPypi, +}: + +let + # Internal dependency: pyzotero (not in nixpkgs) + pyzotero = python3Packages.buildPythonPackage rec { + pname = "pyzotero"; + version = "1.9.0"; + format = "wheel"; + + src = fetchPypi { + inherit pname version; + format = "wheel"; + dist = "py3"; + python = "py3"; + hash = "sha256-vbbqhotDQlsQjho/JaFywriPb3XgnmydcNG38/Qq8xE="; + }; + + 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.1.2-unstable"; + pyproject = true; + + src = fetchFromGitHub { + owner = "54yyyu"; + repo = "zotero-mcp"; + rev = "372da10a3fbf56332eed4547fd40032de45593b8"; + hash = "sha256-nYtuADZVFAJjnl0Gejnd0dK/VVL+XHttHC3zc2avG8s="; + }; + + build-system = with python3Packages; [ + hatchling + ]; + + dependencies = with python3Packages; [ + pyzotero + mcp + python-dotenv + markitdown + pydantic + requests + fastmcp + chromadb + sentence-transformers + openai + google-genai + ]; + + 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; + }; +}