Copilot Studioでは、エージェントから外部の公開APIを呼び出すことができます。これにより、社内ナレッジソースだけでは対応できないリアルタイムな情報をエージェントの回答に組み込むことが可能になります。
本記事では、デジタル庁が提供するe-Gov法令API v2をCopilot Studioに連携し、条文検索の質問に回答するエージェントの構築手順を、OpenAPI仕様書の作成からエージェントへのツール追加まで含めて解説します。
概要
本記事では、Copilot StudioのREST APIツール機能を使用して、e-Gov法令API v2の法令本文取得エンドポイントをエージェントから呼び出す仕組みを構築します。
具体的には、e-Govが公開しているOpenAPI v3 YAML形式の仕様書から法令本文取得エンドポイントを抜粋してSwagger 2.0 JSONに変換し、Copilot StudioのREST APIツールとしてアップロードします。その後、作成したツールをエージェントに追加し、入力パラメータの設定とエージェント指示文の調整を行うことで、「法令ID 417AC0000000086の第1条を教えて」といった条文検索の質問に対して、e-Gov法令APIから取得した条文をもとに回答するエージェントを作成します。
使用するAPI
e-Gov法令API v2は、デジタル庁が提供する日本の法令データ取得APIです。
法令IDや法令番号、法令履歴IDなどを指定して条文本文をJSON、またはXML形式で取得できます。認証は不要で、https経由で利用可能です。今回の例で利用するエンドポイントは以下の1つです。
| エンドポイント | 用途 |
|---|---|
/law_data/{law_id_or_num_or_revision_id} |
法令本文の取得 (条文単位の抽出も可能) |
実装手順
OpenAPI仕様書の準備
Copilot StudioのREST APIツールは、OpenAPI 2.0のJSON形式の仕様書のみを受け付けます。e-Gov法令APIは公式にOpenAPI v3 YAML形式の仕様書を公開していますが、Copilot StudioはOpenAPI v3には対応していないため、仕様書を新規に作成する必要があります。本記事では、例として法令本文取得エンドポイントのみを含む仕様書をSwagger 2.0 JSON形式で新規に作成しました。
なお、e-Gov法令APIから返却されるレスポンスには法令の本文などが含まれるためサイズが大きく、エージェントのトークン上限を超えOpenAIModelTokenLimitエラーになる可能性があります。そのため、本仕様書ではjson_formatやresponse_format等の固定値で問題ないパラメータにはx-ms-visibility: internalを指定してレスポンスサイズを抑える設定を既定で適用するようにしています。詳細は後述の「入力パラメータの追加」で改めて説明します。
今回用意した仕様書は以下の通りです。
仕様書全文を見る
{ "swagger": "2.0", "info": { "title": "e-Gov_LawDataAPI", "description": "e-Gov法令検索(デジタル庁)が提供する公開APIです。指定された法令の本文(条文)を取得します。", "version": "2.1.139", "contact": { "name": "e-Gov法令検索(デジタル庁)", "url": "https://laws.e-gov.go.jp/" } }, "host": "laws.e-gov.go.jp", "basePath": "/api/2", "schemes": [ "https" ], "produces": [ "application/json" ], "paths": { "/law_data/{law_id_or_num_or_revision_id}": { "get": { "summary": "法令本文取得", "operationId": "EgovGetLawFullText", "x-ms-summary": "法令本文を取得する", "description": "指定された法令ID、法令番号、又は法令履歴IDの本文を取得します。", "parameters": [ { "name": "law_id_or_num_or_revision_id", "in": "path", "description": "法令ID、法令番号、又は法令履歴ID。例: 417AC0000000086、平成十七年法律第八十六号。", "required": true, "type": "string", "x-ms-summary": "法令ID/番号/履歴ID", "x-ms-visibility": "important", "x-ms-url-encoding": "single" }, { "name": "elm", "in": "query", "description": "取得対象の要素。例: MainProvision-Article[1] は本則第1条。", "required": false, "type": "string", "x-ms-summary": "取得要素(条項絞り込み・強く推奨)", "x-ms-visibility": "important" }, { "name": "asof", "in": "query", "description": "取得時点(YYYY-MM-DD)。", "required": false, "type": "string", "format": "date", "x-ms-summary": "法令の時点", "x-ms-visibility": "advanced" }, { "name": "json_format", "in": "query", "description": "law_full_textのJSON形式。Copilot Studioではトークンエラーを避けるため軽量なlightを固定で使用します。", "required": true, "type": "string", "enum": [ "light" ], "default": "light", "x-ms-summary": "JSON形式", "x-ms-visibility": "internal" }, { "name": "omit_amendment_suppl_provision", "in": "query", "description": "改正法令の附則を省略します。Copilot Studioではトークンエラーを避けるためtrueを固定で使用します。", "required": true, "type": "boolean", "default": true, "x-ms-summary": "改正法令の附則を省略(true推奨)", "x-ms-visibility": "internal" }, { "name": "response_format", "in": "query", "description": "レスポンス形式。Copilot Studioではトークンエラーを避けるためjsonを固定で使用します。", "required": true, "type": "string", "enum": [ "json" ], "default": "json", "x-ms-summary": "レスポンス形式", "x-ms-visibility": "internal" }, { "name": "law_full_text_format", "in": "query", "description": "法令本文形式。Copilot Studioではトークンエラーを避けるためjsonを固定で使用します。", "required": true, "type": "string", "enum": [ "json" ], "default": "json", "x-ms-summary": "本文形式", "x-ms-visibility": "internal" } ], "responses": { "200": { "description": "法令本文の取得に成功しました。law_full_textに法令の構造化本文が、revision_info.law_revision_idに該当リビジョンの履歴IDが含まれます。", "schema": { "$ref": "#/definitions/LawDataResponse" } }, "400": { "description": "クライアントエラー。よくある原因:法令ID/番号/履歴IDが不正、法令名('会社法'等)を直接渡している", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "500": { "description": "e-Govサーバ内部エラー(本文サイズが大きすぎる場合も含む)。", "schema": { "$ref": "#/definitions/ErrorResponse" } } } } } }, "definitions": { "LawDataResponse": { "type": "object", "description": "法令本文取得APIの正常応答。", "properties": { "law_info": { "$ref": "#/definitions/LawInfo" }, "revision_info": { "$ref": "#/definitions/RevisionInfo" }, "law_full_text": { "type": "object", "x-ms-summary": "法令本文JSON", "description": "法令本文の構造化JSON。tag、attr、childrenを含む階層構造です。", "additionalProperties": true } } }, "LawInfo": { "type": "object", "description": "法令の基本情報。改正履歴に依存しない、法令そのものの属性です。", "properties": { "law_id": { "type": "string", "description": "法令ID(15文字程度の英数字、一意の識別子)。", "example": "417AC0000000086", "x-ms-summary": "law_id" }, "law_type": { "type": "string", "description": "法令種別(Constitution / Act / CabinetOrder / ImperialOrder / MinisterialOrdinance / Rule / Misc)。", "example": "Act", "x-ms-summary": "law_type" }, "law_num": { "type": "string", "description": "法令番号。", "example": "平成十七年法律第八十六号", "x-ms-summary": "law_num" }, "law_num_era": { "type": "string", "description": "法令番号の元号(Meiji/Taisho/Showa/Heisei/Reiwa)。", "example": "Heisei", "x-ms-summary": "law_num_era" }, "law_num_year": { "type": "integer", "description": "法令番号の年。", "example": 17, "x-ms-summary": "law_num_year" }, "law_num_type": { "type": "string", "description": "法令番号の種別。", "example": "Act", "x-ms-summary": "law_num_type" }, "law_num_num": { "type": "string", "description": "法令番号の号数。", "example": "086", "x-ms-summary": "law_num_num" }, "promulgation_date": { "type": "string", "format": "date", "description": "公布日(YYYY-MM-DD)。", "example": "2005-07-26", "x-ms-summary": "promulgation_date" } } }, "RevisionInfo": { "type": "object", "description": "取得した法令本文に対応する改正履歴情報。law_revision_idは特定時点の法令本文を取得する際に使用できます。", "properties": { "law_revision_id": { "type": "string", "description": "法令履歴ID。特定のリビジョンを一意に識別します。この値を法令本文取得APIのパスに渡すと、そのリビジョン時点の本文を取得できます。", "example": "417AC0000000086_20240401_506AC0000000023", "x-ms-summary": "law_revision_id" }, "law_type": { "type": "string", "description": "法令種別。", "x-ms-summary": "law_type" }, "law_title": { "type": "string", "description": "法令名(その改正時点)。ユーザーへの表示にはこの値を使用。", "example": "会社法", "x-ms-summary": "law_title" }, "law_title_kana": { "type": "string", "description": "法令名読み(ひらがな)。", "x-ms-summary": "law_title_kana" }, "abbrev": { "type": "string", "description": "法令略称(カンマ区切り)。", "x-ms-summary": "abbrev" }, "category": { "type": "string", "description": "事項別分類名。", "x-ms-summary": "category" }, "updated": { "type": "string", "description": "データ更新日時(ISO8601)。", "x-ms-summary": "updated" }, "amendment_promulgate_date": { "type": "string", "format": "date", "description": "改正法令の公布日。", "x-ms-summary": "amendment_promulgate_date" }, "amendment_enforcement_date": { "type": "string", "format": "date", "description": "改正法令の施行日。", "x-ms-summary": "amendment_enforcement_date" }, "amendment_enforcement_comment": { "type": "string", "description": "施行に関する注記。", "x-ms-summary": "amendment_enforcement_comment" }, "amendment_scheduled_enforcement_date": { "type": "string", "format": "date", "description": "改正法令の施行予定日。", "x-ms-summary": "amendment_scheduled_enforcement_date" }, "amendment_law_id": { "type": "string", "description": "改正法令の法令ID。", "x-ms-summary": "amendment_law_id" }, "amendment_law_title": { "type": "string", "description": "改正法令の法令名。", "x-ms-summary": "amendment_law_title" }, "amendment_law_title_kana": { "type": "string", "description": "改正法令の法令名読み。", "x-ms-summary": "amendment_law_title_kana" }, "amendment_law_num": { "type": "string", "description": "改正法令の法令番号。", "x-ms-summary": "amendment_law_num" }, "amendment_type": { "type": "string", "description": "改正種別。1=新規制定/被改正、3=被改正、8=廃止。", "x-ms-summary": "amendment_type" }, "repeal_status": { "type": "string", "description": "廃止等の状態。", "x-ms-summary": "repeal_status" }, "repeal_date": { "type": "string", "format": "date", "description": "廃止日。", "x-ms-summary": "repeal_date" }, "remain_in_force": { "type": "boolean", "description": "廃止後も効力を有するかどうか。", "x-ms-summary": "remain_in_force" }, "mission": { "type": "string", "description": "改正区分(New / Partial)。", "x-ms-summary": "mission" }, "current_revision_status": { "type": "string", "description": "履歴の状態。", "x-ms-summary": "current_revision_status" } } }, "ErrorResponse": { "type": "object", "description": "APIエラー時のレスポンス本体。", "properties": { "code": { "type": "string", "description": "エラーコード。", "x-ms-summary": "code" }, "message": { "type": "string", "description": "人間可読のエラーメッセージ。", "x-ms-summary": "message" } } } } }
エンドポイントのdescriptionには、エージェントがどのような状況でこのツールを呼び出すべきかを明記します。エージェントは、この説明文を読み取ってツール呼び出しの可否を判断するため、適切な説明を書くことが重要です。
REST APIツールの作成
Copilot Studioの[ツール]タブから[ツールを追加する] > [REST API]を選択します。

[仕様をアップロードする]ステップで、先の手順で準備したREST API仕様書(JSON)をアップロードし、[次へ]を選択します。

[APIプラグインの詳細]ステップでプラグインの詳細を確認します。各項目の値は仕様書から自動入力されます。今回の例では以下の値が設定されています。
| 設定項目 | 値 |
|---|---|
| ツールの名前 | e-Gov_LawDataAPI |
| 説明 | e-Gov法令検索(デジタル庁)が提供する公開APIです。指定された法令の本文(条文)を取得します。 |
| ソリューション | - (任意) |

次に[認証]の設定画面に移ります。e-Gov APIは認証不要であるため[なし]のまま[次へ]を選択します。

[ツールを選択する]ステップで「法令本文取得」を選択します。

[次へ]を選択します。

続く[ツールのパラメータを確認する]ステップと[レビュー]ステップでは、それぞれ仕様書から自動入力された内容を確認し、[次へ]で進めます。

最後に[公開]ステップで[接続の作成]を選択してツールの作成が完了します。

エージェントへのツール追加
ツールの作成完了後、エージェントに明示的に追加する必要があります。エージェントの[ツール]タブから、作成されたe-Gov_LawDataAPIが一覧に表示されていることを確認し、選択します。表示されない場合はブラウザをリロードしてください。

[未接続] > [新しい接続を作成する]を選択します。

接続の作成完了後、[追加と構成]を選択します。

以上の手順でエージェントへのREST APIツール追加が完了しました。
入力パラメータの追加
追加が完了するとAPIツールの詳細画面へ遷移します。ここで、トークン消費を抑えるための入力パラメータを追加します。
[入力] > [入力を追加する] > [取得要素(条項絞り込み・強く推奨)]を選択し、[保存]を選択します。

e-Gov APIから返される法令本文はサイズが大きいため、法令ID単位で取得するとCopilot Studioエージェントが扱えるトークン上限を超えてOpenAIModelTokenLimitエラーが発生する可能性があります。
今回追加した取得要素(仕様書上のelmクエリパラメータ)は、AIに対象の条文要素を指定させるためのパラメータで、これを追加することでIDで指定された条文部分のみを抽出して取得できるようになり、結果としてトークンエラーを回避することができます。
以上でツールのパラメータ設定は完了です。
動作確認
エージェントのテストパネルから「法令ID 417AC0000000086の第1条を教えて」と質問します。
アクティビティマップを確認すると、APIには入力として法令ID417AC0000000086と取得要素MainProvision-Article[1]が渡されています。また、出力をみると会社法全体ではなく、第1条の構造化データだけを返していることが見て取れます。そしてエージェントは、この出力結果をもとに回答していることが分かります。

まとめ
本記事では、Copilot StudioのREST APIツール機能を使用して、e-Gov法令API v2をエージェントに連携する手順を解説しました。MCPサーバーを自作することなく、OpenAPI仕様書のアップロードのみで外部API連携を実現できる点がポイントです。
REST APIツールはプレビュー機能を含むため、今後の仕様変更には注意が必要ですが、Copilot Studioを業務システムや公開APIと連携させる強力な手段となります。
本記事が、Copilot Studioで外部API連携を検討されている方の参考になれば幸いです。