MCP Server Example について
MCP Server Exampleは、HTTP経由でMCPのツール、リソース、プロンプト、ユーザーへの入力要求を示す.NETサーバーです。AzureやGitLab、ドメイン検索、機密情報のマスキング例を含み、MCPの実装やテストを学ぶ開発者向けです。
主な機能
- 01HTTP対応の.NET MCPサーバー
- 02AzureとGitLabのツール
- 03ドメイン登録情報の検索
- 04構造化されたユーザー入力要求の例
- 05リソースとプロンプト
- 06応答内のシークレットとAPIキーのマスキング
活用シーン
- 01Azureのサブスクリプションとリソースを確認
- 02GitLabのグループとプロジェクトを検索
- 03構造化された入力要求のフローをテスト
- 04MCP Explorer XでMCPツールを確認
MCP 対応
Streamable HTTP経由でMCPクライアントにツール、リソース、プロンプトを公開します。サーバーからユーザーに構造化入力を求める機能も示します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
MCP サーバーの例
このプロジェクトでは、.NET を使用した MCP(Model Context Protocol)サーバーの基本的な実装を紹介します。MCP クライアントとやり取りするためのエンドポイントを提供し、MCP Inspector などのテストおよびデバッグ用ツールを含みます。また、この例では、構成にユーザーシークレットを使用して GitLab などの外部サービスと連携する方法も示します。
ミドルウェア
UserAgentLoggingMiddleware
受信するすべてのリクエストについて、HTTP メソッドとパスとともに HTTP User-Agent ヘッダーを記録します。すべての MCP トラフィックを対象にするため、MapMcp() の前に登録されています。出力例:
Incoming request POST /mcp — User-Agent: claude-ai/1.0 mcp-client/0.4
ツール
AzureTool
- GetAzureSubscriptionsAsync:Azure サブスクリプションとその ID の一覧を取得します。
- GetListOfResourceGroupsAsync:指定したサブスクリプションの Azure リソースグループの一覧を取得します。
- GetVirtualMachinesMatchTagKeyAsync:VM に指定したタグキーと一致するタグが付いている場合に、サブスクリプション内のすべての仮想マシン名とそのタグを取得します。
- GetResourcesInResourceGroupAsync:指定したリソースグループ内のすべてのリソースを取得します。
- GetResourcePropertiesAsync:リソース ID に基づいて、指定した Azure リソースのプロパティとメタデータを辞書形式で取得します。
メモ
プロンプト:
- azure サブスクリプションとその ID の一覧を取得する
- ??? 内のリソースグループの一覧を取得する
- ??? リソースグループ内のすべてのリソース ID と種類を取得する
- azure リソース ??? のすべてのプロパティとメタデータを取得する
実際のプロンプト: developmentsub サブスクリプション内のすべてのリソースグループを取得してください。各リソースグループについて、すべてのリソースを取得してください。リソースの種類が Azure Key Vault と統合できる種類に該当するか照合してください。最後に、リソースグループ、リソース ID、リソース名、リソースの種類を含む Markdown テーブルを作成してください。
WhoIsTool
- WhoIs:指定したドメインの登録および所有者情報を提供します。
ElicitationTools
- GuessTheNumber:ユーザーに 1 から 10 までの数字を当ててもらう、引き出し機能を実演するシンプルな対話型ゲームです。このツールでは、MCP サーバーの
ElicitAsyncメソッドを使用して、ブール値の応答、列挙型の選択肢、検証付きの文字列入力(最大長)、特定の形式の日付入力など、構造化された入力をユーザーに要求する方法を紹介します。 - BrowseAzureResourcesAsync:Azure サブスクリプション(単一選択)を選択し、次にリソースグループ(複数選択)とリソースの種類のフィルター(ドロップダウン —
All resource typesまたはデプロイ済みの特定の種類)を選ぶようユーザーを案内する、複数ステップのガイド付きツールです。選択したグループ内で条件に一致するすべてのリソースを、構造化された JSON として返します。各リソースのキーには、衝突を避けるためResourceType/Nameが使用されます。
メモ
このツールでは、構造化スキーマを通じてサーバーがユーザーに追加情報を要求できる、MCP の引き出し機能を紹介します。この例では、次のスキーマを示します。
- はい/いいえの質問に使うブール値スキーマ
- 複数選択肢(承諾/辞退)に使う列挙型スキーマ
- 長さ制限と説明を指定した文字列スキーマ
- 形式を検証する日付スキーマ(DD/MM/YYYY)
SensitiveDataExampleTool
- SetASecretForDemoPurposes:ユーザー名にシークレットを設定し、応答内で自動的にマスクすることで、機密データの取り扱い方法を紹介します(先頭の 4 文字のみを表示します)。
- AAAEcho:指定されたテキストを返すシンプルなエコーツールです(既定値は "Hello, World!" です)。
- SetAnApiKeyForDemoPurposes:API キーを URL に関連付け、応答内で自動的にキーをマスクすることで、API キーの取り扱い方法を紹介します(先頭の 4 文字のみを表示します)。
メモ
このツールでは、MCP ツールで機密情報を取り扱う際のベストプラクティスを紹介します。
ToPartialMask()拡張メソッドにより、シークレットと API キーが応答内で完全に公開されることを防ぎ、先頭の 4 文字とその後のアスタリスクのみを表示します。
GitLabTools
- SearchGroupsAsync:検索パターンに基づいて GitLab グループの一覧を返します。
- GetProjectsInGroupAsync:指定した GitLab グループのプロジェクト一覧を返します。
- GetVariablesInProjectAsync:GitLab プロジェクトの変数一覧を返します。マスクされた変数は、値の末尾 4 文字を表示し、それ以外をマスキングします。
- AddAzureConsumptionBudgetAsync:Merge Request を介して、GitLab プロジェクトに Azure の利用予算が設定されているか確認し、設定されていない場合は追加します。
メモ
プロンプト:
- ??? グループから GitLab のプロジェクト一覧を取得する
- 指定した GitLab グループのプロジェクト一覧を取得する。
- 指定した GitLab プロジェクトの変数一覧を取得する
- ??? の GitLab プロジェクトを使用して、??? ブランチに Azure の利用予算が設定されているか確認し、設定されていない場合は追加する
実際のプロンプト:
- upe グループから GitLab のプロジェクト一覧を取得する
- 指定した GitLab プロジェクトの変数一覧を取得する。マスクされた変数は、値の末尾 4 文字を表示し、それ以外をマスキングします。
- subscription-siem GitLab プロジェクトを使用して、"feat/kitcheng/init" ブランチに Azure の利用予算が設定されているか確認し、設定されていない場合は追加する
- 検索パターン upe を使用して GitLab グループの一覧を取得し、name、web_url(「クリックして開く」として表示)、parent_id、およびサブグループの有無を示す絵文字を含む Markdown テーブルとして表示する。parent id でグループ化する。name の後ろの角括弧内に group id を含める。その後、parent id と group id に従ってグループをネストしたツリー構造を作成する。
リソース
KitchenApplianceResources
- kitchen://appliances/all:キッチン家電の全カタログを JSON テーブル(10 行)として返します。
- kitchen://appliances/{id}:数値 ID(1~10)で指定した家電を 1 件返します。
各家電の行には、id、name、category、powerWatts、priceGbp、brand、hasDigitalControls が含まれます。
UserResources
このプロジェクトでは、2 つの MCP リソースを通じて YAML 形式のユーザーデータを提供します。
- user://{userId}:指定したユーザーのデータを YAML 形式で返します。
- users://all:すべてのユーザーを YAML 形式で返します。
プロンプト
このプロジェクトでは、3 つのシンプルな MCP プロンプトも提供します(Prompts/TextPrompts.cs を参照)。
- ReverseWord(word):単語を 1 つ反転し、反転した単語のみを返します。
- OneSentenceSummary(text):指定されたテキストを要約した、簡潔な 1 文を返します。
- SummaryBenefitsAndReferences(topic):指定されたトピックについて、短い要約の段落、メリットの箇条書き、参考資料の箇条書きを返します。
MCP Inspector で試す方法:
- このサーバーを起動し(「実行方法」を参照)、この README の後半に記載されているように Streamable HTTP 経由で Inspector に接続します。
- 「プロンプト一覧」をクリックし、上記のプロンプト名から 1 つ選択します。
- 指示されたパラメーター値を入力して実行します。
実行方法
メモ
GitLabTool ツールを実行するには、PAT とドメインの両方が必要です。こちらの手順に従ってください。
dotnet build
dotnet run
次のような出力が表示されます。
Building...
info: Microsoft.Hosting.Lifetime[14]
Now listening on: http://localhost:5168
info: Microsoft.Hosting.Lifetime[0]
Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
Hosting environment: Development
Http URL をコピーしてください。MCP Inspector の実行時に必要になります(次のセクションを参照)。
デバッグ/テスト方法
IDE の外部でこの MCP サーバーをテストし、操作するには、MCP Explorer X を推奨します。ブラウザーからツールを参照し、引数を指定して呼び出し、応答を確認できます。完全なエリシテーションにも対応しています。

