Atomic Mail
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.
When to use this skill
- Register a new inbox or log in with an existing API key.
- Send JMAP batches (inline JSON or preset files).
- Read built-in documentation (JMAP cheatsheet, presets, troubleshooting). In this skill runtime,
atomicmail help --topic readmeintentionally returns a short stub.
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.
Commands
npx --package=@atomicmail/agent-skill-gh-pages atomicmail register --username "myagent"
npx --package=@atomicmail/agent-skill-gh-pages atomicmail jmap_request --ops-file list_inbox.jsonRun atomicmail --help or atomicmail <command> --help for flags.
Defaults
authUrl:https://auth.atomicmail.aiapiUrl:https://api.atomicmail.ai- credentials directory:
~/.atomicmail
Workflow
1. Register (new account)
npx --package=@atomicmail/agent-skill-gh-pages 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).
2. Register (existing API key, in case losing the credentials file)
npx --package=@atomicmail/agent-skill-gh-pages atomicmail register \
--api-key "..."3. JMAP request
npx --package=@atomicmail/agent-skill-gh-pages 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:
npx --package=@atomicmail/agent-skill-gh-pages atomicmail jmap_request \
--ops-file list_inbox.jsonWith custom placeholders:
npx --package=@atomicmail/agent-skill-gh-pages 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 with repeatable--attachment PATHfor 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)
Hourly inbox polling (after register)
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.
If your host supports scheduled jobs
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.
If your host does not support scheduled jobs
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.
Forbidden: cross-platform scheduling
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.
Scheduling examples (capable hosts or operators)
| 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.
Agent prompt (all workflows)
Use 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.Built-in cron examples
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.
4. Help
npx --package=@atomicmail/agent-skill-gh-pages atomicmail help
npx --package=@atomicmail/agent-skill-gh-pages atomicmail help --topic jmap_cheatsheetSecurity
credentials.jsonholds the API key (mode0600). Do not commit it.- JWT files are bearer secrets — do not log them.
Attachments and blobs
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.
npx --package=@atomicmail/agent-skill-gh-pages 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"}'Overriding defaults
- Endpoints:
--auth-url,--api-urlorATOMIC_MAIL_AUTH_URL,ATOMIC_MAIL_API_URL - Credentials path:
--credentials-dirorATOMIC_MAIL_CREDENTIALS_DIR - PoW salt:
--scrypt-saltorATOMIC_MAIL_SCRYPT_SALT