Azure AI Foundry から SharePoint のドキュメントを直接参照させようとしたとき、「Failed to create connection / ValidationError: Invalid credential.」で接続が作れない――ロールも権限も揃っているのになぜか失敗する。この記事では、その原因と実際に接続できるようにするまでの具体的な手順を、/teams と /sites の違いや Entra ID(旧 Azure AD)の設定も含めて詳しく解説します。
Azure AI Foundry の SharePoint 接続で何が起きているのか
Azure AI Foundry(旧 Azure AI Studio)のエージェントに「SharePoint 接続」を追加すると、エージェントは Microsoft 365 Copilot API を通じて SharePoint のコンテンツを取得し、その内容をもとに回答を生成します。公式ドキュメントでは、以下のようなポイントが明示されています。
- SharePoint ツールは プレビュー 機能である
- SharePoint のデータ取得には Microsoft 365 Copilot API を利用する
- 認証は ユーザーの ID をそのまま渡すオンビヘーフ(On-Behalf-Of)方式 で行う(ユーザーごとの権限が尊重される)
- 前提条件として
- 開発者・エンドユーザーともに Microsoft 365 Copilot ライセンス を保有している
- 少なくとも Azure AI User の RBAC ロールを持つ
- 対象 SharePoint サイトへの READ 権限 を持つ
- site_url は
https://tenant.sharepoint.com/teams/<site_name>またはhttps://tenant.sharepoint.com/teams/<site_name>/Shared%20Documents/<folder_name>の形式で指定する
一方、Microsoft Q&A では次のような相談が実際に挙がっています。
- 自分のサイト URL は
.../sites/<site_name>/...なのに、ドキュメントには.../teams/<site_name>/...と書かれている - Global Admin、Azure AI User/Admin、AI Administrator ロールをすべて持っているのに、
Failed to create connection ValidationError: Invalid credential.で接続作成に失敗する
受け入れられた回答では、次の 2 点が決定打になっていました。
- URL のパスが /sites ではなく /teams であること(/sites のままではツールが正しくサイトを認識できない)
- Entra ID で作成した アプリ登録(App ID + シークレット) を SharePoint 接続のキー/値ペアとして登録する
つまり、このエラーは単純な「パスワード間違い」ではなく、URL 形式と認証の前提条件が SharePoint ツール側の仕様とずれているときに発生しがち、ということです。
エラー「ValidationError: Invalid credential」の正体
Invalid credential というメッセージからは、「資格情報(ユーザー名 / パスワード、クライアントシークレットなど)が間違っている」と解釈しがちです。しかし、Azure AI Foundry の SharePoint ツールでは、次のようなケースでも同じエラーが返ることがあります。
- site_url が想定形式(/teams)になっていない、余計なクエリやフラグメントが付いている
- ツール内部で利用する Microsoft 365 Copilot API への認証が、ユーザー ID ではなくアプリ(App Only)トークンになっている
- 接続に渡すキー/値ペア(App ID やシークレット)が不足している / 名前が違う
さらに、Azure Function などからエージェントを呼び出す高度な構成では、次のようなエラーが返ることもあります。
"last_error": {
"code": "tool_user_error",
"message": "Error: sharepoint_tool_user_error; AppOnly OBO tokens not supported by target service."
}
このメッセージが示すように、SharePoint ツール側は アプリ単体(App Only)トークンではなくユーザー トークンを使った On-Behalf-Of フローを期待しており、App Only で突っ込むとエラーになる構造になっています。
つまり「Invalid credential」は、次の 3 つのどれか、もしくは複合パターンと考えるのが実務的です。
| 表面的な症状 | よくある実際の原因 | 対処の方向性 |
|---|---|---|
| 接続作成時に ValidationError: Invalid credential | site_url が /teams/<site_name> 形式ではない(/sites/ のまま・クエリ付き) | /teams で作り直したチームサイトの URL を使い、余計なクエリや /Forms/AllItems.aspx などを削る |
| 同じく Invalid credential | Entra アプリの App ID / シークレットを渡していない、もしくはキー名が誤っている | SharePoint 接続のキー/値ペアに site_url / app_id / secret を追加する |
| tool_user_error: AppOnly OBO tokens not supported… | Function App 等から App Only トークンでエージェントを呼び出している | DefaultAzureCredential + Managed Identity など、ユーザー/マネージド ID ベースで呼び出す |
以降では、最初の 2 つ、特に URL が /sites になっている問題と アプリ登録の不足に焦点を当て、実際に接続を作るところまで順番に見ていきます。
/teams と /sites の違いと、なぜ /teams が必須なのか
SharePoint Online には、サイト URL の「入り口」となる 管理パス(managed path)として /sites と /teams の 2 種類が用意されています。管理者は SharePoint 管理センターの「サイトの作成」設定で、Microsoft 365 グループ接続サイト(= モダン チームサイト)の既定パスとして /sites か /teams のどちらかを選択できます。
https://tenant.sharepoint.com/sites/<site_name>… 一般的なサイト コレクションhttps://tenant.sharepoint.com/teams/<site_name>… 主にチームサイト向けに使われる管理パス
しかし Azure AI Foundry の SharePoint ツールは、現時点のドキュメント上 site_url は /teams パスで始まる URL である必要があると明記されています。
https://microsoft.sharepoint.com/teams/<site_name>
https://microsoft.sharepoint.com/teams/<site_name>/Shared%20Documents/<folder_name>
さらに Microsoft Q&A では、実際に /sites パスを使ったユーザーが上述の「Invalid credential」に悩まされ、回答者から次のように指摘されています。
/siteと/teamsの違いは「かなり重要」であり、接続ツールは/teamsで始まる URL を想定している/sitesのままだとツールが対象サイトを正しく認識できず、その結果として資格情報エラーのように見えている
このユーザーは、SharePoint 管理センターの設定を変更して新しく /teams パスのチームサイトを作成し、その URL を使って接続し直したところ、エラーが解消しています。
/teams 形式のサイトを準備する手順
- SharePoint 管理センターにアクセスし、「設定 > サイトの作成」を開きます。
- 「/sites または /teams の下に Microsoft 365 グループ接続チームサイトを作成」の部分で /teams を選択して保存します。
- SharePoint の「サイトの作成」から「チーム サイト」を新規作成すると、
https://tenant.sharepoint.com/teams/<site_name>形式の URL でサイトが作成されます。 - 標準のドキュメント ライブラリ名は英語表示では Shared Documents(日本語 UI では「ドキュメント」など)ですが、URL では
Shared%20Documentsとして扱われます。
ブラウザの URL から接続用 site_url を切り出す例
よくある失敗パターンは、ブラウザのアドレスバーから URL をそのままコピペしてしまうことです。公式ドキュメントにも「アドレスバーの値をそのまま使うと動作しない」と書かれています。
| ブラウザ上で表示される URL の例 | 接続に設定すべき site_url | ポイント |
|---|---|---|
https://contoso.sharepoint.com/teams/ai-site/Shared%20Documents/Forms/AllItems.aspx?viewid=... | https://contoso.sharepoint.com/teams/ai-site/Shared%20Documents | /Forms/AllItems.aspx やクエリ文字列(?viewid=...)はすべて削る |
https://contoso.sharepoint.com/teams/ai-site/Shared%20Documents/Specs/AI/Forms/AllItems.aspx | https://contoso.sharepoint.com/teams/ai-site/Shared%20Documents/Specs/AI | フォルダーを指定したい場合はフォルダー パスまでを含める |
https://contoso.sharepoint.com/sites/ai-site/Shared%20Documents/... | (不可) 新たに /teams パスのサイトを作成し、その URL を使用する | /sites から /teams に書き換えても動かない。サイトを作り直す必要あり |
まずはここまでを満たさないと、後段の資格情報設定をどれだけ見直しても「Invalid credential」から抜け出せません。
Entra ID アプリ登録で SharePoint アクセス権を設計する
公式ドキュメントは「ユーザー ID ベースの認証」を前提にしていますが、一部のシナリオや検証事例では、Entra ID のアプリ登録 + Microsoft Graph の Application 権限を併用することで接続エラーを解消しています。
特に、Microsoft Q&A で受け入れられた回答では、次のような構成が紹介されています。
- Entra ID でアプリ登録を作成
- このアプリに Microsoft Graph の Sites.Selected(アプリケーション権限)を付与し、管理者同意を実行
- SharePoint 側で Sites.Selected モデルに従い、対象サイトに対してアプリを「読み取り/書き込み許可」する
- Azure AI Foundry の SharePoint 接続ダイアログにて、
site_url/App ID/Secretをキー/値ペアとして登録
ここで注意したいのは、アプリ登録を行う = 完全な App Only 認証に切り替えるという意味ではない点です。SharePoint ツール自体は依然として On-Behalf-Of によるユーザー認証を使っており、App Only トークンを直接渡すと先ほどの AppOnly OBO tokens not supported エラーになります。
アプリ登録と Sites.Selected 権限は、あくまで「どのアプリがどのサイトのデータにアクセスできるか」を制御するための仕組みであり、ユーザーごとのアクセス制御(本人がそのサイトを閲覧できるかどうか)とは別レイヤーです。
アプリ登録の具体的な手順
- Microsoft Entra 管理センターで「アプリ登録 > 新規登録」を開きます。
- 名前を「ai-foundry-sharepoint-connector」など分かりやすいものに設定します。
- サポートされているアカウントの種類は、通常は「この組織ディレクトリ内のアカウントのみ」を選択します。
- 登録後、アプリケーション (クライアント) ID と ディレクトリ (テナント) ID を控えておきます。
- 「API のアクセス許可 > アクセス許可の追加」から
- 「Microsoft Graph」→「アプリケーションのアクセス許可」→
Sites.Selectedを追加
- 「Microsoft Graph」→「アプリケーションのアクセス許可」→
- 「管理者の同意を与える」をクリックし、テナント全体の同意を付与します。
- 「証明書とシークレット」から「新しいクライアント シークレット」を作成し、シークレット値を安全な場所に保管します。
ここまでで、アプリ側の「グローバルな権限枠」は準備できましたが、Sites.Selected ではまだどのサイトにもアクセスできません。各サイトに対してこのアプリのアクセス権を明示的に付与する必要があります。
Sites.Selected で対象サイトにアプリ承認を付与する
Sites.Selected は「このアプリは 選択されたサイトだけ にアクセスできる」という考え方の権限モデルです。そのため、権限を付けただけでは何も見えません。Microsoft Graph や PowerShell を使って、サイトごとにアプリを許可する必要があります。
一般的なフローは次のようになります。
- Graph Explorer やスクリプトで対象サイトの ID を取得
GET https://graph.microsoft.com/v1.0/sites?search=ai-siteなど
- 次のようなイメージで、アプリへの権限付与を実施(擬似コード)
POST https://graph.microsoft.com/v1.0/sites/{site-id}/permissions Content-Type: application/json { "roles": [ "read" ], "grantedToIdentities": [ { "application": { "id": "", "displayName": "ai-foundry-sharepoint-connector" } } ] } - 同じアプリを複数サイトで使いたい場合は、サイトごとに 2. を行う
この時点で、「アプリ + Sites.Selected + サイト単位承認」の三点セットが揃い、アプリとして Graph API から対象サイトのコンテンツを読むことが可能な状態になります。
Azure AI Foundry で SharePoint 接続を作成する
ここまでの準備ができたら、いよいよ Azure AI Foundry 側で SharePoint 接続を作成します。プレビュー版は UI が変わりやすいですが、基本的な流れは次のとおりです。
- Azure AI Foundry ポータル(
ai.azure.com)で対象プロジェクトを開きます。 - 左メニューから「管理センター」→「接続されたリソース(Connected resources)」を開きます。
- 「新しい接続」から SharePoint を選択します。
- 接続名を入力し、値の保管先(Key Vault 等)を選びます。
- キー/値ペアを次のように追加します(実際のキー名は UI に合わせて読み替えてください)。
- site_url:
https://contoso.sharepoint.com/teams/ai-site/Shared%20Documentsなど - app_id(または App ID, client_id):
Entra アプリ登録の アプリケーション (クライアント) ID - secret(または App Secret, client_secret):
クライアント シークレットの値
※ UI 上で「シークレットとしてマーク(is secret)」を必ずオンにします。
- site_url:
- 接続を保存し、「テスト接続」またはエージェントから実際に SharePoint ツールを呼び出して動作確認します。
Microsoft Q&A で報告されたケースでは、/teams 形式のサイトを用意したうえでこの 3 つのキー/値ペアを追加したところ、それまで繰り返し出ていた「ValidationError: Invalid credential」が解消されたとされています。
一方で、公式ドキュメントではこの App ID / シークレットの追加手順はまだ明示されていません。プレビュー機能特有の「仕様が先に進んでいる」「ドキュメントが追いついていない」状態である可能性があるので、本番環境に適用する前に必ず検証用テナントで試すことを強くおすすめします。
Graph Explorer で事前に切り分ける
ここまで設定しても接続に失敗する場合、問題が Azure AI Foundry 側なのか、SharePoint / Graph / Entra 側なのかを切り分ける必要があります。その際に便利なのが Microsoft Graph Explorer です。
- Graph Explorer にアクセスし、Azure AI Foundry で使っているのと同じユーザーでサインインします。
- 次のようなクエリを実行し、HTTP 200 OK が返るか確認します。
GET https://graph.microsoft.com/v1.0/sites/rootGET https://graph.microsoft.com/v1.0/sites?search=ai-siteGET https://graph.microsoft.com/v1.0/sites/{site-id}/drive/root/children
- いずれかが 401 / 403 / 404 になる場合は、
- ユーザーの Microsoft 365 Copilot ライセンスの有無
- 対象 SharePoint サイトへのアクセス権(少なくとも読み取り)
- アプリ登録の権限や Sites.Selected の設定
Graph Explorer で問題なくアクセスできているのに Azure AI Foundry の SharePoint ツールだけがエラーを出す場合は、site_url の形式、あるいは 接続に渡しているキー名・値を再確認するとよいでしょう。
Azure RBAC ロールだけでは解決しない理由
質問者の多くが共通しているのは、「Global Admin や Azure AI User/Admin、AI Administrator など、Azure 側のロールはすべて付与されているのに接続に失敗している」という点です。これには理由があります。
| 権限のレイヤー | 具体例 | SharePoint 接続への影響 |
|---|---|---|
| Azure RBAC | Azure AI User / Azure AI Administrator サブスクリプションの Owner / Contributor など | Azure AI Foundry のプロジェクトや接続を作成・管理できるかどうかに影響。 SharePoint のデータにアクセスできるかどうかとは無関係。 |
| Microsoft 365 / SharePoint | SharePoint サイトの所有者 / メンバー / 閲覧者 Microsoft 365 Copilot ライセンス | ユーザーがそのサイトのコンテンツを閲覧できるかどうか、および Copilot API を利用できるかどうかを決める。 不足しているとツール内部の認証でエラーになる。 |
| Entra ID / Graph アプリ | アプリ登録+Sites.Selected 権限 サイト単位のアプリ承認 | SharePoint ツールやエージェントがバックエンド API にアクセスするときの「アプリとしての許可範囲」を決定。 設定不足だと、ユーザーが見えていてもツールが取得できない。 |
この 3 層がすべて揃ってはじめて、Azure AI Foundry のエージェントは SharePoint の文書を安全かつ正しく扱うことができます。Azure 側のロールだけをどれだけ追加しても、SharePoint 側・Entra 側の設定が足りなければ Invalid credential から抜け出せない、というわけです。
最小チェックリスト:接続前に確認したい 5 項目
ここまでの内容を、「これだけは確認しておきたい」という観点でチェックリストに再整理します。
- 1. site_url が /teams 形式になっているか
https://tenant.sharepoint.com/teams/<site_name>またはhttps://tenant.sharepoint.com/teams/<site_name>/Shared%20Documents/<folder_name>になっているか- アドレスバーからコピーした
/Forms/AllItems.aspxやクエリ文字列は削除したか - URL を /sites → /teams と書き換えているだけということはないか(その場合はサイト自体を /teams で作成し直す必要があります)
- 2. SharePoint ツールの前提条件を満たしているか
- 接続を作ろうとしているユーザーに Microsoft 365 Copilot ライセンスがあるか
- ユーザーが対象サイトに対して少なくとも「閲覧」権限を持っているか
- ユーザーが Azure AI User(またはこれを含むロール)を持ち、プロジェクトにアクセスできるか
- 3. Entra アプリ登録 + Sites.Selected を正しく設定したか
- アプリ登録で Microsoft Graph の
Sites.Selected(アプリケーション権限)を追加し、管理者同意を与えたか - 対象となる SharePoint サイトに対して、Graph API などを使って「アプリへのサイト単位承認」を付与したか
- クライアント シークレットが期限切れになっていないか
- アプリ登録で Microsoft Graph の
- 4. SharePoint 接続のキー/値ペアが揃っているか
site_urlが正しい形式で入力されているかapp_id/client_idにアプリ登録のクライアント ID が入っているかsecret/client_secretにクライアント シークレットが入り、「シークレットとしてマーク」されているか- 文字列の前後に空白が紛れ込んでいないか(クリップボードからの貼り付け時に要注意)
- 5. Graph Explorer で 200 OK が返っているか
- 同じユーザーで
/sites/rootや対象サイトの/drive/root/childrenを取得できるか - Function App などからエージェントを呼び出す場合、App Only トークンではなく、Managed Identity などユーザー前提のトークンで呼び出しているか
- 同じユーザーで
この 5 項目を順に確認していけば、多くの「Invalid credential」問題はどこかで原因が見つかるはずです。
まとめ:/teams サイト + アプリ登録で “Invalid credential” を抜け出す
Azure AI Foundry の SharePoint 接続でハマりやすいポイントは、「/sites のサイトをそのまま使っている」「Entra アプリの権限と接続への渡し方が曖昧」の 2 点にほぼ集約されます。
実際のトラブル事例と公式ドキュメントを突き合わせると、次のように整理できます。
- SharePoint ツールは /teams 形式の URL を前提としており、/sites のままだと接続を正しく認識できない
- ツール内部では Microsoft 365 Copilot API と On-Behalf-Of 認証を用いるため、 ユーザーのライセンス・SharePoint 権限・アプリの Graph 権限の 3 つが揃っている必要がある
- Entra アプリ登録で Sites.Selected + サイト単位承認 を設定し、その App ID / シークレットを SharePoint 接続にキー/値で渡すことで、「Invalid credential」が解消された事例が複数報告されている
ひとことで言うと、
「/teams 形式のチームサイトを使い、Entra のアプリ登録(Sites.Selected + 管理者同意)で発行した App ID とシークレットを SharePoint 接続にキー/値で設定する」
これが現時点(プレビュー)の Azure AI Foundry で SharePoint 接続を安定させるための、最も再現性の高いアプローチです。本番環境に反映する前に、まずは検証環境で同じ構成を再現し、Graph Explorer も併用しながら一歩ずつ確認していくことをおすすめします。

コメント