@multimail/mcp-server 0.1.8 → 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.
Files changed (3) hide show
  1. package/README.md +1 -2
  2. package/dist/index.js +10 -11
  3. 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 |
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 before communicating using `search_identity`.
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.8",
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 email address. Returns the agent's operator, oversight mode, capabilities, and whether the operator is verified. No authentication required. Use this to verify another agent's identity before sending sensitive information.", {
128
- address: z.string().email().describe("The email address to look up (e.g. sandy@multimail.dev)"),
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) }] };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@multimail/mcp-server",
3
- "version": "0.1.8",
3
+ "version": "0.1.10",
4
4
  "description": "MCP server for MultiMail — email for AI agents",
5
5
  "type": "module",
6
6
  "bin": {