Github Issues
GitHubOfficialContributed by @tgrall via pull request #550Distributed by GitHub
- Skill
- Tool integration
- Software development
- MIT
- No issues found
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill provides a comprehensive interface for interacting with GitHub issues. It leverages the Model Context Protocol (MCP) for efficient read and write operations, while integrating with the GitHub CLI (gh) for advanced tasks that require specific REST or GraphQL API calls. It covers the full lifecycle of issue management, including creation, updates, categorization, project tracking, and complex dependency mapping.
What it does
- Create, update, and manage GitHub issues with support for custom fields and issue types.
- List, search, and filter repository issues using standard GitHub search syntax.
- Manage repository labels, milestones, and project board items.
- Handle complex issue relationships including sub-issues and blocked-by/blocking dependencies.
- Add comments and reactions to existing issues.
- Provide guidance on embedding images and structuring issue content using templates.
When to use it
- When you need to automate the creation of bug reports or feature requests.
- When managing project workflows and tracking issue dependencies.
- When you need to perform bulk updates or complex queries across multiple repositories.
- When you need to interact with GitHub project boards or custom issue metadata.
Advantages
- Unified interface for both simple issue management and advanced API operations.
- Supports canonical GitHub issue types for better categorization.
- Provides structured templates for consistent bug and feature reporting.
- Enables programmatic management of blocked-by/blocking relationships.
- Offers clear guidance on handling private repository images and metadata.
Usage examples
- “Create a bug report for the login page crashing when using SSO.”
- The agent uses the GitHub API to create an issue with the title, body, and type 'Bug' set, returning the new issue's URL.
- “List all high-priority issues in the current repository.”
- The agent uses the MCP search tool to filter issues by the 'high-priority' label and returns a summary list.
- “Mark issue #10 as blocked by issue #5.”
- The agent executes the necessary REST API call to establish a blocking dependency between the two issues.
- “Update issue #12 to closed and add a comment.”
- The agent performs a PATCH request to update the issue state and a POST request to add the specified comment.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/github/github-issues/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip github-issues.zip -d .agents/skills
Documentation by tgrall
GitHub Issues
Manage GitHub issues using the @modelcontextprotocol/server-github MCP server.
Available Tools
MCP Tools (read operations)
| Tool | Purpose |
|---|---|
mcp__github__issue_read | Read issue details, sub-issues, comments, labels (methods: get, get_comments, get_sub_issues, get_labels) |
mcp__github__list_issues | List and filter repository issues by state, labels, date |
mcp__github__search_issues | Search issues across repos using GitHub search syntax |
mcp__github__projects_list | List projects, project fields, project items, status updates |
mcp__github__projects_get | Get details of a project, field, item, or status update |
mcp__github__projects_write | Add/update/delete project items, create status updates |
MCP Tools (write operations)
| Tool | Purpose |
|---|---|
mcp__github__issue_write | Create or update an issue (methods: create, update). Supports title, body, type, labels, assignees, milestone, and issue fields |
mcp__github__add_issue_comment | Add a comment or a reaction to an issue |
mcp__github__sub_issue_write | Add, remove, or reprioritize a sub-issue |
CLI / REST API (write operations)
gh api performs the same writes and is the form used in the examples below. Reach for it when the MCP server is not connected, or when you need a REST field the MCP tools do not expose.
| Operation | Command |
|---|---|
| Create issue | gh api repos/{owner}/{repo}/issues -X POST -f title=... -f body=... |
| Update issue | gh api repos/{owner}/{repo}/issues/{number} -X PATCH -f title=... -f state=... |
| Add comment | gh api repos/{owner}/{repo}/issues/{number}/comments -X POST -f body=... |
| Close issue | gh api repos/{owner}/{repo}/issues/{number} -X PATCH -f state=closed |
| Set issue type | Include -f type=Bug in the create call (REST API only, not supported by gh issue create CLI) |
Note: gh issue create works for basic issue creation but does not support the --type flag. Use gh api when you need to set issue types.
Workflow
Determine action: Create, update, or query?
Gather context: Get repo info, existing labels, milestones if needed
Structure content: Use appropriate template from references/templates.md
Execute: Use MCP tools for reads,
gh apifor writesConfirm: Report the issue URL to user
Creating Issues
Use gh api to create issues. This supports all parameters including issue types.
gh api repos/{owner}/{repo}/issues \
-X POST \
-f title="Issue title" \
-f body="Issue body in markdown" \
-f type="Bug" \
--jq '{number, html_url}'Optional Parameters
Add any of these flags to the gh api call:
-f type="Bug" # Issue type (Bug, Feature, Task, Epic, etc.)
-f 'labels[]=bug' # Labels (repeat for multiple)
-f 'assignees[]=username' # Assignees (repeat for multiple)
-f milestone=1 # Milestone numberQuote the whole name[]=value pair. [] is a glob pattern in zsh, the default shell
on macOS, so an unquoted -f labels[]=bug never reaches gh:
zsh: no matches found: labels[]=bugIssue types are organization-level metadata. To discover available types, use:
gh api graphql -f query='{ organization(login: "ORG") { issueTypes(first: 10) { nodes { name } } } }' --jq '.data.organization.issueTypes.nodes[].name'Prefer issue types over labels for categorization. When issue types are available (e.g., Bug, Feature, Task), use the type parameter instead of applying equivalent labels like bug or enhancement. Issue types are the canonical way to categorize issues on GitHub. Only fall back to labels when the org has no issue types configured.
Title Guidelines
Be specific and actionable
Keep under 72 characters
When issue types are set, don't add redundant prefixes like
[Bug]Examples:
Login fails with SSO enabled(with type=Bug)Add dark mode support(with type=Feature)Add unit tests for auth module(with type=Task)
Body Structure
Always use the templates in references/templates.md. Choose based on issue type:
| User Request | Template |
|---|---|
| Bug, error, broken, not working | Bug Report |
| Feature, enhancement, add, new | Feature Request |
| Task, chore, refactor, update | Task |
Updating Issues
Use gh api with PATCH:
gh api repos/{owner}/{repo}/issues/{number} \
-X PATCH \
-f state=closed \
-f title="Updated title" \
--jq '{number, html_url}'Only include fields you want to change. Available fields: title, body, state (open/closed), labels, assignees, milestone.
Examples
Example 1: Bug Report
User: "Create a bug issue - the login page crashes when using SSO"
Action:
gh api repos/github/awesome-copilot/issues \
-X POST \
-f title="Login page crashes when using SSO" \
-f type="Bug" \
-f body="## Description
The login page crashes when users attempt to authenticate using SSO.
## Steps to Reproduce
1. Navigate to login page
2. Click 'Sign in with SSO'
3. Page crashes
## Expected Behavior
SSO authentication should complete and redirect to dashboard.
## Actual Behavior
Page becomes unresponsive and displays error." \
--jq '{number, html_url}'Example 2: Feature Request
User: "Create a feature request for dark mode with high priority"
Action:
gh api repos/github/awesome-copilot/issues \
-X POST \
-f title="Add dark mode support" \
-f type="Feature" \
-f 'labels[]=high-priority' \
-f body="## Summary
Add dark mode theme option for improved user experience and accessibility.
## Motivation
- Reduces eye strain in low-light environments
- Increasingly expected by users
## Proposed Solution
Implement theme toggle with system preference detection.
## Acceptance Criteria
- [ ] Toggle switch in settings
- [ ] Persists user preference
- [ ] Respects system preference by default" \
--jq '{number, html_url}'Common Labels
Use these standard labels when applicable:
| Label | Use For |
|---|---|
bug | Something isn't working |
enhancement | New feature or improvement |
documentation | Documentation updates |
good first issue | Good for newcomers |
help wanted | Extra attention needed |
question | Further information requested |
wontfix | Will not be addressed |
duplicate | Already exists |
high-priority | Urgent issues |
Tips
Always confirm the repository context before creating issues
Ask for missing critical information rather than guessing
Link related issues when known:
Related to #123For updates, fetch current issue first to preserve unchanged fields
Extended Capabilities
The following features require REST or GraphQL APIs beyond the basic MCP tools. Each is documented in its own reference file so the agent only loads the knowledge it needs.
| Capability | When to use | Reference |
|---|---|---|
| Advanced search | Complex queries with boolean logic, date ranges, cross-repo search, issue field filters (field.name:value) | references/search.md |
| Sub-issues & parent issues | Breaking work into hierarchical tasks | references/sub-issues.md |
| Milestones | Create, read, update, close, reopen, delete milestones and manage milestone issues | references/milestones.md |
| Labels | Discover, create, rename, recolor, and delete repository labels; add or replace labels on an issue | references/labels.md |
| Issue dependencies | Tracking blocked-by / blocking relationships | references/dependencies.md |
| Issue types (advanced) | GraphQL operations beyond MCP list_issue_types / type param | references/issue-types.md |
| Projects V2 | Project boards, progress reports, field management | references/projects.md |
| Issue fields | Custom metadata: dates, priority, text, numbers (private preview) | references/issue-fields.md |
| Images in issues | Embedding images in issue bodies and comments via CLI | references/images.md |
Files
- ATTRIBUTION.mdAdded by AutoGineer927 B
- LICENSELicence file added by AutoGineer1.0 KiB
- SKILL.md9.0 KiB
- references/dependencies.md1.8 KiB
- references/images.md4.7 KiB
- references/issue-fields.md7.6 KiB
- references/issue-types.md1.7 KiB
- references/labels.md5.2 KiB
- references/milestones.md2.4 KiB
- references/projects.md8.4 KiB
- references/search.md7.1 KiB
- references/sub-issues.md3.6 KiB
- references/templates.md1.4 KiB
references/projects.md
Projects V2
GitHub Projects V2 is managed via GraphQL. The MCP server provides three tools that wrap the GraphQL API, so you typically don't need raw GraphQL.
Using MCP tools (preferred)
List projects:
Call mcp__github__projects_list with method: "list_projects", owner, and owner_type ("user" or "organization").
List project fields:
Call mcp__github__projects_list with method: "list_project_fields" and project_number.
List project items:
Call mcp__github__projects_list with method: "list_project_items" and project_number.
Add an issue/PR to a project:
Call mcp__github__projects_write with method: "add_project_item", project_id (node ID), and content_id (issue/PR node ID).
Update a project item field value:
Call mcp__github__projects_write with method: "update_project_item", project_id, item_id, field_id, and value (object with one of: text, number, date, singleSelectOptionId, iterationId).
Delete a project item:
Call mcp__github__projects_write with method: "delete_project_item", project_id, and item_id.
Workflow for project operations
Find the project — see Finding a project by name below
Discover fields - use
projects_listwithlist_project_fieldsto get field IDs and option IDsFind items - use
projects_listwithlist_project_itemsto get item IDsMutate - use
projects_writeto add, update, or delete items
Finding a project by name
⚠️ Known issue:
projectsV2(query: "…")does keyword search, not exact name match, and returns results sorted by recency. Common words like "issue" or "bug" return hundreds of false positives. The actual project may be buried dozens of pages deep.
Use this priority order:
1. Direct lookup (if you know the number)
gh api graphql -f query='{
organization(login: "ORG") {
projectV2(number: 42) { id title }
}
}' --jq '.data.organization.projectV2'2. Reverse lookup from a known issue (most reliable)
If the user mentions an issue, epic, or milestone that's in the project, query that issue's projectItems to discover the project:
gh api graphql -f query='{
repository(owner: "OWNER", name: "REPO") {
issue(number: 123) {
projectItems(first: 10) {
nodes {
id
project { number title id }
}
}
}
}
}' --jq '.data.repository.issue.projectItems.nodes[] | {number: .project.number, title: .project.title, id: .project.id}'This is the most reliable approach for large orgs where name search fails.
3. GraphQL name search with client-side filtering (fallback)
Query a large page and filter client-side for an exact title match:
gh api graphql -f query='{
organization(login: "ORG") {
projectsV2(first: 100, query: "search term") {
nodes { number title id }
}
}
}' --jq '.data.organization.projectsV2.nodes[] | select(.title | test("(?i)^exact name$"))'If this returns nothing, paginate with after cursor or broaden the regex. Results are sorted by recency so older projects require pagination.
4. MCP tool (small orgs only)
Call mcp__github__projects_list with method: "list_projects". This works well for orgs with <50 projects but has no name filter, so you must scan all results.
Project discovery for progress reports
When a user asks for a progress update on a project (e.g., "Give me a progress update for Project X"), follow this workflow:
Find the project — use the finding a project strategies above. Ask the user for a known issue number if name search fails.
Discover fields - call
projects_listwithlist_project_fieldsto find the Status field (its options tell you the workflow stages) and any Iteration field (to scope to the current sprint).Get all items - call
projects_listwithlist_project_items. For large projects (100+ items), paginate through all pages. Each item includes its field values (status, iteration, assignees).Build the report - group items by Status field value and count them. For iteration-based projects, filter to the current iteration first. Present a breakdown like:
Project: Issue Fields (Iteration 42, Mar 2-8) 15 actionable items: 🎉 Done: 4 (27%) In Review: 3 In Progress: 3 Ready: 2 Blocked: 2Add context - if items have sub-issues, include
subIssuesSummarycounts. If items have dependencies, note blocked items and what blocks them.
OAuth Scope Requirements
| Operation | Required scope |
|---|---|
| Read projects, fields, items | read:project |
| Add/update/delete items, change field values | project |
Common pitfall: The default gh auth token often only has read:project. Mutations will fail with INSUFFICIENT_SCOPES. To add the write scope:
gh auth refresh -h github.com -s projectThis triggers a browser-based OAuth flow. You must complete it before mutations will work.
Finding an Issue's Project Item ID
When you know the issue but need its project item ID (e.g., to update its Status), query from the issue side:
gh api graphql -f query='
{
repository(owner: "OWNER", name: "REPO") {
issue(number: 123) {
projectItems(first: 5) {
nodes {
id
project { title number }
fieldValues(first: 10) {
nodes {
... on ProjectV2ItemFieldSingleSelectValue {
name
field { ... on ProjectV2SingleSelectField { name } }
}
}
}
}
}
}
}
}' --jq '.data.repository.issue.projectItems.nodes'This returns the item ID, project info, and current field values in one query.
Using GraphQL via gh api (recommended)
Use gh api graphql to run GraphQL queries and mutations. This is more reliable than MCP tools for write operations.
Find a project and its Status field options:
gh api graphql -f query='
{
organization(login: "ORG") {
projectV2(number: 5) {
id
title
field(name: "Status") {
... on ProjectV2SingleSelectField {
id
options { id name }
}
}
}
}
}' --jq '.data.organization.projectV2'List all fields (including iterations):
gh api graphql -f query='
{
node(id: "PROJECT_ID") {
... on ProjectV2 {
fields(first: 20) {
nodes {
... on ProjectV2Field { id name }
... on ProjectV2SingleSelectField { id name options { id name } }
... on ProjectV2IterationField { id name configuration { iterations { id startDate } } }
}
}
}
}
}' --jq '.data.node.fields.nodes'Update a field value (e.g., set Status to "In Progress"):
gh api graphql -f query='
mutation {
updateProjectV2ItemFieldValue(input: {
projectId: "PROJECT_ID"
itemId: "ITEM_ID"
fieldId: "FIELD_ID"
value: { singleSelectOptionId: "OPTION_ID" }
}) {
projectV2Item { id }
}
}'Value accepts one of: text, number, date, singleSelectOptionId, iterationId.
Add an item:
gh api graphql -f query='
mutation {
addProjectV2ItemById(input: {
projectId: "PROJECT_ID"
contentId: "ISSUE_OR_PR_NODE_ID"
}) {
item { id }
}
}'Delete an item:
gh api graphql -f query='
mutation {
deleteProjectV2Item(input: {
projectId: "PROJECT_ID"
itemId: "ITEM_ID"
}) {
deletedItemId
}
}'End-to-End Example: Set Issue Status to "In Progress"
# 1. Get the issue's project item ID, project ID, and current status
gh api graphql -f query='{
repository(owner: "github", name: "planning-tracking") {
issue(number: 2574) {
projectItems(first: 1) {
nodes { id project { id title } }
}
}
}
}' --jq '.data.repository.issue.projectItems.nodes[0]'
# 2. Get the Status field ID and "In Progress" option ID
gh api graphql -f query='{
node(id: "PROJECT_ID") {
... on ProjectV2 {
field(name: "Status") {
... on ProjectV2SingleSelectField { id options { id name } }
}
}
}
}' --jq '.data.node.field'
# 3. Update the status
gh api graphql -f query='mutation {
updateProjectV2ItemFieldValue(input: {
projectId: "PROJECT_ID"
itemId: "ITEM_ID"
fieldId: "FIELD_ID"
value: { singleSelectOptionId: "IN_PROGRESS_OPTION_ID" }
}) { projectV2Item { id } }
}'Requirements and compatibility
Written for: GitHub Copilot
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs an MCP server, Needs a command-line tool
Security
No issues found by our static scan· No issues found
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Contributed by
@tgrallvia pull request #550
- Publisher
- GitHub (Official)
- Distributed by
- GitHub
- Source
- github/awesome-copilot · skills/github-issues · commit 797337f
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
- Contributors
- alx-so, devantler, labudis, m2moiz
AutoGineer is not affiliated with or endorsed by tgrall or GitHub.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download github-issues.zip