Supported Providers
| Provider | Servers | Flow |
|---|---|---|
| Slack | Slack | OAuth 2.0 |
| Atlassian | Atlassian (Jira, Confluence) | OAuth 2.0 + PKCE |
| Linear | Linear | OAuth 2.0 + PKCE |
| Notion | Notion | OAuth 2.0 |
| Sentry | Sentry | OAuth 2.0 |
| Figma | Figma | OAuth 2.0 + PKCE |
| Stripe | Stripe | OAuth 2.0 |
| Vercel | Vercel | OAuth 2.0 |
| Supabase | Supabase | OAuth 2.0 + PKCE |
| Cloudflare | Cloudflare | OAuth 2.0 + PKCE |
| Neon | Neon | OAuth 2.0 + PKCE |
| Google Workspace | OAuth 2.0 + PKCE |
How It Works
CLI Flow
When you dock a native server that requires OAuth:- Harbor starts a local callback server on an ephemeral port
- Your browser opens to the provider’s authorization page
- You authorize Harbor
- The browser redirects back to
http://127.0.0.1:<port>/callback - Harbor exchanges the authorization code for tokens
- Tokens are stored in the vault and the server is docked
Desktop Flow
In the desktop app, click Charter on any OAuth server in the Native Fleet or Settings page. The same browser-based flow opens, and the desktop app receives the callback automatically.Token Storage
OAuth tokens are stored securely in the vault (OS keychain) with these keys:oauth:<provider>:access_token— The access tokenoauth:<provider>:refresh_token— The refresh token (if provided)oauth:<provider>:client_id— The client ID usedoauth:<provider>:client_secret— The client secret used
vault: prefixes in their environment variables or HTTP headers.
Token Refresh
For remote HTTP servers, the gateway automatically handles token refresh. If a request returns a401 Unauthorized, the gateway:
- Uses the stored refresh token to obtain a new access token
- Updates the vault with the new tokens
- Retries the request with the fresh token

