[project] name = "aegis-gitea-mcp" version = "1.0.0.dev0" description = "MCP server exposing the complete Gitea API over stdio and streamable HTTP, with admin-token and per-user OAuth modes" authors = [ {name = "AegisGitea MCP Contributors"} ] readme = "README.md" requires-python = ">=3.10" license = {text = "MIT"} keywords = ["mcp", "gitea", "ai", "audit"] classifiers = [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", ] dependencies = [ "mcp>=2.3,<3", "httpx>=0.27", "pydantic>=2.7", # NoDecode (comma-separated list env vars) needs pydantic-settings 2.7. "pydantic-settings>=2.7", "jsonschema>=4.20", "cryptography>=42", "uvicorn>=0.31", ] [project.scripts] aegis-gitea-mcp = "aegis_gitea_mcp.cli:main" [project.urls] Homepage = "https://git.hiddenden.cafe/Hiddenden/AegisGitea-MCP" Documentation = "https://git.hiddenden.cafe/Hiddenden/AegisGitea-MCP/src/branch/main/README.md" Repository = "https://git.hiddenden.cafe/Hiddenden/AegisGitea-MCP.git" Issues = "https://git.hiddenden.cafe/Hiddenden/AegisGitea-MCP/issues" [dependency-groups] dev = [ "pytest>=8", "pytest-asyncio>=0.23", "pytest-cov>=5", "pytest-httpx>=0.30", "ruff>=0.6", "mypy>=1.10", "types-jsonschema", "pip-audit>=2.7", ] [build-system] requires = ["hatchling"] build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] packages = ["src/aegis_gitea_mcp"] [tool.hatch.build.targets.sdist] include = ["src/aegis_gitea_mcp", "README.md", "LICENSE", "pyproject.toml"] [tool.ruff] line-length = 100 target-version = "py310" src = ["src", "tests"] extend-exclude = ["docs", "spec"] [tool.ruff.lint] select = [ "E", # pycodestyle errors "W", # pycodestyle warnings "F", # pyflakes "I", # isort "B", # flake8-bugbear "C4", # flake8-comprehensions "UP", # pyupgrade "S", # flake8-bandit "SIM", # flake8-simplify "RUF", # ruff-specific ] ignore = [ "E501", # line length is handled by ruff format; long strings and URLs are fine "B008", # function calls in argument defaults (pydantic Field style) ] [tool.ruff.lint.isort] # tests/mcp is a directory, not the SDK: keep "mcp" classified as third party. known-third-party = ["mcp"] [tool.ruff.lint.per-file-ignores] "__init__.py" = ["F401"] "tests/integration/harness.py" = [ "S101", "S603", # the harness drives the trusted local docker CLI with fixed argv "S607", # docker is resolved from PATH on purpose (CI and local hosts differ) ] "tests/**" = [ "S101", # assert is the point of tests "S105", # hardcoded fake tokens in fixtures "S106", # hardcoded fake tokens in fixtures "S108", # fixture paths ] [tool.ruff.format] quote-style = "double" line-ending = "lf" [tool.mypy] python_version = "3.10" warn_return_any = true warn_unused_configs = true disallow_untyped_defs = true disallow_incomplete_defs = true check_untyped_defs = true no_implicit_optional = true warn_redundant_casts = true warn_unused_ignores = true warn_no_return = true strict_equality = true [[tool.mypy.overrides]] module = "tests.*" disallow_untyped_defs = false [tool.pytest.ini_options] minversion = "8.0" addopts = "-ra -q --strict-markers --cov=aegis_gitea_mcp --cov-report=term-missing --cov-fail-under=80" testpaths = ["tests"] pythonpath = ["src"] asyncio_mode = "auto" markers = [ "integration: needs a live Gitea in Docker (opt-in via AEGIS_INTEGRATION=1)", "mcp_smoke: MCP client smoke tests over real transports (opt-in via AEGIS_INTEGRATION=1)", ] [tool.coverage.run] source = ["src"] omit = ["tests/*", "**/__pycache__/*"] [tool.coverage.report] fail_under = 80 exclude_lines = [ "pragma: no cover", "def __repr__", "raise AssertionError", "raise NotImplementedError", "if __name__ == .__main__.:", "if TYPE_CHECKING:", "@abstractmethod", ]