Adapted from python-project-template-internal/init.sh but trimmed to
what applies to an MCP server: no Docker, no CI-to-NAS, no deploy step
(see './init.sh help' for rationale). Single dev dependency group instead
of separate lint/type/tests groups, since this project doesn't need that
split.
Verifies: uv → Python → uv sync → ruff check → ruff format --check →
mypy → pytest. Exit 0 = ready; exit 1 = stop and fix.
MCP server exposing self-hosted Gitea (gitlab.impresion3d.pro) via stdio
JSON-RPC 2.0. Six tools: list_repos, get_repo, get_file, create_issue,
list_open_prs, merge_pr. The merge_pr tool pins the Gitea 'do'-field trap
(see skill gitea pitfall #13) — sends lowercase 'do', treats HTTP 200
with non-empty body as failure.
Stack: FastMCP + httpx + pydantic + uv, with respx-mocked pytest suite
(15 tests, 0.69s) and ruff + mypy strict green.
Verification: scripts/verify_stdio.py boots the server as a subprocess,
exchanges real MCP messages over stdio, and calls list_repos against the
live Gitea instance — all green.