mcp-csharp-publish について
C# MCP サーバーをトランスポートに応じてパッケージ化、デプロイするスキルです。stdio は NuGet、HTTP はコンテナーや Azure を使い、公式 MCP Registry への登録も扱います。
主な機能
- 01stdio サーバーの NuGet パッケージ化
- 02HTTP サーバーのコンテナー化
- 03Azure へのデプロイ
- 04MCP Registry へのメタデータ公開
- 05デプロイとシークレット管理の確認
活用シーン
- 01stdio サーバーを NuGet ツールとして配布
- 02HTTP サーバーをコンテナーでデプロイ
- 03Azure でサーバーをホスティング
- 04MCP 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(従来型のウェブホスティング):
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>はすべて一致している必要があります。不一致があると、Registry の検証に失敗したり、ユーザーが誤ったバージョンをダウンロードしたりします。
- 認証して公開します:
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 イメージに漏えいする | マルチステージビルドを使用します。.env ファイルを絶対に COPY しないでください。実行時に --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 サーバーレジストリ