@marlinjai/email-mcp 1.9.0 → 1.10.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.
package/README.md CHANGED
@@ -134,20 +134,42 @@ npx -y -p @marlinjai/email-mcp@latest email-mcp-setup
134
134
  |------|-------------|
135
135
  | `email_list_folders` | List all folders/labels for an account |
136
136
  | `email_search` | Search emails with filters. Returns compact results by default (`returnBody=false`). Set `returnBody=true` to include full email bodies |
137
- | `email_get` | Get full email content by ID (headers, body, attachment metadata) |
138
- | `email_get_thread` | Get an entire email thread/conversation |
139
- | `email_get_attachment` | Download a specific attachment by ID (returns base64 data) |
140
- | `email_save_attachment` | Download an attachment directly to disk, returning metadata only — avoids the token cost of round-tripping large files as base64. `outputPath` is relative to a fixed downloads directory (`~/.email-mcp/downloads`, override with `EMAIL_MCP_DOWNLOADS_DIR`) and cannot escape it |
137
+ | `email_get` | Get full email content by ID (headers, body, attachment metadata). `sourceFolder` names the folder on iCloud/IMAP when the message is not in INBOX |
138
+ | `email_get_thread` | Get an entire email thread/conversation. On iCloud/IMAP a thread is searched in one folder: INBOX, or the one named in `sourceFolder` |
139
+ | `email_get_attachment` | Download a specific attachment by ID (returns base64 data). `sourceFolder` names the folder on iCloud/IMAP when the message is not in INBOX |
140
+ | `email_save_attachment` | Download an attachment directly to disk, returning metadata only, which avoids the token cost of round-tripping large files as base64. `outputPath` is relative to a fixed downloads directory (`~/.email-mcp/downloads`, override with `EMAIL_MCP_DOWNLOADS_DIR`) and cannot escape it. `sourceFolder` as on `email_get_attachment` |
141
141
 
142
142
  ### Sending & Drafts (6)
143
143
 
144
+ `email_send`, `email_reply`, `email_forward`, `email_draft_create` and `email_draft_update` take an optional `attachments` list. Each entry is either `{ path }` (a file in the attachments folder, see below) or `{ content, filename }` (base64), with an optional `contentType` (inferred from the extension otherwise). The total is capped at 25 MB; Outlook accepts up to 3 MB per message through this server. On `email_draft_update` a list replaces the draft's files, an empty list removes them, and no list keeps the files the draft has.
145
+
146
+ Replies stay in their thread: `email_reply` sends inside the original conversation on Gmail and Outlook (and sets the `In-Reply-To` and `References` headers everywhere), `email_draft_create` with `inReplyToEmailId` saves a reply draft in that thread, and `email_draft_update` keeps a reply draft there.
147
+
148
+ **Forwarding the original message's attachments is opt-in.** `email_forward` sends the text of the original; its files go along only with `includeOriginalAttachments: true`, so one call does not pass files the assistant never looked at on to another address. Forwarded files count against the 25 MB cap together with added ones.
149
+
150
+ **Attaching files by path is off until you name a folder.** The path comes from the assistant, and an assistant that reads mail can be asked by a mail to attach something it should not (a private key, for example). So files are only read from the one folder you set in `EMAIL_MCP_ATTACHMENTS_DIR`, in the environment of the server; no tool can change it. Put the file there and ask for it by name:
151
+
152
+ ```json
153
+ {
154
+ "mcpServers": {
155
+ "email": {
156
+ "command": "npx",
157
+ "args": ["@marlinjai/email-mcp"],
158
+ "env": { "EMAIL_MCP_ATTACHMENTS_DIR": "~/Documents/email-outbox" }
159
+ }
160
+ }
161
+ }
162
+ ```
163
+
164
+ A path outside that folder is refused, as is a symbolic link that leads out of it, and email-mcp's own data files are never attachable.
165
+
144
166
  | Tool | Description |
145
167
  |------|-------------|
146
- | `email_send` | Compose and send a new email (to, cc, bcc, subject, body) |
147
- | `email_reply` | Reply to an email (supports reply-all, preserves threading) |
148
- | `email_forward` | Forward an email to new recipients |
149
- | `email_draft_create` | Save a draft without sending |
150
- | `email_draft_update` | Update an existing draft in place. On Gmail/Outlook the draft id is unchanged; on iCloud/generic IMAP there's no in-place update (IMAP messages are immutable), so the old draft is deleted and a new one appended — the returned id is a **new** id, always use it going forward |
168
+ | `email_send` | Compose and send a new email (to, cc, bcc, subject, body, attachments) |
169
+ | `email_reply` | Reply to an email in its thread. `replyAll` addresses the sender and all To/Cc recipients except your own address, each once. Optional `to`/`cc`/`bcc` overrides and `additionalRecipients`, e.g. when replying to your own sent message. Attachments supported. `sourceFolder` names the folder on iCloud/IMAP when the message is not in INBOX |
170
+ | `email_forward` | Forward an email to new recipients (`to`, `cc`, `bcc`, optional text on top, attachments). The original's attachments are left out unless `includeOriginalAttachments: true`. `sourceFolder` names the folder on iCloud/IMAP when the message is not in INBOX |
171
+ | `email_draft_create` | Save a draft without sending (attachments supported). `inReplyToEmailId` saves it as a reply inside that message's thread (`inReplyToSourceFolder` names that message's folder on iCloud/IMAP when it is not in INBOX) |
172
+ | `email_draft_update` | Update an existing draft in place. A reply draft stays in its thread. On Gmail/Outlook the draft id is unchanged; on iCloud/generic IMAP there's no in-place update (IMAP messages are immutable), so the old draft is deleted and a new one appended: the returned id is a **new** id, always use it going forward |
151
173
  | `email_draft_list` | List all drafts |
152
174
 
153
175
  ### Organization (8)