JMAP capabilities
JMAP is extensible: mail, calendars, contacts and the other kinds of data are each defined by their own specification. A client therefore needs to know which extensions a server supports before it uses them. A JMAP server announces each extension it supports as a capability, identified by a URI, in the session resource at /jmap/session.
The session lists the capabilities at two levels. Under capabilities, it lists those of the server as a whole, with the server-wide limits. Under each account in accounts, it lists those available for that account. A client uses a capability only when it appears for the account, and it names the capability in the using list of each request.
Capabilities
Section titled “Capabilities”The following table lists the capabilities that Stalwart advertises, with the specification behind each and the settings that limit it:
| Capability | Specification | Provides | Limited by |
|---|---|---|---|
urn:ietf:params:jmap:core | RFC 8620 | Requests, uploads, downloads, push | JMAP limits |
urn:ietf:params:jmap:mail | RFC 8621 | Mailboxes, messages, threads, search | Message and mailbox limits |
urn:ietf:params:jmap:submission | RFC 8621 | Sending messages, identities | |
urn:ietf:params:jmap:vacationresponse | RFC 8621 | Automatic replies | |
urn:ietf:params:jmap:mail:share | draft-ietf-jmap-mail-sharing | Sharing mailboxes with other accounts | |
urn:ietf:params:jmap:emailpush | draft-ietf-jmap-emailpush | Message contents in push notifications | maxPushSize on the Jmap object |
urn:ietf:params:jmap:contacts | RFC 9610 | Address books and contacts | maxAddressBooksPerCard on the AddressBook object |
urn:ietf:params:jmap:contacts:parse | RFC 9610 | Parsing vCard files | parseLimitContact |
urn:ietf:params:jmap:calendars | draft-ietf-jmap-calendars | Calendars and events | maxCalendarsPerEvent, maxAttendees and maxExpandedQueryDuration on the Calendar object |
urn:ietf:params:jmap:calendars:parse | draft-ietf-jmap-calendars | Parsing iCalendar files | parseLimitEvent |
urn:ietf:params:jmap:principals | RFC 9670 | Users, groups and resources the account can share with | |
urn:ietf:params:jmap:principals:owner | RFC 9670 | The principal that owns each account | |
urn:ietf:params:jmap:principals:availability | draft-ietf-jmap-calendars | Free/busy information | maxAvailabilityDuration on the Calendar object |
urn:ietf:params:jmap:filenode | draft-ietf-jmap-filenode | Files and folders | |
urn:ietf:params:jmap:sieve | RFC 9661 | Sieve scripts | Limits on the SieveUserInterpreter object |
urn:ietf:params:jmap:blob | RFC 9404 | Blob upload, copying and lookup | maxRequestSize, maxMethodCalls |
urn:ietf:params:jmap:quota | RFC 9425 | The account’s quotas | |
urn:ietf:params:jmap:websocket | RFC 8887 | JMAP over WebSocket | WebSocket settings on the Jmap object |
urn:ietf:params:jmap:webpush-vapid | RFC 9749 | VAPID for push subscriptions | Advertised while webPushKey is set |
urn:ietf:params:jmap:metadata | draft-ietf-jmap-metadata | Object metadata | The Metadata object; advertised only when it enables at least one data type |
urn:stalwart:jmap | Stalwart | The configuration and management API | Permissions of the account |
The limits that a capability publishes, such as maxSizeUpload and maxObjectsInGet in core, are taken from the settings named in the last column.
Capability visibility
Section titled “Capability visibility”A capability appears for an account only when the user holds the permission to use it. For example, jmapEmailGet is required for mail, mail:share and emailpush, jmapEmailSubmissionCreate for submission, jmapCalendarEventGet for calendars, jmapContactCardGet for contacts, jmapFileNodeGet for filenode, jmapSieveScriptGet for sieve, and jmapMetadataGet for metadata. Four capabilities need no such permission: websocket, principals, principals:availability and urn:stalwart:jmap are listed for every account. Permissions lists all of them.
Some capabilities make sense only for the user’s own account. For an account shared with the user by another user, submission, vacationresponse, sieve, quota and emailpush are therefore not listed. A request authenticated with an OAuth token lists only the capabilities its scopes allow.
Errors
Section titled “Errors”Besides the errors of RFC 8620, the calendar extension can return the method error expandDurationTooLarge, when a query asks to expand recurring events over a longer period than maxExpandedQueryDuration.