[project] name = "lucius-mcp" version = "0.15.6" description = "Allure TestOps MCP Server" readme = "README.md" license = "Apache-2.0" license-files = ["LICENSE"] authors = [{ name = "Ivan Ostanin", email = "ivan@ostanin.me" }] keywords = ["mcp", "allure", "testops", "allure-testops", "mcp-server", "fastmcp", "model-context-protocol"] requires-python = ">=3.10,<3.15" dependencies = [ "cyclopts>=4.22.2", "fastmcp>=3.0.0", "httpx>=0.28.1", "pydantic>=2.12.5", "pydantic-settings>=2.12.0", "python-dateutil>=2.9.0.post0", "starlette==1.6.0", "uvicorn>=0.40.0", "wsproto>=1.3.2", "python-json-logger>=2.0.7", "rich>=13.7.0", "umami-analytics>=0.3.22", "python-multipart>=0.0.22", "urllib3>=2.6.3", # for cryptography 46.0.4 win_arm64 wheels support has been dropped - https://github.com/pyca/cryptography/pull/14216; # pin win_arm64 to the latest patch with wheels and cap other platforms at 48.0.1 to avoid the OpenSSL scan failure. "cryptography==46.0.3; platform_system == 'Windows' and (platform_machine == 'ARM64' or platform_machine == 'aarch64')", "cryptography==50.0.0; platform_system != 'Windows' or (platform_machine != 'ARM64' and platform_machine != 'aarch64')", "authlib>=1.6.7", "platformdirs>=4.9.4", "tomli>=2.0.1; python_version < '3.11'", ] classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "Topic :: Software Development", "Topic :: Utilities", "Topic :: Software Development :: Quality Assurance", "Topic :: Software Development :: Testing", "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", "Typing :: Typed", "Environment :: Console", "Operating System :: OS Independent", "Natural Language :: English", ] [project.urls] Homepage = "https://github.com/ivanostanin/lucius-mcp" Documentation = "https://github.com/ivanostanin/lucius-mcp#readme" Repository = "https://github.com/ivanostanin/lucius-mcp.git" Issues = "https://github.com/ivanostanin/lucius-mcp/issues" Changelog = "https://github.com/ivanostanin/lucius-mcp/blob/main/CHANGELOG.md" Releases = "https://github.com/ivanostanin/lucius-mcp/releases" [project.scripts] start = "src.main:start" lucius-mcp = "src.main:start" lucius = "src.cli.cli_entry:main" [tool.uv] package = true [build-system] requires = ["hatchling"] build-backend = "hatchling.build" [tool.hatch.build] exclude = [ "/.codex", "/.mypy_cache", "/.pytest_cache", "/.ruff_cache", "/.venv", "/dist", ] [tool.hatch.build.targets.wheel] packages = ["src"] [project.optional-dependencies] dev = [ "allure-pytest>=2.15.3", "openapi-generator-cli>=7.24.0", "faker>=40.36.0", "mypy>=1.19.1", "nuitka[onefile]>=2.5.8", "pytest>=9.0.2", "pytest-asyncio>=1.3.0", "pytest-cov>=7.0.0", "pytest-mock>=3.15.1", "respx>=0.22.0", "ruff>=0.16.0", "twine>=6.2.0", "pre-commit>=4.6.1", "pytest-xdist>=3.8.0", ] [tool.ruff] line-length = 120 target-version = "py310" exclude = ["src/client/generated", "src/client/overridden"] [tool.ruff.lint] select = ["E", "F", "B", "I", "UP", "N", "S", "C90", "RUF"] [tool.ruff.lint.per-file-ignores] "tests/**/*.py" = ["S101", "S603", "S607"] "scripts/**/*.py" = ["RUF001"] "deployment/scripts/**/*.py" = ["RUF001", "E501"] "src/cli/cli_entry.py" = ["C901"] [tool.ruff.format] exclude = ["specs/**"] [tool.mypy] strict = true python_version = "3.10" plugins = ["pydantic.mypy"] exclude = ["src/client/generated", "src/client/overridden"] [[tool.mypy.overrides]] module = ["src.client.generated.*", "src.client.overridden.*"] ignore_errors = true implicit_reexport = true [tool.pytest.ini_options] asyncio_mode = "auto" asyncio_default_fixture_loop_scope = "function" testpaths = ["tests"] python_classes = [ "TestUpdateTestCase", "TestAddSharedStepToCase", "TestRemoveSharedStepFromCase", "TestProjectIdValidation", "TestNameValidation", "TestStepsValidation", "TestTagsValidation", "TestAttachmentsValidation", "TestCustomFieldsValidation", "TestIssueLinking", "TestCLI*", "TestCall*", "TestE2E*", "TestBinary*", "TestCLIBinaries", "TestCLIStandalone", "TestCLIFunctionality", ] markers = [ "test_id: Test ID for traceability to requirements and test design documents", "priority: Test execution priority", "e2e: End-to-end tests that validate runtime lifecycle and bundle execution" ] [tool.coverage.run] source = ["src"] omit = [ "src/client/generated/*", "**/__init__.py", ] [tool.coverage.report] fail_under = 90