- 
                Notifications
    You must be signed in to change notification settings 
- Fork 841
Create a project template for an MCP server #6547
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
      
      
    
  
     Merged
                    Changes from 11 commits
      Commits
    
    
            Show all changes
          
          
            24 commits
          
        
        Select commit
          Hold shift + click to select a range
      
      20cc59b
              
                Start on MCP server template
              
              
                joelverhagen 38d446e
              
                Merge branch 'main' into jver/mcp-template
              
              
                joelverhagen 5ef5c50
              
                Improve
              
              
                joelverhagen 8b06c6f
              
                Update src/ProjectTemplates/Microsoft.Extensions.AI.Templates/src/Mcp…
              
              
                joelverhagen cd6a0e2
              
                Update src/ProjectTemplates/Microsoft.Extensions.AI.Templates/src/Mcp…
              
              
                joelverhagen 36c90b1
              
                Update src/ProjectTemplates/Microsoft.Extensions.AI.Templates/src/Mcp…
              
              
                joelverhagen 5935e56
              
                Update src/ProjectTemplates/Microsoft.Extensions.AI.Templates/src/Mcp…
              
              
                joelverhagen 4127955
              
                Update src/ProjectTemplates/Microsoft.Extensions.AI.Templates/src/Mcp…
              
              
                joelverhagen 28363b4
              
                Update src/ProjectTemplates/Microsoft.Extensions.AI.Templates/src/Mcp…
              
              
                joelverhagen 4e64775
              
                Update src/ProjectTemplates/Microsoft.Extensions.AI.Templates/src/Mcp…
              
              
                joelverhagen a2ac345
              
                Fix type, improve readme
              
              
                joelverhagen 06d2247
              
                Update src/ProjectTemplates/Microsoft.Extensions.AI.Templates/src/Mcp…
              
              
                joelverhagen 3a6a3e8
              
                Address comments
              
              
                joelverhagen fb056fc
              
                Make package path consistent
              
              
                joelverhagen 7963103
              
                Merge remote-tracking branch 'origin/jver/mcp-template' into jver/mcp…
              
              
                joelverhagen 21e8563
              
                Merge remote-tracking branch 'origin/main' into jver/mcp-template
              
              
                joelverhagen 6e30470
              
                Add icon
              
              
                joelverhagen a98b37e
              
                Add snapshot tests for MCP server template
              
              
                joelverhagen 129faff
              
                Remove return 0
              
              
                joelverhagen 6be6521
              
                Added comment
              
              
                joelverhagen 5e9d6f0
              
                Address most of the comments
              
              
                joelverhagen eabb037
              
                Address comments
              
              
                joelverhagen e29a101
              
                Remove comment that is wrong ☠️
              
              
                joelverhagen 9b8a767
              
                Address comment
              
              
                joelverhagen 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
    
  
  
    
              
  
    
      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
    
  
  
    
              
              
        
          
  
    
      
          
            35 changes: 35 additions & 0 deletions
          
          35 
        
  ...mplates/Microsoft.Extensions.AI.Templates/src/McpServer/McpServer-CSharp/.mcp/server.json
  
  
      
      
   
        
      
      
    
  
    
      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,35 @@ | ||
| { | ||
| "description": "<your description here>", | ||
| "name": "io.github.<your GitHub username here>/<your repo name>", | ||
| "packages": [ | ||
| { | ||
| "registry_name": "nuget", | ||
| "name": "<your package ID here>", | ||
| "version": "0.1.0-beta", | ||
| "package_arguments": [ | ||
| { | ||
| "description": "Start the MCP server tool in server mode", | ||
| "is_required": true, | ||
| "format": "string", | ||
| "value": "start-mcp", | ||
| "default": "start-mcp", | ||
| "type": "positional", | ||
| "value_hint": "start-mcp" | ||
| } | ||
| ], | ||
| "environment_variables": [ | ||
| { | ||
| "description": "The maximum number to return from the random number generator", | ||
| "name": "MAX_RANDOM_NUMBER" | ||
| } | ||
| ] | ||
| } | ||
| ], | ||
| "repository": { | ||
| "url": "https://github.com/<your GitHub username here>/<your repo name>", | ||
| "source": "github" | ||
| }, | ||
| "version_detail": { | ||
| "version": "0.1.0-beta" | ||
| } | ||
| } | 
        
          
  
    
      
          
            7 changes: 7 additions & 0 deletions
          
          7 
        
  ...tensions.AI.Templates/src/McpServer/McpServer-CSharp/.template.config/dotnetcli.host.json
  
  
      
      
   
        
      
      
    
  
    
      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,7 @@ | ||
