@honest-magic/mail-mcp 1.0.0 → 1.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 +2 -2
- package/dist/cli/accounts.js +3 -3
- package/dist/cli/accounts.js.map +1 -1
- package/dist/config.d.ts +26 -6
- package/dist/config.js +85 -24
- package/dist/config.js.map +1 -1
- package/dist/errors.d.ts +22 -0
- package/dist/errors.js +36 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.js +202 -33
- package/dist/index.js.map +1 -1
- package/dist/protocol/imap.d.ts +4 -2
- package/dist/protocol/imap.js +50 -9
- package/dist/protocol/imap.js.map +1 -1
- package/dist/services/mail.d.ts +5 -4
- package/dist/services/mail.js +13 -5
- package/dist/services/mail.js.map +1 -1
- package/dist/types/index.d.ts +1 -11
- package/dist/utils/rate-limiter.d.ts +19 -0
- package/dist/utils/rate-limiter.js +43 -0
- package/dist/utils/rate-limiter.js.map +1 -0
- package/dist/utils/validation.d.ts +6 -0
- package/dist/utils/validation.js +32 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +20 -4
package/README.md
CHANGED
|
@@ -5,7 +5,7 @@ MCP server for IMAP/SMTP email access — works with Claude and other MCP client
|
|
|
5
5
|
## Requirements
|
|
6
6
|
|
|
7
7
|
- Node.js >=18
|
|
8
|
-
- macOS (credentials stored in
|
|
8
|
+
- macOS, Windows, or Linux (credentials stored in the OS keychain via [cross-keychain](https://www.npmjs.com/package/cross-keychain))
|
|
9
9
|
|
|
10
10
|
## Installation
|
|
11
11
|
|
|
@@ -59,7 +59,7 @@ Alternatively, create `~/.config/mail-mcp/accounts.json` by hand:
|
|
|
59
59
|
]
|
|
60
60
|
```
|
|
61
61
|
|
|
62
|
-
Then store the password in macOS
|
|
62
|
+
Then store the password in the OS keychain. The easiest way is `mail-mcp accounts add`, which handles this automatically. On macOS you can also use:
|
|
63
63
|
|
|
64
64
|
```bash
|
|
65
65
|
security add-generic-password \
|
package/dist/cli/accounts.js
CHANGED
|
@@ -28,7 +28,7 @@ export async function handleAccountsCommand(args) {
|
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
30
|
async function listAccounts() {
|
|
31
|
-
const accounts = getAccounts();
|
|
31
|
+
const accounts = await getAccounts();
|
|
32
32
|
if (accounts.length === 0) {
|
|
33
33
|
console.log('No accounts configured.');
|
|
34
34
|
console.log(`Config file: ${ACCOUNTS_PATH}`);
|
|
@@ -54,7 +54,7 @@ async function removeAccount(id) {
|
|
|
54
54
|
console.error('Usage: mail-mcp accounts remove <id>');
|
|
55
55
|
process.exit(1);
|
|
56
56
|
}
|
|
57
|
-
const accounts = getAccounts();
|
|
57
|
+
const accounts = await getAccounts();
|
|
58
58
|
const index = accounts.findIndex((a) => a.id === id);
|
|
59
59
|
if (index === -1) {
|
|
60
60
|
console.error(`Account '${id}' not found.`);
|
|
@@ -76,7 +76,7 @@ async function addAccount() {
|
|
|
76
76
|
output: process.stdout,
|
|
77
77
|
});
|
|
78
78
|
try {
|
|
79
|
-
const existingAccounts = getAccounts();
|
|
79
|
+
const existingAccounts = await getAccounts();
|
|
80
80
|
const existingIds = new Set(existingAccounts.map((a) => a.id));
|
|
81
81
|
// id
|
|
82
82
|
let id = '';
|
package/dist/cli/accounts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../src/cli/accounts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAG7E;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,IAAc;IACxD,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,UAAU,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAE3B,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,MAAM;YACT,MAAM,YAAY,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC;QAEd,KAAK,QAAQ;YACX,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7B,OAAO,IAAI,CAAC;QAEd,KAAK,KAAK;YACR,MAAM,UAAU,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC;QAEd;YACE,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;YAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY;IACzB,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../src/cli/accounts.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -1,16 +1,36 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { z } from 'zod';
|
|
2
2
|
export declare const ACCOUNTS_PATH: string;
|
|
3
3
|
export declare const config: {
|
|
4
4
|
serviceName: string;
|
|
5
5
|
logLevel: string;
|
|
6
6
|
};
|
|
7
|
+
export declare const emailAccountSchema: z.ZodObject<{
|
|
8
|
+
id: z.ZodString;
|
|
9
|
+
name: z.ZodString;
|
|
10
|
+
host: z.ZodString;
|
|
11
|
+
port: z.ZodNumber;
|
|
12
|
+
smtpHost: z.ZodOptional<z.ZodString>;
|
|
13
|
+
smtpPort: z.ZodOptional<z.ZodNumber>;
|
|
14
|
+
user: z.ZodString;
|
|
15
|
+
authType: z.ZodEnum<{
|
|
16
|
+
login: "login";
|
|
17
|
+
oauth2: "oauth2";
|
|
18
|
+
}>;
|
|
19
|
+
useTLS: z.ZodBoolean;
|
|
20
|
+
}, z.core.$strip>;
|
|
21
|
+
export type EmailAccount = z.infer<typeof emailAccountSchema>;
|
|
22
|
+
/** @internal — exposed for testing only */
|
|
23
|
+
export declare function resetConfigCache(): void;
|
|
24
|
+
/**
|
|
25
|
+
* Reads account definitions from ~/.config/mail-mcp/accounts.json.
|
|
26
|
+
* Results are cached in memory; the cache is invalidated when the file changes.
|
|
27
|
+
* Returns an empty array if the file does not exist or cannot be parsed.
|
|
28
|
+
*/
|
|
29
|
+
export declare function getAccounts(): Promise<EmailAccount[]>;
|
|
7
30
|
/**
|
|
8
31
|
* Writes account definitions to ~/.config/mail-mcp/accounts.json.
|
|
9
32
|
* Creates the directory if it does not exist.
|
|
33
|
+
* Synchronous — CLI-only, used by `accounts add/remove`.
|
|
34
|
+
* The fs.watch callback will invalidate the cache after this write.
|
|
10
35
|
*/
|
|
11
36
|
export declare function saveAccounts(accounts: EmailAccount[]): void;
|
|
12
|
-
/**
|
|
13
|
-
* Reads account definitions from ~/.config/mail-mcp/accounts.json.
|
|
14
|
-
* Returns an empty array if the file does not exist or cannot be parsed.
|
|
15
|
-
*/
|
|
16
|
-
export declare function getAccounts(): EmailAccount[];
|
package/dist/config.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import * as fs from 'node:fs';
|
|
3
|
+
import * as fsPromises from 'node:fs/promises';
|
|
3
4
|
import * as path from 'node:path';
|
|
4
5
|
import * as os from 'node:os';
|
|
5
6
|
export const ACCOUNTS_PATH = path.join(os.homedir(), '.config', 'mail-mcp', 'accounts.json');
|
|
@@ -11,38 +12,98 @@ export const config = configSchema.parse({
|
|
|
11
12
|
serviceName: process.env.SERVICE_NAME,
|
|
12
13
|
logLevel: process.env.LOG_LEVEL,
|
|
13
14
|
});
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// Account schema and type
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
export const emailAccountSchema = z.object({
|
|
19
|
+
id: z.string().min(1),
|
|
20
|
+
name: z.string().min(1),
|
|
21
|
+
host: z.string().min(1),
|
|
22
|
+
port: z.number().int().positive(),
|
|
23
|
+
smtpHost: z.string().optional(),
|
|
24
|
+
smtpPort: z.number().int().positive().optional(),
|
|
25
|
+
user: z.string().min(1),
|
|
26
|
+
authType: z.enum(['login', 'oauth2']),
|
|
27
|
+
useTLS: z.boolean(),
|
|
28
|
+
});
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
// In-memory cache with fs.watch invalidation
|
|
31
|
+
// ---------------------------------------------------------------------------
|
|
32
|
+
let cachedAccounts = null;
|
|
33
|
+
let watcherStarted = false;
|
|
34
|
+
function startWatcher() {
|
|
35
|
+
if (watcherStarted)
|
|
36
|
+
return;
|
|
37
|
+
watcherStarted = true;
|
|
38
|
+
try {
|
|
39
|
+
fs.watch(ACCOUNTS_PATH, () => {
|
|
40
|
+
cachedAccounts = null;
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
// File may not exist yet — cache stays null until next read
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/** @internal — exposed for testing only */
|
|
48
|
+
export function resetConfigCache() {
|
|
49
|
+
cachedAccounts = null;
|
|
50
|
+
watcherStarted = false;
|
|
51
|
+
}
|
|
52
|
+
// ---------------------------------------------------------------------------
|
|
53
|
+
// Internal disk loader with per-item safeParse
|
|
54
|
+
// ---------------------------------------------------------------------------
|
|
55
|
+
async function loadAccountsFromDisk() {
|
|
56
|
+
const raw = await fsPromises.readFile(ACCOUNTS_PATH, 'utf-8');
|
|
57
|
+
const parsed = JSON.parse(raw);
|
|
58
|
+
if (!Array.isArray(parsed)) {
|
|
59
|
+
console.error('accounts.json must be an array');
|
|
60
|
+
return [];
|
|
61
|
+
}
|
|
62
|
+
const valid = [];
|
|
63
|
+
for (const item of parsed) {
|
|
64
|
+
const result = emailAccountSchema.safeParse(item);
|
|
65
|
+
if (result.success) {
|
|
66
|
+
valid.push(result.data);
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
const id = typeof item?.id === 'string' ? item.id : '(unknown)';
|
|
70
|
+
const fields = result.error.issues.map((i) => i.path.join('.') || 'root').join(', ');
|
|
71
|
+
console.error(`accounts.json: account "${id}" skipped — invalid fields: ${fields}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return valid;
|
|
23
75
|
}
|
|
76
|
+
// ---------------------------------------------------------------------------
|
|
77
|
+
// Public API
|
|
78
|
+
// ---------------------------------------------------------------------------
|
|
24
79
|
/**
|
|
25
80
|
* Reads account definitions from ~/.config/mail-mcp/accounts.json.
|
|
81
|
+
* Results are cached in memory; the cache is invalidated when the file changes.
|
|
26
82
|
* Returns an empty array if the file does not exist or cannot be parsed.
|
|
27
83
|
*/
|
|
28
|
-
export function getAccounts() {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
return [];
|
|
33
|
-
}
|
|
84
|
+
export async function getAccounts() {
|
|
85
|
+
if (cachedAccounts !== null)
|
|
86
|
+
return cachedAccounts;
|
|
87
|
+
startWatcher();
|
|
34
88
|
try {
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
console.error(`Failed to parse accounts config at ${configPath}: expected an array`);
|
|
39
|
-
return [];
|
|
40
|
-
}
|
|
41
|
-
return parsed;
|
|
89
|
+
const loaded = await loadAccountsFromDisk();
|
|
90
|
+
cachedAccounts = loaded;
|
|
91
|
+
return loaded;
|
|
42
92
|
}
|
|
43
|
-
catch
|
|
44
|
-
console.error(`Failed to parse accounts config at ${configPath}:`, error);
|
|
93
|
+
catch {
|
|
45
94
|
return [];
|
|
46
95
|
}
|
|
47
96
|
}
|
|
97
|
+
/**
|
|
98
|
+
* Writes account definitions to ~/.config/mail-mcp/accounts.json.
|
|
99
|
+
* Creates the directory if it does not exist.
|
|
100
|
+
* Synchronous — CLI-only, used by `accounts add/remove`.
|
|
101
|
+
* The fs.watch callback will invalidate the cache after this write.
|
|
102
|
+
*/
|
|
103
|
+
export function saveAccounts(accounts) {
|
|
104
|
+
const configPath = ACCOUNTS_PATH;
|
|
105
|
+
const dir = path.dirname(configPath);
|
|
106
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
107
|
+
fs.writeFileSync(configPath, JSON.stringify(accounts, null, 2), 'utf-8');
|
|
108
|
+
}
|
|
48
109
|
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC;AAE7F,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,oCAAoC,CAAC;IACrE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;CACrC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC;IACvC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY;IACrC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS;CAChC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,0BAA0B;AAC1B,8EAA8E;AAE9E,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACrB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IACjC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAChD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACrC,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE;CACpB,CAAC,CAAC;AAIH,8EAA8E;AAC9E,6CAA6C;AAC7C,8EAA8E;AAE9E,IAAI,cAAc,GAA0B,IAAI,CAAC;AACjD,IAAI,cAAc,GAAG,KAAK,CAAC;AAE3B,SAAS,YAAY;IACnB,IAAI,cAAc;QAAE,OAAO;IAC3B,cAAc,GAAG,IAAI,CAAC;IACtB,IAAI,CAAC;QACH,EAAE,CAAC,KAAK,CAAC,aAAa,EAAE,GAAG,EAAE;YAC3B,cAAc,GAAG,IAAI,CAAC;QACxB,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,4DAA4D;IAC9D,CAAC;AACH,CAAC;AAED,2CAA2C;AAC3C,MAAM,UAAU,gBAAgB;IAC9B,cAAc,GAAG,IAAI,CAAC;IACtB,cAAc,GAAG,KAAK,CAAC;AACzB,CAAC;AAED,8EAA8E;AAC9E,+CAA+C;AAC/C,8EAA8E;AAE9E,KAAK,UAAU,oBAAoB;IACjC,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QAChD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,KAAK,GAAmB,EAAE,CAAC;IACjC,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,kBAAkB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,MAAM,EAAE,GAAG,OAAO,IAAI,EAAE,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;YAChE,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrF,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,+BAA+B,MAAM,EAAE,CAAC,CAAC;QACtF,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,cAAc,KAAK,IAAI;QAAE,OAAO,cAAc,CAAC;IACnD,YAAY,EAAE,CAAC;IACf,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,oBAAoB,EAAE,CAAC;QAC5C,cAAc,GAAG,MAAM,CAAC;QACxB,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,QAAwB;IACnD,MAAM,UAAU,GAAG,aAAa,CAAC;IACjC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACrC,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAC3E,CAAC"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export declare enum MailErrorCode {
|
|
2
|
+
AuthError = "AuthError",
|
|
3
|
+
NetworkError = "NetworkError",
|
|
4
|
+
ValidationError = "ValidationError",
|
|
5
|
+
QuotaError = "QuotaError"
|
|
6
|
+
}
|
|
7
|
+
export declare class MailMCPError extends Error {
|
|
8
|
+
readonly code: MailErrorCode;
|
|
9
|
+
constructor(code: MailErrorCode, message: string, options?: ErrorOptions);
|
|
10
|
+
}
|
|
11
|
+
export declare class AuthError extends MailMCPError {
|
|
12
|
+
constructor(message: string, options?: ErrorOptions);
|
|
13
|
+
}
|
|
14
|
+
export declare class NetworkError extends MailMCPError {
|
|
15
|
+
constructor(message: string, options?: ErrorOptions);
|
|
16
|
+
}
|
|
17
|
+
export declare class ValidationError extends MailMCPError {
|
|
18
|
+
constructor(message: string, options?: ErrorOptions);
|
|
19
|
+
}
|
|
20
|
+
export declare class QuotaError extends MailMCPError {
|
|
21
|
+
constructor(message: string, options?: ErrorOptions);
|
|
22
|
+
}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export var MailErrorCode;
|
|
2
|
+
(function (MailErrorCode) {
|
|
3
|
+
MailErrorCode["AuthError"] = "AuthError";
|
|
4
|
+
MailErrorCode["NetworkError"] = "NetworkError";
|
|
5
|
+
MailErrorCode["ValidationError"] = "ValidationError";
|
|
6
|
+
MailErrorCode["QuotaError"] = "QuotaError";
|
|
7
|
+
})(MailErrorCode || (MailErrorCode = {}));
|
|
8
|
+
export class MailMCPError extends Error {
|
|
9
|
+
code;
|
|
10
|
+
constructor(code, message, options) {
|
|
11
|
+
super(message, options);
|
|
12
|
+
this.code = code;
|
|
13
|
+
this.name = code;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export class AuthError extends MailMCPError {
|
|
17
|
+
constructor(message, options) {
|
|
18
|
+
super(MailErrorCode.AuthError, message, options);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export class NetworkError extends MailMCPError {
|
|
22
|
+
constructor(message, options) {
|
|
23
|
+
super(MailErrorCode.NetworkError, message, options);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export class ValidationError extends MailMCPError {
|
|
27
|
+
constructor(message, options) {
|
|
28
|
+
super(MailErrorCode.ValidationError, message, options);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export class QuotaError extends MailMCPError {
|
|
32
|
+
constructor(message, options) {
|
|
33
|
+
super(MailErrorCode.QuotaError, message, options);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,aAKX;AALD,WAAY,aAAa;IACvB,wCAAuB,CAAA;IACvB,8CAA6B,CAAA;IAC7B,oDAAmC,CAAA;IACnC,0CAAyB,CAAA;AAC3B,CAAC,EALW,aAAa,KAAb,aAAa,QAKxB;AAED,MAAM,OAAO,YAAa,SAAQ,KAAK;IAEnB;IADlB,YACkB,IAAmB,EACnC,OAAe,EACf,OAAsB;QAEtB,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAJR,SAAI,GAAJ,IAAI,CAAe;QAKnC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED,MAAM,OAAO,SAAU,SAAQ,YAAY;IACzC,YAAY,OAAe,EAAE,OAAsB;QACjD,KAAK,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACnD,CAAC;CACF;AAED,MAAM,OAAO,YAAa,SAAQ,YAAY;IAC5C,YAAY,OAAe,EAAE,OAAsB;QACjD,KAAK,CAAC,aAAa,CAAC,YAAY,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,YAAY;IAC/C,YAAY,OAAe,EAAE,OAAsB;QACjD,KAAK,CAAC,aAAa,CAAC,eAAe,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACzD,CAAC;CACF;AAED,MAAM,OAAO,UAAW,SAAQ,YAAY;IAC1C,YAAY,OAAe,EAAE,OAAsB;QACjD,KAAK,CAAC,aAAa,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;CACF"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,7 +3,12 @@ export declare class MailMCPServer {
|
|
|
3
3
|
private readonly readOnly;
|
|
4
4
|
private server;
|
|
5
5
|
private services;
|
|
6
|
+
private shuttingDown;
|
|
7
|
+
private inFlightCount;
|
|
8
|
+
private readonly rateLimiter;
|
|
6
9
|
constructor(readOnly?: boolean);
|
|
10
|
+
shutdown(): Promise<void>;
|
|
11
|
+
private _createAndCacheService;
|
|
7
12
|
private getService;
|
|
8
13
|
getTools(readOnly: boolean): ({
|
|
9
14
|
name: string;
|
|
@@ -18,6 +23,7 @@ export declare class MailMCPServer {
|
|
|
18
23
|
accountId?: undefined;
|
|
19
24
|
folder?: undefined;
|
|
20
25
|
count?: undefined;
|
|
26
|
+
offset?: undefined;
|
|
21
27
|
from?: undefined;
|
|
22
28
|
subject?: undefined;
|
|
23
29
|
since?: undefined;
|
|
@@ -66,6 +72,10 @@ export declare class MailMCPServer {
|
|
|
66
72
|
type: string;
|
|
67
73
|
description: string;
|
|
68
74
|
};
|
|
75
|
+
offset: {
|
|
76
|
+
type: string;
|
|
77
|
+
description: string;
|
|
78
|
+
};
|
|
69
79
|
from?: undefined;
|
|
70
80
|
subject?: undefined;
|
|
71
81
|
since?: undefined;
|
|
@@ -134,6 +144,10 @@ export declare class MailMCPServer {
|
|
|
134
144
|
type: string;
|
|
135
145
|
description: string;
|
|
136
146
|
};
|
|
147
|
+
offset: {
|
|
148
|
+
type: string;
|
|
149
|
+
description: string;
|
|
150
|
+
};
|
|
137
151
|
uid?: undefined;
|
|
138
152
|
to?: undefined;
|
|
139
153
|
body?: undefined;
|
|
@@ -178,6 +192,7 @@ export declare class MailMCPServer {
|
|
|
178
192
|
description: string;
|
|
179
193
|
};
|
|
180
194
|
count?: undefined;
|
|
195
|
+
offset?: undefined;
|
|
181
196
|
from?: undefined;
|
|
182
197
|
subject?: undefined;
|
|
183
198
|
since?: undefined;
|
|
@@ -243,6 +258,7 @@ export declare class MailMCPServer {
|
|
|
243
258
|
};
|
|
244
259
|
folder?: undefined;
|
|
245
260
|
count?: undefined;
|
|
261
|
+
offset?: undefined;
|
|
246
262
|
from?: undefined;
|
|
247
263
|
since?: undefined;
|
|
248
264
|
before?: undefined;
|
|
@@ -279,6 +295,7 @@ export declare class MailMCPServer {
|
|
|
279
295
|
};
|
|
280
296
|
folder?: undefined;
|
|
281
297
|
count?: undefined;
|
|
298
|
+
offset?: undefined;
|
|
282
299
|
from?: undefined;
|
|
283
300
|
subject?: undefined;
|
|
284
301
|
since?: undefined;
|
|
@@ -333,6 +350,7 @@ export declare class MailMCPServer {
|
|
|
333
350
|
};
|
|
334
351
|
folder?: undefined;
|
|
335
352
|
count?: undefined;
|
|
353
|
+
offset?: undefined;
|
|
336
354
|
from?: undefined;
|
|
337
355
|
subject?: undefined;
|
|
338
356
|
since?: undefined;
|
|
@@ -393,6 +411,7 @@ export declare class MailMCPServer {
|
|
|
393
411
|
description: string;
|
|
394
412
|
};
|
|
395
413
|
count?: undefined;
|
|
414
|
+
offset?: undefined;
|
|
396
415
|
from?: undefined;
|
|
397
416
|
subject?: undefined;
|
|
398
417
|
since?: undefined;
|
|
@@ -439,6 +458,7 @@ export declare class MailMCPServer {
|
|
|
439
458
|
description: string;
|
|
440
459
|
};
|
|
441
460
|
count?: undefined;
|
|
461
|
+
offset?: undefined;
|
|
442
462
|
from?: undefined;
|
|
443
463
|
subject?: undefined;
|
|
444
464
|
since?: undefined;
|
|
@@ -491,6 +511,7 @@ export declare class MailMCPServer {
|
|
|
491
511
|
description: string;
|
|
492
512
|
};
|
|
493
513
|
count?: undefined;
|
|
514
|
+
offset?: undefined;
|
|
494
515
|
from?: undefined;
|
|
495
516
|
subject?: undefined;
|
|
496
517
|
since?: undefined;
|
|
@@ -547,6 +568,7 @@ export declare class MailMCPServer {
|
|
|
547
568
|
};
|
|
548
569
|
folder?: undefined;
|
|
549
570
|
count?: undefined;
|
|
571
|
+
offset?: undefined;
|
|
550
572
|
from?: undefined;
|
|
551
573
|
subject?: undefined;
|
|
552
574
|
since?: undefined;
|
|
@@ -618,6 +640,7 @@ export declare class MailMCPServer {
|
|
|
618
640
|
description: string;
|
|
619
641
|
};
|
|
620
642
|
count?: undefined;
|
|
643
|
+
offset?: undefined;
|
|
621
644
|
from?: undefined;
|
|
622
645
|
subject?: undefined;
|
|
623
646
|
since?: undefined;
|
|
@@ -656,3 +679,4 @@ export declare class MailMCPServer {
|
|
|
656
679
|
private setupToolHandlers;
|
|
657
680
|
run(): Promise<void>;
|
|
658
681
|
}
|
|
682
|
+
export declare function runValidateAccounts(): Promise<void>;
|