Skip to main content
Glama

Zotero MCP

""" Utility for downloading and installing the pdfannots2json tool. """ import os import sys import platform import shutil import tempfile import tarfile import zipfile import urllib.request from pathlib import Path # Constants CURRENT_VERSION = "1.0.15" BASE_URL = f"https://github.com/mgmeyers/pdfannots2json/releases/download/{CURRENT_VERSION}/" # Download URLs based on platform and architecture DOWNLOAD_URLS = { "darwin": { "x86_64": f"{BASE_URL}pdfannots2json.Mac.Intel.tar.gz", "arm64": f"{BASE_URL}pdfannots2json.Mac.M1.tar.gz" }, "linux": { "x86_64": f"{BASE_URL}pdfannots2json.Linux.x64.tar.gz" }, "win32": { "x86_64": f"{BASE_URL}pdfannots2json.Windows.x64.zip", "AMD64": f"{BASE_URL}pdfannots2json.Windows.x64.zip" # Windows reports AMD64 instead of x86_64 } } def get_executable_name(): """Get the name of the executable based on the platform""" if platform.system().lower() == "windows": return "pdfannots2json.exe" else: return f"pdfannots2json-{platform.system().lower()}-{platform.machine()}" def get_install_dir(): """Get the directory to install the executable""" return os.path.expanduser("~/.pdfannots2json") def get_executable_path(): """Get the full path to the executable""" return os.path.join(get_install_dir(), get_executable_name()) def get_download_url(): """Get the download URL for the current platform and architecture""" system = platform.system().lower() if system == "darwin": system = "darwin" # macOS elif system == "windows": system = "win32" machine = platform.machine() # Map architecture names if machine == "amd64": machine = "x86_64" # Check if we have a URL for this platform/architecture if system in DOWNLOAD_URLS and machine in DOWNLOAD_URLS[system]: return DOWNLOAD_URLS[system][machine] return None def make_executable(path): """Make a file executable""" if platform.system().lower() != "windows": current_mode = os.stat(path).st_mode os.chmod(path, current_mode | 0o111) # Add executable bit def exists(): """Check if the executable exists""" return os.path.exists(get_executable_path()) def download_and_install(): """Download and extract the executable Returns: bool: True if successful, False otherwise """ install_dir = get_install_dir() url = get_download_url() if not url: print(f"No download URL available for {platform.system()} {platform.machine()}") return False print(f"Downloading pdfannots2json from {url}") try: # Create install directory if it doesn't exist os.makedirs(install_dir, exist_ok=True) # Remove any existing executable if exists(): os.remove(get_executable_path()) # Create a temporary directory for the download with tempfile.TemporaryDirectory() as temp_dir: # Download the file archive_path = os.path.join(temp_dir, "download.archive") urllib.request.urlretrieve(url, archive_path) # Extract based on file type if url.endswith(".tar.gz"): with tarfile.open(archive_path, "r:gz") as tar: tar.extractall(path=install_dir) elif url.endswith(".zip"): with zipfile.ZipFile(archive_path, "r") as zip_file: zip_file.extractall(path=install_dir) # Make sure the executable is executable exe_path = get_executable_path() if os.path.exists(exe_path): make_executable(exe_path) # Legacy file handling legacy_exe = os.path.join(install_dir, "pdfannots2json") if os.path.exists(legacy_exe) and not os.path.exists(exe_path): os.rename(legacy_exe, exe_path) make_executable(exe_path) print(f"Successfully installed pdfannots2json to {exe_path}") return True except Exception as e: print(f"Error downloading pdfannots2json: {e}") return False

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/54yyyu/zotero-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server