diff --git a/src/ProjectTemplates/Microsoft.McpServer.ProjectTemplates/Microsoft.McpServer.ProjectTemplates.csproj b/src/ProjectTemplates/Microsoft.McpServer.ProjectTemplates/Microsoft.McpServer.ProjectTemplates.csproj
index 55df7b221c2..f9e49f52cb8 100644
--- a/src/ProjectTemplates/Microsoft.McpServer.ProjectTemplates/Microsoft.McpServer.ProjectTemplates.csproj
+++ b/src/ProjectTemplates/Microsoft.McpServer.ProjectTemplates/Microsoft.McpServer.ProjectTemplates.csproj
@@ -34,13 +34,23 @@
+
+
+
+
diff --git a/src/ProjectTemplates/Microsoft.McpServer.ProjectTemplates/templates/McpServer-CSharp/.template.config/template.json b/src/ProjectTemplates/Microsoft.McpServer.ProjectTemplates/templates/McpServer-CSharp/.template.config/template.json
index 74ea40a826e..6c7fb05f7df 100644
--- a/src/ProjectTemplates/Microsoft.McpServer.ProjectTemplates/templates/McpServer-CSharp/.template.config/template.json
+++ b/src/ProjectTemplates/Microsoft.McpServer.ProjectTemplates/templates/McpServer-CSharp/.template.config/template.json
@@ -11,6 +11,7 @@
"description": "A project template for creating a Model Context Protocol (MCP) server using C# and the ModelContextProtocol package.",
"shortName": "mcpserver",
"defaultName": "McpServer",
+ "groupIdentity": "McpServer",
"sourceName": "McpServer-CSharp",
"preferNameDirectory": true,
"tags": {
diff --git a/src/ProjectTemplates/Microsoft.McpServer.ProjectTemplates/templates/McpServer-FSharp/.template.config/dotnetcli.host.json b/src/ProjectTemplates/Microsoft.McpServer.ProjectTemplates/templates/McpServer-FSharp/.template.config/dotnetcli.host.json
new file mode 100644
index 00000000000..d5ac55b2693
--- /dev/null
+++ b/src/ProjectTemplates/Microsoft.McpServer.ProjectTemplates/templates/McpServer-FSharp/.template.config/dotnetcli.host.json
@@ -0,0 +1,25 @@
+{
+ "$schema": "https://json.schemastore.org/dotnetcli.host",
+ "symbolInfo": {
+ "Transport": {
+ "longName": "transport",
+ "shortName": "t"
+ },
+ "SelfContained": {
+ "longName": "self-contained",
+ "shortName": ""
+ },
+ "Framework": {
+ "longName": "framework"
+ },
+ "httpPort": {
+ "isHidden": true
+ },
+ "httpsPort": {
+ "isHidden": true
+ }
+ },
+ "usageExamples": [
+ ""
+ ]
+}
diff --git a/src/ProjectTemplates/Microsoft.McpServer.ProjectTemplates/templates/McpServer-FSharp/.template.config/ide.host.json b/src/ProjectTemplates/Microsoft.McpServer.ProjectTemplates/templates/McpServer-FSharp/.template.config/ide.host.json
new file mode 100644
index 00000000000..1a4e3ed7a07
--- /dev/null
+++ b/src/ProjectTemplates/Microsoft.McpServer.ProjectTemplates/templates/McpServer-FSharp/.template.config/ide.host.json
@@ -0,0 +1,15 @@
+{
+ "$schema": "https://json.schemastore.org/ide.host",
+ "order": 0,
+ "icon": "ide/icon.ico",
+ "symbolInfo": [
+ {
+ "id": "Transport",
+ "isVisible": true
+ },
+ {
+ "id": "SelfContained",
+ "isVisible": true
+ }
+ ]
+}
diff --git a/src/ProjectTemplates/Microsoft.McpServer.ProjectTemplates/templates/McpServer-FSharp/.template.config/ide/icon.ico b/src/ProjectTemplates/Microsoft.McpServer.ProjectTemplates/templates/McpServer-FSharp/.template.config/ide/icon.ico
new file mode 100644
index 00000000000..954709ffd6b
Binary files /dev/null and b/src/ProjectTemplates/Microsoft.McpServer.ProjectTemplates/templates/McpServer-FSharp/.template.config/ide/icon.ico differ
diff --git a/src/ProjectTemplates/Microsoft.McpServer.ProjectTemplates/templates/McpServer-FSharp/.template.config/template.json b/src/ProjectTemplates/Microsoft.McpServer.ProjectTemplates/templates/McpServer-FSharp/.template.config/template.json
new file mode 100644
index 00000000000..7d6aadff85f
--- /dev/null
+++ b/src/ProjectTemplates/Microsoft.McpServer.ProjectTemplates/templates/McpServer-FSharp/.template.config/template.json
@@ -0,0 +1,204 @@
+{
+ "$schema": "http://json.schemastore.org/template",
+ "author": "Microsoft",
+ "classifications": [
+ "Common",
+ "AI",
+ "MCP"
+ ],
+ "identity": "Microsoft.McpServer.ProjectTemplates.McpServer.FSharp",
+ "name": "MCP Server App",
+ "description": "A project template for creating a Model Context Protocol (MCP) server using F# and the ModelContextProtocol package.",
+ "shortName": "mcpserver-fsharp",
+ "defaultName": "McpServer",
+ "groupIdentity": "McpServer",
+ "sourceName": "McpServer-FSharp",
+ "preferNameDirectory": true,
+ "tags": {
+ "language": "F#",
+ "type": "project"
+ },
+ "guids": [
+ "aaaaaaaa-bbbb-cccc-dddd-eeeeeeffffff"
+ ],
+ "symbols": {
+ "hostIdentifier": {
+ "type": "bind",
+ "binding": "HostIdentifier"
+ },
+ "Transport": {
+ "type": "parameter",
+ "displayName": "The MCP server _transport type to use",
+ "description": "Whether to create a 'local' (stdio transport) or 'remote' (http transport) MCP server",
+ "datatype": "choice",
+ "choices": [
+ {
+ "choice": "local",
+ "description": "A console application will be created to use the stdio transport as a local MCP server"
+ },
+ {
+ "choice": "remote",
+ "description": "An ASP.NET Core web application will be created to use the http transport as a remote MCP server"
+ }
+ ],
+ "defaultValue": "local"
+ },
+ "SelfContained": {
+ "type": "parameter",
+ "datatype": "bool",
+ "defaultValue": "true",
+ "displayName": "Enable _self-contained publish",
+ "description": "Whether to enable the MCP server for publishing as a self-contained application."
+ },
+ "Framework": {
+ "type": "parameter",
+ "description": "The target framework for the project.",
+ "displayName": "Framework",
+ "datatype": "choice",
+ "choices": [
+ {
+ "choice": "net10.0",
+ "description": ".NET 10"
+ },
+ {
+ "choice": "net9.0",
+ "description": ".NET 9"
+ },
+ {
+ "choice": "net8.0",
+ "description": ".NET 8"
+ }
+ ],
+ "replaces": "net10.0",
+ "defaultValue": "net10.0"
+ },
+ "httpsPort": {
+ "type": "parameter",
+ "datatype": "integer",
+ "description": "Port number to use for the HTTPS endpoint in launchSettings.json."
+ },
+ "httpsPortGenerated": {
+ "type": "generated",
+ "generator": "port",
+ "parameters": {
+ "low": 5000,
+ "high": 5300
+ }
+ },
+ "httpsPortReplacer": {
+ "type": "generated",
+ "generator": "coalesce",
+ "parameters": {
+ "sourceVariableName": "httpsPort",
+ "fallbackVariableName": "httpsPortGenerated"
+ },
+ "replaces": "9995",
+ "onlyIf": [{
+ "after": "localhost:"
+ }]
+ },
+ "httpPort": {
+ "type": "parameter",
+ "datatype": "integer",
+ "description": "Port number to use for the HTTP endpoint in launchSettings.json."
+ },
+ "httpPortGenerated": {
+ "type": "generated",
+ "generator": "port",
+ "parameters": {
+ "low": 6000,
+ "high": 6300
+ }
+ },
+ "httpPortReplacer": {
+ "type": "generated",
+ "generator": "coalesce",
+ "parameters": {
+ "sourceVariableName": "httpPort",
+ "fallbackVariableName": "httpPortGenerated"
+ },
+ "replaces": "9996",
+ "onlyIf": [{
+ "after": "localhost:"
+ }]
+ },
+ "IsTransportRemote": {
+ "type": "computed",
+ "value": "(Transport == \"remote\")"
+ },
+ "IsTransportLocal": {
+ "type": "computed",
+ "value": "(!IsTransportRemote)"
+ }
+ },
+ "primaryOutputs": [
+ {
+ "path": "./README.md"
+ },
+ {
+ "path": "./McpServer-FSharp.fsproj"
+ }
+ ],
+ "sources": [
+ {
+ "source": "./common",
+ "target": "./"
+ },
+ {
+ "condition": "(IsTransportLocal)",
+ "source": "./local",
+ "target": "./"
+ },
+ {
+ "condition": "(IsTransportRemote)",
+ "source": "./remote",
+ "target": "./"
+ }
+ ],
+ "postActions": [
+ {
+ "condition": "(hostIdentifier != \"dotnetcli\" && hostIdentifier != \"dotnetcli-preview\")",
+ "description": "Opens README file in the editor",
+ "manualInstructions": [],
+ "actionId": "84C0DA21-51C8-4541-9940-6CA19AF04EE6",
+ "args": {
+ "files": "0"
+ },
+ "continueOnError": true
+ }
+ ],
+ "SpecialCustomOperations": {
+ "**/*.md": {
+ "operations": [
+ {
+ "type": "conditional",
+ "configuration": {
+ "if": [ "#### ---#if" ],
+ "else": [ "#### ---#else" ],
+ "elseif": [ "#### ---#elseif", "#### ---#elif" ],
+ "endif": [ "#### ---#endif" ],
+ "trim": "true",
+ "wholeLine": "true",
+ "evaluator": "C++"
+ }
+ }
+ ]
+ },
+ "**/*.http": {
+ "operations": [
+ {
+ "type": "conditional",
+ "configuration": {
+ "if": [ "#if" ],
+ "else": [ "#else" ],
+ "elseif": [ "#elseif", "#elif" ],
+ "endif": [ "#endif" ],
+ "trim": "true",
+ "wholeLine": "true",
+ "evaluator": "C++"
+ }
+ }
+ ]
+ }
+ }
+}
diff --git a/src/ProjectTemplates/Microsoft.McpServer.ProjectTemplates/templates/McpServer-FSharp/common/Tools/RandomNumberTools.fs b/src/ProjectTemplates/Microsoft.McpServer.ProjectTemplates/templates/McpServer-FSharp/common/Tools/RandomNumberTools.fs
new file mode 100644
index 00000000000..6555facbd22
--- /dev/null
+++ b/src/ProjectTemplates/Microsoft.McpServer.ProjectTemplates/templates/McpServer-FSharp/common/Tools/RandomNumberTools.fs
@@ -0,0 +1,23 @@
+namespace McpServer.Tools
+open System
+open System.ComponentModel
+open System.Runtime.InteropServices
+open ModelContextProtocol.Server
+
+///
+/// Sample MCP tools for demonstration purposes.
+/// These tools can be invoked by MCP clients to perform various operations.
+///
+type RandomNumberTools() =
+
+ []
+ []
+ member _.GetRandomNumber
+ (
+ []
+ [] min : int,
+ []
+ [] max : int
+ ) =
+
+ Random.Shared.Next(min, max)
diff --git a/src/ProjectTemplates/Microsoft.McpServer.ProjectTemplates/templates/McpServer-FSharp/local/.mcp/server.json b/src/ProjectTemplates/Microsoft.McpServer.ProjectTemplates/templates/McpServer-FSharp/local/.mcp/server.json
new file mode 100644
index 00000000000..f5b270270d0
--- /dev/null
+++ b/src/ProjectTemplates/Microsoft.McpServer.ProjectTemplates/templates/McpServer-FSharp/local/.mcp/server.json
@@ -0,0 +1,22 @@
+{
+ "$schema": "https://static.modelcontextprotocol.io/schemas/2025-10-17/server.schema.json",
+ "description": "",
+ "name": "io.github./",
+ "version": "0.1.0-beta",
+ "packages": [
+ {
+ "registryType": "nuget",
+ "identifier": "",
+ "version": "0.1.0-beta",
+ "transport": {
+ "type": "stdio"
+ },
+ "packageArguments": [],
+ "environmentVariables": []
+ }
+ ],
+ "repository": {
+ "url": "https://github.com//",
+ "source": "github"
+ }
+}
diff --git a/src/ProjectTemplates/Microsoft.McpServer.ProjectTemplates/templates/McpServer-FSharp/local/McpServer-FSharp.fsproj-in b/src/ProjectTemplates/Microsoft.McpServer.ProjectTemplates/templates/McpServer-FSharp/local/McpServer-FSharp.fsproj-in
new file mode 100644
index 00000000000..897ccfc6474
--- /dev/null
+++ b/src/ProjectTemplates/Microsoft.McpServer.ProjectTemplates/templates/McpServer-FSharp/local/McpServer-FSharp.fsproj-in
@@ -0,0 +1,51 @@
+
+
+
+ net10.0
+
+ win-x64;win-arm64;osx-arm64;linux-x64;linux-arm64;linux-musl-x64
+
+ Major
+
+ Exe
+ enable
+ enable
+
+
+ true
+ McpServer
+
+
+
+ true
+ true
+
+
+ true
+
+
+
+ README.md
+ SampleMcpServer
+ 0.1.0-beta
+ AI; MCP; server; stdio
+ An MCP server using the MCP C# SDK.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/ProjectTemplates/Microsoft.McpServer.ProjectTemplates/templates/McpServer-FSharp/local/Program.fs b/src/ProjectTemplates/Microsoft.McpServer.ProjectTemplates/templates/McpServer-FSharp/local/Program.fs
new file mode 100644
index 00000000000..03d947597b5
--- /dev/null
+++ b/src/ProjectTemplates/Microsoft.McpServer.ProjectTemplates/templates/McpServer-FSharp/local/Program.fs
@@ -0,0 +1,28 @@
+open Microsoft.Extensions.DependencyInjection
+open Microsoft.Extensions.Hosting
+open Microsoft.Extensions.Logging
+open McpServer.Tools
+
+[]
+let main args =
+
+ let builder = Host.CreateApplicationBuilder(args)
+
+ // Configure logging to stderr
+ builder.Logging.AddConsole(fun o ->
+ o.LogToStandardErrorThreshold <- LogLevel.Trace
+ )
+ |> ignore
+
+ // Add MCP services, stdio transport, and tools
+ builder.Services
+ .AddMcpServer()
+ .WithStdioServerTransport()
+ .WithTools()
+ |> ignore
+
+ builder.Build().RunAsync()
+ |> Async.AwaitTask
+ |> Async.RunSynchronously
+
+ 0
diff --git a/src/ProjectTemplates/Microsoft.McpServer.ProjectTemplates/templates/McpServer-FSharp/local/README.md b/src/ProjectTemplates/Microsoft.McpServer.ProjectTemplates/templates/McpServer-FSharp/local/README.md
new file mode 100644
index 00000000000..35cd4821999
--- /dev/null
+++ b/src/ProjectTemplates/Microsoft.McpServer.ProjectTemplates/templates/McpServer-FSharp/local/README.md
@@ -0,0 +1,106 @@
+# MCP Server
+
+This README was created using the F# MCP server project template.
+It demonstrates how you can easily create an MCP server using F# and publish it as a NuGet package.
+
+#### ---#if (SelfContained)
+The MCP server is built as a self-contained application and does not require the .NET runtime to be installed on the target machine.
+However, since it is self-contained, it must be built for each target platform separately.
+By default, the template is configured to build for:
+* `win-x64`
+* `win-arm64`
+* `osx-arm64`
+* `linux-x64`
+* `linux-arm64`
+* `linux-musl-x64`
+
+If your users require more platforms to be supported, update the list of runtime identifiers in the project's `` element.
+#### ---#else
+The MCP server is built as a framework-dependent application and requires the .NET runtime to be installed on the target machine.
+The application is configured to roll-forward to the next highest major version of the runtime if one is available on the target machine.
+If an applicable .NET runtime is not available, the MCP server will not start.
+Consider building the MCP server as a self-contained application if you want to avoid this dependency.
+#### ---#endif
+
+See [aka.ms/nuget/mcp/guide](https://aka.ms/nuget/mcp/guide) for the full guide.
+
+Please note that this template is currently in an early preview stage. If you have feedback, please take a [brief survey](http://aka.ms/dotnet-mcp-template-survey).
+
+## Checklist before publishing to NuGet.org
+
+- Test the MCP server locally using the steps below.
+- Update the package metadata in the .csproj file, in particular the ``.
+- Update `.mcp/server.json` to declare your MCP server's inputs.
+ - See [configuring inputs](https://aka.ms/nuget/mcp/guide/configuring-inputs) for more details.
+- Pack the project using `dotnet pack`.
+
+The `bin/Release` directory will contain the package file (.nupkg), which can be [published to NuGet.org](https://learn.microsoft.com/nuget/nuget-org/publish-a-package).
+
+## Developing locally
+
+To test this MCP server from source code (locally) without using a built MCP server package, you can configure your IDE to run the project directly using `dotnet run`.
+
+```json
+{
+ "servers": {
+ "McpServer-FSharp": {
+ "type": "stdio",
+ "command": "dotnet",
+ "args": [
+ "run",
+ "--project",
+ ""
+ ]
+ }
+ }
+}
+```
+
+Refer to the VS Code or Visual Studio documentation for more information on configuring and using MCP servers:
+
+- [Use MCP servers in VS Code (Preview)](https://code.visualstudio.com/docs/copilot/chat/mcp-servers)
+- [Use MCP servers in Visual Studio (Preview)](https://learn.microsoft.com/visualstudio/ide/mcp-servers)
+
+## Testing the MCP Server
+
+Once configured, you can ask Copilot Chat for a random number, for example, `Give me 3 random numbers`. It should prompt you to use the `get_random_number` tool on the `McpServer-FSharp` MCP server and show you the results.
+
+## Publishing to NuGet.org
+
+1. Run `dotnet pack -c Release` to create the NuGet package
+2. Publish to NuGet.org with `dotnet nuget push bin/Release/*.nupkg --api-key --source https://api.nuget.org/v3/index.json`
+
+## Using the MCP Server from NuGet.org
+
+Once the MCP server package is published to NuGet.org, you can configure it in your preferred IDE. Both VS Code and Visual Studio use the `dnx` command to download and install the MCP server package from NuGet.org.
+
+- **VS Code**: Create a `/.vscode/mcp.json` file
+- **Visual Studio**: Create a `\.mcp.json` file
+
+For both VS Code and Visual Studio, the configuration file uses the following server definition:
+
+```json
+{
+ "servers": {
+ "McpServer-FSharp": {
+ "type": "stdio",
+ "command": "dnx",
+ "args": [
+ "",
+ "--version",
+ "",
+ "--yes"
+ ]
+ }
+ }
+}
+```
+
+## More information
+
+.NET MCP servers use the [ModelContextProtocol](https://www.nuget.org/packages/ModelContextProtocol) C# SDK. For more information about MCP:
+
+- [Official Documentation](https://modelcontextprotocol.io/)
+- [Protocol Specification](https://spec.modelcontextprotocol.io/)
+- [GitHub Organization](https://github.com/modelcontextprotocol)
+- [MCP C# SDK](https://modelcontextprotocol.github.io/csharp-sdk)
diff --git a/src/ProjectTemplates/Microsoft.McpServer.ProjectTemplates/templates/McpServer-FSharp/remote/McpServer-FSharp.fsproj-in b/src/ProjectTemplates/Microsoft.McpServer.ProjectTemplates/templates/McpServer-FSharp/remote/McpServer-FSharp.fsproj-in
new file mode 100644
index 00000000000..3d43b54e68d
--- /dev/null
+++ b/src/ProjectTemplates/Microsoft.McpServer.ProjectTemplates/templates/McpServer-FSharp/remote/McpServer-FSharp.fsproj-in
@@ -0,0 +1,35 @@
+
+
+
+ net10.0
+
+ win-x64;win-arm64;osx-arm64;linux-x64;linux-arm64;linux-musl-x64
+
+ Major
+
+ enable
+ enable
+ aaaaaaaa-bbbb-cccc-dddd-eeeeeeffffff
+
+
+
+
+ true
+ true
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/ProjectTemplates/Microsoft.McpServer.ProjectTemplates/templates/McpServer-FSharp/remote/McpServer-FSharp.http b/src/ProjectTemplates/Microsoft.McpServer.ProjectTemplates/templates/McpServer-FSharp/remote/McpServer-FSharp.http
new file mode 100644
index 00000000000..f79d8ec1429
--- /dev/null
+++ b/src/ProjectTemplates/Microsoft.McpServer.ProjectTemplates/templates/McpServer-FSharp/remote/McpServer-FSharp.http
@@ -0,0 +1,21 @@
+# For more info on HTTP files go to https://aka.ms/vs/httpfile
+
+#if (hostIdentifier == "vs")
+@HostAddress = https://localhost:9995
+#else
+@HostAddress = http://localhost:9996
+#endif
+
+POST {{HostAddress}}/
+Accept: application/json, text/event-stream
+Content-Type: application/json
+MCP-Protocol-Version: 2025-11-25
+
+{
+ "jsonrpc": "2.0",
+ "id": 1,
+ "method": "tools/call",
+ "params": {
+ "name": "get_random_number"
+ }
+}
diff --git a/src/ProjectTemplates/Microsoft.McpServer.ProjectTemplates/templates/McpServer-FSharp/remote/Program.fs b/src/ProjectTemplates/Microsoft.McpServer.ProjectTemplates/templates/McpServer-FSharp/remote/Program.fs
new file mode 100644
index 00000000000..6dcc55090d7
--- /dev/null
+++ b/src/ProjectTemplates/Microsoft.McpServer.ProjectTemplates/templates/McpServer-FSharp/remote/Program.fs
@@ -0,0 +1,30 @@
+open Microsoft.AspNetCore.Builder
+open Microsoft.Extensions.DependencyInjection
+open Microsoft.Extensions.Hosting
+open ModelContextProtocol.Server
+open McpServer.Tools
+
+[]
+let main args =
+
+ let builder = WebApplication.CreateBuilder(args)
+
+ // Add the MCP services: HTTP transport + tools
+ builder.Services
+ .AddMcpServer()
+ .WithHttpTransport(fun options ->
+ // Stateless mode recommended for servers that don't need
+ // server-to-client requests like sampling or elicitation.
+ options.Stateless <- true
+ )
+ .WithTools()
+ |> ignore
+
+ let app = builder.Build()
+
+ app.MapMcp() |> ignore
+ app.UseHttpsRedirection() |> ignore
+
+ app.Run()
+
+ 0
diff --git a/src/ProjectTemplates/Microsoft.McpServer.ProjectTemplates/templates/McpServer-FSharp/remote/Properties/launchSettings.json b/src/ProjectTemplates/Microsoft.McpServer.ProjectTemplates/templates/McpServer-FSharp/remote/Properties/launchSettings.json
new file mode 100644
index 00000000000..37d5661e4de
--- /dev/null
+++ b/src/ProjectTemplates/Microsoft.McpServer.ProjectTemplates/templates/McpServer-FSharp/remote/Properties/launchSettings.json
@@ -0,0 +1,23 @@
+{
+ "$schema": "https://json.schemastore.org/launchsettings.json",
+ "profiles": {
+ "http": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": false,
+ "applicationUrl": "http://localhost:9996",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ },
+ "https": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": false,
+ "applicationUrl": "https://localhost:9995;http://localhost:9996",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ }
+ }
+}
diff --git a/src/ProjectTemplates/Microsoft.McpServer.ProjectTemplates/templates/McpServer-FSharp/remote/README.md b/src/ProjectTemplates/Microsoft.McpServer.ProjectTemplates/templates/McpServer-FSharp/remote/README.md
new file mode 100644
index 00000000000..ff63721dcad
--- /dev/null
+++ b/src/ProjectTemplates/Microsoft.McpServer.ProjectTemplates/templates/McpServer-FSharp/remote/README.md
@@ -0,0 +1,78 @@
+# MCP Server
+
+This README was created using the F# MCP server project template.
+It demonstrates how you can easily create an MCP server using F# and run it as an ASP.NET Core web application.
+
+#### ---#if (SelfContained)
+The MCP server is built as a self-contained application and does not require the .NET runtime to be installed on the target machine.
+However, since it is self-contained, it must be built for each target platform separately.
+By default, the template is configured to build for:
+* `win-x64`
+* `win-arm64`
+* `osx-arm64`
+* `linux-x64`
+* `linux-arm64`
+* `linux-musl-x64`
+
+If you require more platforms to be supported, update the list of runtime identifiers in the project's `` element.
+#### ---#else
+The MCP server is built as a framework-dependent application and requires the ASP.NET Core runtime to be installed on the target machine.
+The application is configured to roll-forward to the next highest major version of the runtime if one is available on the target machine.
+If an applicable .NET runtime is not available, the MCP server will not start.
+Consider building the MCP server as a self-contained application if you want to avoid this dependency.
+#### ---#endif
+
+Please note that this template is currently in an early preview stage. If you have feedback, please take a [brief survey](http://aka.ms/dotnet-mcp-template-survey).
+
+## Developing locally
+
+To test this MCP server from source code (locally), you can configure your IDE to connect to the server using localhost.
+
+#### ---#if (hostIdentifier == "vs")
+```json
+{
+ "servers": {
+ "McpServer-FSharp": {
+ "type": "http",
+ "url": "https://localhost:9995"
+ }
+ }
+}
+```
+#### ---#else
+```json
+{
+ "servers": {
+ "McpServer-FSharp": {
+ "type": "http",
+ "url": "http://localhost:9996"
+ }
+ }
+}
+```
+#### ---#endif
+
+Refer to the VS Code or Visual Studio documentation for more information on configuring and using MCP servers:
+
+- [Use MCP servers in VS Code (Preview)](https://code.visualstudio.com/docs/copilot/chat/mcp-servers)
+- [Use MCP servers in Visual Studio (Preview)](https://learn.microsoft.com/visualstudio/ide/mcp-servers)
+
+## Testing the MCP Server
+
+Once configured, you can ask Copilot Chat for a random number, for example, `Give me 3 random numbers`. It should prompt you to use the `get_random_number` tool on the `McpServer-FSharp` MCP server and show you the results.
+
+## Known issues
+
+1. When using VS Code, connecting to `https://localhost:9995` fails.
+ * This is related to using a self-signed developer certificate, even when the certificate is trusted by the system.
+ * Connecting with `http://localhost:9996` succeeds.
+ * See [Cannot connect to MCP server via SSE using trusted developer certificate (microsoft/vscode#248170)](https://github.com/microsoft/vscode/issues/248170) for more information.
+
+## More information
+
+ASP.NET Core MCP servers use the [ModelContextProtocol.AspNetCore](https://www.nuget.org/packages/ModelContextProtocol.AspNetCore) package from the MCP C# SDK. For more information about MCP:
+
+- [Official Documentation](https://modelcontextprotocol.io/)
+- [Protocol Specification](https://spec.modelcontextprotocol.io/)
+- [GitHub Organization](https://github.com/modelcontextprotocol)
+- [MCP C# SDK](https://modelcontextprotocol.github.io/csharp-sdk)