apple-notes-mcp 1.2.1 → 1.2.17
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 +176 -18
- package/build/index.js +341 -25
- package/build/services/appleNotesManager.js +814 -58
- package/build/services/appleNotesManager.test.js +542 -1
- package/build/utils/applescript.js +282 -46
- package/build/utils/applescript.test.js +189 -4
- package/build/utils/jxa.js +122 -0
- package/build/utils/jxa.test.js +115 -0
- package/build/utils/syncDetection.js +239 -0
- package/build/utils/syncDetection.test.js +228 -0
- package/package.json +19 -4
package/README.md
CHANGED
|
@@ -85,6 +85,12 @@ On first use, macOS will ask for permission to automate Notes.app. Click "OK" to
|
|
|
85
85
|
| **Move Notes** | Organize notes into folders |
|
|
86
86
|
| **Folder Management** | Create, list, and delete folders |
|
|
87
87
|
| **Multi-Account** | Work with iCloud, Gmail, Exchange, or any configured account |
|
|
88
|
+
| **Batch Operations** | Delete or move multiple notes at once |
|
|
89
|
+
| **Export** | Export all notes as JSON or get individual notes as Markdown |
|
|
90
|
+
| **Attachments** | List attachments in notes |
|
|
91
|
+
| **Sync Awareness** | Detect iCloud sync in progress, warn about incomplete results |
|
|
92
|
+
| **Collaboration** | Detect shared notes, warn before modifying |
|
|
93
|
+
| **Diagnostics** | Health check, sync status, and statistics tools |
|
|
88
94
|
|
|
89
95
|
---
|
|
90
96
|
|
|
@@ -113,7 +119,7 @@ Creates a new note in Apple Notes.
|
|
|
113
119
|
}
|
|
114
120
|
```
|
|
115
121
|
|
|
116
|
-
**Returns:** Confirmation message with note title
|
|
122
|
+
**Returns:** Confirmation message with note title and ID. Save the ID for subsequent operations like `update-note`, `delete-note`, etc.
|
|
117
123
|
|
|
118
124
|
---
|
|
119
125
|
|
|
@@ -142,7 +148,7 @@ Searches for notes by title or content.
|
|
|
142
148
|
}
|
|
143
149
|
```
|
|
144
150
|
|
|
145
|
-
**Returns:** List of matching
|
|
151
|
+
**Returns:** List of matching notes with titles, folder names, and IDs. Use the returned ID for subsequent operations like `get-note-content`, `update-note`, etc.
|
|
146
152
|
|
|
147
153
|
---
|
|
148
154
|
|
|
@@ -152,10 +158,20 @@ Retrieves the full content of a specific note.
|
|
|
152
158
|
|
|
153
159
|
| Parameter | Type | Required | Description |
|
|
154
160
|
|-----------|------|----------|-------------|
|
|
155
|
-
| `
|
|
156
|
-
| `
|
|
161
|
+
| `id` | string | No | Note ID (preferred - more reliable than title) |
|
|
162
|
+
| `title` | string | No | Note title (use `id` instead when available) |
|
|
163
|
+
| `account` | string | No | Account containing the note (defaults to iCloud, ignored if `id` is provided) |
|
|
157
164
|
|
|
158
|
-
**
|
|
165
|
+
**Note:** Either `id` or `title` must be provided. Using `id` is recommended as it's unique and avoids issues with duplicate titles.
|
|
166
|
+
|
|
167
|
+
**Example - Using ID (recommended):**
|
|
168
|
+
```json
|
|
169
|
+
{
|
|
170
|
+
"id": "x-coredata://ABC123/ICNote/p456"
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
**Example - Using title:**
|
|
159
175
|
```json
|
|
160
176
|
{
|
|
161
177
|
"title": "Shopping List"
|
|
@@ -215,10 +231,21 @@ Updates an existing note's content and/or title.
|
|
|
215
231
|
|
|
216
232
|
| Parameter | Type | Required | Description |
|
|
217
233
|
|-----------|------|----------|-------------|
|
|
218
|
-
| `
|
|
234
|
+
| `id` | string | No | Note ID (preferred - more reliable than title) |
|
|
235
|
+
| `title` | string | No | Current title of the note to update (use `id` instead when available) |
|
|
219
236
|
| `newTitle` | string | No | New title (if changing the title) |
|
|
220
237
|
| `newContent` | string | Yes | New content for the note body |
|
|
221
|
-
| `account` | string | No | Account containing the note (defaults to iCloud) |
|
|
238
|
+
| `account` | string | No | Account containing the note (defaults to iCloud, ignored if `id` is provided) |
|
|
239
|
+
|
|
240
|
+
**Note:** Either `id` or `title` must be provided. Using `id` is recommended.
|
|
241
|
+
|
|
242
|
+
**Example - Using ID (recommended):**
|
|
243
|
+
```json
|
|
244
|
+
{
|
|
245
|
+
"id": "x-coredata://ABC123/ICNote/p456",
|
|
246
|
+
"newContent": "Updated content here"
|
|
247
|
+
}
|
|
248
|
+
```
|
|
222
249
|
|
|
223
250
|
**Example - Update content only:**
|
|
224
251
|
```json
|
|
@@ -247,10 +274,20 @@ Deletes a note (moves to Recently Deleted in Notes.app).
|
|
|
247
274
|
|
|
248
275
|
| Parameter | Type | Required | Description |
|
|
249
276
|
|-----------|------|----------|-------------|
|
|
250
|
-
| `
|
|
251
|
-
| `
|
|
277
|
+
| `id` | string | No | Note ID (preferred - more reliable than title) |
|
|
278
|
+
| `title` | string | No | Exact title of the note to delete (use `id` instead when available) |
|
|
279
|
+
| `account` | string | No | Account containing the note (defaults to iCloud, ignored if `id` is provided) |
|
|
252
280
|
|
|
253
|
-
**
|
|
281
|
+
**Note:** Either `id` or `title` must be provided. Using `id` is recommended.
|
|
282
|
+
|
|
283
|
+
**Example - Using ID (recommended):**
|
|
284
|
+
```json
|
|
285
|
+
{
|
|
286
|
+
"id": "x-coredata://ABC123/ICNote/p456"
|
|
287
|
+
}
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
**Example - Using title:**
|
|
254
291
|
```json
|
|
255
292
|
{
|
|
256
293
|
"title": "Old Draft"
|
|
@@ -267,11 +304,22 @@ Moves a note to a different folder.
|
|
|
267
304
|
|
|
268
305
|
| Parameter | Type | Required | Description |
|
|
269
306
|
|-----------|------|----------|-------------|
|
|
270
|
-
| `
|
|
307
|
+
| `id` | string | No | Note ID (preferred - more reliable than title) |
|
|
308
|
+
| `title` | string | No | Title of the note to move (use `id` instead when available) |
|
|
271
309
|
| `folder` | string | Yes | Name of the destination folder |
|
|
272
|
-
| `account` | string | No | Account containing the note (defaults to iCloud) |
|
|
310
|
+
| `account` | string | No | Account containing the note (defaults to iCloud, ignored if `id` is provided) |
|
|
273
311
|
|
|
274
|
-
**
|
|
312
|
+
**Note:** Either `id` or `title` must be provided. Using `id` is recommended.
|
|
313
|
+
|
|
314
|
+
**Example - Using ID (recommended):**
|
|
315
|
+
```json
|
|
316
|
+
{
|
|
317
|
+
"id": "x-coredata://ABC123/ICNote/p456",
|
|
318
|
+
"folder": "Archive"
|
|
319
|
+
}
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
**Example - Using title:**
|
|
275
323
|
```json
|
|
276
324
|
{
|
|
277
325
|
"title": "Completed Task",
|
|
@@ -386,6 +434,116 @@ Lists all configured Notes accounts.
|
|
|
386
434
|
|
|
387
435
|
---
|
|
388
436
|
|
|
437
|
+
### Batch Operations
|
|
438
|
+
|
|
439
|
+
#### `batch-delete-notes`
|
|
440
|
+
|
|
441
|
+
Deletes multiple notes at once by ID.
|
|
442
|
+
|
|
443
|
+
| Parameter | Type | Required | Description |
|
|
444
|
+
|-----------|------|----------|-------------|
|
|
445
|
+
| `ids` | string[] | Yes | Array of note IDs to delete |
|
|
446
|
+
|
|
447
|
+
**Returns:** Summary of successes and failures.
|
|
448
|
+
|
|
449
|
+
---
|
|
450
|
+
|
|
451
|
+
#### `batch-move-notes`
|
|
452
|
+
|
|
453
|
+
Moves multiple notes to a folder.
|
|
454
|
+
|
|
455
|
+
| Parameter | Type | Required | Description |
|
|
456
|
+
|-----------|------|----------|-------------|
|
|
457
|
+
| `ids` | string[] | Yes | Array of note IDs to move |
|
|
458
|
+
| `folder` | string | Yes | Destination folder name |
|
|
459
|
+
| `account` | string | No | Account containing the folder |
|
|
460
|
+
|
|
461
|
+
**Returns:** Summary of successes and failures.
|
|
462
|
+
|
|
463
|
+
---
|
|
464
|
+
|
|
465
|
+
### Export Operations
|
|
466
|
+
|
|
467
|
+
#### `export-notes-json`
|
|
468
|
+
|
|
469
|
+
Exports all notes as a JSON structure.
|
|
470
|
+
|
|
471
|
+
**Parameters:** None
|
|
472
|
+
|
|
473
|
+
**Returns:** Complete JSON export with all accounts, folders, and notes including metadata.
|
|
474
|
+
|
|
475
|
+
---
|
|
476
|
+
|
|
477
|
+
#### `get-note-markdown`
|
|
478
|
+
|
|
479
|
+
Gets a note's content as Markdown instead of HTML.
|
|
480
|
+
|
|
481
|
+
| Parameter | Type | Required | Description |
|
|
482
|
+
|-----------|------|----------|-------------|
|
|
483
|
+
| `id` | string | No | Note ID (preferred) |
|
|
484
|
+
| `title` | string | No | Note title |
|
|
485
|
+
| `account` | string | No | Account containing the note |
|
|
486
|
+
|
|
487
|
+
**Returns:** Note content converted to Markdown format.
|
|
488
|
+
|
|
489
|
+
---
|
|
490
|
+
|
|
491
|
+
#### `list-attachments`
|
|
492
|
+
|
|
493
|
+
Lists attachments in a note.
|
|
494
|
+
|
|
495
|
+
| Parameter | Type | Required | Description |
|
|
496
|
+
|-----------|------|----------|-------------|
|
|
497
|
+
| `id` | string | No | Note ID (preferred) |
|
|
498
|
+
| `title` | string | No | Note title |
|
|
499
|
+
| `account` | string | No | Account containing the note |
|
|
500
|
+
|
|
501
|
+
**Returns:** List of attachments with names and content types.
|
|
502
|
+
|
|
503
|
+
---
|
|
504
|
+
|
|
505
|
+
### Diagnostics
|
|
506
|
+
|
|
507
|
+
#### `health-check`
|
|
508
|
+
|
|
509
|
+
Verifies Notes.app connectivity and permissions.
|
|
510
|
+
|
|
511
|
+
**Parameters:** None
|
|
512
|
+
|
|
513
|
+
**Returns:** Status of all health checks (app installed, permissions, account access).
|
|
514
|
+
|
|
515
|
+
---
|
|
516
|
+
|
|
517
|
+
#### `get-notes-stats`
|
|
518
|
+
|
|
519
|
+
Gets comprehensive statistics about your notes.
|
|
520
|
+
|
|
521
|
+
**Parameters:** None
|
|
522
|
+
|
|
523
|
+
**Returns:** Total counts, per-account breakdown, folder statistics, and recently modified counts.
|
|
524
|
+
|
|
525
|
+
---
|
|
526
|
+
|
|
527
|
+
#### `get-sync-status`
|
|
528
|
+
|
|
529
|
+
Checks iCloud sync status.
|
|
530
|
+
|
|
531
|
+
**Parameters:** None
|
|
532
|
+
|
|
533
|
+
**Returns:** Whether sync is active, pending uploads, and last activity time.
|
|
534
|
+
|
|
535
|
+
---
|
|
536
|
+
|
|
537
|
+
#### `list-shared-notes`
|
|
538
|
+
|
|
539
|
+
Lists all notes shared with collaborators.
|
|
540
|
+
|
|
541
|
+
**Parameters:** None
|
|
542
|
+
|
|
543
|
+
**Returns:** List of shared notes with warnings about collaboration.
|
|
544
|
+
|
|
545
|
+
---
|
|
546
|
+
|
|
389
547
|
## Usage Patterns
|
|
390
548
|
|
|
391
549
|
### Basic Workflow
|
|
@@ -443,8 +601,8 @@ npm install -g apple-notes-mcp
|
|
|
443
601
|
### From Source
|
|
444
602
|
|
|
445
603
|
```bash
|
|
446
|
-
git clone https://github.com/sweetrb/
|
|
447
|
-
cd
|
|
604
|
+
git clone https://github.com/sweetrb/apple-notes-mcp.git
|
|
605
|
+
cd apple-notes-mcp
|
|
448
606
|
npm install
|
|
449
607
|
npm run build
|
|
450
608
|
```
|
|
@@ -455,7 +613,7 @@ If installed from source, use this configuration:
|
|
|
455
613
|
"mcpServers": {
|
|
456
614
|
"apple-notes": {
|
|
457
615
|
"command": "node",
|
|
458
|
-
"args": ["/path/to/
|
|
616
|
+
"args": ["/path/to/apple-notes-mcp/build/index.js"]
|
|
459
617
|
}
|
|
460
618
|
}
|
|
461
619
|
}
|
|
@@ -477,7 +635,7 @@ If installed from source, use this configuration:
|
|
|
477
635
|
| Limitation | Reason |
|
|
478
636
|
|------------|--------|
|
|
479
637
|
| macOS only | Apple Notes and AppleScript are macOS-specific |
|
|
480
|
-
| No
|
|
638
|
+
| No attachment content | Attachments can be listed but not downloaded via AppleScript |
|
|
481
639
|
| No pinned notes | Pin status is not exposed via AppleScript |
|
|
482
640
|
| No rich formatting | Content is HTML; complex formatting may not render |
|
|
483
641
|
| Title matching | Most operations require exact title matches |
|
|
@@ -536,7 +694,7 @@ The `\\\\` in JSON becomes `\\` in the actual string, which represents a single
|
|
|
536
694
|
```bash
|
|
537
695
|
npm install # Install dependencies
|
|
538
696
|
npm run build # Compile TypeScript
|
|
539
|
-
npm test # Run test suite (
|
|
697
|
+
npm test # Run test suite (217 tests)
|
|
540
698
|
npm run lint # Check code style
|
|
541
699
|
npm run format # Format code
|
|
542
700
|
```
|