--- name: gitea-labels-milestones description: > Use when reading or writing Gitea labels or milestones — "create a label", "what labels does this repo have", "close the milestone" — or to resolve label names to IDs, or infer a Kind/Priority/Status label from context, even when the user does not say "Gitea". Not applying them to an issue -> `gitea-issues`. Not to a PR -> `gitea-prs`. compatibility: Requires Gitea MCP server configured with write:issue and write:repository token scopes. metadata: category: integration source_keys: - gitea-mcp-repo - gitea-mcp-slim-go - context7-websites-gitea - context7-gitea-tea-cli version: "0.1.6" allowed-tools: Bash mcp__gitea__label_read mcp__gitea__label_write mcp__gitea__milestone_read mcp__gitea__milestone_write --- ## Gotchas - **Applying a label needs a numeric ID; issue/PR responses give only name strings.** Resolve name → ID with `label_read` first. - **`pull_request_read` returns `milestone` as a bare title string, `issue_read` as `{id, title}`.** Recover the ID by listing milestones and matching the title. - **Never assume a `Kind/*`/`Priority/*`/`Status/*` scope is exclusive — read each label's `exclusive` field.** `list_repo_labels` always returns it; `label_write` can only set it via org create methods ("org only"). `true` means Gitea enforces one-per-scope; replacing instead of stacking on a `false` label destroys a valid one. ## Step 1 — Resolve owner, repo and org Extract `owner` and `repo` from the git remote before any tool call (skip if an orchestrating caller already passed them in): ```bash rtk git remote get-url origin ``` No origin, or not a Gitea URL: stop and report "No Gitea remote found — set origin to your Gitea instance URL." The `*_org_label*` methods take `org`, not `owner`/`repo`. Pass that same `owner` as `org` — it's the org name whenever the owner is an organisation, which the remote URL doesn't say. Read the failure text before interpreting it: `list_org_labels` needs `read:organization`, which this skill's declared scopes don't carry, so it fails with a scope error *before* it ever checks org-vs-user. Report the unchecked scope, not an empty pool — only a genuine not-found means the owner is a user account with no org pool. ## Step 2 — Dispatch | Task | Tool | method | |---|---|---| | Resolve a label name to its ID | `label_read` | `"list_repo_labels"`, then `"list_org_labels"` | | List repo labels | `label_read` | `"list_repo_labels"` | | Get one repo label by ID | `label_read` | `"get_repo_label"` | | List org labels | `label_read` | `"list_org_labels"` | | Create a repo/org label | `label_write` | `"create_repo_label"` / `"create_org_label"` | | Edit a repo/org label | `label_write` | `"edit_repo_label"` / `"edit_org_label"` | | Delete a repo/org label | `label_write` | `"delete_repo_label"` / `"delete_org_label"` | | List milestones | `milestone_read` | `"list"` | | Get one milestone by ID | `milestone_read` | `"get"` | | Create a milestone | `milestone_write` | `"create"` | | Update / close a milestone | `milestone_write` | `"update"` | | Delete a milestone | `milestone_write` | `"delete"` | Every list method paginates manually (`per_page` default 30) — iterate `page: 1, 2, ...` until a page returns fewer than `per_page`. A truncated list silently breaks name → ID resolution. If the task is a label operation, read `references/labels.md`; if a milestone operation, read `references/milestones.md`. If the label to apply has to be derived from conversation context rather than named, read `references/label-inference.md`.