[project] name = "qnexus-mcp" version = "0.2.0" description = "MCP server for Quantinuum Nexus, wrapping the qnexus SDK. Not affiliated with Quantinuum." readme = "README.md" requires-python = ">=3.10" license = "Apache-2.0" license-files = ["LICENSE", "NOTICE"] keywords = ["mcp", "model-context-protocol", "quantinuum", "nexus", "qnexus", "quantum"] # Runtime deps are capped: `uvx qnexus-mcp` resolves fresh on every user install (uv.lock does not # apply to published wheels), so an untested fastmcp/qnexus major or minor must never be pulled in # silently. qnexus is 0.x; under SemVer its minors may break, so it is capped per-minor and bumped # deliberately (Dependabot opens the PR; CI + the live smoke validate it). dependencies = [ "fastmcp>=3.4,<4", "qnexus>=0.46,<0.47", "pydantic>=2", "pytket>=2,<3", # direct import (pytket.qasm) in the execute/manage paths "anyio>=4", # direct import (thread offload for blocking SDK calls) ] [project.scripts] qnexus-mcp = "qnexus_mcp.cli:main" [build-system] requires = ["hatchling"] build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] packages = ["src/qnexus_mcp"] [dependency-groups] dev = [ "pytest>=8", "pytest-asyncio>=0.24", "pytest-cov>=6", "ruff", "mypy", "commitizen>=4", # release tooling: `uv run cz bump` (see docs/PUBLISHING.md) ] [tool.ruff] line-length = 100 target-version = "py310" [tool.ruff.lint] select = ["E", "F", "I", "UP", "B"] [tool.mypy] python_version = "3.10" strict = true plugins = ["pydantic.mypy"] # Heavy scientific deps ship stubs we treat as opaque (our code already wraps them as Any). Don't follow # into them: newer numpy stubs use 3.12+ `type X = ...` syntax that mypy rejects under python_version 3.10. [[tool.mypy.overrides]] module = ["qnexus.*", "pytket.*", "numpy.*", "quantinuum_schemas.*"] ignore_missing_imports = true follow_imports = "skip" [tool.pytest.ini_options] asyncio_mode = "auto" testpaths = ["tests"]