@mindstone-engineering/mcp-server-email-imap 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.
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Path to bridge state file, supporting both current and legacy env vars.
3
+ */
4
+ export declare const BRIDGE_STATE_PATH: string;
5
+ /**
6
+ * Send a request to the host app bridge.
7
+ *
8
+ * The bridge is an HTTP server running inside the host app (e.g. Rebel)
9
+ * that handles credential management and other cross-process operations.
10
+ */
11
+ export declare const bridgeRequest: (urlPath: string, body: Record<string, unknown>) => Promise<{
12
+ success: boolean;
13
+ warning?: string;
14
+ error?: string;
15
+ }>;
16
+ //# sourceMappingURL=bridge.d.ts.map
package/dist/bridge.js ADDED
@@ -0,0 +1,43 @@
1
+ import * as fs from 'fs';
2
+ import { REQUEST_TIMEOUT_MS } from './types.js';
3
+ /**
4
+ * Path to bridge state file, supporting both current and legacy env vars.
5
+ */
6
+ export const BRIDGE_STATE_PATH = process.env.MCP_HOST_BRIDGE_STATE || process.env.MINDSTONE_REBEL_BRIDGE_STATE || '';
7
+ const loadBridgeState = () => {
8
+ if (!BRIDGE_STATE_PATH)
9
+ return null;
10
+ try {
11
+ const raw = fs.readFileSync(BRIDGE_STATE_PATH, 'utf8');
12
+ return JSON.parse(raw);
13
+ }
14
+ catch {
15
+ return null;
16
+ }
17
+ };
18
+ /**
19
+ * Send a request to the host app bridge.
20
+ *
21
+ * The bridge is an HTTP server running inside the host app (e.g. Rebel)
22
+ * that handles credential management and other cross-process operations.
23
+ */
24
+ export const bridgeRequest = async (urlPath, body) => {
25
+ const bridge = loadBridgeState();
26
+ if (!bridge) {
27
+ return { success: false, error: 'Bridge not available' };
28
+ }
29
+ const response = await fetch(`http://127.0.0.1:${bridge.port}${urlPath}`, {
30
+ method: 'POST',
31
+ signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
32
+ headers: {
33
+ 'Content-Type': 'application/json',
34
+ Authorization: `Bearer ${bridge.token}`,
35
+ },
36
+ body: JSON.stringify(body),
37
+ });
38
+ if (response.status === 401 || response.status === 403) {
39
+ return { success: false, error: `Bridge returned ${response.status}: unauthorized. Check host app authentication.` };
40
+ }
41
+ return response.json();
42
+ };
43
+ //# sourceMappingURL=bridge.js.map
@@ -0,0 +1,21 @@
1
+ import { ImapFlow, type MailboxLockObject } from 'imapflow';
2
+ import type { ImapClientConfig } from './types.js';
3
+ /**
4
+ * Initialize IMAP client with the given configuration.
5
+ * If the config is the same as the current one, this is a no-op.
6
+ * Otherwise, cleans up the existing connection before applying new config.
7
+ */
8
+ export declare function initImap(nextConfig: ImapClientConfig): Promise<void>;
9
+ /**
10
+ * Get an active IMAP connection, reconnecting if necessary.
11
+ */
12
+ export declare function getConnection(): Promise<ImapFlow>;
13
+ /**
14
+ * Acquire a mailbox lock, validating UID validity hasn't changed.
15
+ */
16
+ export declare function getMailboxLock(mailbox: string): Promise<MailboxLockObject>;
17
+ /**
18
+ * Clean up the IMAP connection and reset state.
19
+ */
20
+ export declare function cleanup(): Promise<void>;
21
+ //# sourceMappingURL=imap-client.d.ts.map
@@ -0,0 +1,144 @@
1
+ import { ImapFlow } from 'imapflow';
2
+ let config = null;
3
+ let client = null;
4
+ let connectPromise = null;
5
+ const uidValidityByMailbox = new Map();
6
+ let signalHandlersRegistered = false;
7
+ function normalizeMailboxName(mailbox) {
8
+ return mailbox.toUpperCase() === 'INBOX' ? 'INBOX' : mailbox;
9
+ }
10
+ function sameConfig(a, b) {
11
+ return (a.host === b.host &&
12
+ a.port === b.port &&
13
+ a.tls === b.tls &&
14
+ a.user === b.user &&
15
+ a.pass === b.pass);
16
+ }
17
+ function registerSignalHandlers() {
18
+ if (signalHandlersRegistered) {
19
+ return;
20
+ }
21
+ signalHandlersRegistered = true;
22
+ const handleShutdown = () => {
23
+ void cleanup();
24
+ };
25
+ process.once('SIGTERM', handleShutdown);
26
+ process.once('SIGINT', handleShutdown);
27
+ }
28
+ /**
29
+ * Initialize IMAP client with the given configuration.
30
+ * If the config is the same as the current one, this is a no-op.
31
+ * Otherwise, cleans up the existing connection before applying new config.
32
+ */
33
+ export async function initImap(nextConfig) {
34
+ registerSignalHandlers();
35
+ if (config && sameConfig(config, nextConfig)) {
36
+ return;
37
+ }
38
+ await cleanup();
39
+ config = { ...nextConfig };
40
+ }
41
+ async function createConnection() {
42
+ if (!config) {
43
+ throw new Error('IMAP client is not initialized');
44
+ }
45
+ const nextClient = new ImapFlow({
46
+ host: config.host,
47
+ port: config.port,
48
+ secure: config.tls,
49
+ auth: {
50
+ user: config.user,
51
+ pass: config.pass,
52
+ },
53
+ logger: false,
54
+ });
55
+ await nextClient.connect();
56
+ nextClient.on('close', () => {
57
+ if (client === nextClient) {
58
+ client = null;
59
+ }
60
+ });
61
+ client = nextClient;
62
+ return nextClient;
63
+ }
64
+ /**
65
+ * Get an active IMAP connection, reconnecting if necessary.
66
+ */
67
+ export async function getConnection() {
68
+ if (connectPromise) {
69
+ return connectPromise;
70
+ }
71
+ if (client && client.usable) {
72
+ try {
73
+ await client.noop();
74
+ return client;
75
+ }
76
+ catch {
77
+ try {
78
+ client.close();
79
+ }
80
+ catch {
81
+ // ignore close errors
82
+ }
83
+ client = null;
84
+ }
85
+ }
86
+ connectPromise = createConnection().finally(() => {
87
+ connectPromise = null;
88
+ });
89
+ return connectPromise;
90
+ }
91
+ /**
92
+ * Acquire a mailbox lock, validating UID validity hasn't changed.
93
+ */
94
+ export async function getMailboxLock(mailbox) {
95
+ const connection = await getConnection();
96
+ const lock = await connection.getMailboxLock(mailbox);
97
+ try {
98
+ const openedMailbox = connection.mailbox;
99
+ if (openedMailbox) {
100
+ const mailboxName = normalizeMailboxName(openedMailbox.path);
101
+ const previousUidValidity = uidValidityByMailbox.get(mailboxName);
102
+ const currentUidValidity = openedMailbox.uidValidity;
103
+ if (previousUidValidity !== undefined &&
104
+ previousUidValidity !== currentUidValidity) {
105
+ throw new Error('Mailbox was reorganized, please re-search');
106
+ }
107
+ uidValidityByMailbox.set(mailboxName, currentUidValidity);
108
+ }
109
+ return lock;
110
+ }
111
+ catch (error) {
112
+ lock.release();
113
+ throw error;
114
+ }
115
+ }
116
+ /**
117
+ * Clean up the IMAP connection and reset state.
118
+ */
119
+ export async function cleanup() {
120
+ const activeClient = client;
121
+ client = null;
122
+ connectPromise = null;
123
+ uidValidityByMailbox.clear();
124
+ if (!activeClient) {
125
+ return;
126
+ }
127
+ try {
128
+ if (activeClient.usable) {
129
+ await activeClient.logout();
130
+ }
131
+ else {
132
+ activeClient.close();
133
+ }
134
+ }
135
+ catch {
136
+ try {
137
+ activeClient.close();
138
+ }
139
+ catch {
140
+ // ignore close errors
141
+ }
142
+ }
143
+ }
144
+ //# sourceMappingURL=imap-client.js.map
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Email IMAP MCP Server
4
+ *
5
+ * Provides IMAP/SMTP email integration via Model Context Protocol.
6
+ * Supports multiple email providers: iCloud Mail, Yahoo Mail, and custom IMAP.
7
+ *
8
+ * Environment variables:
9
+ * - EMAIL_IMAP_EMAIL: Email address
10
+ * - EMAIL_IMAP_PASSWORD: App-specific password
11
+ * - EMAIL_IMAP_PROVIDER: Provider preset (icloud, yahoo, custom)
12
+ * - EMAIL_IMAP_IMAP_HOST: Custom IMAP server host
13
+ * - EMAIL_IMAP_IMAP_PORT: Custom IMAP server port (default: 993)
14
+ * - EMAIL_IMAP_SMTP_HOST: Custom SMTP server host
15
+ * - EMAIL_IMAP_SMTP_PORT: Custom SMTP server port (default: 587)
16
+ * - MCP_HOST_BRIDGE_STATE: Path to host app bridge state file (optional)
17
+ * - MINDSTONE_REBEL_BRIDGE_STATE: Legacy bridge state path (optional)
18
+ */
19
+ export {};
20
+ //# sourceMappingURL=index.d.ts.map
package/dist/index.js ADDED
@@ -0,0 +1,45 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Email IMAP MCP Server
4
+ *
5
+ * Provides IMAP/SMTP email integration via Model Context Protocol.
6
+ * Supports multiple email providers: iCloud Mail, Yahoo Mail, and custom IMAP.
7
+ *
8
+ * Environment variables:
9
+ * - EMAIL_IMAP_EMAIL: Email address
10
+ * - EMAIL_IMAP_PASSWORD: App-specific password
11
+ * - EMAIL_IMAP_PROVIDER: Provider preset (icloud, yahoo, custom)
12
+ * - EMAIL_IMAP_IMAP_HOST: Custom IMAP server host
13
+ * - EMAIL_IMAP_IMAP_PORT: Custom IMAP server port (default: 993)
14
+ * - EMAIL_IMAP_SMTP_HOST: Custom SMTP server host
15
+ * - EMAIL_IMAP_SMTP_PORT: Custom SMTP server port (default: 587)
16
+ * - MCP_HOST_BRIDGE_STATE: Path to host app bridge state file (optional)
17
+ * - MINDSTONE_REBEL_BRIDGE_STATE: Legacy bridge state path (optional)
18
+ */
19
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
20
+ import { createServer } from './server.js';
21
+ import { initClients, getCredentials } from './tools/index.js';
22
+ async function main() {
23
+ const server = createServer();
24
+ // Attempt to initialize from env vars at startup
25
+ const creds = getCredentials();
26
+ const email = creds.email.trim();
27
+ const password = creds.password.trim();
28
+ if (email && password) {
29
+ const provider = creds.provider.trim().toLowerCase() || 'icloud';
30
+ try {
31
+ await initClients({ email, password, provider });
32
+ }
33
+ catch (error) {
34
+ console.error('Failed to initialize Email IMAP clients from environment:', error);
35
+ }
36
+ }
37
+ const transport = new StdioServerTransport();
38
+ await server.connect(transport);
39
+ console.error('Email IMAP MCP server running on stdio');
40
+ }
41
+ main().catch((error) => {
42
+ console.error('Fatal error:', error);
43
+ process.exit(1);
44
+ });
45
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,10 @@
1
+ import type { ProviderPreset } from './types.js';
2
+ /**
3
+ * Get provider preset by name. Returns undefined for custom/unknown providers.
4
+ */
5
+ export declare function getPreset(provider: string): ProviderPreset | undefined;
6
+ /**
7
+ * Check if the given domain is a Yahoo-family domain.
8
+ */
9
+ export declare function isYahooDomain(domain: string): boolean;
10
+ //# sourceMappingURL=presets.d.ts.map
@@ -0,0 +1,56 @@
1
+ const PRESETS = {
2
+ icloud: {
3
+ name: 'iCloud Mail',
4
+ imapHost: 'imap.mail.me.com',
5
+ imapPort: 993,
6
+ imapTls: true,
7
+ smtpHost: 'smtp.mail.me.com',
8
+ smtpPort: 587,
9
+ smtpSecure: false,
10
+ authType: 'app-password',
11
+ folderFallbacks: {
12
+ sent: ['Sent Messages', 'Sent'],
13
+ trash: ['Deleted Messages', 'Trash'],
14
+ junk: ['Junk'],
15
+ drafts: ['Drafts'],
16
+ archive: ['Archive'],
17
+ },
18
+ emailDomains: ['icloud.com', 'me.com', 'mac.com'],
19
+ },
20
+ yahoo: {
21
+ name: 'Yahoo Mail',
22
+ imapHost: 'imap.mail.yahoo.com',
23
+ imapPort: 993,
24
+ imapTls: true,
25
+ smtpHost: 'smtp.mail.yahoo.com',
26
+ smtpPort: 465,
27
+ smtpSecure: true,
28
+ authType: 'app-password',
29
+ folderFallbacks: {
30
+ sent: ['Sent'],
31
+ trash: ['Trash'],
32
+ junk: ['Bulk Mail', 'Spam'],
33
+ drafts: ['Draft', 'Drafts'],
34
+ archive: ['Archive'],
35
+ },
36
+ quirks: ['5 simultaneous IMAP connections per IP'],
37
+ emailDomains: [],
38
+ },
39
+ };
40
+ /**
41
+ * Get provider preset by name. Returns undefined for custom/unknown providers.
42
+ */
43
+ export function getPreset(provider) {
44
+ return PRESETS[provider.toLowerCase()];
45
+ }
46
+ /**
47
+ * Check if the given domain is a Yahoo-family domain.
48
+ */
49
+ export function isYahooDomain(domain) {
50
+ const normalized = domain.trim().toLowerCase();
51
+ return (normalized === 'ymail.com' ||
52
+ normalized === 'rocketmail.com' ||
53
+ normalized === 'yahoo.com' ||
54
+ normalized.startsWith('yahoo.'));
55
+ }
56
+ //# sourceMappingURL=presets.js.map
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function createServer(): McpServer;
3
+ //# sourceMappingURL=server.d.ts.map
package/dist/server.js ADDED
@@ -0,0 +1,14 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { registerConfigureTools, registerMailboxTools, registerMessageTools, registerSendTools, } from './tools/index.js';
3
+ export function createServer() {
4
+ const server = new McpServer({
5
+ name: 'email-imap-mcp-server',
6
+ version: '0.1.0',
7
+ });
8
+ registerConfigureTools(server);
9
+ registerMailboxTools(server);
10
+ registerMessageTools(server);
11
+ registerSendTools(server);
12
+ return server;
13
+ }
14
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1,15 @@
1
+ import type { SmtpClientConfig, MailTransporter } from './types.js';
2
+ /**
3
+ * Initialize SMTP transport with the given configuration.
4
+ * If the config is the same as the current one, this is a no-op.
5
+ */
6
+ export declare function initSmtp(nextConfig: SmtpClientConfig): Promise<void>;
7
+ /**
8
+ * Get the SMTP transport, creating it lazily if needed.
9
+ */
10
+ export declare function getTransport(): Promise<MailTransporter>;
11
+ /**
12
+ * Clean up the SMTP transport.
13
+ */
14
+ export declare function cleanup(): Promise<void>;
15
+ //# sourceMappingURL=smtp-client.d.ts.map
@@ -0,0 +1,61 @@
1
+ import nodemailer from 'nodemailer';
2
+ let config = null;
3
+ let transport = null;
4
+ function sameConfig(a, b) {
5
+ return (a.host === b.host &&
6
+ a.port === b.port &&
7
+ a.secure === b.secure &&
8
+ a.user === b.user &&
9
+ a.pass === b.pass);
10
+ }
11
+ /**
12
+ * Initialize SMTP transport with the given configuration.
13
+ * If the config is the same as the current one, this is a no-op.
14
+ */
15
+ export async function initSmtp(nextConfig) {
16
+ if (config && sameConfig(config, nextConfig)) {
17
+ return;
18
+ }
19
+ await cleanup();
20
+ config = { ...nextConfig };
21
+ }
22
+ /**
23
+ * Get the SMTP transport, creating it lazily if needed.
24
+ */
25
+ export async function getTransport() {
26
+ if (transport) {
27
+ return transport;
28
+ }
29
+ if (!config) {
30
+ throw new Error('SMTP client is not initialized');
31
+ }
32
+ const nextTransport = nodemailer.createTransport({
33
+ host: config.host,
34
+ port: config.port,
35
+ secure: config.secure,
36
+ auth: {
37
+ user: config.user,
38
+ pass: config.pass,
39
+ },
40
+ });
41
+ if (typeof nextTransport.verify === 'function') {
42
+ await nextTransport.verify();
43
+ }
44
+ transport = nextTransport;
45
+ return nextTransport;
46
+ }
47
+ /**
48
+ * Clean up the SMTP transport.
49
+ */
50
+ export async function cleanup() {
51
+ if (!transport) {
52
+ return;
53
+ }
54
+ try {
55
+ transport.close();
56
+ }
57
+ finally {
58
+ transport = null;
59
+ }
60
+ }
61
+ //# sourceMappingURL=smtp-client.js.map
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Configure tool — credentials management and provider selection.
3
+ */
4
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
+ export declare function getCredentials(): {
6
+ email: string;
7
+ password: string;
8
+ provider: string;
9
+ };
10
+ export declare function setCredentials(email: string, password: string, provider: string): void;
11
+ export declare function registerConfigureTools(server: McpServer): void;
12
+ //# sourceMappingURL=configure.d.ts.map
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Configure tool — credentials management and provider selection.
3
+ */
4
+ import { z } from 'zod';
5
+ import { bridgeRequest, BRIDGE_STATE_PATH } from '../bridge.js';
6
+ import { getPreset } from '../presets.js';
7
+ import { EmailImapError } from '../types.js';
8
+ import { withErrorHandling } from '../utils.js';
9
+ import { initClients } from './index.js';
10
+ /**
11
+ * Mutable env-level credential state.
12
+ * Updated when the configure tool is called, so subsequent tool calls
13
+ * use the new credentials even if the original env vars were empty.
14
+ */
15
+ let EMAIL_IMAP_EMAIL = process.env.EMAIL_IMAP_EMAIL ?? '';
16
+ let EMAIL_IMAP_PASSWORD = process.env.EMAIL_IMAP_PASSWORD ?? '';
17
+ let EMAIL_IMAP_PROVIDER = process.env.EMAIL_IMAP_PROVIDER ?? '';
18
+ export function getCredentials() {
19
+ return {
20
+ email: EMAIL_IMAP_EMAIL,
21
+ password: EMAIL_IMAP_PASSWORD,
22
+ provider: EMAIL_IMAP_PROVIDER,
23
+ };
24
+ }
25
+ export function setCredentials(email, password, provider) {
26
+ EMAIL_IMAP_EMAIL = email;
27
+ EMAIL_IMAP_PASSWORD = password;
28
+ EMAIL_IMAP_PROVIDER = provider;
29
+ }
30
+ export function registerConfigureTools(server) {
31
+ server.registerTool('configure_email_imap', {
32
+ description: 'Configure email account. Call this when the user provides their email and app-specific password. ' +
33
+ 'For iCloud: generate an app-specific password at account.apple.com → Sign-In and Security → App-Specific Passwords ' +
34
+ '(guide: support.apple.com/en-gb/102654). For Yahoo: generate an app password at login.yahoo.com/myaccount/security/app-password.',
35
+ inputSchema: z.object({
36
+ email: z.string().min(1).describe('Email address for the account'),
37
+ password: z.string().min(1).describe('App-specific password for the account'),
38
+ provider: z
39
+ .string()
40
+ .optional()
41
+ .describe('Email provider preset (icloud, yahoo, or custom)'),
42
+ }),
43
+ annotations: { readOnlyHint: false, destructiveHint: false },
44
+ }, withErrorHandling(async (args) => {
45
+ const email = args.email.trim();
46
+ const password = args.password.trim();
47
+ const providerArg = args.provider?.trim().toLowerCase() ?? '';
48
+ const provider = providerArg || EMAIL_IMAP_PROVIDER?.trim().toLowerCase() || 'icloud';
49
+ // For known providers, validate the preset
50
+ if (provider !== 'custom') {
51
+ const preset = getPreset(provider);
52
+ if (!preset) {
53
+ throw new EmailImapError(`Unsupported provider "${provider}". Supported providers: icloud, yahoo, custom.`, 'INVALID_PROVIDER', 'Use one of the supported providers or "custom" with explicit IMAP/SMTP settings.');
54
+ }
55
+ }
56
+ // If bridge is available, persist via bridge
57
+ if (BRIDGE_STATE_PATH) {
58
+ try {
59
+ const result = await bridgeRequest('/bundled/email-imap/configure', {
60
+ email,
61
+ password,
62
+ provider,
63
+ });
64
+ if (result.success) {
65
+ setCredentials(email, password, provider);
66
+ await initClients({
67
+ email,
68
+ password,
69
+ provider,
70
+ });
71
+ const preset = getPreset(provider);
72
+ const providerName = preset?.name ?? provider;
73
+ const message = result.warning
74
+ ? `Email IMAP configured successfully. Note: ${result.warning}`
75
+ : `Email IMAP configured successfully for ${providerName}.`;
76
+ return JSON.stringify({ ok: true, message, provider });
77
+ }
78
+ // Bridge returned failure — surface as error, do NOT fall through
79
+ throw new EmailImapError(result.error || 'Bridge configuration failed', 'BRIDGE_ERROR', 'The host app bridge rejected the configuration request. Check the host app logs.');
80
+ }
81
+ catch (error) {
82
+ if (error instanceof EmailImapError)
83
+ throw error;
84
+ // Bridge request failed (network, timeout, etc.) — surface as error
85
+ throw new EmailImapError(`Bridge request failed: ${error instanceof Error ? error.message : String(error)}`, 'BRIDGE_ERROR', 'Could not reach the host app bridge. Ensure the host app is running.');
86
+ }
87
+ }
88
+ // No bridge — configure directly
89
+ setCredentials(email, password, provider);
90
+ await initClients({
91
+ email,
92
+ password,
93
+ provider,
94
+ });
95
+ const preset = getPreset(provider);
96
+ const providerName = preset?.name ?? provider;
97
+ return JSON.stringify({
98
+ ok: true,
99
+ message: `Email IMAP configured successfully for ${providerName}.`,
100
+ provider,
101
+ });
102
+ }));
103
+ }
104
+ //# sourceMappingURL=configure.js.map
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Email IMAP tool registration — aggregates all tool modules.
3
+ */
4
+ export { registerMailboxTools } from './mailbox.js';
5
+ export { registerMessageTools } from './messages.js';
6
+ export { registerSendTools } from './send.js';
7
+ export { registerConfigureTools, getCredentials, setCredentials } from './configure.js';
8
+ /**
9
+ * Options for initializing email clients.
10
+ * Can be passed a full ClientConfig or simplified provider-based options.
11
+ */
12
+ interface InitClientsOptions {
13
+ email: string;
14
+ password: string;
15
+ provider: string;
16
+ /** Explicit IMAP/SMTP config overrides (for custom provider) */
17
+ imapHost?: string;
18
+ imapPort?: number;
19
+ imapTls?: boolean;
20
+ smtpHost?: string;
21
+ smtpPort?: number;
22
+ smtpSecure?: boolean;
23
+ }
24
+ /**
25
+ * Initialize IMAP and SMTP clients from provider settings or explicit config.
26
+ */
27
+ export declare function initClients(options: InitClientsOptions): Promise<void>;
28
+ /**
29
+ * Clean up all email clients.
30
+ */
31
+ export declare function cleanupClients(): Promise<void>;
32
+ //# sourceMappingURL=index.d.ts.map