mcpField
M
mcp-csharp-publish

mcp-csharp-publish

github.com/dotnet云与 DevOps5.8k650 次安装1 天前更新
代码仓库

关于 mcp-csharp-publish

用于打包和部署 C# MCP 服务的技能:stdio 服务通过 NuGet 分发,HTTP 服务可容器化并部署到 Azure;还涵盖在官方 MCP Registry 中登记。

主要功能

  1. 01将 stdio 服务打包为 NuGet 工具
  2. 02容器化 HTTP 服务
  3. 03部署到 Azure 托管
  4. 04向 MCP Registry 发布服务元数据
  5. 05检查部署与密钥处理要点

适用场景

  1. 01以 NuGet 工具分发 stdio 服务
  2. 02在容器中部署 HTTP 服务
  3. 03在 Azure 托管服务
  4. 04在 MCP Registry 登记服务

MCP 相关

介绍向官方 MCP Registry 发布 MCP 服务,以及验证 MCP 客户端能否连接已部署服务。

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/dotnet/skills --skill mcp-csharp-publish

安装后在 Claude Code 中输入/mcp-csharp-publish确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
docker-azure.md
mcp-registry.md
nuget-packaging.md

详细介绍

C# MCP 服务发布

将 MCP 服务发布并部署到目标平台。stdio 服务以 NuGet 工具包的形式分发。HTTP 服务会容器化并部署到 Azure 或其他容器托管平台。两种服务都可以选择列入官方 MCP Registry。

适用场景

  • 将 stdio MCP 服务打包并分发到 NuGet
  • 为 HTTP MCP 服务创建 Docker 容器
  • 部署到 Azure Container Apps 或 App Service
  • 发布到官方 MCP Registry,以便用户发现
  • 为 MCP Registry 设置 server.json 元数据

停止信号

  • 尚未测试服务? → 先使用 mcp-csharp-test
  • 还没有服务项目? → 使用 mcp-csharp-create
  • 要发布非 MCP NuGet 包? → 改用 nuget-trusted-publishing

输入

输入必填描述
传输类型是stdio → NuGet 路径,http → Docker/Azure 路径
目标位置是NuGet.org、Docker 注册表、Azure Container Apps、Azure App Service、MCP Registry
项目路径是.csproj 文件的路径
包 ID / 服务名称发布时必填NuGet PackageId 或 MCP Registry 名称

工作流

第 1 步:选择发布路径
传输方式主要目标用户运行方式
stdioNuGet.orgdnx YourPackage@version
HTTPDocker → Azure容器 URL

两种路径都可以选择发布到 MCP Registry,以便用户发现。

第 2a 步:发布到 NuGet(stdio 服务)
  1. 配置 .csproj,添加包属性:
<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. 构建并打包:
dotnet build -c Release
dotnet pack -c Release
  1. 发布前在本地测试:
dotnet tool install --global --add-source bin/Release/ YourUsername.MyMcpServer
mymcpserver --help          # verify it runs
dotnet tool uninstall --global YourUsername.MyMcpServer
  1. 推送到 NuGet.org:
dotnet nuget push bin/Release/*.nupkg \
  --api-key YOUR_NUGET_API_KEY \
  --source https://api.nuget.org/v3/index.json
  1. 验证 — 用户在 mcp.json 中进行配置:
{
  "servers": {
    "MyMcpServer": {
      "type": "stdio",
      "command": "dnx",
      "args": ["[email protected]", "--yes"]
    }
  }
}

有关 NuGet 打包和可信发布设置的详细信息,请参阅 references/nuget-packaging.md。

第 2b 步:Docker 容器化(HTTP 服务)
  1. 创建 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. 在本地构建并测试:
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. 推送到容器注册表:
# 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
第 3 步:部署到 Azure(HTTP 服务)

Azure Container Apps(推荐 — 无服务器,可自动缩放):

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(传统 Web 托管):

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

有关 Azure 部署的详细信息,请参阅 references/docker-azure.md。

第 4 步:发布到 MCP Registry(可选)

将服务列入官方 MCP Registry,以便用户发现。

  1. 安装 mcp-publisher:
# macOS/Linux
brew install mcp-publisher

# Or download from https://github.com/modelcontextprotocol/registry/releases
  1. 创建 .mcp/server.json(或运行 mcp-publisher init 交互式生成):
{
  "$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、packages[].version 和 .csproj 中的 <Version> 必须完全一致。不一致会导致注册表验证失败,或用户下载错误的版本。

  1. 进行身份验证并发布:
mcp-publisher login github      # name must be io.github.<username>/... for GitHub auth
mcp-publisher publish
  1. 验证:
curl "https://registry.modelcontextprotocol.io/v0.1/servers?search=io.github.<username>/<servername>"

有关 Registry 的详细信息(命名空间约定、环境变量、CI/CD 自动化),请参阅 references/mcp-registry.md。

第 5 步:安全检查清单
  • 不要硬编码机密 — 使用环境变量或 Key Vault
  • 生产环境中的 HTTP 传输已启用 HTTPS
  • 已实现运行状况检查端点
  • 已验证所有工具参数
  • 已考虑为 HTTP 服务配置速率限制

验证

  • NuGet: 包可通过 dnx PackageId@version 安装并运行
  • Docker: 容器可启动且运行状况检查通过
  • Azure: 服务可访问且工具能正常响应
  • MCP Registry: 服务显示在 registry.modelcontextprotocol.io
  • MCP 客户端可以连接到已部署的服务并调用工具

常见问题

问题解决方案
NuGet 包无法作为工具运行.csproj 中缺少 <PackAsTool>true</PackAsTool>
.csproj 与 server.json 中的版本不一致确保 <Version>、server.json 根目录下的 version 和 packages[].version 保持同步
Docker 容器立即退出检查入口点 DLL 名称是否与项目输出相符。运行 docker logs mymcpserver 查看错误
Azure Container App 返回 502目标端口不匹配。确保 --target-port 与容器中 ASPNETCORE_URLS 的端口一致
MCP Registry 拒绝发布名称必须遵循命名空间约定:使用 GitHub 身份验证时采用 io.github.<username>/<name>
API 密钥泄露在 Docker 镜像中使用多阶段构建。切勿 COPY .env 文件。在运行时通过 --env-vars 传递机密

相关技能

  • mcp-csharp-create — 创建新的 MCP 服务项目
  • mcp-csharp-test — 自动化测试与评估

参考文件

  • references/nuget-packaging.md — 完整的 NuGet .csproj 配置、用于 MCP 的 server.json、推送到 NuGet.org、使用 dnx 进行测试、版本管理。在以下情况下加载: 将 stdio 服务发布到 NuGet。
  • references/docker-azure.md — 生产环境 Dockerfile 模式、ACR 设置、Azure Container Apps 完整配置、使用 Key Vault 的 App Service、机密管理。在以下情况下加载: 将 HTTP 服务部署到 Docker 或 Azure。
  • references/mcp-registry.md — mcp-publisher CLI 安装、server.json 架构、命名空间约定(GitHub 身份验证与 DNS 身份验证)、CI/CD 自动化。在以下情况下加载: 发布到官方 MCP Registry。

更多信息

评论

支持 Markdown