Skip to content

Conversation

Copy link
Contributor

Copilot AI commented Sep 10, 2025

Addresses #xxx by adding automatic version stamping for MCP server.json files when PackageType=McpServer is specified in MSBuild projects.

Problem

MCP (Model Context Protocol) server projects need their server.json files to be versioned consistently with their NuGet packages. Previously, developers had to manually handle this with hacky CI flows:

  • Call nbgv to get the version number
  • Replace from a template server.template.json to server.json
  • Run build/pack on the NuGet package

Solution

This PR introduces automatic server.json version stamping that integrates seamlessly with Nerdbank.GitVersioning's existing build process:

New MSBuild Integration

  • Target: NBGV_StampMcpServerJson runs before packaging when PackageType=McpServer
  • Task: StampMcpServerJson handles simple string replacement with proper error handling
  • Conditional: Only activates for MCP server projects, regular projects are unaffected

How it Works

  1. Detects projects with <PackageType>McpServer</PackageType>
  2. Finds the project's server.json file
  3. Performs simple string replacement of "0.0.0-placeholder" with the computed NBGV version
  4. Writes the stamped version to the intermediate output directory
  5. Excludes the original server.json from packaging and includes the versioned one

Example

Original server.json:

{
  "$schema": "https://modelcontextprotocol.io/schemas/draft/2025-07-09/server.json",
  "description": "Sample .NET MCP Server",
  "name": "io.github.example/samplemcpserver",
  "version": "0.0.0-placeholder",
  "packages": [
    {
      "registry_type": "nuget",
      "identifier": "Example.McpServer",
      "version": "0.0.0-placeholder",
      "transport": {
        "type": "stdio"
      }
    }
  ]
}

After NBGV processing:

{
  "$schema": "https://modelcontextprotocol.io/schemas/draft/2025-07-09/server.json",
  "description": "Sample .NET MCP Server",
  "name": "io.github.example/samplemcpserver",
  "version": "1.2.3-alpha.4+branch.feature",
  "packages": [
    {
      "registry_type": "nuget",
      "identifier": "Example.McpServer",
      "version": "1.2.3-alpha.4+branch.feature",
      "transport": {
        "type": "stdio"
      }
    }
  ]
}

Testing

  • Added comprehensive unit tests that verify version stamping works correctly
  • Tests use realistic MCP server.json structure with multiple version placeholders using raw string literals for better readability
  • Verifies all 0.0.0-placeholder values are replaced with the actual version
  • Tested with both MCP server projects (version gets stamped) and regular projects (server.json untouched)
  • All existing tests continue to pass, ensuring no regressions

This eliminates the need for manual version management in CI pipelines and ensures MCP server metadata stays in sync with package versions automatically, using a simple and efficient string replacement approach.

Fixes #1269

Fixes #1269


💬 Share your feedback on Copilot coding agent for the chance to win a $200 gift card! Click here to start the survey.

Co-authored-by: AArnott <3548+AArnott@users.noreply.github.com>
Copilot AI changed the title [WIP] Add support for stamping version on server.json for MCP servers Add support for stamping version on server.json for MCP servers Sep 10, 2025
Copilot AI requested a review from AArnott September 10, 2025 16:14
Copilot finished work on behalf of AArnott September 10, 2025 16:14
Copy link
Collaborator

@AArnott AArnott left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@copilot please make the requested changes.

…, implement recursive __VERSION__ replacement, and improve tests

Co-authored-by: AArnott <3548+AArnott@users.noreply.github.com>
Copy link
Contributor Author

Copilot AI commented Sep 11, 2025

@copilot please make the requested changes.

All requested changes have been implemented and tested. Updated MSBuild conditions, converted to namespace statements, implemented recursive VERSION replacement, improved tests, and addressed all feedback. Fixed in commit 412e26c.

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • 3dovsblobprodeus2188.blob.core.windows.net
    • Triggering command: dotnet restore --no-dependencies /home/REDACTED/work/Nerdbank.GitVersioning/.codeql-scratch/dbs/csharp/working/32A0A2D38A721DD2A3E59F6279CF8961/missingpackages_workingdir --packages /home/REDACTED/work/Nerdbank.GitVersioning/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/Nerdbank.GitVersioning/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)

