Copilot Studioは、AIエージェントを簡単に構築できる製品です。単純なチャットボットを構築することももちろんですが、より自律的判断を伴うタスクを実行することも可能です。
今回は、Copilot Studioを利用した自律的判断を伴うエージェントの例として、チャットに入力したSharePointファイルURLを処理するチャットボットを実装します。
おことわり
今回の記事では、以下の内容に触れながらエージェントを構築します。それぞれの機能を利用したことがある方を想定して執筆しているため、各機能に対する細かい説明は割愛させていただきます。
- Copilot Studioでのトピックの作成
- Copilot Studioでのコネクタの追加
- Copilot Studioでのエージェントフローの作成
- SharePoint APIによるSharePointリソースの操作
今回作成するエージェント
Microsoft 365 Copilot Chat等を利用すると、チャットに入力したファイルのURLの中身を取得して、検索や要約等のタスクを実行してくれます。
Copilot Studioで作成したエージェントでも同じような動作が出来ないかどうか、検証してみようと思います。

なお、今回は、SharePointに配置されたファイルのURLを処理できるように実装を行います。
※ OneDriveに配置されたファイルのURLを処理したい場合、今回の手順とは異なるコネクタを利用する必要があるため注意が必要です。
作成直後のエージェントの動作
まずは、エージェントを作成し、エージェント名のみを変更した状態のCopilot Studioのエージェントが、どのような動作をするか確認してみます。
事前準備
エージェントの動作を確認するための事前準備を行います。
エージェントの作成
Copilot Studioでエージェントを作成します。エージェント名に任意の値を設定します。

テストデータの準備
エージェントの動作確認を行うためのテストデータを用意します。今回は、以下のようなテストデータをPDFで用意し、SharePointのドキュメントライブラリ上に配置します。

エージェントの動作確認
エージェントに対してチャットから以下の指示を与えた際の動作を確認します。結果として、チャットに入力したURLからファイルの情報を取得し、ファイルの内容に対する要約を行うことを期待します。
以下のファイルを要約してください。
{SharePointからコピーしたファイルのURL}
SharePointに配置されたファイルのURLをコピーします。

コピーしたファイルのURLと、ファイルに対する指示をチャットから与えました。しかし、期待したように添付したURLからファイルの情報は取得できず、ファイルに対する処理はされませんでした。

ファイルのURLを処理する機能の実装
チャットにSharePointのファイルURLが入力されていた場合に対応するには、エージェントがSharePointのファイルURLを処理するための機能を実装する必要があります。
ここからは、エージェントがファイルのURLを処理するために利用可能な機能を実装をしていきます。
トピックの作成
今回は、トピックを新しく作成し、そこからツールを追加して実装します。
トピックを作成し、トリガーにトピックに対する説明を記載します。エージェントは、説明を参照して呼び出すべきツールを判断します。

次に、[詳細] - [トピックの詳細]からトピックの入力と出力を設定します。

入力として、以下の2つを設定します。エージェントが入力すべき内容を判断できるよう、適切な説明を記載することが重要です。
SharePointFileUrl:ユーザーがチャットに入力したSharePointのファイルURLを入力する項目

UserInstruction:ユーザーがチャットに入力した指示を入力する項目

出力として、以下を設定します。
- Result:入力されたSharePointのファイルURLとユーザーの指示による処理結果を出力する項目

- Result:入力されたSharePointのファイルURLとユーザーの指示による処理結果を出力する項目
コネクタの追加
SharePointのファイルを取得するために、コネクタを追加します。
新しいノードを追加し、[ツールを追加する] - SharePointの[パスによるファイル コンテンツの取得]をクリックします。このコネクタを利用して、SharePoint上のファイルを取得します。

追加したコネクタの入力を確認すると、SharePointサイトのURLと、ファイルの相対パスが必要になります。後ほど設定するため、一旦このままにします。

エージェントフローの実装
コネクタの入力として必要になる、以下の情報を取得するエージェントフローを実装します。
- SharePointサイトのURL
- ファイルの相対パス
SharePointからコピーしたファイルURLは共有URLの形式となっているため、共有URLを解析して上記の情報を取り出す必要があります。共有URLから情報を取得するためにMicrosoft GraphのAPIが提供されていますので、今回はこちらを利用して実装します。 learn.microsoft.com
エージェントフローの作成
- トリガーの直後に新しいノードを追加し、[ツールを追加する] - [新しいエージェント フロー]をクリックします。

- エージェントフローの画面に遷移します。

入力の設定
入力として、SharePointのファイルURLを受け取るよう追加します。

SharePointのファイルURLをエンコード
[変数を初期化する]アクションを追加します。Microsoft公式ドキュメントの内容を参考に、入力で受け取ったSharePointのファイルURLをbase64にエンコードします。

concat(
'u!',
replace(
replace(
replace(base64(triggerBody()?['text']), '=', ''),
'/',
'_'
),
'+',
'-'
)
)
driveItemリソースからデータ取得
[SharePointに HTTP要求を送信します]アクションを追加し、以下の通り設定します。
- サイトのアドレス:テナントのルートサイト
- 方法:GET
- URI:_api/v2.0/shares/{base64にエンコードしたSharePointのファイルURL}/driveItem
- ヘッダー:
- Accept:application/json
- Content-Type:application/json

