[build-system] # 77 is the floor for PEP 639: `license` as an SPDX expression plus # `license-files`, which is what PyPI reads now. requires = ["setuptools>=77.0"] build-backend = "setuptools.build_meta" [project] name = "benspdf-mcp" version = "0.3.0" description = "Local PDF tools for AI agents, exposed over the Model Context Protocol" readme = "README.md" requires-python = ">=3.11" license = "Apache-2.0" license-files = ["LICENSE"] authors = [ {name = "Benjamin Bergner", email = "bergner.benjamin@gmail.com"} ] keywords = ["mcp", "pdf", "llm", "agents", "model-context-protocol"] # These become the sidebar links on the PyPI page, which is where someone who # found the package by search goes next. urls.Homepage = "https://github.com/benbergner/BensPDF" urls.Repository = "https://github.com/benbergner/BensPDF" urls.Issues = "https://github.com/benbergner/BensPDF/issues" # No license classifier: PEP 639 replaced it with the `license` field above, and # setuptools rejects declaring both. classifiers = [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Topic :: Text Processing", "Topic :: Scientific/Engineering :: Artificial Intelligence", ] dependencies = [ "pypdf>=4.0.0", "pypdfium2>=4.30.0", "Pillow>=10.0.0", "mcp>=2.0.0", ] [project.scripts] benspdf-mcp = "benspdf.mcp_server:main" benspdf-cli = "benspdf.cli:main" [project.optional-dependencies] dev = [ "pytest>=7.0.0", "pytest-asyncio>=0.21.0", "black>=23.0.0", "mypy>=1.0.0", ] ollama = ["ollama>=0.1.0"] # Two top-level packages: benspdf (the PDF verbs) and benscore (the shared # artifact layer they sit on). benscore carries no domain in its name or its # config surface, so a future domain package can share one workspace with these # verbs, and so moving it into its own distribution later changes nothing for # anything that imports it. [tool.setuptools.packages.find] where = ["src"] # pypdfium2 is a ctypes binding and ships no py.typed marker, so mypy cannot see # into it. Nothing to fix on our side; the calls we make are covered by tests. [[tool.mypy.overrides]] module = ["pypdfium2.*", "pypdfium2"] ignore_missing_imports = true # ollama is an optional extra, so the common case is that it is not installed - # which is the case cli.py already handles, by guarding the import and telling # the user how to get it. Without this, type checking an install that does not # have the extra fails on an import that is meant to be absent. [[tool.mypy.overrides]] module = ["ollama.*", "ollama"] ignore_missing_imports = true