-
Notifications
You must be signed in to change notification settings - Fork 695
Add issue-triage Copilot skill #1412
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
jeffhandley
merged 3 commits into
modelcontextprotocol:main
from
jeffhandley:jeffhandley/mcp-triage
Mar 6, 2026
+432
−0
Merged
Changes from 2 commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,132 @@ | ||
| --- | ||
| name: issue-triage | ||
| description: Generate an issue triage report for the C# MCP SDK. Fetches all open issues, evaluates SLA compliance against SDK tier requirements, reviews issue discussions for status and next steps, cross-references related issues in other MCP SDK repos, and produces a BLUF markdown report. Use when asked to triage issues, audit SLA compliance, review open issues, or generate an issue report. | ||
| compatibility: Requires GitHub API access for issues, comments, labels, and pull requests across modelcontextprotocol repositories. Requires gh CLI for optional gist creation. | ||
| --- | ||
|
|
||
| # Issue Triage Report | ||
|
|
||
| Generate a comprehensive, prioritized issue triage report for the `modelcontextprotocol/csharp-sdk` repository. The C# SDK is **Tier 1** ([tracking issue](https://github.com/modelcontextprotocol/modelcontextprotocol/issues/2261)), so apply the Tier 1 SLA thresholds (for triage, P0 resolution, and other applicable timelines) as defined in the live Tier 1 requirements fetched from `sdk-tiers.mdx` in Step 1. **Triage** means the issue has at least one type label (`bug`, `enhancement`, `question`, `documentation`) or status label (`needs confirmation`, `needs repro`, `ready for work`, `good first issue`, `help wanted`). | ||
|
|
||
| The report follows a **BLUF (Bottom Line Up Front)** structure — leading with the most critical findings and progressing to less-urgent items, with the full backlog collapsed to keep attention on what matters. | ||
|
|
||
| ## Process | ||
|
|
||
| Work through each step sequentially. The skill is designed to run end-to-end without user intervention. | ||
|
|
||
| ### Step 1: Fetch SDK Tier 1 SLA Criteria | ||
|
|
||
| Fetch the live `sdk-tiers.mdx` from: | ||
| ``` | ||
| https://raw.githubusercontent.com/modelcontextprotocol/modelcontextprotocol/refs/heads/main/docs/community/sdk-tiers.mdx | ||
| ``` | ||
|
|
||
| Extract the Tier 1 requirements — triage SLA, critical bug SLA, label definitions (type, status, priority), and P0 criteria. These values drive all classification and SLA calculations in subsequent steps. | ||
|
|
||
| **If the fetch fails, stop and inform the user.** Do not proceed without live tier data. | ||
|
|
||
| ### Step 2: Fetch All Open Issues | ||
|
|
||
| Paginate through all open issues in `modelcontextprotocol/csharp-sdk` via the GitHub API. For each issue, capture: | ||
| - Number, title, body (description) | ||
| - Author and author association (member, contributor, none) | ||
| - Created date, updated date | ||
| - All labels | ||
| - Comment count | ||
| - Assignees | ||
|
|
||
| ### Step 3: Classify Triage Status | ||
|
|
||
| Using the label definitions extracted from `sdk-tiers.mdx` in Step 1, classify each issue: | ||
|
|
||
| | Classification | Criteria | | ||
| |---------------|---------| | ||
| | **Has type label** | Has one of the type labels defined in the tier document | | ||
| | **Has status label** | Has one of the status labels defined in the tier document | | ||
| | **Has priority label** | Has one of the priority labels defined in the tier document | | ||
| | **Is triaged** | Has at least one type OR status label | | ||
| | **Business days since creation** | `floor(calendar_days × 5 / 7)` (approximate, excluding weekends) | | ||
| | **SLA compliant** | Triaged within the tier's required window using the business-day calculation above | | ||
|
|
||
| Compute aggregate metrics: | ||
| - Total open issues | ||
| - Count triaged vs. untriaged | ||
| - Count of SLA violations | ||
| - Counts by type, status, and priority label | ||
| - Count missing each label category | ||
|
|
||
| ### Step 4: Identify Issues Needing Attention | ||
|
|
||
| Build prioritized lists of issues that need action. These are the issues that will receive deep-dive review in Step 5. | ||
|
|
||
| **4a. SLA Violations** — Untriaged issues exceeding the tier's triage SLA threshold. | ||
|
|
||
| **4b. Missing Type Label** — Issues that have a status label but no type label. These are technically triaged but incompletely labeled. | ||
|
|
||
| **4c. Potential P0/P1 Candidates** — Bugs (or unlabeled issues that appear to be bugs) that may warrant P0 or P1 priority based on keywords or patterns: | ||
| - Core transport failures (SSE hanging, Streamable HTTP broken, connection drops) | ||
| - Spec non-compliance (protocol violations, incorrect OAuth handling) | ||
| - Security vulnerabilities | ||
| - NullReferenceException / crash reports | ||
| - Issues with high reaction counts or many comments | ||
|
|
||
| **4d. Stale `needs confirmation` / `needs repro`** — Issues labeled `needs confirmation` or `needs repro` where the last comment from the issue author (not a maintainer or bot) is more than 14 days ago. These are candidates for closing. | ||
|
|
||
| **4e. Duplicate / Consolidation Candidates** — Issues with substantially overlapping titles or descriptions. Group them and recommend which to keep and which to close. | ||
|
|
||
| ### Step 5: Deep-Dive Review of Attention Items | ||
|
|
||
| For every issue identified in Step 4 (SLA violations, missing type, potential P0/P1, stale issues, duplicates), perform a thorough review: | ||
|
|
||
| 1. **Read the full issue description** — understand the reporter's problem and what they're asking for. | ||
| 2. **Read ALL comments** — understand the full discussion history, including: | ||
| - Maintainer responses and their positions | ||
| - Community workarounds or solutions | ||
| - Whether the reporter confirmed a fix or workaround | ||
| - Any linked PRs (open or merged) | ||
| 3. **Summarize current status** — write a concise paragraph describing where the issue stands today. | ||
| 4. **Recommend labels** — specify which type, status, and priority labels should be applied and why. | ||
| 5. **Recommend next steps** — one of: | ||
| - **Close**: if the issue is answered, resolved, or stale without response | ||
| - **Label and keep**: if the issue is valid but needs triage labels | ||
| - **Needs investigation**: if the issue is potentially serious but unconfirmed | ||
| - **Link to PR**: if there's an open PR addressing it | ||
| - **Consolidate**: if it duplicates another issue (specify which) | ||
| 6. **Flag stale issues** — if `needs confirmation` or `needs repro` and the last comment from the reporter is >14 days ago, explicitly note: _"Last author response was on {date} ({N} days ago). Consider closing if no response is received."_ | ||
|
|
||
| ### Step 6: Cross-SDK Analysis | ||
|
|
||
| Using the repository list from [references/cross-sdk-repos.md](references/cross-sdk-repos.md): | ||
|
|
||
| 1. Search each other MCP SDK repo for open issues with related themes. Use the search themes listed in the reference document. | ||
| 2. For each C# SDK issue that has a related issue in another repo, note the cross-reference. | ||
| 3. Group cross-references by theme (OAuth, SSE, Streamable HTTP, etc.) for the report. | ||
| 4. Note the total open issue count for each SDK repo for context. | ||
|
|
||
| This step adds significant value but also significant API calls. If the user asks to skip cross-SDK analysis, respect that. | ||
|
|
||
| ### Step 7: Generate Report | ||
|
|
||
| Produce the triage report following the template in [references/report-format.md](references/report-format.md). The report must follow the BLUF structure with urgency-descending ordering. | ||
|
|
||
| **Output destination:** | ||
| - **Default (local file):** Save as `{YYYY-MM-DD}-mcp-issue-triage.md` in the current working directory. If a file with that name already exists, suffix with `-2`, `-3`, etc. | ||
| - **Gist (if requested):** If the user asked to save as a gist, create a **secret** gist using `gh gist create` with a `--desc` describing the report. No confirmation is needed — create the gist, then notify the user with a clickable link to it. | ||
|
|
||
| The user may request a gist with phrases like "save as a gist", "create a gist", "gist it", "post to gist", etc. | ||
|
|
||
| ### Step 8: Present Summary | ||
|
|
||
| After generating the report, display a brief console summary to the user: | ||
| - Total open issues and triage metrics (triaged/untriaged/SLA violations) | ||
| - Top 3-5 most urgent findings | ||
| - Where the full report was saved (file path or gist URL) | ||
|
|
||
| ## Edge Cases | ||
|
|
||
| - **Issue has only area labels** (e.g., `area-auth`, `area-infrastructure`): these are NOT type or status labels. The issue is untriaged unless it also has a type or status label. | ||
| - **Closed-then-reopened issues**: treat as open; use the original creation date for SLA calculation. | ||
| - **Issues filed by maintainers/contributors**: still subject to triage SLA — all issues need labels regardless of author. | ||
| - **Issues that are tracking issues or meta-issues**: may legitimately lack status labels. Note them but don't flag as SLA violations if they have a type label. | ||
| - **Very old issues (>1 year)**: note age but don't treat all old issues as urgent — they may be intentionally kept open as long-term feature requests. | ||
| - **Rate limiting**: if GitHub API rate limits are hit during cross-SDK analysis, complete the analysis for repos already fetched and note which repos were skipped. | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,48 @@ | ||
| # Cross-SDK Repositories | ||
|
|
||
| This reference lists all official MCP SDK repositories and the themes to search for when cross-referencing issues. | ||
|
|
||
| ## MCP SDK Repositories | ||
|
|
||
| | SDK | Repository | Tier | Tier Tracking Issue | | ||
| |---|---|---|---| | ||
| | TypeScript | [modelcontextprotocol/typescript-sdk](https://github.com/modelcontextprotocol/typescript-sdk) | Tier 1 | [modelcontextprotocol#2271](https://github.com/modelcontextprotocol/modelcontextprotocol/issues/2271) | | ||
| | Python | [modelcontextprotocol/python-sdk](https://github.com/modelcontextprotocol/python-sdk) | Tier 1 | [modelcontextprotocol#2304](https://github.com/modelcontextprotocol/modelcontextprotocol/issues/2304) | | ||
| | Java | [modelcontextprotocol/java-sdk](https://github.com/modelcontextprotocol/java-sdk) | Tier 2 | [modelcontextprotocol#2301](https://github.com/modelcontextprotocol/modelcontextprotocol/issues/2301) | | ||
| | C# | [modelcontextprotocol/csharp-sdk](https://github.com/modelcontextprotocol/csharp-sdk) | Tier 1 | [modelcontextprotocol#2261](https://github.com/modelcontextprotocol/modelcontextprotocol/issues/2261) | | ||
| | Go | [modelcontextprotocol/go-sdk](https://github.com/modelcontextprotocol/go-sdk) | Tier 1 | [modelcontextprotocol#2279](https://github.com/modelcontextprotocol/modelcontextprotocol/issues/2279) | | ||
| | Kotlin | [modelcontextprotocol/kotlin-sdk](https://github.com/modelcontextprotocol/kotlin-sdk) | TBD | — | | ||
| | Swift | [modelcontextprotocol/swift-sdk](https://github.com/modelcontextprotocol/swift-sdk) | Tier 3 | [modelcontextprotocol#2309](https://github.com/modelcontextprotocol/modelcontextprotocol/issues/2309) | | ||
| | Rust | [modelcontextprotocol/rust-sdk](https://github.com/modelcontextprotocol/rust-sdk) | Tier 2 | [modelcontextprotocol#2346](https://github.com/modelcontextprotocol/modelcontextprotocol/issues/2346) | | ||
| | Ruby | [modelcontextprotocol/ruby-sdk](https://github.com/modelcontextprotocol/ruby-sdk) | Tier 3 | [modelcontextprotocol#2340](https://github.com/modelcontextprotocol/modelcontextprotocol/issues/2340) | | ||
| | PHP | [modelcontextprotocol/php-sdk](https://github.com/modelcontextprotocol/php-sdk) | Tier 3 | [modelcontextprotocol#2305](https://github.com/modelcontextprotocol/modelcontextprotocol/issues/2305) | | ||
|
|
||
| **Live SDK list URL:** `https://raw.githubusercontent.com/modelcontextprotocol/modelcontextprotocol/refs/heads/main/docs/docs/sdk.mdx` | ||
|
|
||
| ## Cross-Reference Themes | ||
|
|
||
| When cross-referencing issues across SDK repos, search open issues for these themes. Use the keyword patterns to match against issue titles and the first 500 characters of issue bodies. | ||
|
|
||
| | Theme | Search Keywords | | ||
| |---|---| | ||
| | **OAuth / Authorization** | `oauth`, `authorization`, `auth`, `JWT`, `token`, `Entra`, `OIDC`, `PKCE`, `code_challenge`, `scope`, `WWW-Authenticate`, `bearer`, `client credentials` | | ||
| | **SSE / Keep-Alive** | `SSE`, `server-sent`, `keep-alive`, `keepalive`, `heartbeat`, `event-stream` | | ||
| | **Streamable HTTP** | `streamable http`, `HTTP stream`, `stateless`, `stateful`, `session ID` | | ||
| | **Dynamic Tools** | `dynamic tool`, `tool filter`, `tool registration`, `runtime tool`, `list_changed` | | ||
| | **JSON Serialization** | `JSON serial`, `serializ`, `deserializ`, `JsonSerializer`, `schema` | | ||
| | **Code Signing** | `code sign`, `sign binaries`, `DLL sign`, `strong name` | | ||
| | **Resource Disposal** | `resource dispos`, `dispos resource`, `resource leak`, `memory leak` | | ||
| | **Multiple Endpoints** | `multiple endpoint`, `multiple server`, `multi-server`, `keyed service` | | ||
| | **Structured Content / Output** | `structured content`, `output schema`, `structuredContent` | | ||
| | **Reconnection / Resumption** | `reconnect`, `resume`, `resumption`, `session recovery` | | ||
| | **MCP Apps / Tasks** | `MCP App`, `task`, `elicitation`, `sampling` | | ||
| | **SEP Implementations** | `SEP-990`, `SEP-1046`, `SEP-985`, `SEP-991`, `SEP-835`, `SEP-1686`, `SEP-1699` | | ||
|
|
||
| ## Cross-Reference Usage | ||
|
|
||
| For each theme: | ||
| 1. Search open issues in each non-C# SDK repo using the keyword patterns | ||
| 2. Match C# SDK issues to related issues in other repos | ||
| 3. Present as themed tables in the report | ||
|
|
||
| When a C# SDK issue has a clear counterpart (same SEP number, same feature request, same bug pattern), link them. Don't force connections where the relationship is tenuous. |
175 changes: 175 additions & 0 deletions
175
.github/skills/issue-triage/references/report-format.md
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,175 @@ | ||
| # Report Format | ||
|
|
||
| This reference defines the structure, template, and formatting rules for the issue triage report. | ||
|
|
||
| ## Output Destination | ||
|
|
||
| **Default (local file):** Save as `{YYYY-MM-DD}-mcp-issue-triage.md` in the current working directory. If a file with that name already exists, suffix with `-2`, `-3`, etc. (e.g., `2026-03-05-mcp-issue-triage-2.md`). | ||
|
|
||
| **Gist (if requested):** Create a **secret** gist via `gh gist create --desc "MCP C# SDK Issue Triage Report - {YYYY-MM-DD}" {filepath}` (gists default to secret; there is no `--private` flag). No confirmation is needed — just create it, then notify the user with a clickable link. The user may request a gist with phrases like "save as a gist", "create a gist", "gist it", or "post to gist". | ||
|
|
||
| ## Report Structure | ||
|
|
||
| The report follows a **BLUF (Bottom Line Up Front)** pattern — the most critical information comes first, progressing from urgent to informational. The complete issue backlog is collapsed inside a `<details>` element so it doesn't bury the actionable items. | ||
|
|
||
| ```markdown | ||
| # MCP C# SDK — Issue Triage Report | ||
|
|
||
| **Date:** {YYYY-MM-DD} | ||
| **Repository:** [modelcontextprotocol/csharp-sdk](https://github.com/modelcontextprotocol/csharp-sdk) | ||
| **SDK Tier:** {Tier} ([tracking issue](https://github.com/modelcontextprotocol/modelcontextprotocol/issues/{TierTrackingIssueNumber})) | ||
| **Triage SLA:** Within **{TriageSlaBusinessDays} business days** ({Tier} requirement) | ||
| **Critical Bug SLA:** Resolution within **{CriticalBugSlaDays} days** ({Tier} requirement) | ||
|
|
||
| --- | ||
|
|
||
| ## BLUF (Bottom Line Up Front) | ||
|
|
||
| {2-4 sentences: total open issues, SLA compliance status, number of issues needing | ||
| urgent attention, top finding. This is what a busy maintainer reads first.} | ||
|
|
||
| --- | ||
|
|
||
| ## 🚨 Issues Needing Urgent Attention | ||
|
|
||
| ### SLA Violations — Untriaged Issues | ||
|
|
||
| {For EACH issue: a table with metadata (created, author, labels, comments, reactions) | ||
| followed by a **Status** paragraph summarizing the full discussion and a **Recommended | ||
| actions** list with specific labels and next steps.} | ||
|
|
||
| ### Potential P0/P1 Issues to Assess | ||
|
|
||
| {Same detailed format as SLA violations — these are bugs that may warrant critical | ||
| priority based on core functionality impact or spec compliance.} | ||
|
|
||
| ### ⏰ Stale Issues — Consider Closing | ||
|
|
||
| {Issues labeled `needs confirmation` or `needs repro` where the reporter hasn't | ||
| responded in >14 days. Include the date of the last author comment and a recommendation | ||
| to close if no response.} | ||
|
|
||
| --- | ||
|
|
||
| ## ⚠️ Issues Needing Labels | ||
|
|
||
| ### Missing Type Label | ||
|
|
||
| {Table: issue number, current labels, title, recommended type label.} | ||
|
|
||
| ### Missing Priority Label on Bugs | ||
|
|
||
| {Table: bugs that have type/status labels but no priority label, with recommended priority.} | ||
|
|
||
| --- | ||
|
|
||
| ## 🔀 Duplicate / Consolidation Candidates | ||
|
|
||
| {Table: groups of issues that overlap, with recommendation on which to keep.} | ||
|
|
||
| --- | ||
|
|
||
| ## 🔗 Cross-SDK Related Issues | ||
|
|
||
| {Themed tables mapping C# SDK issues to related issues in other MCP SDK repos. | ||
| Group by theme: OAuth, SSE, Streamable HTTP, Structured Content, Tasks, etc.} | ||
|
|
||
| --- | ||
|
|
||
| ## 📊 Other SDK Context | ||
|
|
||
| {Table of all MCP SDK repos with tier and open issue count, for context.} | ||
|
|
||
| --- | ||
|
|
||
| <details> | ||
| <summary>📋 Complete Open Issue Backlog ({N} issues)</summary> | ||
|
|
||
| ### Bugs ({N}) | ||
|
|
||
| {Full table: #, Created, Age, Labels, Title, Remaining Actions} | ||
|
|
||
| ### Enhancements ({N}) | ||
|
|
||
| {Full table} | ||
|
|
||
| ### Questions ({N}) | ||
|
|
||
| {Full table} | ||
|
|
||
| ### Documentation ({N}) | ||
|
|
||
| {Full table} | ||
|
|
||
| </details> | ||
|
|
||
| --- | ||
|
|
||
| ## 📝 SDK Tier Requirements Checklist | ||
|
|
||
| {Table: each tier requirement, current compliance status, notes} | ||
|
|
||
| --- | ||
|
|
||
| _Report generated {YYYY-MM-DD}. Data sourced from GitHub API._ | ||
| ``` | ||
|
|
||
| ## Formatting Rules | ||
|
|
||
| ### Links | ||
| - **Within csharp-sdk:** Use GitHub shorthand — `#123` for issues/PRs, `@username` for users | ||
| - **Other repos:** Use full URLs — `[typescript-sdk #1090](https://github.com/modelcontextprotocol/typescript-sdk/issues/1090)` | ||
| - **Repo links:** `[modelcontextprotocol/typescript-sdk](https://github.com/modelcontextprotocol/typescript-sdk)` | ||
|
|
||
| ### Age Display | ||
| - Show as `{N}d` (e.g., `35d`, `253d`) | ||
| - Business days calculated as `floor(calendar_days × 5 / 7)` | ||
|
|
||
| ### Issue Detail Blocks | ||
|
|
||
| For each issue in the attention sections (SLA violations, P0/P1 candidates, stale issues), use this format: | ||
|
|
||
| ```markdown | ||
| ### [#{number}](https://github.com/modelcontextprotocol/csharp-sdk/issues/{number}) — {title} | ||
|
|
||
| | Field | Value | | ||
| |---|---| | ||
| | **Created** | {YYYY-MM-DD} (~{N} biz days {overdue / old}) | | ||
| | **Author** | @{login} {(contributor/member) if applicable} | | ||
| | **Labels** | `label1`, `label2` {or _(none)_ ❌ if empty} | | ||
| | **Comments** | {N} · **Reactions:** {N} {emoji} | | ||
| | **Assignee** | @{login} {or _(unassigned)_} | | ||
| | **Open PR** | [#{N}](url) {if any} | | ||
|
|
||
| **Status:** {Concise paragraph summarizing the issue state based on description + all comments. | ||
| Include: what the reporter wants, what maintainers have said, whether the community has | ||
| provided workarounds, whether there are linked PRs. End with the current blocking factor.} | ||
|
|
||
| **Recommended actions:** | ||
| - {Specific label changes: "Add `bug`, `needs repro`, `P2`"} | ||
| - {Next step: "Close as answered", "Request reproduction steps", "Assign to @X", etc.} | ||
| - {If stale: "Last author response was on {date} ({N} days ago). Consider closing."} | ||
| ``` | ||
|
|
||
| ### Backlog Tables | ||
|
|
||
| For the collapsed backlog, use compact tables: | ||
|
|
||
| ```markdown | ||
| | # | Created | Age | Labels | Title | Remaining Actions | | ||
| |---|---|---|---|---|---| | ||
| | [#N](url) | YYYY-MM-DD | Nd | `label1`, `label2` | Short title | Add `P2`; consider closing | | ||
| ``` | ||
|
|
||
| ### Section Emoji Prefixes | ||
|
|
||
| | Section | Emoji | | ||
| |---|---| | ||
| | Urgent attention | 🚨 | | ||
| | Stale issues | ⏰ | | ||
| | Labels needed | ⚠️ | | ||
| | Duplicates | 🔀 | | ||
| | Cross-SDK | 🔗 | | ||
| | Context/stats | 📊 | | ||
| | Backlog | 📋 | | ||
| | Tier checklist | 📝 | |
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.