JMAP using and inline ops
RFC 8620 requires each JMAP request to include a using array: the set of capability URNs that apply to all method calls in that batch. If a method belongs to a URN you did not declare, the request is not valid for a standards-following server.
Full envelope vs bare methodCalls
Clients may send either:
- Full envelope:
{ "using": ["urn:ietf:params:jmap:core", ...], "methodCalls": [...] } - Bare array:
[["Email/query", {...}, "q0"], ...]— the host then supplies a defaultusingfor the envelope it builds.
Atomic Mail MCP (jmap_request) and AgentSkill / CLI use the same default using when you pass only a bare methodCalls array:
urn:ietf:params:jmap:coreurn:ietf:params:jmap:mail
That pair covers Mailbox/, Email/, Thread/, SearchSnippet/, and other types declared under the mail capability. For built-in recipes and when to add more URNs, use help --topic jmap_cheatsheet (CLI) or the MCP help tool with topic jmap_cheatsheet.
Pitfall: submission, identity, and blob methods
If you pass a bare methodCalls array (no envelope) and rely on the default using, you must extend using whenever the batch includes methods that need other URNs, for example:
| Methods (examples) | Add to using |
|---|---|
EmailSubmission/*, Identity/* | urn:ietf:params:jmap:submission |
Blob/upload, Blob/get, Blob/lookup | urn:ietf:params:jmap:blob |
Ways to do that:
- Put a full
{ "using": [...], "methodCalls": [...] }object inops/ your JSON file, with every URN you need; or - MCP: set the tool’s
usinginput array so it includessubmissionand/orblobin addition to core and mail when your inline ops need them; or - Use bundled presets (for example
send_mail.json), which already embed the correctusingfor their method calls.
For a narrative send/read example, see Raw JMAP requests.