If you need me to access, download, or install something from one of these locations, you can either:

Copilot AI changed the title Add support for stamping version on server.json for MCP servers Add support for stamping version on server.json for MCP servers with __VERSION__ placeholder replacement Sep 11, 2025
Copilot AI requested a review from AArnott September 11, 2025 01:37
Copilot finished work on behalf of AArnott September 11, 2025 01:37
Copy link
Collaborator

@AArnott AArnott left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@copilot please make these changes

…nt for 0.0.0-placeholder, revert BuildIntegrationTests.cs using statement

Co-authored-by: AArnott <3548+AArnott@users.noreply.github.com>
Copy link
Contributor Author

Copilot AI commented Sep 11, 2025

@copilot please make these changes

All requested changes have been implemented:

  • Updated test to use raw string literals with syntax highlighting
  • Simplified version replacement to use string.Replace for "0.0.0-placeholder"
  • Reverted unnecessary using statement from BuildIntegrationTests.cs
    Fixed in commit 4de35e1.

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • y5pvsblobprodeus219.blob.core.windows.net
    • Triggering command: /usr/lib/dotnet/dotnet /usr/lib/dotnet/sdk/8.0.119/NuGet.Build.Tasks.Console.dll Recursive=True;CleanupAssetsForUnsupportedProjects=True;DisableParallel=False;Force=False;ForceEvaluate=False;HideWarningsAndErrors=False;IgnoreFailedSources=False;Interactive=False;NoCache=False;RestorePackagesConfig=False /usr/lib/dotnet/sdk/8.0.119/MSBuild.dll /home/REDACTED/work/Nerdbank.GitVersioning/Nerdbank.GitVersioning/src/Nerdbank.GitVersioning.Tasks/Nerdbank.GitVersioning.Tasks.csproj MSBuildRestoreSessionId=4fca6dda-cb20-48cf-997e-34699e8e198e;ExcludeRestorePackageImports=True;OriginalMSBuildStartupDirectory=/home/REDACTED/work/Nerdbank.GitVersioning/Nerdbank.GitVersioning (dns block)

If you need me to access, download, or install something from one of these locations, you can either:

Copilot AI changed the title Add support for stamping version on server.json for MCP servers with __VERSION__ placeholder replacement Add support for stamping version on server.json for MCP servers with 0.0.0-placeholder replacement Sep 11, 2025
Copilot AI requested a review from AArnott September 11, 2025 17:32
Copilot finished work on behalf of AArnott September 11, 2025 17:32
@timheuer
Copy link
Member

This looks great!