| { | ||
| "$schema": "https://json.schemastore.org/dotnetcli.host", | ||
| "symbolInfo": {}, | ||
| "usageExamples": [ | ||
| "" | ||
| ] | ||
| } | 
        
          
  
    
      
          
            4 changes: 4 additions & 0 deletions
          
          4 
        
  ...oft.Extensions.AI.Templates/src/McpServer/McpServer-CSharp/.template.config/ide.host.json
  
  
      
      
   
        
      
      
    
  
    
      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,4 @@ | ||
| { | ||
| "$schema": "https://json.schemastore.org/ide.host", | ||
| "symbolInfo": [] | ||
| } | 
        
          
  
    
      
          
            21 changes: 21 additions & 0 deletions
          
          21 
        
  ...oft.Extensions.AI.Templates/src/McpServer/McpServer-CSharp/.template.config/template.json
  
  
      
      
   
        
      
      
    
  
    
      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,21 @@ | ||
| { | ||
| "$schema": "http://json.schemastore.org/template", | ||
| "author": "Microsoft", | ||
| "classifications": [ "Common", "AI", "MCP" ], | ||
| "identity": "Microsoft.Extensions.AI.Templates.McpServer.CSharp", | ||
| "name": "Local MCP Server Console App", | ||
| "description": "A project template for creating a local MCP server using the .NET MCP SDK.", | ||
|         
                  stephentoub marked this conversation as resolved.
              Outdated
          
            Show resolved
            Hide resolved         
                  joelverhagen marked this conversation as resolved.
              Outdated
          
            Show resolved
            Hide resolved | ||
| "shortName": "mcpserver", | ||
| "defaultName": "McpServer", | ||
| "sourceName": "McpServer-CSharp", | ||
| "preferNameDirectory": true, | ||
| "tags": { | ||
| "language": "C#", | ||
| "type": "project" | ||
| }, | ||
| "primaryOutputs": [ | ||
| { | ||
| "path": "./McpServer-CSharp.csproj" | ||
| } | ||
|         
                  joelverhagen marked this conversation as resolved.
              Show resolved
            Hide resolved | ||
| ] | ||
| } | ||
        
          
  
    
      
          
            33 changes: 33 additions & 0 deletions
          
          33 
        
  ...crosoft.Extensions.AI.Templates/src/McpServer/McpServer-CSharp/McpServer-CSharp.csproj.in
  
  
      
      
   
        
      
      
    
  
    
      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,33 @@ | ||
| <Project Sdk="Microsoft.NET.Sdk"> | ||
|  | ||
| <PropertyGroup> | ||
| <TargetFramework>net10.0</TargetFramework> | ||
|         
                  joelverhagen marked this conversation as resolved.
              Show resolved
            Hide resolved | ||
| <OutputType>Exe</OutputType> | ||
| <Nullable>enable</Nullable> | ||
| <ImplicitUsings>enable</ImplicitUsings> | ||
|  | ||
| <!-- Set up the NuGet package to be an MCP server --> | ||
| <PackAsTool>true</PackAsTool> | ||
| <PackageType>McpServer</PackageType> | ||
|  | ||
|         
                  joelverhagen marked this conversation as resolved.
              Show resolved
            Hide resolved | ||
