# Fluxmail Cloud documentation
# Account settings
URL: https://fluxmail.ai/docs/cloud/account
Manage your account in [Settings](https://cloud.fluxmail.ai/settings). Mailbox connections, OAuth connections, and agent keys have their own pages in the dashboard.
## Sign up and verify your email [#sign-up-and-verify-your-email]
Sign up at [Fluxmail Cloud](https://cloud.fluxmail.ai), then open the verification email before signing in. Verification links expire after one hour; request another on the verification page if needed.
If an account with your email already exists, sign in or reset your password.
## Passwords and recovery [#passwords-and-recovery]
Passwords must contain 12 to 128 characters. Change your password in Settings, or use the sign-in page's recovery flow if you've forgotten it.
Password-reset links expire after one hour and work once. Resetting your password revokes existing browser sessions and delegated OAuth connections. Browser logout keeps approved OAuth connections active. Browser sessions otherwise expire after one day.
## Delete your account [#delete-your-account]
Deleting your account automatically cancels your subscription immediately and ends your access. Cloud confirms cancellation before deleting your account. If cancellation fails, your account stays intact and you can try again.
Choose **Delete account** in Settings, then enter your current password in the confirmation dialog. Deletion removes your personal workspace, mailbox credentials, agent keys, OAuth connections, sessions, and pending reset links from Cloud. Mail stored at your email provider remains there.
To stop a single client, [revoke its connection or key](/docs/cloud/permissions). To remove a mailbox from Cloud, [disconnect it](/docs/cloud/mailboxes#reconnect-or-disconnect). Disconnecting also deletes that mailbox's send-operation records, so resolve any uncertain sends first.
---
# Billing and plans
URL: https://fluxmail.ai/docs/cloud/billing
Open [Billing](https://cloud.fluxmail.ai/billing) in the dashboard to subscribe or manage your plan. Billing belongs to the selected workspace, and only its owner can change it. Cloud subscriptions are separate from [self-hosted licenses](/docs/teams-and-plans).
## Choose a plan [#choose-a-plan]
| Plan | Monthly | Annual | Capacity |
| -------- | -------------- | --------------- | ------------------------------------------------------------------------------ |
| Pro | $15 | $120 | One member and ten mailboxes |
| Business | $25 per member | $240 per member | Up to 100 members, with twenty pooled mailbox connections per purchased member |
Business capacity applies to the whole workspace. For example, two purchased members allow up to forty mailbox connections, even if one person connects them all. Purchasing capacity does not share private mailboxes with other members.
Both plans support MCP and REST. API calls and new send attempts have [hourly limits](/docs/cloud/troubleshooting#limits); there are no monthly usage allowances or overage charges. View your current month's usage in [Settings](https://cloud.fluxmail.ai/settings).
## Start a trial [#start-a-trial]
A workspace's first subscription includes a seven-day trial on either plan, with monthly or annual billing. Checkout collects payment details. Business trials include the selected member and mailbox capacity.
Stripe charges for the selected plan when the trial ends unless you cancel through **Manage billing**. Billing shows the trial deadline. A canceled or expired subscription does not qualify for another trial, including after a plan change. Leaving checkout before subscribing does not use the trial.
You need a valid trial or paid subscription before connecting a mailbox, creating an agent key, or running provider operations. If you joined someone else's workspace, its owner manages the subscription.
## Change your plan or cancel [#change-your-plan-or-cancel]
Use the pricing cards in Billing to select a plan, billing period, and Business member count. For an existing subscription, Stripe shows the proposed change and any charges before you confirm it. Use **Manage billing** to update payment details, view invoices, or cancel.
A cancellation scheduled for the end of the paid period keeps access until that period ends. Immediate cancellation ends access. Reducing Business members does not remove accounts or automatically delete mailbox connections, but members and mailboxes beyond the new capacity lose provider access. See [workspaces and members](/docs/cloud/workspaces#capacity-and-member-removal).
## Payment problems and suspended access [#payment-problems-and-suspended-access]
A failed payment allows seven days from the failed invoice's creation to fix billing. Repeated payment attempts do not restart that deadline. An expired trial or suspended subscription blocks provider operations and new mailbox connections or keys.
You can still sign in, repair billing, disconnect mailboxes, revoke keys, and check existing send-operation status. Resolve [uncertain sends](/docs/cloud/sending#send-status-and-duplicate-protection) before disconnecting a mailbox.
Cloud retains mailbox credentials for thirty days after suspension. Restoring payment within that period preserves them. Afterward, cleanup can remove credentials, keys, and mailbox-dependent send records; account and aggregate usage records remain. Mail at your email provider stays there. If cleanup has run, reconnect the mailbox and create replacement keys after restoring your subscription.
[Deleting your account](/docs/cloud/account#delete-your-account) cancels its subscription immediately and removes your personal workspace.
---
# Fluxmail Cloud
URL: https://fluxmail.ai/docs/cloud
> **Prefer to run your own server?** Fluxmail Self-Hosted connects your agents and apps to email on infrastructure you control. [Explore Self-Hosted](/docs/self-hosted).
Fluxmail Cloud lets agents and apps work with your Gmail, Outlook, and IMAP mailboxes. Connect your email provider, choose what each agent can access, and use hosted MCP or REST to search, read, draft, send, and organize mail.
You manage your account, mailbox connections, OAuth connections, and agent keys in the [Cloud dashboard](https://cloud.fluxmail.ai).
## Get started [#get-started]
Follow the [quickstart](/docs/cloud/quickstart) to set up Cloud with your coding agent or connect manually. Once you have a mailbox, choose your connection:
* [Connect an agent over MCP](/docs/cloud/mcp) with OAuth in ChatGPT, Claude, Codex, Claude Code, Muse, Hermes, Cursor, or another compatible client.
* [Use the REST API](/docs/cloud/rest-api) from your application or a script.
## Control access [#control-access]
Each OAuth connection or agent key has access to the mailboxes and operations you select. Approve each client separately so you can revoke access independently. [Agent connections and permissions](/docs/cloud/permissions) explains the available scopes and how provider consent differs from an agent's access.
Mail remains with your email provider. Cloud stores encrypted provider credentials, account information, OAuth grant and token records, key hashes, usage counters, audit metadata, and send-operation records. You can [disconnect a mailbox](/docs/cloud/mailboxes#reconnect-or-disconnect) or [delete your Cloud account](/docs/cloud/account#delete-your-account) without deleting mail at your provider.
## Current limits [#current-limits]
Cloud supports Gmail through Google, Outlook through Microsoft, and other providers through IMAP and SMTP. Google and Microsoft connections depend on the Cloud deployment's provider configuration and your organization's access policy.
Cloud offers [Pro and Business subscriptions](/docs/cloud/billing), with a seven-day trial on a workspace's first subscription. Business owners can [invite workspace members](/docs/cloud/workspaces). Scheduled sends and remote configuration through the `fluxmail` CLI are not available. The separate [Fluxmail Self-Hosted package](/docs/self-hosted) has its own CLI, licenses, and keys.
See [troubleshooting and limits](/docs/cloud/troubleshooting) for connection failures, quotas, and attachment sizes. Before sending mail, read [sending and retries](/docs/cloud/sending).
## Documentation for agents [#documentation-for-agents]
The [setup instructions](/docs/cloud/setup.txt) guide an agent through configuring a client and verifying access. [Cloud docs as plain text](/docs/cloud/llms.txt) contains every Cloud guide. Cloud also appears in the site's [documentation index](/llms.txt) and [full documentation](/docs/llms-full.txt).
---
# Connect mailboxes
URL: https://fluxmail.ai/docs/cloud/mailboxes
Open [Mailboxes](https://cloud.fluxmail.ai/mailboxes) in the dashboard and choose your provider. Your workspace needs a trial or paid subscription. Pro includes ten mailbox connections; Business includes twenty per purchased member, pooled across the workspace. See [billing and plans](/docs/cloud/billing). After connecting, [authorize an MCP client](/docs/cloud/mcp) or [create an agent key](/docs/cloud/permissions#store-and-replace-keys) for REST access.
## Gmail and Google Workspace [#gmail-and-google-workspace]
Choose Gmail, sign in to Google, and authorize Cloud. Cloud uses the Gmail API and requests `gmail.modify`, which covers reading, drafts, sending, labels, and Trash. Cloud rejects permanent message deletion for Gmail OAuth connections.
Choose the agent key's [scopes](/docs/cloud/permissions#choose-the-required-scopes) to restrict how much of that access an agent can use. If Google blocks consent or the provider is unavailable, see [connection troubleshooting](/docs/cloud/troubleshooting#sign-in-and-mailbox-connections).
## Outlook and Microsoft accounts [#outlook-and-microsoft-accounts]
Choose Outlook and authorize your Microsoft account. Cloud requests `Mail.ReadWrite`, `Mail.Send`, `MailboxSettings.Read`, `User.Read`, and `offline_access`. Work and personal accounts depend on the registered application's configuration; your organization may require administrator consent.
## IMAP and SMTP [#imap-and-smtp]
For iCloud, Yahoo, AOL, and Fastmail addresses, the dashboard fills in the server settings. Check them against your provider's current instructions. Use an app password if your provider requires one. Gmail uses the Google connection flow in the dashboard.
For another provider, enter the mailbox address, password, optional login username, and both servers. The username defaults to your email address.
| Service | Accepted connections |
| ------- | --------------------------------------- |
| IMAP | Port 993 with TLS, or 143 with STARTTLS |
| SMTP | Port 465 with TLS, or 587 with STARTTLS |
Cloud requires public DNS hostnames and verified TLS certificates. IP addresses, private servers, port 25, and plaintext connections are not accepted. Cloud checks both IMAP login and SMTP authentication before saving the connection, including when you plan to give the agent read-only access.
Enable **Save sent mail** to save a copy of each SMTP submission in your Sent folder. Turn it off if your provider already saves sent submissions to avoid duplicate copies.
### Folder mappings [#folder-mappings]
If Cloud cannot detect folders, expand **Folder mappings** and enter their exact paths for Sent, Drafts, Trash, Archive, or Spam. Preserve the provider's case, spaces, and accents. Leave a mapping empty to use automatic detection. To change an existing connection's mappings, reconnect the same address with the updated settings; Cloud preserves its mailbox ID and agent grants.
## Reconnect or disconnect [#reconnect-or-disconnect]
If provider authorization expires or is revoked, reconnect in the dashboard. After reconnecting, ask your agent to list your 5 most recent emails using its OAuth connection or agent key.
Disconnecting removes the Cloud mailbox connection and its send-operation records. Mail already stored at your provider remains there. Before disconnecting, [check any uncertain sends](/docs/cloud/sending#send-status-and-duplicate-protection). Reconnecting does not restore their duplicate-send protection.
---
# Connect an agent over MCP
URL: https://fluxmail.ai/docs/cloud/mcp
Connect your client to `https://cloud.fluxmail.ai/mcp` with OAuth. Add the URL, sign in to Fluxmail in your browser, and choose the workspace, mailboxes, and permissions to approve. Start with the [quickstart](/docs/cloud/quickstart) if you need an account or mailbox.
## 1. Choose permissions [#1-choose-permissions]
Choose the permissions your agent needs. Full mail access is selected by default. It excludes permanent deletion.
- Read only: Search and read emails without changing anything. Scopes: `mail.read`.
- Read and write: Read, draft, organize, and trash emails without sending. Scopes: `mail.read`, `mail.drafts`, `mail.organize`, `mail.trash`.
- Full mail access: Read, draft, organize, trash, and send emails. Scopes: `mail.read`, `mail.drafts`, `mail.organize`, `mail.trash`, `mail.send`.
Custom lets you choose individual permissions, including permanent deletion. The bare MCP URL offers Full mail access. Every requested permission starts checked during browser consent; you can uncheck any of them.
## 2. Choose your client [#2-choose-your-client]
Follow your client’s setup instructions. Keep other servers in your configuration when adding `fluxmail-cloud`.
These examples request `mail.read mail.drafts mail.organize mail.trash mail.send offline_access`. For another selection, keep the generated `?scopes=...` query in the MCP URL and use the same mail scopes wherever the client specifies OAuth scopes, plus `offline_access`. The permissions reference below lists every scope and example URLs.
### ChatGPT
#### ChatGPT on the web
Go to chatgpt.com/plugins, select the plus button, then Add custom MCP server. Enter a name and description, paste this public MCP URL under Connection, and choose OAuth. Accept the warning, select Create as a plugin, then sign in and approve access when ChatGPT asks.
```text
Name: Fluxmail Cloud
URL: https://cloud.fluxmail.ai/mcp
Authentication: OAuth
Scopes: mail.read mail.drafts mail.organize mail.trash mail.send offline_access
```
ChatGPT registers its client automatically. Your account or workspace must allow custom MCP servers; organization policies may require administrator setup. This connection needs a publicly reachable server and cannot use a local development URL.
[OpenAI’s custom MCP server guide](https://developers.openai.com/apps-sdk/deploy/connect-chatgpt#add-the-mcp-server)
#### ChatGPT desktop app
Open Settings > MCP servers and select Add server. Enter this name and URL, choose Streamable HTTP, save, and select Restart. Then select Authenticate next to fluxmail-cloud and approve access in your browser. Type /mcp in the composer to check the connection.
```text
Name: fluxmail-cloud
Type: Streamable HTTP
URL: https://cloud.fluxmail.ai/mcp
```
The desktop app shares its MCP configuration with Codex on the same host, so servers you already added for Codex appear here too.
[ChatGPT’s MCP server settings](https://learn.chatgpt.com/docs/extend/mcp)
### Claude
In Claude Desktop or Claude on the web, open Customize > Connectors and add a custom connector with this public MCP URL. Choose Sign in now and Register automatically, approve access, then enable the connector for your conversation.
```text
URL: https://cloud.fluxmail.ai/mcp
Authentication: Sign in now
OAuth client: Register automatically
Scopes: mail.read mail.drafts mail.organize mail.trash mail.send offline_access
```
Cloud uses dynamic registration; Claude’s published metadata identity is not supported. Organization administrators may need to add the connector first. Remote connectors need a publicly reachable server and cannot use a local development URL.
[Claude’s custom connector guide](https://support.claude.com/en/articles/11175166-get-started-with-custom-connectors-using-remote-mcp)
### Codex
Run these commands, approve access in your browser, then start a fresh Codex session and check /mcp.
```bash
codex mcp add fluxmail-cloud --url 'https://cloud.fluxmail.ai/mcp'
codex mcp login fluxmail-cloud --scopes mail.read,mail.drafts,mail.organize,mail.trash,mail.send,offline_access --oauth-client-registration dcr
```
The dcr option selects dynamic client registration. Cloud does not support Client ID Metadata Documents.
#### Project configuration
For project-specific setup, add this table to .codex/config.toml in a trusted project, then run the login command above.
```toml
[mcp_servers.fluxmail-cloud]
url = "https://cloud.fluxmail.ai/mcp"
```
### Claude Code
Run these commands from your project. Approve the project server, complete browser sign-in and consent, then check /mcp.
```bash
claude mcp add-json --scope project fluxmail-cloud '{"type":"http","url":"https://cloud.fluxmail.ai/mcp","oauth":{"scopes":"mail.read mail.drafts mail.organize mail.trash mail.send offline_access"}}'
claude mcp login fluxmail-cloud
```
#### Project configuration
You can also add this entry to your project’s .mcp.json to set the initial scopes, then run the login command above.
```json
{
"mcpServers": {
"fluxmail-cloud": {
"type": "http",
"url": "https://cloud.fluxmail.ai/mcp",
"oauth": {
"scopes": "mail.read mail.drafts mail.organize mail.trash mail.send offline_access"
}
}
}
}
```
[Claude Code’s MCP instructions](https://code.claude.com/docs/en/mcp)
### Muse
Paste this request into the Muse app to create a custom connector. Follow its sign-in instructions and choose the mailboxes to approve.
```text
Create a custom connector for Fluxmail Cloud using this MCP server: https://cloud.fluxmail.ai/mcp
Use Streamable HTTP and OAuth 2.1 with PKCE.
Use dynamic client registration (DCR) and request mail.read mail.drafts mail.organize mail.trash mail.send offline_access.
Guide me through signing in to Fluxmail and approving mailbox access.
```
These instructions are for the Muse personal AI agent. Muse Code uses a separate CLI configuration. Muse needs a publicly reachable server and cannot use a local development URL.
[Meta’s guide to Muse connectors](https://www.meta.com/help/artificial-intelligence/1687253048996149/)
### Hermes
Add this entry to ~/.hermes/config.yaml, then run hermes mcp login fluxmail-cloud in your terminal. Approve access in your browser and run /reload-mcp in Hermes.
```yaml
mcp_servers:
fluxmail-cloud:
url: 'https://cloud.fluxmail.ai/mcp'
auth: oauth
oauth:
cimd: false
scope: 'mail.read mail.drafts mail.organize mail.trash mail.send offline_access'
```
The cimd: false setting selects dynamic registration, which Cloud supports.
[Hermes’s MCP configuration reference](https://hermes-agent.nousresearch.com/docs/reference/mcp-config-reference/#oauth-21-authentication)
### Cursor
Add this server to your project’s .cursor/mcp.json, enable it in Cursor, and follow the sign-in prompt.
```json
{
"mcpServers": {
"fluxmail-cloud": {
"url": "https://cloud.fluxmail.ai/mcp"
}
}
}
```
Use ~/.cursor/mcp.json for a connection across projects.
[Cursor’s MCP configuration](https://cursor.com/docs/mcp)
### Other
Use a client with Streamable HTTP and MCP OAuth support. Add this URL, choose OAuth with automatic registration, then complete sign-in and consent.
```text
Transport: Streamable HTTP
URL: https://cloud.fluxmail.ai/mcp
Authentication: OAuth
Registration: Automatic
Scopes: mail.read mail.drafts mail.organize mail.trash mail.send offline_access
```
## 3. Sign in and approve [#3-sign-in-and-approve]
Your client opens Fluxmail in your browser. Pick a workspace and mailboxes, then confirm the permissions. To change access later, reconnect and approve again.
## 4. Test the connection [#4-test-the-connection]
With read access, ask your agent to list your 5 most recent emails. Without read access, check that the client discovers the tools for the selected permissions; this does not verify mailbox access.
Detailed connection checks
Check that the discovered tools match your [connection's scopes](/docs/cloud/permissions#choose-the-required-scopes). A `mail.read` connection exposes `list_accounts`, `list_emails`, `get_email`, `get_thread`, `list_folders`, `list_labels`, `list_send_as`, and `download_attachment`. The `get_draft` tool requires `mail.drafts`.
With a read-scoped connection:
1. Call `list_accounts` with `{}`.
2. Choose the intended mailbox's `id` from the result.
3. Ask your agent to list your 5 most recent emails. Call `list_emails` with that ID and a page size of 5:
```json
{
"accountId": "MAILBOX_ID_FROM_LIST_ACCOUNTS",
"pageSize": 5,
"includeSnippet": false
}
```
A successful email listing confirms that Cloud can reach the provider and completes the dashboard’s agent onboarding step. This check lists message summaries without opening message bodies or changing mail. A mailbox with fewer than 5 emails returns fewer results. Include `accountId` on later mailbox operations too, so adding another mailbox won't change which account you use.
For a connection without read access, verify tool discovery only and leave provider access unchecked.
## Reference and troubleshooting [#reference-and-troubleshooting]
Permissions and reconnecting
| Permission | Scope | What it allows |
| ------------------------- | --------------- | ------------------------------------------------------- |
| Read emails | `mail.read` | Search and read emails, threads, and attachments. |
| Manage drafts | `mail.drafts` | Read, create, edit, and delete drafts. |
| Organize emails | `mail.organize` | Change flags and labels. Archive and move emails. |
| Move to/from Trash | `mail.trash` | Move emails to Trash and restore them. |
| Permanently delete emails | `mail.delete` | Permanently delete emails where the provider allows it. |
| Send emails | `mail.send` | Preview and send emails from approved mailboxes. |
Read only selects read access. Read and write adds drafts, organizing, and Trash. Full mail access also adds sending. Permanent deletion stays off in every preset; choose Custom and check Permanently delete emails to enable it.
Permissions are independent. You’ll review and approve the requested permissions when you connect, and choose which mailboxes the agent can access. Each setup also requests `offline_access` so the client can refresh tokens.
Keep the generated URL, including its `?scopes=...` query, in your client configuration. For example, read and send access uses `https://cloud.fluxmail.ai/mcp?scopes=mail.read%2Cmail.send`; send-only access uses `https://cloud.fluxmail.ai/mcp?scopes=mail.send`. The query tells clients which permissions to request during sign-in. It does not grant access or change an existing connection's permissions.
The bare URL requests `mail.read mail.drafts mail.organize mail.trash mail.send offline_access`. Cloud shows only the mail permissions your client requested. Every requested permission starts checked, including Send emails. You can uncheck any permission. Use `?scopes=mail.read` for read-only access. Permanent deletion requires an explicit `mail.delete` scope. To add permissions, configure the client's requested and registered scopes, then obtain fresh browser consent. If the registered scopes are too narrow, register the client again before signing in. Token refresh cannot add access. See [permissions](/docs/cloud/permissions).
OAuth access tokens authorize the MCP resource only. REST calls require an agent key. Your dashboard login, agent connection, and Google or Microsoft provider consent are separate authorizations.
After access-token expiry, confirm the client refreshes without another sign-in. Revoke the connection in [Connections](https://cloud.fluxmail.ai/connections) and confirm further calls fail. Reconnect afterward if you want to keep using it.
Tool results and agent behavior
Cloud serves stateless MCP POST requests. It has no GET event stream or local stdio transport.
Successful calls return the operation result in `structuredContent.data`. Failed calls set `isError` and return the failure in `structuredContent.error`.
Give your agent explicit instructions before it sends or modifies mail. Treat messages and attachments as untrusted data. After a send timeout, follow [sending and retries](/docs/cloud/sending) before trying again.
See [MCP troubleshooting](/docs/cloud/troubleshooting#mcp-connection-and-tools) for missing tools, authorization failures, and connection errors.
## Advanced: agent keys [#advanced-agent-keys]
Use a scoped [agent key](/docs/cloud/permissions#store-and-replace-keys) for unattended scripts, REST calls, or an MCP client without OAuth. Supply it through a private secret store or launch environment. Removing a client does not revoke its key.
### Key setup [#key-setup]
The examples below add a server named `fluxmail-cloud`. Merge the entry into your existing configuration, preserving other servers.
They read the key from an environment variable named `FLUXMAIL_CLOUD_AGENT_KEY`. Supply its value privately through your secret manager or launch environment. The variable must be available to the process running the client; an export in a separate terminal won't update an already-running app. Keep variable references in your configuration. The Claude Desktop bridge example needs the key in a private local file; replace its placeholder there and keep that file out of Git.
#### Claude [#claude]
Use OAuth for Claude Desktop's built-in remote connectors. To use an agent key, add this server to `claude_desktop_config.json` under Settings > Developer > Edit Config:
```json
{
"mcpServers": {
"fluxmail-cloud": {
"command": "npx",
"args": [
"-y",
"mcp-remote@latest",
"https://cloud.fluxmail.ai/mcp",
"--transport",
"http-only",
"--header",
"Authorization:${FLUXMAIL_AUTH_HEADER}"
],
"env": { "FLUXMAIL_AUTH_HEADER": "Bearer YOUR_AGENT_KEY" }
}
}
}
```
Replace `YOUR_AGENT_KEY` privately and keep this file out of Git. Restart Claude Desktop. The local bridge requires Node.js and npm. See [mcp-remote's custom header instructions](https://github.com/punkpeye/mcp-remote#custom-headers).
#### Codex [#codex]
Add this table to `.codex/config.toml` in your project:
```toml
[mcp_servers.fluxmail-cloud]
url = "https://cloud.fluxmail.ai/mcp"
bearer_token_env_var = "FLUXMAIL_CLOUD_AGENT_KEY"
```
Codex loads project configuration for trusted projects. For a connection available across projects, use `~/.codex/config.toml` instead. Start a fresh Codex session from an environment with the key, then use `/mcp` to check the server. See [Codex MCP configuration](https://learn.chatgpt.com/docs/extend/mcp).
#### Claude Code [#claude-code]
Add the server to `.mcp.json` at your project root:
```json
{
"mcpServers": {
"fluxmail-cloud": {
"type": "http",
"url": "https://cloud.fluxmail.ai/mcp",
"headers": {
"Authorization": "Bearer ${FLUXMAIL_CLOUD_AGENT_KEY}"
}
}
}
}
```
Start Claude Code from an environment with the key. Approve the project server when prompted, then open `/mcp` to check its status. Restart the session after changing its launch environment. See [Claude Code's MCP instructions](https://code.claude.com/docs/en/mcp).
#### Hermes [#hermes]
Add this entry to `~/.hermes/config.yaml`:
```yaml
mcp_servers:
fluxmail-cloud:
url: 'https://cloud.fluxmail.ai/mcp'
headers:
Authorization: 'Bearer ${FLUXMAIL_CLOUD_AGENT_KEY}'
```
Store `FLUXMAIL_CLOUD_AGENT_KEY` privately in `~/.hermes/.env` or your profile's secret store, then run `/reload-mcp` in Hermes. See [Hermes's environment variable references](https://hermes-agent.nousresearch.com/docs/reference/mcp-config-reference/#environment-variable-references).
#### Cursor [#cursor]
Add the server to `.cursor/mcp.json` in your project:
```json
{
"mcpServers": {
"fluxmail-cloud": {
"url": "https://cloud.fluxmail.ai/mcp",
"headers": {
"Authorization": "Bearer ${env:FLUXMAIL_CLOUD_AGENT_KEY}"
}
}
}
}
```
Fully quit and reopen Cursor after supplying the key in its launch environment. Enable `fluxmail-cloud` in Customize and check that its tools appear. For all projects, use `~/.cursor/mcp.json` instead. Remote servers don't load Cursor's `envFile` setting; the key must come from the app's environment. See [Cursor's MCP configuration](https://cursor.com/docs/mcp).
#### Other [#other]
Use a client that supports Streamable HTTP and custom authorization headers:
| Setting | Value |
| ----------- | -------------------------------------- |
| Server name | `fluxmail-cloud` |
| Transport | Streamable HTTP |
| URL | `https://cloud.fluxmail.ai/mcp` |
| Header | `Authorization: Bearer YOUR_AGENT_KEY` |
Use the client's supported secret reference in place of `YOUR_AGENT_KEY`. Environment-variable syntax differs by client; copying another client's syntax can send a literal placeholder instead of the key.
Cloud handles stateless MCP POST requests. It has no GET event stream or local stdio transport. Authenticate with your Cloud agent key; your dashboard session and Google or Microsoft mailbox consent are separate credentials.
---
# Agent connections and permissions
URL: https://fluxmail.ai/docs/cloud/permissions
OAuth connections and agent keys control which mailboxes a client can access and what it can do. MCP clients sign in with OAuth by default. REST automation and clients without OAuth use a separate key for each workflow.
## Approve and revoke OAuth connections [#approve-and-revoke-oauth-connections]
Select the permissions your agent needs in the [MCP setup instructions](/docs/cloud/mcp#choose-agent-access), then start sign-in from your MCP client. In the browser, choose one workspace and its mailboxes. If the workspace has one mailbox, it starts selected; otherwise, select the mailboxes to include. Access to all current and future mailboxes you can use in that workspace requires a separate opt-in.
The bare MCP URL requests Full mail access: read, drafts, organize, Trash, and send. Every requested permission starts checked, including Send emails, and you can uncheck any of them before approving. Permanent deletion is excluded from the bare URL and requires an explicit scope selection. Consent can't add a permission the client didn't request. Client names are supplied by the client; a name does not mean Fluxmail has verified the app.
[Connections](https://cloud.fluxmail.ai/connections) shows each approval's client, mailboxes, permissions, last use, and expiration. Revoke a connection there to stop its access tokens and refreshes. Repeated approvals create independent connections, so revoking one does not disconnect the others. Removing a server from your client does not revoke its Cloud connection.
Access tokens last 15 minutes. Clients rotate refresh tokens, which expire after 30 days without rotation. Each approval has a 90-day absolute limit; sign in and approve access again when it expires. Reuse of an old refresh token revokes that connection. Concurrent refreshes with the same token can also require a new sign-in.
Browser logout leaves approved connections active. Password recovery revokes them. Losing workspace membership or mailbox access stops the corresponding delegated access. Expanding permissions requires fresh consent and new tokens.
## Choose the required scopes [#choose-the-required-scopes]
Select the mailboxes the client needs, then choose one or more scopes:
| Scope | Access |
| --------------- | -------------------------------------------------------------------------------------------------------------------------- |
| `mail.read` | List accounts, search and read messages and threads, list folders, labels, and sender identities, and download attachments |
| `mail.drafts` | Read, create, update, and delete drafts |
| `mail.send` | Preview and send messages; check send-operation status |
| `mail.organize` | Change flags and labels; archive and move messages |
| `mail.trash` | Move messages to Trash or restore them |
| `mail.delete` | Permanently delete messages where the provider permits it |
The setup and key forms offer Read only (read), Read and write (read, drafts, organize, and Trash), and Full mail access (read, drafts, organize, Trash, and send). Choose Custom to pick individual scopes or enable permanent deletion. OAuth setup defaults to Full mail access. New key forms default to Read only unless you have explicitly selected permissions in agent setup. Permanent deletion stays off in every preset.
These scopes and presets match the capabilities and permission profiles in self-hosted Fluxmail. To narrow an existing authorization, create a replacement with the intended permissions and revoke the old one in Connections or Agent keys.
The MCP URL's `scopes` query chooses what the client requests at sign-in. Changing or removing it does not change an existing grant. The approved scopes and the user's current mailbox access control every operation.
Scopes are independent. For example, an agent that reads messages and prepares replies needs both `mail.read` and `mail.drafts`. Add `mail.send` if you also want it to send. Sending a saved draft by `draftId` needs both `mail.send` and `mail.drafts`.
When replying with `replyToMessageId`, Cloud reads the original message, so the connection needs `mail.read` along with the draft or send scope. See the [operation reference](/docs/cloud/rest-api#operations-and-arguments) for each operation's required scope.
`modify_emails` checks its `action`: flags, labels, archive, and move need `mail.organize`; trash and untrash need `mail.trash`; delete needs `mail.delete`. Generic moves cannot target Trash or Archive, or move messages out of Trash. Use the dedicated actions. Gmail does not permit permanent deletion with Cloud's provider OAuth permissions, even with `mail.delete`.
## Provider consent and agent access [#provider-consent-and-agent-access]
Connecting Google, Microsoft, or an IMAP mailbox authorizes Cloud to work with your provider. Provider consent can cover more operations than you want a particular agent to use. The connection's mailbox selection and scopes enforce that agent's access inside Cloud.
An OAuth connection or agent key cannot connect mailboxes, reveal provider credentials, create other keys, change account settings, or delete your Cloud account. Use a signed-in dashboard session for those actions.
Give your agent explicit instructions before it sends or modifies mail. Messages and attachments can contain instructions written by other people; treat their contents as data. For sends, follow the [retry rules](/docs/cloud/sending#send-status-and-duplicate-protection).
## Store and replace keys [#store-and-replace-keys]
Create a separate named key in [Agent keys](https://cloud.fluxmail.ai/keys), selecting its mailboxes and scopes. Cloud displays it once and stores only its SHA-256 hash. OAuth connections and keys share a limit of 100 active authorizations per workspace.
When creating a key, choose 7, 30, 90, or 365 days, or select **Never** to keep it active until you revoke it. The form selects 90 days by default. Cloud stops accepting a key when it expires or is revoked. To change an existing key's expiration, create a replacement.
Keep tokens in a secret store or private client configuration, outside chat, Git, URLs, logs, and screenshots. If you lose a key, create a replacement and revoke the old one.
To replace a key in use:
1. Create a key with the intended mailboxes and scopes.
2. Update your client's secret and reload the connection.
3. [Verify access](/docs/cloud/mcp#verify-the-connection) using the new key's permitted tools.
4. Revoke the old key in the dashboard.
If a token is exposed, revoke it immediately. Revocation stops subsequent authenticated calls. Removing a server from your client does not revoke its Cloud key.
## Passwords and recovery [#passwords-and-recovery]
See [account settings](/docs/cloud/account#passwords-and-recovery) to change your password or recover access.
## Delete your account [#delete-your-account]
See [delete your account](/docs/cloud/account#delete-your-account) for what deletion removes. To stop one agent, revoke its connection or key instead.
---
# Cloud quickstart
URL: https://fluxmail.ai/docs/cloud/quickstart
You need a Fluxmail Cloud account and a mailbox you can authorize.
## Agent-first setup [#agent-first-setup]
Paste this prompt into your coding agent. It will help you choose mailbox access, configure your MCP client, and test the connection. You'll complete sign-in, provider consent, and agent authorization when prompted.
```text
Set up Fluxmail Cloud. Read https://fluxmail.ai/docs/cloud/setup.txt and follow the setup guide. Configure the connection, let me choose mailboxes and permissions in Fluxmail, and verify it works. Guide me through any sign-in or consent steps.
```
## Manual setup [#manual-setup]
### 1. Sign in to Cloud [#1-sign-in-to-cloud]
Open [Fluxmail Cloud](https://cloud.fluxmail.ai). If you're new, sign up with your email address and open the verification email before signing in.
### 2. Choose a plan and connect a mailbox [#2-choose-a-plan-and-connect-a-mailbox]
Select your workspace in the sidebar. If it needs a subscription, open [Billing](https://cloud.fluxmail.ai/billing) and choose a plan. The first subscription includes a seven-day trial; checkout collects payment details. If you joined another workspace, its owner manages billing. See [billing and plans](/docs/cloud/billing).
Open [Mailboxes](https://cloud.fluxmail.ai/mailboxes). Choose Gmail or Outlook and authorize the connection, or enter your provider's IMAP and SMTP settings. See [connect mailboxes](/docs/cloud/mailboxes) for provider-specific instructions.
### 3. Connect your MCP client [#3-connect-your-mcp-client]
Select the permissions your agent needs in the [MCP setup instructions](/docs/cloud/mcp#choose-agent-access): Read emails, Manage drafts, Organize emails, Move to/from Trash, Permanently delete emails, and Send emails. Use a preset to select a starting combination. Full mail access is selected by default and excludes permanent deletion. Add the selected MCP URL to your client using its instructions, then sign in to Fluxmail when it opens your browser.
### 4. Approve access [#4-approve-access]
Choose one workspace, select the mailboxes your client can use, and approve its [permissions](/docs/cloud/permissions). Every requested permission starts checked, including Send emails. You can uncheck any permission before approving. Access to all current and future mailboxes is a separate choice.
The browser returns you to your client. You can inspect and revoke the connection in [Connections](https://cloud.fluxmail.ai/connections).
For REST automation or a client without OAuth, [create an agent key](/docs/cloud/permissions#store-and-replace-keys) and follow the [REST API guide](/docs/cloud/rest-api).
### 5. Verify access [#5-verify-access]
After your client loads the server, check that its tools match the permissions you approved. If your connection includes `mail.read`, ask your agent to list your 5 most recent emails:
```text
Use Fluxmail Cloud to list my 5 most recent emails. First list
the mailboxes this connection can access, then call list_emails with the
intended accountId, pageSize: 5, and includeSnippet: false. Report whether
both calls succeeded. Do not open message bodies, send mail, create drafts,
or change messages during this check.
```
This confirms that your client is authorized and Cloud can reach your email provider. The check lists message summaries without opening message bodies or changing your mail. A successful email listing also completes the dashboard's agent onboarding step.
For a connection without `mail.read`, verify tool discovery only. Provider access remains unchecked; don't send a test message to verify it. If MCP needs a client restart, verify it after restarting. OAuth tokens authorize MCP only; a [REST check](/docs/cloud/rest-api#verify-a-read-only-connection) requires a separate read-scoped key.
If a step fails, see [troubleshooting](/docs/cloud/troubleshooting).
---
# Use the Cloud REST API
URL: https://fluxmail.ai/docs/cloud/rest-api
Call `POST https://cloud.fluxmail.ai/api/mail/{operation}` with JSON arguments and an `Authorization: Bearer` header. REST and MCP use the same operations, mailbox grants, and scopes.
You need a connected mailbox and a [Cloud agent key](/docs/cloud/permissions). The examples below use `mail.read`. Complete the [quickstart](/docs/cloud/quickstart) if you haven't created a key yet.
## Verify a read-only connection [#verify-a-read-only-connection]
Make your key available privately as `FLUXMAIL_CLOUD_AGENT_KEY` in your terminal's environment. Keep its value out of shell history, source files, and logs.
### 1. List your mailboxes [#1-list-your-mailboxes]
```bash
curl --fail-with-body https://cloud.fluxmail.ai/api/mail/list_accounts \
--header "Authorization: Bearer $FLUXMAIL_CLOUD_AGENT_KEY" \
--header 'Content-Type: application/json' \
--data '{}'
```
The response contains only mailboxes available to the key. An example response:
```json
{
"data": [
{
"id": "11111111-1111-4111-8111-111111111111",
"email": "you@example.com",
"provider": "gmail",
"shared": false,
"enabled": true
}
]
}
```
### 2. List your 5 most recent emails [#2-list-your-5-most-recent-emails]
Copy the intended mailbox's `id` into this request, replacing `MAILBOX_ID`:
```bash
curl --fail-with-body https://cloud.fluxmail.ai/api/mail/list_emails \
--header "Authorization: Bearer $FLUXMAIL_CLOUD_AGENT_KEY" \
--header 'Content-Type: application/json' \
--data '{"accountId":"MAILBOX_ID","pageSize":5,"includeSnippet":false}'
```
A successful response contains up to 5 email summaries. These two calls verify the key, its mailbox access, and the provider connection without opening message bodies or changing mail. A mailbox with fewer than 5 emails returns fewer results.
## Operations and arguments [#operations-and-arguments]
| Operation | Scope | Arguments |
| --------------------------------------------- | ---------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| `list_accounts` | `mail.read` | `{}` |
| `list_emails` | `mail.read` | `accountId`, optional filters such as `text`, `from`, `subject`, `read`, `after`, `before`, and `pageSize` (1 to 100), `pageToken` |
| `get_email` | `mail.read` | `accountId`, `messageId`, optional `includeHeaders` |
| `get_thread` | `mail.read` | `accountId`, `threadId` |
| `list_folders`, `list_labels`, `list_send_as` | `mail.read` | `accountId` |
| `download_attachment` | `mail.read` | `accountId`, `messageId`, `attachmentId` |
| `get_draft` | `mail.drafts` | `accountId`, `draftId` |
| `create_draft` | `mail.drafts` | `accountId`, message fields |
| `update_draft` | `mail.drafts` | `accountId`, `draftId`, message fields |
| `delete_draft` | `mail.drafts` | `accountId`, `draftId` |
| `preview_send` | `mail.send` | `accountId`, message fields |
| `send_email` | `mail.send`, plus `mail.drafts` with `draftId` | `accountId`, `idempotencyKey`, message fields or `draftId` |
| `get_delivery_operation` | `mail.send` | `accountId`, `operationId` |
| `modify_emails` | `mail.organize`, `mail.trash`, or `mail.delete`, depending on `action` | `accountId`, `messageIds`, `action`, and `folder` or `labels` when required |
Modification actions require `mail.organize` for flags, labels, archive, and move; `mail.trash` for trash and untrash; or `mail.delete` for permanent deletion. Generic moves cannot target Trash or Archive or restore messages from Trash.
Use IDs returned by Cloud, and include `accountId` to select a mailbox. Filters for `list_emails` are top-level fields, not a nested `query` object. Dates use `YYYY-MM-DD`. Follow returned pagination tokens; the default page size is 25.
Message fields include `to`, `cc`, and `bcc` as arrays of address strings, `subject`, `bodyText`, `bodyHtml`, optional `from`, `attachments`, `replyToMessageId`, and `replyAll`. Attachments use `filename`, `mimeType`, and base64 `content`, with optional inline-image fields. A new message or draft needs at least one recipient. Replying to a message requires `mail.read` as well as the operation's scope so Cloud can read the original.
Modification actions are `markRead`, `markUnread`, `star`, `unstar`, `archive`, `trash`, `untrash`, `delete`, `move`, `addLabels`, and `removeLabels`. `move` requires `folder`; label actions require `labels`. Permanent deletion is unavailable for Gmail OAuth connections.
## Search example [#search-example]
Send this body to `/api/mail/list_emails` with a read-scoped key:
```json
{
"accountId": "MAILBOX_ID",
"subject": "invoice",
"after": "2026-10-01",
"pageSize": 10
}
```
## Call from Node.js [#call-from-nodejs]
Save this helper in an `.mjs` file and run it with a Node.js release that includes `fetch`. Supply your key and the mailbox ID from `list_accounts` as environment variables before running it.
```js
const token = process.env.FLUXMAIL_CLOUD_AGENT_KEY;
const accountId = process.env.FLUXMAIL_CLOUD_ACCOUNT_ID;
if (!token || !accountId) {
throw new Error('Set FLUXMAIL_CLOUD_AGENT_KEY and FLUXMAIL_CLOUD_ACCOUNT_ID.');
}
async function call(operation, args) {
const response = await fetch(
`https://cloud.fluxmail.ai/api/mail/${operation}`,
{
method: 'POST',
headers: {
Authorization: `Bearer ${token}`,
'Content-Type': 'application/json',
},
body: JSON.stringify(args),
}
);
const result = await response.json();
if (!response.ok) {
const code = result.error?.code ?? response.status;
const requestId = result.requestId ?? response.headers.get('x-request-id');
throw new Error(`${operation}: ${code}; request ${requestId}`);
}
return result.data;
}
await call('list_emails', { accountId, pageSize: 5, includeSnippet: false });
console.log('Fluxmail Cloud mailbox access verified.');
```
The helper makes one request per call and leaves retries to your application. It prints neither message contents nor the key.
## Send status and duplicate protection [#send-status-and-duplicate-protection]
Every send requires an `idempotencyKey`. See [sending and retries](/docs/cloud/sending) for message examples and the steps to take after a timeout. Never retry an uncertain send with a fresh key.
## Errors and retries [#errors-and-retries]
Failures return an `error` with a code and message. Keep the `requestId` or `x-request-id` response header for troubleshooting. See [errors and retries](/docs/cloud/troubleshooting#errors-and-retries) for status codes and [limits](/docs/cloud/troubleshooting#limits) for quotas and attachment sizes.
Cloud uses `/api/mail/{operation}` paths, separate from the self-hosted package's versioned API. Agent keys cannot manage mailbox connections or create keys; use the dashboard for those actions.
---
# Sending and retries
URL: https://fluxmail.ai/docs/cloud/sending
Sending requires `mail.send` and access to the selected mailbox. Give your agent an explicit instruction to send; onboarding checks should only verify the connection.
Every `send_email` call needs an `idempotencyKey`. Generate a unique key for the intended send and save it with the request before submitting. If the response is lost, that key lets you look up what happened.
## Send a message [#send-a-message]
Pass a body like this to the MCP `send_email` tool or `POST /api/mail/send_email`. Replace the example mailbox, recipient, and key with values for your intended message:
```json
{
"accountId": "MAILBOX_ID",
"idempotencyKey": "UNIQUE_KEY_FOR_THIS_SEND",
"to": ["recipient@example.com"],
"subject": "Meeting notes",
"bodyText": "Here are the notes we discussed."
}
```
The key must contain 1 to 255 printable ASCII characters without spaces. A UUID works. Save the exact arguments alongside it.
Message fields and attachment formats are listed in the [REST reference](/docs/cloud/rest-api#operations-and-arguments). To validate recipients, the sender, and attachment sizes before sending, call `preview_send` with the message fields and a connection with `mail.send`. Omit `idempotencyKey` from the preview.
## Send a saved draft [#send-a-saved-draft]
Use the draft's ID instead of message fields:
```json
{
"accountId": "MAILBOX_ID",
"idempotencyKey": "UNIQUE_KEY_FOR_THIS_SEND",
"draftId": "DRAFT_ID"
}
```
Supply either `draftId` or message fields in a send request. Submitting a saved draft needs `mail.send` and `mail.drafts`; reading a draft with `get_draft` needs `mail.drafts`.
## Send status and duplicate protection [#send-status-and-duplicate-protection]
A successful send returns an `operationId` equal to your idempotency key, a `status` of `succeeded`, and the provider's `result`. REST wraps these fields in `data`; MCP puts them in `structuredContent.data`.
Reusing the same key with identical arguments retrieves the saved successful result. Changing the arguments under that key returns `idempotency_conflict`.
After a timeout or uncertain failure, call `get_delivery_operation` through MCP or `POST /api/mail/get_delivery_operation`:
```json
{
"accountId": "MAILBOX_ID",
"operationId": "THE_ORIGINAL_IDEMPOTENCY_KEY"
}
```
Use the returned status to decide what to do next:
| Status | Next step |
| ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `succeeded` | The provider accepted the send. The saved result is available in `result`. This does not prove recipient delivery. |
| `unknown` | Submission may have happened. Inspect Sent mail and delivery evidence before deciding whether another send is appropriate. Cloud blocks resubmission under this key. |
| `not_started` | Preparation failed before submission. Correct the error and use a new key for a new attempt. |
Cloud does not automatically retry uncertain sends. A missing send record is not proof that retrying with a new key is safe. Follow the saved send status even when an HTTP error suggests a temporary failure.
Disconnecting a mailbox deletes its send-operation records. Check uncertain sends before disconnecting; reconnecting won't restore duplicate-send protection for those records.
---
# Troubleshooting and limits
URL: https://fluxmail.ai/docs/cloud/troubleshooting
Start with the step that failed. A working dashboard login, an approved agent connection, and a working mailbox connection are separate checks.
## Sign-in and mailbox connections [#sign-in-and-mailbox-connections]
| Problem | What to do |
| -------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| An account with your email already exists | Sign in or reset your password. If you have not verified your email, request a new verification link. |
| Verification or reset link expired | Request a new link from the verification or password-recovery page. Links expire after one hour. |
| Google or Microsoft is not configured | Ask the Cloud operator to enable the provider. Self-hosted provider settings don't configure Cloud. |
| Provider consent is blocked | Check the account you selected and your organization's administrator restrictions. |
| IMAP or SMTP login fails | Check both servers, your username, and whether the provider requires an app password. Cloud validates both services before saving. |
| Mailbox authorization expired or was revoked | Reconnect the mailbox, then ask your agent to list your 5 most recent emails. |
See [connect mailboxes](/docs/cloud/mailboxes) for server settings and [account settings](/docs/cloud/account) for recovery.
## MCP connection and tools [#mcp-connection-and-tools]
If `fluxmail-cloud` does not appear, check the configuration file for your [client](/docs/cloud/mcp#choose-your-client), enable the server, and restart or reload it. The client needs Streamable HTTP and OAuth, or a custom bearer header for key authentication.
For OAuth, start sign-in again if the request expired, the connection was revoked, or refresh failed. Codex must use dynamic registration (`--oauth-client-registration dcr`); in Claude Desktop or Claude on the web, choose **Register automatically**. Cloud does not support Client ID Metadata Documents. If a key-authenticated connection fails, check that the key is still active and that the client process can read its secret. Environment-variable syntax differs between clients. After changing a launch environment, restart the app; changing an export in another terminal does not update it.
If the server connects but tools are missing, compare them with the [connection's scopes](/docs/cloud/permissions#choose-the-required-scopes). Cloud advertises only permitted tools. A tool can still fail if the connection has no access to the requested mailbox.
Opening `/mcp` in a browser sends a GET request and can return 405. This is expected: Cloud's MCP endpoint handles POST requests from an MCP client.
Listing tools verifies the MCP connection. With `mail.read`, call `list_accounts` and then `list_emails` with the intended `accountId`, `pageSize: 5`, and `includeSnippet: false` to verify access by listing your 5 most recent emails. Listing tools or accounts alone does not complete the dashboard's agent onboarding check.
## Errors and retries [#errors-and-retries]
REST failures include `error.code`, `error.message`, and a `requestId`. The `x-request-id` header also identifies the request. Keep that ID when asking for help; leave credentials and message contents out of logs.
MCP tool failures set `isError` and return the error under `structuredContent.error`.
| Response | What to check |
| ----------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| 400 | Argument names, required IDs, valid recipients, and provider restrictions |
| 401 | Missing, expired, or revoked agent authorization; an `auth_expired` provider error means reconnect the mailbox |
| 402 `subscription_required` | Ask the workspace owner to check [Billing](/docs/cloud/billing) for an expired trial or suspended subscription |
| 403 | Required scope and workspace access; `seat_required` means the workspace lacks member capacity, and `entitlement_exceeded` means the mailbox exceeds its plan limit |
| 404 | Mailbox grants or a resource that is no longer available |
| 409 `entitlement_exceeded` | Check the error message: the workspace may have reached its mailbox limit or its combined limit of 100 active agent keys and OAuth connections, or the provider may have an entitlement restriction. Review [plan capacity](/docs/cloud/billing), remove unused connections or authorizations, or check the provider's requirements. |
| 409 send conflict or uncertain submission | Check [send status](/docs/cloud/sending#send-status-and-duplicate-protection) before retrying |
| 413 | Request or decoded attachment size |
| 429 `busy` or `mailbox_busy` | Temporary capacity or another mailbox operation; honor `Retry-After` and retry read-only calls with backoff |
| 429 `rate_limited` | Check whether the workspace's hourly allowance or the provider's rate limit was reached |
| 503 `billing_unavailable` | Cloud could not verify billing; retry later or ask the workspace owner to check Billing |
| Provider failure | Reconnect if authorization has expired; otherwise check provider availability |
For workspace rate limits, wait for the next UTC hour. For provider rate limits, follow the provider's recovery guidance. Send retries must follow [sending and retries](/docs/cloud/sending), including after a timeout or temporary HTTP failure.
## Limits [#limits]
| Resource | Limit |
| ----------------------------------------------- | ----------------------------------------------------------------------- |
| Connected mailboxes | Pro: 10; Business: 20 per purchased member, pooled across the workspace |
| Active OAuth connections and agent keys | 100 combined per workspace |
| OAuth access-token lifetime | 15 minutes |
| OAuth refresh inactivity / absolute grant limit | 30 days / 90 days |
| Agent-key lifetime | 90 days by default; choose 7, 30, 90, or 365 days, or Never |
| API calls | 1,000 per workspace per UTC hour, including MCP protocol requests |
| New send attempts | 20 per workspace per UTC hour |
| Search page size | 25 by default; 1 to 100 per request |
Each downloaded attachment and the total attachments in a send can contain up to 10,000,000 decoded bytes. Downloads return base64 content.
See [billing and plans](/docs/cloud/billing) for trials, subscription access, and payment recovery, or [workspaces and members](/docs/cloud/workspaces) for invitations and capacity. Scheduled sends and remote CLI configuration are not available in Cloud.
---
# Workspaces and members
URL: https://fluxmail.ai/docs/cloud/workspaces
Your Cloud account starts with a personal workspace. You can also join a workspace through an invitation. Use the workspace dropdown in the dashboard sidebar to choose where you manage mailboxes, agent keys, members, and billing.
Mailbox connections, agent authorizations, billing, and usage belong to the selected workspace. Account settings, including your password, apply across workspaces. An agent key stays tied to the workspace where you created it; changing the dashboard selection does not move the key.
The owner can rename the workspace in [Settings](https://cloud.fluxmail.ai/settings). New personal workspaces use the owner's name; existing names stay as saved.
## Invite a member [#invite-a-member]
Only Business workspace owners can invite members. Open [Members](https://cloud.fluxmail.ai/members), enter the recipient's email address, and send the invitation. Each pending invitation reserves one purchased member slot for seven days, including when email delivery fails.
The recipient opens the invitation, signs in or creates an account, verifies the invited email address, and explicitly accepts. Creating an account alone does not join the workspace. The invitation must still be valid and the workspace must have Business capacity when accepted.
Owners can resend or revoke invitations from Members. Resending replaces the old link and starts a new seven-day reservation, subject to available capacity. Revoking or expiring an invitation releases its reservation. Invitation email is limited to twenty attempts per workspace in a rolling hour and one per recipient per minute; resends and failed attempts count.
## Owner and member access [#owner-and-member-access]
Members can view the workspace roster. Owners manage billing, invitations, workspace names, and member removal. Connecting a mailbox does not give every workspace member access to its mail. OAuth connections and agent keys use their selected mailbox grants and [permissions](/docs/cloud/permissions).
## Capacity and member removal [#capacity-and-member-removal]
Purchased Business capacity includes the owner, current members, and pending invitation reservations. Buy enough member slots in [Billing](/docs/cloud/billing) before inviting someone else.
Reducing purchased capacity can block invitation acceptance and provider access for excess members. The owner keeps access first; the remaining slots follow member user-ID order. Mailboxes beyond the plan's capacity lose provider access in creation order. These changes do not delete members' accounts.
An owner can remove a member after confirmation, even when the subscription is suspended or over capacity. Removal deletes that member's mailbox connections and agent keys in this workspace. Their account, other workspaces, and mail at their provider remain. Removing a member does not reduce purchased capacity; change that separately in Billing.
Check any [uncertain sends](/docs/cloud/sending#send-status-and-duplicate-protection) before removal, since the affected mailbox connections and send records are deleted.