@redpop/apple-mail-mcp 0.0.0-stage → 0.1.1

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 (77) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +247 -2
  3. package/SECURITY.md +102 -0
  4. package/bin/Mail MCP Helper.app/Contents/CodeResources +0 -0
  5. package/bin/Mail MCP Helper.app/Contents/Info.plist +26 -0
  6. package/bin/Mail MCP Helper.app/Contents/MacOS/mail-helper +0 -0
  7. package/bin/Mail MCP Helper.app/Contents/Resources/AppIcon.icns +0 -0
  8. package/bin/Mail MCP Helper.app/Contents/_CodeSignature/CodeResources +128 -0
  9. package/dist/bodyScan.js +259 -0
  10. package/dist/bodyScan.js.map +1 -0
  11. package/dist/cli/doctor.js +242 -0
  12. package/dist/cli/doctor.js.map +1 -0
  13. package/dist/cli/main.js +59 -0
  14. package/dist/cli/main.js.map +1 -0
  15. package/dist/cli/setup.js +107 -0
  16. package/dist/cli/setup.js.map +1 -0
  17. package/dist/config.js +74 -0
  18. package/dist/config.js.map +1 -0
  19. package/dist/context.js +43 -0
  20. package/dist/context.js.map +1 -0
  21. package/dist/cursor.js +39 -0
  22. package/dist/cursor.js.map +1 -0
  23. package/dist/dates.js +44 -0
  24. package/dist/dates.js.map +1 -0
  25. package/dist/errors.js +56 -0
  26. package/dist/errors.js.map +1 -0
  27. package/dist/fdaPrompt.js +29 -0
  28. package/dist/fdaPrompt.js.map +1 -0
  29. package/dist/fold.js +8 -0
  30. package/dist/fold.js.map +1 -0
  31. package/dist/helper.js +45 -0
  32. package/dist/helper.js.map +1 -0
  33. package/dist/index.js +37 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/links.js +9 -0
  36. package/dist/links.js.map +1 -0
  37. package/dist/mailboxes.js +124 -0
  38. package/dist/mailboxes.js.map +1 -0
  39. package/dist/mime.js +151 -0
  40. package/dist/mime.js.map +1 -0
  41. package/dist/mimeTrim.js +222 -0
  42. package/dist/mimeTrim.js.map +1 -0
  43. package/dist/policy.js +84 -0
  44. package/dist/policy.js.map +1 -0
  45. package/dist/quickHtml.js +238 -0
  46. package/dist/quickHtml.js.map +1 -0
  47. package/dist/quotes.js +72 -0
  48. package/dist/quotes.js.map +1 -0
  49. package/dist/schemas.js +57 -0
  50. package/dist/schemas.js.map +1 -0
  51. package/dist/securityMail.data.js +34 -0
  52. package/dist/securityMail.data.js.map +1 -0
  53. package/dist/securityMail.js +82 -0
  54. package/dist/securityMail.js.map +1 -0
  55. package/dist/server.js +19 -0
  56. package/dist/server.js.map +1 -0
  57. package/dist/signing.js +64 -0
  58. package/dist/signing.js.map +1 -0
  59. package/dist/state.js +46 -0
  60. package/dist/state.js.map +1 -0
  61. package/dist/stdioRunner.js +206 -0
  62. package/dist/stdioRunner.js.map +1 -0
  63. package/dist/summary.js +57 -0
  64. package/dist/summary.js.map +1 -0
  65. package/dist/tools/getMessage.js +112 -0
  66. package/dist/tools/getMessage.js.map +1 -0
  67. package/dist/tools/getThread.js +52 -0
  68. package/dist/tools/getThread.js.map +1 -0
  69. package/dist/tools/index.js +11 -0
  70. package/dist/tools/index.js.map +1 -0
  71. package/dist/tools/listMailboxes.js +50 -0
  72. package/dist/tools/listMailboxes.js.map +1 -0
  73. package/dist/tools/respond.js +34 -0
  74. package/dist/tools/respond.js.map +1 -0
  75. package/dist/tools/searchMessages.js +159 -0
  76. package/dist/tools/searchMessages.js.map +1 -0
  77. package/package.json +60 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"respond.js","sourceRoot":"","sources":["../../src/tools/respond.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAErE,2GAA2G;AAC3G,6GAA6G;AAC7G,8GAA8G;AAC9G,sHAAsH;AACtH,MAAM,YAAY,GAAwB,IAAI,GAAG,CAAC,CAAC,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,CAAC,CAAA;AAQxG;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAA+D,EAAE,GAAgB;IAC7G,IAAI,CAAC;QACH,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,OAAO,EAAE,CAAA;QACtC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,iBAAiB,EAAE,UAAU,EAAuB,CAAA;IACvI,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,SAAS,GAAG,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;QAC1C,IAAI,IAAY,CAAA;QAChB,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;YACjC,IAAI,GAAG,KAAK,CAAC,IAAI,KAAK,2BAA2B,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;QACjM,CAAC;aAAM,CAAC;YACN,uDAAuD;YACvD,IAAI,GAAG,aAAa,CAAC,SAAS,CAAC,CAAA;QACjC,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAuB,CAAA;IAClF,CAAC;AACH,CAAC"}
