Publish a GitHub release for the C# MCP SDK after a prepare-release PR has been merged. Refreshes release notes to include any PRs merged since preparation, warns about version or breaking change impacts from late-arriving PRs, and creates a draft GitHub release. Use when asked to publish a release, finalize a release, create release notes, or complete a release after the prepare-release PR has been merged.
70
86%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Low
Low-risk findings worth noting
Create a GitHub release for the modelcontextprotocol/csharp-sdk repository after a prepare-release PR has been merged. This skill refreshes the release notes to include any PRs merged between the preparation branch point and the merge, warns about changes that affect the version or breaking change assessment, and creates a draft GitHub release.
Use the shared release branch reference for branch roles, previous-release lookup rules, and release work-branch naming.
Safety: This skill only creates and updates draft releases. It must never publish a release. If the user asks to publish, decline and instruct them to publish manually through the GitHub UI.
Work through each step sequentially. Present findings at each step and get user confirmation before proceeding.
This skill reads the merged release PR, the commit range since the previous release, and the previous release tag. All three come from local refs that may be stale — most importantly, the merge commit for the release PR will not exist locally until you fetch.
modelcontextprotocol/csharp-sdk (git remote -v) — do not
assume it is origin.git fetch {upstream} --prune --prune-tags --tagsReport anything the fetch changed before continuing.
The user may provide:
1.1.0, 2.0.0-preview.1) — search for a merged PR titled Release v{version}. Prerelease versions are used verbatim, for example Release v2.0.0-preview.1Release v in the title and ask the user to selectVerify the PR is merged. Extract:
src/Directory.Build.props at the merge commit to confirm <VersionPrefix> and <VersionSuffix>. The tag is v{VersionPrefix} plus -{VersionSuffix} when the suffix is present; for example, <VersionPrefix>2.0.0</VersionPrefix> + <VersionSuffix>preview.1</VersionSuffix> → v2.0.0-preview.1.gh release list — the highest semver among published releases that are ancestors of the merge commit (exclude drafts with --exclude-drafts). Do not order by publication date. When the merge commit is on a release/{MAJOR}.x branch, restrict candidates to tags matching v{MAJOR}.*; on main, there is no MAJOR filter. See release-branches.md.Compare the PRs included in the original prepare-release PR description with the full set of PRs now merged in the commit range. Use the SemVer assessment guide (owned by the bump-version skill) to evaluate the impact of any new PRs against the version that was committed during preparation, including its prerelease and branch-context computation rules. This is not a policy change; only the version computation and previous-release lookup change.
#NNN references in release notes sections).If new PRs exist, warn the user with details for each new PR:
⚠️ New PRs merged since release preparation:
- #NNN — Title (@author) — [impact assessment]
For each new PR, assess and flag impacts:
If any new PRs have version-level or breaking change impacts, strongly recommend that the user either:
The user must explicitly choose an option before proceeding.
Re-categorize all PRs in the commit range (including any new ones from Step 3). See the categorization guide for detailed guidance.
Co-authored-by trailers from all commits in each PR.Re-run the README content checklist from ../prepare-release/references/readme-content.md and validate code samples against the current SDK at the merge commit. Produce final suggestions before the release is created.
src/PACKAGE.md and verify:
nuget/vpre for a prerelease or nuget/v for a stable release. Verify the badge style is correct for this release type.https://github.com/modelcontextprotocol/csharp-sdk/releases/tag/v{version} for the tag being created. The tag is about to exist -- verify the URL is correct.README.md package list is aligned.csharp-fenced code blocks from src/PACKAGE.md and README.md, build the temporary test project, and report results. Follow ../prepare-release/references/readme-snippets.md for the full procedure.If issues are found, present them to the user with proposed fixes.
Applying them is not a local commit. The release PR is already merged, so its branch is gone;
fixes belong on the base branch this release ships from (main or release/{MAJOR}.x), which is
protected. Open a small PR for them, let CI run, and merge it — do not push to the base branch
directly, and do not amend or re-tag anything already reviewed.
Then re-target the draft release, which is pinned to the previously approved merge commit and therefore does not contain the fix:
gh release edit v{version} --target {new-merge-commit-sha}Regenerate the release notes afterward so the commit range covers the new PR, and re-run the Step 6 section review for anything that changed. If the user prefers not to take the fix in this release, that is a valid choice — leave the draft pinned where it is and note the deferred item, rather than carrying a fix that the tag will not include.
Edge Cases:
src/PACKAGE.md and README.md.nuget/vpre to nuget/v (or vice versa) if the prepare-release step used the wrong style.Present each section for user review:
Highlight any changes from the prepare-release draft (new entries, reordered entries, updated descriptions) so the user can see what's different.
Every release must have a preamble — a short paragraph summarizing the release theme that appears before the first ## heading. The preamble is not optional. The preamble may mention the presence of breaking changes as part of the theme summary, but the versioning documentation link belongs under the Breaking Changes heading (see template), not in the preamble. That link must use the v{MAJOR} slug for the version being released.
Extract the draft preamble from the prepare-release PR description and present it alongside a freshly drafted alternative (accounting for any new PRs).
Present both options and let the user choose one, edit one, or enter their own text or markdown.
Follow references/formatting.md when composing and updating the release body.
Display release metadata for user review:
v1.3.1, v2.0.0-preview.1)After confirmation:
gh release create --draft {tag} --target {merge-commit-sha} (always --draft), using the prerelease tag verbatim when present--target is resolved when the tag is created --
at publish time, not now -- so a branch name silently re-resolves to whatever landed on that
branch in the meantime. The tag would then be cut at a commit nobody reviewed, and the release
notes would describe a different commit than the one shipped. The SHA you displayed above is the
commit the user approved; pass that exact SHA.Pinning the SHA costs nothing, because a draft release does not create the git tag. GitHub stores the target and creates the tag only when the release is published, so the tag remains uncreated and the draft fully editable while it waits.
That is also what makes a late-arriving commit easy to absorb. If the user decides to include work
that merged after the draft was created, do not delete and recreate the release: repoint it with
gh release edit {tag} --target {new-commit-sha}, then regenerate the release notes for the new
range and present them for approval again. Never move the target without revising the notes to
match -- a target change silently alters what shipped.
Then hand off to the user with the publishing checklist:
The draft release is ready at {release URL}. Before publishing:
- Review the release notes line by line — this is the last review before they are public.
- Check Set as a pre-release if this is a prerelease.
- Once you have signed off on the notes, remove the AI-generated disclosure note from the bottom of the body. It is there because the draft was AI-drafted; after your thorough review and sign-off, the published notes stand as your reviewed work.
- Click Publish release.
The disclosure is removed by the user, as part of their sign-off — never remove it yourself, and never remove it from a pull request description, an issue, or a comment. If the user asks you to edit the draft body after they have removed it, do not reintroduce it.
When the user requests revisions after the initial creation, always rewrite the complete body as a file — never perform in-place string replacements. See references/formatting.md.
Do not end the skill by asking the user to report back when they have published. Poll the release until it is no longer a draft:
gh release view v{version} --json isDraft,publishedAt,tagName,isPrereleasePoll at a modest interval — this gate is human-paced and may span hours or a session boundary. Say that you are watching rather than going silent.
When isDraft becomes false:
publishedAt, not from when the poll noticed.If the user reports publishing but the API still shows a draft, trust the API and say so — an unsaved draft looks identical to a published release from the browser.
Co-authored-by trailers to determine whether @Copilot should be a co-author; if still unclear, use @Copilot as primary authorv{MAJOR} slug of the version being released before the draft release is created./v{MAJOR}/versioning.html path is created by the Publish Docs workflow when the release is published. It is expected to 404 until then; use the slugged form regardless.Omit empty sections. The preamble is always required — it is not inside a section heading. Tags may include prerelease suffixes, such as v2.0.0-preview.1, and Full Changelog compare links should use the exact tag. The versioning link uses the v{MAJOR} slug for the version being released — see release-branches.md.
[Preamble — REQUIRED. Summarize the release theme.]
## Breaking Changes
Refer to the [C# SDK Versioning](https://csharp.sdk.modelcontextprotocol.io/v{MAJOR}/versioning.html) documentation for details on versioning and breaking change policies.
1. **Description #PR**
* Detail of the break
* Migration guidance
## What's Changed
* Description #PR by @author (co-authored by @user1 @Copilot)
## Documentation Updates
* Description #PR by @author (co-authored by @user1 @Copilot)
## Test Improvements
* Description #PR by @author (co-authored by @user1 @Copilot)
## Repository Infrastructure Updates
* Description #PR by @author (co-authored by @user1 @Copilot)
## Acknowledgements
* @user made their first contribution in #PR
* @user submitted issue #1234 (resolved by #5678)
* @user1 @user2 @user3 reviewed pull requests
**Full Changelog**: https://github.com/modelcontextprotocol/csharp-sdk/compare/{previous-tag}...v{version}
<!-- Example: https://github.com/modelcontextprotocol/csharp-sdk/compare/v1.3.0...v2.0.0-preview.1 -->609499b
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.