| <!-- Set recommended package metadata --> | ||
| <PackageReadmeFile>README.md</PackageReadmeFile> | ||
| <PackageId>SampleMcpServer</PackageId> | ||
| <PackageVersion>0.1.0-beta</PackageVersion> | ||
| <PackageTags>AI; MCP; server; stdio</PackageTags> | ||
| <Description>An MCP server using the MCP C# SDK.</Description> | ||
| </PropertyGroup> | ||
|  | ||
|  | ||
| <!-- Include additional files for browing the MCP server. --> | ||
|         
                  joelverhagen marked this conversation as resolved.
              Outdated
          
            Show resolved
            Hide resolved | ||
| <ItemGroup> | ||
| <None Include=".mcp/server.json" Pack="true" PackagePath="/.mcp" /> | ||
| <None Include="README.md" Pack="true" PackagePath="/" /> | ||
| </ItemGroup> | ||
|  | ||
| <ItemGroup> | ||
| <PackageReference Include="Microsoft.Extensions.Hosting" Version="${TemplatePackageVersion_MicrosoftExtensionsHosting}" /> | ||
| <PackageReference Include="ModelContextProtocol" Version="${TemplatePackageVersion_ModelContextProtocol}" /> | ||
| </ItemGroup> | ||
|  | ||
| </Project> | ||
        
          
  
    
      
          
            59 changes: 59 additions & 0 deletions
          
          59 
        
  ...jectTemplates/Microsoft.Extensions.AI.Templates/src/McpServer/McpServer-CSharp/Program.cs
  
  
      
      
   
        
      
      
    
  
    
      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,59 @@ | ||
| using Microsoft.Extensions.DependencyInjection; | ||
| using Microsoft.Extensions.Hosting; | ||
| using Microsoft.Extensions.Logging; | ||
| using ModelContextProtocol.Server; | ||
| using System.ComponentModel; | ||
|  | ||
| var builder = Host.CreateApplicationBuilder(args); | ||
|  | ||
| if (args.Length == 0 || args[0] != "start-mcp") | ||
|         
                  joelverhagen marked this conversation as resolved.
              Outdated
          
            Show resolved
            Hide resolved | ||
| { | ||
| Console.Error.WriteLine("Error: invalid command. Use the 'start-mcp' command-line argument to start the MCP server."); | ||
|         
                  joelverhagen marked this conversation as resolved.
              Outdated
          
            Show resolved
            Hide resolved | ||
| return 1; | ||
| } | ||
|  | ||
| var maxNumberEnv = Environment.GetEnvironmentVariable("MAX_RANDOM_NUMBER"); | ||
| if (!int.TryParse(maxNumberEnv, out var maxNumber) || maxNumber <= 0) | ||
| { | ||
| Console.Error.WriteLine("Error: you must set the MAX_RANDOM_NUMBER environment variable to a positive integer."); | ||
| return 1; | ||
| } | ||
|         
                  joelverhagen marked this conversation as resolved.
              Outdated
          
            Show resolved
            Hide resolved | ||
|  | ||
| builder.Logging.AddConsole(consoleLogOptions => | ||
| { | ||
| // Configure all logs to go to stderr (stdout is used for the MCP protocol messages). | ||
| consoleLogOptions.LogToStandardErrorThreshold = LogLevel.Trace; | ||
| }); | ||
|         
                  joelverhagen marked this conversation as resolved.
              Outdated
          
            Show resolved
            Hide resolved | ||
|  | ||
| // add the MCP services, discover tools from the current assembly | ||
| builder.Services | ||
| .AddMcpServer() | ||
| .WithStdioServerTransport() | ||
| .WithTools<RandomNumberTool>(); | ||
|         
                  joelverhagen marked this conversation as resolved.
              Outdated
          
            Show resolved
            Hide resolved | ||
|  | ||
| // add dependencies for the MCP server tools | ||
| builder.Services.AddSingleton(_ => new RandomNumberService(maxNumber)); | ||
|         
                  joelverhagen marked this conversation as resolved.
              Outdated
          
            Show resolved
            Hide resolved | ||
|  | ||
| await builder.Build().RunAsync(); | ||
|         
                  joelverhagen marked this conversation as resolved.
              Show resolved
            Hide resolved | ||
