Browse Source

docs: update changelog, CLAUDE.md, and sync package-lock for v1.2.0

- Add v1.2.0, v1.1.1, and v1.1.0 entries to CHANGELOG.md
- Add send-serial-email and attachment docs to CLAUDE.md
- Sync package-lock.json version to 1.2.0
Robert Sweet 3 months ago
parent
commit
fa562e7538
3 changed files with 70 additions and 11 deletions
  1. 40 0
      CHANGELOG.md
  2. 28 0
      CLAUDE.md
  3. 2 11
      package-lock.json

+ 40 - 0
CHANGELOG.md

@@ -5,6 +5,46 @@ All notable changes to this project will be documented in this file.
 The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
 and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 
+## [1.2.0] - 2026-03-14
+
+### Added
+- **send-serial-email** - Mail merge tool: send personalized emails to multiple recipients with `{{placeholder}}` token support (max 100 recipients per batch) (PR #3 by @michaelhenze)
+- **File attachments** - `send-email` and `create-draft` now accept an optional `attachments` parameter (array of absolute file paths) (PR #2 by @michaelhenze)
+
+### Fixed
+- **Locale-independent date parsing** - Dates now display correctly on non-English macOS systems (e.g., German). Previously, locale-dependent date strings could cause all emails to show the current date instead of actual received date (PR #4 by @michaelhenze)
+- **Send/draft timeout resilience** - Increased timeout from 30s to 60s and enabled automatic retry with exponential backoff for `send-email` and `create-draft`, preventing failures when Mail.app is slow to establish SMTP connections
+
+### Improved
+- Attachment paths are validated (must be absolute, must exist) before sending — provides clear error messages instead of cryptic AppleScript failures
+- `send-serial-email` uses `spawnSync("sleep")` instead of CPU-burning busy-wait between sends
+- `send-serial-email` enforces safety limits: max 100 recipients, max 10s delay between sends
+
+## [1.1.1] - 2026-03-10
+
+### Fixed
+- TTL cache for account and mailbox name resolution to reduce redundant AppleScript calls
+
+## [1.1.0] - 2026-03-09
+
+### Added
+- **Batch operations** - `batch-mark-as-unread`, `batch-flag-messages`, `batch-unflag-messages`
+- **Mailbox management** - `create-mailbox`, `delete-mailbox`, `rename-mailbox`
+- **Mail rules** - `list-rules`, `enable-rule`, `disable-rule`
+- **Contacts** - `search-contacts` (Contacts.app integration)
+- **Email templates** - `save-template`, `list-template`, `get-template`, `delete-template`, `use-template`
+- **save-attachment** - Download attachments to disk
+- **HTML content** - `preferHtml` option in `get-message`
+- Date received in search/list output
+- Sender filter and pagination (`from`, `offset`) for `list-messages`
+- Date range filtering (`dateFrom`, `dateTo`) for `search-messages`
+- Cross-account search when no account specified
+- Exposed `unflag-message` tool (was implemented but not wired up)
+
+### Fixed
+- Use Mail.app's configured default send account instead of hardcoded fallback (PR #1 by @Leewonchan14)
+- Add message ID to search and list results (PR #1 by @Leewonchan14)
+
 ## [1.0.0] - 2026-01-06
 
 First stable release with full Apple Mail integration.

+ 28 - 0
CLAUDE.md

@@ -84,8 +84,17 @@ The `to`, `cc`, and `bcc` parameters must always be arrays:
 
 - Use `send-email` for immediate sending
 - Use `create-draft` when the user should review first
+- Both support optional `attachments` parameter (array of absolute file paths)
 - **Recommendation**: For important emails, use `create-draft` and tell the user to review in Mail.app
 
+### send-serial-email (mail merge)
+
+- Sends individual personalized emails to a list of recipients
+- Use `{{placeholder}}` tokens in subject and body, replaced per-recipient
+- Each recipient gets their own email — recipients don't see each other
+- Max 100 recipients per batch, delay between sends (default 500ms, max 10s)
+- Example variables: `{ "Name": "Alice", "Company": "Acme" }`
+
 ### reply-to-message
 
 - Set `replyAll: true` to reply to all recipients
@@ -222,6 +231,25 @@ The `to`, `cc`, and `bcc` parameters must always be arrays:
    Note: templates are stored in memory and reset when the server restarts
 ```
 
+### Send email with attachments
+
+```text
+1. send-email to=["colleague@company.com"] subject="Report" body="See attached." attachments=["/Users/me/report.pdf"]
+   OR to let the user review first:
+2. create-draft to=["colleague@company.com"] subject="Report" body="See attached." attachments=["/Users/me/report.pdf"]
+   Note: attachment paths must be absolute and the files must exist
+```
+
+### Send personalized emails (mail merge)
+
+```text
+1. send-serial-email recipients=[
+     {"email": "alice@acme.com", "variables": {"Name": "Alice", "Company": "Acme"}},
+     {"email": "bob@globex.com", "variables": {"Name": "Bob", "Company": "Globex"}}
+   ] subject="Hello {{Name}}" body="Great to connect about {{Company}}."
+   Each recipient gets their own individual email with placeholders replaced.
+```
+
 ### Check mail sync status
 
 ```text

+ 2 - 11
package-lock.json

@@ -1,12 +1,12 @@
 {
   "name": "apple-mail-mcp",
-  "version": "1.1.0",
+  "version": "1.2.0",
   "lockfileVersion": 3,
   "requires": true,
   "packages": {
     "": {
       "name": "apple-mail-mcp",
-      "version": "1.1.0",
+      "version": "1.2.0",
       "license": "MIT",
       "os": [
         "darwin"
@@ -1270,7 +1270,6 @@
       "integrity": "sha512-N2clP5pJhB2YnZJ3PIHFk5RkygRX5WO/5f0WC08tp0wd+sv0rsJk3MqWn3CbNmT2J505a5336jaQj4ph1AdMug==",
       "dev": true,
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "undici-types": "~6.21.0"
       }
@@ -1310,7 +1309,6 @@
       "integrity": "sha512-iIACsx8pxRnguSYhHiMn2PvhvfpopO9FXHyn1mG5txZIsAaB6F0KwbFnUQN3KCiG3Jcuad/Cao2FAs1Wp7vAyg==",
       "dev": true,
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "@typescript-eslint/scope-manager": "8.52.0",
         "@typescript-eslint/types": "8.52.0",
@@ -1661,7 +1659,6 @@
       "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
       "dev": true,
       "license": "MIT",
-      "peer": true,
       "bin": {
         "acorn": "bin/acorn"
       },
@@ -2199,7 +2196,6 @@
       "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==",
       "dev": true,
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "@eslint-community/eslint-utils": "^4.8.0",
         "@eslint-community/regexpp": "^4.12.1",
@@ -3524,7 +3520,6 @@
       "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
       "dev": true,
       "license": "MIT",
-      "peer": true,
       "engines": {
         "node": ">=12"
       },
@@ -4276,7 +4271,6 @@
       "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
       "dev": true,
       "license": "Apache-2.0",
-      "peer": true,
       "bin": {
         "tsc": "bin/tsc",
         "tsserver": "bin/tsserver"
@@ -4341,7 +4335,6 @@
       "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==",
       "dev": true,
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "esbuild": "^0.21.3",
         "postcss": "^8.4.43",
@@ -4425,7 +4418,6 @@
       "integrity": "sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==",
       "dev": true,
       "license": "MIT",
-      "peer": true,
       "dependencies": {
         "@vitest/expect": "2.1.9",
         "@vitest/mocker": "2.1.9",
@@ -4686,7 +4678,6 @@
       "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
       "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
       "license": "MIT",
-      "peer": true,
       "funding": {
         "url": "https://github.com/sponsors/colinhacks"
       }