@@ -0,0 +1,159 @@
1
+ import { z } from 'zod/v4';
2
+ import { CANDIDATE_CAP, scanBodies, TIME_BUDGET_MS } from '../bodyScan.js';
3
+ import { decodeCursor, encodeCursor, queryHash } from '../cursor.js';
4
+ import { parseDateInput } from '../dates.js';
5
+ import { HelperError } from '../errors.js';
6
+ import { searchResult } from '../schemas.js';
7
+ import { MessageSummary, toSummary } from '../summary.js';
8
+ import { respond } from './respond.js';
9
+ const IsoDateOrDateTime = z.string().min(1).max(40);
10
+ const Input = z
11
+ .object({
12
+ query: z.string().min(1).max(200).optional(),
13
+ from: z.string().min(1).max(200).optional(),
14
+ to: z.string().min(1).max(200).optional(),
15
+ subject: z.string().min(1).max(200).optional(),
16
+ bodyContains: z.string().min(2).max(200).optional(),
17
+ mailboxIds: z.array(z.string()).min(1).max(50).optional(),
18
+ since: IsoDateOrDateTime.optional(),
19
+ before: IsoDateOrDateTime.optional(),
20
+ unread: z.boolean().optional(),
21
+ flagged: z.boolean().optional(),
22
+ hasAttachment: z.boolean().optional(),
23
+ limit: z.number().int().min(1).max(100).default(20),
24
+ cursor: z.string().optional(),
25
+ })
26
+ .strict();
27
+ const ScanInfoSchema = z.object({
28
+ scanned: z.number().int(),
29
+ unavailable: z.number().int(),
30
+ stoppedBy: z.enum(['limit', 'cap', 'time']).nullable(),
31
+ complete: z.boolean(),
32
+ });
33
+ const Output = z.object({
34
+ messages: z.array(MessageSummary),
35
+ totalMatched: z.number().int().optional(),
36
+ totalMatchedCapped: z.boolean().optional(),
37
+ nextCursor: z.string().nullable(),
38
+ scan: ScanInfoSchema.optional(),
39
+ note: z.string().optional(),
40
+ });
41
+ const fmt = (n) => n.toLocaleString('en-US');
42
+ /** `followUp`: der Scan setzte mit einem Cursor fort, begann also nicht bei der neuesten Nachricht. */
43
+ function scanNote(scan, matches, followUp) {
44
+ const found = `${matches} ${matches === 1 ? 'match' : 'matches'}`;
45
+ const noBody = scan.unavailable > 0 ? ` ${fmt(scan.unavailable)} of them could not be searched because their body is not on this Mac or could not be read.` : '';
46
+ const n = fmt(scan.scanned);
47
+ if (scan.complete) {
48
+ const what = followUp ? `the remaining ${n} candidate messages` : `all ${n} candidate messages`;
49
+ return `Scanned ${what} and found ${found}.${noBody}`;
50
+ }
51
+ const why = {
52
+ limit: 'the requested number of matches was reached',
53
+ cap: `the limit of ${fmt(CANDIDATE_CAP)} scanned messages per call was reached`,
54
+ time: `the ${fmt(TIME_BUDGET_MS / 1000)} second time budget ran out`,
55
+ }[scan.stoppedBy];
56
+ const what = followUp ? `the next ${n} candidate messages after the previous page` : `the ${n} newest candidate messages`;
57
+ return `Scanned ${what} and found ${found}; stopped because ${why}.${noBody} Call again with nextCursor to continue, or narrow the search with from, since or mailboxIds.`;
58
+ }
59
+ function defined(o) {
60
+ return Object.fromEntries(Object.entries(o).filter(([, v]) => v !== undefined));
61
+ }
62
+ export function registerSearchMessages(server, ctx) {
63
+ server.registerTool('search_messages', {
64
+ description: 'Searches mail by sender, recipient, subject, free text, mailbox, date range, unread, flagged and attachment state, newest first, and returns message summaries without bodies. Changes nothing.',
65
+ inputSchema: Input,
66
+ outputSchema: Output,
67
+ annotations: { title: 'Search messages', readOnlyHint: true, idempotentHint: true, openWorldHint: false },
68
+ }, async (input) => respond(async () => {
69
+ const config = ctx.config();
70
+ if (input.bodyContains !== undefined && !config.bodySearch) {
71
+ throw new HelperError('INVALID_INPUT', 'Body search is disabled: the user turned it off (APPLE_MAIL_BODY_SEARCH=false), so bodyContains cannot be used.');
72
+ }
73
+ // Datumsfehler vor policy(): ein ungueltiges Datum soll keinen list-mailboxes-Aufruf kosten.
74
+ const since = input.since !== undefined ? parseDateInput(input.since) : undefined;
75
+ const before = input.before !== undefined ? parseDateInput(input.before) : undefined;
76
+ const policy = await ctx.policy();
77
+ let mailboxIds;
78
+ if (input.mailboxIds) {
79
+ const allowed = new Set(policy.allowedMailboxIds);
80
+ mailboxIds = input.mailboxIds.map((s) => (/^\d+$/.test(s) ? Number(s) : NaN));
81
+ // Unbekannt, ausgeschlossen und unlesbar sehen gleich aus.
82
+ if (mailboxIds.some((id) => !allowed.has(id)))
83
+ throw new HelperError('MAILBOX_NOT_FOUND', '');
84
+ }
85
+ // Ohne sichtbare Mailbox gibt es nichts zu suchen; der Helper verlangt eine nicht leere Menge.
86
+ if (policy.allowedMailboxIds.length === 0) {
87
+ return {
88
+ structured: Output.parse({
89
+ messages: [],
90
+ nextCursor: null,
91
+ note: 'No mailbox is visible with the current configuration, so there is nothing to search. Call list_mailboxes to see what is visible.',
92
+ }),
93
+ };
94
+ }
95
+ const limit = Math.min(input.limit, config.maxResults);
96
+ const filters = defined({
97
+ query: input.query,
98
+ from: input.from,
99
+ to: input.to,
100
+ subject: input.subject,
101
+ mailboxIds: mailboxIds ? [...mailboxIds].sort((a, b) => a - b) : undefined,
102
+ since,
103
+ before,
104
+ unread: input.unread,
105
+ flagged: input.flagged,
106
+ hasAttachment: input.hasAttachment,
107
+ });
108
+ // bodyContains gehoert in den Hash, damit ein Cursor nur zur selben Body-Suche passt.
109
+ const hash = queryHash(input.bodyContains !== undefined ? { ...filters, bodyContains: input.bodyContains } : filters, policy.fingerprint);
110
+ const after = input.cursor !== undefined ? decodeCursor(input.cursor, hash) : undefined;
111
+ if (input.bodyContains !== undefined) {
112
+ const res = await scanBodies({
113
+ runner: ctx.runner,
114
+ policy,
115
+ config,
116
+ filters: defined({ ...filters, mailboxIds }),
117
+ term: input.bodyContains,
118
+ after: after ?? null,
119
+ limit,
120
+ });
121
+ const messages = res.matches.map((m) => ({ ...toSummary(m.row, policy, config, 5), matchContext: m.matchContext }));
122
+ return {
123
+ structured: Output.parse({
124
+ messages,
125
+ nextCursor: res.resumeAfter ? encodeCursor(res.resumeAfter, hash) : null,
126
+ scan: res.scan,
127
+ note: scanNote(res.scan, messages.length, after !== undefined),
128
+ }),
129
+ };
130
+ }
131
+ const raw = searchResult.parse(await ctx.runner.run('search', {
132
+ allowedMailboxIds: policy.allowedMailboxIds,
133
+ ...defined({ ...filters, mailboxIds }),
134
+ ...(after ? { after: { date: after.d, gid: after.g } } : {}),
135
+ limit,
136
+ maxRecipients: 5,
137
+ countTotal: true,
138
+ }));
139
+ const messages = raw.messages.map((r) => toSummary(r, policy, config, 5));
140
+ const last = raw.messages[raw.messages.length - 1];
141
+ const nextCursor = raw.hasMore && last ? encodeCursor({ d: last.dateReceived, g: last.gid }, hash) : null;
142
+ let note;
143
+ if (raw.hasMore) {
144
+ // Folgeseiten zaehlen nicht (totalMatched fehlt); totalMatchedCapped ist laut Helper immer false.
145
+ const of = raw.totalMatched == null ? '' : ` of ${raw.totalMatched}`;
146
+ note = `Showing ${messages.length}${of} matches. Use nextCursor for more, or narrow with from, since or mailboxIds.`;
147
+ }
148
+ return {
149
+ structured: Output.parse({
150
+ messages,
151
+ ...(raw.totalMatched != null ? { totalMatched: raw.totalMatched } : {}),
152
+ ...(raw.totalMatchedCapped !== undefined ? { totalMatchedCapped: raw.totalMatchedCapped } : {}),
153
+ nextCursor,
154
+ ...(note ? { note } : {}),
155
+ }),
156
+ };
157
+ }, ctx));
158
+ }
159
+ //# sourceMappingURL=searchMessages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"searchMessages.js","sourceRoot":"","sources":["../../src/tools/searchMessages.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,62 @@
1
1
  {
2
2
  "name": "@redpop/apple-mail-mcp",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.1",
4
+ "mcpName": "io.github.redpop/apple-mail-mcp",
5
+ "description": "Read-only MCP server for Apple Mail on macOS: search and read mail, mailboxes and threads, with a Full Disk Access grant that only a signed helper holds",
6
+ "license": "MIT",
7
+ "type": "module",
8
+ "keywords": [
9
+ "mcp",
10
+ "model-context-protocol",
11
+ "apple-mail",
12
+ "mail",
13
+ "email",
14
+ "macos",
15
+ "read-only"
16
+ ],
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "git+https://github.com/redpop/apple-mail-mcp.git"
20
+ },
21
+ "bugs": {
22
+ "url": "https://github.com/redpop/apple-mail-mcp/issues"
23
+ },
24
+ "homepage": "https://github.com/redpop/apple-mail-mcp#readme",
25
+ "os": [
26
+ "darwin"
27
+ ],
28
+ "engines": {
29
+ "node": ">=22"
30
+ },
31
+ "bin": {
32
+ "apple-mail-mcp": "dist/index.js"
33
+ },
34
+ "files": [
35
+ "dist",
36
+ "bin",
37
+ "README.md",
38
+ "LICENSE",
39
+ "SECURITY.md"
40
+ ],
41
+ "scripts": {
42
+ "build": "rm -rf dist && tsc -p tsconfig.build.json",
43
+ "build:helper": "bash swift/build.sh",
44
+ "typecheck": "tsc --noEmit",
45
+ "test": "vitest run",
46
+ "test:swift": "swift test --package-path swift",
47
+ "version": "node scripts/sync-versions.mjs && git add server.json manifest.json swift/Sources/MailHelperCore/Version.generated.swift",
48
+ "prepublishOnly": "node scripts/release/check-publish.mjs"
49
+ },
50
+ "dependencies": {
51
+ "@modelcontextprotocol/server": "^2.3.1",
52
+ "html-to-text": "^10.0.1",
53
+ "postal-mime": "^4.0.11",
54
+ "zod": "^4.6.7"
55
+ },
56
+ "devDependencies": {
57
+ "@types/html-to-text": "^9.0.4",
58
+ "@types/node": "^26.6.5",
59
+ "typescript": "^7.0.2",
60
+ "vitest": "^5.0.5"
61
+ }
62
+ }