クイックスタート(Docker)
お使いの OS に対応するコマンドを選び、ターミナルで実行してから、http://localhost:8091 を開きます。
macOS
dataRoot="$HOME/Library/Application Support/McpExplorerX-docker"
mkdir -p "${dataRoot}"
docker run --rm -it \
-p 8091:8080 \
-v "${dataRoot}:/root/.local/share/McpExplorer" \
-v ~/.azure:/root/.azure \
-e AZURE_CONFIG_DIR=/root/.azure \
-e HOST_AZURE_CONFIG_DIR=${HOME}/.azure \
-e PREFERENCES__StoragePath=/data/settings.json \
-e ASPNETCORE_ENVIRONMENT=Production \
garrardkitchen/mcp-explorer-x:latest
Linux
dataRoot="$HOME/.config/McpExplorerX-docker"
mkdir -p "${dataRoot}"
docker run --rm -it \
-p 8091:8080 \
-v "${dataRoot}:/root/.local/share/McpExplorer" \
-v ~/.azure:/root/.azure \
-e AZURE_CONFIG_DIR=/root/.azure \
-e HOST_AZURE_CONFIG_DIR=${HOME}/.azure \
-e PREFERENCES__StoragePath=/data/settings.json \
-e ASPNETCORE_ENVIRONMENT=Production \
garrardkitchen/mcp-explorer-x:latest
Windows(PowerShell)
$dataRoot="$HOME\AppData\Local\McpExplorerX-docker"
New-Item -ItemType Directory -Force -Path $dataRoot | Out-Null
docker run --rm -it `
-p 8091:8080 `
-v "${dataRoot}:/root/.local/share/McpExplorer" `
-v ~/.azure:/root/.azure `
-e AZURE_CONFIG_DIR=/root/.azure `
-e HOST_AZURE_CONFIG_DIR=${HOME}/.azure `
-e PREFERENCES__StoragePath=/data/settings.json `
-e ASPNETCORE_ENVIRONMENT=Production `
garrardkitchen/mcp-explorer-x:latest
起動したら、http://localhost:5168(Streamable HTTP トランスポート)を使用してこのサーバーを接続先として追加し、利用可能なツール、リソース、プロンプトを確認します。
メモ
Docker Compose、環境変数のリファレンス、Azure 資格情報のマウントを含むセットアップ方法の全容については、MCP Explorer X クイックスタートドキュメントをご覧ください。
ユーザーシークレット
プロジェクトに <UserSecretsId> がない場合は、次のコマンドを実行して、このプロジェクトのユーザーシークレットを設定します。
dotnet user-secrets init
GitLab PAT
dotnet user-secrets set "GitLab:Token" "<your-token-value>"
GitLab ドメイン
dotnet user-secrets set "GitLab:Domain" "<your-domain-value>"
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。