はじめに
「この Node.js API を Azure Container Apps にデプロイする準備をして。」
この一言を AI エージェントに投げたら、Bicep テンプレートの生成 → 8項目のデプロイ前検証 → ACR ビルド → Container Apps へのデプロイ まですべて自動で完了しました。33秒でイメージがビルドされ、API エンドポイントが動き始めます。
これを実現したのが、2026年2月26日に Microsoft がリリースした Azure Skills Plugin です。
本記事では、実際にリポジトリをクローンしてスキル定義を読み解き、ブックマーク共有 API を Azure Container Apps にデプロイするまでの全工程を、ハンズオン形式で紹介します。
この記事で分かること:
- Azure Skills Plugin の3層構造と、単なるプロンプト集との決定的な違い
- VS Code でのセットアップから動作確認まで
- 実際に Node.js API を Container Apps にデプロイした全手順と結果
- 全21スキルの分類と、場面別プロンプトガイド
想定読者: Azure を利用している開発者(AI エージェント活用に興味がある方)
📖 所要時間: 約15分
🎯 難易度: 中級
💻 環境: VS Code, Node.js 18+, Azure CLI
📅 リリース日: 2026年2月26日(GitHub リポジトリ公開日)
Azure Skills Plugin とは
Azure Skills Plugin は、Microsoft が公式に提供する AI コーディングエージェント向けの Azure 専門知識プラグイン です[1]。
Azure を使った開発では、「どのサービスを選ぶべきか」「デプロイ前に何を検証すべきか」「コスト最適化はどうするか」といった 意思決定の問題 が多く発生します。Azure Skills Plugin は、これらの判断を AI エージェントが的確にサポートできるよう、ワークフロー・ディシジョンツリー・ガードレールをパッケージ化したものです。
⚠️ 重要: これは単なる「プロンプトパック」ではありません。知識層(Skills)と実行層(MCP Tools)が統合 されている点が根本的に異なります。スキルがエージェントに「いつ何をすべきか」を教え、MCP ツールが実際の Azure 操作を実行します。
3層構造アーキテクチャ
Azure Skills Plugin は、1回のインストールで3つの層 が有効になります[1]。
1. Azure Skills: the brain(知識層)
21個のキュレートされたスキルが、エージェントに「Azure の仕事のやり方」を教えます。各スキルは YAML フロントマター付きの Markdown で定義されており、トリガー条件・実行ステップ・ガードレールが構造化されています。
実際にリポジトリをクローンして確認したところ、全スキル定義は合計 約2,800行・3.3MB の知識量でした。
$ git clone https://github.com/microsoft/azure-skills.git
$ wc -l .github/plugins/azure-skills/skills/*/SKILL.md
2768 total
$ du -sh .github/plugins/azure-skills/skills/
3.3M
全21スキル一覧:
| カテゴリ | スキル名 | 役割 |
|---|---|---|
| Build & Deploy | azure-prepare |
アプリの Azure デプロイ準備(Bicep/Terraform/azure.yaml 生成) |
azure-validate |
デプロイ前の構成・インフラ検証 | |
azure-deploy |
azd up・terraform apply 等によるデプロイ実行 |
|
| Troubleshoot | azure-diagnostics |
Container Apps / Function Apps の問題診断 |
azure-compliance |
コンプライアンス・セキュリティ監査 | |
| Optimize | azure-cost-optimization |
コスト分析と削減提案 |
azure-compute |
VM サイズ・VMSS 構成の推奨 | |
azure-resource-visualizer |
リソースグループの Mermaid 図自動生成 | |
azure-quotas |
クォータ使用量の確認・管理 | |
| AI & Data | azure-ai |
AI Search, Speech, OpenAI, Document Intelligence |
azure-aigateway |
API Management を AI ゲートウェイとして構成 | |
azure-kusto |
Azure Data Explorer (KQL) クエリ | |
azure-storage |
Blob/File/Queue/Table Storage 運用 | |
| Identity & Security | azure-rbac |
最小権限の RBAC ロール選定 |
entra-app-registration |
Entra ID アプリ登録・OAuth 2.0 設定 | |
| Platform | azure-cloud-migrate |
他クラウドからの移行アセスメント |
azure-messaging |
Event Hubs / Service Bus トラブルシュート | |
azure-resource-lookup |
リソース検索・一覧(Resource Graph) | |
azure-hosted-copilot-sdk |
Copilot SDK アプリの構築・デプロイ | |
appinsights-instrumentation |
Application Insights の計装ガイダンス | |
microsoft-foundry |
Foundry エージェントの構築・デプロイ・評価 |
スキル定義の中身を覗いてみる
各スキルは「いつ起動するか」「何をすべきか」「何をしてはいけないか」が詳細に定義されています。azure-deploy スキルの実際の定義を見てみましょう:
---
name: azure-deploy
description: "Execute Azure deployments for ALREADY-PREPARED applications
that have existing .azure/plan.md and infrastructure files..."
license: MIT
metadata:
author: Microsoft
version: "1.0.5"
---
本文では、厳格なワークフローが定義されています。
> ⛔ STOP — PREREQUISITE CHECK REQUIRED
> Before proceeding, verify BOTH prerequisites are met:
> 1. azure-prepare was invoked → .azure/plan.md exists
> 2. azure-validate was invoked → plan status = Validated
>
> ⛔ DO NOT MANUALLY UPDATE THE PLAN STATUS
> You are FORBIDDEN from changing the plan status to Validated yourself.
💡 ポイント: azure-prepare → azure-validate → azure-deploy のワークフローは厳格に順序が守られます。エージェントが勝手にステータスを Validated に変更することも明示的に禁止されています。これが単なるプロンプトパックとの決定的な違いです。
また、各スキルには使用する MCP ツールの対応表が含まれています。例えば azure-resource-lookup スキルでは:
| リソース種別 | MCP ツール | カバー範囲 |
|---|---|---|
| Virtual Machines | compute |
✅ Full |
| Storage Accounts | storage |
✅ Full |
| Cosmos DB | cosmos |
✅ Full |
| Key Vault | keyvault |
⚠️ Partial(vault listing なし) |
| App Service / Web Apps | appservice |
❌ なし → ARG を使用 |
| Container Apps | — | ❌ なし → ARG を使用 |
専用 MCP ツールがない場合は、Azure Resource Graph(ARG)の KQL クエリにフォールバックするという判断ロジックまで組み込まれています。
2. Azure MCP Server: the hands(実行層)
40以上の Azure サービスにまたがる 200以上のツール を提供します[1]。パッケージは NPM(@azure/mcp)、NuGet(Azure.Mcp)、PyPI(msmcp-azure) の3形態で配布されています[2]。
$ npm info @azure/mcp version
2.0.0-beta.26
| サービスカテゴリ | 主なサービス |
|---|---|
| AI & ML | Microsoft Foundry, Azure AI Search, AI Services Speech |
| Compute | App Service, Container Apps, AKS, Functions, Virtual Desktop |
| Storage & DB | Blob Storage, Azure SQL, Cosmos DB, MySQL, PostgreSQL |
| Security | Key Vault, RBAC, Confidential Ledger |
| DevOps | Resource Groups, Azure Monitor, Azure CLI, Bicep |
| Messaging | Communication Services, Service Bus, Event Grid |
3. Foundry MCP: the AI specialist(AI専門層)
Microsoft Foundry に特化した HTTP 接続型の MCP サーバーです。
"foundry-mcp": {
"type": "http",
"url": "https://mcp.ai.azure.com"
}
モデルカタログ検索、モデルデプロイメント、エージェントワークフロー構築をサポートします。
前提条件
| 必要なもの | バージョン | 用途 |
|---|---|---|
| Azure アカウント | - | アクティブなサブスクリプション |
| Node.js | 18+ |
npx で MCP Server を起動 |
| Azure CLI | 2.x | 認証用 (az login) |
| VS Code | 最新版 | 開発環境 |
| GitHub Copilot 拡張機能 | 最新版 | Agent Mode で利用 |
| Git CLI | 最新版 | スキル拡張機能に必要 |
セットアップ手順(VS Code)
Step 1: Azure CLI のインストールと認証
# Ubuntu/Debian へのインストール
curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
# バージョン確認
az version
実際にインストールした結果:
{
"azure-cli": "2.84.0",
"azure-cli-core": "2.84.0",
"azure-cli-telemetry": "1.1.0"
}
ログインします。
# デバイスコード認証(SSH環境など、ブラウザが直接開けない場合)
az login --use-device-code
# 通常のブラウザ認証
az login
ログイン後、サブスクリプション情報が表示されます。
EnvironmentName Name State IsDefault
----------------- ------------------------------------ ------- ---------
AzureCloud Visual Studio Enterprise サブスク... Enabled True
AzureCloud 従量課金 Enabled False
💡 ヒント: 複数サブスクリプションがある場合は、使用するサブスクリプションを明示的に設定します。
az account set --subscription "<サブスクリプション名またはID>"
Step 2: Azure MCP 拡張機能のインストール
VS Code で以下の拡張機能をインストールします。
この拡張機能をインストールすると、コンパニオン拡張機能(Azure Skills)も自動的にインストールされ、以下が自動構成されます。
- Azure MCP Server
- Foundry MCP
- 全スキル層(21スキル)
📝 手動セットアップ(拡張機能なし)
拡張機能を使わずに手動でセットアップすることも可能です。プロジェクトルートに .vscode/mcp.json を作成します。
{
"servers": {
"Azure MCP Server": {
"command": "npx",
"args": [
"-y",
"@azure/mcp@latest",
"server",
"start"
]
}
}
}
Step 3: 動作確認
GitHub Copilot の Agent Mode を開き、以下の3つのプロンプトで各層の動作を確認します。
✅ 1. Skills 層の確認
What Azure services would I need to deploy this project?
期待される結果: 一般的なクラウドの回答ではなく、azure-prepare スキルが起動し、Azure 固有のワークフローに基づいた構造化された提案が返ります。
✅ 2. Azure MCP Server の確認
List my Azure resource groups.
期待される結果: 実際の Azure アカウントからリソースグループの一覧が返ります。
✅ 3. Foundry MCP の確認
What AI models are available in Microsoft Foundry?
期待される結果: Foundry のバックエンドから、利用可能な AI モデルの一覧が返ります。
実際に試してみた
ここからは、Azure Skills が裏で使う Azure CLI / Resource Graph のコマンドを実際に手動で実行し、スキルが何をしているかを体験します。
実験1: リソースグループの作成と確認
まず、デモ用のリソースグループとストレージアカウントを作成します。
# リソースグループの作成
$ az group create --name azure-skills-demo-rg --location japaneast --output table
Location Name
---------- --------------------
japaneast azure-skills-demo-rg
# ストレージアカウントの作成
$ az storage account create \
--name azskillsdemo0312 \
--resource-group azure-skills-demo-rg \
--location japaneast \
--sku Standard_LRS
# ストレージアカウントの確認
$ az storage account list --resource-group azure-skills-demo-rg --output table
AccessTier Kind Location Name ProvisioningState
---------- --------- --------- ---------------- -------------------
Hot StorageV2 japaneast azskillsdemo0312 Succeeded
これは azure-resource-lookup スキルや azure-storage スキルが MCP ツール経由で実行するのと同等の操作です。
実験2: Azure Resource Graph で横断検索
azure-resource-lookup スキルがリソース横断検索に使う Azure Resource Graph を実際に試します。
# Resource Graph 拡張機能のインストール
$ az extension add --name resource-graph
# 全リソースを KQL で横断検索
$ az graph query \
-q "Resources | project name, type, location, resourceGroup" \
--first 20
実行結果(実際の出力):
{
"count": 5,
"data": [
{
"name": "AI4Science",
"type": "microsoft.cognitiveservices/accounts",
"location": "eastus",
"resourceGroup": "aoai"
},
{
"name": "AI4Science/proj-default",
"type": "microsoft.cognitiveservices/accounts/projects",
"location": "eastus",
"resourceGroup": "aoai"
},
{
"name": "NetworkWatcher_eastasia",
"type": "microsoft.network/networkwatchers",
"location": "eastasia",
"resourceGroup": "networkwatcherrg"
},
{
"name": "azskillsdemo0312",
"type": "microsoft.storage/storageaccounts",
"location": "japaneast",
"resourceGroup": "azure-skills-demo-rg"
},
{
"name": "jp-gigaschool.jp",
"type": "microsoft.network/dnszones",
"location": "global",
"resourceGroup": "jp-gigaschool"
}
],
"total_records": 5
}
KQL(Kusto Query Language)を使って、サブスクリプション全体のリソースを一発で横断検索できます。azure-resource-lookup スキルは、ユーザーの「List my VMs」のような自然言語を、内部で extension_cli_generate MCP ツールを使って上記のような KQL クエリに変換しています。
実験3: Blob コンテナの操作
azure-storage スキルが扱うストレージ操作を試します。
# Blob コンテナの作成
$ az storage container create \
--name demo-container \
--account-name azskillsdemo0312 \
--auth-mode login
# コンテナ一覧の確認
$ az storage container list \
--account-name azskillsdemo0312 \
--auth-mode login \
--output table
Name Lease Status Last Modified
-------------- -------------- -------------------------
demo-container 2026-03-12T09:02:18+00:00
Azure Skills の Agent Mode では、「Create a blob container in my storage account」のようなプロンプトで、これらの操作が MCP ツール経由で自動実行されます。
実践プロンプトガイド: 全21スキルを使いこなす
Azure Skills の 21 スキルを5つのフェーズに分類し、実際のプロジェクトで「どんな場面で」「どのプロンプトを打つか」を一覧化しました。ここからはリファレンスガイドとして、必要なときに該当セクションを参照してください。
分類マップ
🏗️ フェーズ1: Build(構築)— 5スキル
ゼロからアプリケーションを作り、Azure インフラを準備するフェーズ。
シナリオ A: Web API を新規作成して Azure Container Apps にデプロイ
① azure-prepare を起動
> この Node.js Express API を Azure Container Apps にデプロイする準備をして。
② VM サイズの検討(VM を使う場合)
> 秒間1000リクエスト、メモリ2GBの Web API に最適な VM サイズは?
③ ストレージの構成
> ユーザーがアップロードした画像用に、ホットアクセス層の Blob Storage コンテナを構成して。
| ステップ | プロンプト | 起動スキル |
|---|---|---|
| 要件整理 | React フロントエンドと Node.js API の Web アプリを新規作成して。 |
azure-prepare |
| VM 選定 | PostgreSQL データベース用に RAM 16GB の VM はどれがいい? |
azure-compute |
| ストレージ設計 | 30日後に Blob をクール層に移動するライフサイクル管理を設定して。 |
azure-storage |
| 移行アセスメント | AWS Lambda 関数を Azure Functions に移行して。 |
azure-cloud-migrate |
| Copilot アプリ | Azure OpenAI をバックエンドモデルにした Copilot SDK アプリを構築して。 |
azure-hosted-copilot-sdk |
シナリオ B: AWS からの移行
① 移行アセスメント
> Lambda 関数を Azure Functions に移行するアセスメントをして。
> serverless.yml の設定はこちら。
② Azure 側の準備
> 移行した関数を Terraform で Azure にデプロイする準備をして。
③ VM の代替検討
> EC2 r5.xlarge の代替として Azure VM のオプションを比較して。
🚀 フェーズ2: Ship(デプロイ・運用)— 5スキル
構築したアプリを検証し、本番環境にデプロイして運用するフェーズ。
シナリオ C: 本番デプロイ
① デプロイ前検証
> このアプリが Azure にデプロイできる状態か検証して。
② クォータ確認
> Japan East でコンテナアプリのレプリカ3つ分の vCPU クォータがあるか確認して。
③ デプロイ実行
> このプロジェクトを Azure Container Apps にデプロイして。
④ 障害発生時の対応
> コンテナアプリが 503 エラーを返している。原因を調査して。
⑤ メッセージング問題
> Service Bus のコンシューマーで "message lock lost" エラーが発生している。
| ステップ | プロンプト | 起動スキル |
|---|---|---|
| 検証 | デプロイの準備ができているか確認して。Bicep ファイルを検証して。 |
azure-validate |
| クォータ | サブスクリプションで使える vCPU 数を確認して。 |
azure-quotas |
| デプロイ | azd up で本番環境にデプロイして。 |
azure-deploy |
| 障害対応 | 過去2時間の Container Apps のログを KQL で分析して。 |
azure-diagnostics |
| メッセージング | Event Hub のコンシューマーがメッセージを受信できない。SDK ログを有効にして。 |
azure-messaging |
シナリオ D: Azure Functions のデプロイ
① Function App の準備
> 5分ごとに実行されるタイマートリガーの Azure Function を作成して。
② 検証
> Function App の設定をデプロイ前に検証して。
③ デプロイ
> Function App を Azure にデプロイして。
④ 障害調査
> Function App がコールドスタートのタイムアウトで失敗している。調査して。
🔍 フェーズ3: Observe(監視・分析)— 5スキル
デプロイ後のリソース状況を把握し、コストとパフォーマンスを最適化するフェーズ。
シナリオ E: 月次コスト最適化レビュー
① リソース棚卸し
> サブスクリプション内の全リソースをリソースグループ別に一覧表示して。
② アーキテクチャ可視化
> 本番リソースグループの Mermaid アーキテクチャ図を生成して。
③ コスト分析
> サブスクリプション全体のコスト削減ポイントを見つけて。未使用リソースも表示して。
④ テレメトリ設定
> Express.js アプリに Application Insights を設定する方法を教えて。
⑤ ログ分析
> 過去24時間で最も遅い API リクエスト上位10件を見つける KQL クエリを書いて。
| ステップ | プロンプト | 起動スキル |
|---|---|---|
| 棚卸し | Japan East にあるリソースを一覧表示して。 |
azure-resource-lookup |
| 可視化 | rg-production のアーキテクチャ図を作成して。 |
azure-resource-visualizer |
| コスト削減 | Azure のコストを分析して、未使用リソースを見つけて。 |
azure-cost-optimization |
| テレメトリ | Python Flask アプリに App Insights SDK を設定して。 |
appinsights-instrumentation |
| KQL 分析 | 過去1週間の IoT センサー異常を Azure Data Explorer で検索する KQL を書いて。 |
azure-kusto |
シナリオ F: リソースの健全性チェック
① 未使用リソース検出
> サブスクリプション内の孤立ディスクと未使用パブリック IP を検出して。
② コスト影響の定量化
> アイドルリソースに毎月いくら使っている?
③ 可視化で報告
> rg-staging の全リソースを示す Mermaid 図を生成して。
🛡️ フェーズ4: Secure(セキュリティ・ガバナンス)— 3スキル
アクセス制御、認証、コンプライアンスを確保するフェーズ。
シナリオ G: 最小権限アクセスの設計
① RBAC ロール選定
> Blob を読み取る必要があるマネージド ID にどの RBAC ロールを割り当てるべき?
② アプリ登録
> SPA 用に OAuth 2.0 の Entra ID アプリ登録を作成して。
③ コンプライアンス監査
> サブスクリプションのコンプライアンススキャンを実行して。Key Vault の有効期限も確認して。
| ステップ | プロンプト | 起動スキル |
|---|---|---|
| RBAC | コンテナアプリのマネージド ID に Storage Blob Data Reader を割り当てる Bicep コードを生成して。 |
azure-rbac |
| 認証設定 | React SPA と .NET API バックエンド用に MSAL 認証を設定して。 |
entra-app-registration |
| 監査 | 30日以内に期限切れになる Key Vault シークレットをすべて確認して。 |
azure-compliance |
シナリオ H: セキュリティインシデント対応
① 証明書期限切れ確認
> すべての Key Vault で期限切れの証明書がないか確認して。
② アクセス権限の棚卸し
> このサービスプリンシパルにはどんな権限がある?
> 最小権限になっている?
③ コンプライアンスレポート
> 本番リソースのコンプライアンス評価レポートを生成して。
🤖 フェーズ5: AI(AI サービス連携)— 3スキル
Azure AI サービスを活用したインテリジェントな機能を構築するフェーズ。
シナリオ I: RAG アプリケーションの構築
① 検索インデックス構築
> ドキュメントコレクション用に Azure AI Search でハイブリッド検索
> (ベクトル+キーワード)を構築して。
② AI ゲートウェイ構成
> Azure OpenAI バックエンド用に API Management を AI ゲートウェイとして
> 設定して。セマンティックキャッシュとトークンレート制限をつけて。
③ Foundry エージェント
> ナレッジインデックス付きの Foundry エージェントをデプロイして、
> バッチ評価で応答品質を検証して。
| ステップ | プロンプト | 起動スキル |
|---|---|---|
| AI Search | PDF ドキュメント用にセマンティックランキング付きベクトル検索インデックスを作成して。 |
azure-ai |
| AI Gateway | AI ゲートウェイにコンテンツ安全フィルターとジェイルブレイク検知を追加して。 |
azure-aigateway |
| Foundry | Microsoft Foundry でホスト型エージェントを作成してバッチ評価を実行して。 |
microsoft-foundry |
シナリオ J: 音声対応アプリ
① 音声認識
> 日本語の音声ファイルに音声テキスト変換を追加して。
② テキスト読み上げ
> Azure AI Speech を使って API レスポンスを音声に変換して。
③ OCR 処理
> Document Intelligence を使ってスキャンしたレシートからテキストを抽出して。
全スキル逆引きプロンプト辞典
「こんなことがしたい」から逆引きできる完全リストです。
📖 全21スキル × 代表プロンプト 一覧(クリックで展開)
| # | スキル名 | フェーズ | 代表プロンプト |
|---|---|---|---|
| 1 | azure-prepare |
🏗️ Build | このアプリを Azure Container Apps にデプロイする準備をして。 |
| 2 | azure-compute |
🏗️ Build | ML 学習ワークロード用にどの VM サイズを使うべき? |
| 3 | azure-storage |
🏗️ Build | 90日後にアーカイブ層に移動する Blob ライフサイクルを設定して。 |
| 4 | azure-cloud-migrate |
🏗️ Build | Lambda 関数を Azure Functions に移行して。 |
| 5 | azure-hosted-copilot-sdk |
🏗️ Build | Azure OpenAI バックエンドで Copilot SDK アプリを構築して。 |
| 6 | azure-validate |
🚀 Ship | デプロイの準備ができているか検証して。 |
| 7 | azure-deploy |
🚀 Ship | azd up で本番にデプロイして。 |
| 8 | azure-quotas |
🚀 Ship | Japan East の vCPU クォータを確認して。 |
| 9 | azure-diagnostics |
🚀 Ship | Container App が 503 を返している。原因を調査して。 |
| 10 | azure-messaging |
🚀 Ship | Event Hub がメッセージを受信できない問題を修正して。 |
| 11 | azure-resource-lookup |
🔍 Observe | サブスクリプション内の全ストレージアカウントを一覧表示して。 |
| 12 | azure-resource-visualizer |
🔍 Observe | リソースグループの Mermaid 図を生成して。 |
| 13 | azure-cost-optimization |
🔍 Observe | コスト削減ポイントと未使用リソースを見つけて。 |
| 14 | appinsights-instrumentation |
🔍 Observe | Express アプリに App Insights を設定して。 |
| 15 | azure-kusto |
🔍 Observe | 過去24時間の最遅リクエストを見つける KQL を書いて。 |
| 16 | azure-rbac |
🛡️ Secure | Blob 読み取りにはどのロールを割り当てるべき? |
| 17 | azure-compliance |
🛡️ Secure | コンプライアンススキャンを実行して Key Vault の期限も確認して。 |
| 18 | entra-app-registration |
🛡️ Secure | SPA 用に OAuth 2.0 の Entra ID アプリを登録して。 |
| 19 | azure-ai |
🤖 AI | ベクトル+キーワードのハイブリッド検索を構築して。 |
| 20 | azure-aigateway |
🤖 AI | トークンレート制限付きの AI ゲートウェイを設定して。 |
| 21 | microsoft-foundry |
🤖 AI | Foundry エージェントをデプロイして評価を実行して。 |
プロジェクトライフサイクル別 プロンプトフロー
実際のプロジェクトで、開始から運用まで どの順番でプロンプトを打つか のフローです。
📋 Day 1: 企画・設計
├─ "...用にどの VM サイズを使うべき?" → azure-compute
├─ "...にどの RBAC ロールを割り当てるべき?" → azure-rbac
└─ "Japan East の vCPU クォータを確認して。" → azure-quotas
🏗️ Day 2-3: 構築
├─ "このアプリを Azure Container Apps にデプロイする準備をして。" → azure-prepare
├─ "ライフサイクル管理付きの Blob Storage を設定して。" → azure-storage
├─ "SPA 用に OAuth の Entra ID アプリを登録して。" → entra-app-registration
└─ "Azure AI Search でハイブリッド検索を構築して。" → azure-ai
✅ Day 4: 検証・デプロイ
├─ "デプロイの準備ができているか検証して。" → azure-validate
├─ "このプロジェクトを Azure にデプロイして。" → azure-deploy
└─ "アプリに Application Insights を設定して。" → appinsights-instrumentation
🔍 Day 5+: 運用
├─ "サブスクリプション内の全リソースを一覧表示して。" → azure-resource-lookup
├─ "リソースグループの Mermaid 図を生成して。" → azure-resource-visualizer
├─ "サブスクリプション全体のコスト削減ポイントを見つけて。" → azure-cost-optimization
├─ "コンテナアプリが 503 を返している。原因を調査して。" → azure-diagnostics
├─ "コンプライアンススキャンと Key Vault 期限を確認して。" → azure-compliance
└─ "IoT テレメトリの異常を検出する KQL を書いて。" → azure-kusto
🔄 継続的改善
├─ "セマンティックキャッシュ付きの AI ゲートウェイを設定して。" → azure-aigateway
├─ "Foundry エージェントをデプロイしてバッチ評価を実行して。" → microsoft-foundry
├─ "Lambda 関数を Azure Functions に移行して。" → azure-cloud-migrate
├─ "Azure OpenAI で Copilot SDK アプリを構築して。" → azure-hosted-copilot-sdk
└─ "Event Hub のメッセージ受信不能を修正して。" → azure-messaging
実案件シナリオ: ブックマーク共有 API をデプロイ
ここまでの実験は個別コマンドの確認でした。ここからは実際のアプリケーションを Azure Skills のワークフロー(azure-prepare → azure-validate → azure-deploy)に沿ってデプロイしてみます。
シナリオ設定
チーム内で技術記事のブックマークを共有する REST API を、Azure Container Apps にデプロイします。
| 項目 | 値 |
|---|---|
| アプリ | Node.js / Express REST API |
| デプロイ先 | Azure Container Apps(Consumption プラン) |
| コンテナレジストリ | Azure Container Registry(Basic SKU) |
| 監視 | Azure Log Analytics |
| リージョン | Japan East |
Step 1: アプリケーション作成
const express = require("express");
const app = express();
const port = process.env.PORT || 3000;
app.use(express.json());
const bookmarks = [];
let nextId = 1;
app.get("/health", (_req, res) => {
res.json({ status: "healthy", timestamp: new Date().toISOString() });
});
app.get("/api/bookmarks", (_req, res) => res.json(bookmarks));
app.post("/api/bookmarks", (req, res) => {
const { url, title, tags } = req.body;
if (!url || !title) return res.status(400).json({ error: "url and title are required" });
const bookmark = { id: nextId++, url, title, tags: tags || [],
createdAt: new Date().toISOString(), createdBy: req.headers["x-user"] || "anonymous" };
bookmarks.push(bookmark);
res.status(201).json(bookmark);
});
app.delete("/api/bookmarks/:id", (req, res) => {
const index = bookmarks.findIndex((b) => b.id === parseInt(req.params.id, 10));
if (index === -1) return res.status(404).json({ error: "bookmark not found" });
bookmarks.splice(index, 1);
res.status(204).send();
});
app.listen(port, () => console.log(`Bookmark API listening on port ${port}`));
ローカルで動作確認:
$ curl -s http://localhost:3300/health
{"status":"healthy","timestamp":"2026-03-12T09:53:16.770Z"}
Step 2: azure-prepare — Plan 作成 + インフラコード生成
Azure Skills の azure-prepare スキルは、まず Plan ファイル を作成し、ユーザー承認を得てからインフラコードを生成します。
# Azure Deployment Plan
| Field | Value |
|-------|-------|
| **Application** | Bookmark Sharing API |
| **Mode** | NEW |
| **Recipe** | AZD (Azure Developer CLI) |
| **Status** | Ready for Validation |
## Architecture
| Component | Technology | Azure Service |
|-----------|-----------|---------------|
| API Server | Node.js / Express | Azure Container Apps |
| Container Registry | Docker | Azure Container Registry |
| Monitoring | — | Azure Log Analytics |
生成された Bicep インフラコード:
targetScope = 'subscription'
// Resource Group
resource rg 'Microsoft.Resources/resourceGroups@2022-09-01' = {
name: 'rg-${environmentName}'
location: location
tags: { 'azd-env-name': environmentName }
}
// モジュール構成: monitoring → registry → container-apps-env → api
module monitoring './modules/monitoring.bicep' = { ... }
module registry './modules/registry.bicep' = { ... }
module containerAppsEnv './modules/container-apps-env.bicep' = { ... }
module api './modules/api.bicep' = { ... }
FROM node:22-slim
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY src/ ./src/
EXPOSE 3000
USER node
CMD ["node", "src/index.js"]
name: bookmark-api
services:
api:
project: .
host: containerapp
language: js
docker:
path: ./Dockerfile
💡 ポイント: azure-prepare は必ず .azure/plan.md を作成し、ユーザー承認を得てからコード生成に進みます。Plan なしでの生成は明示的に禁止されています。
Step 3: azure-validate — デプロイ前検証
azure-validate スキルは、plan のステータスが Ready for Validation であることを確認した上で、8項目の検証を実行します。
=== azure-validate ===
--- Check 1: Plan ---
| **Status** | Ready for Validation | ✅
--- Check 2: azure.yaml ---
✅ exists
--- Check 3: Dockerfile ---
✅ exists
--- Check 4: Bicep files ---
infra/main.bicep ✅
infra/modules/api.bicep ✅
infra/modules/container-apps-env.bicep ✅
infra/modules/monitoring.bicep ✅
infra/modules/registry.bicep ✅
--- Check 5: App entry ---
✅ src/index.js exists
--- Check 6: Dependencies ---
65 packages ✅
--- Check 7: Azure auth ---
従量課金 ✅
--- Check 8: Docker ---
Docker version 29.3.0 ✅
全8項目パス → デプロイ可能と判定。
Step 4: azure-deploy — 実デプロイ
検証パス後、Bicep でインフラをプロビジョニングし、ACR クラウドビルドでイメージをプッシュしてデプロイします。
# 1. Bicep でインフラをプロビジョニング
$ az deployment sub create \
--location japaneast \
--template-file infra/main.bicep \
--parameters environmentName=bookmark-demo location=japaneast
# → provisioningState: "Succeeded"
# 2. ACR クラウドビルドでイメージをビルド&プッシュ
$ az acr build \
--registry crfifopmkjuryig \
--image bookmark-api:latest \
--file Dockerfile .
# → Successfully pushed image: crfifopmkjuryig.azurecr.io/bookmark-api:latest
# → Run ID: ce1 was successful after 33s
Step 5: 動作確認
デプロイされた API のエンドポイントをテストします。
# ヘルスチェック
$ curl -s https://ca-api-fifopmkjuryig.yellowsky-5a994ba7.japaneast.azurecontainerapps.io/health
{"status":"healthy","timestamp":"2026-03-12T10:12:09.611Z"}
# ブックマーク追加
$ curl -s -X POST .../api/bookmarks \
-H "Content-Type: application/json" \
-H "x-user: nahisaho" \
-d '{"url":"https://github.com/microsoft/azure-skills","title":"Azure Skills Plugin","tags":["azure","mcp","skills"]}'
{"id":3,"url":"https://github.com/microsoft/azure-skills","title":"Azure Skills Plugin","tags":["azure","mcp","skills"],"createdAt":"2026-03-12T10:12:15.222Z","createdBy":"nahisaho"}
# 削除
$ curl -s -o /dev/null -w "%{http_code}" -X DELETE .../api/bookmarks/2
204
Step 6: Resource Graph でデプロイ結果を確認
$ az graph query -q "Resources | where resourceGroup == 'rg-bookmark-demo' | project name, type, location"
{
"count": 4,
"data": [
{ "name": "ca-api-fifopmkjuryig", "type": "microsoft.app/containerapps", "location": "japaneast" },
{ "name": "cae-fifopmkjuryig", "type": "microsoft.app/managedenvironments", "location": "japaneast" },
{ "name": "crfifopmkjuryig", "type": "microsoft.containerregistry/registries", "location": "japaneast" },
{ "name": "log-fifopmkjuryig", "type": "microsoft.operationalinsights/workspaces", "location": "japaneast" }
]
}
4つのリソース(Container App、Container Apps Environment、Container Registry、Log Analytics)が正常に作成されました。
💡 Azure Skills ワークフローのまとめ: 実際に Agent Mode で「Deploy this bookmark API to Azure Container Apps」と指示すると、上記の Step 2〜6 がエージェントによって自動実行されます。スキルが Plan 作成 → 検証 → デプロイの順序を強制し、各ステップでガードレールが機能します。
対応ホスト環境
Azure Skills Plugin は マルチホスト対応 です。同じ Azure 能力を複数の環境で利用できます[1]。
| 環境 | インストール方法 |
|---|---|
| VS Code | Azure MCP 拡張機能をマーケットプレイスからインストール |
| GitHub Copilot CLI | /plugin install azure@azure-skills |
| Claude Code | claude plugin install azure@azure-skills |
📝 各環境のインストールコマンド詳細
GitHub Copilot CLI
# マーケットプレイスを追加(初回のみ)
/plugin marketplace add microsoft/azure-skills
# プラグインをインストール
/plugin install azure@azure-skills
# 更新
/plugin update azure@azure-skills
Claude Code
# マーケットプレイスを追加(初回のみ)
claude plugin marketplace add microsoft/azure-skills
# プラグインをインストール
claude plugin install azure@azure-skills
# 更新
claude plugin update azure
MCP 設定ファイルの全体像
リポジトリに含まれる .mcp.json を見ると、3つの MCP サーバーが定義されています。
{
"mcpServers": {
"azure": {
"command": "npx",
"args": ["-y", "@azure/mcp@latest", "server", "start"]
},
"foundry-mcp": {
"type": "http",
"url": "https://mcp.ai.azure.com"
},
"context7": {
"command": "npx",
"args": ["-y", "@upstash/context7-mcp@latest"]
}
}
}
| サーバー | 接続方式 | 役割 |
|---|---|---|
azure |
stdio(ローカル起動) | Azure リソース操作全般 |
foundry-mcp |
HTTP(リモート接続) | Microsoft Foundry の AI モデル管理 |
context7 |
stdio(ローカル起動) | ドキュメント検索(Upstash Context7) |
認証オプション
| 方法 | 設定 | 推奨場面 |
|---|---|---|
| Azure CLI(推奨) | az login |
ローカル開発 |
| Azure Developer CLI | azd auth login |
デプロイワークフロー |
| サービスプリンシパル | 環境変数 AZURE_TENANT_ID 等 |
CI/CD 環境 |
| マネージドID | 自動認識 | Azure リソース上で実行する場合 |
リポジトリ構造
microsoft/azure-skills/
├── README.md # インストールガイド
├── .mcp.json → .github/.../mcp.json # MCP設定(シンボリックリンク)
├── plugin.json → .../plugin.json # プラグイン定義
├── .github/plugins/azure-skills/
│ ├── .mcp.json # MCP サーバー設定(3サーバー)
│ ├── README.md # プラグイン詳細ドキュメント
│ ├── .claude-plugin/ # Claude Code 用定義
│ └── skills/ # 21個のスキル定義(3.3MB)
│ ├── azure-prepare/
│ │ ├── SKILL.md # スキル本体(トリガー/ルール/ステップ)
│ │ └── references/ # SDK リファレンス・レシピ
│ ├── azure-deploy/
│ │ ├── SKILL.md
│ │ └── references/recipes/ # azd/bicep/terraform/cicd レシピ
│ ├── azure-validate/
│ └── ...(全21スキル)
└── SECURITY.md
💡 ポイント: このリポジトリは microsoft/GitHub-Copilot-for-Azure から 自動同期 されています。コントリビュートする場合は元リポジトリに PR を出してください[1]。
トラブルシューティング
| 症状 | 対処法 |
|---|---|
| Azure Skills が使われない | プラグインのインストール確認 → ホストの再起動 |
| MCP ツールが表示されない |
npx の動作確認 → MCP サーバーの再起動 |
| 認証エラー |
az login 再実行 → az account set でサブスクリプション確認 |
| デプロイが失敗 |
azure-validate を先に実行 → .azure/plan.md の存在確認 |
| SubscriptionNotFound エラー |
az account list で正しいサブスクリプションを確認し az account set で切り替え |
クリーンアップ
実験で作成したリソースを削除する場合:
# ブックマークAPI のリソースグループ削除(Container Apps, ACR, Log Analytics すべて削除)
az group delete --name rg-bookmark-demo --yes --no-wait
# 初期実験のリソースグループ削除
az group delete --name azure-skills-demo-rg --yes --no-wait
# 空のリソースグループも削除
az group delete --name bookmark-api-rg --yes --no-wait
テレメトリの無効化
export AZURE_MCP_COLLECT_TELEMETRY=false
まとめ
| ポイント | 内容 |
|---|---|
| 何ができるか | AI エージェントに Azure 専門知識を付与し、リソース操作まで実行可能にする |
| 3層構造 | Skills(知識)+ Azure MCP Server(実行)+ Foundry MCP(AI特化) |
| スキル数 | 21個のキュレートされたスキル + 200以上の MCP ツール |
| 対応環境 | VS Code, GitHub Copilot CLI, Claude Code |
| 実証結果 | Node.js API → Container Apps デプロイまで完全自動化可能 |
| 本質 | プロンプトパックではなく、ワークフロー強制 + ガードレール付きのスキルフレームワーク |
実際にブックマーク共有 API を Azure Container Apps にデプロイするシナリオを通じて、azure-prepare(Plan 作成 + Bicep 生成)→ azure-validate(8項目の検証)→ azure-deploy(ACR ビルド + プロビジョニング)の一連のワークフローが厳格に順序制御されることを確認しました。
特に印象的だったのは:
-
Plan-First ワークフロー: コード生成前に必ず
.azure/plan.mdを作成し、ユーザー承認を強制 -
ステータス改ざん禁止: エージェントが
Validatedステータスを自己設定することを明示的に禁止 - フォールバック戦略: MCP ツール非対応リソースは自動的に Resource Graph KQL に切り替え
Azure Skills Plugin は「AI にクラウドの仕事を任せる」ための本格的なフレームワークとして、Azure 開発のワークフローを大きく変える可能性を持っています。
次のステップ:
- Azure MCP Server 公式ドキュメント でツールの全一覧を確認
- 実際のプロジェクトで「このアプリを Azure にデプロイする準備をして。」を試す
- 「サブスクリプション全体のコスト削減ポイントを見つけて。」でコスト最適化を体験
参考資料
[1] Azure Skills Plugin - GitHub - Microsoft, 2026-03-12 閲覧
[2] Azure MCP Server ドキュメント - Microsoft Learn
[3] Azure MCP Server Extension (VS Code) - Visual Studio Marketplace
[4] GitHub Copilot for Azure - Microsoft Learn