はじめに
Azure SRE Agent は、Azure のインフラ運用を自然言語で支援してくれる AI エージェントです。標準では Azure Portal 上のチャット UI から利用しますが、実は Data Plane REST API が公開されており、外部システムから呼び出すことができます。
SRE Agent にも Teams コネクタで Teams チャネルにアラートをポストする機能はありますが、SRE Agent → Teams の片方向の使い方になるため、双方向でやり取りする方法として検証してみました。
本記事では、この API を Copilot Studio のカスタムコネクタ 経由で呼び出し、Microsoft Teams から SRE Agent と会話できるエージェント を構築する手順をまとめます。
構成イメージはこんな感じです。
「Portal を開かずに Teams のチャットからサクッと Azure の状態を確認したい」「承認フローを含めた運用アシスタントを作りたい」といったユースケースに使えます。
対象読者
- Azure SRE Agent を触ってみたい / 触っているが Portal 以外から使いたい方
- Teams 上に業務エージェントを乗せたい方
事前準備
以下が揃っていることを前提とします。
- Azure SRE Agent リソースが作成済み
- Power Platform の環境 (ライセンス含む)
- Azure Portal への管理者アクセス権(アプリ登録・API 権限同意が必要)
SRE Agent のエンドポイントを確認
まずカスタムコネクタで使う agentEndpoint を控えておきます。
az rest -m GET \
--url "https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.App/agents/{agentName}?api-version=2025-05-01-preview" \
--query properties.agentEndpoint -o tsv
{agentName}.{hash}.{region}.azuresre.ai のような FQDN が返ってきます。
Step 1: Azure AD アプリ登録
カスタムコネクタから OAuth で SRE Agent API を叩くために、Entra ID (Azure AD) アプリを 1 つ作成します。
1-1. アプリを新規登録
- Azure Portal → Microsoft Entra ID → アプリの登録 → 新規登録
- 設定:
- 名前:
copilot-studio-sre-agent(任意) - サポートされるアカウント: シングルテナント
- 名前:
- 登録 をクリック
1-2. クライアントシークレットを作成
- 左メニュー → 証明書とシークレット → 新しいクライアントシークレット
- 説明と有効期限を設定し 追加
- 生成された 「値」 をコピーして保存
シークレットの「値」はこのタイミングでしか表示されません。必ずコピーしてください。
1-3. API のアクセス許可を追加
- 左メニュー → API のアクセス許可 → アクセス許可の追加
-
自分の組織が使用する API タブ →
Azure SREを検索 -
委任されたアクセス許可 →
Threads.ReadWrite.Allを選択 → アクセス許可の追加 - 「<テナント名> に管理者の同意を与えます」 を必ずクリック ✅
同意を忘れるとカスタムコネクタの接続作成時に権限エラーになります。
1-4. リダイレクト URI は後で追加
カスタムコネクタを作成すると Power Platform 側のリダイレクト URL が確定するため、Step 2-4 で戻ってきて登録します。
Step 2: カスタムコネクタの作成
2-1. Power Apps でカスタムコネクタを作成
- make.powerapps.com → データ → カスタムコネクタ → 新規作成 → OpenAPI ファイルのインポート
- 次項の Swagger を保存してインポート
2-2. Swagger (OpenAPI 2.0) 定義
host の部分は Step 0 で控えた SRE Agent エンドポイントに置き換えてください。
swagger: '2.0'
info:
title: Azure SRE Agent
description: Azure SRE Agent data plane API for Copilot Studio
version: '1.0'
host: {agentName}.{hash}.{region}.azuresre.ai # 実際のエンドポイントに変更
basePath: /api/
schemes:
- https
consumes:
- application/json
produces:
- application/json
paths:
/v1/threads:
post:
summary: Create thread
description: Create a new conversation thread with an initial message
operationId: CreateThread
parameters:
- in: body
name: body
required: true
schema:
type: object
required:
- StartMessage
properties:
StartMessage:
type: object
required:
- Text
properties:
Text:
type: string
description: 最初のメッセージ内容
responses:
'200':
description: OK
schema:
type: object
properties:
id:
type: string
description: threadId
title:
type: string
lastMessage:
type: object
properties:
text:
type: string
author:
type: object
properties:
role:
type: string
displayName:
type: string
get:
summary: List threads
description: List all conversation threads
operationId: ListThreads
responses:
'200':
description: OK
schema:
type: object
/v1/threads/{threadId}:
get:
summary: Get thread
description: Get a thread including the latest message from SRE Agent
operationId: GetThread
parameters:
- in: path
name: threadId
required: true
type: string
responses:
'200':
description: OK
schema:
type: object
properties:
id:
type: string
lastMessage:
type: object
properties:
text:
type: string
author:
type: object
properties:
role:
type: string
displayName:
type: string
azCliExecution:
type: object
properties:
id:
type: string
command:
type: string
status:
type: string
/v1/azCliExecution/{threadId}/{executionId}/action:
post:
summary: Approve execution
description: Approve or reject a pending CLI execution
operationId: ApproveExecution
parameters:
- in: path
name: threadId
required: true
type: string
- in: path
name: executionId
required: true
type: string
- in: body
name: body
required: true
schema:
type: object
properties:
action:
type: string
description: "run = 承認, reject = 却下"
enum: [run, reject]
default: run
x-ms-visibility: internal
user:
type: string
default: agent
x-ms-visibility: internal
ApproveForThread:
type: boolean
default: true
x-ms-visibility: internal
responses:
'200':
description: OK
security:
- oauth2-auth:
- https://azuresre.dev/.default
tags: []
securityDefinitions:
oauth2-auth:
type: oauth2
flow: accessCode
authorizationUrl: https://login.microsoftonline.com/common/oauth2/authorize
tokenUrl: https://login.windows.net/common/oauth2/authorize
scopes:
https://azuresre.dev/.default: https://azuresre.dev/.default
ポイントは 2 つ。
-
StartMessageは必ずネストしたオブジェクト として定義する。トップレベルにTextを置くと400 StartMessage field is requiredになります。 -
ApproveExecutionの body パラメータはx-ms-visibility: internalにしておくと、Copilot Studio 側で毎回入力を求められず、既定値でそのまま呼べます。
2-3. セキュリティタブの設定
| 項目 | 値 |
|---|---|
| 認証タイプ | OAuth 2.0 |
| ID プロバイダー | Azure Active Directory |
| クライアント ID | Step 1 で作成したアプリの アプリケーション (クライアント) ID |
| クライアント シークレット | Step 1-2 で作成した シークレットの値 |
| リソース URL | https://azuresre.dev |
| スコープ | (空欄) |
「リソース URL」は SRE Agent の App ID URI です。ここを間違えるとトークンは取れても API 呼び出しで 401 になります。
2-4. リダイレクト URI を Azure AD に登録
- セキュリティタブの下部に表示された 「リダイレクト URL」 をコピー
- 例:
https://global.consent.azure-apim.net/redirect/azuresreconnector1-xxx
- 例:
- Azure Portal → 対象のアプリ登録 → 認証 → プラットフォームを追加 → Web
- コピーした URL を貼り付けて 保存
2-5. コネクタを保存してテスト
- 「コネクタの作成」 をクリック
- テスト タブ → 新しい接続 → サインイン
-
ListThreadsを実行して 200 OK が返ることを確認
ここで 401 が返る場合は、Step 1-3 の管理者同意 or Step 2-3 のリソース URL を再確認します。
Step 3: Copilot Studio でエージェントを作成
3-1. 新規エージェント作成
- copilotstudio.microsoft.com
- 作成 → 新しいエージェント
- 名前:
SRE Agent アシスタント(任意)
3-2. Instructions(指示文)
エージェントの振る舞いをここで定義します。SRE Agent は非同期に応答するため、「作成 → 少し待って取得」 のポーリングを含めるのがポイントです。
## 役割
あなたは Azure SRE Agent のフロントエンドアシスタントです。
ユーザーから Azure インフラに関する質問を受け取り、SRE Agent API を通じて回答を取得して返します。
## 会話の流れ
1. ユーザーから質問を受け取る
2. CreateThread アクションを呼び出す
- StartMessage.Text にユーザーの質問をそのまま渡す
- レスポンスの id を threadId として保存する
3. 5秒待機後、GetThread アクションを呼び出す
- threadId を渡す
4. GetThread のレスポンスを確認する:
- lastMessage.azCliExecution.status が "Pending" の場合 → 承認フローへ
- lastMessage.author.role が "SREAgent" の場合 → 回答をユーザーに返す
- それ以外の場合 → さらに5秒待機して再度 GetThread を呼ぶ(最大3回)
## 承認が必要な場合の処理
GetThread で lastMessage.azCliExecution.status が "Pending" の場合:
1. 実行されるコマンド(lastMessage.azCliExecution.command)をユーザーに表示する
2. 「このアクションを承認しますか?(はい/いいえ)」と確認する
3. 「はい」の場合:
- ApproveExecution を呼び出す
- threadId: 現在の threadId
- executionId: lastMessage.azCliExecution.id
4. 「いいえ」の場合:
- action を "reject" にして ApproveExecution を呼び出す
5. 承認後、5秒待って GetThread で最終結果を取得してユーザーに返す
## 返答のルール
- SRE Agent の回答(lastMessage.text)をユーザーに返す
- 英語の回答は日本語に翻訳する
- 技術用語・コマンド・リソース名はそのまま使う
- 回答が取得できない場合は「SRE Agent が応答中です。しばらくしてからもう一度お試しください。」と伝える
3-3. ツールを追加
- ツールから
Azure SRE Agentコネクタを選択 - 以下 3 つのアクションを追加:
CreateThreadGetThreadApproveExecution
ツール追加後、指示文はテキストだけではなくちゃんとツールとの紐づけも行いましょう。

