@multimail/mcp-server 0.1.9 → 0.1.10
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 +1 -2
- package/dist/index.js +10 -11
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -61,7 +61,6 @@ Any MCP-compatible client uses the same config. Add MultiMail to your client's M
|
|
|
61
61
|
| `check_inbox` | List emails (filterable by unread/read/archived) |
|
|
62
62
|
| `read_email` | Get the full content of a specific email |
|
|
63
63
|
| `reply_email` | Reply to an email in its existing thread |
|
|
64
|
-
| `search_identity` | Look up the public identity of any MultiMail address (operator, oversight, verification status) |
|
|
65
64
|
| `resend_confirmation` | Resend the activation email with a new code |
|
|
66
65
|
| `activate_account` | Activate an account using the code from the confirmation email |
|
|
67
66
|
|
|
@@ -71,7 +70,7 @@ Any MCP-compatible client uses the same config. Add MultiMail to your client's M
|
|
|
71
70
|
- Incoming email arrives as **clean markdown**. No HTML parsing or MIME decoding.
|
|
72
71
|
- Threading is automatic. Reply to an email and headers are set correctly.
|
|
73
72
|
- If your mailbox uses gated oversight, sends return `pending_approval` status. Do not retry.
|
|
74
|
-
- Verify other agents
|
|
73
|
+
- Verify other agents by checking the `X-MultiMail-Identity` signed header on received emails.
|
|
75
74
|
|
|
76
75
|
## Development
|
|
77
76
|
|
package/dist/index.js
CHANGED
|
@@ -68,7 +68,7 @@ function getMailboxId(argsMailboxId) {
|
|
|
68
68
|
// --- Server ---
|
|
69
69
|
const server = new McpServer({
|
|
70
70
|
name: "multimail",
|
|
71
|
-
version: "0.1.
|
|
71
|
+
version: "0.1.10",
|
|
72
72
|
});
|
|
73
73
|
// Tool 1: list_mailboxes
|
|
74
74
|
server.tool("list_mailboxes", "List all mailboxes available to this API key. Returns each mailbox's ID, email address, oversight mode, and display name. Use this to discover your mailbox ID if MULTIMAIL_MAILBOX_ID is not set.", {}, async () => {
|
|
@@ -81,12 +81,15 @@ server.tool("send_email", "Send an email from your MultiMail address. The body i
|
|
|
81
81
|
subject: z.string().describe("Email subject line"),
|
|
82
82
|
markdown: z.string().describe("Email body in markdown format"),
|
|
83
83
|
cc: z.array(z.string().email()).optional().describe("CC email addresses"),
|
|
84
|
+
bcc: z.array(z.string().email()).optional().describe("BCC email addresses"),
|
|
84
85
|
mailbox_id: z.string().optional().describe("Mailbox ID (uses MULTIMAIL_MAILBOX_ID env var if not provided)"),
|
|
85
|
-
}, async ({ to, subject, markdown, cc, mailbox_id }) => {
|
|
86
|
+
}, async ({ to, subject, markdown, cc, bcc, mailbox_id }) => {
|
|
86
87
|
const id = getMailboxId(mailbox_id);
|
|
87
88
|
const body = { to, subject, markdown };
|
|
88
89
|
if (cc?.length)
|
|
89
90
|
body.cc = cc;
|
|
91
|
+
if (bcc?.length)
|
|
92
|
+
body.bcc = bcc;
|
|
90
93
|
const data = await apiCall("POST", `/v1/mailboxes/${encodeURIComponent(id)}/send`, body);
|
|
91
94
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
92
95
|
});
|
|
@@ -114,23 +117,19 @@ server.tool("reply_email", "Reply to an email in its existing thread. Threading
|
|
|
114
117
|
email_id: z.string().describe("The email ID to reply to"),
|
|
115
118
|
markdown: z.string().describe("Reply body in markdown format"),
|
|
116
119
|
cc: z.array(z.string().email()).optional().describe("CC email addresses"),
|
|
120
|
+
bcc: z.array(z.string().email()).optional().describe("BCC email addresses"),
|
|
117
121
|
mailbox_id: z.string().optional().describe("Mailbox ID (uses MULTIMAIL_MAILBOX_ID env var if not provided)"),
|
|
118
|
-
}, async ({ email_id, markdown, cc, mailbox_id }) => {
|
|
122
|
+
}, async ({ email_id, markdown, cc, bcc, mailbox_id }) => {
|
|
119
123
|
const id = getMailboxId(mailbox_id);
|
|
120
124
|
const body = { markdown };
|
|
121
125
|
if (cc?.length)
|
|
122
126
|
body.cc = cc;
|
|
127
|
+
if (bcc?.length)
|
|
128
|
+
body.bcc = bcc;
|
|
123
129
|
const data = await apiCall("POST", `/v1/mailboxes/${encodeURIComponent(id)}/reply/${encodeURIComponent(email_id)}`, body);
|
|
124
130
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
125
131
|
});
|
|
126
|
-
// Tool 6: search_identity
|
|
127
|
-
server.tool("search_identity", "Look up the public identity document for any MultiMail address. Returns the operator, oversight mode, capabilities, and whether the operator is verified. No authentication required. Use this to verify another agent before sending sensitive information. Reputation data is delivered via the X-MultiMail-Reputation email header, not this endpoint.", {
|
|
128
|
-
address: z.string().email().describe("The MultiMail address to look up"),
|
|
129
|
-
}, async ({ address }) => {
|
|
130
|
-
const data = await publicFetch(`/.well-known/agent/${encodeURIComponent(address)}`);
|
|
131
|
-
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
132
|
-
});
|
|
133
|
-
// Tool 7: resend_confirmation
|
|
132
|
+
// Tool 6: resend_confirmation (search_identity removed — identity now delivered via signed X-MultiMail-Identity email header)
|
|
134
133
|
server.tool("resend_confirmation", "Resend the activation email with a new code. Use this if the account is stuck in 'pending_operator_confirmation' status because the original email was lost or filtered. The operator must enter the code at the activation page or via the activate_account tool to activate the account. Rate limited to 1 request per 5 minutes. Only works for unconfirmed accounts.", {}, async () => {
|
|
135
134
|
const data = await apiCall("POST", "/v1/account/resend-confirmation");
|
|
136
135
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|