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 +15 -12
- package/dist/capabilities.d.ts +1 -1
- package/dist/capabilities.js +6 -0
- package/dist/index.js +110 -14
- package/dist/server.js +110 -14
- package/package.json +5 -5
- package/server.json +4 -4
- package/smithery.yaml +2 -2
package/README.md
CHANGED
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
[](https://www.npmjs.com/package/shipmail-mcp)
|
|
5
5
|
[](https://www.npmjs.com/package/shipmail-mcp)
|
|
6
6
|
[](./LICENSE)
|
|
7
|
-
[](https://github.com/
|
|
7
|
+
[](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 [
|
|
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/
|
|
27
|
-
- Official registry metadata: [`io.github.
|
|
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/
|
|
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: `
|
|
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.
|
|
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/
|
|
443
|
-
- [Issues](https://github.com/
|
|
445
|
+
- [Source repository](https://github.com/shipmail-to/shipmail-mcp)
|
|
446
|
+
- [Issues](https://github.com/shipmail-to/shipmail-mcp/issues)
|
package/dist/capabilities.d.ts
CHANGED
|
@@ -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;
|
package/dist/capabilities.js
CHANGED
|
@@ -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_\-=.+/]
|
|
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().
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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
|
|
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.
|
|
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.
|
|
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_\-=.+/]
|
|
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().
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
4
|
-
"mcpName": "io.github.
|
|
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/
|
|
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/
|
|
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.
|
|
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.
|
|
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/
|
|
6
|
+
"url": "https://github.com/shipmail-to/shipmail-mcp",
|
|
7
7
|
"source": "github"
|
|
8
8
|
},
|
|
9
|
-
"version": "0.6.
|
|
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.
|
|
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.
|
|
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/
|
|
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
|