corsair_permissions table work the same regardless of mode. The only thing Hub changes is who hosts the approve/deny UI.
- Manual — you build a review page and wire
manual.onApprovalRequiredso the agent receives a link to it. - Hub — Corsair hosts the approval page. When a call is gated, the SDK returns a Hub approval link automatically. Nothing to build.
How it works on Hub
The approval record still lives in yourcorsair_permissions table. Hub renders the UI and delivers the signed decision to your handler, which writes it to your database. Hub never touches your database and stores no approval data of its own. Delivery uses the same environment-specific transport as connect flows — browser redirect in development, signed POST in production.
Configuration
Withhub configured, blocked calls include a hosted approval URL with no extra setup:
corsair.ts
corsair.ts
Approvals require the
corsair_permissions table in both modes. Hub hosts the UI, not the data. See Permissions for the migration.Mixing modes
Connect through Hub while keeping approvals manual, or the reverse. The two surfaces are independent: pass both blocks and Hub handles connect while your own page handles approvals.corsair.ts
approvalBaseUrl is the only manual field you need for this; Corsair turns it into a per-request /[token] URL and surfaces it through onApprovalRequired. Connect still routes through Hub because the hub block is present.
What’s next
Permissions
Policies, modes, overrides, and the full approval lifecycle.
Manual or Hub
What each mode asks you to build.
Hub overview
The relay model and the surfaces Hub hosts.
MCP Adapters
How approvals gate agent tool calls.