Back to Directory/Communication

EmptyInbox

Zero-config disposable email inboxes for AI agents: create, read mail, await verify codes.

CommunicationHTMLv1.3.0

EmptyInbox

Disposable email inbox API for AI agents and developers. Create temporary email addresses, receive messages, and read content — via REST API or MCP server.

Live at emptyinbox.me

MCP Server (Claude / Claude Code / Cursor / any MCP agent)

npm · Official MCP Registry: io.github.cnohall/emptyinbox · source and tool reference

Zero config. No API key: the server registers an account on its first tool call.

claude mcp add emptyinbox -- npx -y emptyinbox-mcp
{
  "mcpServers": {
    "emptyinbox": {
      "command": "npx",
      "args": ["-y", "emptyinbox-mcp"]
    }
  }
}

Free inboxes to start. More are bought with Bitcoin from inside the agent session: buy_quota returns a payment page with a QR code for the user, and credits land within seconds of the payment being broadcast.

REST API

Base URL: https://emptyinbox.me/api Auth: Authorization: Bearer <api_key> OpenAPI spec: https://emptyinbox.me/openapi.yaml

# Create an inbox
curl -X POST -H "Authorization: Bearer YOUR_KEY" https://emptyinbox.me/api/inbox

# List messages — filter to one inbox, only what arrived since the last poll
curl -H "Authorization: Bearer YOUR_KEY" \
  "https://emptyinbox.me/api/messages?inbox=ADDRESS&since=1711234000&include_body=false"

# Read a message
curl -H "Authorization: Bearer YOUR_KEY" https://emptyinbox.me/api/message/MSG_ID

# ...or as flat text, ready to drop into a prompt
curl -H "Authorization: Bearer YOUR_KEY" "https://emptyinbox.me/api/message/MSG_ID?format=text"

Every message comes back parsed, so nothing has to pick through the HTML:

{
  "subject": "Confirm your email address",
  "from_name": "Example App",
  "from_email": "noreply@example.com",
  "received_at": "2024-03-23T21:36:07Z",
  "type": "verification",
  "code": "482910",
  "action_url": "https://example.com/verify?token=abc123",
  "links": [{ "url": "https://example.com/verify?token=abc123", "text": "Verify your email" }],
  "preview": "Your verification code is 482910. It expires in 10 minutes.",
  "text": "Your verification code is 482910. It expires in 10 minutes."
}

text is the body flattened to plain text (from the HTML part when there is no text part), code is the best one-time code found, action_url the single link worth opening. ?format=raw still returns the untouched MIME parts.

Typical agent workflow

  1. POST /api/inbox → get a disposable address
  2. Use that address in an external signup or verification flow
  3. GET /api/messages?inbox=<address>&since=<last timestamp> → poll until the verification email appears
  4. Read code or action_url straight off the message — the API extracts both

Local Development

Backend (Flask, port 5000)

cd api
pipenv install
pipenv run create_db   # first run only — creates SQLite DB
pipenv run dev         # starts python tempmail_api.py with CORS + /api prefix

api/.env for local dev:

DOMAIN=localhost:8000
SECRET=any_random_string
FLASK_ENV=development
BLOCKONOMICS_API_KEY=<key>
USDT_RECEIVING_ADDRESS=<address>
MATCH_CALLBACK=ngrok

Frontend (static, port 8000)

cd static
python -m http.server 8000

Open http://localhost:8000. The JS auto-detects localhost and hits http://localhost:5000 for the API (static/utils/constants.js).


Self-hosting

Requirements

  • Ubuntu server
  • Python 3 + pipenv
  • Nginx
  • Postfix

Setup

1. Clone and configure

git clone https://github.com/blockonomics/emptyinbox-me
cd emptyinbox-me/api
cp .env.example .env   # fill in your values

.env variables:

DOMAIN=yourdomain.com
SECRET=your_postfix_webhook_secret
FLASK_ENV=production
BLOCKONOMICS_API_KEY=your_blockonomics_api_key
USDT_RECEIVING_ADDRESS=your_usdt_address
MATCH_CALLBACK=https://yourdomain.com/api/payments/callback

2. Database

pipenv install
pipenv run create_db

3. Gunicorn

pipenv run start

4. Nginx

sudo cp nginx/emptyinbox_nginx.conf /etc/nginx/sites-available/emptyinbox_nginx.conf
sudo nginx -t && sudo systemctl reload nginx

5. Postfix

sudo apt install postfix   # select "No configuration"
sudo cp /usr/share/postfix/main.cf.debian /etc/postfix/main.cf
sudo postfix/setup_postfix.sh YOUR_HOSTNAME YOUR_DOMAIN YOUR_SECRET

Pricing

  • Free: 5 inboxes per account
  • Paid: 1 USDT per 10 additional inboxes (via Blockonomics — no credit card, no KYC)

Installation

Source-derived launch command. Check the maintainer’s required arguments and credentials before running:

bash
npx -y emptyinbox-mcp

Set up in your AI client

Merge this template into ~/Library/Application Support/Claude/claude_desktop_config.json. Keep existing servers. Add any arguments, credentials, and permissions required by the maintainer; this template has not been install-tested.

json
{
  "mcpServers": {
    "io-github-cnohall-emptyinbox": {
      "command": "npx",
      "args": [
        "-y",
        "emptyinbox-mcp"
      ]
    }
  }
}

Restart Claude Desktop completely for changes to take effect. Confirm the server appears connected in the client’s tool list, then try a read-only example from its documentation.

Claude Desktop setup reference

Package

emptyinbox-mcpnpm

Compatible MCP Clients

EmptyInbox works with any MCP-compatible client. Copy the config snippet from the Configuration section above and add it to the file shown for your client, then restart the application.

  • Claude Desktop~/Library/Application Support/Claude/claude_desktop_config.jsonRestart Claude Desktop completely for changes to take effect.
  • Cursor~/.cursor/mcp.jsonRestart Cursor for changes to take effect.
  • VS Code.vscode/mcp.jsonReload VS Code window for changes to take effect.
  • Windsurf~/.codeium/windsurf/mcp_config.jsonRestart Windsurf for changes to take effect.
  • Claude Code.mcp.jsonSave at the project root, then start Claude Code in that project and review the MCP server approval prompt. Keep real credentials out of shared files.

Learn More