AIクイックスタート
このウォークスルーは、空のフォルダから顧客がサインインして自分のサポートケースに取り組むためのポータルへと導きます。手書きではなくAIコーディングエージェントに依頼することでです。各ステップには貼り付けるプロンプト、エージェントが何をするか、次に進む前に何を確認すべきかが示されます。この例はDynamics 365 Customer Serviceに付属している ケース テーブル(incident)を使っています。自分専用のテーブルがあれば、すべてのプロンプトは同じように動作します。
始める前に
- .NET 10のSDKと、Reactテンプレートを選べばNode.js。
- あなたがシステム管理者であるDataverse環境。このウォークスルーでは開発環境またはサンドボックス環境を使用してください。
- その環境のEntraテナントで アプリ登録を作成する 許可。
- ポータルのメールアドレス(登録確認やパスワードリセット)と、Exchange Online内の共有メールボックス(ライセンス不要)を用意します。アドレスの承認にはOffice 365グローバル管理者またはExchange Administratorが必要です。
- MCPをサポートするAIコーディングエージェントです。以下のコマンドはClaude Code用です。MCPサーバーのページにはVisual Studio、VS Code、カーソルの設定が記載されています。
仕組み
エージェントがこれを正しくできるのは、単に現実的なだけでなく、2つの要素です。Power Portals Pro MCPサーバーは、実際のDataverse環境を読み取り、ポータルが必要とする設定変更を行います。もうひとつは、生成されたプロジェクトごとにエージェントに提供される指示です。
- すべての変更はまずあなたに尋ねます。 アプリ登録の前に、アプリケーションユーザーやセキュリティロールが作成され、権限が付与され、ソリューションがインストールされる前に、エージェントがこれから起こること――アクション、ターゲット、コスト、効果、そしてそれを元に戻す方法――を示し、あなたは一行のプロンプトで承認または拒否を行います。詳細を読んでください:それがあなたのレビューステップです。
- プロジェクトにはノウハウが備わっています。 生成されたプロジェクトには
AGENTS.mdと3つのスキル(set-up-portal、secure-a-table、add-table-pages)が含まれており、エージェントにどの質問をどの順番で尋ねるべきかを教えます。名前を付ける必要はありません。以下のプロンプトだけでエージェントが適切な質問を選ぶのに十分です。 - プロンプトは出発点に過ぎません。 自分の言葉で表現しても構いません。重要なのは、ポータルが誰のためか、その人がどのデータを見るべきか、そしてそれをどう使うかです。
1. MCPサーバーをインストールする
マシンごとにユーザー スコープで一度ずつインストールし、プロジェクトを作成する予定の空のフォルダも含めてすべてのフォルダで利用可能にします。
claude mcp add --scope user powerportalspro -- dnx PowerPortalsPro.Mcp --yes
dnx .NET 10 SDKに同梱されています。もしエージェントがすでに動いていた場合は再起動し、サーバーがそこにいるかどうか確認してください 。例えば「get_component_apiを使ってMainGridのパラメータをリストアップしてください」といった質問をします。
2. フォルダを作成しサインイン
ポータルが入るフォルダを作成し、その中でサインインします。1回はDataverse環境、もう1回はAzureにサインインします。これはステップ4のアプリ登録が作成される方法です:
mkdir C:\Code\Contoso.Portal
cd C:\Code\Contoso.Portal
dnx PowerPortalsPro.Mcp login --environment https://yourorg.crm.dynamics.com
dnx PowerPortalsPro.Mcp azure login
両方のサインインはこのフォルダに属しており、マシンには属しません。ここに .ppp/mcp.json 書き込み、環境名とテナント名を付け、トークンはユーザープロファイルに保持するため、別のフォルダのプロジェクトが同時に別の顧客を指し示せるようにします。どちらもデバイスコードを使用しているため、スマホで完了できます。アカウントに複数のAzureサブスクリプションが表示されている場合、まだ一つ選ぶ必要はありません。それはデプロイしてからです。その後、このフォルダでエージェントを起動してください。
3. プロジェクトの作成
エージェントに、どのスタックを作っているか、ReactかBlazorか、そして誰がサインインするかを伝えてください。
このフォルダ内にContoso.Portalという新しいPower Portals Proポータルを作成し、Reactテンプレートを使ってください。これはお客様のために、自分のアカウントで登録・サインインするものです。
エージェントはプロジェクトテンプレートが不足している場合をインストールし、リクエストから分からないことを尋ね、 dotnet newを実行します。各顧客はDataverseの 連絡先 となり、プロジェクト Program.csのセキュリティ登録によって何を見るかが決まります。これがテンプレートのデフォルトのセキュリティモデルであり、このウォークスルーの他の部分でも使われています。どちらの積み重ねでも動作します。その後のすべてのプロンプトは同じです。
注記
プロジェクトが存在したら、同じフォルダ内でエージェントを再起動してください。 プロジェクトは独自の
.mcp.jsonを持ち込み、MCPサーバーをパッケージに合致するバージョンにピン留め、スキルやAGENTS.mdも含めて、ほとんどのエージェントはそれらを開始時にしか読みません。エージェントが求めたらプロジェクトのMCPサーバーを承認してください。
4. Dataverseに接続する
新しいプロジェクトはDataverseに届くまでは開始されません。エージェントにその設定を依頼してください:
このポータルを私のDataverse環境に合わせてローカルで動作させてください。アプリケーションユーザーにシステム管理者は与えず、Power Portals Proの役割とテーブル用の独自の役割を使いましょう。ポータルのメールは noreply@contoso.com から送信してください。
エージェントはプロジェクトの set-up-portal スキルを追い、まず check_setup から何が欠けているかを確認します。以下のいずれかを承認することを期待してください:
- マネージドソリューションは Power Portals Proのテーブル、ライセンスチェック、 Power Portals Proアプリケーションユーザー セキュリティの役割です。
- ポータルがDataverseに接続するEntraアプリの登録です。クライアントの秘密はプロジェクトのユーザー秘密に直接入り、会話には一切入りません。
- その登録のためのDataverseアプリケーションユーザー、Power Portals Proアプリケーションユーザーの役割、フレームワークが必要とするカラムセキュリティプロファイル、さらにあなた自身の空のセキュリティロールを担当します。Power Portals Proの役割はフレームワーク自身のテーブルのみをカバーします。テーブルはステップ6で自分の役割に入ります。
- 「Microsoftでサインイン」の2つ目のアプリ登録は 、そのボタンが欲しい場合のみです。自分のアカウントを持つ顧客はそれを必要としません。
- 登録メールとパスワードリセットメールが送信されるメールキューです。エージェントはアドレスを承認し、メールボックスでテスト&イネーブを実行します。あなたに任せることは二つあります。アドレスにはExchange Onlineの共有メールボックスが必要で、ライセンスは不要です。もう一つは承認するにはOffice 365グローバル管理者かExchange Administratorが必要です。どちらかが欠けている場合、エージェントはどちらかを指示します。修正してエージェントに再度ステップを実行するよう依頼してください。
各ステップが完了するごとに、接続設定はプロジェクトのユーザーシークレットに表示されます。エージェントは再度 check_setup を実行し、クリーンになったらプロジェクトを実行してください。F5、またはサーバープロジェクトで dotnet run を実行し、テンプレートのホームページとサンプルページが表示されます。
5. 顧客が何を見るべきかを決める
望む結果をビジネス用語で説明し、エージェントにテーブルを見つけてもらいましょう。何かを書く前に尋ねる価値があります。エージェントは環境を読み取り、実際に何があるか、あなたのカスタムテーブルやカラムも含めて示唆してくれます。
サインインした顧客は、自分が提出したサポートケースを確認し、詳細を確認するためにケースを開き、新しいケースをログアップするべきです。どのテーブルとカラムを使うべきでしょうか?まだ何も変更しないでください。
list_tablesとdescribe_tableのテーブルを調べ、ビューをlist_viewsで読み、ケーステーブル(incident)、顧客に結びつけるルックアップ(customerid)、表示・編集する列を表示します。今すぐそのリストを調整してください。ポータルが何を公開するかを決定します。
6. テーブルを固定する
ポータルは指示された通り表示していないものを表示しません。テーブルが登録されるまでは、そのページは403または空のグリッドを返します。エージェントにテーブルを開けるよう頼みましょう — あなたが意図する範囲だけ:
ケーステーブルのセキュリティ:サインインした顧客は、合意したカラムで自分のケースのみを読み書き、作成し、編集できます。ケースをログする際に優先順位を選びますが、その後は変更できません。アプリケーションユーザーがケースで必要とする権限を、私たち自身のセキュリティロールに付与します。
エージェントはプロジェクトの secure-a-table スキルを使い、アクセス権が誰のものか、どの行のものか、どの操作か、どの列かを確認します。どれもスキップしないでください。回答ごとに公開される内容が変わります。
その後、サーバープロジェクトの Program.csにレジストレーションを書き込みます。この例では、次のようなものを期待してください:
builder.Services.AddTableAccess("incident", t => t
.ForSignedInUsers()
.RowsOwnedByContact("customerid")
.Allow(TableSecurityPermission.Read | TableSecurityPermission.Create | TableSecurityPermission.Write)
.Reading("title", "ticketnumber", "prioritycode", "statuscode", "createdon", "description")
.Writing("title", "description")
.WritingOnCreate("prioritycode"));
RowsOwnedByContact("customerid") すべてのクエリをサインインした連絡先自身のケースに限定し、彼らが作成したケースの顧客に設定します。カラムはオプトイン制で、 Reading に名前が出ていないものは保留され、 Writing のカラムのみが変更可能です。 WritingOnCreate 優先度をカバーします — ケースがログされた時点で設定され、その後は読み取り専用にされます。 セキュリティ はすべてのオプションをカバーします。
アプリケーションユーザー自身の役割
登録によって各顧客が何をするかが決まりますが、ポータルは依然としてアプリケーションユーザーとしてDataverseと通信し、そのユーザーはテーブル上で権限を必要とします。彼らはステップ4からあなた自身のセキュリティ役割に入り、Power Portals Proの役割には決して入りません。エージェント:
- アプリケーションユーザーで
get_application_userであなたのロールを見つけ、ステップ4で作成しなければcreate_security_roleで作成し、assign_application_user_roleに割り当てます。 - 登録に必要な機能を
add_table_privileges_to_roleで付与します:incidentではRead, Create, Write and Append、contactではAppend To。なぜなら、新しいケースはすべて連絡先にリンクされているからです。その後、check_setupを実行し、ページが使うテーブルとコードが登録するテーブルを比較します。
なぜ自分自身の役が必要なのですか?
Power Portals Proの役割はマネージドソリューションに付属します。Dataverseは権限を追加できますが、次のアップグレードで元の形態に戻され、助成金も失われてしまうため、MCPサーバーは管理されたロールに権限を追加しなくなります。自分専用の役割は、後で環境をレビューする人にポータルが到達可能な範囲を正確に示します。
7. ページを追加
テーブルを確保したら、メニューのリストとケースが開くページの両方を一度にリクエストしてください。
メインメニューに「ケース」ページを追加し、サインインした顧客のケースのグリッドが表示され、ケースが開くページは「タイトル、ケース番号、優先度、ステータス」は一つのセクション、説明は別のセクションに設定できます。顧客はタイトルと説明を変更でき、新しいケースをログする時のみ優先順位を設定でき、それ以外は設定できません。
エージェントはプロジェクトの add-table-pages スキルに従います。ルート、 MainGrid付きのリストページ、メニューエントリ、そして新しいケースをログするために空のまま開く RecordContext ページを追加します。プレースホルダーを書く代わりに list_views で実際のビューIDを読み取り、登録が顧客に読めるすべての列を保持します。Dynamicsの標準ビューにはエージェント専用の列が含まれているため、独自のビューも提供されるはずです。登録が省略している列を要求した場合は、静かにアクセスを広げるのではなく、停止して尋ねるべきです。関連レコードはケースページにサブグリッドとして掲載できます。名前を付ければ、そのテーブルも保護されます。
8. 二人の客として試してみる
エージェントは顧客としてサインインできないので、この部分はあなたの担当です。また、最も重要なテストでもあります。登録の目的は、ある顧客が 見えない ものにあります。
- ポータルを実行し、 顧客登録を行ってください。確認メールは、メールキューのメールボックスがステップ4のテスト&有効化をクリアしたときに届きます。
- ケースを開き、新しいケースをログアップし、グリッドから再度開いてください。タイトルを変更して保存します。
- サインアウトし、 2人目の顧客 を登録し、 ケースを開きます。グリッドは空であるべきです:最初の顧客のケースはその人だけのものです。そのケースのアドレスをこのセッションに貼り付けても表示されません。
どちらかの顧客が見てはいけないものを見たら、手で調整しないでください。エージェントに見たことと期待していたことを伝え、再度 secure-a-table を処理させてください。
何かがおかしいと感じたら
- グリッドが空であるか、ページが403を返すかのどちらかです。 エージェントに
check_setupを走らせてください:登録のないページを使っているテーブルがそこに記載されています。そうでなければ、顧客はまだケースを持っていない可能性があります。 - 列は常に空欄です。 登録の
Readingリストには含まれていません。列は意図的に名前が明かされていない限り保留されます。 - すべてのデータリクエストは402を返します。 ライセンスチェックは失敗しました。通常は管理されたソリューションがまだインストールされていないためです。
check_setupはどのソリューションかを明記しています。 - ポータルが起動せず、「一部のコンテンツが利用できません」と表示されます。 Dataverseにサインインできません。ログライン
Could not connect to Dataverse修正すべき設定を指定しており、check_setupも報告します。
次にどこへ行くべきか
- 同じ方法でテーブルを追加します:ステップ5で選び、ステップ6で固定、ステップ7でページを揃えます。
- ポータルロールの顧客によってアクセス権を多く与える場合もあれば、担当者にケースマネージャーのような顧客の会社の全ケースを閲覧できる役割を依頼してください。セキュリティは、ロールがポータル全体の登録にどのように影響するかを説明します。
- デプロイしてください。「このポータルをAzureにデプロイ」はAzureのデプロイメントを開始し、独自のサインインとリソース作成前の価格が表示されます。
- Power Pagesのウェブロールやテーブル権限を好みますか? プロジェクトを
--EnableEnhancedAuthorization trueで作成してください。アクセス権はDataverseのセキュリティロールからProgram.csから得られます — 詳細は Dataverse Securityを参照してください。
