mcp-twake-mail 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +663 -0
- package/README.md +332 -0
- package/build/auth/index.d.ts +3 -0
- package/build/auth/index.js +4 -0
- package/build/auth/index.js.map +1 -0
- package/build/auth/oidc-flow.d.ts +47 -0
- package/build/auth/oidc-flow.js +146 -0
- package/build/auth/oidc-flow.js.map +1 -0
- package/build/auth/token-refresh.d.ts +56 -0
- package/build/auth/token-refresh.js +132 -0
- package/build/auth/token-refresh.js.map +1 -0
- package/build/auth/token-store.d.ts +33 -0
- package/build/auth/token-store.js +63 -0
- package/build/auth/token-store.js.map +1 -0
- package/build/cli/commands/auth.d.ts +5 -0
- package/build/cli/commands/auth.js +49 -0
- package/build/cli/commands/auth.js.map +1 -0
- package/build/cli/commands/check.d.ts +4 -0
- package/build/cli/commands/check.js +125 -0
- package/build/cli/commands/check.js.map +1 -0
- package/build/cli/commands/setup.d.ts +4 -0
- package/build/cli/commands/setup.js +172 -0
- package/build/cli/commands/setup.js.map +1 -0
- package/build/cli/index.d.ts +15 -0
- package/build/cli/index.js +56 -0
- package/build/cli/index.js.map +1 -0
- package/build/cli/prompts/setup-wizard.d.ts +38 -0
- package/build/cli/prompts/setup-wizard.js +121 -0
- package/build/cli/prompts/setup-wizard.js.map +1 -0
- package/build/config/__tests__/logger.test.d.ts +1 -0
- package/build/config/__tests__/logger.test.js +28 -0
- package/build/config/__tests__/logger.test.js.map +1 -0
- package/build/config/__tests__/schema.test.d.ts +1 -0
- package/build/config/__tests__/schema.test.js +101 -0
- package/build/config/__tests__/schema.test.js.map +1 -0
- package/build/config/logger.d.ts +3 -0
- package/build/config/logger.js +9 -0
- package/build/config/logger.js.map +1 -0
- package/build/config/schema.d.ts +28 -0
- package/build/config/schema.js +81 -0
- package/build/config/schema.js.map +1 -0
- package/build/errors.d.ts +34 -0
- package/build/errors.js +154 -0
- package/build/errors.js.map +1 -0
- package/build/errors.test.d.ts +1 -0
- package/build/errors.test.js +234 -0
- package/build/errors.test.js.map +1 -0
- package/build/index.d.ts +2 -0
- package/build/index.js +12 -0
- package/build/index.js.map +1 -0
- package/build/jmap/client.d.ts +96 -0
- package/build/jmap/client.js +267 -0
- package/build/jmap/client.js.map +1 -0
- package/build/mcp/server.d.ts +24 -0
- package/build/mcp/server.js +68 -0
- package/build/mcp/server.js.map +1 -0
- package/build/mcp/tools/attachment.d.ts +30 -0
- package/build/mcp/tools/attachment.js +246 -0
- package/build/mcp/tools/attachment.js.map +1 -0
- package/build/mcp/tools/attachment.test.d.ts +1 -0
- package/build/mcp/tools/attachment.test.js +457 -0
- package/build/mcp/tools/attachment.test.js.map +1 -0
- package/build/mcp/tools/email-operations.d.ts +10 -0
- package/build/mcp/tools/email-operations.js +828 -0
- package/build/mcp/tools/email-operations.js.map +1 -0
- package/build/mcp/tools/email-operations.test.d.ts +1 -0
- package/build/mcp/tools/email-operations.test.js +453 -0
- package/build/mcp/tools/email-operations.test.js.map +1 -0
- package/build/mcp/tools/email-sending.d.ts +10 -0
- package/build/mcp/tools/email-sending.js +682 -0
- package/build/mcp/tools/email-sending.js.map +1 -0
- package/build/mcp/tools/email.d.ts +10 -0
- package/build/mcp/tools/email.js +365 -0
- package/build/mcp/tools/email.js.map +1 -0
- package/build/mcp/tools/email.test.d.ts +1 -0
- package/build/mcp/tools/email.test.js +332 -0
- package/build/mcp/tools/email.test.js.map +1 -0
- package/build/mcp/tools/index.d.ts +14 -0
- package/build/mcp/tools/index.js +29 -0
- package/build/mcp/tools/index.js.map +1 -0
- package/build/mcp/tools/mailbox.d.ts +10 -0
- package/build/mcp/tools/mailbox.js +195 -0
- package/build/mcp/tools/mailbox.js.map +1 -0
- package/build/mcp/tools/mailbox.test.d.ts +1 -0
- package/build/mcp/tools/mailbox.test.js +231 -0
- package/build/mcp/tools/mailbox.test.js.map +1 -0
- package/build/mcp/tools/thread.d.ts +10 -0
- package/build/mcp/tools/thread.js +282 -0
- package/build/mcp/tools/thread.js.map +1 -0
- package/build/mcp/tools/thread.test.d.ts +1 -0
- package/build/mcp/tools/thread.test.js +384 -0
- package/build/mcp/tools/thread.test.js.map +1 -0
- package/build/transformers/__tests__/email.test.d.ts +1 -0
- package/build/transformers/__tests__/email.test.js +438 -0
- package/build/transformers/__tests__/email.test.js.map +1 -0
- package/build/transformers/__tests__/mailbox.test.d.ts +1 -0
- package/build/transformers/__tests__/mailbox.test.js +222 -0
- package/build/transformers/__tests__/mailbox.test.js.map +1 -0
- package/build/transformers/email.d.ts +76 -0
- package/build/transformers/email.js +138 -0
- package/build/transformers/email.js.map +1 -0
- package/build/transformers/index.d.ts +5 -0
- package/build/transformers/index.js +6 -0
- package/build/transformers/index.js.map +1 -0
- package/build/transformers/mailbox.d.ts +43 -0
- package/build/transformers/mailbox.js +70 -0
- package/build/transformers/mailbox.js.map +1 -0
- package/build/types/dto.d.ts +91 -0
- package/build/types/dto.js +9 -0
- package/build/types/dto.js.map +1 -0
- package/build/types/jmap.d.ts +110 -0
- package/build/types/jmap.js +5 -0
- package/build/types/jmap.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simplified DTO types for MCP tools.
|
|
3
|
+
* These types represent JMAP objects in a format optimized for AI assistants:
|
|
4
|
+
* - Boolean flags instead of keyword objects
|
|
5
|
+
* - Arrays instead of Record<string, boolean> for mailboxIds
|
|
6
|
+
* - Human-readable property names
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Email address with optional display name.
|
|
10
|
+
*/
|
|
11
|
+
export interface EmailAddress {
|
|
12
|
+
name: string | null;
|
|
13
|
+
email: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Simplified email attachment.
|
|
17
|
+
*/
|
|
18
|
+
export interface SimplifiedAttachment {
|
|
19
|
+
blobId: string;
|
|
20
|
+
type: string;
|
|
21
|
+
name: string | null;
|
|
22
|
+
size: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Standard mailbox roles defined in RFC 8621.
|
|
26
|
+
*/
|
|
27
|
+
export type MailboxRole = 'inbox' | 'drafts' | 'sent' | 'trash' | 'junk' | 'archive' | 'all' | 'important' | 'subscribed' | null;
|
|
28
|
+
/**
|
|
29
|
+
* Mailbox permission rights.
|
|
30
|
+
*/
|
|
31
|
+
export interface MailboxRights {
|
|
32
|
+
mayReadItems: boolean;
|
|
33
|
+
mayAddItems: boolean;
|
|
34
|
+
mayRemoveItems: boolean;
|
|
35
|
+
maySetSeen: boolean;
|
|
36
|
+
maySetKeywords: boolean;
|
|
37
|
+
mayCreateChild: boolean;
|
|
38
|
+
mayRename: boolean;
|
|
39
|
+
mayDelete: boolean;
|
|
40
|
+
maySubmit: boolean;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Simplified email DTO for MCP tools.
|
|
44
|
+
* Converts JMAP keywords to boolean flags:
|
|
45
|
+
* - $seen -> isRead
|
|
46
|
+
* - $flagged -> isFlagged
|
|
47
|
+
* - $draft -> isDraft
|
|
48
|
+
* - $answered -> isAnswered
|
|
49
|
+
* - $forwarded -> isForwarded
|
|
50
|
+
*/
|
|
51
|
+
export interface SimplifiedEmail {
|
|
52
|
+
id: string;
|
|
53
|
+
blobId: string;
|
|
54
|
+
threadId: string;
|
|
55
|
+
mailboxIds: string[];
|
|
56
|
+
isRead: boolean;
|
|
57
|
+
isFlagged: boolean;
|
|
58
|
+
isDraft: boolean;
|
|
59
|
+
isAnswered: boolean;
|
|
60
|
+
isForwarded: boolean;
|
|
61
|
+
receivedAt: string;
|
|
62
|
+
subject: string | null;
|
|
63
|
+
preview?: string;
|
|
64
|
+
size?: number;
|
|
65
|
+
hasAttachment?: boolean;
|
|
66
|
+
from: EmailAddress[];
|
|
67
|
+
to: EmailAddress[];
|
|
68
|
+
cc?: EmailAddress[];
|
|
69
|
+
bcc?: EmailAddress[];
|
|
70
|
+
replyTo?: EmailAddress[];
|
|
71
|
+
textBody?: string;
|
|
72
|
+
htmlBody?: string;
|
|
73
|
+
attachments?: SimplifiedAttachment[];
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Simplified mailbox DTO for MCP tools.
|
|
77
|
+
* Preserves JMAP structure but with cleaner typing.
|
|
78
|
+
*/
|
|
79
|
+
export interface SimplifiedMailbox {
|
|
80
|
+
id: string;
|
|
81
|
+
name: string;
|
|
82
|
+
role: MailboxRole;
|
|
83
|
+
parentId: string | null;
|
|
84
|
+
sortOrder: number;
|
|
85
|
+
totalEmails: number;
|
|
86
|
+
unreadEmails: number;
|
|
87
|
+
totalThreads?: number;
|
|
88
|
+
unreadThreads?: number;
|
|
89
|
+
myRights?: MailboxRights;
|
|
90
|
+
isSubscribed?: boolean;
|
|
91
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simplified DTO types for MCP tools.
|
|
3
|
+
* These types represent JMAP objects in a format optimized for AI assistants:
|
|
4
|
+
* - Boolean flags instead of keyword objects
|
|
5
|
+
* - Arrays instead of Record<string, boolean> for mailboxIds
|
|
6
|
+
* - Human-readable property names
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=dto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dto.js","sourceRoot":"","sources":["../../src/types/dto.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript types for JMAP protocol (RFC 8620/8621)
|
|
3
|
+
*/
|
|
4
|
+
/** JMAP capabilities object - maps capability URIs to their configurations */
|
|
5
|
+
export type JMAPCapabilities = Record<string, unknown>;
|
|
6
|
+
/** JMAP account from session response */
|
|
7
|
+
export interface JMAPAccount {
|
|
8
|
+
name: string;
|
|
9
|
+
isPersonal: boolean;
|
|
10
|
+
accountCapabilities: JMAPCapabilities;
|
|
11
|
+
}
|
|
12
|
+
/** JMAP session response from .well-known/jmap endpoint */
|
|
13
|
+
export interface JMAPSessionResponse {
|
|
14
|
+
capabilities: JMAPCapabilities;
|
|
15
|
+
accounts: Record<string, JMAPAccount>;
|
|
16
|
+
primaryAccounts: Record<string, string>;
|
|
17
|
+
apiUrl: string;
|
|
18
|
+
state: string;
|
|
19
|
+
downloadUrl?: string;
|
|
20
|
+
uploadUrl?: string;
|
|
21
|
+
eventSourceUrl?: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* JMAP method call: [methodName, arguments, callId]
|
|
25
|
+
* Example: ['Email/get', { accountId: '...', ids: ['msg1'] }, 'c1']
|
|
26
|
+
*/
|
|
27
|
+
export type JMAPMethodCall = [
|
|
28
|
+
methodName: string,
|
|
29
|
+
args: Record<string, unknown>,
|
|
30
|
+
callId: string
|
|
31
|
+
];
|
|
32
|
+
/**
|
|
33
|
+
* JMAP method response: [methodName, response, callId]
|
|
34
|
+
* Example: ['Email/get', { accountId: '...', list: [...], state: '...' }, 'c1']
|
|
35
|
+
*/
|
|
36
|
+
export type JMAPMethodResponse = [
|
|
37
|
+
methodName: string,
|
|
38
|
+
response: Record<string, unknown>,
|
|
39
|
+
callId: string
|
|
40
|
+
];
|
|
41
|
+
/** JMAP request body */
|
|
42
|
+
export interface JMAPRequest {
|
|
43
|
+
using: string[];
|
|
44
|
+
methodCalls: JMAPMethodCall[];
|
|
45
|
+
}
|
|
46
|
+
/** JMAP response body */
|
|
47
|
+
export interface JMAPResponse {
|
|
48
|
+
methodResponses: JMAPMethodResponse[];
|
|
49
|
+
sessionState?: string;
|
|
50
|
+
}
|
|
51
|
+
/** JMAP error response (method-level error) */
|
|
52
|
+
export interface JMAPErrorResponse {
|
|
53
|
+
type: string;
|
|
54
|
+
description?: string;
|
|
55
|
+
}
|
|
56
|
+
/** JMAP Email/set response (RFC 8621 Section 4.3) */
|
|
57
|
+
export interface EmailSetResponse {
|
|
58
|
+
accountId: string;
|
|
59
|
+
oldState: string;
|
|
60
|
+
newState: string;
|
|
61
|
+
created?: Record<string, {
|
|
62
|
+
id: string;
|
|
63
|
+
blobId: string;
|
|
64
|
+
threadId: string;
|
|
65
|
+
}>;
|
|
66
|
+
updated?: Record<string, null>;
|
|
67
|
+
destroyed?: string[];
|
|
68
|
+
notCreated?: Record<string, {
|
|
69
|
+
type: string;
|
|
70
|
+
description?: string;
|
|
71
|
+
}>;
|
|
72
|
+
notUpdated?: Record<string, {
|
|
73
|
+
type: string;
|
|
74
|
+
description?: string;
|
|
75
|
+
}>;
|
|
76
|
+
notDestroyed?: Record<string, {
|
|
77
|
+
type: string;
|
|
78
|
+
description?: string;
|
|
79
|
+
}>;
|
|
80
|
+
}
|
|
81
|
+
/** JMAP Identity for email sending (RFC 8621 Section 6) */
|
|
82
|
+
export interface Identity {
|
|
83
|
+
id: string;
|
|
84
|
+
name: string;
|
|
85
|
+
email: string;
|
|
86
|
+
replyTo?: Array<{
|
|
87
|
+
name?: string;
|
|
88
|
+
email: string;
|
|
89
|
+
}> | null;
|
|
90
|
+
bcc?: Array<{
|
|
91
|
+
name?: string;
|
|
92
|
+
email: string;
|
|
93
|
+
}> | null;
|
|
94
|
+
textSignature?: string;
|
|
95
|
+
htmlSignature?: string;
|
|
96
|
+
mayDelete: boolean;
|
|
97
|
+
}
|
|
98
|
+
/** JMAP EmailSubmission/set response (RFC 8621 Section 7.5) */
|
|
99
|
+
export interface EmailSubmissionSetResponse {
|
|
100
|
+
accountId: string;
|
|
101
|
+
oldState: string | null;
|
|
102
|
+
newState: string;
|
|
103
|
+
created?: Record<string, {
|
|
104
|
+
id: string;
|
|
105
|
+
}>;
|
|
106
|
+
notCreated?: Record<string, {
|
|
107
|
+
type: string;
|
|
108
|
+
description?: string;
|
|
109
|
+
}>;
|
|
110
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jmap.js","sourceRoot":"","sources":["../../src/types/jmap.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
package/package.json
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "mcp-twake-mail",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "MCP server for Twake.ai — integrate your sovereign JMAP email server with any MCP-compatible AI assistant",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./build/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"mcp-twake-mail": "./build/index.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"build",
|
|
12
|
+
"README.md",
|
|
13
|
+
"LICENSE"
|
|
14
|
+
],
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "tsc",
|
|
17
|
+
"start": "node build/index.js",
|
|
18
|
+
"dev": "tsc --watch",
|
|
19
|
+
"test": "vitest run",
|
|
20
|
+
"test:watch": "vitest",
|
|
21
|
+
"test:coverage": "vitest run --coverage",
|
|
22
|
+
"lint": "eslint src/",
|
|
23
|
+
"lint:fix": "eslint src/ --fix",
|
|
24
|
+
"prepublishOnly": "npm run build && npm test"
|
|
25
|
+
},
|
|
26
|
+
"keywords": [
|
|
27
|
+
"mcp",
|
|
28
|
+
"model-context-protocol",
|
|
29
|
+
"jmap",
|
|
30
|
+
"email",
|
|
31
|
+
"twake",
|
|
32
|
+
"ai",
|
|
33
|
+
"claude",
|
|
34
|
+
"assistant",
|
|
35
|
+
"mail",
|
|
36
|
+
"sovereign"
|
|
37
|
+
],
|
|
38
|
+
"author": "LINAGORA <https://linagora.com>",
|
|
39
|
+
"license": "AGPL-3.0",
|
|
40
|
+
"repository": {
|
|
41
|
+
"type": "git",
|
|
42
|
+
"url": "git+https://github.com/linagora/mcp-twake-mail.git"
|
|
43
|
+
},
|
|
44
|
+
"homepage": "https://github.com/linagora/mcp-twake-mail#readme",
|
|
45
|
+
"bugs": {
|
|
46
|
+
"url": "https://github.com/linagora/mcp-twake-mail/issues"
|
|
47
|
+
},
|
|
48
|
+
"engines": {
|
|
49
|
+
"node": ">=20.0.0"
|
|
50
|
+
},
|
|
51
|
+
"dependencies": {
|
|
52
|
+
"@inquirer/prompts": "^8.2.0",
|
|
53
|
+
"@modelcontextprotocol/sdk": "^1.25.3",
|
|
54
|
+
"commander": "^14.0.2",
|
|
55
|
+
"oauth-callback": "^2.2.0",
|
|
56
|
+
"open": "^11.0.0",
|
|
57
|
+
"openid-client": "^6.8.1",
|
|
58
|
+
"pino": "^10.3.0",
|
|
59
|
+
"zod": "^4.3.6"
|
|
60
|
+
},
|
|
61
|
+
"devDependencies": {
|
|
62
|
+
"@eslint/js": "^9.39.2",
|
|
63
|
+
"@types/node": "^25.0.10",
|
|
64
|
+
"@vitest/coverage-v8": "^4.0.18",
|
|
65
|
+
"eslint": "^9.39.2",
|
|
66
|
+
"typescript": "^5.9.0",
|
|
67
|
+
"typescript-eslint": "^8.54.0",
|
|
68
|
+
"vitest": "^4.0.18",
|
|
69
|
+
"vitest-fetch-mock": "^0.4.0"
|
|
70
|
+
}
|
|
71
|
+
}
|