Platform AI v0.1.0

C# MCP Server Publishing

Publish and deploy C# MCP servers. Covers NuGet packaging for stdio servers, Docker containerization for HTTP servers, Azure Container Apps and App Service deployment, and publishing to the official MCP Registry. USE FOR: packaging stdio MCP servers as NuGet tools, creating Dockerfiles for HTTP MCP servers, deploying to Azure Container Apps or App Service, publishing to the MCP Registry at registry.modelcontextprotocol.io, configuring server.json for MCP package metadata, setting up CI/CD for MCP server publishing. DO NOT USE FOR: publishing general NuGet libraries (not MCP-specific), general Docker guidance unrelated to MCP, creating new servers (use mcp-csharp-create), debugging (use mcp-csharp-debug), writing tests (use mcp-csharp-test).

Workflow

Step 1: Choose the publishing path

| Transport | Primary Destination | Users Run With | |-----------|-------------------|----------------| | stdio | NuGet.org | dnx YourPackage@version | | HTTP | Docker → Azure | Container URL |

Both paths can optionally publish to the MCP Registry for discoverability.

Step 2a: NuGet publishing (stdio servers)

  1. Configure `.csproj` with package properties:
<PropertyGroup>
  <PackAsTool>true</PackAsTool>
  <ToolCommandName>mymcpserver</ToolCommandName>
  <PackageId>YourUsername.MyMcpServer</PackageId>
  <Version>1.0.0</Version>
  <Authors>Your Name</Authors>
  <Description>MCP server for interacting with MyService</Description>
  <PackageLicenseExpression>MIT</PackageLicenseExpression>
  <PackageTags>mcp;modelcontextprotocol;ai;llm</PackageTags>
  <PackageReadmeFile>README.md</PackageReadmeFile>
</PropertyGroup>

<ItemGroup>
  <None Include="README.md" Pack="true" PackagePath="\" />
</ItemGroup>
  1. Build and pack:
dotnet build -c Release
dotnet pack -c Release
  1. Test locally before publishing:
dotnet tool install --global --add-source bin/Release/ YourUsername.MyMcpServer
mymcpserver --help          # verify it runs
dotnet tool uninstall --global YourUsername.MyMcpServer
  1. Push to NuGet.org:
dotnet nuget push bin/Release/*.nupkg \
  --api-key YOUR_NUGET_API_KEY \
  --source https://api.nuget.org/v3/index.json
  1. Verify — users configure in mcp.json:
{
  "servers": {
    "MyMcpServer": {
      "type": "stdio",
      "command": "dnx",
      "args": ["YourUsername.MyMcpServer@1.0.0", "--yes"]
    }
  }
}

For detailed NuGet packaging and trusted publishing setup, see references/nuget-packaging.md.

Step 2b: Docker containerization (HTTP servers)

  1. Create Dockerfile:
FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build
WORKDIR /src
COPY *.csproj ./
RUN dotnet restore
COPY . ./
RUN dotnet publish -c Release -o /app

FROM mcr.microsoft.com/dotnet/aspnet:10.0
WORKDIR /app
COPY --from=build /app .

# Non-root user for security
RUN adduser --disabled-password --gecos '' appuser
USER appuser

ENV ASPNETCORE_URLS=http://+:8080
EXPOSE 8080
HEALTHCHECK --interval=30s --timeout=3s --start-period=10s --retries=3 \
  CMD curl -f http://localhost:8080/health || exit 1
ENTRYPOINT ["dotnet", "MyMcpServer.dll"]
  1. Build and test locally:
docker build -t mymcpserver:latest .
docker run -d -p 3001:8080 -e API_KEY=test-key --name mymcpserver mymcpserver:latest
curl http://localhost:3001/health
  1. Push to container registry:
# Docker Hub
docker tag mymcpserver:latest <yourusername>/<mymcpserver>:1.0.0
docker push <yourusername>/<mymcpserver>:1.0.0

# Azure Container Registry
az acr login --name yourregistry
docker tag mymcpserver:latest <yourregistry>.azurecr.io/<mymcpserver>:1.0.0
docker push <yourregistry>.azurecr.io/<mymcpserver>:1.0.0

Step 3: Deploy to Azure (HTTP servers)

Azure Container Apps (recommended — serverless with auto-scaling):

az containerapp create \
  --name mymcpserver \
  --resource-group mygroup \
  --environment myenvironment \
  --image <yourregistry>.azurecr.io/<mymcpserver>:1.0.0 \
  --target-port 8080 \
  --ingress external \
  --min-replicas 0 \
  --max-replicas 10 \
  --secrets api-key=my-actual-api-key \
  --env-vars API_KEY=secretref:api-key

Azure App Service (traditional web hosting):

az webapp create \
  --name mymcpserver \
  --resource-group mygroup \
  --plan myplan \
  --deployment-container-image-name <yourregistry>.azurecr.io/<mymcpserver>:1.0.0

For detailed Azure deployment, see references/docker-azure.md.

Step 4: Publish to MCP Registry (optional)

List your server in the official MCP Registry for discoverability.

  1. Install `mcp-publisher`:
# macOS/Linux
brew install mcp-publisher

# Or download from https://github.com/modelcontextprotocol/registry/releases
  1. Create `.mcp/server.json` (or run mcp-publisher init to generate interactively):
{
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
  "name": "io.github.username/servername",
  "description": "Your server description",
  "version": "1.0.0",
  "packages": [{
    "registryType": "nuget",
    "registryBaseUrl": "https://api.nuget.org",
    "identifier": "YourUsername.MyMcpServer",
    "version": "1.0.0",
    "transport": { "type": "stdio" }
  }],
  "repository": {
    "url": "https://github.com/username/repo",
    "source": "github"
  }
}

> Version consistency (critical): The root version, packages[].version, and <Version> in .csproj must all match. A mismatch causes registry validation failures or users downloading the wrong version.

  1. Authenticate and publish:
mcp-publisher login github      # name must be io.github.<username>/... for GitHub auth
mcp-publisher publish
  1. Verify:
curl "https://registry.modelcontextprotocol.io/v0.1/servers?search=io.github.<username>/<servername>"

For Registry details (namespace conventions, environment variables, CI/CD automation), see references/mcp-registry.md.

Step 5: Security checklist

  • [ ] No hardcoded secrets — use environment variables or Key Vault
  • [ ] HTTPS enabled for HTTP transport in production
  • [ ] Health check endpoint implemented
  • [ ] Input validation on all tool parameters
  • [ ] Rate limiting considered for HTTP servers

Related skills

Framework AI

Use ML.NET to train, evaluate, or integrate machine-learning models into .NET applications with realistic data preparation, inference, and deployment expectations.

Microsoft.ML.*

Build .NET AI agents and multi-agent workflows with Microsoft Agent Framework using the right agent type, threads, tools, workflows, hosting protocols, and enterprise guardrails.

Microsoft.Agents.*

Build AI-enabled .NET applications with Semantic Kernel using services, plugins, prompts, and function-calling patterns that remain testable and maintainable.

Microsoft.SemanticKernel.*