@n24q02m/better-email-mcp 1.0.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.
Files changed (97) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +162 -0
  3. package/bin/cli.mjs +13 -0
  4. package/build/scripts/start-server.d.ts +6 -0
  5. package/build/scripts/start-server.d.ts.map +1 -0
  6. package/build/scripts/start-server.js +21 -0
  7. package/build/scripts/start-server.js.map +1 -0
  8. package/build/src/docs/attachments.md +48 -0
  9. package/build/src/docs/folders.md +45 -0
  10. package/build/src/docs/messages.md +92 -0
  11. package/build/src/docs/send.md +52 -0
  12. package/build/src/init-server.d.ts +40 -0
  13. package/build/src/init-server.d.ts.map +1 -0
  14. package/build/src/init-server.js +57 -0
  15. package/build/src/init-server.js.map +1 -0
  16. package/build/src/tools/composite/attachments.d.ts +17 -0
  17. package/build/src/tools/composite/attachments.d.ts.map +1 -0
  18. package/build/src/tools/composite/attachments.js +77 -0
  19. package/build/src/tools/composite/attachments.js.map +1 -0
  20. package/build/src/tools/composite/attachments.test.d.ts +2 -0
  21. package/build/src/tools/composite/attachments.test.d.ts.map +1 -0
  22. package/build/src/tools/composite/attachments.test.js +138 -0
  23. package/build/src/tools/composite/attachments.test.js.map +1 -0
  24. package/build/src/tools/composite/folders.d.ts +14 -0
  25. package/build/src/tools/composite/folders.d.ts.map +1 -0
  26. package/build/src/tools/composite/folders.js +57 -0
  27. package/build/src/tools/composite/folders.js.map +1 -0
  28. package/build/src/tools/composite/folders.test.d.ts +2 -0
  29. package/build/src/tools/composite/folders.test.d.ts.map +1 -0
  30. package/build/src/tools/composite/folders.test.js +61 -0
  31. package/build/src/tools/composite/folders.test.js.map +1 -0
  32. package/build/src/tools/composite/messages.d.ts +20 -0
  33. package/build/src/tools/composite/messages.d.ts.map +1 -0
  34. package/build/src/tools/composite/messages.js +244 -0
  35. package/build/src/tools/composite/messages.js.map +1 -0
  36. package/build/src/tools/composite/messages.test.d.ts +2 -0
  37. package/build/src/tools/composite/messages.test.d.ts.map +1 -0
  38. package/build/src/tools/composite/messages.test.js +217 -0
  39. package/build/src/tools/composite/messages.test.js.map +1 -0
  40. package/build/src/tools/composite/send.d.ts +21 -0
  41. package/build/src/tools/composite/send.d.ts.map +1 -0
  42. package/build/src/tools/composite/send.js +127 -0
  43. package/build/src/tools/composite/send.js.map +1 -0
  44. package/build/src/tools/composite/send.test.d.ts +2 -0
  45. package/build/src/tools/composite/send.test.d.ts.map +1 -0
  46. package/build/src/tools/composite/send.test.js +232 -0
  47. package/build/src/tools/composite/send.test.js.map +1 -0
  48. package/build/src/tools/helpers/config.d.ts +33 -0
  49. package/build/src/tools/helpers/config.d.ts.map +1 -0
  50. package/build/src/tools/helpers/config.js +167 -0
  51. package/build/src/tools/helpers/config.js.map +1 -0
  52. package/build/src/tools/helpers/config.test.d.ts +2 -0
  53. package/build/src/tools/helpers/config.test.d.ts.map +1 -0
  54. package/build/src/tools/helpers/config.test.js +141 -0
  55. package/build/src/tools/helpers/config.test.js.map +1 -0
  56. package/build/src/tools/helpers/errors.d.ts +34 -0
  57. package/build/src/tools/helpers/errors.d.ts.map +1 -0
  58. package/build/src/tools/helpers/errors.js +152 -0
  59. package/build/src/tools/helpers/errors.js.map +1 -0
  60. package/build/src/tools/helpers/errors.test.d.ts +2 -0
  61. package/build/src/tools/helpers/errors.test.d.ts.map +1 -0
  62. package/build/src/tools/helpers/errors.test.js +203 -0
  63. package/build/src/tools/helpers/errors.test.js.map +1 -0
  64. package/build/src/tools/helpers/html-utils.d.ts +10 -0
  65. package/build/src/tools/helpers/html-utils.d.ts.map +1 -0
  66. package/build/src/tools/helpers/html-utils.js +29 -0
  67. package/build/src/tools/helpers/html-utils.js.map +1 -0
  68. package/build/src/tools/helpers/html-utils.test.d.ts +2 -0
  69. package/build/src/tools/helpers/html-utils.test.d.ts.map +1 -0
  70. package/build/src/tools/helpers/html-utils.test.js +103 -0
  71. package/build/src/tools/helpers/html-utils.test.js.map +1 -0
  72. package/build/src/tools/helpers/imap-client.d.ts +90 -0
  73. package/build/src/tools/helpers/imap-client.d.ts.map +1 -0
  74. package/build/src/tools/helpers/imap-client.js +321 -0
  75. package/build/src/tools/helpers/imap-client.js.map +1 -0
  76. package/build/src/tools/helpers/imap-client.test.d.ts +2 -0
  77. package/build/src/tools/helpers/imap-client.test.d.ts.map +1 -0
  78. package/build/src/tools/helpers/imap-client.test.js +401 -0
  79. package/build/src/tools/helpers/imap-client.test.js.map +1 -0
  80. package/build/src/tools/helpers/smtp-client.d.ts +38 -0
  81. package/build/src/tools/helpers/smtp-client.d.ts.map +1 -0
  82. package/build/src/tools/helpers/smtp-client.js +124 -0
  83. package/build/src/tools/helpers/smtp-client.js.map +1 -0
  84. package/build/src/tools/helpers/smtp-client.test.d.ts +2 -0
  85. package/build/src/tools/helpers/smtp-client.test.d.ts.map +1 -0
  86. package/build/src/tools/helpers/smtp-client.test.js +210 -0
  87. package/build/src/tools/helpers/smtp-client.test.js.map +1 -0
  88. package/build/src/tools/registry.d.ts +11 -0
  89. package/build/src/tools/registry.d.ts.map +1 -0
  90. package/build/src/tools/registry.js +262 -0
  91. package/build/src/tools/registry.js.map +1 -0
  92. package/build/src/tools/registry.test.d.ts +2 -0
  93. package/build/src/tools/registry.test.d.ts.map +1 -0
  94. package/build/src/tools/registry.test.js +135 -0
  95. package/build/src/tools/registry.test.js.map +1 -0
  96. package/build/tsconfig.tsbuildinfo +1 -0
  97. package/package.json +81 -0
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Attachments Mega Tool
3
+ * List and download email attachments
4
+ */
5
+ import type { AccountConfig } from '../helpers/config.js';
6
+ export interface AttachmentsInput {
7
+ action: 'list' | 'download';
8
+ account: string;
9
+ uid: number;
10
+ folder?: string;
11
+ filename?: string;
12
+ }
13
+ /**
14
+ * Unified attachments tool - handles attachment operations
15
+ */
16
+ export declare function attachments(accounts: AccountConfig[], input: AttachmentsInput): Promise<any>;
17
+ //# sourceMappingURL=attachments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachments.d.ts","sourceRoot":"","sources":["../../../../src/tools/composite/attachments.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAIzD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,GAAG,UAAU,CAAA;IAG3B,OAAO,EAAE,MAAM,CAAA;IACf,GAAG,EAAE,MAAM,CAAA;IAGX,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AA8BD;;GAEG;AACH,wBAAsB,WAAW,CAAC,QAAQ,EAAE,aAAa,EAAE,EAAE,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,CAiClG"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Attachments Mega Tool
3
+ * List and download email attachments
4
+ */
5
+ import { EmailMCPError, withErrorHandling } from '../helpers/errors.js';
6
+ import { getAttachment, readEmail } from '../helpers/imap-client.js';
7
+ /**
8
+ * Resolve a single account by filter
9
+ */
10
+ function resolveSingleAccount(accounts, accountFilter) {
11
+ const lower = accountFilter.toLowerCase();
12
+ const matched = accounts.filter((a) => a.email.toLowerCase() === lower || a.id === lower || a.email.toLowerCase().includes(lower));
13
+ if (matched.length === 0) {
14
+ throw new EmailMCPError(`Account not found: ${accountFilter}`, 'ACCOUNT_NOT_FOUND', `Available accounts: ${accounts.map((a) => a.email).join(', ')}`);
15
+ }
16
+ if (matched.length > 1) {
17
+ throw new EmailMCPError('Multiple accounts matched. Specify the exact account email.', 'AMBIGUOUS_ACCOUNT', `Matched: ${matched.map((a) => a.email).join(', ')}`);
18
+ }
19
+ return matched[0];
20
+ }
21
+ /**
22
+ * Unified attachments tool - handles attachment operations
23
+ */
24
+ export async function attachments(accounts, input) {
25
+ return withErrorHandling(async () => {
26
+ if (!input.account) {
27
+ throw new EmailMCPError('account is required for attachment operations', 'VALIDATION_ERROR', 'Provide the account email address');
28
+ }
29
+ if (!input.uid) {
30
+ throw new EmailMCPError('uid is required for attachment operations', 'VALIDATION_ERROR', 'Provide the email UID from search/read');
31
+ }
32
+ switch (input.action) {
33
+ case 'list':
34
+ return await handleList(accounts, input);
35
+ case 'download':
36
+ return await handleDownload(accounts, input);
37
+ default:
38
+ throw new EmailMCPError(`Unknown action: ${input.action}`, 'VALIDATION_ERROR', 'Supported actions: list, download');
39
+ }
40
+ })();
41
+ }
42
+ /**
43
+ * List attachments for an email
44
+ */
45
+ async function handleList(accounts, input) {
46
+ const account = resolveSingleAccount(accounts, input.account);
47
+ const folder = input.folder || 'INBOX';
48
+ const email = await readEmail(account, input.uid, folder);
49
+ return {
50
+ action: 'list',
51
+ account: account.email,
52
+ uid: input.uid,
53
+ folder,
54
+ subject: email.subject,
55
+ total: email.attachments.length,
56
+ attachments: email.attachments
57
+ };
58
+ }
59
+ /**
60
+ * Download a specific attachment (returns base64)
61
+ */
62
+ async function handleDownload(accounts, input) {
63
+ if (!input.filename) {
64
+ throw new EmailMCPError('filename is required for download action', 'VALIDATION_ERROR', 'Use attachments list action first to see available filenames');
65
+ }
66
+ const account = resolveSingleAccount(accounts, input.account);
67
+ const folder = input.folder || 'INBOX';
68
+ const attachment = await getAttachment(account, input.uid, folder, input.filename);
69
+ return {
70
+ action: 'download',
71
+ account: account.email,
72
+ uid: input.uid,
73
+ folder,
74
+ ...attachment
75
+ };
76
+ }
77
+ //# sourceMappingURL=attachments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachments.js","sourceRoot":"","sources":["../../../../src/tools/composite/attachments.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=attachments.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachments.test.d.ts","sourceRoot":"","sources":["../../../../src/tools/composite/attachments.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,138 @@
1
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
2
+ // --- Mocks ---
3
+ vi.mock('../helpers/imap-client.js', () => ({
4
+ readEmail: vi.fn(),
5
+ getAttachment: vi.fn()
6
+ }));
7
+ import { getAttachment, readEmail } from '../helpers/imap-client.js';
8
+ import { attachments } from './attachments.js';
9
+ const mockReadEmail = vi.mocked(readEmail);
10
+ const mockGetAttachment = vi.mocked(getAttachment);
11
+ const accounts = [
12
+ {
13
+ id: 'user1_gmail_com',
14
+ email: 'user1@gmail.com',
15
+ password: 'pass1',
16
+ imap: { host: 'imap.gmail.com', port: 993, secure: true },
17
+ smtp: { host: 'smtp.gmail.com', port: 465, secure: true }
18
+ }
19
+ ];
20
+ beforeEach(() => {
21
+ vi.clearAllMocks();
22
+ });
23
+ // ============================================================================
24
+ // list
25
+ // ============================================================================
26
+ describe('attachments - list', () => {
27
+ it('lists attachments for an email', async () => {
28
+ mockReadEmail.mockResolvedValue({
29
+ account_id: 'user1_gmail_com',
30
+ account_email: 'user1@gmail.com',
31
+ uid: 10,
32
+ subject: 'Email with files',
33
+ from: 'sender@test.com',
34
+ to: 'user1@gmail.com',
35
+ date: '2025-01-01',
36
+ flags: [],
37
+ body_text: 'See attached',
38
+ attachments: [
39
+ { filename: 'doc.pdf', content_type: 'application/pdf', size: 1024 },
40
+ { filename: 'img.png', content_type: 'image/png', size: 2048 }
41
+ ]
42
+ });
43
+ const result = await attachments(accounts, {
44
+ action: 'list',
45
+ account: 'user1@gmail.com',
46
+ uid: 10
47
+ });
48
+ expect(result.action).toBe('list');
49
+ expect(result.total).toBe(2);
50
+ expect(result.attachments).toHaveLength(2);
51
+ expect(result.subject).toBe('Email with files');
52
+ });
53
+ it('returns empty list when no attachments', async () => {
54
+ mockReadEmail.mockResolvedValue({
55
+ account_id: 'user1_gmail_com',
56
+ account_email: 'user1@gmail.com',
57
+ uid: 10,
58
+ subject: 'No files',
59
+ from: 'x@test.com',
60
+ to: 'y@test.com',
61
+ date: '2025-01-01',
62
+ flags: [],
63
+ body_text: 'text',
64
+ attachments: []
65
+ });
66
+ const result = await attachments(accounts, {
67
+ action: 'list',
68
+ account: 'user1@gmail.com',
69
+ uid: 10
70
+ });
71
+ expect(result.total).toBe(0);
72
+ expect(result.attachments).toHaveLength(0);
73
+ });
74
+ });
75
+ // ============================================================================
76
+ // download
77
+ // ============================================================================
78
+ describe('attachments - download', () => {
79
+ it('downloads attachment as base64', async () => {
80
+ mockGetAttachment.mockResolvedValue({
81
+ filename: 'report.pdf',
82
+ content_type: 'application/pdf',
83
+ size: 5000,
84
+ content_base64: 'base64content'
85
+ });
86
+ const result = await attachments(accounts, {
87
+ action: 'download',
88
+ account: 'user1@gmail.com',
89
+ uid: 10,
90
+ filename: 'report.pdf'
91
+ });
92
+ expect(result.action).toBe('download');
93
+ expect(result.content_base64).toBe('base64content');
94
+ expect(result.filename).toBe('report.pdf');
95
+ });
96
+ it('throws when filename is missing', async () => {
97
+ await expect(attachments(accounts, {
98
+ action: 'download',
99
+ account: 'user1@gmail.com',
100
+ uid: 10
101
+ // no filename
102
+ })).rejects.toThrow('filename is required');
103
+ });
104
+ });
105
+ // ============================================================================
106
+ // validation
107
+ // ============================================================================
108
+ describe('attachments - validation', () => {
109
+ it('throws when account is missing', async () => {
110
+ await expect(attachments(accounts, {
111
+ action: 'list',
112
+ account: '',
113
+ uid: 10
114
+ })).rejects.toThrow();
115
+ });
116
+ it('throws when uid is missing', async () => {
117
+ await expect(attachments(accounts, {
118
+ action: 'list',
119
+ account: 'user1@gmail.com',
120
+ uid: 0
121
+ })).rejects.toThrow();
122
+ });
123
+ it('throws when account not found', async () => {
124
+ await expect(attachments(accounts, {
125
+ action: 'list',
126
+ account: 'nonexistent@test.com',
127
+ uid: 10
128
+ })).rejects.toThrow('Account not found');
129
+ });
130
+ it('throws for unknown action', async () => {
131
+ await expect(attachments(accounts, {
132
+ action: 'unknown',
133
+ account: 'user1@gmail.com',
134
+ uid: 10
135
+ })).rejects.toThrow();
136
+ });
137
+ });
138
+ //# sourceMappingURL=attachments.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachments.test.js","sourceRoot":"","sources":["../../../../src/tools/composite/attachments.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Folders Mega Tool
3
+ * List mailbox folders across email accounts
4
+ */
5
+ import type { AccountConfig } from '../helpers/config.js';
6
+ export interface FoldersInput {
7
+ action: 'list';
8
+ account?: string;
9
+ }
10
+ /**
11
+ * Unified folders tool - handles folder listing
12
+ */
13
+ export declare function folders(accounts: AccountConfig[], input: FoldersInput): Promise<any>;
14
+ //# sourceMappingURL=folders.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"folders.d.ts","sourceRoot":"","sources":["../../../../src/tools/composite/folders.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAIzD,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAA;IAGd,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED;;GAEG;AACH,wBAAsB,OAAO,CAAC,QAAQ,EAAE,aAAa,EAAE,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAU1F"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Folders Mega Tool
3
+ * List mailbox folders across email accounts
4
+ */
5
+ import { EmailMCPError, withErrorHandling } from '../helpers/errors.js';
6
+ import { listFolders } from '../helpers/imap-client.js';
7
+ /**
8
+ * Unified folders tool - handles folder listing
9
+ */
10
+ export async function folders(accounts, input) {
11
+ return withErrorHandling(async () => {
12
+ switch (input.action) {
13
+ case 'list':
14
+ return await handleList(accounts, input);
15
+ default:
16
+ throw new EmailMCPError(`Unknown action: ${input.action}`, 'VALIDATION_ERROR', 'Supported actions: list');
17
+ }
18
+ })();
19
+ }
20
+ /**
21
+ * List folders across accounts
22
+ */
23
+ async function handleList(accounts, input) {
24
+ let targetAccounts = accounts;
25
+ if (input.account) {
26
+ const lower = input.account.toLowerCase();
27
+ targetAccounts = accounts.filter((a) => a.email.toLowerCase() === lower || a.id === lower || a.email.toLowerCase().includes(lower));
28
+ if (targetAccounts.length === 0) {
29
+ throw new EmailMCPError(`Account not found: ${input.account}`, 'ACCOUNT_NOT_FOUND', `Available accounts: ${accounts.map((a) => a.email).join(', ')}`);
30
+ }
31
+ }
32
+ const results = [];
33
+ for (const account of targetAccounts) {
34
+ try {
35
+ const folderList = await listFolders(account);
36
+ results.push({
37
+ account_id: account.id,
38
+ account_email: account.email,
39
+ folders: folderList
40
+ });
41
+ }
42
+ catch (error) {
43
+ results.push({
44
+ account_id: account.id,
45
+ account_email: account.email,
46
+ error: error.message,
47
+ folders: []
48
+ });
49
+ }
50
+ }
51
+ return {
52
+ action: 'list',
53
+ total_accounts: results.length,
54
+ accounts: results
55
+ };
56
+ }
57
+ //# sourceMappingURL=folders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"folders.js","sourceRoot":"","sources":["../../../../src/tools/composite/folders.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AASvD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,QAAyB,EAAE,KAAmB;IAC1E,OAAO,iBAAiB,CAAC,KAAK,IAAI,EAAE;QAClC,QAAQ,KAAK,CAAC,MAAM,EAAE,CAAC;YACrB,KAAK,MAAM;gBACT,OAAO,MAAM,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;YAE1C;gBACE,MAAM,IAAI,aAAa,CAAC,mBAAmB,KAAK,CAAC,MAAM,EAAE,EAAE,kBAAkB,EAAE,yBAAyB,CAAC,CAAA;QAC7G,CAAC;IACH,CAAC,CAAC,EAAE,CAAA;AACN,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,UAAU,CAAC,QAAyB,EAAE,KAAmB;IACtE,IAAI,cAAc,GAAG,QAAQ,CAAA;IAE7B,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAA;QACzC,cAAc,GAAG,QAAQ,CAAC,MAAM,CAC9B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,KAAK,IAAI,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAClG,CAAA;QAED,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,aAAa,CACrB,sBAAsB,KAAK,CAAC,OAAO,EAAE,EACrC,mBAAmB,EACnB,uBAAuB,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACjE,CAAA;QACH,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAU,EAAE,CAAA;IAEzB,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,CAAA;YAC7C,OAAO,CAAC,IAAI,CAAC;gBACX,UAAU,EAAE,OAAO,CAAC,EAAE;gBACtB,aAAa,EAAE,OAAO,CAAC,KAAK;gBAC5B,OAAO,EAAE,UAAU;aACpB,CAAC,CAAA;QACJ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC;gBACX,UAAU,EAAE,OAAO,CAAC,EAAE;gBACtB,aAAa,EAAE,OAAO,CAAC,KAAK;gBAC5B,KAAK,EAAE,KAAK,CAAC,OAAO;gBACpB,OAAO,EAAE,EAAE;aACZ,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,OAAO;QACL,MAAM,EAAE,MAAM;QACd,cAAc,EAAE,OAAO,CAAC,MAAM;QAC9B,QAAQ,EAAE,OAAO;KAClB,CAAA;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=folders.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"folders.test.d.ts","sourceRoot":"","sources":["../../../../src/tools/composite/folders.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,61 @@
1
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
2
+ // --- Mocks ---
3
+ vi.mock('../helpers/imap-client.js', () => ({
4
+ listFolders: vi.fn()
5
+ }));
6
+ import { listFolders } from '../helpers/imap-client.js';
7
+ import { folders } from './folders.js';
8
+ const mockListFolders = vi.mocked(listFolders);
9
+ const accounts = [
10
+ {
11
+ id: 'user1_gmail_com',
12
+ email: 'user1@gmail.com',
13
+ password: 'pass1',
14
+ imap: { host: 'imap.gmail.com', port: 993, secure: true },
15
+ smtp: { host: 'smtp.gmail.com', port: 465, secure: true }
16
+ },
17
+ {
18
+ id: 'user2_outlook_com',
19
+ email: 'user2@outlook.com',
20
+ password: 'pass2',
21
+ imap: { host: 'outlook.office365.com', port: 993, secure: true },
22
+ smtp: { host: 'smtp.office365.com', port: 587, secure: false }
23
+ }
24
+ ];
25
+ beforeEach(() => {
26
+ vi.clearAllMocks();
27
+ });
28
+ describe('folders - list', () => {
29
+ it('lists folders for all accounts', async () => {
30
+ mockListFolders.mockResolvedValue([{ name: 'INBOX', path: 'INBOX', flags: [], delimiter: '/' }]);
31
+ const result = await folders(accounts, { action: 'list' });
32
+ expect(result.action).toBe('list');
33
+ expect(result.total_accounts).toBe(2);
34
+ expect(result.accounts).toHaveLength(2);
35
+ expect(mockListFolders).toHaveBeenCalledTimes(2);
36
+ });
37
+ it('filters by account', async () => {
38
+ mockListFolders.mockResolvedValue([{ name: 'INBOX', path: 'INBOX', flags: [], delimiter: '/' }]);
39
+ const result = await folders(accounts, { action: 'list', account: 'user1@gmail.com' });
40
+ expect(result.total_accounts).toBe(1);
41
+ expect(result.accounts[0].account_email).toBe('user1@gmail.com');
42
+ expect(mockListFolders).toHaveBeenCalledTimes(1);
43
+ });
44
+ it('includes error when one account fails', async () => {
45
+ mockListFolders
46
+ .mockResolvedValueOnce([{ name: 'INBOX', path: 'INBOX', flags: [], delimiter: '/' }])
47
+ .mockRejectedValueOnce(new Error('Auth failed'));
48
+ const result = await folders(accounts, { action: 'list' });
49
+ expect(result.total_accounts).toBe(2);
50
+ expect(result.accounts[0].folders).toHaveLength(1);
51
+ expect(result.accounts[1].error).toBe('Auth failed');
52
+ expect(result.accounts[1].folders).toHaveLength(0);
53
+ });
54
+ it('throws when account not found', async () => {
55
+ await expect(folders(accounts, { action: 'list', account: 'nonexistent@test.com' })).rejects.toThrow('Account not found');
56
+ });
57
+ it('throws for unknown action', async () => {
58
+ await expect(folders(accounts, { action: 'unknown' })).rejects.toThrow();
59
+ });
60
+ });
61
+ //# sourceMappingURL=folders.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"folders.test.js","sourceRoot":"","sources":["../../../../src/tools/composite/folders.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Messages Mega Tool
3
+ * All email message operations in one unified interface
4
+ */
5
+ import type { AccountConfig } from '../helpers/config.js';
6
+ export interface MessagesInput {
7
+ action: 'search' | 'read' | 'mark_read' | 'mark_unread' | 'flag' | 'unflag' | 'move' | 'archive' | 'trash';
8
+ account?: string;
9
+ query?: string;
10
+ folder?: string;
11
+ limit?: number;
12
+ uid?: number;
13
+ uids?: number[];
14
+ destination?: string;
15
+ }
16
+ /**
17
+ * Unified messages tool - handles all message operations
18
+ */
19
+ export declare function messages(accounts: AccountConfig[], input: MessagesInput): Promise<any>;
20
+ //# sourceMappingURL=messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../../../src/tools/composite/messages.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAIzD,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,aAAa,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAA;IAG1G,OAAO,CAAC,EAAE,MAAM,CAAA;IAGhB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IAGd,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IAGf,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAuCD;;GAEG;AACH,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,aAAa,EAAE,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,CAsC5F"}