[build-system] requires = ["setuptools>=64", "setuptools_scm[toml]>=8"] build-backend = "setuptools.build_meta" [project] name = "gitea-mcp" dynamic = ["version"] description = "Model Context Protocol server for Gitea (and Forgejo, Codeberg)." readme = "README.md" requires-python = ">=3.11" license = { text = "MIT" } authors = [ { name = "Sam Ware", email = "samuel@waretech.services" }, ] keywords = ["mcp", "gitea", "forgejo", "codeberg", "model-context-protocol", "llm", "ai"] classifiers = [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Software Development :: Version Control :: Git", ] dependencies = [ # Pinned <3.0: FastMCP 3.x changed stdin/EOF handling such that messages # queued behind `notifications/initialized` (e.g. an immediately-following # `tools/list`) can be dropped when the client closes stdin, breaking the # subprocess regression test that guards the dual-load fix. Migration to # FastMCP 3.x is a separate v0.3.0 task. "fastmcp>=2.0,<3.0", "httpx>=0.27.0", "pydantic>=2.0.0", ] [project.optional-dependencies] dev = [ "pytest>=8.0", "pytest-asyncio>=0.23", "pytest-httpx>=0.30", "ruff>=0.5", "mypy>=1.10", "pre-commit>=3.5", "build>=1.0", "twine>=5.0", ] [project.urls] Homepage = "https://github.com/werebear73/gitea-mcp" Issues = "https://github.com/werebear73/gitea-mcp/issues" Source = "https://github.com/werebear73/gitea-mcp" [project.scripts] gitea-mcp = "gitea_mcp.server:main" [tool.setuptools_scm] write_to = "src/gitea_mcp/_version.py" write_to_template = "__version__ = '{version}'\n" version_scheme = "python-simplified-semver" local_scheme = "no-local-version" [tool.setuptools.packages.find] where = ["src"] [tool.ruff] line-length = 100 target-version = "py311" [tool.ruff.lint] select = ["E", "F", "I", "N", "UP", "B", "SIM"] [tool.ruff.lint.isort] # Explicit first-party declaration so ruff's isort rule (I001) produces the # same import grouping regardless of ruff version. Older ruff (e.g. v0.5) # defaulted to grouping local `gitea_mcp` with third-party; newer ruff # (v0.15+) defaults to treating it as first-party with its own group. # Declaring this here eliminates the divergence and locks in the # third-party / first-party split with a blank line between. known-first-party = ["gitea_mcp"] [tool.mypy] python_version = "3.11" strict = true files = ["src"] [tool.pytest.ini_options] testpaths = ["tests"] asyncio_mode = "auto"