[build-system] requires = ["hatchling"] build-backend = "hatchling.build" [project] name = "immich-photo-manager" version = "2.0.13" description = "MCP server for intelligent photo management with Immich" readme = "README.md" requires-python = ">=3.10" license = "MIT" authors = [ { name = "Drolosoft" }, ] keywords = ["immich", "mcp", "photos", "photo-management"] classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: End Users/Desktop", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", ] dependencies = [ "httpx>=0.24.0,<1.0", "mcp>=2.0.0,<3.0", "uvicorn>=0.24.0,<1.0", # Video frames (PyAV) and PDF export (fpdf2) ship with the package since # 1.7.1: one install, no extras to remember, at the price of ~60 MB more. "av>=12", "fpdf2>=2.7,<3", ] [project.optional-dependencies] # Kept empty so `immich-photo-manager[video]`, `[pdf]` and `[all]` from the # 1.6.0/1.7.0 docs keep installing; the libraries are core dependencies now. video = [] pdf = [] all = [] dev = [ "pytest>=8", "pytest-asyncio>=0.24", "respx>=0.21", "ruff>=0.6", "pypdf>=4", ] [project.urls] Homepage = "https://github.com/drolosoft/immich-photo-manager" Documentation = "https://github.com/drolosoft/immich-photo-manager/blob/main/doc/GETTING-STARTED.md" Issues = "https://github.com/drolosoft/immich-photo-manager/issues" [project.scripts] immich-photo-manager = "immich_mcp_server.__main__:main" [tool.hatch.build.targets.wheel] packages = ["src/immich_mcp_server"] [tool.hatch.build.targets.sdist] # Ship only what the wheel build needs — never the whole working tree # (generated galleries, internal plans, and heavy assets must not reach PyPI). only-include = ["src/immich_mcp_server", "README.md", "LICENSE", "SECURITY.md"] [tool.pytest.ini_options] testpaths = ["tests"] asyncio_mode = "auto" [tool.ruff] line-length = 100 target-version = "py310" [tool.ruff.lint] # Pin the rule set explicitly so a new ruff release expanding its defaults # can't turn a green build red without a code change (ruff 0.16 pulled in # I/ASYNC/PL/RUF/S/BLE by default). This mirrors ruff's historical default # (E4/E7/E9 + F) that this codebase was written and cleaned against — note # E501 line-length is intentionally excluded, as it always has been. select = ["E4", "E7", "E9", "F"]