Relocate the script into the skill (skills/gitea/scripts/gitea_mcp.py) and add a PEP 723 dependency block, so `uv run scripts/gitea_mcp.py` provisions deps with no install step and the skill folder is portable (drop into ~/.cline/skills/). Drop the non-standard `metadata` frontmatter — Cline only recognizes name + description. - .mcp.json points at the relocated script and runs with --no-project (PEP 723) - SKILL.md uses relative scripts/ paths; metadata block removed - find_config walks up the tree to locate config.json (skill root or plugin root) - tests import gitea_mcp via pytest pythonpath; README/CLAUDE paths updated Tests: 119 passed, 92% coverage. Standalone list-tools verified via uv --no-project.
8.4 KiB
name, description
| name | description |
|---|---|
| gitea | Use this skill when the user asks to work with their Gitea server: "покажи мои репозитории", "создай репозиторий", "открой issue", "закрой issue", "создай pull request", "смерджи PR", "добавь вебхук", "покажи релизы", "создай ветку", "покажи коммиты", "сравни ветки", "список организаций", "переключись на work gitea", "gitea", "list repos", "create issue", "open PR", "merge pull request", "create release", "add webhook", "list branches", "gitea notifications", "check gitea connection". |
Gitea Platform Assistant
Full Gitea REST API — 66 tools for repos, issues, PRs, branches, files, releases, webhooks, organizations. One source file, two ways to call it (pick whichever your runtime gives you):
- CLI (this skill):
uv run scripts/gitea_mcp.py <tool> --param value→ prints one JSON object on stdout. This is the default for Cline. - MCP server: the same tools exposed as
mcp__gitea__<tool>when the script is registered via.mcp.json. Use these instead ofexecute_commandif the tools are already available to you.
Tool names and parameters are identical in both modes — only the call syntax
differs (CLI uses --dashed-flags, MCP uses named arguments).
Calling via CLI
The script is bundled inside this skill at scripts/gitea_mcp.py and carries its
own PEP 723 dependency block, so uv provisions everything on first run — no
install step. Run it from the skill directory:
uv run scripts/gitea_mcp.py <tool> [--flags]
Convert snake_case params to --dashed flags. Booleans use --flag / --no-flag
(e.g. --private / --no-private). List params take space-separated values
(e.g. --topics ci backend).
Config is auto-discovered (config.json in the skill folder or a parent). Pass
--config <path> to point elsewhere.
Output contract: exactly one JSON object on stdout. Always check success:
{"success": true, "data": <Gitea response>}
{"success": false, "error": "Gitea API 404: ...", "type": "RuntimeError"}
The process exits 0 even on tool-level errors — read success, not the exit code.
Discovery
uv run scripts/gitea_mcp.py list-tools
Returns every tool with its description and parameter spec (name / type / required). Use it when unsure of a flag instead of guessing.
First Use
Always start by checking the connection:
uv run scripts/gitea_mcp.py list_instances → configured instances + default
uv run scripts/gitea_mcp.py get_current_user → verifies auth works
If these fail with a config error, tell the user to create config.json in the
skill folder (copy config.example.json from the plugin root).
Instance Selection
Every tool takes an optional --instance (default "" = use config default).
- User says "на work" / "on the work server" → add
--instance work. - No instance mentioned → omit
--instance(uses config default).
Tool Categories
Meta & Health
list_instances— show all configured instancesget_server_info --instance <name>— Gitea versionget_current_user --instance <name>— authenticated user
Repositories
list_my_repos --limit 50 --page 1search_repos --query <q>get_repo --owner <o> --repo <r>create_repo --name <n> --description <d> --private/--no-private --auto-init/--no-auto-init --default-branch maincreate_org_repo --org <org> --name <n> …update_repo --owner <o> --repo <r> --description … --no-private --website …delete_repo --owner <o> --repo <r>⚠️ permanentfork_repo --owner <o> --repo <r> --organization … --new-repo-name …set_repo_topics --owner <o> --repo <r> --topics ci backend
Branches & Tags
list_branches --owner <o> --repo <r>get_branch --owner <o> --repo <r> --branch <b>create_branch --owner <o> --repo <r> --new-branch-name <b> --old-branch-name <src>delete_branch --owner <o> --repo <r> --branch <b>⚠️list_tags --owner <o> --repo <r>
Files
list_directory --owner <o> --repo <r> --path <p> --ref <branch>— browse treeget_file --owner <o> --repo <r> --filepath <p> --ref <branch>— content + shacreate_file --owner <o> --repo <r> --filepath <p> --content "<text>" --message <msg> --branch <b>— plain text, auto-encodedupdate_file … --content "<text>" --message <msg> --sha <sha> --branch <b>— sha from get_filedelete_file … --message <msg> --sha <sha> --branch <b>— sha required
Issues
list_issues --owner <o> --repo <r> --state open|closed|all --issue-type issues|pulls --labels … --assignee … --limit 20get_issue --owner <o> --repo <r> --index <n>create_issue --owner <o> --repo <r> --title <t> --body <b> --assignees alice bob --labels 1 2update_issue --owner <o> --repo <r> --index <n> --title … --body … --state open|closedclose_issue/reopen_issue --owner <o> --repo <r> --index <n>list_issue_comments/add_issue_comment --body <b>/edit_issue_comment --comment-id <id> --body <b>/delete_issue_comment --comment-id <id>
Labels & Milestones
list_labels/create_label --name <n> --color "#rrggbb"/add_issue_labels --index <n> --label-ids 1 2list_milestones --state open|closed|all/create_milestone --title <t> --due-on 2024-12-31T00:00:00Z
Pull Requests
list_pull_requests --owner <o> --repo <r> --state open|closed|allget_pull_request --owner <o> --repo <r> --index <n>create_pull_request --owner <o> --repo <r> --title <t> --head <src-branch> --base <target-branch> --body <b>update_pull_request --owner <o> --repo <r> --index <n> --title … --body … --state …merge_pull_request --owner <o> --repo <r> --index <n> --merge-style merge|rebase|squash|fast-forward-only --delete-branch-after-mergeget_pr_diff --owner <o> --repo <r> --index <n>— returns diff textlist_pr_files --owner <o> --repo <r> --index <n>list_pr_reviews/create_pr_review --index <n> --state APPROVED|COMMENT|REQUEST_CHANGES --body <b>
Releases
list_releases/get_latest_release/create_release --tag-name <t> --name <n> --body … --draft --prerelease/delete_release --release-id <id>
Webhooks
list_repo_webhooks/create_repo_webhook --url <u> --events push issues pull_request --secret …/delete_repo_webhook --hook-id <id>
Users & Organizations
get_current_user/get_user --username <u>/search_users --query <q>list_my_orgs/get_org --org <org>/list_org_repos --org <org>/list_org_members --org <org>/list_org_teams --org <org>
Commits & Activity
list_commits --owner <o> --repo <r> --sha <ref> --path <p> --limit 20get_commit --owner <o> --repo <r> --sha <sha>—--no-stat/--no-filesto slim outputcompare_branches --owner <o> --repo <r> --base <b> --head <h>— diff + commit listlist_repo_contributors --owner <o> --repo <r>
Notifications
list_notifications --include-read --limit 20/mark_all_notifications_read
Typical Examples
# Open an issue
uv run scripts/gitea_mcp.py create_issue \
--owner andrey --repo infra --title "CI flaky on main" --body "Fails ~1/5 runs"
# Edit then commit a file (two steps — get sha first)
uv run scripts/gitea_mcp.py get_file --owner andrey --repo infra --filepath README.md
uv run scripts/gitea_mcp.py update_file --owner andrey --repo infra --filepath README.md \
--content "new text" --message "docs: tweak" --sha <sha-from-get_file>
# Create and merge a PR on the work instance
uv run scripts/gitea_mcp.py create_pull_request --owner team --repo svc \
--title "Feature X" --head feature/x --base main --instance work
uv run scripts/gitea_mcp.py merge_pull_request --owner team --repo svc --index 42 \
--merge-style squash --delete-branch-after-merge --instance work
Notes / Gotchas
- File edits are two-step:
get_file→ use itsshainupdate_file/delete_file. Without the current sha Gitea rejects the write. - Destructive ops (
delete_repo,delete_branch,delete_release) are permanent — confirm with the user before running. list_issues --issue-type pullsreturns PRs (Gitea treats PRs as issues).- Multi-value flags (
--topics,--events,--assignees,--label-ids) take space-separated values, not a comma string.