在建置 模型上下文協定(MCP) 應用程式時,你可以設定 MSAL Node 強制執行資源範圍的令牌擷取與快取。 啟用 MCP 模式時,MSAL 要求每個令牌請求都包含 resource 參數,並快取由該資源鍵入的存取權杖。
Note
MCP 流程僅適用於公開客戶端應用程式。
先決條件
- 透過 Microsoft 身分識別平台註冊應用程式
- 一個被設定為公開客戶端的應用程式(例如桌面或 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],
});
錯誤處理
有兩個錯誤是 MCP 流程特有的:
| 錯誤代碼 | Description |
|---|---|
resource_parameter_required |
isMcp 是 true,但該請求未包含 resource 參數。 |
misplaced_resource_parameter |
在 resource 屬性和 extraQueryParameters 中都發現了 resource。 只用一個。 |
兩個錯誤都會以 ClientAuthError 的形式拋出。 欲了解更多資訊,請參閱 MSAL 節點常見問題集。
Samples
- MCP 流程範例 — Express 應用程式展示 MCP 授權碼與靜默流程。