GitHub Issues
Lets an agent triage GitHub issues: search and list issues, read them with their comments, open new issues, comment, add labels and assignees, and update title, body, state or milestone. Curated from GitHub's official OpenAPI specification.
Connect this API to an AI agent Browse all specs
What you can do with GitHub Issues via MCP
Every endpoint below becomes a governed tool your AI agent (Claude, ChatGPT, or a customer-facing VX agent) can call — with scoped permissions, sandbox testing, and audit logs.
| Method | Path | Operation | Description |
|---|---|---|---|
| GET | /search/issues |
searchIssues | Search issues and pull requests with GitHub search syntax |
| GET | /repos/{owner}/{repo}/issues |
listRepoIssues | List a repository's issues (filter by state, labels, assignee, date) |
| POST | /repos/{owner}/{repo}/issues |
createIssue | Open a new issue |
| GET | /repos/{owner}/{repo}/issues/{issue_number} |
getIssue | Get one issue |
| PATCH | /repos/{owner}/{repo}/issues/{issue_number} |
updateIssue | Edit an issue: title, body, state (close/reopen), labels, assignees, milestone |
| GET | /repos/{owner}/{repo}/issues/{issue_number}/comments |
listIssueComments | Read the comments on an issue |
| POST | /repos/{owner}/{repo}/issues/{issue_number}/comments |
createIssueComment | Post a comment on an issue |
| GET | /repos/{owner}/{repo}/labels |
listLabels | List the labels available in a repository |
| GET | /repos/{owner}/{repo}/milestones |
listMilestones | List a repository's milestones |
| POST | /repos/{owner}/{repo}/issues/{issue_number}/labels |
addIssueLabels | Add labels to an issue (keeps existing ones) |
| POST | /repos/{owner}/{repo}/issues/{issue_number}/assignees |
addIssueAssignees | Assign people to an issue |
Authentication
githubToken
Bearer token — sent as Authorization: Bearer <token>
Bearer token: a GitHub fine-grained personal access token (or a GitHub App installation token).
How to get a credential
- On GitHub open Settings > Developer settings > Personal access tokens > Fine-grained tokens > Generate new token.
- Pick the resource owner (your user or the organization; org owners may need to approve the token) and an expiration.
- Under Repository access, choose Only select repositories and pick the repos the agent may triage.
- Under Repository permissions, set Issues: Read and write (Metadata: Read-only is added automatically).
- Generate and copy the token (
github_pat_...).
Permissions used
| Permission | Operations |
|---|---|
| Metadata: read | listLabels, listMilestones |
| Issues: read | listRepoIssues, getIssue, listIssueComments, searchIssues |
| Issues: write | createIssue, updateIssue, createIssueComment, addIssueLabels, addIssueAssignees |
Common errors
- 401 Unauthorized: token expired, revoked or mistyped.
- 403 Forbidden: the token lacks Issues write, the org has not approved the fine-grained token, or a secondary rate limit was hit (check the message).
- 404 Not Found: the repo is not in the token's selected repositories (GitHub hides private repos as 404).
- 422 Unprocessable Entity: invalid label, assignee without push access, or bad milestone number.
- 429 / 403 rate limit: wait until
x-ratelimit-reset(5,000 requests/hour; search is 30/minute).
Store the token as a VX Agents Bearer credential.
Usage guide
Setup
- Credential: a fine-grained personal access token with Issues: Read and write on the repositories to triage, stored as a Bearer credential.
- Worth pinning as presets:
ownerandrepowhen the agent works on one repository. X-GitHub-Api-Versionis pinned to2022-11-28on every operation; leave it as is.
Triage issues
- Find issues:
searchIssueswithq, e.g.repo:acme/app is:issue is:open no:label,repo:acme/app is:issue is:open label:bug sort:updated-desc,org:acme is:issue assignee:@me. Always addis:issue(search also returns pull requests). OrlistRepoIssueswithstate,labels(comma-separated),assignee,since. - Read:
getIssue, thenlistIssueCommentsfor the discussion. - Classify:
listLabelsonce to see valid label names, thenaddIssueLabelswith{"labels": ["bug", "p1"]}(adds, keeps existing).addIssueAssigneeswith{"assignees": ["octocat"]}. UselistMilestones+updateIssuemilestone(the milestone number) to schedule. - Respond:
createIssueCommentwith a markdownbody. Show the comment to the user first when it speaks for the team. - Close or reopen with
updateIssue{"state": "closed", "state_reason": "completed" | "not_planned"}only after the user confirms. - New issue:
createIssuewithtitle,body, optionallabels,assignees.
Good to know
listRepoIssuesalso returns pull requests; skip items that have apull_requestfield.issue_numberis the number shown in the UI (#123), not the internalid.updateIssuewithlabelsorassigneesreplaces the whole list; use the add operations to append.- Paging:
per_pageup to 100 andpage; search returns at most 1,000 results and allows 30 requests/minute. - Times are ISO 8601 UTC (
since=2026-10-01T00:00:00Z; searchcreated:>=2026-10-01). - Assignees must have access to the repository, or GitHub silently ignores them.
- No delete operations by design.
How to use this spec
- Create a free VX Agents account (sandbox tools included).
- Open the marketplace and connect “GitHub Issues” to an agent.
- Expose it as an MCP server for Claude/ChatGPT, or chat with it directly.