| return 0; | ||
|         
                  joelverhagen marked this conversation as resolved.
              Outdated
          
            Show resolved
            Hide resolved | ||
|  | ||
| public class RandomNumberService(int max) | ||
| { | ||
| public int Max => max; | ||
| public int GetRandomNumber() => Random.Shared.Next(1, max + 1); | ||
| } | ||
|  | ||
| public class RandomNumberTool(RandomNumberService service) | ||
| { | ||
| [McpServerTool, Description("Returns the maximum random number that can be generated by the tool.")] | ||
| public int MaxRandomNumber() | ||
| { | ||
| return service.Max; | ||
| } | ||
|  | ||
| [McpServerTool, Description("Returns a random number between 1 and the maximum number allowed by the tool.")] | ||
| public int GetRandomNumber() | ||
| { | ||
| return service.GetRandomNumber(); | ||
| } | ||
| } | ||
|         
                  joelverhagen marked this conversation as resolved.
              Outdated
          
            Show resolved
            Hide resolved | ||
        
          
  
    
      
          
            70 changes: 70 additions & 0 deletions
          
          70 
        
  ...ates/Microsoft.Extensions.AI.Templates/src/McpServer/McpServer-CSharp/README.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,70 @@ | ||
| # MCP Server | ||
|  | ||
| This README was created using the .NET MCP server template project. It demonstrates how you can easily create an MCP server using .NET and then package it in a NuGet package. | ||
|  | ||
| See [aka.ms/nuget/mcp/guide](https://aka.ms/nuget/mcp/guide) for the full guide. | ||
|         
                  stephentoub marked this conversation as resolved.
              Show resolved
            Hide resolved | ||
|  | ||
| ## Checklist before publishing to NuGet.org | ||
|  | ||
| - Update the package metadata in the .csproj file | ||
| - Update `.mcp/server.json` to declare your MCP server's inputs | ||
| - Test the MCP server locally using the steps below | ||
|  | ||
| ## Using the MCP Server in VS Code | ||
|  | ||
| Once the MCP server package is published to NuGet.org, you can use the following VS Code user configuration to download and install the MCP server package. See [Use MCP servers in VS Code (Preview)](https://code.visualstudio.com/docs/copilot/chat/mcp-servers) for more information about using MCP servers in VS Code. | ||
|  | ||
| ```json | ||
| { | ||
| "mcp": { | ||
| "servers": { | ||
| "my-custom-mcp": { | ||
| "type": "stdio", | ||
| "command": "dotnet", | ||
| "args": [ | ||
| "tool", | ||
| "exec", | ||
| "<your package ID here>", | ||
| "--version", | ||
| "<your package version here>", | ||
| "--yes", | ||
| "--", | ||
| "start-mcp" | ||
| ], | ||
| "env": { | ||
| "MAX_RANDOM_NUMBER": 100 | ||
| } | ||
| } | ||
| } | ||
| } | ||
| } | ||
| ``` | ||
|  | ||
| Now you can ask Copilot Chat for a random number, for example, `Give me 3 random numbers`. It should prompt you to use the `GetRandomNumber` tool on the `my-custom-mcp` MCP server and show you the results. | ||
|  | ||
| ## Developing locally | ||
|  | ||
| To test this MCP server from source code (locally) without using a built MCP server package, use the following VS Code configuration: | ||
|  | ||
| ```json | ||
| { | ||
| "mcp": { | ||
| "servers": { | ||
| "my-custom-mcp": { | ||
| "type": "stdio", | ||
| "command": "dotnet", | ||
| "args": [ | ||
| "run", | ||
| "--project", | ||
| "<PATH TO PROJECT DIRECTORY>", | ||
| "--", | ||
| "start-mcp" | ||
| ], | ||
| "env": { | ||
| "MAX_RANDOM_NUMBER": 100 | ||
| } | ||
| } | ||
| } | ||
| } | ||
| } | ||
| ``` | ||
      
      Oops, something went wrong.
        
    
  
  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.