github/copilot-sdk · error

No bearer-token provider registered for provider

Error message

No bearer-token provider registered for provider "${params.providerName}"

What it means

Thrown by the session's `providerToken.getToken` API when a bearer token is requested for a provider name that has no registered bearer-token provider callback in the session's registry. The SDK cannot obtain a token for an unknown provider, so it fails fast with a descriptive message.

Solutions

  1. Call session.registerBearerTokenProvider(providerName, callback) for the requested provider before getToken
  2. Fix the providerName string to exactly match the registered key
  3. Ensure registration runs on the same CopilotSession instance and executes before token requests
  4. Log available provider names at startup to verify wiring

Example fix

// before
const token = await session.providerToken.getToken({ providerName: "anthropic" });
// after
session.registerBearerTokenProvider("anthropic", async ({ providerName }) => getAuthToken(providerName));
const token = await session.providerToken.getToken({ providerName: "anthropic" });
Defensive patterns

Strategy: validation

Validate before calling

const registered = session.listBearerTokenProviders?.() ?? [];
if (!registered.includes(providerName)) {
  session.registerBearerTokenProvider(providerName, tokenCallback);
}

Type guard

function canGetToken(session, providerName) {
  return typeof session.listBearerTokenProviders === "function"
    && session.listBearerTokenProviders().includes(providerName);
}

Try / catch

try {
  return await session.providerToken.getToken({ providerName });
} catch (err) {
  if (String(err?.message).startsWith("No bearer-token provider registered")) {
    registerProvider(providerName);
    return await session.providerToken.getToken({ providerName });
  }
  throw err;
}

Prevention

When it happens

Trigger: Calling providerToken.getToken({ providerName }) before registerBearerTokenProvider was called for that provider; misspelled or differently-cased provider name; token provider registered on a different session instance.

Common situations: Configuring model providers whose auth callback registration was skipped; typos like "anthropic" vs "Anthropic"; environment-specific wiring where token providers are registered only in prod bootstrap code.

Related errors


AI-assisted analysis of github/copilot-sdk@cd8cf15dc3 (2026-09-09). Data as JSON: /api/errors/0e888c366607dcb8. Report an issue: GitHub.

Appendix: source

Thrown at nodejs/src/session.ts:1637

     * @param providers - Map of provider name → callback, or undefined/empty to clear.
     * @internal This method is called internally when creating/resuming a session.
     */
    registerBearerTokenProviders(providers?: Map<string, BearerTokenProvider>): void {
        this.bearerTokenProviders.clear();
        if (!providers || providers.size === 0) {
            delete this.clientSessionApis.providerToken;
            return;
        }
        for (const [name, callback] of providers) {
            this.bearerTokenProviders.set(name, callback);
        }

        const self = this;
        this.clientSessionApis.providerToken = {
            async getToken(params) {
                const callback = self.bearerTokenProviders.get(params.providerName);
                if (!callback) {
                    throw new Error(
                        `No bearer-token provider registered for provider "${params.providerName}"`
                    );
                }
                const token = await callback({
                    providerName: params.providerName,
                    sessionId: params.sessionId,
                });
                return { token };
            },
        };
    }

    /**
     * Registers command handlers for this session.
     *
     * @param commands - An array of command definitions with handlers, or undefined to clear
     * @internal This method is typically called internally when creating/resuming a session.
     */

View on GitHub (pinned to cd8cf15dc3)