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
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