Skill or MCP? A skill is markdown that teaches an agent to use tools it already has — it needs a shell and gives you full control of the API. MCP delivers the tools themselves, which is the only option for a client that cannot run
curl. For Claude Code either works; for Cursor and Grok, MCP is the way in.Connect
- Claude Code
- Cursor
- Grok
- Any client
wai_ developer key works, as does a native aik_ mailbox key — see Authentication. The server is scoped exactly as the key is: a workspace key reaches that workspace’s inboxes and nothing else.
The tools
Every tool carries annotations, so a client that asks before acting can tell a search from something that mails a real person. The three marked
openWorldHint are the ones that put a message in front of someone; a draft stays local until send_draft.
You can usually omit inbox_id
Every tool takes an inbox_id — the inbox’s address, which is also its id. Leave it out and the server uses the only inbox your key can see. With more than one it refuses to guess and tells the agent to call list_inboxes, rather than picking one and silently mailing from the wrong address.
Errors reach the model, not the transport
A rejected call comes back as a tool result withisError: true and the API’s own message, not a JSON-RPC error:
Instructions worth adding
The server sends its own guidance oninitialize, but clients differ in how much of it they surface. If yours ignores it, put this in your system prompt:
Limits
Stateless: there are no sessions and no server-initiated messages, soGET /mcp returns 405 rather than opening an SSE stream that would carry nothing. Notifications are accepted and acknowledged with 202.
There is no tool for inbound events. MCP is request/response, so an agent sees mail when it looks. For one that reacts on its own, use webhooks or the WebSocket from your own backend.
The general limits apply here too — cold outbound is unreliable, and attachment bodies are not stored.

