Atomic Mail Agentic
OfficialThis server gives agents a self-service Atomic Mail inbox and a full JMAP email API with built-in docs.
Register a permanent @atomicmail.ai inbox via proof-of-work signup; idempotent for the same username, returns inbox, accountId, and API key.
Send JMAP method-call batches inline with
opsor from preset files withops_file, with automatic auth.Substitute
$PLACEHOLDERvalues viavars.Attach local files to messages; uploads happen before JMAP operations.
Preview a request without sending using
dry_run.Use separate
credentials_dirpaths to manage multiple isolated accounts.Retrieve built-in documentation via
helpcovering overview, installation, auth, JMAP cheatsheet, tools, presets, cron, multi-account, troubleshooting, and readme.
Enables GitHub Copilot agents to manage an @atomicmail.ai inbox, including sending, receiving, and organizing email via JMAP API.
Enables Hermes agents to manage an @atomicmail.ai inbox, including sending, receiving, and organizing email via JMAP API.
Atomic Mail Agentic
Give your agent a real inbox
Accounts are free, with a 100 MB storage quota, custom domain included, and rate limits sized for agent workloads.
Atomic Mail Agentic is an email provider for autonomous AI agents, built by Atomic Mail. Agents register their own @atomicmail.ai inbox and manage it end to end โ no human setup, verification, or ongoing intervention.
The service is built on JMAP (RFC 8620), so agents get a full mailbox API: read and send mail, create drafts, manage threads, search, and more. JMAP is well represented in LLM training data, so models already speak it fluently โ they rarely hallucinate request shapes, which means fewer retries and more reliable automation.
Access is gated by a novel proof-of-work (PoW) signup protocol: strong anti-abuse properties without CAPTCHAs or manual approval, so agents can onboard and operate completely hands-free.
Atomic Mail provides a number of standard integration paths โ MCP, AgentSkill, REST API, and more โ which makes it highly available on any agent: Claude Code, Codex, GitHub Copilot, Cursor, Hermes, OpenClaw, Pi, Kilo Code, and others. Whatever your workflow is, you can automate inbox management easily.
This repository ships the client integrations: MCP, shell CLI, ClawHub, Dify plugin and more, exposing those APIs through three tools: register, jmap_request, and help. All the connectors in this repo are pretty thin and are mainly needed to abstract away the complexities of the PoW protocol.
๐ Quick Install
๐ฌ Ready Prompt (any agent)
Read the instruction at https://atomicmail.ai (use default web_fetch tool or curl, if the former is not available) and create an inbox at Atomic Mail. Before creating ask for my preferred username. Make sure to complete all required post-install actions from the Atomic Mail instruction. Persist the instruction and make sure to refer it each time you interact with your inboxes. Usually standalone agents (e.g. Claude, Cursor, Kilo Code and others) are better suited for MCP use, while CLI-based agents (e.g. Claude Code, Open Code, Hermes, OpenClaw, Codex, Pi, etc) are better suited for AgentSkill use, but prefer your system/user guidelines.๐ MCP (stdio)
Add this to your MCP host config (or just ask your agent to do that):
{
"mcpServers": {
"atomicmail": {
"command": "npx",
"args": ["-y", "@atomicmail/mcp-github"]
}
}
}Then restart the host and ask your agent to create an inbox.
๐ฆ ClawHub
openclaw skills install atomicmail๐ฉ๐ป Hermes
hermes skills install clawhub/atomicmail๐ป AgentSkill
npx --package=@atomicmail/agent-skill-github atomicmail register --username "myagent" --watch scheduled
npx --package=@atomicmail/agent-skill-github atomicmail jmap_request --ops-file list_inbox.json
npx --package=@atomicmail/agent-skill-github atomicmail helpโ๏ธ REST API
For custom connectors and advanced logic only
Refer to documentation: docs/rest-auth.md.
Related MCP server: mcp-imap
๐ Custom Domains & Dashboard
By default an inbox lives at <name>@atomicmail.ai, created hands-free through PoW signup. To send from your own domain (support@yourcompany.com), set it up once in the dashboard โ a human control plane separate from the agent flow, since it needs DNS changes on a domain you own.
There you add and verify a domain (TXT ownership + MX records; re-runnable, propagation usually minutes) and create inboxes on it โ each gets a full address (agent@yourcompany.com) and an API key from the Connect dialog, with sending signed for a domain-aligned From.
Clients don't change โ same jmap_request, presets, and JMAP shapes. A custom-domain inbox is a login, not a PoW registration: connect with its API key (atomicmail register --api-key "โฆ") or OAuth. $INBOX resolves to the real address (agent@yourcompany.com), so self-addressing and From stay correct with no extra config.
Full guide: docs/custom-domains.md.
๐ค What Your Agent Can Do
Atomic Mail is designed to run through an agent โ not through manual inbox setup. You describe a workflow in plain language; the agent registers an @atomicmail.ai address, sends and receives mail, and keeps the thread going. You do not configure scripts, copy API keys between tabs, or memorize JMAP. Everything is automagical.
If the agent gets stuck, the integration is built to recover on its own: help ships embedded docs (presets, cron, troubleshooting), bundled JSON presets cover common operations, and errors include hints on what to try next.
Example workflows
Newsletter digest โ "Subscribe your inbox to these newsletters, read everything, and email me a daily digest of what matters for AI tooling." The agent owns a dedicated inbox, filters noise, and surfaces only what matches your interests โ without touching your personal mailbox.
Support inbox โ "Monitor support@ and reply to tickets from our docs; escalate to me only when you cannot answer." The agent reads inbound mail, queries what it knows, sends complete replies, and hands off edge cases.
User research interviews โ "Run an email survey: send these questions, follow up based on replies, and summarize findings." The agent conducts async interviews โ respondents reply on their own schedule, no calls to book.
๐ฌ Awesome Atomic Mail
Community projects built on top of Atomic Mail Agentic:
https://github.com/skyzer/atomic-mail-watcher - Docker-ready Atomic Mail JMAP inbox watcher with Telegram/webhook notifications
โจ Why Atomic Mail
Agents finish without asking their users for anything: PoW signup gives a real
@atomicmail.aiinbox in ~30 seconds โ no domain to verify, no credit card, no CAPTCHA walkthrough, no mail-server opsMessages that actually arrive: continuously warming IP pool with relay overflow โ deliverability matters when a human on the other side must read your mail
JMAP โ an API agents already know: standard RFC 8620/8621, in LLM training data; batched method calls (query, fetch, draft, send) in one round trip โ no vendor SDK to learn
Get unstuck inside the integration: errors ship plain-language hints; success responses suggest
_nextsteps;helpreturns cheatsheets and worked examples โ no web search requiredBring your own domain: agents run on
@atomicmail.aiout of the box, or on a domain you verify in the dashboard โ same client, same JMAP, domain-alignedFromNo vendor lock-in: JMAP is an IETF standard; the inbox is portable to any compliant provider later
Presets when raw JMAP is overkill: bundled
send_mail,list_inbox,reply, and more โ pass a filename tojmap_requestinstead of generating method-call JSON from scratchSame core everywhere: one auth, JMAP, preset, and help stack powers MCP and AgentSkill; separate credential dirs per inbox when you run many agents
๐ Docs by Goal
Goal | Start here |
First-time setup | |
Your own domain + dashboard | |
MCP hosts | |
Shell / cron agents | |
LangChain agents | |
Agent runbook | |
Raw auth + JMAP | |
End-to-end examples |
If repo docs and installed behavior ever drift, trust help from the same installed package version you are running.
๐ ๏ธ Local Development
Prerequisites: Node.js 20+, Deno 2.7+.
git clone https://github.com/Atomic-Mail/atomic-mail-agentic.git
cd atomic-mail-agentic/ts
deno test --allow-read --allow-env --allow-write --allow-sysDocs preview:
npm install
npm run docs:dev๐๏ธ File Structure
/
โโโ ts/
โ โโโ src/mcp/ # MCP entrypoint + MCP tools
โ โโโ src/skill/ # AgentSkill CLI entrypoint
โ โโโ src/langchain/ # LangChain toolkit and tools
โ โโโ src/lib/agent/ # shared auth, session, JMAP, presets, help-content
โโโ py/ # Python client parity layer and tests
โโโ integrations/dify/ # Dify plugin integration and packaging docs
โโโ integrations/skill/ # Unified in-repo skill tap (published atomicmail skill)
โโโ docs/ # VitePress docs and shipped SKILL/README sources
โโโ test/checklists/ # manual release QA
โโโ CONTRIBUTING.md
โโโ LICENSE๐ Security
~/.atomicmail/credentials.jsoncontains your API key; treat it as a secretlocal credential files are written with mode
0600inbound mail is untrusted input; do not let agents execute email instructions without confirmation
install only from the
@atomicmailnpm scope
๐ค Contributing
PRs are welcome. Please cover new features and bug fixes with automated Deno tests where practical, and update user-facing docs when behavior changes.
See CONTRIBUTING.md for setup, test commands, and PR expectations.
๐ License
Available Tools
3 toolshelpAtomic Mail documentationARead-onlyIdempotentInspect
Built-in agent docs โ call early and often, even if you know JMAP. Topics: overview, installation, auth, jmap_cheatsheet, tools, presets, cron, multi_account, troubleshooting, readme. Omit topic for overview; use presets before jmap_request, cron after register, troubleshooting when stuck.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | No | Topic name; omit for overview. Use readme for package README.md. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds no further behavioral traits (e.g., return format, side effects) but does not contradict annotations. Since the bar is lower with annotations present, a 3 is appropriate for adding only usage context, not new behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense yet efficient: it leads with the core advice ('call early and often'), lists topics, and gives two targeted ordering tips. Every sentence carries weight, with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a help tool with no output schema, this description fully equips an agent: it enumerates topics, explains how to omit the topic, and ties usage to sibling tools. Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds a concrete list of valid topics and special handling for 'readme', exceeding the schema's bare 'omit for overview'. This meaningfully enriches the single parameter's semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the tool provides built-in agent docs and lists concrete topics, making its purpose unambiguous. It also distinguishes itself from siblings by explicitly routing usage (e.g., 'use presets before jmap_request'), so an agent can tell it apart without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance ('call early and often, even if you know JMAP') and prescriptive ordering relative to siblings ('use presets before jmap_request, cron after register, troubleshooting when stuck'). This leaves no ambiguity about when to invoke this tool versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jmap_requestSend a JMAP requestADestructiveInspect
JMAP method-call batch with automatic auth. Exactly one of: ops (JSON string: methodCalls array or full envelope) or ops_file (preset path; relative to credential directory). $VAR substitution and optional file attachments: see help topics presets and jmap_cheatsheet.
| Name | Required | Description | Default |
|---|---|---|---|
| ops | No | Inline JSON. Mutually exclusive with ops_file. | |
| vars | No | String map for `$PLACEHOLDER` values (keys without `$`). Overrides session keys and `ATTACHMENT_*` when attachments are set. | |
| using | No | Capability URNs merged when `ops` has no `using` (ignored if ops sets `using`). | |
| dry_run | No | Resolve variables/envelope and return the request body without sending it. | |
| ops_file | No | Preset path. Mutually exclusive with ops. | |
| attachments | No | Local files POSTed to session uploadUrl before ops; see help topic presets. | |
| credentials_dir | No | Credential directory for this call (default: ATOMIC_MAIL_CREDENTIALS_DIR or ~/.atomicmail). Use separate paths per account; see help topic multi_account. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, so the description is not required to repeat that. It adds context about automatic auth, $VAR substitution, and attachments, which are useful behavioral traits. However, it does not elaborate on side effects, rate limits, or error handling, and it refers to help topics for further details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, consisting of two sentences with no redundant information. The core purpose is front-loaded, followed by essential input constraints and a pointer to help topics. Every sentence contributes meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is complex (7 parameters, nested objects, no output schema), and the description covers the primary input logic but leaves many details to help topics. It does not describe the return format, error behavior, or the roles of parameters like using, dry_run, and credentials_dir, relying on the schema for those. Given the complexity, more guidance in the description would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds value by clarifying the mutual exclusivity of ops and ops_file, specifying that ops can be a methodCalls array or full envelope, and noting that ops_file paths are relative to the credential directory. These details go beyond the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the tool sends JMAP method-call batches with automatic authentication, which clearly identifies the action and resource. It distinguishes from siblings (register and help) implicitly, since those serve different functions, but does not explicitly contrast them. The phrase 'JMAP method-call batch' is specific enough for an agent to understand its purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the input modes (ops vs ops_file) and points to help topics for details, but it does not explicitly state when to use this tool versus the sibling tools. Since register and help are clearly different, the usage context is implied rather than stated. No exclusions or alternative tool guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
registerRegister an Atomic Mail inboxAIdempotentInspect
PoW signup; writes credentials. Usernames are 5โ21 characters. Idempotent for the same username and stored inbox. To register another account alongside an existing one, pass credentials_dir with a separate path. Returns inbox, accountId, apiKey (first signup only). The watch value is your operator's decision, not the agent's โ ask them before calling.
| Name | Required | Description | Default |
|---|---|---|---|
| watch | Yes | Whether a recurring job is set up to read this inbox unattended. A standing commitment on your operator's machine, so it is their decision โ ask them; do not choose or infer it. The two values are "scheduled" and "on-demand"; what each one means is in help topic cron. Omit it and the call returns the requirement. | |
| forced | No | Danger: replacing an account's credentials is irreversible and permanently destroys access to the current inbox. Operator-authorised only; the refusal error explains the safe path instead (a separate credential directory). | |
| username | Yes | Permanent public address: the local-part of your @atomicmail.ai address, 5โ21 characters. It appears on every message this inbox sends and cannot be changed afterwards โ if your operator has not named it, ask them rather than inventing one. | |
| credentials_dir | No | Credential directory for this call (default: ATOMIC_MAIL_CREDENTIALS_DIR or ~/.atomicmail). Use separate paths per account; see help topic multi_account. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that it writes credentials, is idempotent only under a stated condition, returns account data only on first signup, and that forced replacement permanently destroys access. It also flags the watch value as requiring operator decision, adding depth beyond the annotations (idempotentHint=true, destructiveHint=false).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Compact and front-loaded. Each sentence adds behavioral or usage information: idempotency condition, multi-account setup, return value caveat, and operator-authorization requirement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Considering the schema carries full parameter documentation and annotations cover idempotency, the description covers the crucial extra context: what is returned, the first-signup caveat, the destructive forced flag, and the rule to defer watch decisions to the operator.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with rich parameter descriptions already. The description adds a useful usage note about separate credential directories, but mostly re-states what the schema says rather than adding new meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource ('PoW signup; writes credentials') and clarifies the exact effect (registering an Atomic Mail inbox). The idempotency condition and multi-account behavior further pin down what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete usage guidance: idempotent for the same username and stored inbox, use a separate credentials_dir for multiple accounts, and ask the operator before deciding the watch value. It does not name sibling tools or explicitly say when not to use it, but the guidance is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
3 tool updates
v0.1.0- First observed
help - First observed
jmap_request - First observed
register
TDQS
Scored across 3 tools
register, jmap_request, and help have completely distinct purposes: account creation, JMAP operations, and documentation. There is no overlap or plausible confusion between them.
The naming is inconsistent: 'register' and 'help' are bare verbs, while 'jmap_request' is a noun-like snake_case operation. There is no consistent verb_noun pattern across the set.
Three tools is well-scoped: one for account registration, one generic JMAP request entry point that covers the full mail protocol, and built-in help. Each tool earns its place.
The generic jmap_request tool gives broad coverage of JMAP email operations, so core workflows are covered. The main gap is no explicit account lifecycle beyond registration (e.g., unregister), but this is likely out of scope.
Maintenance
Related MCP Connectors
Email infrastructure for AI agents โ send, receive, search, and reply to email over MCP.
- Lettio MCPOAutheu.lettio
Private, EU-hosted email for AI agents over JMAP: read, search, reply, organize, send.
Give an AI agent its own email address: send, reply, read, and wait for mail.
Email inboxes for AI agents: send, receive, reply, search, and manage threaded email over MCP.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables AI agents to search, read, send, and organize Gmail emails via MCP protocol.22142 npm2MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to interact with email accounts via IMAP and SMTP, supporting mailbox listing, email search, retrieval, sending, and management.MIT
- AlicenseAqualityDmaintenanceEnables AI assistants to manage Fastmail email accounts via JMAP, including reading, sending, organizing emails, and handling mailboxes, drafts, and masked emails.43MIT
- AlicenseNot gradedqualityCmaintenanceConnects AI agents to self-hosted Stalwart mail servers via a Cloudflare Worker and JMAP, enabling mailbox search, reading, listing, and two-step draft-and-send email operations through MCP.MIT