[build-system] requires = ["setuptools==84.0.0"] build-backend = "setuptools.build_meta" [project] name = "mettle-verifier" version = "0.5.2" description = "METTLE reverse-CAPTCHA challenges for machine-oriented verification." readme = "README.md" requires-python = ">=3.10" license = "Apache-2.0" authors = [{ name = "Creed Space" }] keywords = ["ai", "verification", "agent", "attestation", "mettle"] classifiers = [ "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", "Intended Audience :: Developers", "Topic :: Security", ] # Runtime dependencies for the CLI path ONLY. The FastAPI server stack # (fastapi, uvicorn, redis, anthropic, ...) lives in requirements.txt and is # intentionally NOT pulled in by `pip install mettle-verifier`. dependencies = [ "pydantic>=2.5.0", ] # The MCP server is an opt-in extra: `pip install 'mettle-verifier[mcp]'`. [project.optional-dependencies] mcp = [ "mcp>=2.0,<3", "httpx>=0.27", # Required by the `--transport http` path (mettle/_http.py). Kept in the # same extra rather than a separate one so `pip install '.[mcp]'` — which is # all the container image runs — yields a working HTTP server. "starlette>=0.37", "uvicorn>=0.27", ] [project.urls] Homepage = "https://mettle.sh" Repository = "https://github.com/Creed-Space/METTLE" [project.scripts] mettle = "mettle.cli:main" mettle-mcp = "mettle.mcp_server:main" [tool.setuptools] # Package only the CLI-relevant module tree, not the top-level server modules. packages = ["mettle"] [tool.setuptools.package-dir] "" = "." [tool.ruff.format] # Ruff 0.16 began formatting Python inside Markdown fences by default, which # silently pulled all 59 documents, including the archived prompt records under # `_contprompts/`, into the formatter's scope. Keep the formatter on source for # the same reason the lint contract above is pinned: a new formatting surface is # adopted deliberately, not by upgrade. exclude = ["*.md"] [tool.ruff.lint] # Keep the established correctness-focused lint contract explicit. Ruff's # default rule set changes between releases, so new stylistic families are # reviewed deliberately rather than silently becoming release blockers. select = ["E4", "E7", "E9", "F"]