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. 01stdio サーバーの NuGet パッケージ化
  2. 02HTTP サーバーのコンテナー化
  3. 03Azure へのデプロイ
  4. 04MCP Registry へのメタデータ公開
  5. 05デプロイとシークレット管理の確認

活用シーン

  1. 01stdio サーバーを NuGet ツールとして配布
  2. 02HTTP サーバーをコンテナーでデプロイ
  3. 03Azure でサーバーをホスティング
  4. 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.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(従来型のウェブホスティング):

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> はすべて一致している必要があります。不一致があると、Registry の検証に失敗したり、ユーザーが誤ったバージョンをダウンロードしたりします。

  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 イメージに漏えいするマルチステージビルドを使用します。.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-publisher CLI のインストール、server.json のスキーマ、名前空間の規則(GitHub 認証と DNS 認証)、CI/CD の自動化について説明します。読み込む場合: 公式 MCP Registry に公開するとき。

詳細情報

コメント