[project] name = "mcp-server-polarion" version = "2.1.0" description = "MCP server for Polarion ALM — read and write documents and work items" readme = "README.md" authors = [{ name = "devemberx", email = "devemberx@gmail.com" }] license = "MIT" license-files = ["LICENSE"] keywords = ["mcp", "polarion", "alm", "model-context-protocol", "fastmcp"] classifiers = [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "Topic :: Software Development", "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3.13", ] requires-python = ">=3.13" dependencies = [ "fastmcp>=3.0,<4", "httpx>=0.27", "beautifulsoup4>=4.12", "pydantic>=2.0", "pydantic-settings>=2.0", "markdownify>=1.2.2", "markdown-it-py>=4.0.0", ] [project.urls] Repository = "https://github.com/devemberx/mcp-server-polarion" Issues = "https://github.com/devemberx/mcp-server-polarion/issues" [project.scripts] mcp-server-polarion = "mcp_server_polarion.__main__:main" [dependency-groups] dev = [ "pytest>=9.0", "pytest-asyncio>=0.24", "pytest-cov>=6.0", "diff-cover>=9.0", "respx>=0.22", "ruff>=0.15", "mypy>=2.0", ] evals = [ "strands-agents[litellm]", "strands-agents-evals", # 1.89.x regresses gpt-4o-mini tool-calling: the agent skips # read_document_parts and loops past the cycle cap, breaking orchestration # cases (ORCH-DEDUP-BEFORE-CREATE, ORCH-BULK-SPEC-INTO-DOC). "litellm>=1.83.10,<1.89", ] [build-system] requires = ["hatchling"] build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] packages = ["src/mcp_server_polarion"] [tool.hatch.build.targets.sdist] include = [ "/src", "/tests/mcp_server_polarion", "/tests/__init__.py", "/tests/conftest.py", ] [tool.ruff] target-version = "py313" line-length = 88 # eval fixtures: un-annotated verbose samples (skill input corpus). # references: teaching docs — example code blocks deliberately unformatted # (ruff 0.16 formats markdown code blocks by default). extend-exclude = [".claude/skills/*/evals/files", ".claude/skills/*/references"] [tool.ruff.lint] select = ["E", "W", "F", "I", "UP", "B", "SIM", "ANN", "PL", "C4", "PTH", "RUF", "S"] # PLR0917 stable in ruff 0.16: MCP tool signature = many positional params by design. ignore = ["PLR0917"] [tool.ruff.lint.per-file-ignores] "tests/**" = ["ANN", "PLR", "S101", "S105", "S106"] # eval harness: third-party agent/LLM types (Any-heavy), not shipped. "evals/**" = ["ANN", "PLR", "S101", "S105", "S106", "S603", "S607", "E402"] # PreToolUse hooks: local scripts, not shipped. ".claude/hooks/**" = ["PLR"] # CI release-notes helper: shells out to gh, not shipped. ".github/scripts/**" = ["S603", "S607"] # Skill scripts: shell out to git, not shipped. ".claude/skills/*/scripts/**" = ["S603", "S607"] [tool.mypy] python_version = "3.13" strict = true warn_unreachable = true files = ["src/mcp_server_polarion"] [tool.pytest.ini_options] asyncio_mode = "auto" asyncio_default_fixture_loop_scope = "function" testpaths = ["tests"] [tool.coverage.run] branch = true source = ["src/mcp_server_polarion", "evals"] [tool.coverage.report] show_missing = true exclude_lines = [ "pragma: no cover", "if TYPE_CHECKING:", "raise NotImplementedError", "@overload", # Statement-only Ellipsis stub; bare pattern matched "..." inside Field # description strings = whole tool bodies dropped from measurement (#212). '^\s*\.\.\.\s*$', ]