shipmail-mcp 0.2.10 → 0.3.0
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 +19 -13
- package/dist/index.js +188 -2
- package/package.json +2 -2
- package/server.json +2 -2
- package/smithery.yaml +1 -1
package/README.md
CHANGED
|
@@ -181,18 +181,18 @@ Once connected, ask your agent:
|
|
|
181
181
|
|
|
182
182
|
All tools are namespaced with `shipmail_` to avoid collisions with peer MCP servers.
|
|
183
183
|
|
|
184
|
-
| Group | Tools
|
|
185
|
-
| -------------------- |
|
|
186
|
-
| Status | `shipmail_status`
|
|
187
|
-
| Domains | `shipmail_list_domains`, `shipmail_get_domain`, `shipmail_get_domain_dns_records`, `shipmail_create_domain`, `shipmail_update_domain`, `shipmail_delete_domain`, `shipmail_verify_domain`, `shipmail_search_domains`
|
|
188
|
-
| 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_forwarding`, `shipmail_create_mailbox_forwarding`, `shipmail_delete_mailbox_forwarding`, `shipmail_list_mailbox_folders`, `shipmail_create_mailbox_folder`, `shipmail_update_mailbox_folder`, `shipmail_delete_mailbox_folder`, `shipmail_list_mailbox_identities`, `shipmail_get_mailbox_rules`, `shipmail_set_mailbox_rules`, `shipmail_reset_mailbox_password`, `shipmail_set_auto_reply`, `shipmail_set_spam_filter`, `shipmail_inject_sandbox_inbound` |
|
|
189
|
-
| Mailbox inbox | `shipmail_list_mailbox_inbox_messages`, `shipmail_get_mailbox_inbox_thread`, `shipmail_update_inbox_message`, `shipmail_move_inbox_message`, `shipmail_delete_inbox_message`
|
|
190
|
-
| Messages and threads | `shipmail_list_messages`, `shipmail_get_message`, `shipmail_send_message`, `shipmail_reply_to_message`, `shipmail_list_threads`, `shipmail_get_thread`, `shipmail_reply_to_thread`
|
|
191
|
-
| 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`
|
|
192
|
-
| Suppressions | `shipmail_list_suppressions`, `shipmail_remove_suppression`
|
|
193
|
-
| Audiences | `shipmail_list_audiences`, `shipmail_get_audience`, `shipmail_create_audience`, `shipmail_update_audience`, `shipmail_delete_audience`, `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`
|
|
194
|
-
| 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`
|
|
195
|
-
| 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_get_partner_usage`
|
|
184
|
+
| Group | Tools |
|
|
185
|
+
| -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
186
|
+
| Status | `shipmail_status` |
|
|
187
|
+
| Domains | `shipmail_list_domains`, `shipmail_get_domain`, `shipmail_get_domain_dns_records`, `shipmail_create_domain`, `shipmail_update_domain`, `shipmail_delete_domain`, `shipmail_verify_domain`, `shipmail_search_domains` |
|
|
188
|
+
| 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_create_mailbox_folder`, `shipmail_update_mailbox_folder`, `shipmail_delete_mailbox_folder`, `shipmail_list_mailbox_identities`, `shipmail_get_mailbox_rules`, `shipmail_set_mailbox_rules`, `shipmail_reset_mailbox_password`, `shipmail_set_auto_reply`, `shipmail_set_spam_filter`, `shipmail_inject_sandbox_inbound` |
|
|
189
|
+
| Mailbox inbox | `shipmail_list_mailbox_inbox_messages`, `shipmail_get_mailbox_inbox_thread`, `shipmail_update_inbox_message`, `shipmail_move_inbox_message`, `shipmail_delete_inbox_message` |
|
|
190
|
+
| Messages and threads | `shipmail_list_messages`, `shipmail_get_message`, `shipmail_send_message`, `shipmail_reply_to_message`, `shipmail_list_threads`, `shipmail_get_thread`, `shipmail_reply_to_thread` |
|
|
191
|
+
| 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` |
|
|
192
|
+
| Suppressions | `shipmail_list_suppressions`, `shipmail_remove_suppression` |
|
|
193
|
+
| Audiences | `shipmail_list_audiences`, `shipmail_get_audience`, `shipmail_create_audience`, `shipmail_update_audience`, `shipmail_delete_audience`, `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` |
|
|
194
|
+
| 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` |
|
|
195
|
+
| 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` |
|
|
196
196
|
|
|
197
197
|
Message send and reply tools accept optional `client_reference`, scalar `metadata`,
|
|
198
198
|
`source_rfc_message_id`, and validated safe `headers`. `shipmail_list_messages` accepts either a
|
|
@@ -200,6 +200,12 @@ Message send and reply tools accept optional `client_reference`, scalar `metadat
|
|
|
200
200
|
|
|
201
201
|
With an `sm_test_...` API key, send and reply tools accept `sandbox_outcome` and the sandbox inbound tool creates fake inbound mail. The API keeps test storage and events isolated and never delivers sandbox mail to real recipients.
|
|
202
202
|
|
|
203
|
+
App-password creation, revocation, and partner grant consumption are destructive/high-risk tools.
|
|
204
|
+
Creation and grant consumption return a live secret once; revocation disconnects that client
|
|
205
|
+
immediately. Partner grant consumption requires the exact `partner:mailbox_credentials:issue`
|
|
206
|
+
scope and an operator-approved one-time grant. App-password creation and grant consumption do not
|
|
207
|
+
accept idempotency keys.
|
|
208
|
+
|
|
203
209
|
To restrict the surface, pass `--tools` (overrides `SHIPMAIL_MCP_TOOLS`):
|
|
204
210
|
|
|
205
211
|
```json
|
|
@@ -258,7 +264,7 @@ Shipmail generates the primary credential and never returns it to the partner.
|
|
|
258
264
|
|
|
259
265
|
- **Tool namespacing**: All tools are prefixed with `shipmail_` to avoid collisions with peer MCP servers in the same host.
|
|
260
266
|
- **Structured outputs**: Successful tools return both text fallback content and structured MCP `structuredContent`.
|
|
261
|
-
- **Idempotency**: Mutating tools accept an optional `idempotency_key`. When omitted, the server generates a fresh key per tool call. Supply your own key if a specific request must stay idempotent across MCP retries.
|
|
267
|
+
- **Idempotency**: Mutating tools accept an optional `idempotency_key`. When omitted, the server generates a fresh key per tool call. Supply your own key if a specific request must stay idempotent across MCP retries. Mailbox app-password creation and partner grant consumption are excluded because their one-time plaintext secrets must never be cached.
|
|
262
268
|
- **Input sanitization**: Email content, addresses, and error text are stripped of ASCII control characters, DEL, and Unicode directional or BiDi markers (U+061C, U+200E/F, U+202A-E, U+2066-9). Long strings are truncated.
|
|
263
269
|
- **Error redaction**: 5xx and unexpected Shipmail errors are redacted to a generic message; the original `request_id` is preserved for support. Generic `Error` thrown values (network errors, deserialization) are redacted to "Internal MCP error" before reaching the LLM. Detail lands on stderr.
|
|
264
270
|
- **Circuit breaker**: Each session enforces per-tool rate limits and a hard total-call ceiling as a runaway-agent guard. These are not abuse controls. Real abuse limits live at the API per API key. Restart the server to reset.
|
package/dist/index.js
CHANGED
|
@@ -438,6 +438,39 @@ var mailboxExportSchema = z.object({
|
|
|
438
438
|
started_at: z.string().nullable(),
|
|
439
439
|
completed_at: z.string().nullable()
|
|
440
440
|
});
|
|
441
|
+
var mailboxAppPasswordSchema = z.object({
|
|
442
|
+
object: z.literal("mailbox_app_password"),
|
|
443
|
+
id: z.string(),
|
|
444
|
+
mailbox_id: z.string(),
|
|
445
|
+
name: z.string(),
|
|
446
|
+
state: z.enum(["pending_create", "active", "pending_revoke", "revoked", "failed"]),
|
|
447
|
+
purpose: z.enum(["operator_client", "partner_embedded_webmail"]),
|
|
448
|
+
expires_at: z.string().nullable(),
|
|
449
|
+
allowed_cidrs: z.array(z.string()),
|
|
450
|
+
last_used_at: z.string().nullable(),
|
|
451
|
+
created_at: z.string(),
|
|
452
|
+
revoked_at: z.string().nullable()
|
|
453
|
+
});
|
|
454
|
+
var createdMailboxAppPasswordSchema = mailboxAppPasswordSchema.extend({
|
|
455
|
+
secret: z.string()
|
|
456
|
+
});
|
|
457
|
+
var partnerMailboxCredentialSchema = createdMailboxAppPasswordSchema.extend({
|
|
458
|
+
operator_notified: z.boolean()
|
|
459
|
+
});
|
|
460
|
+
var partnerMailboxCredentialGrantSchema = z.object({
|
|
461
|
+
object: z.literal("partner_mailbox_credential_grant"),
|
|
462
|
+
id: z.string(),
|
|
463
|
+
partner_organization_id: z.string(),
|
|
464
|
+
organization_id: z.string(),
|
|
465
|
+
organization_name: z.string(),
|
|
466
|
+
external_reference: z.string(),
|
|
467
|
+
operator_email: z.string(),
|
|
468
|
+
mailbox_id: z.string(),
|
|
469
|
+
mailbox_address: z.string(),
|
|
470
|
+
disclosure_version: z.string(),
|
|
471
|
+
expires_at: z.string(),
|
|
472
|
+
consented_at: z.string()
|
|
473
|
+
});
|
|
441
474
|
var mailboxFolderSchema = z.object({
|
|
442
475
|
object: z.literal("mailbox_folder"),
|
|
443
476
|
id: z.string(),
|
|
@@ -813,6 +846,26 @@ var domainOutputSchema = z.object({ domain: domainSchema });
|
|
|
813
846
|
var domainDnsRecordsOutputSchema = z.object({ dns_records: domainDnsRecordSetSchema });
|
|
814
847
|
var mailboxOutputSchema = z.object({ mailbox: mailboxSchema });
|
|
815
848
|
var mailboxExportOutputSchema = z.object({ export: mailboxExportSchema });
|
|
849
|
+
var mailboxAppPasswordOutputSchema = z.object({
|
|
850
|
+
app_password: mailboxAppPasswordSchema
|
|
851
|
+
});
|
|
852
|
+
var createdMailboxAppPasswordOutputSchema = z.object({
|
|
853
|
+
app_password: createdMailboxAppPasswordSchema
|
|
854
|
+
});
|
|
855
|
+
var mailboxAppPasswordsOutputSchema = z.object({
|
|
856
|
+
app_passwords: z.object({
|
|
857
|
+
object: z.literal("list"),
|
|
858
|
+
data: z.array(mailboxAppPasswordSchema)
|
|
859
|
+
})
|
|
860
|
+
});
|
|
861
|
+
var partnerMailboxCredentialOutputSchema = z.object({
|
|
862
|
+
credential: partnerMailboxCredentialSchema
|
|
863
|
+
});
|
|
864
|
+
var partnerMailboxCredentialGrantsOutputSchema = z.object({
|
|
865
|
+
grants: z.object({
|
|
866
|
+
data: z.array(partnerMailboxCredentialGrantSchema)
|
|
867
|
+
})
|
|
868
|
+
});
|
|
816
869
|
var mailboxFolderOutputSchema = z.object({ folder: mailboxFolderSchema });
|
|
817
870
|
var mailboxFoldersOutputSchema = z.object({ folders: mailboxFoldersSchema });
|
|
818
871
|
var mailboxIdentitiesOutputSchema = z.object({ identities: mailboxIdentitiesSchema });
|
|
@@ -993,6 +1046,20 @@ var updateMailboxInputSchema = z.object({
|
|
|
993
1046
|
display_name: recipientNameSchema.max(200).nullable().describe("New display name, or null to clear."),
|
|
994
1047
|
idempotency_key: idempotencyKeySchema
|
|
995
1048
|
});
|
|
1049
|
+
var appPasswordCidrInputSchema = z.union([
|
|
1050
|
+
z.cidrv4("Must be a valid IPv4 CIDR range."),
|
|
1051
|
+
z.cidrv6("Must be a valid IPv6 CIDR range.")
|
|
1052
|
+
]);
|
|
1053
|
+
var createMailboxAppPasswordInputSchema = z.object({
|
|
1054
|
+
id: idSchema.describe("Mailbox ID."),
|
|
1055
|
+
name: noControlString(100, "name").trim().min(1),
|
|
1056
|
+
expires_at: z.iso.datetime().optional(),
|
|
1057
|
+
allowed_cidrs: z.array(appPasswordCidrInputSchema).max(20).optional()
|
|
1058
|
+
});
|
|
1059
|
+
var revokeMailboxAppPasswordInputSchema = z.object({
|
|
1060
|
+
id: idSchema.describe("Mailbox ID."),
|
|
1061
|
+
app_password_id: idSchema.describe("App password ID.")
|
|
1062
|
+
});
|
|
996
1063
|
var createMailboxFolderInputSchema = z.object({
|
|
997
1064
|
id: idSchema,
|
|
998
1065
|
name: folderNameSchema.describe("Custom folder name to create."),
|
|
@@ -2015,6 +2082,12 @@ var resendPartnerInvitationInputSchema = partnerOrganizationByIdInputSchema.exte
|
|
|
2015
2082
|
owner_email: emailSchema.optional(),
|
|
2016
2083
|
idempotency_key: idempotencyKeySchema
|
|
2017
2084
|
});
|
|
2085
|
+
var consumePartnerMailboxCredentialGrantInputSchema = z.object({
|
|
2086
|
+
grant_id: idSchema.describe("Single-use mailbox credential grant ID."),
|
|
2087
|
+
name: noControlString(100, "name").trim().min(1).optional(),
|
|
2088
|
+
expires_at: z.iso.datetime().optional(),
|
|
2089
|
+
allowed_cidrs: z.array(appPasswordCidrInputSchema).max(20).optional()
|
|
2090
|
+
});
|
|
2018
2091
|
|
|
2019
2092
|
// src/prompts.ts
|
|
2020
2093
|
var MAILBOX_LOCAL_REGEX = /^[a-zA-Z0-9]([a-zA-Z0-9._-]{0,62}[a-zA-Z0-9])?$/;
|
|
@@ -2460,6 +2533,8 @@ var SESSION_LIMITS = {
|
|
|
2460
2533
|
shipmail_create_domain: 10,
|
|
2461
2534
|
shipmail_create_mailbox: 20,
|
|
2462
2535
|
shipmail_create_mailbox_export: 5,
|
|
2536
|
+
shipmail_create_mailbox_app_password: 10,
|
|
2537
|
+
shipmail_revoke_mailbox_app_password: 20,
|
|
2463
2538
|
shipmail_create_mailbox_import: 5,
|
|
2464
2539
|
shipmail_cancel_mailbox_import: 10,
|
|
2465
2540
|
shipmail_undo_mailbox_import: 10,
|
|
@@ -2513,7 +2588,8 @@ var SESSION_LIMITS = {
|
|
|
2513
2588
|
shipmail_resend_partner_ownership_invitation: 20,
|
|
2514
2589
|
shipmail_suspend_partner_organization: 20,
|
|
2515
2590
|
shipmail_resume_partner_organization: 20,
|
|
2516
|
-
shipmail_offboard_partner_organization: 10
|
|
2591
|
+
shipmail_offboard_partner_organization: 10,
|
|
2592
|
+
shipmail_consume_partner_mailbox_credential_grant: 20
|
|
2517
2593
|
};
|
|
2518
2594
|
var SESSION_TOTAL_LIMIT = 500;
|
|
2519
2595
|
var DEBUG_ENABLED = process.env["SHIPMAIL_MCP_DEBUG"] === "1";
|
|
@@ -2805,6 +2881,72 @@ function registerTools(server, client, selectedTools) {
|
|
|
2805
2881
|
}))
|
|
2806
2882
|
);
|
|
2807
2883
|
});
|
|
2884
|
+
registerIfAllowed("shipmail_list_mailbox_app_passwords", () => {
|
|
2885
|
+
server.registerTool(
|
|
2886
|
+
"shipmail_list_mailbox_app_passwords",
|
|
2887
|
+
{
|
|
2888
|
+
title: "List Mailbox App Passwords",
|
|
2889
|
+
description: "List app-password metadata for one mailbox. Secret values are never returned by this read operation.",
|
|
2890
|
+
inputSchema: getByIdInputSchema,
|
|
2891
|
+
outputSchema: mailboxAppPasswordsOutputSchema,
|
|
2892
|
+
annotations: { readOnlyHint: true, openWorldHint: false }
|
|
2893
|
+
},
|
|
2894
|
+
async ({ id }) => runTool(
|
|
2895
|
+
"shipmail_list_mailbox_app_passwords",
|
|
2896
|
+
mailboxAppPasswordsOutputSchema,
|
|
2897
|
+
async () => ({ app_passwords: await client.mailboxes.listAppPasswords(id) })
|
|
2898
|
+
)
|
|
2899
|
+
);
|
|
2900
|
+
});
|
|
2901
|
+
registerIfAllowed("shipmail_create_mailbox_app_password", () => {
|
|
2902
|
+
server.registerTool(
|
|
2903
|
+
"shipmail_create_mailbox_app_password",
|
|
2904
|
+
{
|
|
2905
|
+
title: "Create Mailbox App Password",
|
|
2906
|
+
description: "Create a revocable mailbox credential for an email client. The secret is returned exactly once in this tool result, so only call after explicit operator approval and store it securely.",
|
|
2907
|
+
inputSchema: createMailboxAppPasswordInputSchema,
|
|
2908
|
+
outputSchema: createdMailboxAppPasswordOutputSchema,
|
|
2909
|
+
annotations: {
|
|
2910
|
+
readOnlyHint: false,
|
|
2911
|
+
destructiveHint: true,
|
|
2912
|
+
idempotentHint: false,
|
|
2913
|
+
openWorldHint: false
|
|
2914
|
+
}
|
|
2915
|
+
},
|
|
2916
|
+
async (args) => runTool(
|
|
2917
|
+
"shipmail_create_mailbox_app_password",
|
|
2918
|
+
createdMailboxAppPasswordOutputSchema,
|
|
2919
|
+
async () => ({
|
|
2920
|
+
app_password: await client.mailboxes.createAppPassword(args.id, {
|
|
2921
|
+
name: args.name,
|
|
2922
|
+
...args.expires_at ? { expires_at: args.expires_at } : {},
|
|
2923
|
+
...args.allowed_cidrs ? { allowed_cidrs: args.allowed_cidrs } : {}
|
|
2924
|
+
})
|
|
2925
|
+
})
|
|
2926
|
+
)
|
|
2927
|
+
);
|
|
2928
|
+
});
|
|
2929
|
+
registerIfAllowed("shipmail_revoke_mailbox_app_password", () => {
|
|
2930
|
+
server.registerTool(
|
|
2931
|
+
"shipmail_revoke_mailbox_app_password",
|
|
2932
|
+
{
|
|
2933
|
+
title: "Revoke Mailbox App Password",
|
|
2934
|
+
description: "Permanently revoke one mailbox app password. The associated client will lose access immediately.",
|
|
2935
|
+
inputSchema: revokeMailboxAppPasswordInputSchema,
|
|
2936
|
+
outputSchema: acknowledgmentOutputSchema,
|
|
2937
|
+
annotations: {
|
|
2938
|
+
readOnlyHint: false,
|
|
2939
|
+
destructiveHint: true,
|
|
2940
|
+
idempotentHint: true,
|
|
2941
|
+
openWorldHint: false
|
|
2942
|
+
}
|
|
2943
|
+
},
|
|
2944
|
+
async ({ id, app_password_id }) => runTool("shipmail_revoke_mailbox_app_password", acknowledgmentOutputSchema, async () => {
|
|
2945
|
+
await client.mailboxes.revokeAppPassword(id, app_password_id);
|
|
2946
|
+
return { result: { ok: true, id: app_password_id } };
|
|
2947
|
+
})
|
|
2948
|
+
);
|
|
2949
|
+
});
|
|
2808
2950
|
registerIfAllowed("shipmail_suspend_mailbox", () => {
|
|
2809
2951
|
server.registerTool(
|
|
2810
2952
|
"shipmail_suspend_mailbox",
|
|
@@ -4819,6 +4961,50 @@ function registerTools(server, client, selectedTools) {
|
|
|
4819
4961
|
);
|
|
4820
4962
|
});
|
|
4821
4963
|
}
|
|
4964
|
+
registerIfAllowed("shipmail_consume_partner_mailbox_credential_grant", () => {
|
|
4965
|
+
server.registerTool(
|
|
4966
|
+
"shipmail_consume_partner_mailbox_credential_grant",
|
|
4967
|
+
{
|
|
4968
|
+
title: "Consume Partner Mailbox Credential Grant",
|
|
4969
|
+
description: "Consume an operator-approved, single-use grant and issue an embedded-webmail credential. The secret is returned exactly once and the operator is notified. Call only after explicit partner approval.",
|
|
4970
|
+
inputSchema: consumePartnerMailboxCredentialGrantInputSchema,
|
|
4971
|
+
outputSchema: partnerMailboxCredentialOutputSchema,
|
|
4972
|
+
annotations: {
|
|
4973
|
+
readOnlyHint: false,
|
|
4974
|
+
destructiveHint: true,
|
|
4975
|
+
idempotentHint: false,
|
|
4976
|
+
openWorldHint: true
|
|
4977
|
+
}
|
|
4978
|
+
},
|
|
4979
|
+
async (args) => runTool(
|
|
4980
|
+
"shipmail_consume_partner_mailbox_credential_grant",
|
|
4981
|
+
partnerMailboxCredentialOutputSchema,
|
|
4982
|
+
async () => ({
|
|
4983
|
+
credential: await client.partner.consumeMailboxCredentialGrant(args.grant_id, {
|
|
4984
|
+
...args.name ? { name: args.name } : {},
|
|
4985
|
+
...args.expires_at ? { expires_at: args.expires_at } : {},
|
|
4986
|
+
...args.allowed_cidrs ? { allowed_cidrs: args.allowed_cidrs } : {}
|
|
4987
|
+
})
|
|
4988
|
+
})
|
|
4989
|
+
)
|
|
4990
|
+
);
|
|
4991
|
+
});
|
|
4992
|
+
registerIfAllowed("shipmail_list_partner_mailbox_credential_grants", () => {
|
|
4993
|
+
server.registerTool(
|
|
4994
|
+
"shipmail_list_partner_mailbox_credential_grants",
|
|
4995
|
+
{
|
|
4996
|
+
title: "List Partner Mailbox Credential Grants",
|
|
4997
|
+
description: "List active ten-minute mailbox approvals created by operator owners. Grant metadata contains no app-password secret.",
|
|
4998
|
+
outputSchema: partnerMailboxCredentialGrantsOutputSchema,
|
|
4999
|
+
annotations: { readOnlyHint: true, openWorldHint: false }
|
|
5000
|
+
},
|
|
5001
|
+
async () => runTool(
|
|
5002
|
+
"shipmail_list_partner_mailbox_credential_grants",
|
|
5003
|
+
partnerMailboxCredentialGrantsOutputSchema,
|
|
5004
|
+
async () => ({ grants: await client.partner.listMailboxCredentialGrants() })
|
|
5005
|
+
)
|
|
5006
|
+
);
|
|
5007
|
+
});
|
|
4822
5008
|
registerIfAllowed("shipmail_get_partner_usage", () => {
|
|
4823
5009
|
server.registerTool(
|
|
4824
5010
|
"shipmail_get_partner_usage",
|
|
@@ -4843,7 +5029,7 @@ function registerTools(server, client, selectedTools) {
|
|
|
4843
5029
|
}
|
|
4844
5030
|
|
|
4845
5031
|
// src/version.ts
|
|
4846
|
-
var VERSION = "0.
|
|
5032
|
+
var VERSION = "0.3.0";
|
|
4847
5033
|
|
|
4848
5034
|
// src/server.ts
|
|
4849
5035
|
var INSTRUCTIONS = `ShipMail MCP exposes business email tools for domains, mailboxes, messages, threads, webhooks, and suppressions.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "shipmail-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"mcpName": "io.github.jcoulaud/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",
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
},
|
|
60
60
|
"dependencies": {
|
|
61
61
|
"@modelcontextprotocol/sdk": "1.29.0",
|
|
62
|
-
"shipmail": "0.
|
|
62
|
+
"shipmail": "0.2.0",
|
|
63
63
|
"zod": "4.4.3"
|
|
64
64
|
},
|
|
65
65
|
"devDependencies": {
|
package/server.json
CHANGED
|
@@ -6,14 +6,14 @@
|
|
|
6
6
|
"url": "https://github.com/jcoulaud/shipmail-mcp",
|
|
7
7
|
"source": "github"
|
|
8
8
|
},
|
|
9
|
-
"version": "0.
|
|
9
|
+
"version": "0.3.0",
|
|
10
10
|
"websiteUrl": "https://shipmail.to/docs/mcp",
|
|
11
11
|
"packages": [
|
|
12
12
|
{
|
|
13
13
|
"registryType": "npm",
|
|
14
14
|
"registryBaseUrl": "https://registry.npmjs.org",
|
|
15
15
|
"identifier": "shipmail-mcp",
|
|
16
|
-
"version": "0.
|
|
16
|
+
"version": "0.3.0",
|
|
17
17
|
"transport": {
|
|
18
18
|
"type": "stdio"
|
|
19
19
|
},
|
package/smithery.yaml
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Smithery configuration file: https://smithery.ai/docs/build/project-config/smithery-yaml
|
|
2
2
|
name: shipmail-mcp
|
|
3
|
-
version: 0.
|
|
3
|
+
version: 0.3.0
|
|
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
6
|
repository: https://github.com/jcoulaud/shipmail-mcp
|