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.
gitea-platform-mcp
Full Gitea platform management — 66 tools for repositories, issues, PRs, branches, files, releases, webhooks, and organizations.
Two ways to run (one source file)
skills/gitea/scripts/gitea_mcp.py is both an MCP server and a CLI. The 66 tool functions are
shared; only the entrypoint differs:
- MCP server — registered via
.mcp.json, tools appear asmcp__gitea__<tool>. This is how you connect it to an MCP-aware client. - CLI skill —
uv run skills/gitea/scripts/gitea_mcp.py <tool> --flagsprints one JSON object on stdout. This is how Cline (and theskills/giteaskill) uses it.
# CLI examples
uv run skills/gitea/scripts/gitea_mcp.py --config ./config.json list_instances
uv run skills/gitea/scripts/gitea_mcp.py --config ./config.json get_repo --owner andrey --repo infra
uv run skills/gitea/scripts/gitea_mcp.py list-tools # self-describing catalogue
CLI output contract: exactly one JSON object — {"success": true, "data": …} or
{"success": false, "error": …}. Check the success field, not the exit code.
Setup (one-time)
1. Edit config.json
Open config.json in the plugin folder and fill in your Gitea details:
{
"instances": {
"default": {
"url": "https://your-gitea.example.com",
"token": "your_personal_access_token"
}
},
"default": "default"
}
Multiple Gitea instances
{
"instances": {
"home": {
"url": "https://gitea.home.example.com",
"token": "token_for_home"
},
"work": {
"url": "https://gitea.work.example.com",
"token": "token_for_work"
}
},
"default": "home"
}
Then in chat: "покажи репозитории на work" — Claude передаст instance="work" в инструмент.
2. Create a Gitea token
Gitea → Settings → Applications → Personal Access Tokens
Recommended permissions: repo, issue, notification, user, organization
3. Verify connection
After installing, ask: "проверь подключение к Gitea" — Claude вызовет get_current_user и get_server_info.
Requirements
uvinstalled (https://docs.astral.sh/uv/)- Gitea instance accessible from your computer
Tools (66)
| Category | Tools |
|---|---|
| Meta | list_instances, get_server_info, get_current_user |
| Repositories | list_my_repos, search_repos, get_repo, create_repo, create_org_repo, update_repo, delete_repo, fork_repo, set_repo_topics |
| Branches & Tags | list_branches, get_branch, create_branch, delete_branch, list_tags |
| Files | list_directory, get_file, create_file, update_file, delete_file |
| Issues | list_issues, get_issue, create_issue, update_issue, close_issue, reopen_issue, list_issue_comments, add_issue_comment, edit_issue_comment, delete_issue_comment |
| Labels & Milestones | list_labels, create_label, add_issue_labels, list_milestones, create_milestone |
| Pull Requests | list_pull_requests, get_pull_request, create_pull_request, update_pull_request, merge_pull_request, get_pr_diff, list_pr_files, list_pr_reviews, create_pr_review |
| Releases | list_releases, get_latest_release, create_release, delete_release |
| Webhooks | list_repo_webhooks, create_repo_webhook, delete_repo_webhook |
| Users & Orgs | get_user, search_users, list_my_orgs, get_org, list_org_repos, list_org_members, list_org_teams |
| Commits | list_commits, get_commit, compare_branches, list_repo_contributors |
| Notifications | list_notifications, mark_all_notifications_read |