@AArnott AArnott marked this pull request as ready for review September 12, 2025 04:38
@AArnott AArnott added this to the v3.8 milestone Sep 12, 2025
@AArnott AArnott merged commit 36498c7 into main Sep 12, 2025
12 checks passed
@AArnott AArnott deleted the copilot/fix-d5166ca3-64b9-4823-8fdd-cb13b2aefa91 branch September 12, 2025 19:25
jeffkl pushed a commit to jeffkl/vstest-loggers that referenced this pull request Nov 17, 2025
Updated
[Nerdbank.GitVersioning](https://github.com/dotnet/Nerdbank.GitVersioning)
from 3.7.115 to 3.9.50.

<details>
<summary>Release notes</summary>

_Sourced from [Nerdbank.GitVersioning's
releases](https://github.com/dotnet/Nerdbank.GitVersioning/releases)._

## 3.9.50

## What's Changed
* Add `versionHeightOffsetAppliesTo` property to version.json by
@​Copilot in dotnet/Nerdbank.GitVersioning#1279
* Fix `nbgv prepare-release` command to honor inheriting version.json
files by @​AArnott in
dotnet/Nerdbank.GitVersioning#1281
* Automatically disable git engine for Dependabot environments by
@​Copilot in dotnet/Nerdbank.GitVersioning#1284
* Add --what-if switch to nbgv tag command to preview tag names by
@​Copilot in dotnet/Nerdbank.GitVersioning#1287
* Auto-disable git engine for GitHub Copilot environments by @​Copilot
in dotnet/Nerdbank.GitVersioning#1291
* Allow uppercase letters in pre-release version identifiers by
@​Copilot in dotnet/Nerdbank.GitVersioning#1293

## New Contributors
* @​micheloliveira-com made their first contribution in
dotnet/Nerdbank.GitVersioning#1277

**Full Changelog**:
dotnet/Nerdbank.GitVersioning@v3.8.118...v3.9.50

## 3.9.37-alpha

## What's Changed
* Auto-disable git engine for GitHub Copilot environments by @​Copilot
in dotnet/Nerdbank.GitVersioning#1291


**Full Changelog**:
dotnet/Nerdbank.GitVersioning@v3.9.32-alpha...v3.9.37-alpha

## 3.9.32-alpha

## What's Changed

* Automatically disable git engine for Dependabot environments by
@​Copilot in dotnet/Nerdbank.GitVersioning#1284
* Add --what-if switch to nbgv tag command to preview tag names by
@​Copilot in dotnet/Nerdbank.GitVersioning#1287

**Full Changelog**:
dotnet/Nerdbank.GitVersioning@v3.9.17-alpha...v3.9.32-alpha

## 3.9.17-alpha

## What's Changed
* Fix `nbgv prepare-release` command to honor inheriting version.json
files by @​AArnott in
dotnet/Nerdbank.GitVersioning#1281


**Full Changelog**:
dotnet/Nerdbank.GitVersioning@v3.9.15-alpha...v3.9.17-alpha

## 3.9.15-alpha

## What's Changed

* Add `versionHeightOffsetAppliesTo` property to version.json by
@​Copilot in dotnet/Nerdbank.GitVersioning#1279

## New Contributors
* @​micheloliveira-com made their first contribution in
dotnet/Nerdbank.GitVersioning#1277

**Full Changelog**:
dotnet/Nerdbank.GitVersioning@v3.8.118...v3.9.15-alpha

## 3.8.118

## Fixes

* Don't try to disable CA2243 warnings in the generated version info
files for F# by @​Numpsy in
dotnet/Nerdbank.GitVersioning#1174
* Catch a more general JsonException. by @​ANGEL-OF-DEV in
dotnet/Nerdbank.GitVersioning#1191
* Retarget links to migrated docs by @​bencemali in
dotnet/Nerdbank.GitVersioning#1193
* Check MSBuild items with case insensitivity by @​AArnott in
dotnet/Nerdbank.GitVersioning#1213
* Fix inconsistent CLI output format for GitCommitDate by @​Copilot in
dotnet/Nerdbank.GitVersioning#1246
* Fix version height computed as 0 when project path has non-canonical
casing by @​Copilot in
dotnet/Nerdbank.GitVersioning#1244
* When generating the GitCommitDate field in the AssemblyInfo for F#, d…
by @​Numpsy in
dotnet/Nerdbank.GitVersioning#1253
* Only do Android version check on applications by @​dotMorten in
dotnet/Nerdbank.GitVersioning#1256
* Fix `nbgv set-version` to write to the best version.json file in scope
by @​AArnott in
dotnet/Nerdbank.GitVersioning#1264

## Enhancements

* Add msbuild-provided prerelease identifiers by @​AArnott in
dotnet/Nerdbank.GitVersioning#1153
* Add support for stamping version on server.json for MCP servers with
0.0.0-placeholder replacement by @​Copilot in
dotnet/Nerdbank.GitVersioning#1270 and by
@​AArnott in dotnet/Nerdbank.GitVersioning#1271
* Add option to set / skip CloudBuildNumber by @​MattKotsenas in
dotnet/Nerdbank.GitVersioning#1190
* Add Central Package Management (CPM) support to nbgv install command
by @​Copilot in
dotnet/Nerdbank.GitVersioning#1208
* Add --public-release argument to nbgv get-version command by @​Copilot
in dotnet/Nerdbank.GitVersioning#1245
* Invoke PrivateP2PCaching.proj fewer times by @​AArnott in
dotnet/Nerdbank.GitVersioning#1263

## Other changes

* Update dependency Cake.Core to v5 by @​renovate[bot] in
dotnet/Nerdbank.GitVersioning#1183

## New Contributors
* @​ANGEL-OF-DEV made their first contribution in
dotnet/Nerdbank.GitVersioning#1191
* @​bencemali made their first contribution in
dotnet/Nerdbank.GitVersioning#1193
* @​Copilot made their first contribution in
dotnet/Nerdbank.GitVersioning#1208
* @​dotMorten made their first contribution in
dotnet/Nerdbank.GitVersioning#1256
* @​emmanuel-ferdman made their first contribution in
dotnet/Nerdbank.GitVersioning#1145

**Full Changelog**:
dotnet/Nerdbank.GitVersioning@v3.7.115...v3.8.118

## 3.8.106-alpha

## What's Changed

### Enhancements

* Add option to set / skip CloudBuildNumber by @​MattKotsenas in
dotnet/Nerdbank.GitVersioning#1190
* Add Central Package Management (CPM) support to nbgv install command
by @​Copilot in
dotnet/Nerdbank.GitVersioning#1208
* Add --public-release argument to nbgv get-version command by @​Copilot
in dotnet/Nerdbank.GitVersioning#1245
* Invoke PrivateP2PCaching.proj fewer times by @​AArnott in
dotnet/Nerdbank.GitVersioning#1263

### Fixes

* Catch a more general JsonException. by @​ANGEL-OF-DEV in
dotnet/Nerdbank.GitVersioning#1191
* Retarget links to migrated docs by @​bencemali in
dotnet/Nerdbank.GitVersioning#1193
* Check MSBuild items with case insensitivity by @​AArnott in
dotnet/Nerdbank.GitVersioning#1213
* Fix inconsistent CLI output format for GitCommitDate by @​Copilot in
dotnet/Nerdbank.GitVersioning#1246
* Fix version height computed as 0 when project path has non-canonical
casing by @​Copilot in
dotnet/Nerdbank.GitVersioning#1244
* When generating the GitCommitDate field in the AssemblyInfo for F#, d…
by @​Numpsy in
dotnet/Nerdbank.GitVersioning#1253
* Only do Android version check on applications by @​dotMorten in
dotnet/Nerdbank.GitVersioning#1256
* Fix `nbgv set-version` to write to the best version.json file in scope
by @​AArnott in
dotnet/Nerdbank.GitVersioning#1264

### Other changes

* Update dependency Cake.Core to v5 by @​renovate[bot] in
dotnet/Nerdbank.GitVersioning#1183

## New Contributors
* @​ANGEL-OF-DEV made their first contribution in
dotnet/Nerdbank.GitVersioning#1191
* @​bencemali made their first contribution in
dotnet/Nerdbank.GitVersioning#1193
* @​Copilot made their first contribution in
dotnet/Nerdbank.GitVersioning#1208
* @​dotMorten made their first contribution in
dotnet/Nerdbank.GitVersioning#1256

**Full Changelog**:
dotnet/Nerdbank.GitVersioning@v3.8.38-alpha...v3.8.106-alpha

## 3.8.38-alpha

## Fixes

* Don't try to disable CA2243 warnings in the generated version info
files for F# by @​Numpsy in
dotnet/Nerdbank.GitVersioning#1174

## Enhancements

* Add msbuild-provided prerelease identifiers by @​AArnott in
dotnet/Nerdbank.GitVersioning#1153

## New Contributors
* @​emmanuel-ferdman made their first contribution in
dotnet/Nerdbank.GitVersioning#1145

**Full Changelog**:
dotnet/Nerdbank.GitVersioning@v3.7.115...v3.8.38-alpha

Commits viewable in [compare
view](dotnet/Nerdbank.GitVersioning@v3.7.115...v3.9.50).
</details>

[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=Nerdbank.GitVersioning&package-manager=nuget&previous-version=3.7.115&new-version=3.9.50)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add support for stamping version on server.json for MCP servers

3 participants