The Mailloop MCP server lets an AI agent drive your sandboxes for you. Once connected, your assistant can create a capture inbox, wait for the email your app sends, read what arrived, and confirm a link works, all without leaving the chat.
It speaks the Model Context Protocol over Streamable HTTP at https://api.mailloop.io/mcp. Connect over OAuth with no API key, or pass a key in a header.
Want the agent to also know the testing workflow, not just the tools? The Mailloop plugin bundles this server with an Agent Skill in a single install.
Connecting Claude Code
Add the server with one command:
claude mcp add --transport http mailloop https://api.mailloop.io/mcp Then run /mcp in Claude Code, pick mailloop, and choose Authenticate. Approve the organization and scopes in your browser and you're connected. No API key to copy.
For Claude.ai, ChatGPT, and Claude Desktop, open Settings → Connectors → Add custom connector, paste https://api.mailloop.io/mcp, and sign in over OAuth.
Other clients
Editors that take a static config use an API key instead of OAuth. Create one in Settings → Organization → API keys and drop it into the client config below.
Cursor
{
"mcpServers": {
"mailloop": {
"url": "https://api.mailloop.io/mcp",
"headers": { "Authorization": "Bearer ml_live_xxx" }
}
}
} VS Code
{
"inputs": [
{ "type": "promptString", "id": "mailloop-key", "description": "Mailloop API key", "password": true }
],
"servers": {
"mailloop": {
"type": "http",
"url": "https://api.mailloop.io/mcp",
"headers": { "Authorization": "Bearer ${input:mailloop-key}" }
}
}
} Windsurf
{
"mcpServers": {
"mailloop": {
"serverUrl": "https://api.mailloop.io/mcp",
"headers": { "Authorization": "Bearer ml_live_xxx" }
}
}
} Zed
{
"context_servers": {
"mailloop": {
"url": "https://api.mailloop.io/mcp",
"headers": { "Authorization": "Bearer ml_live_xxx" }
}
}
} Available tools
| Tool | Description |
|---|---|
create_sandbox | Create a capture inbox for a test run, or list the ones you already have. |
create_temporary_sandbox | Create a throwaway inbox that expires on its own, handy for a single CI run. |
wait_for_email | Block until a matching email lands in a sandbox. This is the tool that makes end-to-end testing work from an agent. |
get_email | Read a captured email's sanitized content and pull out every link, so the agent can follow a confirmation or reset flow. |
send_email | Send a block-based email into a sandbox to test exactly what your app would deliver. |
create_webhook | Create, test, and inspect webhook deliveries while you build the integration. |
The agent only sees what your grant allows. Tokens are bound to a single organization and the scopes you approve, and sandbox content is sanitized before it reaches the model.
Authentication
OAuth is the simplest path. On the first call the client opens the Mailloop consent screen, you pick an organization and approve the scopes, and the client stores the token. Access tokens are short lived and refresh on their own.
Prefer a static credential? Create an API key in Settings → Organization → API keys and send it as a bearer token:
claude mcp add --transport http mailloop https://api.mailloop.io/mcp \
--header "Authorization: Bearer ml_live_xxx" Treat the key like a password. It carries the same access as the organization member who created it.
Troubleshooting
Authentication never completes. Make sure your client can open a browser for the OAuth redirect. In headless or CI runs, use an API key in a header instead.
Tools do not appear. Confirm the server is reachable at https://api.mailloop.io/mcp and that you finished /mcp authentication. Restart the client after adding the server.
401 Unauthorized. Your token expired or the API key was revoked. Re-authenticate, or create a fresh key in the dashboard.
wait_for_email times out. Check that your app actually sent to the sandbox address and that the subject or recipient filter matches the message you expect.