JMAP Implementation - Quick Reference Index#
📚 Documentation#
🏗️ Project Structure#
jmap/
├── jmap-core/ Core protocol (RFC 8620)
├── jmap-mail/ Mail extension (RFC 8621)
├── jmap-client/ HTTP client
├── test/ Test suite + 50 JSON files
└── spec/ RFC specifications
📦 Packages#
| Package |
Purpose |
Modules |
Status |
| jmap-core |
Core JMAP (RFC 8620) |
13 |
✅ Types complete, 🚧 Parsers TODO |
| jmap-mail |
Mail extension (RFC 8621) |
8 |
✅ Types complete, 🚧 Parsers TODO |
| jmap-client |
HTTP client |
2 |
✅ Stubs complete |
| jmap-test |
Test suite |
1 |
✅ Basic harness |
🔧 Core Modules (jmap-core/)#
| Module |
Lines |
Purpose |
Key Types |
| jmap_error.ml |
223 |
Error handling |
error_level, method_error, set_error |
| jmap_id.ml |
47 |
ID type |
t (abstract) |
| jmap_primitives.ml |
121 |
Basic types |
Int53, UnsignedInt, Date, UTCDate |
| jmap_capability.ml |
62 |
Capabilities |
CoreCapability, MailCapability |
| jmap_filter.ml |
72 |
Query filters |
operator, t (recursive) |
| jmap_comparator.ml |
50 |
Sort comparators |
t |
| jmap_standard_methods.ml |
189 |
Standard methods |
Get, Changes, Set, Copy, Query, QueryChanges, Echo |
| jmap_invocation.ml |
159 |
Type-safe dispatch |
method_witness (GADT), invocation |
| jmap_request.ml |
54 |
Request object |
t |
| jmap_response.ml |
55 |
Response object |
t |
| jmap_session.ml |
77 |
Session/Account |
t, Account.t |
| jmap_push.ml |
79 |
Push notifications |
StateChange, PushSubscription |
| jmap_binary.ml |
42 |
Binary ops |
Upload, BlobCopy |
| jmap_parser.ml |
105 |
Parser utilities |
Helpers module |
Total: ~1,335 lines
📧 Mail Modules (jmap-mail/)#
| Module |
Lines |
Purpose |
Key Types |
Methods |
| jmap_mailbox.ml |
206 |
Mailboxes |
t, Rights, Filter |
Get, Changes, Query, QueryChanges, Set |
| jmap_thread.ml |
84 |
Thread grouping |
t |
Get |
| jmap_email.ml |
421 |
Email messages |
t, EmailAddress, BodyPart, BodyValue, Filter |
Get, Changes, Query, QueryChanges, Set, Copy, Import, Parse |
| jmap_identity.ml |
126 |
Identities |
t |
Get, Changes, Set |
| jmap_email_submission.ml |
322 |
Email sending |
t, Envelope, Address, DeliveryStatus, Filter |
Get, Changes, Query, QueryChanges, Set |
| jmap_vacation_response.ml |
133 |
Out-of-office |
t (singleton) |
Get, Set |
| jmap_search_snippet.ml |
102 |
Search highlights |
t |
Get |
| jmap_mail_parser.ml |
240 |
Mail parsers |
N/A (parsers) |
50+ functions |
Total: ~1,634 lines
🌐 Client Modules (jmap-client/)#
| Module |
Lines |
Purpose |
| jmap_client.ml |
76 |
High-level client |
| jmap_connection.ml |
90 |
Connection management |
Total: ~166 lines
🧪 Test Files (test/data/)#
Core Protocol Tests (22 files)#
| Category |
Files |
Purpose |
| Echo |
2 |
Echo method testing |
| Get |
2 |
Object retrieval |
| Changes |
2 |
Delta synchronization |
| Set (Create) |
2 |
Object creation |
| Set (Update) |
2 |
Object updates with PatchObject |
| Set (Destroy) |
2 |
Object deletion |
| Copy |
2 |
Cross-account copy |
| Query |
2 |
Querying with filters |
| QueryChanges |
2 |
Query delta sync |
| Session |
1 |
Session object |
| Push |
2 |
Push notifications |
| Errors |
1 |
Error responses |
Mail Protocol Tests (28 files)#
| Type |
Files |
Purpose |
| Mailbox |
6 |
Mailbox hierarchy, Get/Query/Set |
| Thread |
2 |
Thread grouping |
| Email (Basic) |
2 |
Basic email properties |
| Email (Full) |
2 |
Complete MIME structure |
| Email Query |
2 |
Email search |
| Email Set |
2 |
Email creation/update |
| Email Import |
2 |
Import from blobs |
| Email Parse |
2 |
Parse without importing |
| SearchSnippet |
2 |
Search highlighting |
| Identity |
2 |
Identity management |
| EmailSubmission |
2 |
Email sending |
| VacationResponse |
2 |
Out-of-office |
Total: 50 files, ~224KB
🔑 Key Types Reference#
Core Types#
(* IDs and Primitives *)
Jmap_id.t (* 1-255 char string *)
Jmap_primitives.Int53.t (* -2^53+1 to 2^53-1 *)
Jmap_primitives.UnsignedInt.t (* 0 to 2^53-1 *)
Jmap_primitives.Date.t (* RFC 3339 date-time *)
Jmap_primitives.UTCDate.t (* RFC 3339 with Z *)
(* Protocol *)
Jmap_request.t (* API request *)
Jmap_response.t (* API response *)
Jmap_session.t (* Session info *)
Jmap_invocation.invocation (* Method call *)
(* Queries *)
Jmap_filter.t (* AND/OR/NOT filters *)
Jmap_comparator.t (* Sort comparator *)
Mail Types#
(* Objects *)
Jmap_mailbox.t (* Mailbox (11 props) *)
Jmap_thread.t (* Thread (2 props) *)
Jmap_email.t (* Email (24 props) *)
Jmap_identity.t (* Identity (8 props) *)
Jmap_email_submission.t (* Submission (10 props) *)
Jmap_vacation_response.t (* Vacation (7 props) *)
Jmap_search_snippet.t (* Snippet (3 props) *)
(* Nested Types *)
Jmap_mailbox.Rights.t (* 9 permission flags *)
Jmap_email.EmailAddress.t (* name, email *)
Jmap_email.BodyPart.t (* Recursive MIME *)
Jmap_email_submission.Envelope.t (* SMTP envelope *)
Method Types#
(* Standard Methods *)
'a Jmap_standard_methods.Get.request
'a Jmap_standard_methods.Get.response
Jmap_standard_methods.Changes.request
Jmap_standard_methods.Changes.response
'a Jmap_standard_methods.Set.request
'a Jmap_standard_methods.Set.response
'a Jmap_standard_methods.Copy.request
'a Jmap_standard_methods.Copy.response
'f Jmap_standard_methods.Query.request
Jmap_standard_methods.Query.response
'f Jmap_standard_methods.QueryChanges.request
Jmap_standard_methods.QueryChanges.response
Jmap_standard_methods.Echo.t
(* Extended Methods *)
Jmap_email.Import.request
Jmap_email.Import.response
Jmap_email.Parse.request
Jmap_email.Parse.response
📖 RFC References#
| Spec |
Title |
Coverage |
| RFC 8620 |
JMAP Core |
✅ Complete |
| RFC 8621 |
JMAP for Mail |
✅ Complete |
| RFC 3339 |
Date/Time |
✅ Date, UTCDate |
| RFC 5322 |
Email Format |
✅ Email parsing |
| RFC 6154 |
Mailbox Roles |
✅ Mailbox.Role |
🎯 Implementation Status#
✅ Complete#
- Type definitions (100% complete)
- Module structure
- Documentation
- Test JSON files
- Error handling types
- GADT method dispatch
- Client stubs
🚧 TODO (Marked in code)#
- JSON parsing (
of_json functions)
- JSON serialization (
to_json functions)
- HTTP client completion
- Test suite expansion
🚀 Quick Start#
For Users#
# Install
opam install jmap-core jmap-mail jmap-client
# Use
open Jmap_core
open Jmap_mail
let client = Jmap_client.create ~session_url:"..." ()
For Contributors#
# Clone and build
cd jmap
dune build
# Implement parsers (see PARSER_IMPLEMENTATION_GUIDE.md)
# Start with: jmap-core/jmap_comparator.ml
# Test
dune test
# Validate
dune build @check
📊 Statistics#
| Metric |
Count |
| Total OCaml lines |
3,500+ |
| Modules |
23 |
| Submodules |
45+ |
| Type definitions |
100+ |
| JSON test files |
50 |
| Test data size |
224KB |
| Documentation |
2,200+ lines |
| RFC sections covered |
100+ |
🔗 Links#
💡 Common Tasks#
| Task |
Command |
| Build |
dune build |
| Test |
dune test |
| Install |
dune install |
| Clean |
dune clean |
| Format |
dune fmt |
| Check types |
dune build @check |
| Generate docs |
dune build @doc |
📝 Code Examples#
See README.md for:
- Session fetching
- Querying mailboxes
- Searching emails
- Creating emails
- Complex filters
- Uploading attachments
🆘 Getting Help#
- Check test JSON files for expected structure
- Read PARSER_IMPLEMENTATION_GUIDE.md
- Review existing parsers (jmap_id.ml, jmap_primitives.ml)
- Look at type definitions in module interfaces
- Use
Jmap_parser.Helpers utilities
🎓 Learning Path#
- Read DESIGN.md - Understand architecture
- Review README.md - Learn usage patterns
- Study test files - See JSON structure
- Read PARSER_IMPLEMENTATION_GUIDE.md - Implementation details
- Start coding - Begin with simple parsers
Last Updated: 2025
Version: 0.1.0
Status: Types complete, parsers TODO