better-email-mcp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,123 @@
1
+ # better-email-mcp
2
+
3
+ An MCP server that gives LLM tools access to your email. Supports two backends:
4
+
5
+ - **JMAP** — Fastmail's native API for fast, full-featured access (including sending)
6
+ - **IMAP** — works with any IMAP-compatible email provider (add SMTP for sending)
7
+
8
+ The project intentionally keeps external dependencies to a minimum to reduce supply chain risk. The IMAP and SMTP clients are implemented from scratch using Node's built-in `net`/`tls` modules rather than pulling in third-party packages.
9
+
10
+ ## Setup
11
+
12
+ ```bash
13
+ npm install
14
+ npm run build
15
+ ```
16
+
17
+ ## Configuration
18
+
19
+ The server is configured entirely through environment variables.
20
+
21
+ ### Backend selection
22
+
23
+ | Variable | Description | Default |
24
+ |----------|-------------|---------|
25
+ | `EMAIL_BACKEND` | `"jmap"` or `"imap"` | `"jmap"` |
26
+ | `EMAIL_FORMAT` | `"plain"` or `"html"` | `"plain"` |
27
+
28
+ When set to `html`, the `send_message` tool requires an `htmlBody` field in addition to `textBody`, and messages are sent as multipart with both plain text and HTML. When set to `plain` (the default), only `textBody` is exposed — the LLM cannot generate HTML email.
29
+
30
+ ### JMAP (Fastmail)
31
+
32
+ | Variable | Required | Description |
33
+ |----------|----------|-------------|
34
+ | `JMAP_TOKEN` | Yes | Fastmail API token |
35
+ | `JMAP_SESSION_URL` | No | JMAP session URL (default: `https://api.fastmail.com/.well-known/jmap`) |
36
+
37
+ To get a token, go to Fastmail **Settings > Privacy & Security > API tokens** and create a token with the email scopes you need.
38
+
39
+ ### IMAP
40
+
41
+ | Variable | Required | Description |
42
+ |----------|----------|-------------|
43
+ | `IMAP_HOST` | Yes | IMAP server hostname (e.g. `imap.gmail.com`) |
44
+ | `IMAP_USER` | Yes | Login username |
45
+ | `IMAP_PASSWORD` | Yes | Login password or app-specific password |
46
+ | `IMAP_PORT` | No | Server port (default: `993`) |
47
+ | `IMAP_TLS` | No | Use TLS (default: `true`) |
48
+
49
+ ### SMTP (sending from IMAP)
50
+
51
+ To enable sending with the IMAP backend, configure an SMTP server:
52
+
53
+ | Variable | Required | Description |
54
+ |----------|----------|-------------|
55
+ | `SMTP_HOST` | No | SMTP server hostname (e.g. `smtp.gmail.com`). Enables sending. |
56
+ | `SMTP_PORT` | No | Server port (default: `587`). Use `465` for implicit TLS. |
57
+ | `SMTP_USER` | When `SMTP_HOST` set | SMTP login username |
58
+ | `SMTP_PASSWORD` | When `SMTP_HOST` set | SMTP login password |
59
+ | `SMTP_TLS` | No | Enable TLS (default: `true`). Port 465 uses implicit TLS; port 587 uses STARTTLS. |
60
+ | `SMTP_FROM` | No | Sender address (defaults to `SMTP_USER`) |
61
+
62
+ If `SMTP_HOST` is not set, the IMAP backend is read-only and the `send_message` tool is not registered.
63
+
64
+ ### Disabling tools
65
+
66
+ Set `DISABLED_TOOLS` to a comma-separated list of tool names to prevent them from being registered:
67
+
68
+ ```bash
69
+ DISABLED_TOOLS=send_message,search_messages
70
+ ```
71
+
72
+ This is useful for enforcing read-only access or reducing context for the LLM.
73
+
74
+ ## Usage with MCP clients
75
+
76
+ ### JMAP (Fastmail)
77
+
78
+ ```json
79
+ {
80
+ "mcpServers": {
81
+ "email": {
82
+ "command": "node",
83
+ "args": ["/path/to/better-email-mcp/dist/index.js"],
84
+ "env": {
85
+ "EMAIL_BACKEND": "jmap",
86
+ "JMAP_TOKEN": "your-fastmail-api-token"
87
+ }
88
+ }
89
+ }
90
+ }
91
+ ```
92
+
93
+ ### IMAP
94
+
95
+ ```json
96
+ {
97
+ "mcpServers": {
98
+ "email": {
99
+ "command": "node",
100
+ "args": ["/path/to/better-email-mcp/dist/index.js"],
101
+ "env": {
102
+ "EMAIL_BACKEND": "imap",
103
+ "IMAP_HOST": "imap.example.com",
104
+ "IMAP_USER": "you@example.com",
105
+ "IMAP_PASSWORD": "your-password",
106
+ "SMTP_HOST": "smtp.example.com",
107
+ "SMTP_USER": "you@example.com",
108
+ "SMTP_PASSWORD": "your-password"
109
+ }
110
+ }
111
+ }
112
+ }
113
+ ```
114
+
115
+ ## Tools
116
+
117
+ | Tool | Description |
118
+ |------|-------------|
119
+ | `list_folders` | List all email folders/mailboxes |
120
+ | `list_messages` | List recent messages with optional folder, limit, and offset |
121
+ | `get_message` | Get a single message by ID, including full body |
122
+ | `search_messages` | Search messages by text query |
123
+ | `send_message` | Send an email (JMAP, or IMAP with SMTP configured) |
@@ -0,0 +1,46 @@
1
+ import { EmailBackend, EmailMessage, ListMessagesOptions, SearchOptions, SendMessageOptions } from "../types.js";
2
+ export interface ImapConfig {
3
+ host: string;
4
+ port: number;
5
+ user: string;
6
+ password: string;
7
+ tls: boolean;
8
+ }
9
+ export interface SmtpConfig {
10
+ host: string;
11
+ port: number;
12
+ user: string;
13
+ password: string;
14
+ tls: boolean;
15
+ from?: string;
16
+ }
17
+ export declare class ImapBackend implements EmailBackend {
18
+ private config;
19
+ private client;
20
+ private folderList;
21
+ private smtpConfig;
22
+ private smtpClient;
23
+ sendMessage?: (options: SendMessageOptions) => Promise<{
24
+ id: string;
25
+ }>;
26
+ constructor(config: ImapConfig, smtpConfig?: SmtpConfig);
27
+ connect(): Promise<void>;
28
+ disconnect(): Promise<void>;
29
+ listFolders(): Promise<string[]>;
30
+ listMessages(options?: ListMessagesOptions): Promise<EmailMessage[]>;
31
+ getMessage(id: string): Promise<EmailMessage | null>;
32
+ searchMessages(options: SearchOptions): Promise<EmailMessage[]>;
33
+ private sendMessageImpl;
34
+ private sanitizeHeader;
35
+ private ensureConnected;
36
+ private validateFolder;
37
+ private extractSearchUids;
38
+ private mapFetchResponses;
39
+ private mapImapMessage;
40
+ }
41
+ export declare function encodeMessageId(folder: string, uid: number): string;
42
+ export declare function decodeMessageId(id: string): {
43
+ folder: string;
44
+ uid: number;
45
+ };
46
+ //# sourceMappingURL=imap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imap.d.ts","sourceRoot":"","sources":["../../src/backends/imap.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACnB,aAAa,EACb,kBAAkB,EACnB,MAAM,aAAa,CAAC;AAUrB,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,OAAO,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,OAAO,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,WAAY,YAAW,YAAY;IAC9C,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,UAAU,CAAgB;IAClC,OAAO,CAAC,UAAU,CAAyB;IAC3C,OAAO,CAAC,UAAU,CAA2B;IAE7C,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;gBAE3D,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,EAAE,UAAU;IAQjD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAkDxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB3B,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAKhC,YAAY,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IA+BpE,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAiCpD,cAAc,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;YA6BvD,eAAe;IAmE7B,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,iBAAiB;IAyBzB,OAAO,CAAC,cAAc;CAqBvB;AAID,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAW3E"}
@@ -0,0 +1,300 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ImapBackend = void 0;
4
+ exports.encodeMessageId = encodeMessageId;
5
+ exports.decodeMessageId = decodeMessageId;
6
+ const client_js_1 = require("../imap/client.js");
7
+ const parser_js_1 = require("../imap/parser.js");
8
+ const client_js_2 = require("../smtp/client.js");
9
+ class ImapBackend {
10
+ config;
11
+ client = null;
12
+ folderList = [];
13
+ smtpConfig;
14
+ smtpClient = null;
15
+ sendMessage;
16
+ constructor(config, smtpConfig) {
17
+ this.config = config;
18
+ this.smtpConfig = smtpConfig;
19
+ if (smtpConfig) {
20
+ this.sendMessage = this.sendMessageImpl.bind(this);
21
+ }
22
+ }
23
+ async connect() {
24
+ this.client = new client_js_1.ImapClient();
25
+ await this.client.connect({
26
+ host: this.config.host,
27
+ port: this.config.port,
28
+ tls: this.config.tls,
29
+ });
30
+ // Login
31
+ const escapedUser = quoteImapString(this.config.user);
32
+ const escapedPass = quoteImapString(this.config.password);
33
+ await this.client.command(`LOGIN ${escapedUser} ${escapedPass}`);
34
+ // Cache folder list
35
+ const listResponses = await this.client.command('LIST "" "*"');
36
+ this.folderList = [];
37
+ for (const resp of listResponses) {
38
+ if (resp.type === "LIST") {
39
+ const parsed = (0, parser_js_1.parseListResponse)(resp.text);
40
+ if (parsed) {
41
+ this.folderList.push(parsed.name);
42
+ }
43
+ }
44
+ }
45
+ this.folderList.sort();
46
+ // Connect SMTP if configured
47
+ if (this.smtpConfig) {
48
+ const smtp = this.smtpConfig;
49
+ const useImplicitTls = smtp.port === 465;
50
+ this.smtpClient = new client_js_2.SmtpClient();
51
+ await this.smtpClient.connect({
52
+ host: smtp.host,
53
+ port: smtp.port,
54
+ tls: useImplicitTls,
55
+ });
56
+ const fromAddr = smtp.from ?? smtp.user;
57
+ const domain = fromAddr.split("@")[1] ?? "localhost";
58
+ await this.smtpClient.ehlo(domain);
59
+ if (smtp.tls && !useImplicitTls) {
60
+ await this.smtpClient.startTls();
61
+ await this.smtpClient.ehlo(domain);
62
+ }
63
+ await this.smtpClient.authPlain(smtp.user, smtp.password);
64
+ }
65
+ }
66
+ async disconnect() {
67
+ if (this.smtpClient) {
68
+ try {
69
+ await this.smtpClient.quit();
70
+ }
71
+ catch {
72
+ // Ignore errors during SMTP quit
73
+ }
74
+ this.smtpClient = null;
75
+ }
76
+ if (this.client) {
77
+ await this.client.disconnect();
78
+ this.client = null;
79
+ }
80
+ this.folderList = [];
81
+ }
82
+ async listFolders() {
83
+ this.ensureConnected();
84
+ return [...this.folderList];
85
+ }
86
+ async listMessages(options) {
87
+ const client = this.ensureConnected();
88
+ const folder = options?.folder ?? "INBOX";
89
+ const limit = options?.limit ?? 25;
90
+ const offset = options?.offset ?? 0;
91
+ this.validateFolder(folder);
92
+ // Select mailbox
93
+ await client.command(`SELECT ${quoteImapString(folder)}`);
94
+ // Search for all UIDs, then paginate
95
+ const searchResponses = await client.command("UID SEARCH ALL");
96
+ const allUids = this.extractSearchUids(searchResponses);
97
+ if (allUids.length === 0)
98
+ return [];
99
+ // Take most recent UIDs (highest = newest), apply offset and limit
100
+ const sorted = allUids.sort((a, b) => b - a);
101
+ const page = sorted.slice(offset, offset + limit);
102
+ if (page.length === 0)
103
+ return [];
104
+ // Fetch envelope and flags for these UIDs
105
+ const uidSet = page.join(",");
106
+ const fetchResponses = await client.command(`UID FETCH ${uidSet} (UID FLAGS ENVELOPE)`);
107
+ return this.mapFetchResponses(fetchResponses, folder);
108
+ }
109
+ async getMessage(id) {
110
+ const client = this.ensureConnected();
111
+ const { folder, uid } = decodeMessageId(id);
112
+ this.validateFolder(folder);
113
+ await client.command(`SELECT ${quoteImapString(folder)}`);
114
+ try {
115
+ const fetchResponses = await client.command(`UID FETCH ${uid} (UID FLAGS ENVELOPE BODY.PEEK[TEXT])`);
116
+ const messages = this.mapFetchResponses(fetchResponses, folder);
117
+ if (messages.length === 0)
118
+ return null;
119
+ const message = messages[0];
120
+ // Extract body text from FETCH response
121
+ for (const resp of fetchResponses) {
122
+ if (resp.type === "FETCH") {
123
+ const parsed = (0, parser_js_1.parseFetchResponse)(resp.text);
124
+ if (parsed.uid === uid && parsed.bodyText) {
125
+ message.body = parsed.bodyText;
126
+ }
127
+ }
128
+ }
129
+ return message;
130
+ }
131
+ catch {
132
+ return null;
133
+ }
134
+ }
135
+ async searchMessages(options) {
136
+ const client = this.ensureConnected();
137
+ const folder = options.folder ?? "INBOX";
138
+ const limit = options.limit ?? 25;
139
+ this.validateFolder(folder);
140
+ await client.command(`SELECT ${quoteImapString(folder)}`);
141
+ // IMAP SEARCH TEXT searches headers and body
142
+ const searchResponses = await client.command(`UID SEARCH TEXT ${quoteImapString(options.query)}`);
143
+ const uids = this.extractSearchUids(searchResponses);
144
+ if (uids.length === 0)
145
+ return [];
146
+ // Take most recent matches
147
+ const sorted = uids.sort((a, b) => b - a);
148
+ const page = sorted.slice(0, limit);
149
+ const uidSet = page.join(",");
150
+ const fetchResponses = await client.command(`UID FETCH ${uidSet} (UID FLAGS ENVELOPE)`);
151
+ return this.mapFetchResponses(fetchResponses, folder);
152
+ }
153
+ async sendMessageImpl(options) {
154
+ if (!this.smtpClient || !this.smtpConfig) {
155
+ throw new Error("SMTP not configured");
156
+ }
157
+ const from = this.smtpConfig.from ?? this.smtpConfig.user;
158
+ const domain = from.split("@")[1] ?? "localhost";
159
+ const messageId = `<${Date.now()}.${Math.random().toString(36).slice(2)}@${domain}>`;
160
+ const date = new Date().toUTCString();
161
+ const sanitizedTo = options.to.map((a) => this.sanitizeHeader(a));
162
+ const sanitizedCc = options.cc?.map((a) => this.sanitizeHeader(a));
163
+ const sanitizedSubject = this.sanitizeHeader(options.subject);
164
+ let message = "";
165
+ message += `From: ${from}\r\n`;
166
+ message += `To: ${sanitizedTo.join(", ")}\r\n`;
167
+ if (sanitizedCc && sanitizedCc.length > 0) {
168
+ message += `Cc: ${sanitizedCc.join(", ")}\r\n`;
169
+ }
170
+ message += `Subject: ${sanitizedSubject}\r\n`;
171
+ message += `Date: ${date}\r\n`;
172
+ message += `Message-ID: ${messageId}\r\n`;
173
+ message += `MIME-Version: 1.0\r\n`;
174
+ if (options.inReplyTo) {
175
+ const sanitizedReplyTo = this.sanitizeHeader(options.inReplyTo);
176
+ message += `In-Reply-To: ${sanitizedReplyTo}\r\n`;
177
+ message += `References: ${sanitizedReplyTo}\r\n`;
178
+ }
179
+ if (options.htmlBody) {
180
+ const boundary = `----=_Part_${Date.now()}_${Math.random().toString(36).slice(2)}`;
181
+ message += `Content-Type: multipart/alternative; boundary="${boundary}"\r\n`;
182
+ message += `\r\n`;
183
+ message += `--${boundary}\r\n`;
184
+ message += `Content-Type: text/plain; charset=utf-8\r\n`;
185
+ message += `\r\n`;
186
+ message += options.textBody + `\r\n`;
187
+ message += `--${boundary}\r\n`;
188
+ message += `Content-Type: text/html; charset=utf-8\r\n`;
189
+ message += `\r\n`;
190
+ message += options.htmlBody + `\r\n`;
191
+ message += `--${boundary}--\r\n`;
192
+ }
193
+ else {
194
+ message += `Content-Type: text/plain; charset=utf-8\r\n`;
195
+ message += `\r\n`;
196
+ message += options.textBody;
197
+ }
198
+ await this.smtpClient.mailFrom(from);
199
+ const allRecipients = [
200
+ ...options.to,
201
+ ...(options.cc ?? []),
202
+ ...(options.bcc ?? []),
203
+ ];
204
+ for (const recipient of allRecipients) {
205
+ await this.smtpClient.rcptTo(recipient);
206
+ }
207
+ await this.smtpClient.data(message);
208
+ return { id: messageId };
209
+ }
210
+ // --- Private helpers ---
211
+ sanitizeHeader(value) {
212
+ if (/[\r\n]/.test(value)) {
213
+ throw new Error("Header value must not contain CR or LF");
214
+ }
215
+ return value;
216
+ }
217
+ ensureConnected() {
218
+ if (!this.client) {
219
+ throw new Error("Not connected. Call connect() first.");
220
+ }
221
+ return this.client;
222
+ }
223
+ validateFolder(folder) {
224
+ if (!this.folderList.includes(folder)) {
225
+ throw new Error(`Unknown folder: ${folder}`);
226
+ }
227
+ }
228
+ extractSearchUids(responses) {
229
+ for (const resp of responses) {
230
+ if (resp.type === "SEARCH") {
231
+ return (0, parser_js_1.parseSearchResponse)(resp.text);
232
+ }
233
+ }
234
+ return [];
235
+ }
236
+ mapFetchResponses(responses, folder) {
237
+ const messages = [];
238
+ for (const resp of responses) {
239
+ if (resp.type === "FETCH") {
240
+ const parsed = (0, parser_js_1.parseFetchResponse)(resp.text);
241
+ if (parsed.uid && parsed.envelope) {
242
+ messages.push(this.mapImapMessage(parsed, folder));
243
+ }
244
+ }
245
+ }
246
+ // Sort by UID descending (newest first)
247
+ messages.sort((a, b) => {
248
+ const uidA = decodeMessageId(a.id).uid;
249
+ const uidB = decodeMessageId(b.id).uid;
250
+ return uidB - uidA;
251
+ });
252
+ return messages;
253
+ }
254
+ mapImapMessage(parsed, folder) {
255
+ const env = parsed.envelope;
256
+ const message = {
257
+ id: encodeMessageId(folder, parsed.uid),
258
+ subject: env.subject,
259
+ from: env.from[0]?.email ?? env.from[0]?.name ?? "",
260
+ to: env.to.map((a) => a.email),
261
+ date: env.date,
262
+ snippet: "",
263
+ isRead: parsed.flags?.includes("\\Seen") ?? false,
264
+ folder,
265
+ };
266
+ const cc = env.cc.map((a) => a.email);
267
+ if (cc.length > 0) {
268
+ message.cc = cc;
269
+ }
270
+ return message;
271
+ }
272
+ }
273
+ exports.ImapBackend = ImapBackend;
274
+ // --- Message ID encoding ---
275
+ function encodeMessageId(folder, uid) {
276
+ return `${folder}:${uid}`;
277
+ }
278
+ function decodeMessageId(id) {
279
+ const lastColon = id.lastIndexOf(":");
280
+ if (lastColon === -1) {
281
+ throw new client_js_1.ImapError("invalidId", `Malformed message ID: ${id}`);
282
+ }
283
+ const folder = id.substring(0, lastColon);
284
+ const uid = parseInt(id.substring(lastColon + 1), 10);
285
+ if (isNaN(uid)) {
286
+ throw new client_js_1.ImapError("invalidId", `Malformed UID in ID: ${id}`);
287
+ }
288
+ return { folder, uid };
289
+ }
290
+ // --- IMAP string quoting ---
291
+ function quoteImapString(value) {
292
+ if (/[\r\n\x00]/.test(value)) {
293
+ throw new Error("IMAP string must not contain CR, LF, or NUL");
294
+ }
295
+ if (/[\s"\\(){}\x00-\x1f\x7f]/.test(value)) {
296
+ return '"' + value.replace(/["\\]/g, "\\$&") + '"';
297
+ }
298
+ return value;
299
+ }
300
+ //# sourceMappingURL=imap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imap.js","sourceRoot":"","sources":["../../src/backends/imap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { EmailBackend, EmailMessage, ListMessagesOptions, SearchOptions, SendMessageOptions } from "../types.js";
2
+ export interface JmapConfig {
3
+ token: string;
4
+ sessionUrl?: string;
5
+ }
6
+ export declare class JmapError extends Error {
7
+ readonly type: string;
8
+ readonly description: string;
9
+ constructor(type: string, description: string);
10
+ }
11
+ export declare class JmapBackend implements EmailBackend {
12
+ private config;
13
+ private session;
14
+ private identity;
15
+ private mailboxCache;
16
+ private mailboxNameToId;
17
+ constructor(config: JmapConfig);
18
+ connect(): Promise<void>;
19
+ disconnect(): Promise<void>;
20
+ listFolders(): Promise<string[]>;
21
+ listMessages(options?: ListMessagesOptions): Promise<EmailMessage[]>;
22
+ getMessage(id: string): Promise<EmailMessage | null>;
23
+ searchMessages(options: SearchOptions): Promise<EmailMessage[]>;
24
+ sendMessage(options: SendMessageOptions): Promise<{
25
+ id: string;
26
+ }>;
27
+ private ensureConnected;
28
+ private jmapRequest;
29
+ private findResponse;
30
+ private buildMailboxPath;
31
+ private mapJmapEmail;
32
+ }
33
+ //# sourceMappingURL=jmap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jmap.d.ts","sourceRoot":"","sources":["../../src/backends/jmap.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACnB,aAAa,EACb,kBAAkB,EACnB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAoBD,qBAAa,SAAU,SAAQ,KAAK;aAEhB,IAAI,EAAE,MAAM;aACZ,WAAW,EAAE,MAAM;gBADnB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM;CAKtC;AA2BD,qBAAa,WAAY,YAAW,YAAY;IAC9C,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,eAAe,CAA6B;gBAExC,MAAM,EAAE,UAAU;IAIxB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAgExB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAO3B,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAIhC,YAAY,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IA4CpE,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAuCpD,cAAc,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IA0C/D,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IAoFvE,OAAO,CAAC,eAAe;YAOT,WAAW;IAmCzB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,gBAAgB;IAexB,OAAO,CAAC,YAAY;CAwBrB"}