Files
computer-playbook/roles/web-app-gitea/files/mcp/tools.json
kevinveenbirkenbachandClaude Opus 5 48bc49b492 feat(gitea): authenticate MCP callers through the adapter
The gitea-mcp sidecar holds no credential of its own and expects each
client to supply a Gitea token per request, so it answers initialize and
tools/list to anyone: the deploy probe measured a 200 disclosing the full
tool inventory. No sidecar setting closes that, because serving the
unauthenticated is how the upstream is built.

Front it with the svc-ai-mcp-adapter instance instead. Clients now present
mcp_bearer to compose service giteamcp and get a 401 otherwise; the
adapter presents the minted Gitea token upstream to giteamcpupstream,
which keeps the sidecar image but drops it to the role's own network.

Pin the 24 read-only tools the sidecar serves, captured from the running
instance, so the served surface cannot widen unnoticed.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-18 11:43:42 +02:00

835 lines
19 KiB
JSON

{
"attachment_read": {
"description": "Read issue/comment attachments: list metadata, get metadata, or download content.",
"input_schema": {
"properties": {
"attachment_id": {
"description": "required for get and for download when attachment_uuid is not provided",
"type": "number"
},
"attachment_uuid": {
"description": "attachment UUID for direct download path lookup",
"type": "string"
},
"comment_id": {
"description": "required for comment attachment list/get or comment-scoped metadata lookup",
"type": "number"
},
"issue_number": {
"description": "required for issue attachment list/get or issue-scoped metadata lookup",
"type": "number"
},
"method": {
"enum": [
"list",
"get",
"download"
],
"type": "string"
},
"output_path": {
"description": "write the attachment to this exact path",
"type": "string"
},
"owner": {
"description": "repo owner",
"type": "string"
},
"repo": {
"description": "repo name",
"type": "string"
}
},
"required": [
"method",
"owner",
"repo"
],
"type": "object"
},
"mutating": false
},
"get_commit": {
"description": "Get details for a single commit in a repository by its SHA.",
"input_schema": {
"properties": {
"owner": {
"description": "repo owner",
"type": "string"
},
"repo": {
"description": "repo name",
"type": "string"
},
"sha": {
"type": "string"
}
},
"required": [
"owner",
"repo",
"sha"
],
"type": "object"
},
"mutating": false
},
"get_dir_contents": {
"description": "List the entries (files and subdirectories) in a repository directory at a given ref (branch, tag, or commit SHA).",
"input_schema": {
"properties": {
"owner": {
"description": "repo owner",
"type": "string"
},
"path": {
"type": "string"
},
"ref": {
"description": "branch, tag, or commit SHA",
"type": "string"
},
"repo": {
"description": "repo name",
"type": "string"
}
},
"required": [
"owner",
"repo",
"ref",
"path"
],
"type": "object"
},
"mutating": false
},
"get_file_contents": {
"description": "Get file content and metadata",
"input_schema": {
"properties": {
"owner": {
"description": "repo owner",
"type": "string"
},
"path": {
"type": "string"
},
"ref": {
"description": "branch, tag, or commit SHA",
"type": "string"
},
"repo": {
"description": "repo name",
"type": "string"
},
"withLines": {
"description": "return numbered lines",
"type": "boolean"
}
},
"required": [
"owner",
"repo",
"ref",
"path"
],
"type": "object"
},
"mutating": false
},
"get_latest_release": {
"description": "Get the most recent published (non-draft) release in a repository.",
"input_schema": {
"properties": {
"owner": {
"description": "repo owner",
"type": "string"
},
"repo": {
"description": "repo name",
"type": "string"
}
},
"required": [
"owner",
"repo"
],
"type": "object"
},
"mutating": false
},
"get_me": {
"description": "Get current user",
"input_schema": {
"properties": {},
"required": [],
"type": "object"
},
"mutating": false
},
"get_release": {
"description": "Get a release by ID",
"input_schema": {
"properties": {
"id": {
"type": "number"
},
"owner": {
"description": "repo owner",
"type": "string"
},
"repo": {
"description": "repo name",
"type": "string"
}
},
"required": [
"owner",
"repo",
"id"
],
"type": "object"
},
"mutating": false
},
"get_repository_tree": {
"description": "Get the file tree of a repository at a given ref (SHA, branch, or tag), optionally recursively.",
"input_schema": {
"properties": {
"owner": {
"description": "repo owner",
"type": "string"
},
"page": {
"default": 1,
"description": "page",
"type": "number"
},
"per_page": {
"default": 30,
"description": "results per page",
"type": "number"
},
"recursive": {
"type": "boolean"
},
"repo": {
"description": "repo name",
"type": "string"
},
"tree_sha": {
"description": "SHA, branch, or tag",
"type": "string"
}
},
"required": [
"owner",
"repo",
"tree_sha"
],
"type": "object"
},
"mutating": false
},
"get_tag": {
"description": "Get details for a single tag in a repository by name.",
"input_schema": {
"properties": {
"owner": {
"description": "repo owner",
"type": "string"
},
"repo": {
"description": "repo name",
"type": "string"
},
"tag_name": {
"type": "string"
}
},
"required": [
"owner",
"repo",
"tag_name"
],
"type": "object"
},
"mutating": false
},
"get_user_orgs": {
"description": "List current user's organizations",
"input_schema": {
"properties": {
"page": {
"default": 1,
"description": "page",
"type": "number"
},
"per_page": {
"default": 30,
"description": "results per page",
"type": "number"
}
},
"required": [],
"type": "object"
},
"mutating": false
},
"issue_read": {
"description": "Read issue: details, comments, or labels.",
"input_schema": {
"properties": {
"issue_number": {
"type": "number"
},
"method": {
"enum": [
"get",
"get_comments",
"get_labels"
],
"type": "string"
},
"owner": {
"description": "repo owner",
"type": "string"
},
"repo": {
"description": "repo name",
"type": "string"
}
},
"required": [
"method",
"owner",
"repo",
"issue_number"
],
"type": "object"
},
"mutating": false
},
"list_branches": {
"description": "List all branches in a repository, paginated.",
"input_schema": {
"properties": {
"owner": {
"description": "repo owner",
"type": "string"
},
"page": {
"default": 1,
"description": "page",
"type": "number"
},
"per_page": {
"default": 30,
"description": "results per page",
"type": "number"
},
"repo": {
"description": "repo name",
"type": "string"
}
},
"required": [
"owner",
"repo"
],
"type": "object"
},
"mutating": false
},
"list_commits": {
"description": "List commits in a repository, optionally starting from a specific branch or SHA and filtered to commits touching a given file path.",
"input_schema": {
"properties": {
"owner": {
"description": "repo owner",
"type": "string"
},
"page": {
"default": 1,
"description": "page",
"minimum": 1,
"type": "number"
},
"path": {
"description": "only commits touching this path",
"type": "string"
},
"per_page": {
"default": 30,
"description": "results per page",
"minimum": 1,
"type": "number"
},
"repo": {
"description": "repo name",
"type": "string"
},
"sha": {
"description": "starting SHA or branch",
"type": "string"
}
},
"required": [
"owner",
"repo"
],
"type": "object"
},
"mutating": false
},
"list_issues": {
"description": "List issues in a repository (or pull requests, via the 'type' filter), filterable by state, labels, milestones, and update time range.",
"input_schema": {
"properties": {
"before": {
"description": "updated before ISO 8601",
"type": "string"
},
"labels": {
"description": "label name filter",
"items": {
"type": "string"
},
"type": "array"
},
"milestones": {
"description": "milestone name or ID filter",
"items": {
"type": "string"
},
"type": "array"
},
"owner": {
"description": "repo owner",
"type": "string"
},
"page": {
"default": 1,
"description": "page",
"type": "number"
},
"per_page": {
"default": 30,
"description": "results per page",
"type": "number"
},
"repo": {
"description": "repo name",
"type": "string"
},
"since": {
"description": "updated after ISO 8601",
"type": "string"
},
"state": {
"default": "all",
"type": "string"
},
"type": {
"description": "issues or pulls",
"enum": [
"issues",
"pulls"
],
"type": "string"
}
},
"required": [
"owner",
"repo"
],
"type": "object"
},
"mutating": false
},
"list_my_repos": {
"description": "List repositories owned by the authenticated user.",
"input_schema": {
"properties": {
"page": {
"default": 1,
"description": "page",
"minimum": 1,
"type": "number"
},
"per_page": {
"default": 30,
"description": "results per page",
"minimum": 1,
"type": "number"
}
},
"required": [],
"type": "object"
},
"mutating": false
},
"list_org_repos": {
"description": "List repositories belonging to an organization.",
"input_schema": {
"properties": {
"org": {
"type": "string"
},
"page": {
"default": 1,
"description": "page",
"minimum": 1,
"type": "number"
},
"per_page": {
"default": 100,
"description": "results per page",
"minimum": 1,
"type": "number"
}
},
"required": [
"org"
],
"type": "object"
},
"mutating": false
},
"list_pull_requests": {
"description": "List pull requests in a repository, filterable by state and milestone, with configurable sort order (e.g. recently updated, most commented).",
"input_schema": {
"properties": {
"milestone": {
"type": "number"
},
"owner": {
"description": "repo owner",
"type": "string"
},
"page": {
"default": 1,
"description": "page",
"type": "number"
},
"per_page": {
"default": 30,
"description": "results per page",
"type": "number"
},
"repo": {
"description": "repo name",
"type": "string"
},
"sort": {
"default": "recentupdate",
"enum": [
"oldest",
"recentupdate",
"leastupdate",
"mostcomment",
"leastcomment",
"priority"
],
"type": "string"
},
"state": {
"default": "all",
"enum": [
"open",
"closed",
"all"
],
"type": "string"
}
},
"required": [
"owner",
"repo"
],
"type": "object"
},
"mutating": false
},
"list_releases": {
"description": "List releases in a repository, optionally filtered to drafts or pre-releases.",
"input_schema": {
"properties": {
"is_draft": {
"type": "boolean"
},
"is_pre_release": {
"type": "boolean"
},
"owner": {
"description": "repo owner",
"type": "string"
},
"page": {
"default": 1,
"description": "page",
"minimum": 1,
"type": "number"
},
"per_page": {
"default": 20,
"description": "results per page",
"minimum": 1,
"type": "number"
},
"repo": {
"description": "repo name",
"type": "string"
}
},
"required": [
"owner",
"repo"
],
"type": "object"
},
"mutating": false
},
"list_tags": {
"description": "List all tags in a repository, paginated.",
"input_schema": {
"properties": {
"owner": {
"description": "repo owner",
"type": "string"
},
"page": {
"default": 1,
"description": "page",
"minimum": 1,
"type": "number"
},
"per_page": {
"default": 20,
"description": "results per page",
"minimum": 1,
"type": "number"
},
"repo": {
"description": "repo name",
"type": "string"
}
},
"required": [
"owner",
"repo"
],
"type": "object"
},
"mutating": false
},
"pull_request_read": {
"description": "Read pull request: details, diff, changed files, head commit status, reviews, review comments.",
"input_schema": {
"properties": {
"binary": {
"description": "include binary diff",
"type": "boolean"
},
"method": {
"enum": [
"get",
"get_diff",
"get_files",
"get_status",
"get_reviews",
"get_review",
"get_review_comments"
],
"type": "string"
},
"owner": {
"description": "repo owner",
"type": "string"
},
"page": {
"default": 1,
"description": "page",
"type": "number"
},
"per_page": {
"default": 30,
"description": "results per page",
"type": "number"
},
"pull_number": {
"type": "number"
},
"repo": {
"description": "repo name",
"type": "string"
},
"review_id": {
"description": "for 'get_review'; optional for 'get_review_comments', omit to list all",
"type": "number"
}
},
"required": [
"method",
"owner",
"repo",
"pull_number"
],
"type": "object"
},
"mutating": false
},
"search_issues": {
"description": "Search issues and PRs across repositories",
"input_schema": {
"properties": {
"labels": {
"description": "comma-separated",
"type": "string"
},
"owner": {
"description": "filter by owner",
"type": "string"
},
"page": {
"default": 1,
"description": "page",
"type": "number"
},
"per_page": {
"default": 30,
"description": "results per page",
"type": "number"
},
"query": {
"type": "string"
},
"state": {
"enum": [
"open",
"closed",
"all"
],
"type": "string"
},
"type": {
"enum": [
"issues",
"pulls"
],
"type": "string"
}
},
"required": [
"query"
],
"type": "object"
},
"mutating": false
},
"search_org_teams": {
"description": "Search for teams within an organization by name, optionally including each team's description in the results.",
"input_schema": {
"properties": {
"includeDescription": {
"type": "boolean"
},
"org": {
"type": "string"
},
"page": {
"default": 1,
"description": "page",
"type": "number"
},
"per_page": {
"default": 30,
"description": "results per page",
"type": "number"
},
"query": {
"type": "string"
}
},
"required": [
"org",
"query"
],
"type": "object"
},
"mutating": false
},
"search_repos": {
"description": "Search for repositories by keyword, with filters for topic/description matching, owner, visibility, archived status, and sort order.",
"input_schema": {
"properties": {
"isArchived": {
"type": "boolean"
},
"isPrivate": {
"type": "boolean"
},
"keywordInDescription": {
"type": "boolean"
},
"keywordIsTopic": {
"type": "boolean"
},
"order": {
"type": "string"
},
"ownerID": {
"type": "number"
},
"page": {
"default": 1,
"description": "page",
"type": "number"
},
"per_page": {
"default": 30,
"description": "results per page",
"type": "number"
},
"query": {
"type": "string"
},
"sort": {
"type": "string"
}
},
"required": [
"query"
],
"type": "object"
},
"mutating": false
},
"search_users": {
"description": "Search for Gitea users by username or full name.",
"input_schema": {
"properties": {
"page": {
"default": 1,
"description": "page",
"type": "number"
},
"per_page": {
"default": 30,
"description": "results per page",
"type": "number"
},
"query": {
"type": "string"
}
},
"required": [
"query"
],
"type": "object"
},
"mutating": false
}
}