关于 mcp-csharp-publish
用于打包和部署 C# MCP 服务的技能:stdio 服务通过 NuGet 分发,HTTP 服务可容器化并部署到 Azure;还涵盖在官方 MCP Registry 中登记。
主要功能
- 01将 stdio 服务打包为 NuGet 工具
- 02容器化 HTTP 服务
- 03部署到 Azure 托管
- 04向 MCP Registry 发布服务元数据
- 05检查部署与密钥处理要点
适用场景
- 01以 NuGet 工具分发 stdio 服务
- 02在容器中部署 HTTP 服务
- 03在 Azure 托管服务
- 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.mdmcp-registry.mdnuget-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 步:选择发布路径
| 传输方式 | 主要目标 | 用户运行方式 |
|---|---|---|
| stdio | NuGet.org | dnx YourPackage@version |
| HTTP | Docker → Azure | 容器 URL |
两种路径都可以选择发布到 MCP Registry,以便用户发现。
第 2a 步:发布到 NuGet(stdio 服务)
- 配置
.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>
- 构建并打包:
dotnet build -c Release
dotnet pack -c Release
- 发布前在本地测试:
dotnet tool install --global --add-source bin/Release/ YourUsername.MyMcpServer
mymcpserver --help # verify it runs
dotnet tool uninstall --global YourUsername.MyMcpServer
- 推送到 NuGet.org:
dotnet nuget push bin/Release/*.nupkg \
--api-key YOUR_NUGET_API_KEY \
--source https://api.nuget.org/v3/index.json
- 验证 — 用户在
mcp.json中进行配置:
{
"servers": {
"MyMcpServer": {
"type": "stdio",
"command": "dnx",
"args": ["[email protected]", "--yes"]
}
}
}
有关 NuGet 打包和可信发布设置的详细信息,请参阅 references/nuget-packaging.md。
第 2b 步:Docker 容器化(HTTP 服务)
- 创建 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"]
- 在本地构建并测试:
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
- 推送到容器注册表:
# 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,以便用户发现。
- 安装
mcp-publisher:
# macOS/Linux
brew install mcp-publisher
# Or download from https://github.com/modelcontextprotocol/registry/releases
- 创建
.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>必须完全一致。不一致会导致注册表验证失败,或用户下载错误的版本。
- 进行身份验证并发布:
mcp-publisher login github # name must be io.github.<username>/... for GitHub auth
mcp-publisher publish
- 验证:
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-publisherCLI 安装、server.json架构、命名空间约定(GitHub 身份验证与 DNS 身份验证)、CI/CD 自动化。在以下情况下加载: 发布到官方 MCP Registry。
更多信息
- NuGet 发布 — NuGet.org 发布指南
- Azure Container Apps — 无服务器容器托管
- MCP Registry — 官方 MCP 服务注册表
评论
支持 Markdown