sitesリソースからデータ取得
[SharePointに HTTP要求を送信します]アクションを追加し、以下の通り設定します。Microsoft GraphのsitesリソースからSharePointサイトの情報を取得します。
- サイトのアドレス:テナントのルートサイト
- 方法:GET
- URI:_api/v2.0/sites/{driveItemリソースから取得したSharePointサイトのID}
- ヘッダー:
- Accept:application/json
- Content-Type:application/json

body('SharePoint_に_HTTP_要求を送信します_-_driveItemリソースのGET')['parentReference/siteId']
取得したデータの取り出し
[変数を初期化する]アクションを追加し、driveItemリソースから取得したwebUrl(SharePointのファイルURL全体)を変数に格納します。

body('SharePoint_に_HTTP_要求を送信します_-_driveItemリソースのGET')['webUrl'][変数を初期化する]アクションを追加し、sitesリソースから取得したwebUrl(SharePointサイトのURL)を変数に格納します。

body('SharePoint_に_HTTP_要求を送信します_-_sitesリソースのGET')['webUrl'][変数を初期化する]アクションを追加し、SharePointのファイルURL全体とSharePointサイトのURLの差分から、ファイルの相対パスを取得します。

decodeUriComponent( replace( uriPath(variables('fileUrl')), uriPath(variables('siteUrl')), '' ) )
出力の設定
エージェントフローの出力として、変数に格納したSharePointサイトのURLと、ファイルの相対パスを設定します。

エージェントフローの実行結果
エージェントフローをテスト実行した結果は以下の通りです。

エージェントフローの全体像
実装したエージェントフロー全体は以下の通りです。

コネクタの入力設定
コネクタの入力として、エージェントフローの出力を設定します。
Copilot Studioのトピックに戻り、トリガーの直後に新しいノードを追加し、[ツールを追加する]から作成したエージェントフローをクリックします。

エージェントフローの入力として、トピックの入力に設定したSharePointのファイルURLを設定します。

エージェントフローから出力されるSharePointサイトのURLとファイルの相対パスを、それぞれ[パスによるファイル コンテンツの取得(Get file content using path)]コネクタの入力として設定します。

ファイルを処理するプロンプトの設定
コネクタで取得したファイルを、プロンプトの機能を利用して処理します。
新しいノードを追加し、[ツールを追加する] - [新しいプロンプト]をクリックします。

ファイルと、ファイルに対する指示を入力として受け取るようにプロンプトを記述します。

プロンプトの動作を確認するために、任意のサンプルデータを設定します。
ファイル:

ファイルに対する指示:

サンプルデータをテスト実行した結果は以下の通りです。結果が問題なければ、保存してプロンプトを閉じます。

トピックの出力の設定
最後に、プロンプトで処理した結果をトピックの出力変数に格納します。
トピック内に作成したプロンプトが追加されるため、[入力]にトピックの入力として設定したユーザーの指示と、コネクタが出力したファイルを設定します。

新しいノードを追加し、[変数管理] - [変数値を設定する]をクリックします。

[設定する変数]には、トピックの出力として設定した変数を設定し、[設定する値]には、プロンプトの出力からtextを取り出して設定します。

これでトピックの設定は完了です。トピックを保存します。
トピックの全体像
実装したトピック全体は以下の通りです。

エージェントの動作確認
それでは、作成したエージェントの動作を確認します。エージェントに対してチャットから以下の指示を与えます。結果として、チャットに入力したURLからファイルの情報を取得し、ファイルの内容に対する要約を行うことを期待します。
以下のファイルを要約してください。
{SharePointからコピーしたファイルのURL}
SharePointに配置されたファイルのURLをコピーします。

チャットに先ほどコピーしたファイルのURLと、ファイルに対する指示を入力して送信しましたが、トピックの入力となるユーザーの指示が判断できないようです。追加の情報を求められてしまいました。

エージェントのモデルが、記事執筆時の2026年1月時点で既定のモデルである[GPT-4.1]でしたので、モデルを[GPT-5 Reasoning]に変更することで動作に違いが出るか見てみようと思います。

同じ内容でチャットで送信したところ、ファイルに対する指示も適切にくみ取り、トピックを実行することが出来ました。ファイルの内容に対する要約を、結果として出力しています。

なお、今回はエージェントには指示を全く与えない状態で実行しました。この状態でも、ユーザーの入力とトピックの説明から総合的に判断し、適切なツール呼び出しを行ってくれているようです。

おわりに
今回は、Copilot Studioを利用して、より自律的な動作を行うエージェントを構築しました。エージェントが自律的な判断を行えることで、よりAIの活用アイデアが広がると思います。
エージェントに対する指示、ツールへの説明、モデルの選択など、検討事項は多く実装難易度も高いですが、ぜひ今回の記事を参考に、自律的な動作を伴うエージェントの実装に取り組んでいただけますと幸いです。