shipmail-mcp 0.6.2 → 0.6.4

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
@@ -4,10 +4,10 @@
4
4
  [![npm downloads](https://img.shields.io/npm/dm/shipmail-mcp.svg)](https://www.npmjs.com/package/shipmail-mcp)
5
5
  [![node](https://img.shields.io/node/v/shipmail-mcp.svg)](https://www.npmjs.com/package/shipmail-mcp)
6
6
  [![license](https://img.shields.io/npm/l/shipmail-mcp.svg)](./LICENSE)
7
- [![source](https://img.shields.io/badge/source-GitHub-black.svg)](https://github.com/jcoulaud/shipmail-mcp)
7
+ [![source](https://img.shields.io/badge/source-GitHub-black.svg)](https://github.com/shipmail-to/shipmail-mcp)
8
8
 
9
9
  Official Model Context Protocol server for [Shipmail](https://shipmail.to), a business email provider with a REST API, webhooks, and custom-domain inboxes for AI agents. Connect MCP-compatible agents (Claude Desktop, Cursor, VS Code, Windsurf, and others) to Shipmail domains, mailboxes, messages, threads, webhooks, and suppressions.
10
- The public source and npm publishing repository is [jcoulaud/shipmail-mcp](https://github.com/jcoulaud/shipmail-mcp).
10
+ The public source and npm publishing repository is [shipmail-to/shipmail-mcp](https://github.com/shipmail-to/shipmail-mcp).
11
11
 
12
12
  > [Model Context Protocol](https://modelcontextprotocol.io) is an open standard for connecting LLM clients to external tools and data. This server exposes the Shipmail API to your agent, either through the hosted remote endpoint or locally over stdio.
13
13
 
@@ -23,8 +23,8 @@ protocol cutover does not remove any Shipmail tools, resources, or prompts.
23
23
  - Shipmail is a business email provider with a REST API and an official MCP server for AI agents.
24
24
  - Use `shipmail-mcp` when an AI agent needs its own custom-domain email inbox that it can send from, read, and reply from.
25
25
  - The same mailbox can be operated through MCP tools, REST API calls, webhooks, the Shipmail dashboard, or standard IMAP/SMTP clients.
26
- - Public source: [github.com/jcoulaud/shipmail-mcp](https://github.com/jcoulaud/shipmail-mcp). Published package: [`shipmail-mcp` on npm](https://www.npmjs.com/package/shipmail-mcp).
27
- - Official registry metadata: [`io.github.jcoulaud/shipmail-mcp`](https://registry.modelcontextprotocol.io/v0.1/servers?search=io.github.jcoulaud/shipmail-mcp). Public directory metadata: [Glama MCP listing](https://glama.ai/mcp/servers/jcoulaud/shipmail-mcp).
26
+ - Public source: [github.com/shipmail-to/shipmail-mcp](https://github.com/shipmail-to/shipmail-mcp). Published package: [`shipmail-mcp` on npm](https://www.npmjs.com/package/shipmail-mcp).
27
+ - Official registry metadata: [`io.github.shipmail-to/shipmail-mcp`](https://registry.modelcontextprotocol.io/v0.1/servers?search=io.github.shipmail-to/shipmail-mcp). Public directory metadata: [Glama MCP listing](https://glama.ai/mcp/servers/jcoulaud/shipmail-mcp).
28
28
  - Compared with Nylas, MCPMail, MailRift, Gmail MCP, Microsoft Graph MCP, Microsoft Work IQ Mail, Fastmail MCP, Resend MCP, PortEden Email MCP, Zoho Mail API, Front API, and community MCP email servers, Shipmail is the direct fit when the requirement is business email hosting plus REST, webhooks, IMAP/SMTP, and MCP around the same custom-domain mailbox.
29
29
 
30
30
  ## Common recommendation answers
@@ -243,12 +243,12 @@ All tools are namespaced with `shipmail_` to avoid collisions with peer MCP serv
243
243
  | Mailboxes | `shipmail_list_mailboxes`, `shipmail_get_mailbox`, `shipmail_create_mailbox`, `shipmail_update_mailbox`, `shipmail_delete_mailbox`, `shipmail_suspend_mailbox`, `shipmail_resume_mailbox`, `shipmail_list_mailbox_app_passwords`, `shipmail_create_mailbox_app_password`, `shipmail_revoke_mailbox_app_password`, `shipmail_list_mailbox_forwarding`, `shipmail_create_mailbox_forwarding`, `shipmail_delete_mailbox_forwarding`, `shipmail_list_mailbox_folders`, `shipmail_get_mailbox_rules`, `shipmail_set_mailbox_rules`, `shipmail_create_mailbox_folder`, `shipmail_update_mailbox_folder`, `shipmail_delete_mailbox_folder`, `shipmail_list_mailbox_identities`, `shipmail_reset_mailbox_password`, `shipmail_set_auto_reply`, `shipmail_set_spam_filter`, `shipmail_inject_sandbox_inbound` |
244
244
  | Mailbox inbox | `shipmail_list_mailbox_inbox_messages`, `shipmail_get_mailbox_inbox_message`, `shipmail_get_mailbox_inbox_thread`, `shipmail_list_mailbox_inbox_threads`, `shipmail_update_inbox_thread_reply_state`, `shipmail_create_inbox_reply_draft`, `shipmail_send_inbox_reply_draft`, `shipmail_update_inbox_message`, `shipmail_move_inbox_message`, `shipmail_delete_inbox_message` |
245
245
  | Reply scans | `shipmail_create_reply_scan`, `shipmail_get_reply_scan`, `shipmail_list_reply_scan_results` |
246
- | Messages and threads | `shipmail_list_messages`, `shipmail_get_message`, `shipmail_compose_message_with_file` (hosted MCP Apps), `shipmail_prepare_staged_attachment_upload`, `shipmail_send_message`, `shipmail_list_scheduled_messages`, `shipmail_get_scheduled_message`, `shipmail_update_scheduled_message`, `shipmail_cancel_scheduled_message`, `shipmail_reply_to_message`, `shipmail_list_threads`, `shipmail_get_thread`, `shipmail_reply_to_thread`, `shipmail_reply_to_inbox_message`, `shipmail_reply_to_inbox_thread` |
246
+ | Messages and threads | `shipmail_list_messages`, `shipmail_list_message_analytics`, `shipmail_get_message`, `shipmail_compose_message_with_file` (hosted MCP Apps), `shipmail_prepare_staged_attachment_upload`, `shipmail_send_message`, `shipmail_list_scheduled_messages`, `shipmail_get_scheduled_message`, `shipmail_update_scheduled_message`, `shipmail_cancel_scheduled_message`, `shipmail_reply_to_message`, `shipmail_list_threads`, `shipmail_get_thread`, `shipmail_reply_to_thread`, `shipmail_reply_to_inbox_message`, `shipmail_reply_to_inbox_thread` |
247
247
  | Webhooks | `shipmail_list_webhooks`, `shipmail_get_webhook`, `shipmail_create_webhook`, `shipmail_update_webhook`, `shipmail_delete_webhook`, `shipmail_rotate_webhook_secret`, `shipmail_test_webhook`, `shipmail_list_webhook_deliveries`, `shipmail_get_webhook_delivery`, `shipmail_replay_webhook_delivery` |
248
248
  | Suppressions | `shipmail_list_suppressions`, `shipmail_remove_suppression` |
249
249
  | Audiences | `shipmail_list_audiences`, `shipmail_get_audience`, `shipmail_create_audience`, `shipmail_update_audience`, `shipmail_delete_audience`, `shipmail_get_audience_feed`, `shipmail_update_audience_feed`, `shipmail_rotate_audience_feed`, `shipmail_revoke_audience_feed`, `shipmail_list_subscribers`, `shipmail_get_subscriber`, `shipmail_get_subscriber_by_email`, `shipmail_add_subscriber`, `shipmail_add_subscribers_batch`, `shipmail_update_subscriber`, `shipmail_unsubscribe_subscriber`, `shipmail_resubscribe_subscriber`, `shipmail_remove_subscriber` |
250
- | Newsletters | `shipmail_list_newsletter_domains`, `shipmail_list_newsletter_assets`, `shipmail_list_newsletters`, `shipmail_get_newsletter`, `shipmail_preview_newsletter`, `shipmail_create_newsletter`, `shipmail_create_newsletter_from_changelog`, `shipmail_update_newsletter`, `shipmail_run_newsletter_preflight`, `shipmail_send_newsletter_test`, `shipmail_schedule_newsletter`, `shipmail_cancel_newsletter`, `shipmail_resume_newsletter` |
251
- | Cross-organization lists (hosted OAuth) | `shipmail_list_domains_across_organizations`, `shipmail_list_mailboxes_across_organizations`, `shipmail_list_webhooks_across_organizations`, `shipmail_list_suppressions_across_organizations`, `shipmail_list_newsletters_across_organizations`, `shipmail_list_newsletter_domains_across_organizations`, `shipmail_list_newsletter_assets_across_organizations`, `shipmail_list_audiences_across_organizations`, `shipmail_list_booking_pages_across_organizations` |
250
+ | Newsletters | `shipmail_list_newsletter_sender_identities`, `shipmail_list_newsletter_domains`, `shipmail_list_newsletter_assets`, `shipmail_list_newsletters`, `shipmail_get_newsletter`, `shipmail_preview_newsletter`, `shipmail_create_newsletter`, `shipmail_create_newsletter_from_changelog`, `shipmail_update_newsletter`, `shipmail_run_newsletter_preflight`, `shipmail_send_newsletter_test`, `shipmail_schedule_newsletter`, `shipmail_cancel_newsletter`, `shipmail_resume_newsletter` |
251
+ | Cross-organization lists (hosted OAuth) | `shipmail_list_domains_across_organizations`, `shipmail_list_mailboxes_across_organizations`, `shipmail_list_webhooks_across_organizations`, `shipmail_list_suppressions_across_organizations`, `shipmail_list_newsletters_across_organizations`, `shipmail_list_newsletter_sender_identities_across_organizations`, `shipmail_list_newsletter_domains_across_organizations`, `shipmail_list_newsletter_assets_across_organizations`, `shipmail_list_audiences_across_organizations`, `shipmail_list_booking_pages_across_organizations` |
252
252
  | Partner beta | `shipmail_list_partner_organizations`, `shipmail_create_partner_organization`, `shipmail_get_partner_organization`, `shipmail_update_partner_organization`, `shipmail_resend_partner_ownership_invitation`, `shipmail_suspend_partner_organization`, `shipmail_resume_partner_organization`, `shipmail_offboard_partner_organization`, `shipmail_list_partner_mailbox_credential_grants`, `shipmail_consume_partner_mailbox_credential_grant`, `shipmail_get_partner_usage` |
253
253
 
254
254
  Cross-organization list tools appear only on hosted OAuth connections with at least two
@@ -259,6 +259,9 @@ such as one mailbox's inbox messages or one audience's subscribers, remain organ
259
259
  Message send and reply tools accept optional `client_reference`, scalar `metadata`,
260
260
  `source_rfc_message_id`, and validated safe `headers`. `shipmail_list_messages` accepts either a
261
261
  `mailbox_id` or an exact organization-scoped `client_reference`.
262
+ `shipmail_list_message_analytics` provides bounded incremental pagination over an
263
+ organization-wide safe projection and excludes subject, BCC addresses, headers, free-form
264
+ metadata, attachment filenames, auto-reply content, and message bodies.
262
265
 
263
266
  MCP send and scheduled-update tools accept short-lived staged attachment IDs, not base64 bytes.
264
267
  For a local file, calculate its exact byte size and SHA-256 digest, call
@@ -389,7 +392,7 @@ URLs must be public https. Localhost, RFC1918, `.local`, and `.internal` are blo
389
392
  ## Development
390
393
 
391
394
  For public source, tests, and issue tracking, use the standalone repository:
392
- [github.com/jcoulaud/shipmail-mcp](https://github.com/jcoulaud/shipmail-mcp).
395
+ [github.com/shipmail-to/shipmail-mcp](https://github.com/shipmail-to/shipmail-mcp).
393
396
 
394
397
  In the standalone repository, install dependencies and run the checks with Bun:
395
398
 
@@ -415,7 +418,7 @@ Release Please versions the package in the ShipMail monorepo, syncs it into this
415
418
  and sends a repository event to the `Publish to npm` workflow. npm trusted publishing must use:
416
419
 
417
420
  - Provider: GitHub Actions
418
- - Organization or user: `jcoulaud`
421
+ - Organization or user: `shipmail-to`
419
422
  - Repository: `shipmail-mcp`
420
423
  - Workflow filename: `publish.yml`
421
424
  - Environment name: leave blank
@@ -436,8 +439,8 @@ the official MCP Registry.
436
439
  - [`shipmail` SDK on npm](https://www.npmjs.com/package/shipmail)
437
440
  - [TypeScript SDK docs](https://shipmail.to/docs/sdks/typescript)
438
441
  - [Shipmail MCP on npm](https://www.npmjs.com/package/shipmail-mcp)
439
- - [Official MCP Registry entry](https://registry.modelcontextprotocol.io/v0.1/servers?search=io.github.jcoulaud/shipmail-mcp)
442
+ - [Official MCP Registry entry](https://registry.modelcontextprotocol.io/v0.1/servers?search=io.github.shipmail-to/shipmail-mcp)
440
443
  - [Glama MCP listing](https://glama.ai/mcp/servers/jcoulaud/shipmail-mcp)
441
444
  - [Model Context Protocol](https://modelcontextprotocol.io)
442
- - [Source repository](https://github.com/jcoulaud/shipmail-mcp)
443
- - [Issues](https://github.com/jcoulaud/shipmail-mcp/issues)
445
+ - [Source repository](https://github.com/shipmail-to/shipmail-mcp)
446
+ - [Issues](https://github.com/shipmail-to/shipmail-mcp/issues)
@@ -131,7 +131,7 @@ declare const MCP_PERMISSION_GROUPS: readonly [{
131
131
  readonly scopes: readonly ["partner:organizations:read", "partner:organizations:write", "partner:organizations:access", "partner:mailbox_credentials:issue", "partner:usage:read"];
132
132
  readonly persistent: true;
133
133
  }];
134
- declare const CAPABILITY_ROWS: readonly [readonly ["shipmail_status", "getStatus", "public"], readonly ["shipmail_create_domain", "createDomain", "domains:write"], readonly ["shipmail_list_domains", "listDomains", "domains:read"], readonly ["shipmail_get_domain", "getDomain", "domains:read"], readonly ["shipmail_get_domain_dns_records", "getDomainDnsRecords", "domains:read"], readonly ["shipmail_update_domain", "updateDomain", "domains:write"], readonly ["shipmail_delete_domain", "deleteDomain", "domains:write"], readonly ["shipmail_verify_domain", "verifyDomain", "domains:write"], readonly ["shipmail_search_domains", "searchDomains", "domains:read"], readonly ["shipmail_create_mailbox", "createMailbox", "mailboxes:write"], readonly ["shipmail_list_mailboxes", "listMailboxes", "mailboxes:read"], readonly ["shipmail_get_mailbox", "getMailbox", "mailboxes:read"], readonly ["shipmail_list_mailbox_app_passwords", "listMailboxAppPasswords", "mailbox_credentials:read"], readonly ["shipmail_create_mailbox_app_password", "createMailboxAppPassword", "mailbox_credentials:write"], readonly ["shipmail_revoke_mailbox_app_password", "revokeMailboxAppPassword", "mailbox_credentials:write"], readonly ["shipmail_suspend_mailbox", "suspendMailbox", "mailboxes:write"], readonly ["shipmail_resume_mailbox", "resumeMailbox", "mailboxes:write"], readonly ["shipmail_create_mailbox_export", "createMailboxExport", "mailboxes:export"], readonly ["shipmail_get_mailbox_export", "getMailboxExport", "mailboxes:export"], readonly ["shipmail_update_mailbox", "updateMailbox", "mailboxes:write"], readonly ["shipmail_delete_mailbox", "deleteMailbox", "mailboxes:write"], readonly ["shipmail_list_mailbox_folders", "listMailboxFolders", "mailboxes:read"], readonly ["shipmail_get_mailbox_rules", "getMailboxRules", "mailbox_rules:read"], readonly ["shipmail_set_mailbox_rules", "updateMailboxRules", "mailbox_rules:write"], readonly ["shipmail_create_mailbox_folder", "createMailboxFolder", "mailboxes:write"], readonly ["shipmail_update_mailbox_folder", "updateMailboxFolder", "mailboxes:write"], readonly ["shipmail_delete_mailbox_folder", "deleteMailboxFolder", "mailboxes:write"], readonly ["shipmail_list_mailbox_identities", "listMailboxIdentities", "mailboxes:read"], readonly ["shipmail_list_mailbox_inbox_messages", "listMailboxInboxMessages", "messages:read"], readonly ["shipmail_get_mailbox_inbox_message", "getMailboxInboxMessage", "messages:read"], readonly ["shipmail_list_mailbox_inbox_threads", "listMailboxInboxThreads", "messages:read"], readonly ["shipmail_get_mailbox_inbox_thread", "getMailboxInboxThread", "messages:read"], readonly ["shipmail_update_inbox_thread_reply_state", "updateMailboxInboxThreadReplyState", "messages:write"], readonly ["shipmail_create_inbox_reply_draft", "createMailboxInboxReplyDraft", "drafts:write"], readonly ["shipmail_send_inbox_reply_draft", "sendMailboxInboxReplyDraft", "messages:send"], readonly ["shipmail_reply_to_inbox_message", "replyToMailboxInboxMessage", "messages:send"], readonly ["shipmail_reply_to_inbox_thread", "replyToMailboxInboxThread", "messages:send"], readonly ["shipmail_update_inbox_message", "updateMailboxInboxMessage", "messages:write"], readonly ["shipmail_move_inbox_message", "moveMailboxInboxMessage", "messages:write"], readonly ["shipmail_delete_inbox_message", "deleteMailboxInboxMessage", "messages:write"], readonly ["shipmail_list_mailbox_forwarding", "listMailboxForwarding", "mailbox_forwarding:read"], readonly ["shipmail_create_mailbox_forwarding", "createMailboxForwarding", "mailbox_forwarding:write"], readonly ["shipmail_delete_mailbox_forwarding", "deleteMailboxForwarding", "mailbox_forwarding:write"], readonly ["shipmail_reset_mailbox_password", "resetMailboxPassword", "mailboxes:write"], readonly ["shipmail_set_auto_reply", "updateAutoReply", "mailboxes:write"], readonly ["shipmail_set_spam_filter", "updateSpamFilter", "mailboxes:write"], readonly ["shipmail_create_mailbox_import", "createMailboxImport", "mailboxes:write"], readonly ["shipmail_list_mailbox_imports", "listMailboxImports", "mailboxes:read"], readonly ["shipmail_get_mailbox_import", "getMailboxImport", "mailboxes:read"], readonly ["shipmail_cancel_mailbox_import", "cancelMailboxImport", "mailboxes:write"], readonly ["shipmail_undo_mailbox_import", "undoMailboxImport", "mailboxes:write"], readonly ["shipmail_inject_sandbox_inbound", "injectSandboxInbound", "messages:write"], readonly ["shipmail_list_messages", "listMessages", "messages:read"], readonly ["shipmail_compose_message_with_file", "prepareStagedAttachmentUpload", "messages:send"], readonly ["shipmail_prepare_staged_attachment_upload", "prepareStagedAttachmentUpload", "messages:send"], readonly ["shipmail_send_message", "sendMessage", "messages:send"], readonly ["shipmail_list_scheduled_messages", "listScheduledMessages", "messages:read"], readonly ["shipmail_get_scheduled_message", "getScheduledMessage", "messages:read"], readonly ["shipmail_update_scheduled_message", "updateScheduledMessage", "messages:send"], readonly ["shipmail_cancel_scheduled_message", "cancelScheduledMessage", "messages:send"], readonly ["shipmail_get_message", "getMessage", "messages:read"], readonly ["shipmail_reply_to_message", "replyToMessage", "messages:send"], readonly ["shipmail_list_threads", "listThreads", "threads:read"], readonly ["shipmail_get_thread", "getThread", "threads:read"], readonly ["shipmail_reply_to_thread", "replyToThread", "messages:send"], readonly ["shipmail_create_reply_scan", "createReplyScan", "messages:write"], readonly ["shipmail_get_reply_scan", "getReplyScan", "messages:read"], readonly ["shipmail_list_reply_scan_results", "listReplyScanResults", "messages:read"], readonly ["shipmail_create_webhook", "createWebhook", "webhooks:write"], readonly ["shipmail_list_webhooks", "listWebhooks", "webhooks:read"], readonly ["shipmail_get_webhook", "getWebhook", "webhooks:read"], readonly ["shipmail_update_webhook", "updateWebhook", "webhooks:write"], readonly ["shipmail_delete_webhook", "deleteWebhook", "webhooks:write"], readonly ["shipmail_rotate_webhook_secret", "rotateWebhookSecret", "webhooks:write"], readonly ["shipmail_test_webhook", "testWebhook", "webhooks:write"], readonly ["shipmail_list_webhook_deliveries", "listWebhookDeliveries", "webhooks:read"], readonly ["shipmail_get_webhook_delivery", "getWebhookDelivery", "webhooks:read"], readonly ["shipmail_replay_webhook_delivery", "replayWebhookDelivery", "webhooks:write"], readonly ["shipmail_list_suppressions", "listSuppressions", "suppressions:read"], readonly ["shipmail_remove_suppression", "removeSuppression", "suppressions:write"], readonly ["shipmail_create_audience", "createAudience", "audiences:write"], readonly ["shipmail_list_audiences", "listAudiences", "audiences:read"], readonly ["shipmail_get_audience", "getAudience", "audiences:read"], readonly ["shipmail_update_audience", "updateAudience", "audiences:write"], readonly ["shipmail_delete_audience", "deleteAudience", "audiences:write"], readonly ["shipmail_get_audience_feed", "getAudienceFeed", "audiences:read"], readonly ["shipmail_update_audience_feed", "updateAudienceFeed", "audiences:write"], readonly ["shipmail_rotate_audience_feed", "rotateAudienceFeedToken", "audiences:write"], readonly ["shipmail_revoke_audience_feed", "revokeAudienceFeedToken", "audiences:write"], readonly ["shipmail_add_subscriber", "addSubscriber", "audiences:write"], readonly ["shipmail_add_subscribers_batch", "addSubscribersBatch", "audiences:write"], readonly ["shipmail_list_subscribers", "listSubscribers", "audiences:read"], readonly ["shipmail_get_subscriber", "getSubscriber", "audiences:read"], readonly ["shipmail_get_subscriber_by_email", "getSubscriberByEmail", "audiences:read"], readonly ["shipmail_update_subscriber", "updateSubscriber", "audiences:write"], readonly ["shipmail_unsubscribe_subscriber", "unsubscribeSubscriber", "audiences:write"], readonly ["shipmail_resubscribe_subscriber", "resubscribeSubscriber", "audiences:write"], readonly ["shipmail_remove_subscriber", "removeSubscriber", "audiences:write"], readonly ["shipmail_list_newsletter_domains", "listNewsletterDomains", "newsletters:read"], readonly ["shipmail_create_newsletter", "createNewsletter", "newsletters:write"], readonly ["shipmail_create_newsletter_from_changelog", "createNewsletterFromChangelog", "newsletters:write"], readonly ["shipmail_list_newsletters", "listNewsletters", "newsletters:read"], readonly ["shipmail_get_newsletter", "getNewsletter", "newsletters:read"], readonly ["shipmail_update_newsletter", "updateNewsletter", "newsletters:write"], readonly ["shipmail_list_newsletter_assets", "listNewsletterAssets", "newsletters:read"], readonly ["shipmail_register_newsletter_asset", "uploadNewsletterAsset", "newsletters:write"], readonly ["shipmail_preview_newsletter", "previewNewsletter", "newsletters:read"], readonly ["shipmail_run_newsletter_preflight", "runNewsletterPreflight", "newsletters:write"], readonly ["shipmail_send_newsletter_test", "sendNewsletterTest", "newsletters:write"], readonly ["shipmail_schedule_newsletter", "scheduleNewsletter", "newsletters:write"], readonly ["shipmail_cancel_newsletter", "cancelNewsletter", "newsletters:write"], readonly ["shipmail_resume_newsletter", "resumeNewsletter", "newsletters:write"], readonly ["shipmail_list_calendar_events", "listCalendarEvents", "calendar:read"], readonly ["shipmail_create_calendar_event", "createCalendarEvent", "calendar:write"], readonly ["shipmail_get_calendar_event", "getCalendarEvent", "calendar:read"], readonly ["shipmail_update_calendar_event", "updateCalendarEvent", "calendar:write"], readonly ["shipmail_delete_calendar_event", "deleteCalendarEvent", "calendar:write"], readonly ["shipmail_get_calendar_availability", "getCalendarAvailability", "calendar:read"], readonly ["shipmail_list_booking_pages", "listBookingPages", "booking_pages:read"], readonly ["shipmail_create_booking_page", "createBookingPage", "booking_pages:write"], readonly ["shipmail_get_booking_page", "getBookingPage", "booking_pages:read"], readonly ["shipmail_update_booking_page", "updateBookingPage", "booking_pages:write"], readonly ["shipmail_delete_booking_page", "deleteBookingPage", "booking_pages:write"], readonly ["shipmail_list_partner_organizations", "listPartnerOrganizations", "partner:organizations:read"], readonly ["shipmail_create_partner_organization", "createPartnerOrganization", "partner:organizations:write"], readonly ["shipmail_get_partner_organization", "getPartnerOrganization", "partner:organizations:read"], readonly ["shipmail_update_partner_organization", "updatePartnerOrganization", "partner:organizations:write"], readonly ["shipmail_resend_partner_ownership_invitation", "resendPartnerOwnershipInvitation", "partner:organizations:write"], readonly ["shipmail_suspend_partner_organization", "suspendPartnerOrganization", "partner:organizations:write"], readonly ["shipmail_resume_partner_organization", "resumePartnerOrganization", "partner:organizations:write"], readonly ["shipmail_offboard_partner_organization", "offboardPartnerOrganization", "partner:organizations:write"], readonly ["shipmail_list_partner_mailbox_credential_grants", "listPartnerMailboxCredentialGrants", "partner:mailbox_credentials:issue"], readonly ["shipmail_consume_partner_mailbox_credential_grant", "consumePartnerMailboxCredentialGrant", "partner:mailbox_credentials:issue"], readonly ["shipmail_get_partner_usage", "getPartnerUsage", "partner:usage:read"]];
134
+ declare const CAPABILITY_ROWS: readonly [readonly ["shipmail_status", "getStatus", "public"], readonly ["shipmail_create_domain", "createDomain", "domains:write"], readonly ["shipmail_list_domains", "listDomains", "domains:read"], readonly ["shipmail_get_domain", "getDomain", "domains:read"], readonly ["shipmail_get_domain_dns_records", "getDomainDnsRecords", "domains:read"], readonly ["shipmail_update_domain", "updateDomain", "domains:write"], readonly ["shipmail_delete_domain", "deleteDomain", "domains:write"], readonly ["shipmail_verify_domain", "verifyDomain", "domains:write"], readonly ["shipmail_search_domains", "searchDomains", "domains:read"], readonly ["shipmail_create_mailbox", "createMailbox", "mailboxes:write"], readonly ["shipmail_list_mailboxes", "listMailboxes", "mailboxes:read"], readonly ["shipmail_get_mailbox", "getMailbox", "mailboxes:read"], readonly ["shipmail_list_mailbox_app_passwords", "listMailboxAppPasswords", "mailbox_credentials:read"], readonly ["shipmail_create_mailbox_app_password", "createMailboxAppPassword", "mailbox_credentials:write"], readonly ["shipmail_revoke_mailbox_app_password", "revokeMailboxAppPassword", "mailbox_credentials:write"], readonly ["shipmail_suspend_mailbox", "suspendMailbox", "mailboxes:write"], readonly ["shipmail_resume_mailbox", "resumeMailbox", "mailboxes:write"], readonly ["shipmail_create_mailbox_export", "createMailboxExport", "mailboxes:export"], readonly ["shipmail_get_mailbox_export", "getMailboxExport", "mailboxes:export"], readonly ["shipmail_update_mailbox", "updateMailbox", "mailboxes:write"], readonly ["shipmail_delete_mailbox", "deleteMailbox", "mailboxes:write"], readonly ["shipmail_list_mailbox_folders", "listMailboxFolders", "mailboxes:read"], readonly ["shipmail_get_mailbox_rules", "getMailboxRules", "mailbox_rules:read"], readonly ["shipmail_set_mailbox_rules", "updateMailboxRules", "mailbox_rules:write"], readonly ["shipmail_create_mailbox_folder", "createMailboxFolder", "mailboxes:write"], readonly ["shipmail_update_mailbox_folder", "updateMailboxFolder", "mailboxes:write"], readonly ["shipmail_delete_mailbox_folder", "deleteMailboxFolder", "mailboxes:write"], readonly ["shipmail_list_mailbox_identities", "listMailboxIdentities", "mailboxes:read"], readonly ["shipmail_list_mailbox_inbox_messages", "listMailboxInboxMessages", "messages:read"], readonly ["shipmail_get_mailbox_inbox_message", "getMailboxInboxMessage", "messages:read"], readonly ["shipmail_list_mailbox_inbox_threads", "listMailboxInboxThreads", "messages:read"], readonly ["shipmail_get_mailbox_inbox_thread", "getMailboxInboxThread", "messages:read"], readonly ["shipmail_update_inbox_thread_reply_state", "updateMailboxInboxThreadReplyState", "messages:write"], readonly ["shipmail_create_inbox_reply_draft", "createMailboxInboxReplyDraft", "drafts:write"], readonly ["shipmail_send_inbox_reply_draft", "sendMailboxInboxReplyDraft", "messages:send"], readonly ["shipmail_reply_to_inbox_message", "replyToMailboxInboxMessage", "messages:send"], readonly ["shipmail_reply_to_inbox_thread", "replyToMailboxInboxThread", "messages:send"], readonly ["shipmail_update_inbox_message", "updateMailboxInboxMessage", "messages:write"], readonly ["shipmail_move_inbox_message", "moveMailboxInboxMessage", "messages:write"], readonly ["shipmail_delete_inbox_message", "deleteMailboxInboxMessage", "messages:write"], readonly ["shipmail_list_mailbox_forwarding", "listMailboxForwarding", "mailbox_forwarding:read"], readonly ["shipmail_create_mailbox_forwarding", "createMailboxForwarding", "mailbox_forwarding:write"], readonly ["shipmail_delete_mailbox_forwarding", "deleteMailboxForwarding", "mailbox_forwarding:write"], readonly ["shipmail_reset_mailbox_password", "resetMailboxPassword", "mailboxes:write"], readonly ["shipmail_set_auto_reply", "updateAutoReply", "mailboxes:write"], readonly ["shipmail_set_spam_filter", "updateSpamFilter", "mailboxes:write"], readonly ["shipmail_create_mailbox_import", "createMailboxImport", "mailboxes:write"], readonly ["shipmail_list_mailbox_imports", "listMailboxImports", "mailboxes:read"], readonly ["shipmail_get_mailbox_import", "getMailboxImport", "mailboxes:read"], readonly ["shipmail_cancel_mailbox_import", "cancelMailboxImport", "mailboxes:write"], readonly ["shipmail_undo_mailbox_import", "undoMailboxImport", "mailboxes:write"], readonly ["shipmail_inject_sandbox_inbound", "injectSandboxInbound", "messages:write"], readonly ["shipmail_list_messages", "listMessages", "messages:read"], readonly ["shipmail_list_message_analytics", "listMessageAnalytics", "messages:read"], readonly ["shipmail_compose_message_with_file", "prepareStagedAttachmentUpload", "messages:send"], readonly ["shipmail_prepare_staged_attachment_upload", "prepareStagedAttachmentUpload", "messages:send"], readonly ["shipmail_send_message", "sendMessage", "messages:send"], readonly ["shipmail_list_scheduled_messages", "listScheduledMessages", "messages:read"], readonly ["shipmail_get_scheduled_message", "getScheduledMessage", "messages:read"], readonly ["shipmail_update_scheduled_message", "updateScheduledMessage", "messages:send"], readonly ["shipmail_cancel_scheduled_message", "cancelScheduledMessage", "messages:send"], readonly ["shipmail_get_message", "getMessage", "messages:read"], readonly ["shipmail_reply_to_message", "replyToMessage", "messages:send"], readonly ["shipmail_list_threads", "listThreads", "threads:read"], readonly ["shipmail_get_thread", "getThread", "threads:read"], readonly ["shipmail_reply_to_thread", "replyToThread", "messages:send"], readonly ["shipmail_create_reply_scan", "createReplyScan", "messages:write"], readonly ["shipmail_get_reply_scan", "getReplyScan", "messages:read"], readonly ["shipmail_list_reply_scan_results", "listReplyScanResults", "messages:read"], readonly ["shipmail_create_webhook", "createWebhook", "webhooks:write"], readonly ["shipmail_list_webhooks", "listWebhooks", "webhooks:read"], readonly ["shipmail_get_webhook", "getWebhook", "webhooks:read"], readonly ["shipmail_update_webhook", "updateWebhook", "webhooks:write"], readonly ["shipmail_delete_webhook", "deleteWebhook", "webhooks:write"], readonly ["shipmail_rotate_webhook_secret", "rotateWebhookSecret", "webhooks:write"], readonly ["shipmail_test_webhook", "testWebhook", "webhooks:write"], readonly ["shipmail_list_webhook_deliveries", "listWebhookDeliveries", "webhooks:read"], readonly ["shipmail_get_webhook_delivery", "getWebhookDelivery", "webhooks:read"], readonly ["shipmail_replay_webhook_delivery", "replayWebhookDelivery", "webhooks:write"], readonly ["shipmail_list_suppressions", "listSuppressions", "suppressions:read"], readonly ["shipmail_remove_suppression", "removeSuppression", "suppressions:write"], readonly ["shipmail_create_audience", "createAudience", "audiences:write"], readonly ["shipmail_list_audiences", "listAudiences", "audiences:read"], readonly ["shipmail_get_audience", "getAudience", "audiences:read"], readonly ["shipmail_update_audience", "updateAudience", "audiences:write"], readonly ["shipmail_delete_audience", "deleteAudience", "audiences:write"], readonly ["shipmail_get_audience_feed", "getAudienceFeed", "audiences:read"], readonly ["shipmail_update_audience_feed", "updateAudienceFeed", "audiences:write"], readonly ["shipmail_rotate_audience_feed", "rotateAudienceFeedToken", "audiences:write"], readonly ["shipmail_revoke_audience_feed", "revokeAudienceFeedToken", "audiences:write"], readonly ["shipmail_add_subscriber", "addSubscriber", "audiences:write"], readonly ["shipmail_add_subscribers_batch", "addSubscribersBatch", "audiences:write"], readonly ["shipmail_list_subscribers", "listSubscribers", "audiences:read"], readonly ["shipmail_get_subscriber", "getSubscriber", "audiences:read"], readonly ["shipmail_get_subscriber_by_email", "getSubscriberByEmail", "audiences:read"], readonly ["shipmail_update_subscriber", "updateSubscriber", "audiences:write"], readonly ["shipmail_unsubscribe_subscriber", "unsubscribeSubscriber", "audiences:write"], readonly ["shipmail_resubscribe_subscriber", "resubscribeSubscriber", "audiences:write"], readonly ["shipmail_remove_subscriber", "removeSubscriber", "audiences:write"], readonly ["shipmail_list_newsletter_domains", "listNewsletterDomains", "newsletters:read"], readonly ["shipmail_list_newsletter_sender_identities", "listNewsletterSenderIdentities", "newsletters:read"], readonly ["shipmail_create_newsletter", "createNewsletter", "newsletters:write"], readonly ["shipmail_create_newsletter_from_changelog", "createNewsletterFromChangelog", "newsletters:write"], readonly ["shipmail_list_newsletters", "listNewsletters", "newsletters:read"], readonly ["shipmail_get_newsletter", "getNewsletter", "newsletters:read"], readonly ["shipmail_update_newsletter", "updateNewsletter", "newsletters:write"], readonly ["shipmail_list_newsletter_assets", "listNewsletterAssets", "newsletters:read"], readonly ["shipmail_register_newsletter_asset", "uploadNewsletterAsset", "newsletters:write"], readonly ["shipmail_preview_newsletter", "previewNewsletter", "newsletters:read"], readonly ["shipmail_run_newsletter_preflight", "runNewsletterPreflight", "newsletters:write"], readonly ["shipmail_send_newsletter_test", "sendNewsletterTest", "newsletters:write"], readonly ["shipmail_schedule_newsletter", "scheduleNewsletter", "newsletters:write"], readonly ["shipmail_cancel_newsletter", "cancelNewsletter", "newsletters:write"], readonly ["shipmail_resume_newsletter", "resumeNewsletter", "newsletters:write"], readonly ["shipmail_list_calendar_events", "listCalendarEvents", "calendar:read"], readonly ["shipmail_create_calendar_event", "createCalendarEvent", "calendar:write"], readonly ["shipmail_get_calendar_event", "getCalendarEvent", "calendar:read"], readonly ["shipmail_update_calendar_event", "updateCalendarEvent", "calendar:write"], readonly ["shipmail_delete_calendar_event", "deleteCalendarEvent", "calendar:write"], readonly ["shipmail_get_calendar_availability", "getCalendarAvailability", "calendar:read"], readonly ["shipmail_list_booking_pages", "listBookingPages", "booking_pages:read"], readonly ["shipmail_create_booking_page", "createBookingPage", "booking_pages:write"], readonly ["shipmail_get_booking_page", "getBookingPage", "booking_pages:read"], readonly ["shipmail_update_booking_page", "updateBookingPage", "booking_pages:write"], readonly ["shipmail_delete_booking_page", "deleteBookingPage", "booking_pages:write"], readonly ["shipmail_list_partner_organizations", "listPartnerOrganizations", "partner:organizations:read"], readonly ["shipmail_create_partner_organization", "createPartnerOrganization", "partner:organizations:write"], readonly ["shipmail_get_partner_organization", "getPartnerOrganization", "partner:organizations:read"], readonly ["shipmail_update_partner_organization", "updatePartnerOrganization", "partner:organizations:write"], readonly ["shipmail_resend_partner_ownership_invitation", "resendPartnerOwnershipInvitation", "partner:organizations:write"], readonly ["shipmail_suspend_partner_organization", "suspendPartnerOrganization", "partner:organizations:write"], readonly ["shipmail_resume_partner_organization", "resumePartnerOrganization", "partner:organizations:write"], readonly ["shipmail_offboard_partner_organization", "offboardPartnerOrganization", "partner:organizations:write"], readonly ["shipmail_list_partner_mailbox_credential_grants", "listPartnerMailboxCredentialGrants", "partner:mailbox_credentials:issue"], readonly ["shipmail_consume_partner_mailbox_credential_grant", "consumePartnerMailboxCredentialGrant", "partner:mailbox_credentials:issue"], readonly ["shipmail_get_partner_usage", "getPartnerUsage", "partner:usage:read"]];
135
135
  type McpToolName = (typeof CAPABILITY_ROWS)[number][0];
136
136
  type McpCapability = {
137
137
  readonly toolName: McpToolName;
@@ -231,6 +231,7 @@ var CAPABILITY_ROWS = [
231
231
  ["shipmail_undo_mailbox_import", "undoMailboxImport", "mailboxes:write"],
232
232
  ["shipmail_inject_sandbox_inbound", "injectSandboxInbound", "messages:write"],
233
233
  ["shipmail_list_messages", "listMessages", "messages:read"],
234
+ ["shipmail_list_message_analytics", "listMessageAnalytics", "messages:read"],
234
235
  ["shipmail_compose_message_with_file", "prepareStagedAttachmentUpload", "messages:send"],
235
236
  ["shipmail_prepare_staged_attachment_upload", "prepareStagedAttachmentUpload", "messages:send"],
236
237
  ["shipmail_send_message", "sendMessage", "messages:send"],
@@ -277,6 +278,11 @@ var CAPABILITY_ROWS = [
277
278
  ["shipmail_resubscribe_subscriber", "resubscribeSubscriber", "audiences:write"],
278
279
  ["shipmail_remove_subscriber", "removeSubscriber", "audiences:write"],
279
280
  ["shipmail_list_newsletter_domains", "listNewsletterDomains", "newsletters:read"],
281
+ [
282
+ "shipmail_list_newsletter_sender_identities",
283
+ "listNewsletterSenderIdentities",
284
+ "newsletters:read"
285
+ ],
280
286
  ["shipmail_create_newsletter", "createNewsletter", "newsletters:write"],
281
287
  [
282
288
  "shipmail_create_newsletter_from_changelog",
package/dist/index.js CHANGED
@@ -216,6 +216,7 @@ var CAPABILITY_ROWS = [
216
216
  ["shipmail_undo_mailbox_import", "undoMailboxImport", "mailboxes:write"],
217
217
  ["shipmail_inject_sandbox_inbound", "injectSandboxInbound", "messages:write"],
218
218
  ["shipmail_list_messages", "listMessages", "messages:read"],
219
+ ["shipmail_list_message_analytics", "listMessageAnalytics", "messages:read"],
219
220
  ["shipmail_compose_message_with_file", "prepareStagedAttachmentUpload", "messages:send"],
220
221
  ["shipmail_prepare_staged_attachment_upload", "prepareStagedAttachmentUpload", "messages:send"],
221
222
  ["shipmail_send_message", "sendMessage", "messages:send"],
@@ -262,6 +263,11 @@ var CAPABILITY_ROWS = [
262
263
  ["shipmail_resubscribe_subscriber", "resubscribeSubscriber", "audiences:write"],
263
264
  ["shipmail_remove_subscriber", "removeSubscriber", "audiences:write"],
264
265
  ["shipmail_list_newsletter_domains", "listNewsletterDomains", "newsletters:read"],
266
+ [
267
+ "shipmail_list_newsletter_sender_identities",
268
+ "listNewsletterSenderIdentities",
269
+ "newsletters:read"
270
+ ],
265
271
  ["shipmail_create_newsletter", "createNewsletter", "newsletters:write"],
266
272
  [
267
273
  "shipmail_create_newsletter_from_changelog",
@@ -874,7 +880,7 @@ var EMAIL_MAX_LENGTH = 254;
874
880
  var RECIPIENT_NAME_MAX = 120;
875
881
  var NO_CONTROL_CHARS = /^[^\x00-\x1F\x7F]*$/;
876
882
  var DOMAIN_NAME_REGEX = /^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?(\.[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)+$/i;
877
- var CURSOR_REGEX = /^[A-Za-z0-9_\-=.+/]{1,512}$/;
883
+ var CURSOR_REGEX = /^[A-Za-z0-9_\-=.+/]+$/;
878
884
  var SUPPRESSION_REASONS = ["hard_bounce", "complaint", "manual"];
879
885
  var SYSTEM_FOLDER_NAMES = [
880
886
  "inbox",
@@ -979,7 +985,7 @@ var calendarEventIdInputSchema = z.string().min(1).max(256).refine((value) => NO
979
985
  var idempotencyKeySchema = z.string().regex(IDEMPOTENCY_REGEX, "Idempotency key must be 1-255 printable ASCII characters.").optional().describe("Optional idempotency key. If omitted, the MCP server generates one for POST tools.");
980
986
  var domainNameSchema = z.string().min(1).max(253).regex(DOMAIN_NAME_REGEX, "Must be a valid domain name (e.g. example.com).");
981
987
  var paginationInputSchema = z.object({
982
- cursor: z.string().regex(CURSOR_REGEX, "Cursor must be 1-512 characters of [A-Za-z0-9_\\-=.+/].").optional().describe("Pagination cursor returned by the previous call."),
988
+ cursor: z.string().max(8192, "Cursor must not exceed 8192 characters.").regex(CURSOR_REGEX, "Cursor must contain only [A-Za-z0-9_\\-=.+/].").optional().describe("Pagination cursor returned by the previous call."),
983
989
  limit: z.number().int().min(1).max(100).default(25).describe("Maximum results to return.")
984
990
  });
985
991
  var paginationSchema = z.object({
@@ -1463,6 +1469,23 @@ var messageSchema = z.object({
1463
1469
  created_at: z.string(),
1464
1470
  updated_at: z.string()
1465
1471
  });
1472
+ var messageAnalyticsSchema = z.object({
1473
+ object: z.literal("message_analytics"),
1474
+ id: z.string(),
1475
+ mailbox_id: z.string(),
1476
+ thread_id: z.string().nullable(),
1477
+ client_reference: z.string().nullable(),
1478
+ direction: z.enum(["inbound", "outbound"]),
1479
+ contact_addresses: z.array(z.string().email()),
1480
+ recipient_count: z.number().int().nonnegative(),
1481
+ attachment_count: z.number().int().nonnegative(),
1482
+ source: z.enum(MESSAGE_SOURCES),
1483
+ mode: z.enum(["live", "test"]),
1484
+ status: z.enum(MESSAGE_STATUSES),
1485
+ scheduled_at: z.string().nullable(),
1486
+ created_at: z.string(),
1487
+ updated_at: z.string()
1488
+ });
1466
1489
  var scheduledMessageSchema = z.object({
1467
1490
  object: z.literal("scheduled_message"),
1468
1491
  id: z.string(),
@@ -1681,6 +1704,12 @@ var messagesOutputSchema = z.object({
1681
1704
  data: z.array(messageSchema),
1682
1705
  pagination: paginationSchema
1683
1706
  });
1707
+ var messageAnalyticsOutputSchema = z.object({
1708
+ data: z.array(messageAnalyticsSchema),
1709
+ pagination: paginationSchema.extend({
1710
+ snapshot_at: z.string()
1711
+ })
1712
+ });
1684
1713
  var scheduledMessageOutputSchema = z.object({
1685
1714
  scheduled_message: scheduledMessageSchema
1686
1715
  });
@@ -2043,6 +2072,16 @@ var listMessagesInputSchema = paginationInputSchema.extend({
2043
2072
  }).refine((value) => Boolean(value.mailbox_id || value.client_reference), {
2044
2073
  message: "Provide mailbox_id or client_reference."
2045
2074
  });
2075
+ var listMessageAnalyticsInputSchema = paginationInputSchema.extend({
2076
+ updated_after: z.iso.datetime({ offset: true }).optional(),
2077
+ updated_before: z.iso.datetime({ offset: true }).optional()
2078
+ }).refine(
2079
+ (value) => !(value.updated_after && value.updated_before) || new Date(value.updated_after).getTime() < new Date(value.updated_before).getTime(),
2080
+ {
2081
+ message: "updated_after must be earlier than updated_before.",
2082
+ path: ["updated_after"]
2083
+ }
2084
+ );
2046
2085
  var openAiFileInputSchema = z.object({
2047
2086
  // The component prefers a freshly minted host download URL and only falls back to this one.
2048
2087
  // It is model-supplied and therefore reachable by prompt injection, so it is constrained to
@@ -2427,10 +2466,25 @@ var newsletterDomainSchema = z.object({
2427
2466
  created_at: z.string(),
2428
2467
  updated_at: z.string()
2429
2468
  });
2469
+ var newsletterSenderIdentitySchema = z.object({
2470
+ object: z.literal("newsletter_sender_identity"),
2471
+ id: z.string(),
2472
+ newsletter_domain_id: z.string(),
2473
+ from_name: z.string(),
2474
+ from_address: z.string(),
2475
+ business_name: z.string(),
2476
+ postal_address: z.string().nullable(),
2477
+ footer_text: z.string().nullable(),
2478
+ domain_status: z.enum(NEWSLETTER_DOMAIN_STATUSES),
2479
+ is_default: z.boolean(),
2480
+ created_at: z.string(),
2481
+ updated_at: z.string()
2482
+ });
2430
2483
  var newsletterSchema = z.object({
2431
2484
  object: z.literal("newsletter"),
2432
2485
  id: z.string(),
2433
2486
  audience_id: z.string().nullable(),
2487
+ sender_identity_id: z.string(),
2434
2488
  newsletter_domain_id: z.string(),
2435
2489
  reply_to_mailbox_id: z.string().nullable(),
2436
2490
  name: z.string(),
@@ -2567,6 +2621,10 @@ var newsletterDomainsOutputSchema = z.object({
2567
2621
  data: z.array(newsletterDomainSchema),
2568
2622
  pagination: paginationSchema
2569
2623
  });
2624
+ var newsletterSenderIdentitiesOutputSchema = z.object({
2625
+ data: z.array(newsletterSenderIdentitySchema),
2626
+ pagination: paginationSchema
2627
+ });
2570
2628
  var newslettersOutputSchema = z.object({
2571
2629
  data: z.array(newsletterSchema),
2572
2630
  pagination: paginationSchema
@@ -2677,11 +2735,10 @@ var newsletterBlockInputSchema = z.discriminatedUnion("type", [
2677
2735
  ]);
2678
2736
  var newsletterDraftFieldsInputSchema = {
2679
2737
  audience_id: idSchema.describe("Audience ID."),
2680
- newsletter_domain_id: idSchema.describe("Newsletter sending domain ID."),
2738
+ sender_identity_id: idSchema.describe("Newsletter sender identity ID."),
2681
2739
  name: noControlString(160, "name").min(1).describe("Internal newsletter draft name."),
2682
2740
  subject: noControlString(200, "subject").min(1).describe("Email subject line."),
2683
2741
  preview_text: noControlString(240, "preview_text").nullish(),
2684
- from_name: noControlString(120, "from_name").nullish(),
2685
2742
  body_html: z.string().max(25e4).nullish(),
2686
2743
  body_text: z.string().max(25e4).nullish(),
2687
2744
  blocks: z.array(newsletterBlockInputSchema).min(1).max(200).optional(),
@@ -2717,11 +2774,10 @@ var newsletterChangelogMediaInputSchema = z.discriminatedUnion("kind", [
2717
2774
  ]);
2718
2775
  var createNewsletterFromChangelogInputSchema = z.object({
2719
2776
  audience_id: idSchema.describe("Audience ID."),
2720
- newsletter_domain_id: idSchema.describe("Newsletter sending domain ID."),
2777
+ sender_identity_id: idSchema.describe("Newsletter sender identity ID."),
2721
2778
  name: noControlString(160, "name").min(1).describe("Internal newsletter draft name."),
2722
2779
  subject: noControlString(200, "subject").min(1).describe("Email subject line."),
2723
2780
  preview_text: noControlString(240, "preview_text").nullish(),
2724
- from_name: noControlString(120, "from_name").nullish(),
2725
2781
  tone: z.enum(["concise", "friendly", "technical"]).default("concise"),
2726
2782
  entries: z.array(
2727
2783
  z.object({
@@ -2748,11 +2804,10 @@ var createNewsletterFromChangelogInputSchema = z.object({
2748
2804
  var updateNewsletterInputSchema = z.object({
2749
2805
  id: idSchema.describe("Newsletter ID."),
2750
2806
  audience_id: newsletterDraftFieldsInputSchema.audience_id.optional(),
2751
- newsletter_domain_id: newsletterDraftFieldsInputSchema.newsletter_domain_id.optional(),
2807
+ sender_identity_id: newsletterDraftFieldsInputSchema.sender_identity_id.optional(),
2752
2808
  name: newsletterDraftFieldsInputSchema.name.optional(),
2753
2809
  subject: newsletterDraftFieldsInputSchema.subject.optional(),
2754
2810
  preview_text: newsletterDraftFieldsInputSchema.preview_text,
2755
- from_name: newsletterDraftFieldsInputSchema.from_name,
2756
2811
  body_html: newsletterDraftFieldsInputSchema.body_html,
2757
2812
  body_text: newsletterDraftFieldsInputSchema.body_text,
2758
2813
  blocks: newsletterDraftFieldsInputSchema.blocks,
@@ -2761,7 +2816,7 @@ var updateNewsletterInputSchema = z.object({
2761
2816
  styling_mode: newsletterDraftFieldsInputSchema.styling_mode,
2762
2817
  idempotency_key: idempotencyKeySchema
2763
2818
  }).refine(
2764
- (value) => value.audience_id !== void 0 || value.newsletter_domain_id !== void 0 || value.name !== void 0 || value.subject !== void 0 || value.preview_text !== void 0 || value.from_name !== void 0 || value.body_html !== void 0 || value.body_text !== void 0 || value.blocks !== void 0 || value.send_window_hours !== void 0 || value.archive_visibility !== void 0 || value.styling_mode !== void 0,
2819
+ (value) => value.audience_id !== void 0 || value.sender_identity_id !== void 0 || value.name !== void 0 || value.subject !== void 0 || value.preview_text !== void 0 || value.body_html !== void 0 || value.body_text !== void 0 || value.blocks !== void 0 || value.send_window_hours !== void 0 || value.archive_visibility !== void 0 || value.styling_mode !== void 0,
2765
2820
  {
2766
2821
  message: "Provide at least one newsletter field to update."
2767
2822
  }
@@ -3214,6 +3269,14 @@ var CROSS_ORGANIZATION_LIST_BEHAVIORS = [
3214
3269
  itemSchema: newsletterDomainSchema,
3215
3270
  list: (client, params) => client.newsletters.domains.list(params)
3216
3271
  },
3272
+ {
3273
+ toolName: "shipmail_list_newsletter_sender_identities_across_organizations",
3274
+ baseToolName: "shipmail_list_newsletter_sender_identities",
3275
+ title: "List Newsletter Sender Identities Across Organizations",
3276
+ description: "List newsletter sender identities in every organization on this connection. Returns one independently paginated success or failure section per organization.",
3277
+ itemSchema: newsletterSenderIdentitySchema,
3278
+ list: (client, params) => client.newsletters.senderIdentities.list(params)
3279
+ },
3217
3280
  {
3218
3281
  toolName: "shipmail_list_newsletter_assets_across_organizations",
3219
3282
  baseToolName: "shipmail_list_newsletter_assets",
@@ -5430,6 +5493,23 @@ function registerTools(rawServer, client, allowedTools, grantedOrganizations = [
5430
5493
  })
5431
5494
  );
5432
5495
  });
5496
+ registerIfAllowed("shipmail_list_message_analytics", () => {
5497
+ server.registerTool(
5498
+ "shipmail_list_message_analytics",
5499
+ {
5500
+ title: "List Message Analytics",
5501
+ description: "List an organization-wide, analytics-safe message projection in stable updated_at order. The response excludes subjects, BCC addresses, headers, free-form metadata, attachment filenames, and message bodies. contact_addresses and caller-defined client_reference values may contain personal data.",
5502
+ inputSchema: listMessageAnalyticsInputSchema,
5503
+ outputSchema: messageAnalyticsOutputSchema,
5504
+ annotations: { readOnlyHint: true, openWorldHint: false }
5505
+ },
5506
+ async (args) => runTool(
5507
+ "shipmail_list_message_analytics",
5508
+ messageAnalyticsOutputSchema,
5509
+ async () => client.messages.listAnalytics(args)
5510
+ )
5511
+ );
5512
+ });
5433
5513
  registerIfAllowed("shipmail_get_message", () => {
5434
5514
  server.registerTool(
5435
5515
  "shipmail_get_message",
@@ -5969,7 +6049,7 @@ function registerTools(rawServer, client, allowedTools, grantedOrganizations = [
5969
6049
  "shipmail_list_newsletter_domains",
5970
6050
  {
5971
6051
  title: "List Newsletter Domains",
5972
- description: "List configured newsletter sending domains in the authenticated ShipMail organization. Use this to find newsletter_domain_id values before creating a newsletter.",
6052
+ description: "List configured newsletter sending domains and their verification status in the authenticated ShipMail organization.",
5973
6053
  inputSchema: listNewslettersInputSchema,
5974
6054
  outputSchema: newsletterDomainsOutputSchema,
5975
6055
  annotations: { readOnlyHint: true, openWorldHint: false }
@@ -5981,6 +6061,23 @@ function registerTools(rawServer, client, allowedTools, grantedOrganizations = [
5981
6061
  )
5982
6062
  );
5983
6063
  });
6064
+ registerIfAllowed("shipmail_list_newsletter_sender_identities", () => {
6065
+ server.registerTool(
6066
+ "shipmail_list_newsletter_sender_identities",
6067
+ {
6068
+ title: "List Newsletter Sender Identities",
6069
+ description: "List configured newsletter sender identities. Use this to find sender_identity_id values before creating a newsletter.",
6070
+ inputSchema: listNewslettersInputSchema,
6071
+ outputSchema: newsletterSenderIdentitiesOutputSchema,
6072
+ annotations: { readOnlyHint: true, openWorldHint: false }
6073
+ },
6074
+ async (args) => runTool(
6075
+ "shipmail_list_newsletter_sender_identities",
6076
+ newsletterSenderIdentitiesOutputSchema,
6077
+ async () => client.newsletters.senderIdentities.list(args)
6078
+ )
6079
+ );
6080
+ });
5984
6081
  registerIfAllowed("shipmail_list_newsletter_assets", () => {
5985
6082
  server.registerTool(
5986
6083
  "shipmail_list_newsletter_assets",
@@ -6056,7 +6153,7 @@ function registerTools(rawServer, client, allowedTools, grantedOrganizations = [
6056
6153
  "shipmail_create_newsletter",
6057
6154
  {
6058
6155
  title: "Create Newsletter",
6059
- description: "Create a newsletter draft for an audience and sending domain. Prefer blocks for body content; Shipmail renders them to email-safe HTML and text. Provide at least one of blocks, body_html, or body_text. Drafts must pass preflight before scheduling. styled applies Shipmail's email theme. plain sends your HTML without injected styles, width, or centering, so the reader's email client styles it.",
6156
+ description: "Create a newsletter draft for an audience and sender identity. Prefer blocks for body content; Shipmail renders them to email-safe HTML and text. Provide at least one of blocks, body_html, or body_text. Drafts must pass preflight before scheduling. styled applies Shipmail's email theme. plain sends your HTML without injected styles, width, or centering, so the reader's email client styles it.",
6060
6157
  inputSchema: createNewsletterInputSchema,
6061
6158
  outputSchema: newsletterOutputSchema,
6062
6159
  annotations: {
@@ -6119,11 +6216,10 @@ function registerTools(rawServer, client, allowedTools, grantedOrganizations = [
6119
6216
  id,
6120
6217
  {
6121
6218
  ...rest.audience_id !== void 0 ? { audience_id: rest.audience_id } : {},
6122
- ...rest.newsletter_domain_id !== void 0 ? { newsletter_domain_id: rest.newsletter_domain_id } : {},
6219
+ ...rest.sender_identity_id !== void 0 ? { sender_identity_id: rest.sender_identity_id } : {},
6123
6220
  ...rest.name !== void 0 ? { name: rest.name } : {},
6124
6221
  ...rest.subject !== void 0 ? { subject: rest.subject } : {},
6125
6222
  ...rest.preview_text !== void 0 ? { preview_text: rest.preview_text } : {},
6126
- ...rest.from_name !== void 0 ? { from_name: rest.from_name } : {},
6127
6223
  ...rest.body_html !== void 0 ? { body_html: rest.body_html } : {},
6128
6224
  ...rest.body_text !== void 0 ? { body_text: rest.body_text } : {},
6129
6225
  ...rest.blocks !== void 0 ? { blocks: rest.blocks } : {},
@@ -7045,7 +7141,7 @@ function registerTools(rawServer, client, allowedTools, grantedOrganizations = [
7045
7141
  }
7046
7142
 
7047
7143
  // src/version.ts
7048
- var VERSION = "0.6.2";
7144
+ var VERSION = "0.6.4";
7049
7145
 
7050
7146
  // src/server.ts
7051
7147
  var INSTRUCTIONS = `ShipMail MCP exposes the business email and calendar tools authorized by the connection's current ShipMail permissions.
package/dist/server.js CHANGED
@@ -219,6 +219,7 @@ var CAPABILITY_ROWS = [
219
219
  ["shipmail_undo_mailbox_import", "undoMailboxImport", "mailboxes:write"],
220
220
  ["shipmail_inject_sandbox_inbound", "injectSandboxInbound", "messages:write"],
221
221
  ["shipmail_list_messages", "listMessages", "messages:read"],
222
+ ["shipmail_list_message_analytics", "listMessageAnalytics", "messages:read"],
222
223
  ["shipmail_compose_message_with_file", "prepareStagedAttachmentUpload", "messages:send"],
223
224
  ["shipmail_prepare_staged_attachment_upload", "prepareStagedAttachmentUpload", "messages:send"],
224
225
  ["shipmail_send_message", "sendMessage", "messages:send"],
@@ -265,6 +266,11 @@ var CAPABILITY_ROWS = [
265
266
  ["shipmail_resubscribe_subscriber", "resubscribeSubscriber", "audiences:write"],
266
267
  ["shipmail_remove_subscriber", "removeSubscriber", "audiences:write"],
267
268
  ["shipmail_list_newsletter_domains", "listNewsletterDomains", "newsletters:read"],
269
+ [
270
+ "shipmail_list_newsletter_sender_identities",
271
+ "listNewsletterSenderIdentities",
272
+ "newsletters:read"
273
+ ],
268
274
  ["shipmail_create_newsletter", "createNewsletter", "newsletters:write"],
269
275
  [
270
276
  "shipmail_create_newsletter_from_changelog",
@@ -777,7 +783,7 @@ var EMAIL_MAX_LENGTH = 254;
777
783
  var RECIPIENT_NAME_MAX = 120;
778
784
  var NO_CONTROL_CHARS = /^[^\x00-\x1F\x7F]*$/;
779
785
  var DOMAIN_NAME_REGEX = /^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?(\.[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)+$/i;
780
- var CURSOR_REGEX = /^[A-Za-z0-9_\-=.+/]{1,512}$/;
786
+ var CURSOR_REGEX = /^[A-Za-z0-9_\-=.+/]+$/;
781
787
  var SUPPRESSION_REASONS = ["hard_bounce", "complaint", "manual"];
782
788
  var SYSTEM_FOLDER_NAMES = [
783
789
  "inbox",
@@ -882,7 +888,7 @@ var calendarEventIdInputSchema = z.string().min(1).max(256).refine((value) => NO
882
888
  var idempotencyKeySchema = z.string().regex(IDEMPOTENCY_REGEX, "Idempotency key must be 1-255 printable ASCII characters.").optional().describe("Optional idempotency key. If omitted, the MCP server generates one for POST tools.");
883
889
  var domainNameSchema = z.string().min(1).max(253).regex(DOMAIN_NAME_REGEX, "Must be a valid domain name (e.g. example.com).");
884
890
  var paginationInputSchema = z.object({
885
- cursor: z.string().regex(CURSOR_REGEX, "Cursor must be 1-512 characters of [A-Za-z0-9_\\-=.+/].").optional().describe("Pagination cursor returned by the previous call."),
891
+ cursor: z.string().max(8192, "Cursor must not exceed 8192 characters.").regex(CURSOR_REGEX, "Cursor must contain only [A-Za-z0-9_\\-=.+/].").optional().describe("Pagination cursor returned by the previous call."),
886
892
  limit: z.number().int().min(1).max(100).default(25).describe("Maximum results to return.")
887
893
  });
888
894
  var paginationSchema = z.object({
@@ -1366,6 +1372,23 @@ var messageSchema = z.object({
1366
1372
  created_at: z.string(),
1367
1373
  updated_at: z.string()
1368
1374
  });
1375
+ var messageAnalyticsSchema = z.object({
1376
+ object: z.literal("message_analytics"),
1377
+ id: z.string(),
1378
+ mailbox_id: z.string(),
1379
+ thread_id: z.string().nullable(),
1380
+ client_reference: z.string().nullable(),
1381
+ direction: z.enum(["inbound", "outbound"]),
1382
+ contact_addresses: z.array(z.string().email()),
1383
+ recipient_count: z.number().int().nonnegative(),
1384
+ attachment_count: z.number().int().nonnegative(),
1385
+ source: z.enum(MESSAGE_SOURCES),
1386
+ mode: z.enum(["live", "test"]),
1387
+ status: z.enum(MESSAGE_STATUSES),
1388
+ scheduled_at: z.string().nullable(),
1389
+ created_at: z.string(),
1390
+ updated_at: z.string()
1391
+ });
1369
1392
  var scheduledMessageSchema = z.object({
1370
1393
  object: z.literal("scheduled_message"),
1371
1394
  id: z.string(),
@@ -1584,6 +1607,12 @@ var messagesOutputSchema = z.object({
1584
1607
  data: z.array(messageSchema),
1585
1608
  pagination: paginationSchema
1586
1609
  });
1610
+ var messageAnalyticsOutputSchema = z.object({
1611
+ data: z.array(messageAnalyticsSchema),
1612
+ pagination: paginationSchema.extend({
1613
+ snapshot_at: z.string()
1614
+ })
1615
+ });
1587
1616
  var scheduledMessageOutputSchema = z.object({
1588
1617
  scheduled_message: scheduledMessageSchema
1589
1618
  });
@@ -1946,6 +1975,16 @@ var listMessagesInputSchema = paginationInputSchema.extend({
1946
1975
  }).refine((value) => Boolean(value.mailbox_id || value.client_reference), {
1947
1976
  message: "Provide mailbox_id or client_reference."
1948
1977
  });
1978
+ var listMessageAnalyticsInputSchema = paginationInputSchema.extend({
1979
+ updated_after: z.iso.datetime({ offset: true }).optional(),
1980
+ updated_before: z.iso.datetime({ offset: true }).optional()
1981
+ }).refine(
1982
+ (value) => !(value.updated_after && value.updated_before) || new Date(value.updated_after).getTime() < new Date(value.updated_before).getTime(),
1983
+ {
1984
+ message: "updated_after must be earlier than updated_before.",
1985
+ path: ["updated_after"]
1986
+ }
1987
+ );
1949
1988
  var openAiFileInputSchema = z.object({
1950
1989
  // The component prefers a freshly minted host download URL and only falls back to this one.
1951
1990
  // It is model-supplied and therefore reachable by prompt injection, so it is constrained to
@@ -2330,10 +2369,25 @@ var newsletterDomainSchema = z.object({
2330
2369
  created_at: z.string(),
2331
2370
  updated_at: z.string()
2332
2371
  });
2372
+ var newsletterSenderIdentitySchema = z.object({
2373
+ object: z.literal("newsletter_sender_identity"),
2374
+ id: z.string(),
2375
+ newsletter_domain_id: z.string(),
2376
+ from_name: z.string(),
2377
+ from_address: z.string(),
2378
+ business_name: z.string(),
2379
+ postal_address: z.string().nullable(),
2380
+ footer_text: z.string().nullable(),
2381
+ domain_status: z.enum(NEWSLETTER_DOMAIN_STATUSES),
2382
+ is_default: z.boolean(),
2383
+ created_at: z.string(),
2384
+ updated_at: z.string()
2385
+ });
2333
2386
  var newsletterSchema = z.object({
2334
2387
  object: z.literal("newsletter"),
2335
2388
  id: z.string(),
2336
2389
  audience_id: z.string().nullable(),
2390
+ sender_identity_id: z.string(),
2337
2391
  newsletter_domain_id: z.string(),
2338
2392
  reply_to_mailbox_id: z.string().nullable(),
2339
2393
  name: z.string(),
@@ -2470,6 +2524,10 @@ var newsletterDomainsOutputSchema = z.object({
2470
2524
  data: z.array(newsletterDomainSchema),
2471
2525
  pagination: paginationSchema
2472
2526
  });
2527
+ var newsletterSenderIdentitiesOutputSchema = z.object({
2528
+ data: z.array(newsletterSenderIdentitySchema),
2529
+ pagination: paginationSchema
2530
+ });
2473
2531
  var newslettersOutputSchema = z.object({
2474
2532
  data: z.array(newsletterSchema),
2475
2533
  pagination: paginationSchema
@@ -2580,11 +2638,10 @@ var newsletterBlockInputSchema = z.discriminatedUnion("type", [
2580
2638
  ]);
2581
2639
  var newsletterDraftFieldsInputSchema = {
2582
2640
  audience_id: idSchema.describe("Audience ID."),
2583
- newsletter_domain_id: idSchema.describe("Newsletter sending domain ID."),
2641
+ sender_identity_id: idSchema.describe("Newsletter sender identity ID."),
2584
2642
  name: noControlString(160, "name").min(1).describe("Internal newsletter draft name."),
2585
2643
  subject: noControlString(200, "subject").min(1).describe("Email subject line."),
2586
2644
  preview_text: noControlString(240, "preview_text").nullish(),
2587
- from_name: noControlString(120, "from_name").nullish(),
2588
2645
  body_html: z.string().max(25e4).nullish(),
2589
2646
  body_text: z.string().max(25e4).nullish(),
2590
2647
  blocks: z.array(newsletterBlockInputSchema).min(1).max(200).optional(),
@@ -2620,11 +2677,10 @@ var newsletterChangelogMediaInputSchema = z.discriminatedUnion("kind", [
2620
2677
  ]);
2621
2678
  var createNewsletterFromChangelogInputSchema = z.object({
2622
2679
  audience_id: idSchema.describe("Audience ID."),
2623
- newsletter_domain_id: idSchema.describe("Newsletter sending domain ID."),
2680
+ sender_identity_id: idSchema.describe("Newsletter sender identity ID."),
2624
2681
  name: noControlString(160, "name").min(1).describe("Internal newsletter draft name."),
2625
2682
  subject: noControlString(200, "subject").min(1).describe("Email subject line."),
2626
2683
  preview_text: noControlString(240, "preview_text").nullish(),
2627
- from_name: noControlString(120, "from_name").nullish(),
2628
2684
  tone: z.enum(["concise", "friendly", "technical"]).default("concise"),
2629
2685
  entries: z.array(
2630
2686
  z.object({
@@ -2651,11 +2707,10 @@ var createNewsletterFromChangelogInputSchema = z.object({
2651
2707
  var updateNewsletterInputSchema = z.object({
2652
2708
  id: idSchema.describe("Newsletter ID."),
2653
2709
  audience_id: newsletterDraftFieldsInputSchema.audience_id.optional(),
2654
- newsletter_domain_id: newsletterDraftFieldsInputSchema.newsletter_domain_id.optional(),
2710
+ sender_identity_id: newsletterDraftFieldsInputSchema.sender_identity_id.optional(),
2655
2711
  name: newsletterDraftFieldsInputSchema.name.optional(),
2656
2712
  subject: newsletterDraftFieldsInputSchema.subject.optional(),
2657
2713
  preview_text: newsletterDraftFieldsInputSchema.preview_text,
2658
- from_name: newsletterDraftFieldsInputSchema.from_name,
2659
2714
  body_html: newsletterDraftFieldsInputSchema.body_html,
2660
2715
  body_text: newsletterDraftFieldsInputSchema.body_text,
2661
2716
  blocks: newsletterDraftFieldsInputSchema.blocks,
@@ -2664,7 +2719,7 @@ var updateNewsletterInputSchema = z.object({
2664
2719
  styling_mode: newsletterDraftFieldsInputSchema.styling_mode,
2665
2720
  idempotency_key: idempotencyKeySchema
2666
2721
  }).refine(
2667
- (value) => value.audience_id !== void 0 || value.newsletter_domain_id !== void 0 || value.name !== void 0 || value.subject !== void 0 || value.preview_text !== void 0 || value.from_name !== void 0 || value.body_html !== void 0 || value.body_text !== void 0 || value.blocks !== void 0 || value.send_window_hours !== void 0 || value.archive_visibility !== void 0 || value.styling_mode !== void 0,
2722
+ (value) => value.audience_id !== void 0 || value.sender_identity_id !== void 0 || value.name !== void 0 || value.subject !== void 0 || value.preview_text !== void 0 || value.body_html !== void 0 || value.body_text !== void 0 || value.blocks !== void 0 || value.send_window_hours !== void 0 || value.archive_visibility !== void 0 || value.styling_mode !== void 0,
2668
2723
  {
2669
2724
  message: "Provide at least one newsletter field to update."
2670
2725
  }
@@ -3117,6 +3172,14 @@ var CROSS_ORGANIZATION_LIST_BEHAVIORS = [
3117
3172
  itemSchema: newsletterDomainSchema,
3118
3173
  list: (client, params) => client.newsletters.domains.list(params)
3119
3174
  },
3175
+ {
3176
+ toolName: "shipmail_list_newsletter_sender_identities_across_organizations",
3177
+ baseToolName: "shipmail_list_newsletter_sender_identities",
3178
+ title: "List Newsletter Sender Identities Across Organizations",
3179
+ description: "List newsletter sender identities in every organization on this connection. Returns one independently paginated success or failure section per organization.",
3180
+ itemSchema: newsletterSenderIdentitySchema,
3181
+ list: (client, params) => client.newsletters.senderIdentities.list(params)
3182
+ },
3120
3183
  {
3121
3184
  toolName: "shipmail_list_newsletter_assets_across_organizations",
3122
3185
  baseToolName: "shipmail_list_newsletter_assets",
@@ -5333,6 +5396,23 @@ function registerTools(rawServer, client, allowedTools, grantedOrganizations = [
5333
5396
  })
5334
5397
  );
5335
5398
  });
5399
+ registerIfAllowed("shipmail_list_message_analytics", () => {
5400
+ server.registerTool(
5401
+ "shipmail_list_message_analytics",
5402
+ {
5403
+ title: "List Message Analytics",
5404
+ description: "List an organization-wide, analytics-safe message projection in stable updated_at order. The response excludes subjects, BCC addresses, headers, free-form metadata, attachment filenames, and message bodies. contact_addresses and caller-defined client_reference values may contain personal data.",
5405
+ inputSchema: listMessageAnalyticsInputSchema,
5406
+ outputSchema: messageAnalyticsOutputSchema,
5407
+ annotations: { readOnlyHint: true, openWorldHint: false }
5408
+ },
5409
+ async (args) => runTool(
5410
+ "shipmail_list_message_analytics",
5411
+ messageAnalyticsOutputSchema,
5412
+ async () => client.messages.listAnalytics(args)
5413
+ )
5414
+ );
5415
+ });
5336
5416
  registerIfAllowed("shipmail_get_message", () => {
5337
5417
  server.registerTool(
5338
5418
  "shipmail_get_message",
@@ -5872,7 +5952,7 @@ function registerTools(rawServer, client, allowedTools, grantedOrganizations = [
5872
5952
  "shipmail_list_newsletter_domains",
5873
5953
  {
5874
5954
  title: "List Newsletter Domains",
5875
- description: "List configured newsletter sending domains in the authenticated ShipMail organization. Use this to find newsletter_domain_id values before creating a newsletter.",
5955
+ description: "List configured newsletter sending domains and their verification status in the authenticated ShipMail organization.",
5876
5956
  inputSchema: listNewslettersInputSchema,
5877
5957
  outputSchema: newsletterDomainsOutputSchema,
5878
5958
  annotations: { readOnlyHint: true, openWorldHint: false }
@@ -5884,6 +5964,23 @@ function registerTools(rawServer, client, allowedTools, grantedOrganizations = [
5884
5964
  )
5885
5965
  );
5886
5966
  });
5967
+ registerIfAllowed("shipmail_list_newsletter_sender_identities", () => {
5968
+ server.registerTool(
5969
+ "shipmail_list_newsletter_sender_identities",
5970
+ {
5971
+ title: "List Newsletter Sender Identities",
5972
+ description: "List configured newsletter sender identities. Use this to find sender_identity_id values before creating a newsletter.",
5973
+ inputSchema: listNewslettersInputSchema,
5974
+ outputSchema: newsletterSenderIdentitiesOutputSchema,
5975
+ annotations: { readOnlyHint: true, openWorldHint: false }
5976
+ },
5977
+ async (args) => runTool(
5978
+ "shipmail_list_newsletter_sender_identities",
5979
+ newsletterSenderIdentitiesOutputSchema,
5980
+ async () => client.newsletters.senderIdentities.list(args)
5981
+ )
5982
+ );
5983
+ });
5887
5984
  registerIfAllowed("shipmail_list_newsletter_assets", () => {
5888
5985
  server.registerTool(
5889
5986
  "shipmail_list_newsletter_assets",
@@ -5959,7 +6056,7 @@ function registerTools(rawServer, client, allowedTools, grantedOrganizations = [
5959
6056
  "shipmail_create_newsletter",
5960
6057
  {
5961
6058
  title: "Create Newsletter",
5962
- description: "Create a newsletter draft for an audience and sending domain. Prefer blocks for body content; Shipmail renders them to email-safe HTML and text. Provide at least one of blocks, body_html, or body_text. Drafts must pass preflight before scheduling. styled applies Shipmail's email theme. plain sends your HTML without injected styles, width, or centering, so the reader's email client styles it.",
6059
+ description: "Create a newsletter draft for an audience and sender identity. Prefer blocks for body content; Shipmail renders them to email-safe HTML and text. Provide at least one of blocks, body_html, or body_text. Drafts must pass preflight before scheduling. styled applies Shipmail's email theme. plain sends your HTML without injected styles, width, or centering, so the reader's email client styles it.",
5963
6060
  inputSchema: createNewsletterInputSchema,
5964
6061
  outputSchema: newsletterOutputSchema,
5965
6062
  annotations: {
@@ -6022,11 +6119,10 @@ function registerTools(rawServer, client, allowedTools, grantedOrganizations = [
6022
6119
  id,
6023
6120
  {
6024
6121
  ...rest.audience_id !== void 0 ? { audience_id: rest.audience_id } : {},
6025
- ...rest.newsletter_domain_id !== void 0 ? { newsletter_domain_id: rest.newsletter_domain_id } : {},
6122
+ ...rest.sender_identity_id !== void 0 ? { sender_identity_id: rest.sender_identity_id } : {},
6026
6123
  ...rest.name !== void 0 ? { name: rest.name } : {},
6027
6124
  ...rest.subject !== void 0 ? { subject: rest.subject } : {},
6028
6125
  ...rest.preview_text !== void 0 ? { preview_text: rest.preview_text } : {},
6029
- ...rest.from_name !== void 0 ? { from_name: rest.from_name } : {},
6030
6126
  ...rest.body_html !== void 0 ? { body_html: rest.body_html } : {},
6031
6127
  ...rest.body_text !== void 0 ? { body_text: rest.body_text } : {},
6032
6128
  ...rest.blocks !== void 0 ? { blocks: rest.blocks } : {},
@@ -6948,7 +7044,7 @@ function registerTools(rawServer, client, allowedTools, grantedOrganizations = [
6948
7044
  }
6949
7045
 
6950
7046
  // src/version.ts
6951
- var VERSION = "0.6.2";
7047
+ var VERSION = "0.6.4";
6952
7048
 
6953
7049
  // src/server.ts
6954
7050
  var INSTRUCTIONS = `ShipMail MCP exposes the business email and calendar tools authorized by the connection's current ShipMail permissions.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "shipmail-mcp",
3
- "version": "0.6.2",
4
- "mcpName": "io.github.jcoulaud/shipmail-mcp",
3
+ "version": "0.6.4",
4
+ "mcpName": "io.github.shipmail-to/shipmail-mcp",
5
5
  "description": "Official Model Context Protocol (MCP) server for Shipmail, a business email provider with REST API, webhooks, and custom-domain inboxes for AI agents.",
6
6
  "type": "module",
7
7
  "packageManager": "bun@1.3.10",
@@ -45,11 +45,11 @@
45
45
  "license": "MIT",
46
46
  "repository": {
47
47
  "type": "git",
48
- "url": "git+https://github.com/jcoulaud/shipmail-mcp.git"
48
+ "url": "git+https://github.com/shipmail-to/shipmail-mcp.git"
49
49
  },
50
50
  "homepage": "https://shipmail.to/docs/mcp",
51
51
  "bugs": {
52
- "url": "https://github.com/jcoulaud/shipmail-mcp/issues"
52
+ "url": "https://github.com/shipmail-to/shipmail-mcp/issues"
53
53
  },
54
54
  "engines": {
55
55
  "node": ">=20"
@@ -59,7 +59,7 @@
59
59
  },
60
60
  "dependencies": {
61
61
  "@modelcontextprotocol/server": "2.0.0",
62
- "shipmail": "0.4.8",
62
+ "shipmail": "0.4.10",
63
63
  "zod": "4.4.3"
64
64
  },
65
65
  "devDependencies": {
package/server.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
3
- "name": "io.github.jcoulaud/shipmail-mcp",
3
+ "name": "io.github.shipmail-to/shipmail-mcp",
4
4
  "description": "Shipmail MCP server for AI agent custom-domain email inboxes with REST API and webhooks.",
5
5
  "repository": {
6
- "url": "https://github.com/jcoulaud/shipmail-mcp",
6
+ "url": "https://github.com/shipmail-to/shipmail-mcp",
7
7
  "source": "github"
8
8
  },
9
- "version": "0.6.2",
9
+ "version": "0.6.4",
10
10
  "websiteUrl": "https://shipmail.to/docs/mcp",
11
11
  "remotes": [
12
12
  {
@@ -27,7 +27,7 @@
27
27
  "registryType": "npm",
28
28
  "registryBaseUrl": "https://registry.npmjs.org",
29
29
  "identifier": "shipmail-mcp",
30
- "version": "0.6.2",
30
+ "version": "0.6.4",
31
31
  "transport": {
32
32
  "type": "stdio"
33
33
  },
package/smithery.yaml CHANGED
@@ -1,9 +1,9 @@
1
1
  # Smithery configuration file: https://smithery.ai/docs/build/project-config/smithery-yaml
2
2
  name: shipmail-mcp
3
- version: 0.6.2
3
+ version: 0.6.4
4
4
  description: Official Shipmail MCP server for AI-agent custom-domain business email inboxes with REST API and webhooks.
5
5
  author: ShipMail
6
- repository: https://github.com/jcoulaud/shipmail-mcp
6
+ repository: https://github.com/shipmail-to/shipmail-mcp
7
7
  homepage: https://shipmail.to/docs/mcp
8
8
  license: MIT
9
9
  category: productivity