Используйте потоки MCP с MSAL Node

При создании приложений Model Context Protocol (MCP) можно настроить MSAL Node так, чтобы обеспечить обязательное получение и кэширование токенов для конкретного ресурса. Если включен режим MCP, MSAL требует, чтобы каждый запрос токена включал resource параметр и кэширует маркеры доступа, ключом которых является этот ресурс.

Note

Потоки MCP доступны только для общедоступных клиентских приложений.

Необходимые условия

Включение режима MCP

Задайте isMcp: true в конфигурации auth при создании PublicClientApplication:

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 был найден как в свойстве resource , так и в extraQueryParameters. Используйте только один.

Обе ошибки выдаются как ClientAuthError. Дополнительные сведения см. в часто задаваемых вопросы о узле MSAL.

Samples

  • Пример потоков MCP — приложение на Express, демонстрирующее MCP с кодом авторизации и тихими потоками.

Дальнейшие действия