モデル コンテキスト プロトコル (MCP) アプリケーションを構築するときに、リソース スコープのトークンの取得とキャッシュを適用するように MSAL ノードを構成できます。 MCP モードが有効になっている場合、MSAL では、すべてのトークン要求に resource パラメーターを含める必要があり、そのリソースによってキー指定されたアクセス トークンがキャッシュされます。
Note
MCP フローは、パブリック クライアント アプリケーションでのみ使用できます。
Prerequisites
- Microsoft ID プラットフォームにアプリケーションを登録する
- パブリック クライアントとして構成されたアプリケーション (デスクトップアプリケーションや CLI アプリケーションなど)
-
@azure/msal-nodeプロジェクトに v5 以降がインストールされている
MCP モードを有効にする
PublicClientApplication の作成時に、auth 構成で isMcp: true を設定します:
const config = {
auth: {
clientId: "your-client-id",
authority: "https://login.microsoftonline.com/common",
isMcp: true,
},
};
const pca = new msal.PublicClientApplication(config);
リソース パラメーターを含める
isMcpがtrueされると、すべてのトークン要求に パラメーターが含まれているresource。 省略すると、resource_parameter_required エラーになります。
const tokenRequest = {
scopes: ["User.Read"],
redirectUri: "http://localhost:3000/redirect",
resource: "https://example.microsoft.com",
code: authorizationCode,
};
const response = await pca.acquireTokenByCode(tokenRequest);
Important
resource パラメーターを要求オブジェクトに直接設定します。
extraQueryParameters経由でresourceプロパティと同時に渡さないでください。—そうするとmisplaced_resource_parameterエラーが発生します。
次の例は、 resource パラメーターを設定する正しい方法と正しくない方法を示しています。
// Correct — resource on the request object
const request = {
scopes: ["User.Read"],
resource: "https://example.microsoft.com",
};
// Wrong — resource in both locations
const request = {
scopes: ["User.Read"],
resource: "https://example.microsoft.com",
extraQueryParameters: { resource: "https://example.microsoft.com" },
};
リソース単位のキャッシュ
isMcpが有効になっている場合、アクセス トークンは関連付けられているリソースと共にキャッシュされます。 これは、サイレント トークンの取得に影響します。
- キャッシュ ヒット: 同じスコープ と リソースに対してキャッシュされたアクセス トークンが存在する場合は、キャッシュから返されます。
- キャッシュ ミス: 要求されたリソースがキャッシュされたトークンと一致しない場合、MSAL はネットワークにフォールバックして、要求されたリソースの新しいトークンを取得します。
const msalTokenCache = pca.getTokenCache();
const accounts = await msalTokenCache.getAllAccounts();
// First request — acquires token from network
const token1 = await pca.acquireTokenSilent({
scopes: ["User.Read"],
resource: "https://resource-a.microsoft.com",
account: accounts[0],
});
// Same resource — returns cached token
const token2 = await pca.acquireTokenSilent({
scopes: ["User.Read"],
resource: "https://resource-a.microsoft.com",
account: accounts[0],
});
// Different resource — falls back to network
const token3 = await pca.acquireTokenSilent({
scopes: ["User.Read"],
resource: "https://resource-b.microsoft.com",
account: accounts[0],
});
エラー処理
2 つのエラーは、MCP フローに固有です。
| エラー コード | 説明 |
|---|---|
resource_parameter_required |
isMcp は true ですが、要求に resource パラメーターは含まれません。 |
misplaced_resource_parameter |
resource プロパティと resource の両方でextraQueryParametersが見つかりました。 1 つだけを使用します。 |
両方のエラーは ClientAuthError としてスローされます。 詳細については、 MSAL ノードに関する FAQ を参照してください。
Samples
- MCP フローのサンプル - 承認コードとサイレント フローを使用して MCP を示す Express アプリ。