paperclipai/paperclip · error · HttpError

oauth_refresh_missing

oauth_refresh_missing

Error message

OAuth credentials have expired and no refresh token is available

What it means

Terminal credential guard in the OAuth refresh path: the stored token is expired (or the expired marker applies) and the connection has no refresh token, so renewal is impossible without user action. The user must reconnect the app; the connection's absent refresh token is at fault.

Source

Thrown at server/src/services/tool-access.ts:4792

      },
    };
  }

  async function ensureRuntimeSlot(connection: typeof toolConnections.$inferSelect): Promise<ToolRuntimeSlot | null> {
    if (connection.transport !== "local_stdio") return null;
    const slotKey = `mcp:${connection.companyId}:${connection.id}`;
    const [existing] = await db
      .select()
      .from(toolRuntimeSlots)
      .where(and(eq(toolRuntimeSlots.companyId, connection.companyId), eq(toolRuntimeSlots.slotKey, slotKey)));
    if (existing) return toRuntimeSlot(existing);
    const [created] = await db.insert(toolRuntimeSlots).values({
      companyId: connection.companyId,
      applicationId: connection.applicationId,
      connectionId: connection.id,
      slotKey,
      ownerScopeType: "connection",
      ownerScopeId: connection.id,
      runtimeKind: "local_stdio",
      status: "stopped",
      provider: "paperclip",
      providerRef: `template:${String(connection.config.templateId)}`,
      commandTemplateKey: String(connection.config.templateId),
      healthStatus: "unchecked",
      metadata: { templateId: connection.config.templateId },
    }).returning();
    return toRuntimeSlot(created);
  }

  async function vaultGrantForConnection(
    connection: typeof toolConnections.$inferSelect,
    actor?: ActorInfo,
  ): Promise<typeof connectionGrants.$inferSelect | null> {
    const actorUserId = actor?.actorType === "user" ? actor.actorId ?? null : null;
    if (actorUserId) {
      const [personal] = await db.select().from(connectionGrants).where(and(

View on GitHub (pinned to 01ad858492)

Solutions

  1. No refresh token is stored, so expired credentials cannot be renewed. Reconnect the app to obtain fresh credentials.
Defensive patterns

Strategy: fallback

When it happens

Trigger: Thrown at server/src/services/tool-access.ts:4634 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of paperclipai/paperclip@01ad858492 (2026-08-18). Data as JSON: /api/errors/d18c985fc4b155e8. Report an issue: GitHub.