Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Read and write email through the Atomic Mail from an AI agent. Handles proof-of-work authentication and JMAP so the agent thinks in JMAP method calls. Use when the user asks to register an email inbox, list mailboxes, fetch or send email.
.claude/skills/aiskillstore-atomicmail/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-03 | ✗→✓ | ▲ Improved | 98% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 51% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 26% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 159% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 20% | 0% |
Atomic Mail exposes a programmable inbox over JMAP with PoW signup and JWT rotation. This skill ships a single CLI entrypoint with three commands: register, jmap_request, and help — matching the MCP server.
package README (atomicmail help --topic readme).
Call atomicmail help early and often — before guessing placeholders, using URNs, or cron setup. Start with help --topic overview, then presets before custom jmap_request calls and cron after register. If installed behavior disagrees with docs elsewhere, trust help from the running package.
bash{baseDir}/scripts/atomicmail register --username "myagent" {baseDir}/scripts/atomicmail jmap_request --ops-file list_inbox.json
Run atomicmail --help or atomicmail <command> --help for flags.
authUrl: https://auth.atomicmail.aiapiUrl: https://api.atomicmail.ai~/.atomicmailbash{baseDir}/scripts/atomicmail register \ --username "alice"
Writes credentials.json, session.jwt, capability.jwt. Prints JSON including inbox and accountId.
Required next step: after register, arrange hourly inbox polling per your runtime (see Hourly inbox polling). Native cron hosts schedule an agent job with list_inbox.json; hosts without native cron should ask the operator or remind manual fetch. Do not cron atomicmail jmap_request alone.
Usernames must be 5–21 characters (local-part of your @atomicmail.ai address).
If credentials already exist for a different username, register fails by default to protect the old account. To add another inbox without replacing the current one, pass a separate --credentials-dir (MCP: credentials_dir on register / jmap_request). Use --forced only when you intend to replace credentials in the same directory (after backing it up).
bash{baseDir}/scripts/atomicmail register \ --api-key "..."
bash{baseDir}/scripts/atomicmail jmap_request \ --ops '[["Mailbox/get", {"accountId": "$ACCOUNT_ID"}, "m0"]]'
$ACCOUNT_ID, $INBOX, $INBOX_MAILBOX_ID, $UPLOAD_URL, and $DOWNLOAD_URL resolve from the session/credentials. Other placeholders such as $TO or $SUBJECT require --vars with a JSON object of strings (same substitution applies to --ops and --ops-file).
Preset file:
bash{baseDir}/scripts/atomicmail jmap_request \ --ops-file list_inbox.json
With custom placeholders:
bash{baseDir}/scripts/atomicmail jmap_request \ --ops-file send_mail.json \ --vars '{"TO":"alice@example.com","SUBJECT":"Hello","BODY":"Hi there"}'
Bundled presets (no local file creation required):
send_mail.json ($TO, $SUBJECT, $BODY)send_mail_attachment.json ($TO, $SUBJECT, $BODY, $ATTACHMENT_BASE64,$ATTACHMENT_TYPE, $ATTACHMENT_NAME)
send_mail_blob_attachment.json ($TO, $SUBJECT, $BODY; pair withrepeatable --attachment PATH for RFC 8620 upload → $ATTACHMENT_0_BLOB_ID, …)
list_inbox.json (latest 50; uses $INBOX_MAILBOX_ID) — used for hourly inbox pollingreply.json ($MAIL_ID, $BODY)Registration only creates credentials. Inbound mail should be fetched and triaged about once per hour between interactive sessions.
Choose the path that matches your runtime — do not mix platforms.
OpenClaw, Hermes, atomic-agent, and similar hosts with native cron: set up an hourly agent job after the first successful register. Wire Atomic Mail MCP or AgentSkill into that agent. The scheduled turn should call list_inbox.json inside the agent prompt.
Claude, Pi, Cursor, and other chat agents without a cron API: do not spend tokens trying to work around this — no wrapper scripts, OS crontab/LaunchAgent setup, or scheduling on a different platform.
After register, either ask your operator to set up hourly polling on a capable host (share the examples below), or remind your operator to fetch mail manually when needed.
Do not register in one runtime and schedule the cron job on another (e.g. Pi runs register, then creates an OpenClaw cron job).
Do not cron atomicmail jmap_request alone (no agent). Do not use headless one-shot CLIs (claude -p, pi -p, codex exec) if you want to continue the thread.
| Your setup | Approach | | --- | --- | | OpenClaw | openclaw cron add with --announce | | Hermes | hermes cron create or /cron with --deliver | | Atomic Bot | Same as OpenClaw or Hermes | | atomic-agent | atomic-agent task create --cron | | No native cron (Claude, Pi, Cursor, …) | Ask operator to schedule on a capable host, or remind manual fetch |
Full options, agent prompt, and operator OS-scheduling notes: atomicmail help --topic cron or MCP help topic cron.
textUse Atomic Mail to fetch my inbox (MCP jmap_request with ops_file list_inbox.json, or atomicmail jmap_request --ops-file list_inbox.json). Summarize new messages, highlight what needs a reply, and stay available — I may ask you to reply, forward, search, or dig into something important.
OpenClaw — cron docs: isolated session, --announce for delivery.
Hermes — cron docs: --deliver origin (or telegram, discord, email, …); not --no-agent.
atomic-agent — atomic-agent task create --cron "0 * * * *" --message "<prompt>"
For operator OS-scheduling patterns on terminal hosts, see help --topic cron.
bash{baseDir}/scripts/atomicmail help {baseDir}/scripts/atomicmail help --topic jmap_cheatsheet
credentials.json holds the API key (mode 0600). Do not commit it.Use send_mail_attachment.json (in-band base64) or send_mail_blob_attachment.json with repeatable --attachment PATH (RFC 8620 upload — same flow as MCP attachments). Rules, limits, and Blob/upload JSON shape: atomicmail help --topic jmap_cheatsheet.
bash{baseDir}/scripts/atomicmail jmap_request \ --ops-file send_mail_attachment.json \ --vars '{"TO":"you@example.com","SUBJECT":"Hi","BODY":"See file","ATTACHMENT_BASE64":"SGVsbG8=","ATTACHMENT_TYPE":"text/plain","ATTACHMENT_NAME":"note.txt"}'
--auth-url, --api-url or ATOMIC_MAIL_AUTH_URL,ATOMIC_MAIL_API_URL
--credentials-dir or ATOMIC_MAIL_CREDENTIALS_DIR--scrypt-salt or ATOMIC_MAIL_SCRYPT_SALT~/.hermes/atomicmail on Hermes (not ~/.atomicmail). The bundled skill launcher sets ATOMIC_MAIL_CREDENTIALS_DIR when unset; operator env or atomicmail.credentials_dir config overrides it./suggestions — do not skip inbox polling setup.{baseDir}/scripts/atomicmail jmap_request alone without an agent turn. The Hermes blueprint uses no_agent: false so each run is a full agent session with list_inbox.json.--credentials-dir on register / jmap_request only when operating multiple inboxes at once — not needed for the default single-inbox flow.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 17,715 | 26,867 | +52% | 1 | 1 | 0% | 2,026 | 2,573 | +27% | 0 | 0 | — |
case-02 | fail→fail | 12,198 | 11,843 | -3% | 1 | 1 | 0% | 1,147 | 2,673 | +133% | 0 | 0 | — |
case-03 | fail→pass | 16,315 | 12,774 | -22% | 1 | 1 | 0% | 1,886 | 3,737 | +98% | 0 | 0 | — |
case-04 | pass→pass | 12,665 | 8,270 | -35% | 1 | 1 | 0% | 1,478 | 3,783 | +156% | 0 | 0 | — |
case-05 | pass→pass | 7,394 | 14,465 | +96% | 1 | 1 | 0% | 1,590 | 4,118 | +159% | 0 | 0 | — |
case-06 | pass→pass | 20,817 | 19,640 | -6% | 1 | 1 | 0% | 3,052 | 5,118 | +68% | 0 | 0 | — |
case-07 | fail→pass | 21,065 | 9,752 | -54% | 1 | 1 | 0% | 2,595 | 3,927 | +51% | 0 | 0 | — |
case-08 | fail→pass | 18,690 | 8,060 | -57% | 1 | 1 | 0% | 2,212 | 2,784 | +26% | 0 | 0 | — |
case-09 | fail→pass | 16,495 | 2,522 | -85% | 1 | 1 | 0% | 1,051 | 2,717 | +159% | 0 | 0 | — |
case-10 | fail→pass | 13,648 | 9,017 | -34% | 1 | 1 | 0% | 2,554 | 3,066 | +20% | 0 | 0 | — |
case-11 | fail→pass | 29,493 | 2,760 | -91% | 1 | 1 | 0% | 3,983 | 2,758 | -31% | 0 | 0 | — |
case-12 | fail→pass | 14,153 | 9,091 | -36% | 1 | 1 | 0% | 1,454 | 2,993 | +106% | 0 | 0 | — |
case-13 | fail→pass | 9,735 | 8,992 | -8% | 1 | 1 | 0% | 1,602 | 2,942 | +84% | 0 | 0 | — |
case-14 | fail→pass | 17,253 | 2,622 | -85% | 1 | 1 | 0% | 1,930 | 2,657 | +38% | 0 | 0 | — |
case-15 | fail→fail | 13,568 | 11,514 | -15% | 1 | 1 | 0% | 2,046 | 2,539 | +24% | 0 | 0 | — |
case-16 | fail→pass | 14,367 | 7,633 | -47% | 1 | 1 | 0% | 1,507 | 2,672 | +77% | 0 | 0 | — |
case-17 | pass→pass | 19,445 | 3,387 | -83% | 1 | 1 | 0% | 1,845 | 2,947 | +60% | 0 | 0 | — |
case-18 | fail→pass | 12,774 | 5,058 | -60% | 1 | 1 | 0% | 2,125 | 3,155 | +48% | 0 | 0 | — |
case-19 | fail→pass | 8,595 | 11,359 | +32% | 1 | 1 | 0% | 1,442 | 3,364 | +133% | 0 | 0 | — |
case-20 | fail→pass | 12,139 | 6,491 | -47% | 1 | 1 | 0% | 1,800 | 3,396 | +89% | 0 | 0 | — |
case-21 | fail→pass | 12,084 | 2,862 | -76% | 1 | 1 | 0% | 1,013 | 2,739 | +170% | 0 | 0 | — |
case-22 | fail→pass | 17,637 | 2,062 | -88% | 1 | 1 | 0% | 2,223 | 2,640 | +19% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 19 counted toward the lift figure. The other 3 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +68 percentage points is the difference between those two pass rates over the 19 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.