mailsocket — MCP server
An MCP server that exposes mailsocket to AI coding agents as native tools, so an agent can create a throwaway inbox and block on the OTP or magic link without writing any polling code. It wraps the Python SDK — no second HTTP client, no re-implemented polling.
What it does
| Tool | What the agent gets |
|---|---|
create_inbox(label?) |
a fresh inbox id + address |
wait_for_otp(inbox_id, timeout?=60, min_confidence?=0) |
the headline — blocks (bounded: requested deadline clamped to 120s locally, 55s on the remote server) and returns the OTP string + confidence + subject/from |
wait_for_link(inbox_id, timeout?=60) |
the extracted magic link (returned, not followed) |
list_inboxes(limit?, cursor?) |
one page of inboxes owned by the key (server default page size 25) + next_cursor/has_more |
list_messages(inbox_id, has_otp?, subject_contains?, sender?, limit?, cursor?) |
one page of messages, optionally filtered (server default page size 25) + next_cursor/has_more |
get_latest(inbox_id) |
the newest message, without blocking |
delete_inbox(inbox_id) |
remove an inbox when done |
Errors from the SDK (AuthError / NotFound / RateLimited / WaitTimeout)
are turned into clean MCP tool errors — no stack traces, and the API key is
never echoed back.
Requirements
- Python 3.10+
- A mailsocket API key — from the dashboard or
POST /api/v1/agents/register.
Install
No install needed with uv:
uvx mailsocket-mcp
Or install with pip:
pip install mailsocket-mcp
mailsocket-mcp
Either way, it reads MAILSOCKET_API_KEY (and optional
MAILSOCKET_BASE_URL) from the environment. If the key is missing it exits
with a clear message and status 2; the key is never logged.
Register with an MCP client
Claude Desktop / Cursor
Add this to your client's MCP config file — claude_desktop_config.json for
Claude Desktop, ~/.cursor/mcp.json for Cursor:
{
"mcpServers": {
"mailsocket": {
"command": "uvx",
"args": ["mailsocket-mcp"],
"env": {
"MAILSOCKET_API_KEY": "ms_live_..."
}
}
}
}
Claude Code CLI
claude mcp add mailsocket -e MAILSOCKET_API_KEY=ms_live_... -- uvx mailsocket-mcp
Any other MCP-compatible client works the same way: point it at the
mailsocket-mcp executable (or uvx mailsocket-mcp) over stdio and pass the
key through the environment.
Remote server (no install)
The same tools are hosted at https://mcp.mailsocket.app/mcp over
Streamable HTTP. Send your key on every request as a header:
Authorization: Bearer ms_live_.... Never put the key in the URL; a
?api_key= request is rejected.
Claude Code CLI
claude mcp add --transport http mailsocket https://mcp.mailsocket.app/mcp \
--header "Authorization: Bearer ms_live_..."
Cursor (~/.cursor/mcp.json)
{
"mcpServers": {
"mailsocket": {
"url": "https://mcp.mailsocket.app/mcp",
"headers": { "Authorization": "Bearer ms_live_..." }
}
}
}
VS Code (.vscode/mcp.json)
{
"servers": {
"mailsocket": {
"type": "http",
"url": "https://mcp.mailsocket.app/mcp",
"headers": { "Authorization": "Bearer ms_live_..." }
}
}
}
Any client that can set a custom HTTP header works the same way (OpenAI Agents SDK, the n8n MCP Client node, your own code).
Things to know:
- Claude.ai, Claude Desktop connectors and Smithery need OAuth, which is planned but not available yet. Until then, use the local stdio server above in those clients (Claude Desktop), or use a header-capable client.
- On the remote server,
wait_for_otp/wait_for_linkwait at most 55s per call, which keeps each response under proxy timeouts. On a timeout, call the tool again. - The server is stateless: no session to keep, and every request is authenticated on its own. It has no key of its own and only acts with yours, under your normal API rate limits.
- Self-hosting:
mailsocket-mcp-httpruns the same server (seemailsocket_mcp/remote.pyfor its env vars).
Env vars
| Variable | Required | Description |
|---|---|---|
MAILSOCKET_API_KEY |
yes (secret) | Your mailsocket API key (ms_live_...). |
MAILSOCKET_BASE_URL |
no | Override the API base URL. Defaults to https://dash.mailsocket.app/api/v1. |
Develop
pip install -e ".[dev]"
pytest
Tests are fully offline — the SDK client is faked, so nothing touches the live API.
Release files for mailsocket-mcp 0.2.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| mailsocket_mcp-0.2.1.tar.gz | 35.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| mailsocket_mcp-0.2.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 55.4 kB
Release files / mailsocket_mcp-0.2.1.tar.gz
| Download URL | mailsocket_mcp-0.2.1.tar.gz |
|---|---|
| Size | 35.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
62482becc7c0359a48ffff47d5d39956aa71f3ce9ac5aa3ea0326a80974ce153
|
|
BLAKE2b-256 checksum How to use checksums |
86fd7f00d1758a34e6f366b4657fc723fcafa1abc580d9c238739de45eac0593
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.12
|
Release files / mailsocket_mcp-0.2.1-py3-none-any.whl
| Download URL | mailsocket_mcp-0.2.1-py3-none-any.whl |
|---|---|
| Size | 20.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
914ca94c83a7f0e2d146b56839687917c815294b633dca343309b50bb009aaaa
|
|
BLAKE2b-256 checksum How to use checksums |
4204d3bbac0da59e2a116a96bf03d1a7dabbfa191a4d3f5446aea1adfce07f6f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.12
|