@rndmjoker/proton-mcp 0.4.4

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 (141) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +405 -0
  3. package/dist/activity.d.ts +49 -0
  4. package/dist/activity.js +72 -0
  5. package/dist/activity.js.map +1 -0
  6. package/dist/bridge/certificate.d.ts +75 -0
  7. package/dist/bridge/certificate.js +176 -0
  8. package/dist/bridge/certificate.js.map +1 -0
  9. package/dist/bridge/connection.d.ts +99 -0
  10. package/dist/bridge/connection.js +244 -0
  11. package/dist/bridge/connection.js.map +1 -0
  12. package/dist/bridge/errors.d.ts +35 -0
  13. package/dist/bridge/errors.js +56 -0
  14. package/dist/bridge/errors.js.map +1 -0
  15. package/dist/config.d.ts +92 -0
  16. package/dist/config.js +142 -0
  17. package/dist/config.js.map +1 -0
  18. package/dist/credentials/availability.d.ts +62 -0
  19. package/dist/credentials/availability.js +107 -0
  20. package/dist/credentials/availability.js.map +1 -0
  21. package/dist/credentials/encrypted-file.d.ts +50 -0
  22. package/dist/credentials/encrypted-file.js +156 -0
  23. package/dist/credentials/encrypted-file.js.map +1 -0
  24. package/dist/credentials/keyring.d.ts +48 -0
  25. package/dist/credentials/keyring.js +97 -0
  26. package/dist/credentials/keyring.js.map +1 -0
  27. package/dist/credentials/plain-file.d.ts +24 -0
  28. package/dist/credentials/plain-file.js +78 -0
  29. package/dist/credentials/plain-file.js.map +1 -0
  30. package/dist/credentials/probe-keyring.d.ts +11 -0
  31. package/dist/credentials/probe-keyring.js +57 -0
  32. package/dist/credentials/probe-keyring.js.map +1 -0
  33. package/dist/credentials/session.d.ts +15 -0
  34. package/dist/credentials/session.js +21 -0
  35. package/dist/credentials/session.js.map +1 -0
  36. package/dist/credentials/store.d.ts +80 -0
  37. package/dist/credentials/store.js +94 -0
  38. package/dist/credentials/store.js.map +1 -0
  39. package/dist/in-flight.d.ts +33 -0
  40. package/dist/in-flight.js +78 -0
  41. package/dist/in-flight.js.map +1 -0
  42. package/dist/mail/actions.d.ts +116 -0
  43. package/dist/mail/actions.js +265 -0
  44. package/dist/mail/actions.js.map +1 -0
  45. package/dist/mail/attachments.d.ts +39 -0
  46. package/dist/mail/attachments.js +86 -0
  47. package/dist/mail/attachments.js.map +1 -0
  48. package/dist/mail/compose.d.ts +264 -0
  49. package/dist/mail/compose.js +395 -0
  50. package/dist/mail/compose.js.map +1 -0
  51. package/dist/mail/drafts.d.ts +138 -0
  52. package/dist/mail/drafts.js +449 -0
  53. package/dist/mail/drafts.js.map +1 -0
  54. package/dist/mail/ids.d.ts +78 -0
  55. package/dist/mail/ids.js +135 -0
  56. package/dist/mail/ids.js.map +1 -0
  57. package/dist/mail/labels.d.ts +61 -0
  58. package/dist/mail/labels.js +139 -0
  59. package/dist/mail/labels.js.map +1 -0
  60. package/dist/mail/markup.d.ts +91 -0
  61. package/dist/mail/markup.js +265 -0
  62. package/dist/mail/markup.js.map +1 -0
  63. package/dist/mail/messages.d.ts +147 -0
  64. package/dist/mail/messages.js +219 -0
  65. package/dist/mail/messages.js.map +1 -0
  66. package/dist/mail/quote.d.ts +65 -0
  67. package/dist/mail/quote.js +157 -0
  68. package/dist/mail/quote.js.map +1 -0
  69. package/dist/mail/search.d.ts +66 -0
  70. package/dist/mail/search.js +107 -0
  71. package/dist/mail/search.js.map +1 -0
  72. package/dist/mail/send.d.ts +61 -0
  73. package/dist/mail/send.js +132 -0
  74. package/dist/mail/send.js.map +1 -0
  75. package/dist/mime/parse.d.ts +110 -0
  76. package/dist/mime/parse.js +194 -0
  77. package/dist/mime/parse.js.map +1 -0
  78. package/dist/server.d.ts +13 -0
  79. package/dist/server.js +387 -0
  80. package/dist/server.js.map +1 -0
  81. package/dist/session.d.ts +86 -0
  82. package/dist/session.js +220 -0
  83. package/dist/session.js.map +1 -0
  84. package/dist/settings.d.ts +52 -0
  85. package/dist/settings.js +80 -0
  86. package/dist/settings.js.map +1 -0
  87. package/dist/tools/actions.d.ts +21 -0
  88. package/dist/tools/actions.js +133 -0
  89. package/dist/tools/actions.js.map +1 -0
  90. package/dist/tools/capabilities.d.ts +52 -0
  91. package/dist/tools/capabilities.js +96 -0
  92. package/dist/tools/capabilities.js.map +1 -0
  93. package/dist/tools/confirm.d.ts +84 -0
  94. package/dist/tools/confirm.js +212 -0
  95. package/dist/tools/confirm.js.map +1 -0
  96. package/dist/tools/drafts.d.ts +21 -0
  97. package/dist/tools/drafts.js +199 -0
  98. package/dist/tools/drafts.js.map +1 -0
  99. package/dist/tools/failures.d.ts +46 -0
  100. package/dist/tools/failures.js +157 -0
  101. package/dist/tools/failures.js.map +1 -0
  102. package/dist/tools/format.d.ts +55 -0
  103. package/dist/tools/format.js +220 -0
  104. package/dist/tools/format.js.map +1 -0
  105. package/dist/tools/guidance.d.ts +38 -0
  106. package/dist/tools/guidance.js +226 -0
  107. package/dist/tools/guidance.js.map +1 -0
  108. package/dist/tools/interface.d.ts +28 -0
  109. package/dist/tools/interface.js +63 -0
  110. package/dist/tools/interface.js.map +1 -0
  111. package/dist/tools/labels.d.ts +21 -0
  112. package/dist/tools/labels.js +92 -0
  113. package/dist/tools/labels.js.map +1 -0
  114. package/dist/tools/list-folders.d.ts +14 -0
  115. package/dist/tools/list-folders.js +70 -0
  116. package/dist/tools/list-folders.js.map +1 -0
  117. package/dist/tools/messages.d.ts +9 -0
  118. package/dist/tools/messages.js +221 -0
  119. package/dist/tools/messages.js.map +1 -0
  120. package/dist/tools/send.d.ts +29 -0
  121. package/dist/tools/send.js +236 -0
  122. package/dist/tools/send.js.map +1 -0
  123. package/dist/tools/sign-in-required.d.ts +94 -0
  124. package/dist/tools/sign-in-required.js +168 -0
  125. package/dist/tools/sign-in-required.js.map +1 -0
  126. package/dist/web/layout.d.ts +75 -0
  127. package/dist/web/layout.js +590 -0
  128. package/dist/web/layout.js.map +1 -0
  129. package/dist/web/pages.d.ts +79 -0
  130. package/dist/web/pages.js +284 -0
  131. package/dist/web/pages.js.map +1 -0
  132. package/dist/web/sections.d.ts +105 -0
  133. package/dist/web/sections.js +207 -0
  134. package/dist/web/sections.js.map +1 -0
  135. package/dist/web/security.d.ts +122 -0
  136. package/dist/web/security.js +180 -0
  137. package/dist/web/security.js.map +1 -0
  138. package/dist/web/server.d.ts +153 -0
  139. package/dist/web/server.js +622 -0
  140. package/dist/web/server.js.map +1 -0
  141. package/package.json +70 -0
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Turning raw messages into something a language model can read.
3
+ *
4
+ * Three facts measured against the Bridge drive this module:
5
+ *
6
+ * 1. A message with three sentences of content costs around 2782 tokens raw as
7
+ * HTML, while the content itself is about 30. In a real mailbox the median
8
+ * message is roughly 16200 tokens raw. Twenty of those exceed a full context
9
+ * window, so raw content is never passed on.
10
+ * 2. HTML messages lose their plain text part on the way through Proton. There
11
+ * is no fallback, so converting HTML to text is mandatory rather than
12
+ * optional.
13
+ * 3. Proton attaches its own PGP public key to every message sent through the
14
+ * Bridge. It is not a real attachment and has to be filtered out of every
15
+ * attachment list.
16
+ */
17
+ export interface Address {
18
+ name?: string;
19
+ address: string;
20
+ }
21
+ export interface Attachment {
22
+ /** Index within the message, used to fetch the content later. */
23
+ index: number;
24
+ filename: string;
25
+ contentType: string;
26
+ size: number;
27
+ /** Content-ID, set for images referenced from the HTML body. */
28
+ contentId?: string;
29
+ }
30
+ export interface ParsedMessage {
31
+ /** Stable across mailboxes, unlike a UID, which changes on every move. */
32
+ messageId: string;
33
+ subject: string;
34
+ from: Address[];
35
+ to: Address[];
36
+ cc: Address[];
37
+ /**
38
+ * Only ever filled for a draft we wrote ourselves. A delivered message never
39
+ * carries the blind copies, which is the point of them.
40
+ */
41
+ bcc: Address[];
42
+ replyTo: Address[];
43
+ date: Date | undefined;
44
+ /** Readable text. Always filled when the message has any body at all. */
45
+ text: string;
46
+ /** Where the text came from. "html" means it was converted. */
47
+ textSource: 'plain' | 'html' | 'none';
48
+ /**
49
+ * The markup itself, when the message had any.
50
+ *
51
+ * Kept alongside the converted text rather than instead of it. A draft that
52
+ * was written as markup has to be sendable again as the markup it was, and
53
+ * converting it to text and back would deliver something the author never
54
+ * wrote.
55
+ */
56
+ html?: string;
57
+ /** True when the text was shortened to stay within the budget. */
58
+ truncated: boolean;
59
+ /** Where to continue reading, or undefined when the end was reached. */
60
+ nextTextOffset?: number;
61
+ /** Total length of the body text, whether shown or not. */
62
+ totalTextChars: number;
63
+ /** Real attachments. Proton's own public key is not among them. */
64
+ attachments: Attachment[];
65
+ /** True when Proton's public key was filtered out. */
66
+ protonKeyFiltered: boolean;
67
+ /** Size of the raw message in bytes, for diagnostics. */
68
+ rawSize: number;
69
+ }
70
+ /**
71
+ * Recognises the public key Proton attaches to every outgoing message.
72
+ *
73
+ * Measured shape: content type `application/pgp-keys`, file name
74
+ * `publickey - <address> - 0x<id>.asc`. The content type alone is not enough,
75
+ * because a genuinely attached key would look the same. The name pattern is
76
+ * what Proton generates.
77
+ */
78
+ export declare function isProtonPublicKey(contentType: string, filename: string): boolean;
79
+ /** Converts HTML into readable text without ever fetching anything. */
80
+ export declare function htmlToText(html: string): string;
81
+ /** Rough token estimate from a character count. Four characters per token is close enough to budget with. */
82
+ export declare function estimateTokensForChars(chars: number): number;
83
+ /** Rough token estimate for a piece of text. */
84
+ export declare function estimateTokens(text: string): number;
85
+ export interface Excerpt {
86
+ text: string;
87
+ truncated: boolean;
88
+ /** Where to continue reading, or undefined when the end was reached. */
89
+ nextOffset?: number;
90
+ /** Total length of the untruncated text. */
91
+ totalChars: number;
92
+ }
93
+ /**
94
+ * Returns a window of the text and says exactly where it ends.
95
+ *
96
+ * Cutting silently would be worse than cutting visibly: the model would treat a
97
+ * truncated message as complete and draw conclusions from something that is not
98
+ * there. And a note saying "ask for the rest" is only honest if there is a way
99
+ * to ask, hence nextOffset. Long messages are read the way long listings are
100
+ * paged, not by raising a limit until it fits.
101
+ */
102
+ export declare function truncate(text: string, maxChars: number, offset?: number): Excerpt;
103
+ export interface ParseOptions {
104
+ /** Upper bound for the body text in characters. 0 means no limit. */
105
+ maxTextChars?: number;
106
+ /** Where to start reading the body, for continuing a long message. */
107
+ textOffset?: number;
108
+ }
109
+ /** Parses a raw message. */
110
+ export declare function parseMessage(source: Buffer | string, options?: ParseOptions): Promise<ParsedMessage>;
@@ -0,0 +1,194 @@
1
+ /**
2
+ * Turning raw messages into something a language model can read.
3
+ *
4
+ * Three facts measured against the Bridge drive this module:
5
+ *
6
+ * 1. A message with three sentences of content costs around 2782 tokens raw as
7
+ * HTML, while the content itself is about 30. In a real mailbox the median
8
+ * message is roughly 16200 tokens raw. Twenty of those exceed a full context
9
+ * window, so raw content is never passed on.
10
+ * 2. HTML messages lose their plain text part on the way through Proton. There
11
+ * is no fallback, so converting HTML to text is mandatory rather than
12
+ * optional.
13
+ * 3. Proton attaches its own PGP public key to every message sent through the
14
+ * Bridge. It is not a real attachment and has to be filtered out of every
15
+ * attachment list.
16
+ */
17
+ import { simpleParser } from 'mailparser';
18
+ import { convert } from 'html-to-text';
19
+ /**
20
+ * Recognises the public key Proton attaches to every outgoing message.
21
+ *
22
+ * Measured shape: content type `application/pgp-keys`, file name
23
+ * `publickey - <address> - 0x<id>.asc`. The content type alone is not enough,
24
+ * because a genuinely attached key would look the same. The name pattern is
25
+ * what Proton generates.
26
+ */
27
+ export function isProtonPublicKey(contentType, filename) {
28
+ if (contentType.toLowerCase() !== 'application/pgp-keys')
29
+ return false;
30
+ return /^publickey - .+ - 0x[0-9a-f]+\.asc$/i.test(filename);
31
+ }
32
+ /** Converts HTML into readable text without ever fetching anything. */
33
+ export function htmlToText(html) {
34
+ return convert(html, {
35
+ wordwrap: false,
36
+ selectors: [
37
+ // Images are dropped. Their URLs are worthless without fetching them,
38
+ // and fetching would confirm to the sender that the message was read.
39
+ { selector: 'img', format: 'skip' },
40
+ // Links keep their target. A recipient has to be able to see where a
41
+ // link actually goes, that is the whole point when judging a phishing
42
+ // attempt.
43
+ { selector: 'a', options: { hideLinkHrefIfSameAsText: true } },
44
+ // Tracking pixels and layout tables carry no content.
45
+ { selector: 'table', format: 'dataTable' },
46
+ // By default headings are upper-cased, which changes the wording of the
47
+ // message. A model should see what was written, not a shouted version.
48
+ { selector: 'h1', options: { uppercase: false } },
49
+ { selector: 'h2', options: { uppercase: false } },
50
+ { selector: 'h3', options: { uppercase: false } },
51
+ { selector: 'h4', options: { uppercase: false } },
52
+ { selector: 'h5', options: { uppercase: false } },
53
+ { selector: 'h6', options: { uppercase: false } },
54
+ ],
55
+ })
56
+ .replace(/\n{3,}/g, '\n\n')
57
+ .trim();
58
+ }
59
+ function addresses(field) {
60
+ if (!field)
61
+ return [];
62
+ const list = Array.isArray(field) ? field : [field];
63
+ const out = [];
64
+ for (const group of list) {
65
+ for (const entry of group.value ?? []) {
66
+ if (!entry.address)
67
+ continue;
68
+ const item = { address: entry.address };
69
+ if (entry.name)
70
+ item.name = entry.name;
71
+ out.push(item);
72
+ }
73
+ }
74
+ return out;
75
+ }
76
+ /** Rough token estimate from a character count. Four characters per token is close enough to budget with. */
77
+ export function estimateTokensForChars(chars) {
78
+ return Math.ceil(chars / 4);
79
+ }
80
+ /** Rough token estimate for a piece of text. */
81
+ export function estimateTokens(text) {
82
+ return estimateTokensForChars(text.length);
83
+ }
84
+ /**
85
+ * Returns a window of the text and says exactly where it ends.
86
+ *
87
+ * Cutting silently would be worse than cutting visibly: the model would treat a
88
+ * truncated message as complete and draw conclusions from something that is not
89
+ * there. And a note saying "ask for the rest" is only honest if there is a way
90
+ * to ask, hence nextOffset. Long messages are read the way long listings are
91
+ * paged, not by raising a limit until it fits.
92
+ */
93
+ export function truncate(text, maxChars, offset = 0) {
94
+ const totalChars = text.length;
95
+ const from = Math.max(0, Math.min(offset, totalChars));
96
+ const window = text.slice(from, from + maxChars);
97
+ const isStart = from === 0;
98
+ const reachesEnd = from + window.length >= totalChars;
99
+ if (isStart && reachesEnd) {
100
+ return { text, truncated: false, totalChars };
101
+ }
102
+ // Prefer to cut at a paragraph or line break, so no sentence is severed
103
+ // mid-word. Only when that does not throw away half the window.
104
+ let cut = window;
105
+ if (!reachesEnd) {
106
+ const lastBreak = Math.max(window.lastIndexOf('\n\n'), window.lastIndexOf('\n'));
107
+ if (lastBreak > maxChars * 0.5)
108
+ cut = window.slice(0, lastBreak);
109
+ }
110
+ const end = from + cut.length;
111
+ const parts = [];
112
+ if (!isStart) {
113
+ parts.push(`[... continuing at character ${from} of ${totalChars} ...]`, '');
114
+ }
115
+ parts.push(cut);
116
+ if (end < totalChars) {
117
+ const remaining = totalChars - end;
118
+ parts.push('', `[... ${remaining} of ${totalChars} characters not shown, roughly ` +
119
+ `${estimateTokensForChars(remaining)} tokens. Pass textOffset=${end} to continue reading.]`);
120
+ }
121
+ const result = {
122
+ text: parts.join('\n'),
123
+ truncated: true,
124
+ totalChars,
125
+ };
126
+ if (end < totalChars)
127
+ result.nextOffset = end;
128
+ return result;
129
+ }
130
+ /** Parses a raw message. */
131
+ export async function parseMessage(source, options = {}) {
132
+ const parsed = await simpleParser(source, {
133
+ // We never render HTML, so there is no reason to have mailparser build a
134
+ // second HTML representation of the plain text part.
135
+ skipTextToHtml: true,
136
+ skipTextLinks: true,
137
+ });
138
+ let text = '';
139
+ let textSource = 'none';
140
+ if (parsed.text && parsed.text.trim()) {
141
+ text = parsed.text.trim();
142
+ textSource = 'plain';
143
+ }
144
+ else if (parsed.html) {
145
+ text = htmlToText(parsed.html);
146
+ textSource = 'html';
147
+ }
148
+ const limit = options.maxTextChars ?? 0;
149
+ const offset = options.textOffset ?? 0;
150
+ const excerpt = limit > 0
151
+ ? truncate(text, limit, offset)
152
+ : { text, truncated: false, totalChars: text.length };
153
+ const attachments = [];
154
+ let protonKeyFiltered = false;
155
+ let index = 0;
156
+ for (const a of parsed.attachments ?? []) {
157
+ const filename = a.filename ?? '';
158
+ const contentType = a.contentType ?? 'application/octet-stream';
159
+ if (isProtonPublicKey(contentType, filename)) {
160
+ protonKeyFiltered = true;
161
+ // Deliberately not counted: the index has to match what a caller sees.
162
+ continue;
163
+ }
164
+ const item = {
165
+ index: index++,
166
+ filename: filename || `attachment-${index}`,
167
+ contentType,
168
+ size: a.size ?? 0,
169
+ };
170
+ if (a.cid)
171
+ item.contentId = a.cid;
172
+ attachments.push(item);
173
+ }
174
+ return {
175
+ messageId: parsed.messageId ?? '',
176
+ subject: parsed.subject ?? '',
177
+ from: addresses(parsed.from),
178
+ to: addresses(parsed.to),
179
+ cc: addresses(parsed.cc),
180
+ bcc: addresses(parsed.bcc),
181
+ replyTo: addresses(parsed.replyTo),
182
+ date: parsed.date,
183
+ text: excerpt.text,
184
+ textSource,
185
+ ...(typeof parsed.html === 'string' && parsed.html ? { html: parsed.html } : {}),
186
+ truncated: excerpt.truncated,
187
+ ...(excerpt.nextOffset !== undefined ? { nextTextOffset: excerpt.nextOffset } : {}),
188
+ totalTextChars: excerpt.totalChars,
189
+ attachments,
190
+ protonKeyFiltered,
191
+ rawSize: typeof source === 'string' ? Buffer.byteLength(source) : source.length,
192
+ };
193
+ }
194
+ //# sourceMappingURL=parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/mime/parse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Entry point of the MCP server.
4
+ *
5
+ * The server speaks over stdio, so the client starts it as a child process.
6
+ * That is not a workaround: the Bridge only listens on 127.0.0.1, so a server
7
+ * running in the cloud could not reach it at all.
8
+ *
9
+ * The local web interface runs for as long as this process does. It is not
10
+ * started on demand: it is where configuration and state live, and it is meant
11
+ * to be opened again and again rather than summoned for one sign-in.
12
+ */
13
+ export {};