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.
- package/README.md +48 -2
- package/package.json +4 -1
package/README.md
CHANGED
|
@@ -1,17 +1,40 @@
|
|
|
1
|
-
# macos-mcp 
|
|
1
|
+
# macos-mcp  
|
|
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
|
|
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.
|
|
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",
|