@kononenko-e/email-mcp 0.2.3
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/LICENSE +155 -0
- package/README.md +820 -0
- package/dist/cli/account-commands.d.ts +10 -0
- package/dist/cli/account-commands.d.ts.map +1 -0
- package/dist/cli/account-commands.js +703 -0
- package/dist/cli/account-commands.js.map +1 -0
- package/dist/cli/config-commands.d.ts +9 -0
- package/dist/cli/config-commands.d.ts.map +1 -0
- package/dist/cli/config-commands.js +156 -0
- package/dist/cli/config-commands.js.map +1 -0
- package/dist/cli/guard.d.ts +11 -0
- package/dist/cli/guard.d.ts.map +1 -0
- package/dist/cli/guard.js +18 -0
- package/dist/cli/guard.js.map +1 -0
- package/dist/cli/install-commands.d.ts +12 -0
- package/dist/cli/install-commands.d.ts.map +1 -0
- package/dist/cli/install-commands.js +320 -0
- package/dist/cli/install-commands.js.map +1 -0
- package/dist/cli/notify.d.ts +8 -0
- package/dist/cli/notify.d.ts.map +1 -0
- package/dist/cli/notify.js +143 -0
- package/dist/cli/notify.js.map +1 -0
- package/dist/cli/providers.d.ts +13 -0
- package/dist/cli/providers.d.ts.map +1 -0
- package/dist/cli/providers.js +180 -0
- package/dist/cli/providers.js.map +1 -0
- package/dist/cli/scheduler.d.ts +8 -0
- package/dist/cli/scheduler.d.ts.map +1 -0
- package/dist/cli/scheduler.js +268 -0
- package/dist/cli/scheduler.js.map +1 -0
- package/dist/cli/setup.d.ts +12 -0
- package/dist/cli/setup.d.ts.map +1 -0
- package/dist/cli/setup.js +15 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/cli/test.d.ts +7 -0
- package/dist/cli/test.d.ts.map +1 -0
- package/dist/cli/test.js +67 -0
- package/dist/cli/test.js.map +1 -0
- package/dist/config/loader.d.ts +36 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +372 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/schema.d.ts +351 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +165 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/xdg.d.ts +27 -0
- package/dist/config/xdg.d.ts.map +1 -0
- package/dist/config/xdg.js +30 -0
- package/dist/config/xdg.js.map +1 -0
- package/dist/connections/manager.d.ts +43 -0
- package/dist/connections/manager.d.ts.map +1 -0
- package/dist/connections/manager.js +272 -0
- package/dist/connections/manager.js.map +1 -0
- package/dist/connections/types.d.ts +13 -0
- package/dist/connections/types.d.ts.map +1 -0
- package/dist/connections/types.js +2 -0
- package/dist/connections/types.js.map +1 -0
- package/dist/logging.d.ts +46 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +63 -0
- package/dist/logging.js.map +1 -0
- package/dist/main.d.ts +14 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +381 -0
- package/dist/main.js.map +1 -0
- package/dist/prompts/actions.prompt.d.ts +9 -0
- package/dist/prompts/actions.prompt.d.ts.map +1 -0
- package/dist/prompts/actions.prompt.js +64 -0
- package/dist/prompts/actions.prompt.js.map +1 -0
- package/dist/prompts/calendar.prompt.d.ts +9 -0
- package/dist/prompts/calendar.prompt.d.ts.map +1 -0
- package/dist/prompts/calendar.prompt.js +55 -0
- package/dist/prompts/calendar.prompt.js.map +1 -0
- package/dist/prompts/cleanup.prompt.d.ts +9 -0
- package/dist/prompts/cleanup.prompt.d.ts.map +1 -0
- package/dist/prompts/cleanup.prompt.js +78 -0
- package/dist/prompts/cleanup.prompt.js.map +1 -0
- package/dist/prompts/compose.prompt.d.ts +8 -0
- package/dist/prompts/compose.prompt.d.ts.map +1 -0
- package/dist/prompts/compose.prompt.js +116 -0
- package/dist/prompts/compose.prompt.js.map +1 -0
- package/dist/prompts/register.d.ts +8 -0
- package/dist/prompts/register.d.ts.map +1 -0
- package/dist/prompts/register.js +20 -0
- package/dist/prompts/register.js.map +1 -0
- package/dist/prompts/thread.prompt.d.ts +9 -0
- package/dist/prompts/thread.prompt.d.ts.map +1 -0
- package/dist/prompts/thread.prompt.js +58 -0
- package/dist/prompts/thread.prompt.js.map +1 -0
- package/dist/prompts/triage.prompt.d.ts +9 -0
- package/dist/prompts/triage.prompt.d.ts.map +1 -0
- package/dist/prompts/triage.prompt.js +64 -0
- package/dist/prompts/triage.prompt.js.map +1 -0
- package/dist/resources/accounts.resource.d.ts +9 -0
- package/dist/resources/accounts.resource.d.ts.map +1 -0
- package/dist/resources/accounts.resource.js +26 -0
- package/dist/resources/accounts.resource.js.map +1 -0
- package/dist/resources/mailboxes.resource.d.ts +10 -0
- package/dist/resources/mailboxes.resource.d.ts.map +1 -0
- package/dist/resources/mailboxes.resource.js +33 -0
- package/dist/resources/mailboxes.resource.js.map +1 -0
- package/dist/resources/register.d.ts +12 -0
- package/dist/resources/register.d.ts.map +1 -0
- package/dist/resources/register.js +20 -0
- package/dist/resources/register.js.map +1 -0
- package/dist/resources/scheduled.resource.d.ts +9 -0
- package/dist/resources/scheduled.resource.d.ts.map +1 -0
- package/dist/resources/scheduled.resource.js +31 -0
- package/dist/resources/scheduled.resource.js.map +1 -0
- package/dist/resources/stats.resource.d.ts +10 -0
- package/dist/resources/stats.resource.d.ts.map +1 -0
- package/dist/resources/stats.resource.js +45 -0
- package/dist/resources/stats.resource.js.map +1 -0
- package/dist/resources/templates.resource.d.ts +9 -0
- package/dist/resources/templates.resource.d.ts.map +1 -0
- package/dist/resources/templates.resource.js +34 -0
- package/dist/resources/templates.resource.js.map +1 -0
- package/dist/resources/unread.resource.d.ts +11 -0
- package/dist/resources/unread.resource.d.ts.map +1 -0
- package/dist/resources/unread.resource.js +46 -0
- package/dist/resources/unread.resource.js.map +1 -0
- package/dist/safety/audit.d.ts +17 -0
- package/dist/safety/audit.d.ts.map +1 -0
- package/dist/safety/audit.js +50 -0
- package/dist/safety/audit.js.map +1 -0
- package/dist/safety/rate-limiter.d.ts +22 -0
- package/dist/safety/rate-limiter.d.ts.map +1 -0
- package/dist/safety/rate-limiter.js +52 -0
- package/dist/safety/rate-limiter.js.map +1 -0
- package/dist/safety/validation.d.ts +44 -0
- package/dist/safety/validation.d.ts.map +1 -0
- package/dist/safety/validation.js +113 -0
- package/dist/safety/validation.js.map +1 -0
- package/dist/server.d.ts +10 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +25 -0
- package/dist/server.js.map +1 -0
- package/dist/services/calendar.service.d.ts +22 -0
- package/dist/services/calendar.service.d.ts.map +1 -0
- package/dist/services/calendar.service.js +115 -0
- package/dist/services/calendar.service.js.map +1 -0
- package/dist/services/event-bus.d.ts +28 -0
- package/dist/services/event-bus.d.ts.map +1 -0
- package/dist/services/event-bus.js +16 -0
- package/dist/services/event-bus.js.map +1 -0
- package/dist/services/hooks.service.d.ts +78 -0
- package/dist/services/hooks.service.d.ts.map +1 -0
- package/dist/services/hooks.service.js +497 -0
- package/dist/services/hooks.service.js.map +1 -0
- package/dist/services/imap.service.d.ts +133 -0
- package/dist/services/imap.service.d.ts.map +1 -0
- package/dist/services/imap.service.js +1393 -0
- package/dist/services/imap.service.js.map +1 -0
- package/dist/services/label-strategy.d.ts +20 -0
- package/dist/services/label-strategy.d.ts.map +1 -0
- package/dist/services/label-strategy.js +237 -0
- package/dist/services/label-strategy.js.map +1 -0
- package/dist/services/local-calendar.service.d.ts +126 -0
- package/dist/services/local-calendar.service.d.ts.map +1 -0
- package/dist/services/local-calendar.service.js +428 -0
- package/dist/services/local-calendar.service.js.map +1 -0
- package/dist/services/notifier.service.d.ts +66 -0
- package/dist/services/notifier.service.d.ts.map +1 -0
- package/dist/services/notifier.service.js +316 -0
- package/dist/services/notifier.service.js.map +1 -0
- package/dist/services/oauth.service.d.ts +47 -0
- package/dist/services/oauth.service.d.ts.map +1 -0
- package/dist/services/oauth.service.js +140 -0
- package/dist/services/oauth.service.js.map +1 -0
- package/dist/services/presets.d.ts +36 -0
- package/dist/services/presets.d.ts.map +1 -0
- package/dist/services/presets.js +173 -0
- package/dist/services/presets.js.map +1 -0
- package/dist/services/reminders.service.d.ts +63 -0
- package/dist/services/reminders.service.d.ts.map +1 -0
- package/dist/services/reminders.service.js +281 -0
- package/dist/services/reminders.service.js.map +1 -0
- package/dist/services/scheduler.service.d.ts +42 -0
- package/dist/services/scheduler.service.d.ts.map +1 -0
- package/dist/services/scheduler.service.js +260 -0
- package/dist/services/scheduler.service.js.map +1 -0
- package/dist/services/smtp.service.d.ts +40 -0
- package/dist/services/smtp.service.d.ts.map +1 -0
- package/dist/services/smtp.service.js +151 -0
- package/dist/services/smtp.service.js.map +1 -0
- package/dist/services/template.service.d.ts +33 -0
- package/dist/services/template.service.d.ts.map +1 -0
- package/dist/services/template.service.js +123 -0
- package/dist/services/template.service.js.map +1 -0
- package/dist/services/watcher.service.d.ts +37 -0
- package/dist/services/watcher.service.d.ts.map +1 -0
- package/dist/services/watcher.service.js +244 -0
- package/dist/services/watcher.service.js.map +1 -0
- package/dist/tools/account-config.tool.d.ts +14 -0
- package/dist/tools/account-config.tool.d.ts.map +1 -0
- package/dist/tools/account-config.tool.js +245 -0
- package/dist/tools/account-config.tool.js.map +1 -0
- package/dist/tools/accounts.tool.d.ts +7 -0
- package/dist/tools/accounts.tool.d.ts.map +1 -0
- package/dist/tools/accounts.tool.js +29 -0
- package/dist/tools/accounts.tool.js.map +1 -0
- package/dist/tools/analytics.tool.d.ts +9 -0
- package/dist/tools/analytics.tool.d.ts.map +1 -0
- package/dist/tools/analytics.tool.js +27 -0
- package/dist/tools/analytics.tool.js.map +1 -0
- package/dist/tools/attachments.tool.d.ts +7 -0
- package/dist/tools/attachments.tool.d.ts.map +1 -0
- package/dist/tools/attachments.tool.js +45 -0
- package/dist/tools/attachments.tool.js.map +1 -0
- package/dist/tools/bulk.tool.d.ts +7 -0
- package/dist/tools/bulk.tool.d.ts.map +1 -0
- package/dist/tools/bulk.tool.js +75 -0
- package/dist/tools/bulk.tool.js.map +1 -0
- package/dist/tools/calendar.tool.d.ts +19 -0
- package/dist/tools/calendar.tool.d.ts.map +1 -0
- package/dist/tools/calendar.tool.js +538 -0
- package/dist/tools/calendar.tool.js.map +1 -0
- package/dist/tools/contacts.tool.d.ts +7 -0
- package/dist/tools/contacts.tool.d.ts.map +1 -0
- package/dist/tools/contacts.tool.js +44 -0
- package/dist/tools/contacts.tool.js.map +1 -0
- package/dist/tools/drafts.tool.d.ts +8 -0
- package/dist/tools/drafts.tool.d.ts.map +1 -0
- package/dist/tools/drafts.tool.js +92 -0
- package/dist/tools/drafts.tool.js.map +1 -0
- package/dist/tools/emails.tool.d.ts +7 -0
- package/dist/tools/emails.tool.d.ts.map +1 -0
- package/dist/tools/emails.tool.js +400 -0
- package/dist/tools/emails.tool.js.map +1 -0
- package/dist/tools/folders.tool.d.ts +7 -0
- package/dist/tools/folders.tool.d.ts.map +1 -0
- package/dist/tools/folders.tool.js +111 -0
- package/dist/tools/folders.tool.js.map +1 -0
- package/dist/tools/health.tool.d.ts +10 -0
- package/dist/tools/health.tool.d.ts.map +1 -0
- package/dist/tools/health.tool.js +78 -0
- package/dist/tools/health.tool.js.map +1 -0
- package/dist/tools/label.tool.d.ts +11 -0
- package/dist/tools/label.tool.d.ts.map +1 -0
- package/dist/tools/label.tool.js +165 -0
- package/dist/tools/label.tool.js.map +1 -0
- package/dist/tools/locate.tool.d.ts +11 -0
- package/dist/tools/locate.tool.d.ts.map +1 -0
- package/dist/tools/locate.tool.js +59 -0
- package/dist/tools/locate.tool.js.map +1 -0
- package/dist/tools/mailboxes.tool.d.ts +7 -0
- package/dist/tools/mailboxes.tool.d.ts.map +1 -0
- package/dist/tools/mailboxes.tool.js +38 -0
- package/dist/tools/mailboxes.tool.js.map +1 -0
- package/dist/tools/manage.tool.d.ts +7 -0
- package/dist/tools/manage.tool.d.ts.map +1 -0
- package/dist/tools/manage.tool.js +125 -0
- package/dist/tools/manage.tool.js.map +1 -0
- package/dist/tools/register.d.ts +21 -0
- package/dist/tools/register.d.ts.map +1 -0
- package/dist/tools/register.js +55 -0
- package/dist/tools/register.js.map +1 -0
- package/dist/tools/scheduler.tool.d.ts +9 -0
- package/dist/tools/scheduler.tool.d.ts.map +1 -0
- package/dist/tools/scheduler.tool.js +104 -0
- package/dist/tools/scheduler.tool.js.map +1 -0
- package/dist/tools/send.tool.d.ts +7 -0
- package/dist/tools/send.tool.d.ts.map +1 -0
- package/dist/tools/send.tool.js +123 -0
- package/dist/tools/send.tool.js.map +1 -0
- package/dist/tools/templates.tool.d.ts +12 -0
- package/dist/tools/templates.tool.d.ts.map +1 -0
- package/dist/tools/templates.tool.js +140 -0
- package/dist/tools/templates.tool.js.map +1 -0
- package/dist/tools/thread.tool.d.ts +10 -0
- package/dist/tools/thread.tool.d.ts.map +1 -0
- package/dist/tools/thread.tool.js +146 -0
- package/dist/tools/thread.tool.js.map +1 -0
- package/dist/tools/watcher.tool.d.ts +9 -0
- package/dist/tools/watcher.tool.d.ts.map +1 -0
- package/dist/tools/watcher.tool.js +282 -0
- package/dist/tools/watcher.tool.js.map +1 -0
- package/dist/types/index.d.ts +271 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/calendar-notes.d.ts +31 -0
- package/dist/utils/calendar-notes.d.ts.map +1 -0
- package/dist/utils/calendar-notes.js +99 -0
- package/dist/utils/calendar-notes.js.map +1 -0
- package/dist/utils/calendar-state.d.ts +27 -0
- package/dist/utils/calendar-state.d.ts.map +1 -0
- package/dist/utils/calendar-state.js +85 -0
- package/dist/utils/calendar-state.js.map +1 -0
- package/dist/utils/conference-details.d.ts +12 -0
- package/dist/utils/conference-details.d.ts.map +1 -0
- package/dist/utils/conference-details.js +71 -0
- package/dist/utils/conference-details.js.map +1 -0
- package/dist/utils/meeting-url.d.ts +10 -0
- package/dist/utils/meeting-url.d.ts.map +1 -0
- package/dist/utils/meeting-url.js +30 -0
- package/dist/utils/meeting-url.js.map +1 -0
- package/package.json +103 -0
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Connection manager for lazy-persistent IMAP and SMTP connections.
|
|
3
|
+
*
|
|
4
|
+
* - Creates connections on first use per account
|
|
5
|
+
* - Reuses open connections across tool calls
|
|
6
|
+
* - Auto-reconnects on failure
|
|
7
|
+
* - Graceful shutdown closes all connections
|
|
8
|
+
*/
|
|
9
|
+
import { ImapFlow } from 'imapflow';
|
|
10
|
+
import nodemailer from 'nodemailer';
|
|
11
|
+
import { mcpLog } from '../logging.js';
|
|
12
|
+
export default class ConnectionManager {
|
|
13
|
+
imapClients = new Map();
|
|
14
|
+
smtpTransports = new Map();
|
|
15
|
+
accounts = new Map();
|
|
16
|
+
oauthService;
|
|
17
|
+
constructor(accounts, oauthService) {
|
|
18
|
+
accounts.forEach((account) => {
|
|
19
|
+
this.accounts.set(account.name, account);
|
|
20
|
+
});
|
|
21
|
+
this.oauthService = oauthService;
|
|
22
|
+
}
|
|
23
|
+
// -------------------------------------------------------------------------
|
|
24
|
+
// Account lookup
|
|
25
|
+
// -------------------------------------------------------------------------
|
|
26
|
+
getAccount(name) {
|
|
27
|
+
const account = this.accounts.get(name);
|
|
28
|
+
if (!account) {
|
|
29
|
+
throw new Error(`Account "${name}" not found. Available: ${[...this.accounts.keys()].join(', ')}`);
|
|
30
|
+
}
|
|
31
|
+
return account;
|
|
32
|
+
}
|
|
33
|
+
getAccountNames() {
|
|
34
|
+
return [...this.accounts.keys()];
|
|
35
|
+
}
|
|
36
|
+
setAccounts(accounts) {
|
|
37
|
+
this.accounts.clear();
|
|
38
|
+
accounts.forEach((account) => {
|
|
39
|
+
this.accounts.set(account.name, account);
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
// -------------------------------------------------------------------------
|
|
43
|
+
// IMAP
|
|
44
|
+
// -------------------------------------------------------------------------
|
|
45
|
+
async getImapClient(accountName) {
|
|
46
|
+
const existing = this.imapClients.get(accountName);
|
|
47
|
+
if (existing?.usable) {
|
|
48
|
+
return existing;
|
|
49
|
+
}
|
|
50
|
+
// Clean up stale connection
|
|
51
|
+
if (existing) {
|
|
52
|
+
this.imapClients.delete(accountName);
|
|
53
|
+
try {
|
|
54
|
+
existing.close();
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
/* ignore */
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
const account = this.getAccount(accountName);
|
|
61
|
+
// Build auth config based on auth type
|
|
62
|
+
let auth;
|
|
63
|
+
if (account.oauth2 && this.oauthService) {
|
|
64
|
+
const accessToken = await this.oauthService.getAccessToken(account.oauth2);
|
|
65
|
+
auth = { user: account.username, accessToken };
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
auth = { user: account.username, pass: account.password };
|
|
69
|
+
}
|
|
70
|
+
const client = new ImapFlow({
|
|
71
|
+
host: account.imap.host,
|
|
72
|
+
port: account.imap.port,
|
|
73
|
+
secure: account.imap.tls,
|
|
74
|
+
tls: {
|
|
75
|
+
rejectUnauthorized: account.imap.verifySsl,
|
|
76
|
+
},
|
|
77
|
+
auth,
|
|
78
|
+
logger: false,
|
|
79
|
+
});
|
|
80
|
+
await client.connect();
|
|
81
|
+
await mcpLog('info', 'imap', `Connected to ${account.imap.host}:${account.imap.port} for "${accountName}"`);
|
|
82
|
+
this.imapClients.set(accountName, client);
|
|
83
|
+
return client;
|
|
84
|
+
}
|
|
85
|
+
// -------------------------------------------------------------------------
|
|
86
|
+
// SMTP
|
|
87
|
+
// -------------------------------------------------------------------------
|
|
88
|
+
static buildSmtpTransportOptions(account, auth) {
|
|
89
|
+
const pool = account.smtp.pool ?? {
|
|
90
|
+
enabled: true,
|
|
91
|
+
maxConnections: 1,
|
|
92
|
+
maxMessages: 100,
|
|
93
|
+
};
|
|
94
|
+
return {
|
|
95
|
+
host: account.smtp.host,
|
|
96
|
+
port: account.smtp.port,
|
|
97
|
+
secure: account.smtp.tls,
|
|
98
|
+
requireTLS: account.smtp.starttls,
|
|
99
|
+
ignoreTLS: !account.smtp.tls && !account.smtp.starttls,
|
|
100
|
+
tls: {
|
|
101
|
+
rejectUnauthorized: account.smtp.verifySsl,
|
|
102
|
+
},
|
|
103
|
+
auth,
|
|
104
|
+
pool: pool.enabled,
|
|
105
|
+
...(pool.enabled
|
|
106
|
+
? {
|
|
107
|
+
maxConnections: pool.maxConnections,
|
|
108
|
+
maxMessages: pool.maxMessages,
|
|
109
|
+
}
|
|
110
|
+
: {}),
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
async getSmtpTransport(accountName, options) {
|
|
114
|
+
const verify = options?.verify ?? false;
|
|
115
|
+
const existing = this.smtpTransports.get(accountName);
|
|
116
|
+
if (existing) {
|
|
117
|
+
if (!verify) {
|
|
118
|
+
return existing;
|
|
119
|
+
}
|
|
120
|
+
try {
|
|
121
|
+
await existing.verify();
|
|
122
|
+
return existing;
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
this.smtpTransports.delete(accountName);
|
|
126
|
+
try {
|
|
127
|
+
existing.close();
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
/* ignore */
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
const account = this.getAccount(accountName);
|
|
135
|
+
// Build auth config based on auth type
|
|
136
|
+
let auth;
|
|
137
|
+
if (account.oauth2 && this.oauthService) {
|
|
138
|
+
const accessToken = await this.oauthService.getAccessToken(account.oauth2);
|
|
139
|
+
auth = { type: 'OAuth2', user: account.username, accessToken };
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
auth = { user: account.username, pass: account.password };
|
|
143
|
+
}
|
|
144
|
+
const transport = nodemailer.createTransport(ConnectionManager.buildSmtpTransportOptions(account, auth));
|
|
145
|
+
await transport.verify();
|
|
146
|
+
await mcpLog('info', 'smtp', `Connected to ${account.smtp.host}:${account.smtp.port} for "${accountName}"`);
|
|
147
|
+
this.smtpTransports.set(accountName, transport);
|
|
148
|
+
return transport;
|
|
149
|
+
}
|
|
150
|
+
async verifySmtpTransport(accountName) {
|
|
151
|
+
await this.getSmtpTransport(accountName, { verify: true });
|
|
152
|
+
}
|
|
153
|
+
// -------------------------------------------------------------------------
|
|
154
|
+
// Test connections (for setup wizard / test command)
|
|
155
|
+
// -------------------------------------------------------------------------
|
|
156
|
+
static async testImap(account, oauthService) {
|
|
157
|
+
let client;
|
|
158
|
+
try {
|
|
159
|
+
let auth;
|
|
160
|
+
if (account.oauth2 && oauthService) {
|
|
161
|
+
const accessToken = await oauthService.getAccessToken(account.oauth2);
|
|
162
|
+
auth = { user: account.username, accessToken };
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
auth = { user: account.username, pass: account.password };
|
|
166
|
+
}
|
|
167
|
+
client = new ImapFlow({
|
|
168
|
+
host: account.imap.host,
|
|
169
|
+
port: account.imap.port,
|
|
170
|
+
secure: account.imap.tls,
|
|
171
|
+
tls: {
|
|
172
|
+
rejectUnauthorized: account.imap.verifySsl,
|
|
173
|
+
},
|
|
174
|
+
auth,
|
|
175
|
+
logger: false,
|
|
176
|
+
});
|
|
177
|
+
await client.connect();
|
|
178
|
+
const mailboxes = await client.list();
|
|
179
|
+
let messageCount = 0;
|
|
180
|
+
try {
|
|
181
|
+
const inbox = await client.status('INBOX', {
|
|
182
|
+
messages: true,
|
|
183
|
+
unseen: true,
|
|
184
|
+
});
|
|
185
|
+
messageCount = inbox.messages ?? 0;
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
// INBOX may not exist (e.g. Google Workspace uses "All Mail")
|
|
189
|
+
if (mailboxes.length > 0) {
|
|
190
|
+
try {
|
|
191
|
+
const first = await client.status(mailboxes[0].path, {
|
|
192
|
+
messages: true,
|
|
193
|
+
});
|
|
194
|
+
messageCount = first.messages ?? 0;
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
/* ignore — connection still works */
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return {
|
|
202
|
+
success: true,
|
|
203
|
+
details: {
|
|
204
|
+
messages: messageCount,
|
|
205
|
+
folders: mailboxes.length,
|
|
206
|
+
},
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
catch (err) {
|
|
210
|
+
return {
|
|
211
|
+
success: false,
|
|
212
|
+
error: err instanceof Error ? err.message : String(err),
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
finally {
|
|
216
|
+
if (client) {
|
|
217
|
+
try {
|
|
218
|
+
await client.logout();
|
|
219
|
+
}
|
|
220
|
+
catch {
|
|
221
|
+
/* ignore */
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
static async testSmtp(account, oauthService) {
|
|
227
|
+
let transport;
|
|
228
|
+
try {
|
|
229
|
+
let auth;
|
|
230
|
+
if (account.oauth2 && oauthService) {
|
|
231
|
+
const accessToken = await oauthService.getAccessToken(account.oauth2);
|
|
232
|
+
auth = { type: 'OAuth2', user: account.username, accessToken };
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
auth = { user: account.username, pass: account.password };
|
|
236
|
+
}
|
|
237
|
+
transport = nodemailer.createTransport(ConnectionManager.buildSmtpTransportOptions(account, auth));
|
|
238
|
+
await transport.verify();
|
|
239
|
+
return { success: true };
|
|
240
|
+
}
|
|
241
|
+
catch (err) {
|
|
242
|
+
return {
|
|
243
|
+
success: false,
|
|
244
|
+
error: err instanceof Error ? err.message : String(err),
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
finally {
|
|
248
|
+
transport?.close();
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
// -------------------------------------------------------------------------
|
|
252
|
+
// Shutdown
|
|
253
|
+
// -------------------------------------------------------------------------
|
|
254
|
+
async closeAll() {
|
|
255
|
+
await mcpLog('info', 'connections', 'Closing all connections');
|
|
256
|
+
const closeOps = [];
|
|
257
|
+
Array.from(this.imapClients.entries()).forEach(([name, client]) => {
|
|
258
|
+
closeOps.push(client
|
|
259
|
+
.logout()
|
|
260
|
+
.catch(() => { })
|
|
261
|
+
.then(() => {
|
|
262
|
+
this.imapClients.delete(name);
|
|
263
|
+
}));
|
|
264
|
+
});
|
|
265
|
+
Array.from(this.smtpTransports.entries()).forEach(([name, transport]) => {
|
|
266
|
+
transport.close();
|
|
267
|
+
this.smtpTransports.delete(name);
|
|
268
|
+
});
|
|
269
|
+
await Promise.allSettled(closeOps);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/connections/manager.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEpC,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAUvC,MAAM,CAAC,OAAO,OAAO,iBAAiB;IAC5B,WAAW,GAAG,IAAI,GAAG,EAAoB,CAAC;IAE1C,cAAc,GAAG,IAAI,GAAG,EAAuB,CAAC;IAEhD,QAAQ,GAAG,IAAI,GAAG,EAAyB,CAAC;IAE5C,YAAY,CAAgB;IAEpC,YAAY,QAAyB,EAAE,YAA2B;QAChE,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC3B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;IAED,4EAA4E;IAC5E,iBAAiB;IACjB,4EAA4E;IAE5E,UAAU,CAAC,IAAY;QACrB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACb,YAAY,IAAI,2BAA2B,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAClF,CAAC;QACJ,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,eAAe;QACb,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,WAAW,CAAC,QAAyB;QACnC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACtB,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC3B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;IACL,CAAC;IAED,4EAA4E;IAC5E,OAAO;IACP,4EAA4E;IAE5E,KAAK,CAAC,aAAa,CAAC,WAAmB;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACnD,IAAI,QAAQ,EAAE,MAAM,EAAE,CAAC;YACrB,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,4BAA4B;QAC5B,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YACrC,IAAI,CAAC;gBACH,QAAQ,CAAC,KAAK,EAAE,CAAC;YACnB,CAAC;YAAC,MAAM,CAAC;gBACP,YAAY;YACd,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QAE7C,uCAAuC;QACvC,IAAI,IAA2D,CAAC;QAChE,IAAI,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACxC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC3E,IAAI,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC;QACjD,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC5D,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC;YAC1B,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI;YACvB,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI;YACvB,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG;YACxB,GAAG,EAAE;gBACH,kBAAkB,EAAE,OAAO,CAAC,IAAI,CAAC,SAAS;aAC3C;YACD,IAAI;YACJ,MAAM,EAAE,KAAK;SACd,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;QACvB,MAAM,MAAM,CACV,MAAM,EACN,MAAM,EACN,gBAAgB,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,SAAS,WAAW,GAAG,CAC9E,CAAC;QACF,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAC1C,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,4EAA4E;IAC5E,OAAO;IACP,4EAA4E;IAEpE,MAAM,CAAC,yBAAyB,CACtC,OAAsB,EACtB,IAAc;QAEd,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI;YAChC,OAAO,EAAE,IAAI;YACb,cAAc,EAAE,CAAC;YACjB,WAAW,EAAE,GAAG;SACjB,CAAC;QAEF,OAAO;YACL,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI;YACvB,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI;YACvB,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG;YACxB,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ;YACjC,SAAS,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ;YACtD,GAAG,EAAE;gBACH,kBAAkB,EAAE,OAAO,CAAC,IAAI,CAAC,SAAS;aAC3C;YACD,IAAI;YACJ,IAAI,EAAE,IAAI,CAAC,OAAO;YAClB,GAAG,CAAC,IAAI,CAAC,OAAO;gBACd,CAAC,CAAC;oBACE,cAAc,EAAE,IAAI,CAAC,cAAc;oBACnC,WAAW,EAAE,IAAI,CAAC,WAAW;iBAC9B;gBACH,CAAC,CAAC,EAAE,CAAC;SACuB,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,gBAAgB,CACpB,WAAmB,EACnB,OAA8B;QAE9B,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,KAAK,CAAC;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACtD,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,QAAQ,CAAC;YAClB,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,QAAQ,CAAC,MAAM,EAAE,CAAC;gBACxB,OAAO,QAAQ,CAAC;YAClB,CAAC;YAAC,MAAM,CAAC;gBACP,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;gBACxC,IAAI,CAAC;oBACH,QAAQ,CAAC,KAAK,EAAE,CAAC;gBACnB,CAAC;gBAAC,MAAM,CAAC;oBACP,YAAY;gBACd,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QAE7C,uCAAuC;QACvC,IAAI,IAAc,CAAC;QACnB,IAAI,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACxC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC3E,IAAI,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC;QACjE,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC5D,CAAC;QAED,MAAM,SAAS,GAAG,UAAU,CAAC,eAAe,CAC1C,iBAAiB,CAAC,yBAAyB,CAAC,OAAO,EAAE,IAAI,CAAC,CAC3D,CAAC;QAEF,MAAM,SAAS,CAAC,MAAM,EAAE,CAAC;QACzB,MAAM,MAAM,CACV,MAAM,EACN,MAAM,EACN,gBAAgB,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,SAAS,WAAW,GAAG,CAC9E,CAAC;QACF,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QAChD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,WAAmB;QAC3C,MAAM,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,4EAA4E;IAC5E,qDAAqD;IACrD,4EAA4E;IAE5E,MAAM,CAAC,KAAK,CAAC,QAAQ,CACnB,OAAsB,EACtB,YAA2B;QAM3B,IAAI,MAA4B,CAAC;QACjC,IAAI,CAAC;YACH,IAAI,IAA2D,CAAC;YAChE,IAAI,OAAO,CAAC,MAAM,IAAI,YAAY,EAAE,CAAC;gBACnC,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBACtE,IAAI,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC;YACjD,CAAC;iBAAM,CAAC;gBACN,IAAI,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;YAC5D,CAAC;YAED,MAAM,GAAG,IAAI,QAAQ,CAAC;gBACpB,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI;gBACvB,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI;gBACvB,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG;gBACxB,GAAG,EAAE;oBACH,kBAAkB,EAAE,OAAO,CAAC,IAAI,CAAC,SAAS;iBAC3C;gBACD,IAAI;gBACJ,MAAM,EAAE,KAAK;aACd,CAAC,CAAC;YACH,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;YAEvB,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YACtC,IAAI,YAAY,GAAG,CAAC,CAAC;YACrB,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE;oBACzC,QAAQ,EAAE,IAAI;oBACd,MAAM,EAAE,IAAI;iBACb,CAAC,CAAC;gBACH,YAAY,GAAG,KAAK,CAAC,QAAQ,IAAI,CAAC,CAAC;YACrC,CAAC;YAAC,MAAM,CAAC;gBACP,8DAA8D;gBAC9D,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACzB,IAAI,CAAC;wBACH,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;4BACnD,QAAQ,EAAE,IAAI;yBACf,CAAC,CAAC;wBACH,YAAY,GAAG,KAAK,CAAC,QAAQ,IAAI,CAAC,CAAC;oBACrC,CAAC;oBAAC,MAAM,CAAC;wBACP,qCAAqC;oBACvC,CAAC;gBACH,CAAC;YACH,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE;oBACP,QAAQ,EAAE,YAAY;oBACtB,OAAO,EAAE,SAAS,CAAC,MAAM;iBAC1B;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACxD,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,IAAI,MAAM,EAAE,CAAC;gBACX,IAAI,CAAC;oBACH,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;gBACxB,CAAC;gBAAC,MAAM,CAAC;oBACP,YAAY;gBACd,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,QAAQ,CACnB,OAAsB,EACtB,YAA2B;QAE3B,IAAI,SAAkC,CAAC;QACvC,IAAI,CAAC;YACH,IAAI,IAAc,CAAC;YACnB,IAAI,OAAO,CAAC,MAAM,IAAI,YAAY,EAAE,CAAC;gBACnC,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBACtE,IAAI,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC;YACjE,CAAC;iBAAM,CAAC;gBACN,IAAI,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;YAC5D,CAAC;YAED,SAAS,GAAG,UAAU,CAAC,eAAe,CACpC,iBAAiB,CAAC,yBAAyB,CAAC,OAAO,EAAE,IAAI,CAAC,CAC3D,CAAC;YACF,MAAM,SAAS,CAAC,MAAM,EAAE,CAAC;YACzB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACxD,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,SAAS,EAAE,KAAK,EAAE,CAAC;QACrB,CAAC;IACH,CAAC;IAED,4EAA4E;IAC5E,WAAW;IACX,4EAA4E;IAE5E,KAAK,CAAC,QAAQ;QACZ,MAAM,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,yBAAyB,CAAC,CAAC;QAC/D,MAAM,QAAQ,GAAoB,EAAE,CAAC;QAErC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE;YAChE,QAAQ,CAAC,IAAI,CACX,MAAM;iBACH,MAAM,EAAE;iBACR,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;iBACf,IAAI,CAAC,GAAG,EAAE;gBACT,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAChC,CAAC,CAAC,CACL,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,EAAE;YACtE,SAAS,CAAC,KAAK,EAAE,CAAC;YAClB,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,MAAM,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;CACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ImapFlow } from 'imapflow';
|
|
2
|
+
import type { Transporter } from 'nodemailer';
|
|
3
|
+
import type { AccountConfig } from '../types/index.js';
|
|
4
|
+
export interface IConnectionManager {
|
|
5
|
+
getAccount: (name: string) => AccountConfig;
|
|
6
|
+
getAccountNames: () => string[];
|
|
7
|
+
getImapClient: (accountName: string) => Promise<ImapFlow>;
|
|
8
|
+
getSmtpTransport: (accountName: string, options?: {
|
|
9
|
+
verify?: boolean;
|
|
10
|
+
}) => Promise<Transporter>;
|
|
11
|
+
closeAll: () => Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/connections/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,aAAa,CAAC;IAC5C,eAAe,EAAE,MAAM,MAAM,EAAE,CAAC;IAChC,aAAa,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC1D,gBAAgB,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;IAChG,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/connections/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP protocol logging bridge.
|
|
3
|
+
*
|
|
4
|
+
* Forwards structured log messages to the connected MCP client
|
|
5
|
+
* via the logging notification channel declared in server capabilities.
|
|
6
|
+
*
|
|
7
|
+
* Messages are silently dropped until `markInitialized()` is called,
|
|
8
|
+
* which should happen only after the MCP `initialized` handshake
|
|
9
|
+
* completes. This prevents pre-handshake notifications from being
|
|
10
|
+
* written to stdout and breaking clients.
|
|
11
|
+
*
|
|
12
|
+
* Usage:
|
|
13
|
+
* bindServer(server) — call once after creating the McpServer
|
|
14
|
+
* markInitialized() — call from the `oninitialized` callback
|
|
15
|
+
* mcpLog("info", …) — fire-and-forget from anywhere
|
|
16
|
+
*/
|
|
17
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
18
|
+
type LogLevel = 'debug' | 'info' | 'notice' | 'warning' | 'error' | 'critical' | 'alert' | 'emergency';
|
|
19
|
+
/**
|
|
20
|
+
* Bind an McpServer instance so subsequent `mcpLog()` calls
|
|
21
|
+
* are forwarded to the connected client.
|
|
22
|
+
*/
|
|
23
|
+
export declare function bindServer(server: McpServer): void;
|
|
24
|
+
/**
|
|
25
|
+
* Mark the server as fully initialized (handshake complete).
|
|
26
|
+
*
|
|
27
|
+
* Call this from the `server.server.oninitialized` callback so that
|
|
28
|
+
* `mcpLog()` starts forwarding messages to the client.
|
|
29
|
+
*/
|
|
30
|
+
export declare function markInitialized(): void;
|
|
31
|
+
/**
|
|
32
|
+
* Reset module state. **Test-only** — never call in production.
|
|
33
|
+
* @internal
|
|
34
|
+
*/
|
|
35
|
+
export declare function __resetForTesting(): void;
|
|
36
|
+
/**
|
|
37
|
+
* Emit a structured log message over the MCP logging channel.
|
|
38
|
+
*
|
|
39
|
+
* Safe to call at any point — silently dropped when:
|
|
40
|
+
* • the server hasn't been bound yet
|
|
41
|
+
* • the transport isn't connected
|
|
42
|
+
* • the MCP handshake hasn't completed (`markInitialized()` not called)
|
|
43
|
+
*/
|
|
44
|
+
export declare function mcpLog(level: LogLevel, logger: string, data: unknown): Promise<void>;
|
|
45
|
+
export {};
|
|
46
|
+
//# sourceMappingURL=logging.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../src/logging.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,KAAK,QAAQ,GACT,OAAO,GACP,MAAM,GACN,QAAQ,GACR,SAAS,GACT,OAAO,GACP,UAAU,GACV,OAAO,GACP,WAAW,CAAC;AAOhB;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAElD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAEtC;AAED;;;GAGG;AAEH,wBAAgB,iBAAiB,IAAI,IAAI,CAGxC;AAED;;;;;;;GAOG;AACH,wBAAsB,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAO1F"}
|
package/dist/logging.js
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP protocol logging bridge.
|
|
3
|
+
*
|
|
4
|
+
* Forwards structured log messages to the connected MCP client
|
|
5
|
+
* via the logging notification channel declared in server capabilities.
|
|
6
|
+
*
|
|
7
|
+
* Messages are silently dropped until `markInitialized()` is called,
|
|
8
|
+
* which should happen only after the MCP `initialized` handshake
|
|
9
|
+
* completes. This prevents pre-handshake notifications from being
|
|
10
|
+
* written to stdout and breaking clients.
|
|
11
|
+
*
|
|
12
|
+
* Usage:
|
|
13
|
+
* bindServer(server) — call once after creating the McpServer
|
|
14
|
+
* markInitialized() — call from the `oninitialized` callback
|
|
15
|
+
* mcpLog("info", …) — fire-and-forget from anywhere
|
|
16
|
+
*/
|
|
17
|
+
let mcpServerRef = null;
|
|
18
|
+
/** `true` only after the client has completed the MCP `initialized` handshake. */
|
|
19
|
+
let initialized = false;
|
|
20
|
+
/**
|
|
21
|
+
* Bind an McpServer instance so subsequent `mcpLog()` calls
|
|
22
|
+
* are forwarded to the connected client.
|
|
23
|
+
*/
|
|
24
|
+
export function bindServer(server) {
|
|
25
|
+
mcpServerRef = server;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Mark the server as fully initialized (handshake complete).
|
|
29
|
+
*
|
|
30
|
+
* Call this from the `server.server.oninitialized` callback so that
|
|
31
|
+
* `mcpLog()` starts forwarding messages to the client.
|
|
32
|
+
*/
|
|
33
|
+
export function markInitialized() {
|
|
34
|
+
initialized = true;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Reset module state. **Test-only** — never call in production.
|
|
38
|
+
* @internal
|
|
39
|
+
*/
|
|
40
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention, no-underscore-dangle
|
|
41
|
+
export function __resetForTesting() {
|
|
42
|
+
mcpServerRef = null;
|
|
43
|
+
initialized = false;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Emit a structured log message over the MCP logging channel.
|
|
47
|
+
*
|
|
48
|
+
* Safe to call at any point — silently dropped when:
|
|
49
|
+
* • the server hasn't been bound yet
|
|
50
|
+
* • the transport isn't connected
|
|
51
|
+
* • the MCP handshake hasn't completed (`markInitialized()` not called)
|
|
52
|
+
*/
|
|
53
|
+
export async function mcpLog(level, logger, data) {
|
|
54
|
+
if (!initialized || !mcpServerRef?.isConnected())
|
|
55
|
+
return;
|
|
56
|
+
try {
|
|
57
|
+
await mcpServerRef.sendLoggingMessage({ level, logger, data });
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// Never let a logging failure break tool execution
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=logging.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logging.js","sourceRoot":"","sources":["../src/logging.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAcH,IAAI,YAAY,GAAqB,IAAI,CAAC;AAE1C,kFAAkF;AAClF,IAAI,WAAW,GAAG,KAAK,CAAC;AAExB;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,MAAiB;IAC1C,YAAY,GAAG,MAAM,CAAC;AACxB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe;IAC7B,WAAW,GAAG,IAAI,CAAC;AACrB,CAAC;AAED;;;GAGG;AACH,sFAAsF;AACtF,MAAM,UAAU,iBAAiB;IAC/B,YAAY,GAAG,IAAI,CAAC;IACpB,WAAW,GAAG,KAAK,CAAC;AACtB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,KAAe,EAAE,MAAc,EAAE,IAAa;IACzE,IAAI,CAAC,WAAW,IAAI,CAAC,YAAY,EAAE,WAAW,EAAE;QAAE,OAAO;IACzD,IAAI,CAAC;QACH,MAAM,YAAY,CAAC,kBAAkB,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC;QACP,mDAAmD;IACrD,CAAC;AACH,CAAC"}
|
package/dist/main.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Email MCP Server — Main entry point.
|
|
4
|
+
*
|
|
5
|
+
* Subcommands:
|
|
6
|
+
* stdio Run as MCP server over stdio (default)
|
|
7
|
+
* http Run as MCP server over Streamable HTTP (port 8080 by default)
|
|
8
|
+
* setup Interactive account setup wizard
|
|
9
|
+
* test Test IMAP/SMTP connections
|
|
10
|
+
* config Config management (show, path, init)
|
|
11
|
+
* scheduler Email scheduling management
|
|
12
|
+
*/
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=main.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";AACA;;;;;;;;;;GAUG"}
|