MCP server
One click to connect.
Add this URL to any MCP client that supports remote servers. The first time it connects, you sign in to Mail and choose what it may do. The client registers itself, so there are no keys to create.
https://email-api.appwrite.network/mcpClaude Code:
claude mcp add --transport http mail https://email-api.appwrite.network/mcp| Tool | Scope | What it does |
|---|---|---|
| get_mailbox | mail.read | Your address, name and inbox counts |
| list_messages | mail.read | List or full-text search any folder |
| read_message | mail.read | Full message with attachment links |
| read_thread | mail.read | A whole conversation, oldest first |
| list_labels | mail.read | Your labels and their IDs |
| send_email | mail.send | Send a new message from your address |
| reply_to_email | mail.send | Reply in the same conversation |
| update_messages | mail.modify | Read, star, label, archive, move, trash |
Authentication
OAuth 2.1, or a personal key.
OAuth 2.1 for apps
The authorization server is an Appwrite project: authorization code with PKCE, dynamic client registration, refresh token rotation and resource indicators. Point any OAuth library at the discovery document.
API keys for scripts
Create a key in Settings → API keys with just the permissions it needs, and send it as a bearer token. Revoke it any time.
Discovery document:
https://fra.cloud.appwrite.io/v1/oauth2/6ae21f6271db427f12bc/.well-known/openid-configurationmail.readRead messages, threads and labelsmail.sendSend email and repliesmail.modifyMark, star, label, move and deleteREST API
Simple, JSON, predictable.
Base URL https://email-api.appwrite.network. Every request sends Authorization: Bearer <token>. Errors return a JSON message with a 4xx status.
/v1/memail.readYour mailbox/v1/messagesmail.readList or search: folder, q, unread, starred, label, limit, cursor/v1/messages/{id}mail.readOne message; ?html=true adds the HTML body/v1/threads/{id}mail.readA conversation/v1/labelsmail.readYour labels/v1/messagesmail.sendSend: to, cc, bcc, subject, text or html; replyTo for replies/v1/messages/{id}mail.modifyUpdate: read, starred, folder, addLabels, removeLabels/v1/messagesmail.modifyUpdate many: same fields plus ids/v1/messages/{id}mail.modifyMove to TrashSearch your inbox:
curl "https://email-api.appwrite.network/v1/messages?q=invoice&unread=true" \
-H "Authorization: Bearer $MAIL_KEY"Send a message:
curl -X POST "https://email-api.appwrite.network/v1/messages" \
-H "Authorization: Bearer $MAIL_KEY" \
-H "Content-Type: application/json" \
-d '{"to": ["ada@example.com"], "subject": "Hello", "text": "Sent from the API."}'Archive and mark read:
curl -X PATCH "https://email-api.appwrite.network/v1/messages/<id>" \
-H "Authorization: Bearer $MAIL_KEY" \
-H "Content-Type: application/json" \
-d '{"folder": "archive", "read": true}'