ruvnet/ruflo · error · Error

No refresh token available

Error message

No refresh token available

What it means

refreshTokens() loaded the stored OAuth tokens for the storage key but the record has no refreshToken field, so there is nothing to exchange for a new access token. Typically the initial grant was access-token-only or the refresh token was already consumed/cleared.

Source

Thrown at v3/@claude-flow/mcp/src/oauth.ts:218

    }

    const data = (await response.json()) as TokenResponse;
    const tokens = this.parseTokenResponse(data);

    await this.tokenStorage.save('default', tokens);
    this.logger.info('Token exchange successful');
    this.emit('tokens:received', { expiresIn: tokens.expiresIn });

    return tokens;
  }

  /**
   * Refresh access token using refresh token
   */
  async refreshTokens(storageKey: string = 'default'): Promise<OAuthTokens> {
    const existing = await this.tokenStorage.load(storageKey);
    if (!existing?.refreshToken) {
      throw new Error('No refresh token available');
    }

    const params = new URLSearchParams({
      grant_type: 'refresh_token',
      refresh_token: existing.refreshToken,
      client_id: this.config.clientId,
    });

    if (this.config.clientSecret) {
      params.set('client_secret', this.config.clientSecret);
    }

    const response = await fetch(this.config.tokenEndpoint, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
      },
      body: params.toString(),

View on GitHub (pinned to fa13ee4ad6)

Solutions

  1. Run the OAuth login flow again with offline access / refresh token scope so a refresh token is issued.
  2. Store the refresh token returned by the initial authorization and reload it before refreshing.
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at v3/@claude-flow/mcp/src/oauth.ts:218 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of ruvnet/ruflo@fa13ee4ad6 (2026-08-18). Data as JSON: /api/errors/d3b544a612b7902c. Report an issue: GitHub.