mcp-macos 4.0.0 → 4.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.
Files changed (2) hide show
  1. package/README.md +48 -2
  2. package/package.json +4 -1
package/README.md CHANGED
@@ -1,17 +1,40 @@
1
- # macos-mcp ![License: MIT](https://img.shields.io/badge/license-MIT-green)
1
+ # macos-mcp ![Platform: macOS](https://img.shields.io/badge/platform-macOS-blue) ![License: MIT](https://img.shields.io/badge/license-MIT-green)
2
2
 
3
3
  > Based on [FradSer/mcp-server-apple-events](https://github.com/FradSer/mcp-server-apple-events)
4
4
 
5
- MCP server for Reminders, Calendar, Notes, Mail, Messages, and Contacts on macOS. Local stdio transport for Claude Desktop, Claude Code, and Cursor.
5
+ MCP server for Reminders, Calendar, Notes, Mail, Messages, and Contacts on macOS. Local stdio transport works with any MCP-capable client running on the same Mac (Claude Code, Claude Desktop, Cursor, Zed, Continue, ChatGPT desktop, etc.).
6
+
7
+ > **Requires a Mac.** This server drives native macOS apps via EventKit, JXA (Apple Events), and SQLite reads of local Apple databases. It cannot run on Linux, Windows, iOS, Android, or in a web browser. You need a Mac (desktop or laptop) running macOS.
8
+
9
+ ## Design Notes
10
+
11
+ - **SQLite for reads, JXA for writes.** JXA reads of Mail and Messages don't scale — 60s timeouts on real inboxes, and JXA Messages reads are broken entirely on macOS Sonoma+. This server reads `chat.db` and Mail's `Envelope Index` directly, including the Gmail `labels` join table for `[Gmail]/All Mail` accounts. Writes still go through JXA because Apple Events is the only API that triggers them. See [ADR-001](DECISION.md).
12
+ - **Per-app hybrid backend.** Each app uses the bridge that works: Swift CLI through EventKit for Reminders and Calendar, JXA for Notes/Contacts/Mail-writes/Messages-send, SQLite for Mail and Messages reads. The architecture diagram below shows the full fan-out.
13
+ - **Cross-tool contact enrichment.** A shared layer resolves raw phone numbers and emails to contact names across Messages, Mail, and Calendar. Bulk cache via SQLite AddressBook (<50ms for 1,100+ entries), targeted lookups via JXA `whose()`. See [ADR-002](DECISION.md).
14
+ - **Preflight check.** `macos-mcp --check` validates macOS version, Node.js, the EventKit binary, Full Disk Access, and JXA permissions before runtime, with deep-links to the relevant System Settings panes for any failures.
6
15
 
7
16
  ## Quick Start
8
17
 
18
+ ### Install as a Claude Code plugin
19
+
20
+ ```
21
+ /plugin marketplace add krmj22/macos-mcp
22
+ /plugin install macos-mcp@krmj22-plugins
23
+ ```
24
+
25
+ Run these inside Claude Code. The plugin wires up the MCP server via `npx -y mcp-macos`, so no separate install step is required.
26
+
9
27
  ### Install from npm
10
28
 
11
29
  ```bash
12
30
  npm install -g mcp-macos
31
+ # or use npx via your client's MCP config (no global install needed)
13
32
  ```
14
33
 
34
+ ### Or install via MCPB (Claude Desktop)
35
+
36
+ Download the `.mcpb` bundle from the [latest GitHub release](https://github.com/krmj22/macos-mcp/releases/latest) and drag it onto Claude Desktop. The bundle includes a pre-built universal Swift binary (arm64 + x86_64), so no Xcode Command Line Tools required.
37
+
15
38
  ### Or build from source
16
39
 
17
40
  ```bash
@@ -162,12 +185,35 @@ Production entry point (`bin/run.cjs`) requires `pnpm build`. Use `pnpm dev` for
162
185
 
163
186
  ### Architecture
164
187
 
188
+ ```mermaid
189
+ flowchart LR
190
+ Client[MCP Client<br/>Claude Code, Cursor, Desktop] -->|stdio| Server[macos-mcp]
191
+
192
+ Server --> Swift[Swift CLI]
193
+ Server --> JXA[JXA]
194
+ Server --> SQLite[SQLite Readers]
195
+
196
+ Swift -->|EventKit| Reminders[Reminders]
197
+ Swift -->|EventKit| Calendar[Calendar]
198
+
199
+ JXA -->|Apple Events| Notes[Notes]
200
+ JXA -->|Apple Events| Contacts[Contacts]
201
+ JXA -->|writes only| Mail[Mail]
202
+ JXA -->|send only| Messages[Messages]
203
+
204
+ SQLite -->|Envelope Index| Mail
205
+ SQLite -->|chat.db| Messages
206
+ SQLite -->|AddressBook| Enrich[Contact<br/>Enrichment Cache]
207
+ ```
208
+
165
209
  Three bridges to Apple apps:
166
210
 
167
211
  - **EventKit (Swift binary)** — Reminders, Calendar. Compiled Swift CLI, returns JSON.
168
212
  - **JXA** — Notes, Mail writes, Contacts. Scripts run via `osascript -l JavaScript`.
169
213
  - **SQLite** — Messages reads (`~/Library/Messages/chat.db`), Mail reads (`~/Library/Mail/V10/MailData/Envelope Index`). JXA message reading is broken on Sonoma+; JXA mail reading is too slow for real inboxes.
170
214
 
215
+ Mail and Messages use a hybrid path: JXA for writes (only way to trigger send/draft), SQLite for reads (the only way that scales). See [DECISION.md](DECISION.md) for architecture decision records.
216
+
171
217
  ### Dependencies
172
218
 
173
219
  **Runtime:** `@modelcontextprotocol/sdk`, `zod`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mcp-macos",
3
- "version": "4.0.0",
3
+ "version": "4.1.0",
4
4
  "description": "MCP server for Reminders, Calendar, Notes, Mail, Messages, and Contacts on macOS.",
5
5
  "author": "Kyle Jensen",
6
6
  "contributors": [
@@ -50,6 +50,8 @@
50
50
  "clean": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"",
51
51
  "build:ts": "tsc -p tsconfig.json",
52
52
  "build:swift": "node scripts/build-swift.mjs",
53
+ "build:swift:universal": "node scripts/build-swift-universal.mjs",
54
+ "build:mcpb": "node scripts/build-mcpb.mjs",
53
55
  "build": "pnpm run clean && pnpm run build:ts && pnpm run build:swift",
54
56
  "dev": "node bin/dev.cjs",
55
57
  "test": "NODE_NO_WARNINGS=1 jest",
@@ -73,6 +75,7 @@
73
75
  "@babel/preset-env": "^7.29.0",
74
76
  "@biomejs/biome": "2.3.15",
75
77
  "@semantic-release/changelog": "^6.0.3",
78
+ "@semantic-release/exec": "^7.1.0",
76
79
  "@semantic-release/git": "^10.0.1",
77
80
  "@types/jest": "^30.0.0",
78
81
  "@types/node": "^25.2.3",