Step-by-step guide for creating GitHub issues using GitHub MCP Server tools. Use this when asked to create a GitHub issue, file a bug report, request a feature, or open a tracking issue in a GitHub repository.
This skill provides a comprehensive, deterministic procedure for creating well-structured GitHub issues using the GitHub MCP Server tools. Follow every step in order. Do not skip steps. If a step fails, stop and report the error before continuing.
Before starting, confirm the following:
mcp_github or mcp_github2 prefixed tools are accessible. If not, activate them by calling activate_repository_management_tools or activate_repository_management_tools_2.owner (GitHub username or organization) and repo (repository name). If the user has not provided these, infer them from the current workspace's git remote, or ask the user.Tool: mcp_github_get_me or mcp_github2_get_me
Call this first to confirm the authenticated user's identity and permissions. This ensures you have write access to create issues.
Action:
Call get_me with no parameters.
Expected output: A JSON object with the authenticated user's login, name, and scopes. If this fails, stop — the user likely needs to authenticate or configure the MCP server.
Tool: mcp_github_list_issue_types or mcp_github2_list_issue_types
If the repository is owned by an organization (not a personal account), check whether the organization has configured custom issue types.
Action:
Call list_issue_types with:
owner: "<organization-name>"
Decision logic:
Bug, Feature, Task), you must use the appropriate type field when creating the issue in Step 5.type field entirely in Step 5.Tool: mcp_github_search_issues or activate activate_issue_and_commit_tools / activate_issue_and_commit_tools to access search_issues
Before creating a new issue, always search for existing issues that may already cover the same topic to avoid duplicates.
Action:
Call search_issues with:
query: "<keywords from the issue title or description> repo:<owner>/<repo> is:issue"
perPage: 10
Decision logic:
Before calling the creation tool, assemble all issue fields. Each field has specific formatting guidelines.
[Bug], [Feature], [Chore], [Docs], [Refactor].Bug Report Template:
## Description
<1–3 sentences describing the problem.>
## Steps to Reproduce
1. <Step one>
2. <Step two>
3. <Step three>
## Expected Behavior
<What should happen.>
## Actual Behavior
<What actually happens. Include error messages, stack traces, or screenshots if available.>
## Environment
- **OS:** <e.g., Windows 11, macOS 14>
- **Browser/Runtime:** <e.g., Chrome 120, Node.js 20>
- **Version/Commit:** <e.g., v2.3.1 or commit SHA>
## Additional Context
<Any other relevant information, logs, or links.>
Feature Request Template:
## Summary
<1–2 sentences describing the desired feature.>
## Motivation
<Why is this feature needed? What problem does it solve?>
## Proposed Solution
<Describe the implementation approach or desired behavior.>
## Alternatives Considered
<What other approaches were evaluated and why they were not chosen?>
## Acceptance Criteria
- [ ] <Criterion 1>
- [ ] <Criterion 2>
- [ ] <Criterion 3>
## Additional Context
<Mockups, links, or related issues.>
Task / Chore Template:
## Summary
<1–2 sentences describing the task.>
## Details
<Detailed description of what needs to be done.>
## Checklist
- [ ] <Subtask 1>
- [ ] <Subtask 2>
- [ ] <Subtask 3>
## Related Issues
<Links to related issues or PRs, if any.>
If the user has provided free-form text, restructure it into the most appropriate template above. Do not discard any information the user provided.
bug, enhancement, documentation, good first issue, help wanted, priority:high, priority:low.get_label with the suspected label name to verify, or use search_issues output to observe labels on similar issues.list_issue_types (e.g., "Bug", "Feature").Tool: mcp_github_issue_write
Action:
Call issue_write with:
method: "create"
owner: "<owner>"
repo: "<repo>"
title: "<composed title from Step 4a>"
body: "<composed body from Step 4b>"
labels: [<labels from Step 4c>] # omit if none
assignees: [<assignees from Step 4d>] # omit if none
milestone: <milestone from Step 4e> # omit if none
type: "<type from Step 4f>" # omit if not applicable
Expected output: A JSON object containing the created issue's number, html_url, title, and state.
Error handling:
After successful creation, report back to the user with:
Format:
Created issue #<number>: <title>
URL: <html_url>
Labels: <labels or "none">
Assignees: <assignees or "none">
method: "create" parameter when calling issue_write for new issues. Use method: "update" only for modifying existing issues.| Parameter | Type | Required | Notes |
|---|---|---|---|
method | string | Yes | Always "create" for new issues. |
owner | string | Yes | Repository owner (user or org). |
repo | string | Yes | Repository name. |
title | string | Yes | Concise, prefixed issue title. |
body | string | Yes | Markdown-formatted body using a template. |
labels | string[] | No | Must be pre-existing labels in the repo. |
assignees | string[] | No | Must be collaborators of the repo. |
milestone | number | No | Milestone number (integer), not title. |
type | string | No | Only for orgs with configured issue types. |
state | string | No | Only used when updating ("open" or "closed"). |
state_reason | string | No | Only used when closing ("completed", "not_planned", "duplicate"). |
duplicate_of | number | No | Only used with state_reason: "duplicate". |