Использование потоков MCP с браузером MSAL

Протокол контекста модели (MCP) — это открытый стандарт, позволяющий приложениям ИИ безопасно подключаться к внешним средствам, источникам данных и службам. MSAL Browser поддерживает потоки MCP, обеспечивая включение параметра resource во все запросы токенов и кэшируя токены доступа с привязкой к этому ресурсу.

Note

Потоки MCP поддерживаются как для стандартных браузерных приложений с использованием PublicClientApplication, так и для приложений, использующих Nested App Authentication (NAA), с использованием createNestablePublicClientApplication.

Сведения о серверных сценариях реализации см. в статье MSAL Node MCP flows.

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

Включение MCP

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

const msalConfig = {
    auth: {
        clientId: "your-client-id",
        authority: "https://login.microsoftonline.com/common",
        isMcp: true,
    },
};

const pca = new msal.PublicClientApplication(msalConfig);

Для приложений NAA используйте ту же конфигурацию с createNestablePublicClientApplication:

const pca = await msal.createNestablePublicClientApplication(msalConfig);

Параметр ресурса

Когда isMcp имеет значение true, каждый запрос на получение токена должен включать параметр resource. Опущение вызывает ошибку resource_parameter_required .

const tokenRequest = {
    scopes: ["User.Read"],
    resource: "https://example.microsoft.com",
};

Important

resource Задайте параметр непосредственно в объекте запроса. Не передавайте его через extraQueryParameters или extraParameters одновременно со свойством resource — это вызовет ошибку misplaced_resource_parameter.

В следующем примере показаны правильные и неверные способы задания resource параметра:

// Correct
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 возвращается в сеть, чтобы получить новый маркер для запрошенного ресурса.
// First request — acquires token from network
const token1 = await pca.acquireTokenSilent({
    scopes: ["User.Read"],
    resource: "https://resource-a.microsoft.com",
    account: account,
});

// Same resource — returns cached token
const token2 = await pca.acquireTokenSilent({
    scopes: ["User.Read"],
    resource: "https://resource-a.microsoft.com",
    account: account,
});

// Different resource — falls back to network
const token3 = await pca.acquireTokenSilent({
    scopes: ["User.Read"],
    resource: "https://resource-b.microsoft.com",
    account: account,
});

Обработка ошибок

Две ошибки относятся к потокам MCP:

Код ошибки Description
resource_parameter_required isMcp имеет значение true, но запрос не включает параметр resource.
misplaced_resource_parameter Объект resource был найден как в свойстве resource , так и в extraQueryParameters или extraParameters. Используйте только один.

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

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