Install
openclaw skills install @sendmux.ai/sendmux-mcp-setupConnect OpenClaw and other agent clients to hosted or local Sendmux MCP servers for mailbox, sending, and management tools.
openclaw skills install @sendmux.ai/sendmux-mcp-setupThis ClawHub skill connects OpenClaw agents to Sendmux. Some workflows require a Sendmux account and an appropriate Sendmux API key or agent token. Sendmux account usage is external to ClawHub; do not ask users to paste secrets into chat.
Use this skill to connect an agent client to Sendmux through MCP.
sendmux-getting-started and sendmux agent:register; configure MCP only after the user chooses MCP and authorised OAuth or secret-backed local credentials exist.smx_mbx_ keys or scoped smx_agent_ tokens for local Mailbox MCP tools.smx_mbx_ keys or owner-approved Sending-resource smx_agent_ tokens for local Sending MCP tools.smx_root_ keys for local Management MCP tools.https://mcp.sendmux.ai/mcp when the client supports remote MCP OAuth.sendmux-mailbox:mailbox_search_message_snippets when a client needs fully-qualified tool names.mcpServers object; provide configuration only for a named client.pip install sendmux-mcp
This guide targets the released sendmux-mcp 2.1.3 package as a historical catalogue reference. The package speaks MCP protocol revisions 2025-11-25 and 2026-07-28 over stdio or Streamable HTTP. The released catalogue contains 54 tools: 26 Mailbox, 22 Management, and 6 Sending. The unpublished candidate source declares package version 2.2.0 and its catalogue contains 64 tools: 35 Mailbox, 23 Management, and 6 Sending; those counts do not prove a new package has been published. Selected surfaces and OAuth grants determine which subset a credential can see.
Console scripts:
sendmux-mcp — combined local server; requires --surfaces or SENDMUX_MCP_SURFACES.sendmux-mcp-mailbox — mailbox-only local server.sendmux-mcp-management — management-only local server.sendmux-mcp-sending — sending-only local server.sendmux-mcp-hosted — hosted runtime; do not use this for normal local agent setup.| Setup | Use when | Auth |
|---|---|---|
| Hosted remote | The client supports remote MCP OAuth. | Client signs in through Sendmux OAuth; do not pass API keys. |
| Local stdio | The agent runs a local child process. | Env vars passed to the server process. |
| Local HTTP bearer | A local/private MCP endpoint is shared by one or more clients. | Sendmux API key in server env; Authorization: Bearer ... from client to MCP server. |
Agent inbox registration is CLI-first. MCP is a runtime surface, not a registration instruction authority; do not extract a credential from a CLI agent profile merely to force local MCP setup. Prefer the durable CLI profile for terminal mailbox work or hosted OAuth when the user chooses MCP.
Hosted MCP OAuth and REST OAuth use separate resources; do not reuse a REST access token as the hosted MCP bearer.
Standard dynamic client registration can omit resource; that produces a valid resource-neutral registration and is not by itself a reason to re-register. Check each later binding separately: the client authorisation request must target exactly https://mcp.sendmux.ai/mcp; the Sendmux OAuth authorisation server owns the approved grant and must store that exact resource restriction; and the token it issues must have that exact audience. A client such as Atlassian controls its requests and connection OAuth UI, but it cannot edit the grant stored by Sendmux. If the request fields are correct and invalid_target persists, investigate the Sendmux authorisation-server grant state before blaming the client or re-registering; do not claim any failure stage is more common without actual evidence. For Atlassian, use its connection OAuth UI, not a client-unspecified /mcp auth or another slash command. Configuration shapes and authentication commands elsewhere in this guide apply only to their named client. A REST bearer presented to the MCP resource server is still invalid for that audience, but do not predict the resource server's rejection shape from an authorisation-stage error.
| Surface | Key | Tool count | Example tools |
|---|---|---|---|
| Mailbox | smx_mbx_ or scoped smx_agent_ | 35 | mailbox_list_granted_mailboxes, mailbox_search_message_snippets, mailbox_get_attachment, mailbox_upload_attachment, mailbox_wait_for_message |
| Management | smx_root_ | 23 | management_create_domain, management_create_mailbox, management_create_mailbox_key, management_get_spend_summary, management_create_webhook |
| Sending | Send-capable smx_mbx_ or owner-approved Sending-resource smx_agent_ | 6 | sending_send_email, sending_send_email_batch, sending_upload_attachment, sending_create_attachment_upload, sending_get_attachment |
Compatibility notes must distinguish the unpublished candidate source catalogue of 64 tools: 35 Mailbox, 23 Management, and 6 Sending from the released 2.1.3 catalogue above. Do not describe a credential-visible subset as the catalogue.
Hosted tool visibility depends on the approved grant. For multi-mailbox grants, call mailbox_list_granted_mailboxes first and pass the returned mailbox_id to mailbox tools when targeting a mailbox. Client examples in this guide are documented configurations, not claims that the client is certified compatible; verify the chosen client separately.
Attachment upload mode depends on transport and send surface:
file_path or shared filesystem roots. SDK and CLI file helpers remain the local-file convenience surfaces.content_base64 only for tiny agent-authored content up to 32,768 decoded bytes. Keep real-file bytes and larger content out of model context.mailbox_upload_attachment with presign_upload_url=true, filename, content_type, and exact size_bytes. Transfer the bytes externally with the exact returned method, URL, and headers, without a Sendmux bearer on that upload request; a successful upload supplies the blob_id for the Mailbox workflow. Mailbox upload modes accept at most 7,500,000 bytes.sending_create_attachment_upload with the same file metadata and treat its returned max_size_bytes as authoritative. If the file fits, transfer it with the exact returned method, URL, and headers, then use the successful upload's attachment_id, not its temporary upload_id or a Mailbox blob_id.sendmux-attachments for the complete transfer boundary.Mailbox-only stdio:
SENDMUX_API_KEY="$SENDMUX_MBX_KEY" sendmux-mcp-mailbox
Management-only stdio:
SENDMUX_API_KEY="$SENDMUX_ROOT_KEY" sendmux-mcp-management
Sending-only stdio:
SENDMUX_API_KEY="$SENDMUX_MBX_KEY" sendmux-mcp-sending
Combined stdio:
SENDMUX_MCP_SURFACES=mailbox,management,sending \
SENDMUX_MAILBOX_API_KEY="$SENDMUX_MBX_KEY" \
SENDMUX_MANAGEMENT_API_KEY="$SENDMUX_ROOT_KEY" \
SENDMUX_SENDING_API_KEY="$SENDMUX_MBX_KEY" \
sendmux-mcp
Local HTTP bearer:
SENDMUX_API_KEY="$SENDMUX_MBX_KEY" \
SENDMUX_MCP_HTTP_BEARER_TOKEN="$SENDMUX_MCP_HTTP_BEARER_TOKEN" \
sendmux-mcp-mailbox --transport http --host 127.0.0.1 --port 8765 --path /mcp
Client header for that local HTTP server:
Authorization: Bearer $SENDMUX_MCP_HTTP_BEARER_TOKEN
/health returns selected surfaces for local HTTP servers.
Cursor reads an mcpServers object and expands ${env:NAME} from its launch environment.
Local stdio, one mailbox server:
{
"mcpServers": {
"sendmux-mailbox": {
"type": "stdio",
"command": "sendmux-mcp-mailbox",
"env": {
"SENDMUX_API_KEY": "${env:SENDMUX_MBX_KEY}"
}
}
}
}
Local stdio, all three surfaces:
{
"mcpServers": {
"sendmux": {
"type": "stdio",
"command": "sendmux-mcp",
"args": ["--surfaces", "mailbox,management,sending"],
"env": {
"SENDMUX_MAILBOX_API_KEY": "${env:SENDMUX_MBX_KEY}",
"SENDMUX_MANAGEMENT_API_KEY": "${env:SENDMUX_ROOT_KEY}",
"SENDMUX_SENDING_API_KEY": "${env:SENDMUX_MBX_KEY}"
}
}
}
}
Local/private HTTP bearer:
{
"mcpServers": {
"sendmux-local-http": {
"url": "http://127.0.0.1:8765/mcp",
"headers": {
"Authorization": "Bearer ${env:SENDMUX_MCP_HTTP_BEARER_TOKEN}"
}
}
}
}
Hosted remote OAuth:
{
"mcpServers": {
"sendmux": {
"url": "https://mcp.sendmux.ai/mcp"
}
}
}
Client notes:
.cursor/mcp.json or global config at ~/.cursor/mcp.json; Cursor interpolates ${env:NAME} in command, args, env, url, and headers.${env:NAME} references in env or headers. For a remote Sendmux entry, set type to streamableHttp; omission defaults to legacy SSE.cline mcp wizard rather than assuming the IDE's config path or interpolation. The CLI does not expand ${env:NAME} in MCP JSON, and a literal env value overrides the inherited environment. For local stdio, load the exact SENDMUX_MAILBOX_API_KEY, SENDMUX_MANAGEMENT_API_KEY, or SENDMUX_SENDING_API_KEY value from the secret store into Cline's environment and omit env from the server entry; keep command and --surfaces as needed. For hosted OAuth, use explicit type: "streamableHttp" and url with no bearer header. Do not configure a CLI local-HTTP bearer through an unexpanded secret reference.~/.codeium/windsurf/mcp_config.json or Settings > Tools > Windsurf Settings > Add Server. Their HTTP config accepts serverUrl or url, and supports environment interpolation. This is not a Devin Local agent configuration.Install the sendmux-mcp package first, then add the selected server to Claude Code.
Hosted remote OAuth:
claude mcp add --transport http sendmux https://mcp.sendmux.ai/mcp
Then run /mcp and complete the sign-in flow if prompted.
Local stdio:
{
"mcpServers": {
"sendmux-mailbox": {
"type": "stdio",
"command": "sendmux-mcp-mailbox",
"args": [],
"env": {
"SENDMUX_API_KEY": "${SENDMUX_MBX_KEY}"
}
}
}
}
Local HTTP bearer:
{
"mcpServers": {
"sendmux-local-http": {
"type": "http",
"url": "http://127.0.0.1:8765/mcp",
"headers": {
"Authorization": "Bearer ${SENDMUX_MCP_HTTP_BEARER_TOKEN}"
}
}
}
}
Merge those entries into project .mcp.json. Load SENDMUX_MBX_KEY and SENDMUX_MCP_HTTP_BEARER_TOKEN from the user's secret store into Claude Code's launch environment. Claude Code expands ${VAR} in env and headers; keep the values in that environment instead of expanding them into claude mcp add arguments.
Use ~/.codex/config.toml for user-level config.
Local stdio:
[mcp_servers.sendmux_mailbox]
command = "sendmux-mcp-mailbox"
env_vars = ["SENDMUX_API_KEY"]
Run Codex with SENDMUX_API_KEY set to an smx_mbx_ key.
Combined stdio:
[mcp_servers.sendmux]
command = "sendmux-mcp"
args = ["--surfaces", "mailbox,management,sending"]
env_vars = ["SENDMUX_MAILBOX_API_KEY", "SENDMUX_MANAGEMENT_API_KEY", "SENDMUX_SENDING_API_KEY"]
Hosted remote OAuth:
[mcp_servers.sendmux]
url = "https://mcp.sendmux.ai/mcp"
oauth_resource = "https://mcp.sendmux.ai/mcp"
Local HTTP bearer:
[mcp_servers.sendmux_local_http]
url = "http://127.0.0.1:8765/mcp"
bearer_token_env_var = "SENDMUX_MCP_HTTP_BEARER_TOKEN"
VS Code stores MCP config in .vscode/mcp.json or user profile mcp.json under servers.
Local stdio:
{
"inputs": [
{
"type": "promptString",
"id": "sendmux-mbx-key",
"description": "Sendmux mailbox API key",
"password": true
}
],
"servers": {
"sendmuxMailbox": {
"type": "stdio",
"command": "sendmux-mcp-mailbox",
"env": {
"SENDMUX_API_KEY": "${input:sendmux-mbx-key}"
}
}
}
}
Local HTTP bearer:
{
"inputs": [
{
"type": "promptString",
"id": "sendmux-mcp-token",
"description": "Sendmux local MCP bearer token",
"password": true
}
],
"servers": {
"sendmuxLocalHttp": {
"type": "http",
"url": "http://127.0.0.1:8765/mcp",
"headers": {
"Authorization": "Bearer ${input:sendmux-mcp-token}"
}
}
}
}
Hosted remote OAuth:
{
"servers": {
"sendmux": {
"type": "http",
"url": "https://mcp.sendmux.ai/mcp"
}
}
}
GitHub Copilot CLI reads persistent servers from ~/.copilot/mcp-config.json. Keep secret values in the Copilot launch environment and use literal variable references in the file:
{
"mcpServers": {
"sendmux-mailbox": {
"type": "local",
"command": "sendmux-mcp-mailbox",
"args": [],
"env": {
"SENDMUX_API_KEY": "${SENDMUX_MBX_KEY}"
},
"tools": ["*"]
},
"sendmux": {
"type": "http",
"url": "https://mcp.sendmux.ai/mcp",
"tools": ["*"]
},
"sendmux-local-http": {
"type": "http",
"url": "http://127.0.0.1:8765/mcp",
"headers": {
"Authorization": "Bearer ${SENDMUX_MCP_HTTP_BEARER_TOKEN}"
},
"tools": ["*"]
}
}
}
Gemini CLI reads mcpServers from settings.json.
Local stdio:
{
"mcpServers": {
"sendmux-mailbox": {
"command": "sendmux-mcp-mailbox",
"env": {
"SENDMUX_API_KEY": "$SENDMUX_MBX_KEY"
},
"trust": false
}
}
}
Hosted remote OAuth:
{
"mcpServers": {
"sendmux": {
"httpUrl": "https://mcp.sendmux.ai/mcp",
"trust": false
}
}
}
Local HTTP bearer:
{
"mcpServers": {
"sendmux-local-http": {
"httpUrl": "http://127.0.0.1:8765/mcp",
"headers": {
"Authorization": "Bearer $SENDMUX_MCP_HTTP_BEARER_TOKEN"
},
"trust": false
}
}
}
Use /mcp auth sendmux if the hosted remote endpoint needs OAuth authentication.
After adding the server:
management_* or sending_* tools.mailbox_* or sending_* tools.sending_get_connection, sending_send_email, sending_send_email_batch, and Sending attachment tools.mailbox_get_connection.management_get_connection.sending_get_connection; no email is sent.401, check the client Authorization header against SENDMUX_MCP_HTTP_BEARER_TOKEN.smx_mbx_ or appropriately scoped smx_agent_; Sending accepts send-capable smx_mbx_ or owner-approved Sending-resource smx_agent_; Management requires smx_root_.sendmux-getting-started.sendmux-send-email.sendmux-mailbox-agent.sendmux-attachments.sendmux-management.sendmux-cli.sendmux-token-efficient-usage.