3-4. Teams に公開
- Copilot Studio → チャンネル → Microsoft Teams → 有効化
- 公開 → 公開
- Teams アプリとして追加して動作確認
4. 動作確認
SRE Agent に話しかけてみるとちゃんと応答することを確認。
SRE Agent の方も見てみると同じような内容のチャットが作成されてました。

付録: HAR を GitHub Copilot に食わせて API 仕様を起こす
公式リファレンスは API reference for Azure SRE Agent - Microsoft Learn にまとまっているのでまずはそちらを参照するのがおすすめです。
ただし、SRE Agent のデータプレーン API は現時点で preview で、公式リファレンスに載っている経路のほかにも Portal UI が内部でだけ使っているエンドポイント がいくつか存在します(承認用の azCliExecution/.../action はまさにその一例です)。ドキュメントに載っていない挙動を再現したい・リクエストボディの正確な形が知りたい、というときに便利なのが ブラウザで実際に UI を操作した通信を HAR ファイルで記録し、それを GitHub Copilot に解析させる やり方です。
自分で jq を書かなくても、HAR を VS Code に開いて Copilot Chat に投げるだけで、エンドポイント一覧・リクエスト/レスポンススキーマ・Swagger 定義まで一通り出してくれます。
手順
-
Portal で SRE Agent を開いた状態で DevTools を起動
- Edge / Chrome で
F12→ Network タブ - 「Preserve log」にチェック(ページ遷移で消えないように)
- フィルタに
azuresre.aiと入れて自エージェント宛の通信だけに絞る
- Edge / Chrome で
-
調べたい操作を UI 上で実行
- 例: 「新規スレッド作成」→「メッセージ送信」→「承認ボタンを押す」を一連で実施
-
通信を HAR で保存
- Network タブを右クリック → Save all as HAR with content
-
HAR から Bearer トークンを消しておく (推奨)
-
HAR には
Authorization: Bearer ...が生で入るので、Copilot に渡す前・共有前に置換しておくと安心です。(Get-Content .\azuresre.har -Raw) ` -replace '"Bearer [^"]+"', '"Bearer REDACTED"' | Set-Content .\azuresre.redacted.har
-
-
VS Code で HAR を開いて Copilot Chat に投げる
-
#file:azuresre.redacted.harとして添付するだけで OK
-
Copilot への聞き方(コピペで使えるプロンプト)
まずはエンドポイントを俯瞰したいとき:
#file:azuresre.redacted.har
この HAR に含まれる azuresre.ai 宛のリクエストだけを対象に、
- HTTP メソッド
- パス (クエリパラメータは除く)
- リクエストボディの JSON スキーマ (簡易でよい)
- レスポンスの主要フィールド
を、ユニークなエンドポイント単位でまとめた表を作ってください。
似た経路 (例えば threadId が違うだけのもの) は 1 行に集約し、
可変部分は `{threadId}` のようにプレースホルダ化してください。
特定の操作 (例: 承認ボタン) だけ深掘りしたいとき:
#file:azuresre.redacted.har
「承認ボタンを押した」ときに発生している一連の API 呼び出しを時系列で並べ、
それぞれ次の観点で説明してください:
- どの UI アクションに対応するか (推測でよい)
- リクエストボディの必須フィールド
- レスポンス status / body の見どころ
- Copilot Studio カスタムコネクタから呼ぶ場合の Swagger operation 定義
そのまま Swagger を生成させたいとき:
#file:azuresre.redacted.har
この HAR から抽出できるエンドポイントを元に、Copilot Studio カスタムコネクタに
インポートできる Swagger 2.0 (OpenAPI 2.0) 定義を生成してください。
制約:
- host は {agentName}.{hash}.{region}.azuresre.ai をプレースホルダで残す
- basePath は /api/
- securityDefinitions は OAuth2 (accessCode), resource = https://azuresre.dev
- パスパラメータ (threadId など) は path parameter として定義
- リクエストボディは HAR の実データから型を推論
- 各 operation に operationId と日本語 summary を付ける
生成された Swagger をそのまま Step 2-2 のインポートに使えば、コネクタが数分で出来上がります。実際、本記事の Swagger も UI 操作の HAR を Copilot に解析させて叩き台を作り、手で微修正したものです。
発展編: Webhook 経由で Teams チャネルに通知する
Copilot Studio 経由の「ユーザーが話しかけて回答をもらう」パターンとは別に、SRE Agent 側から自発的に Teams チャネルへ通知させたい ケースもあります。たとえば「夜間バッチで検知した異常を、SRE Agent に要約させて当番チャネルに投げる」ようなユースケースです。
これは Power Automate の以下のようなフローで実現できます。
構成はシンプルに 3 ステップです。
| # | アクション | 役割 |
|---|---|---|
| 1 | 手動トリガー (HTTP 要求の受信時) | Azure Monitor のアラートから Webhook で叩かれるエンドポイント |
| 2 | プロンプトを実行する (AI Builder) | 受け取ったペイロードを GPT で要約・整形 |
| 3 | チャットやチャネルにカードを投稿する (Teams) | Adaptive Card として指定チャネルに投稿 |
1. トリガー: HTTP 要求の受信時
Power Automate で 「HTTP 要求の受信時」 トリガーを選び、JSON スキーマを次のように定義します。SRE Agent の GetThread レスポンスをそのまま流し込むイメージです。
{
"type": "object",
"properties": {
"threadId": { "type": "string" },
"title": { "type": "string" },
"summary": { "type": "string" },
"severity": { "type": "string" },
"resourceId": { "type": "string" }
}
}
保存すると Webhook URL が生成されるので、それを叩けばフローが起動します。
curl -X POST "https://prod-xx.japaneast.logic.azure.com/workflows/.../triggers/manual/paths/invoke?..." \
-H "Content-Type: application/json" \
-d '{
"threadId": "abc123",
"title": "CPU 使用率が閾値超過",
"summary": "vm-prod-01 の CPU が 95% を継続。過去1時間の傾向から...",
"severity": "High",
"resourceId": "/subscriptions/.../virtualMachines/vm-prod-01"
}'
2. プロンプトを実行する(AI Builder)
生の SRE Agent 出力は英語だったり冗長だったりするので、Teams に流す前に整形します。AI Builder の 「プロンプトを実行する」 アクションで以下のようなプロンプトを組みます。
次のインシデント情報を、Teams に投稿するための日本語メッセージに要約してください。
# 入力
- タイトル: @{triggerBody()?['title']}
- 重要度: @{triggerBody()?['severity']}
- 概要: @{triggerBody()?['summary']}
- リソース: @{triggerBody()?['resourceId']}
# 出力ルール
- 冒頭に絵文字なしで【重要度】を付ける
- 3行以内で状況が分かる要約にする
- 最後に「担当者は Teams からエージェントに詳細を確認してください」と添える
出力を後続ステップで outputs('プロンプトを実行する')?['body/responseV2/predictionOutput/text'] として参照します。
3. チャットやチャネルにカードを投稿する
Teams コネクタの 「チャットやチャネルにカードを投稿する」 アクションを追加し、Adaptive Card として投稿します。
-
投稿者:
フロー ボット(ユーザーに紐付かない Bot として投稿) -
投稿先:
Channel - Team / Channel: 通知したい Teams / チャネル
- アダプティブ カード: 下記 JSON
{
"type": "AdaptiveCard",
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"version": "1.4",
"body": [
{
"type": "TextBlock",
"size": "Medium",
"weight": "Bolder",
"text": "@{triggerBody()?['title']}"
},
{
"type": "TextBlock",
"wrap": true,
"text": "@{outputs('プロンプトを実行する')?['body/responseV2/predictionOutput/text']}"
},
{
"type": "FactSet",
"facts": [
{ "title": "Severity", "value": "@{triggerBody()?['severity']}" },
{ "title": "Resource", "value": "@{triggerBody()?['resourceId']}" },
{ "title": "ThreadId", "value": "@{triggerBody()?['threadId']}" }
]
}
],
"actions": [
{
"type": "Action.OpenUrl",
"title": "SRE Agent で続きを見る",
"url": "https://portal.azure.com/#@/resource/.../agents/{agentName}"
}
]
}
ThreadId を Card に載せておくと、Teams で通知を見た担当者が Copilot Studio エージェントに「threadId xxx の続きを見せて」と話しかけて、そのままインタラクティブな調査に移行できます。
動作イメージ
以下の形で Copilot Studio のエージェントがアラートを通知してくれるので、調査ボタンを押すと SRE Agent がその内容の調査を行ってくれます。
使い分けのイメージ
| パターン | 起点 | UI | 向いているユースケース |
|---|---|---|---|
| Copilot Studio エージェント | ユーザー発話 | Teams チャット (1:1) | アドホックな調査・質問 |
| Power Automate Webhook | 外部イベント | Teams チャネル (Adaptive Card) | 自動検知結果のプッシュ通知 |
両方を組み合わせて、「Webhook でチャネルに一次通知 → 担当者が Copilot Studio エージェントで深掘り」 という運用にすると、ThreadId を軸に会話がつながって便利です。
ハマりどころ (トラブルシューティング)
自分が実際にハマったやつをまとめておきます。
| エラー | 原因 | 対処 |
|---|---|---|
AADSTS50011: redirect URI mismatch |
リダイレクト URI 未登録 | Azure AD アプリの「認証」にコネクタの URL を追加 |
| サインイン後に接続が表示されない | クライアントシークレットの期限切れ | 新しいシークレットを作成しコネクタを更新 |
400 StartMessage field is required |
リクエストボディの形式が違う |
{"StartMessage": {"Text": "..."}} のネスト構造を使う |
400 request field is required |
ボディが正しくネストされていない |
StartMessage をトップレベルに置かない |
405 Method Not Allowed |
パスパラメータが空 |
threadId / executionId 変数をセットし直す |
| カスタムコネクタのアクションが古い | キャッシュ | 接続を削除して再作成、または別名でコネクタを作り直す |
まとめ
Azure SRE Agent の Data Plane API を Copilot Studio カスタムコネクタでラップすることで、Teams のチャット UI 上に SRE Agent の会話体験を持ち込む ことができました。さらに Power Automate + Webhook を組み合わせれば、外部イベントを起点に Teams チャネルへ Adaptive Card で通知する使い方もできます。
SRE Agent 単体でも十分使いやすいですが、UI を統一したいとか標準の UI 以外から使わせたいといった要件があった場合は利用できるユースケースになるかと思いました。
参考リンク
- API reference for Azure SRE Agent - Microsoft Learn — 本記事の一次情報。データプレーン / コントロールプレーンのエンドポイント一覧
- Azure SRE Agent ドキュメント
- Copilot Studio ドキュメント
- Power Platform カスタムコネクタ
- HAR (HTTP Archive) 形式 - MDN
- Google HAR Analyzer — HAR をブラウザ上で解析するオンラインツール



