Utiliser des flux MCP avec un nœud MSAL

Lors de la création d'applications Model Context Protocol (MCP), vous pouvez configurer MSAL Node pour imposer l'acquisition et la mise en cache de tokens délimités à une ressource. Lorsque le mode MCP est activé, MSAL exige que chaque demande de jeton inclue le paramètre resource et met en cache les jetons d’accès en les indexant sur cette ressource.

Note

Les flux MCP sont disponibles uniquement pour les applications clientes publiques.

Prerequisites

Activer le mode MCP

Définissez isMcp: true dans la configuration auth lors de la création de votre PublicClientApplication:

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

const pca = new msal.PublicClientApplication(config);

Inclure le paramètre de ressource

Lorsque isMcp est true, chaque demande de jeton doit inclure un paramètre resource. L’omettre génère une erreur 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

Définissez le resource paramètre directement sur l’objet de requête. Ne le transmettez pas via extraQueryParameters en même temps que la propriété resource, car cela génère une erreur misplaced_resource_parameter.

L’exemple suivant montre les méthodes correctes et incorrectes pour définir le resource paramètre :

// 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" },
};

Mise en cache délimitée à une ressource

Lorsque isMcp est activé, les jetons d’accès sont mis en cache avec la ressource associée. Cela affecte l’acquisition silencieuse de jetons :

  • Accès au cache : si un token d'accès mis en cache existe pour les mêmes étendues et la même ressource, il est renvoyé depuis le cache.
  • Manque de cache : si la ressource demandée ne correspond à aucun jeton mis en cache, MSAL revient au réseau pour acquérir un nouveau jeton pour la ressource demandée.
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],
});

Gestion des erreurs

Deux erreurs sont spécifiques aux flux MCP :

Code d'erreur Description
resource_parameter_required isMcp est true mais la requête n’inclut pas de resource paramètre.
misplaced_resource_parameter Un élément resource a été trouvé à la fois dans la propriété resource et dans extraQueryParameters. N’utilisez qu’une seule.

Les deux erreurs sont générées sous la forme de ClientAuthError. Pour plus d’informations, consultez les questions fréquentes (FAQ) sur les nœuds MSAL.

Échantillons

  • Exemple de flux MCP : application Express illustrant MCP avec du code d’autorisation et des flux silencieux.

Étapes suivantes