vscode + M365 Agent Toolkitで作るTeams ChatBotアプリ
- ccf代表
- 5 日前
- 読了時間: 4分
更新日:4 日前
M365 Agent Toolkitを使ったTeams アプリを作ったので、記事にしました。
前提条件
処理のメインとなるJSONファイルをフラット化し、Excel形式に変換する部分は事前に作成済み。
アプリアイコンもAIに機能名とサイズを指定して、作ってもらいました。
vscodeにM365 Agent toolkitプラグインを入れて、アカウントをM365へ紐づける
今回AI Agentの精度を確認するため、原則コードは書いていません。
動作の確認や操作の取り消しなどの一部はコマンド入力は行っているが、基本的にはAgentが実行するコマンドを眺めているだけ。
Azureリソースはリソーするグループのみ、手動で作成し、Bicepを作ってもらい、自動デプロイ。Teamsアプリ用の「アプリ登録」も自動で作成して、App IDやシークレットなどは、初回取得したものの、後で自分で再作成し、Bicep内のパラメータは自分で修正。
App Service内の環境変数にApp IDやシークレットは保存。
セキュリティはあまり意識していませんが、Teamsから送信するため認証部分以下のイメージです。
Teams → Bot Service → あなたのエンドポイント(/api/messages) へ送る HTTP に Bearer JWT (Bot Framework Service 発行) が付与。
server.py の BotFrameworkAdapter.process_activity() が署名 (issuer/audience/serviceUrl) 等を検証。AppId/Secret が一致しない場合 401/“Invalid AppId”。
channel_auth_tenant を指定してシングルテナント トークン検証を強制 (クロステナント拒否)。
Bot が返信や添付 upload を行う際、Bot Framework リソース https://api.botframework.com/.default に対する OAuth2 Client Credentials フロー。
BotFrameworkAdapterSettings(APP_ID, APP_PASSWORD, channel_auth_tenant=TENANT) で秘密 (client_secret) を使い AAD トークン取得。
取得した access_token を Authorization: Bearer で Connector API (reply_to_activity, upload_attachment など) に付与。
Teams の JSON ファイルは application/vnd.microsoft.teams.file.download.info の downloadUrl (短期有効な SAS 風 URL) を匿名 GET で取得。
Graph / SharePoint API を直接呼ぶ形の完全認可処理は未実装 (必要ならユーザー委任 or アプリ権限 + Graph トークン取得を追加)。
upload_attachment を呼び (Bot アクセストークン必須) → 失敗時は自前 temp_store に保存しリンク (PUBLIC_BASE_URL/files/…) を返す。
フォールバックリンクは現状無認証 (秘密情報を含む場合アクセス制御が必要)。
注意事項
確かにコーディング部分はほぼタッチしていませんが、Azureサービスの仕組みや各サービスの相関、特に認証部分で利用する各リソースの関係をきちんと理解していないと、ちょっと厳しい印象です。
最低でもApp Service単体コンテナ化したアプリを作っておくとか、そのアプリとM365認証を組み合わせるとか、そうしたことを事前に検証しておかないと、AIが作ってくれたコードやロジックが完全にブラックボックス化します。
良かったこと
以前はBicepをほぼ手書きをしていましたが、やりたいことが明確であれば、かなりの部分を自動的に作ってくれました。別のお客様PHPアプリケーションをApp Serviceで動かしているんですが、このGithubのレポジトリを読み込ませて、改修作業時の検証環境構築などで利用するBicepを作ってくれると期待しています。
また、Github Actionを使ったCIも実装してくれるので、関数レベルのテストはgithubに上げた際に自動的にチェックしてくれます。
構築までの流れ
初回プロンプト
Sample.pyを参考にして、Teamsから該当アプリへチャット経由でJSONファイルを送ると、自動的にExcelにして返信してくれるアプリを作って。
すると、私が事前に作ったSample.pyを読み取って、以下のように実行をはじめました。
python3 -m venv .venv && source .venv/bin/activate && pip install -r requirements.txt
source .venv/bin/activate && python -c "from bot_app import build_excel_from_json_bytes; print('selftest', len(build_excel_from_json_bytes(b'{\"a\": {\"b\": [\"x\", \"y\"]}}', 'test.json')))"
ローカル環境での動作試験
簡易な動作試験まで実施してくれて、ローカルでの動作確認は終了です。
source .venv/bin/activate && python server.py & pid=$!; sleep 2; echo 'GET /:'; curl -s http://127.0.0.1:3978/; echo; echo 'GET /health:'; curl -s http://127.0.0.1:3978/health; kill $pid
Azureデプロイのプロンプト
Azure上の「json2excel-rg」リソーするグループへデプロイしてほしいです。必要なパラメータ(リソース名)等があれば、教えて下さい。

うーん、優秀
Botアプリの作成
動作のイメージは、Teams(Teamsアプリ)→Botアプリ→App Serviceなので、Botアプリを作ります。
json2excel-botというアプリを作ってください。

ここまでで、延べ60分
最後の微調整
実はここからすごく時間がかかりました。
ただ、作業はシンプルで、TeamsアプリからJSONファイルを送って、App Service側のログをチェックし、そのログをAIに食わせて、解析した結果を自動的にソース適用してくれるので、再デプロイを繰り返します。

最後は、想定通りに・・・

コメント