shipmail-mcp 0.2.9 → 0.2.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -8
- package/dist/index.js +287 -8
- package/package.json +2 -2
- package/server.json +2 -2
- package/smithery.yaml +1 -1
package/README.md
CHANGED
|
@@ -192,6 +192,7 @@ All tools are namespaced with `shipmail_` to avoid collisions with peer MCP serv
|
|
|
192
192
|
| Suppressions | `shipmail_list_suppressions`, `shipmail_remove_suppression` |
|
|
193
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
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` |
|
|
195
196
|
|
|
196
197
|
Message send and reply tools accept optional `client_reference`, scalar `metadata`,
|
|
197
198
|
`source_rfc_message_id`, and validated safe `headers`. `shipmail_list_messages` accepts either a
|
|
@@ -240,14 +241,18 @@ Pre-built prompts the agent can use as guided workflows:
|
|
|
240
241
|
|
|
241
242
|
## Configuration
|
|
242
243
|
|
|
243
|
-
| Variable
|
|
244
|
-
|
|
|
245
|
-
| `SHIPMAIL_API_KEY`
|
|
246
|
-
| `SHIPMAIL_API_KEY_FILE`
|
|
247
|
-
| `SHIPMAIL_BASE_URL`
|
|
248
|
-
| `
|
|
249
|
-
|
|
250
|
-
|
|
244
|
+
| Variable | Required | Description |
|
|
245
|
+
| -------------------------- | -------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
246
|
+
| `SHIPMAIL_API_KEY` | Yes (or `SHIPMAIL_API_KEY_FILE`) | Shipmail API key (`sm_live_...`). |
|
|
247
|
+
| `SHIPMAIL_API_KEY_FILE` | No | Path to a file containing the API key. Takes precedence over `SHIPMAIL_API_KEY`. Reduces env-trace leak surface (Docker secrets, systemd `LoadCredential`). |
|
|
248
|
+
| `SHIPMAIL_BASE_URL` | No | Override the API base URL. Must be https on a `shipmail.to` host. Defaults to `https://shipmail.to/api/v1`. |
|
|
249
|
+
| `SHIPMAIL_ORGANIZATION_ID` | No | Delegated child organization for an approved infrastructure-only MCP session. |
|
|
250
|
+
|
|
251
|
+
In a delegated partner session, call `shipmail_create_mailbox` with `generate_password: true`.
|
|
252
|
+
Shipmail generates the primary credential and never returns it to the partner.
|
|
253
|
+
| `SHIPMAIL_MCP_TOOLS` | No | Comma-separated tool allowlist. The `--tools` flag overrides this. |
|
|
254
|
+
| `SHIPMAIL_ALLOW_INSECURE_BASE_URL` | No | Set to `1` to permit a non-https or non-`shipmail.to` base URL. Local development only. |
|
|
255
|
+
| `SHIPMAIL_MCP_DEBUG` | No | Set to `1` to include `request_id` and `status` in stderr tool-call logs. |
|
|
251
256
|
|
|
252
257
|
## Security
|
|
253
258
|
|
package/dist/index.js
CHANGED
|
@@ -18,6 +18,8 @@ Environment:
|
|
|
18
18
|
SHIPMAIL_API_KEY when set; reduces env-trace leak surface for hosts that
|
|
19
19
|
log environment variables.
|
|
20
20
|
SHIPMAIL_BASE_URL Optional API base URL. Must be https. Defaults to ${DEFAULT_BASE_URL}.
|
|
21
|
+
SHIPMAIL_ORGANIZATION_ID
|
|
22
|
+
Optional delegated child organization ID for infrastructure tools.
|
|
21
23
|
SHIPMAIL_MCP_TOOLS Optional comma-separated tool allowlist. --tools overrides this.
|
|
22
24
|
SHIPMAIL_ALLOW_INSECURE_BASE_URL=1
|
|
23
25
|
Permit non-https or non-shipmail.to base URL (development only).`;
|
|
@@ -95,6 +97,7 @@ function readConfig(argv = process.argv.slice(2)) {
|
|
|
95
97
|
return {
|
|
96
98
|
apiKey,
|
|
97
99
|
baseUrl,
|
|
100
|
+
organizationId: env["SHIPMAIL_ORGANIZATION_ID"] || void 0,
|
|
98
101
|
selectedTools: parseToolsArg(argv) ?? parseToolsList(env["SHIPMAIL_MCP_TOOLS"])
|
|
99
102
|
};
|
|
100
103
|
}
|
|
@@ -110,6 +113,7 @@ import { z as z2 } from "zod/v4";
|
|
|
110
113
|
|
|
111
114
|
// src/schemas.ts
|
|
112
115
|
import {
|
|
116
|
+
CONFERENCING_PROVIDER_IDS,
|
|
113
117
|
DOMAIN_STATUSES,
|
|
114
118
|
MESSAGE_SOURCES,
|
|
115
119
|
MESSAGE_STATUSES,
|
|
@@ -971,9 +975,18 @@ var createMailboxInputSchema = z.object({
|
|
|
971
975
|
password: z.string().min(8).max(128).refine((value) => /[a-z]/.test(value), "Password must include a lowercase letter.").refine((value) => /[A-Z]/.test(value), "Password must include an uppercase letter.").refine((value) => /[0-9]/.test(value), "Password must include a number.").refine(
|
|
972
976
|
(value) => !COMMON_MAILBOX_PASSWORDS.has(value.toLowerCase()),
|
|
973
977
|
"This password is too common. Choose something stronger."
|
|
974
|
-
),
|
|
978
|
+
).optional(),
|
|
979
|
+
generate_password: z.literal(true).optional(),
|
|
975
980
|
display_name: recipientNameSchema.max(128).optional(),
|
|
976
981
|
idempotency_key: idempotencyKeySchema
|
|
982
|
+
}).superRefine((value, ctx) => {
|
|
983
|
+
if (Boolean(value.password) === Boolean(value.generate_password)) {
|
|
984
|
+
ctx.addIssue({
|
|
985
|
+
code: "custom",
|
|
986
|
+
path: ["password"],
|
|
987
|
+
message: "Provide password or set generate_password to true, but not both."
|
|
988
|
+
});
|
|
989
|
+
}
|
|
977
990
|
});
|
|
978
991
|
var updateMailboxInputSchema = z.object({
|
|
979
992
|
id: idSchema,
|
|
@@ -1776,6 +1789,7 @@ var bookingPageSchema = z.object({
|
|
|
1776
1789
|
buffer_minutes: z.number(),
|
|
1777
1790
|
minimum_notice_minutes: z.number(),
|
|
1778
1791
|
max_advance_days: z.number(),
|
|
1792
|
+
conferencing_provider: z.enum(CONFERENCING_PROVIDER_IDS).nullable(),
|
|
1779
1793
|
active: z.boolean(),
|
|
1780
1794
|
created_at: z.string(),
|
|
1781
1795
|
updated_at: z.string()
|
|
@@ -1892,6 +1906,9 @@ var createBookingPageInputSchema = z.object({
|
|
|
1892
1906
|
buffer_minutes: z.number().int().min(0).max(240).optional(),
|
|
1893
1907
|
minimum_notice_minutes: z.number().int().min(0).optional(),
|
|
1894
1908
|
max_advance_days: z.number().int().min(1).max(365).optional(),
|
|
1909
|
+
conferencing_provider: z.enum(CONFERENCING_PROVIDER_IDS).nullish().describe(
|
|
1910
|
+
"Opt-in meeting provider. It must already be connected to the page's mailbox. Null means no meeting link."
|
|
1911
|
+
),
|
|
1895
1912
|
active: z.boolean().optional(),
|
|
1896
1913
|
idempotency_key: idempotencyKeySchema
|
|
1897
1914
|
});
|
|
@@ -1909,9 +1926,95 @@ var updateBookingPageInputSchema = z.object({
|
|
|
1909
1926
|
buffer_minutes: z.number().int().min(0).max(240).optional(),
|
|
1910
1927
|
minimum_notice_minutes: z.number().int().min(0).optional(),
|
|
1911
1928
|
max_advance_days: z.number().int().min(1).max(365).optional(),
|
|
1929
|
+
conferencing_provider: z.enum(CONFERENCING_PROVIDER_IDS).nullish().describe(
|
|
1930
|
+
"Opt-in meeting provider. It must already be connected to the page's mailbox. Set null to stop creating meeting links."
|
|
1931
|
+
),
|
|
1912
1932
|
active: z.boolean().optional(),
|
|
1913
1933
|
idempotency_key: idempotencyKeySchema
|
|
1914
1934
|
});
|
|
1935
|
+
var partnerOrganizationSchema = z.object({
|
|
1936
|
+
object: z.literal("partner_organization"),
|
|
1937
|
+
id: z.string(),
|
|
1938
|
+
organization_id: z.string(),
|
|
1939
|
+
name: z.string(),
|
|
1940
|
+
external_reference: z.string(),
|
|
1941
|
+
owner_email: z.string(),
|
|
1942
|
+
owner_user_id: z.string().nullable(),
|
|
1943
|
+
status: z.enum(["pending_owner", "active", "suspended", "offboarding", "disconnected"]),
|
|
1944
|
+
data_classification: z.enum(["internal_test", "customer"]),
|
|
1945
|
+
mailbox_limit: z.number().int(),
|
|
1946
|
+
delegated_permissions: z.array(z.string()),
|
|
1947
|
+
owner_accepted_at: z.string().nullable(),
|
|
1948
|
+
activated_at: z.string().nullable(),
|
|
1949
|
+
suspended_at: z.string().nullable(),
|
|
1950
|
+
disconnected_at: z.string().nullable(),
|
|
1951
|
+
created_at: z.string(),
|
|
1952
|
+
updated_at: z.string()
|
|
1953
|
+
});
|
|
1954
|
+
var partnerOrganizationOutputSchema = z.object({
|
|
1955
|
+
organization: partnerOrganizationSchema
|
|
1956
|
+
});
|
|
1957
|
+
var createdPartnerOrganizationSchema = partnerOrganizationSchema.extend({
|
|
1958
|
+
ownership_invitation: z.object({
|
|
1959
|
+
object: z.literal("partner_ownership_invitation"),
|
|
1960
|
+
owner_email: z.string(),
|
|
1961
|
+
email_sent: z.boolean(),
|
|
1962
|
+
expires_at: z.string()
|
|
1963
|
+
}).nullable()
|
|
1964
|
+
});
|
|
1965
|
+
var createdPartnerOrganizationOutputSchema = z.object({
|
|
1966
|
+
organization: createdPartnerOrganizationSchema
|
|
1967
|
+
});
|
|
1968
|
+
var partnerOrganizationsOutputSchema = z.object({
|
|
1969
|
+
data: z.array(partnerOrganizationSchema)
|
|
1970
|
+
});
|
|
1971
|
+
var partnerInvitationOutputSchema = z.object({
|
|
1972
|
+
invitation: z.object({
|
|
1973
|
+
object: z.literal("partner_ownership_invitation"),
|
|
1974
|
+
owner_email: z.string(),
|
|
1975
|
+
email_sent: z.boolean(),
|
|
1976
|
+
expires_at: z.string()
|
|
1977
|
+
})
|
|
1978
|
+
});
|
|
1979
|
+
var partnerUsageOutputSchema = z.object({
|
|
1980
|
+
usage: z.object({
|
|
1981
|
+
object: z.literal("partner_usage"),
|
|
1982
|
+
period_start: z.string(),
|
|
1983
|
+
period_end: z.string(),
|
|
1984
|
+
closed_through: z.string().nullable(),
|
|
1985
|
+
active_children: z.number().int(),
|
|
1986
|
+
active_mailboxes: z.number().int(),
|
|
1987
|
+
child_active_seconds: z.number().int(),
|
|
1988
|
+
mailbox_active_seconds: z.number().int(),
|
|
1989
|
+
child_subtotal: z.number().int(),
|
|
1990
|
+
mailbox_subtotal: z.number().int(),
|
|
1991
|
+
minimum_shortfall: z.number().int(),
|
|
1992
|
+
projected_total: z.number().int(),
|
|
1993
|
+
currency: z.string()
|
|
1994
|
+
})
|
|
1995
|
+
});
|
|
1996
|
+
var createPartnerOrganizationInputSchema = z.object({
|
|
1997
|
+
name: noControlString(120, "name").min(1),
|
|
1998
|
+
external_reference: noControlString(200, "external reference").min(1),
|
|
1999
|
+
owner_email: emailSchema,
|
|
2000
|
+
mailbox_limit: z.number().int().min(1).max(50).default(3),
|
|
2001
|
+
data_classification: z.enum(["internal_test", "customer"]).default("customer"),
|
|
2002
|
+
idempotency_key: idempotencyKeySchema
|
|
2003
|
+
});
|
|
2004
|
+
var partnerOrganizationByIdInputSchema = z.object({
|
|
2005
|
+
id: idSchema.describe("Partner organization relationship ID.")
|
|
2006
|
+
});
|
|
2007
|
+
var updatePartnerOrganizationInputSchema = partnerOrganizationByIdInputSchema.extend({
|
|
2008
|
+
name: noControlString(120, "name").min(1).optional(),
|
|
2009
|
+
mailbox_limit: z.number().int().min(1).max(50).optional(),
|
|
2010
|
+
idempotency_key: idempotencyKeySchema
|
|
2011
|
+
}).refine((value) => value.name !== void 0 || value.mailbox_limit !== void 0, {
|
|
2012
|
+
message: "Provide name or mailbox_limit."
|
|
2013
|
+
});
|
|
2014
|
+
var resendPartnerInvitationInputSchema = partnerOrganizationByIdInputSchema.extend({
|
|
2015
|
+
owner_email: emailSchema.optional(),
|
|
2016
|
+
idempotency_key: idempotencyKeySchema
|
|
2017
|
+
});
|
|
1915
2018
|
|
|
1916
2019
|
// src/prompts.ts
|
|
1917
2020
|
var MAILBOX_LOCAL_REGEX = /^[a-zA-Z0-9]([a-zA-Z0-9._-]{0,62}[a-zA-Z0-9])?$/;
|
|
@@ -2404,7 +2507,13 @@ var SESSION_LIMITS = {
|
|
|
2404
2507
|
shipmail_delete_calendar_event: 50,
|
|
2405
2508
|
shipmail_create_booking_page: 20,
|
|
2406
2509
|
shipmail_update_booking_page: 20,
|
|
2407
|
-
shipmail_delete_booking_page: 10
|
|
2510
|
+
shipmail_delete_booking_page: 10,
|
|
2511
|
+
shipmail_create_partner_organization: 20,
|
|
2512
|
+
shipmail_update_partner_organization: 50,
|
|
2513
|
+
shipmail_resend_partner_ownership_invitation: 20,
|
|
2514
|
+
shipmail_suspend_partner_organization: 20,
|
|
2515
|
+
shipmail_resume_partner_organization: 20,
|
|
2516
|
+
shipmail_offboard_partner_organization: 10
|
|
2408
2517
|
};
|
|
2409
2518
|
var SESSION_TOTAL_LIMIT = 500;
|
|
2410
2519
|
var DEBUG_ENABLED = process.env["SHIPMAIL_MCP_DEBUG"] === "1";
|
|
@@ -2751,9 +2860,24 @@ function registerTools(server, client, selectedTools) {
|
|
|
2751
2860
|
openWorldHint: false
|
|
2752
2861
|
}
|
|
2753
2862
|
},
|
|
2754
|
-
async (args) => runTool("shipmail_create_mailbox", mailboxOutputSchema, async () =>
|
|
2755
|
-
|
|
2756
|
-
|
|
2863
|
+
async (args) => runTool("shipmail_create_mailbox", mailboxOutputSchema, async () => {
|
|
2864
|
+
const base = {
|
|
2865
|
+
domain_id: args.domain_id,
|
|
2866
|
+
address: args.address,
|
|
2867
|
+
...args.display_name === void 0 ? {} : { display_name: args.display_name }
|
|
2868
|
+
};
|
|
2869
|
+
let params;
|
|
2870
|
+
if (args.generate_password === true) {
|
|
2871
|
+
params = { ...base, generate_password: true };
|
|
2872
|
+
} else if (args.password !== void 0) {
|
|
2873
|
+
params = { ...base, password: args.password };
|
|
2874
|
+
} else {
|
|
2875
|
+
throw new Error("Mailbox password validation failed.");
|
|
2876
|
+
}
|
|
2877
|
+
return {
|
|
2878
|
+
mailbox: await client.mailboxes.create(params, mutationOptions(args))
|
|
2879
|
+
};
|
|
2880
|
+
})
|
|
2757
2881
|
);
|
|
2758
2882
|
});
|
|
2759
2883
|
registerIfAllowed("shipmail_create_mailbox_export", () => {
|
|
@@ -4493,7 +4617,7 @@ function registerTools(server, client, selectedTools) {
|
|
|
4493
4617
|
"shipmail_create_booking_page",
|
|
4494
4618
|
{
|
|
4495
4619
|
title: "Create Booking Page",
|
|
4496
|
-
description: "Create a booking page exposing one mailbox's availability. availability_days is 0=Sunday..6=Saturday.",
|
|
4620
|
+
description: "Create a booking page exposing one mailbox's availability. availability_days is 0=Sunday..6=Saturday. conferencing_provider is opt-in and must already be connected to the mailbox.",
|
|
4497
4621
|
inputSchema: createBookingPageInputSchema,
|
|
4498
4622
|
outputSchema: bookingPageOutputSchema,
|
|
4499
4623
|
annotations: {
|
|
@@ -4516,7 +4640,7 @@ function registerTools(server, client, selectedTools) {
|
|
|
4516
4640
|
"shipmail_update_booking_page",
|
|
4517
4641
|
{
|
|
4518
4642
|
title: "Update Booking Page",
|
|
4519
|
-
description: "Update a booking page. All fields optional; provide at least one.",
|
|
4643
|
+
description: "Update a booking page. All fields optional; provide at least one. Set conferencing_provider to null to stop creating meeting links.",
|
|
4520
4644
|
inputSchema: updateBookingPageInputSchema,
|
|
4521
4645
|
outputSchema: bookingPageOutputSchema,
|
|
4522
4646
|
annotations: {
|
|
@@ -4555,6 +4679,160 @@ function registerTools(server, client, selectedTools) {
|
|
|
4555
4679
|
})
|
|
4556
4680
|
);
|
|
4557
4681
|
});
|
|
4682
|
+
registerIfAllowed("shipmail_list_partner_organizations", () => {
|
|
4683
|
+
server.registerTool(
|
|
4684
|
+
"shipmail_list_partner_organizations",
|
|
4685
|
+
{
|
|
4686
|
+
title: "List Partner Organizations",
|
|
4687
|
+
description: "List operator-owned organizations connected to the partner account.",
|
|
4688
|
+
outputSchema: partnerOrganizationsOutputSchema,
|
|
4689
|
+
annotations: { readOnlyHint: true, openWorldHint: false }
|
|
4690
|
+
},
|
|
4691
|
+
async () => runTool(
|
|
4692
|
+
"shipmail_list_partner_organizations",
|
|
4693
|
+
partnerOrganizationsOutputSchema,
|
|
4694
|
+
() => client.partner.listOrganizations()
|
|
4695
|
+
)
|
|
4696
|
+
);
|
|
4697
|
+
});
|
|
4698
|
+
registerIfAllowed("shipmail_create_partner_organization", () => {
|
|
4699
|
+
server.registerTool(
|
|
4700
|
+
"shipmail_create_partner_organization",
|
|
4701
|
+
{
|
|
4702
|
+
title: "Create Partner Organization",
|
|
4703
|
+
description: "Create an operator organization and email its ownership invitation. No domain or mailbox is created.",
|
|
4704
|
+
inputSchema: createPartnerOrganizationInputSchema,
|
|
4705
|
+
outputSchema: createdPartnerOrganizationOutputSchema,
|
|
4706
|
+
annotations: {
|
|
4707
|
+
readOnlyHint: false,
|
|
4708
|
+
destructiveHint: false,
|
|
4709
|
+
idempotentHint: true,
|
|
4710
|
+
openWorldHint: false
|
|
4711
|
+
}
|
|
4712
|
+
},
|
|
4713
|
+
async (args) => runTool(
|
|
4714
|
+
"shipmail_create_partner_organization",
|
|
4715
|
+
createdPartnerOrganizationOutputSchema,
|
|
4716
|
+
async () => ({
|
|
4717
|
+
organization: await client.partner.createOrganization(
|
|
4718
|
+
stripIdempotencyKey(args),
|
|
4719
|
+
mutationOptions(args)
|
|
4720
|
+
)
|
|
4721
|
+
})
|
|
4722
|
+
)
|
|
4723
|
+
);
|
|
4724
|
+
});
|
|
4725
|
+
registerIfAllowed("shipmail_get_partner_organization", () => {
|
|
4726
|
+
server.registerTool(
|
|
4727
|
+
"shipmail_get_partner_organization",
|
|
4728
|
+
{
|
|
4729
|
+
title: "Get Partner Organization",
|
|
4730
|
+
description: "Get one partner child relationship and its ownership state.",
|
|
4731
|
+
inputSchema: partnerOrganizationByIdInputSchema,
|
|
4732
|
+
outputSchema: partnerOrganizationOutputSchema,
|
|
4733
|
+
annotations: { readOnlyHint: true, openWorldHint: false }
|
|
4734
|
+
},
|
|
4735
|
+
async ({ id }) => runTool("shipmail_get_partner_organization", partnerOrganizationOutputSchema, async () => ({
|
|
4736
|
+
organization: await client.partner.getOrganization(id)
|
|
4737
|
+
}))
|
|
4738
|
+
);
|
|
4739
|
+
});
|
|
4740
|
+
registerIfAllowed("shipmail_update_partner_organization", () => {
|
|
4741
|
+
server.registerTool(
|
|
4742
|
+
"shipmail_update_partner_organization",
|
|
4743
|
+
{
|
|
4744
|
+
title: "Update Partner Organization",
|
|
4745
|
+
description: "Update an operator organization name or mailbox allocation.",
|
|
4746
|
+
inputSchema: updatePartnerOrganizationInputSchema,
|
|
4747
|
+
outputSchema: partnerOrganizationOutputSchema,
|
|
4748
|
+
annotations: {
|
|
4749
|
+
readOnlyHint: false,
|
|
4750
|
+
destructiveHint: false,
|
|
4751
|
+
idempotentHint: true,
|
|
4752
|
+
openWorldHint: false
|
|
4753
|
+
}
|
|
4754
|
+
},
|
|
4755
|
+
async (args) => runTool(
|
|
4756
|
+
"shipmail_update_partner_organization",
|
|
4757
|
+
partnerOrganizationOutputSchema,
|
|
4758
|
+
async () => {
|
|
4759
|
+
const { id, idempotency_key: _key, ...params } = args;
|
|
4760
|
+
return {
|
|
4761
|
+
organization: await client.partner.updateOrganization(
|
|
4762
|
+
id,
|
|
4763
|
+
params,
|
|
4764
|
+
mutationOptions(args)
|
|
4765
|
+
)
|
|
4766
|
+
};
|
|
4767
|
+
}
|
|
4768
|
+
)
|
|
4769
|
+
);
|
|
4770
|
+
});
|
|
4771
|
+
registerIfAllowed("shipmail_resend_partner_ownership_invitation", () => {
|
|
4772
|
+
server.registerTool(
|
|
4773
|
+
"shipmail_resend_partner_ownership_invitation",
|
|
4774
|
+
{
|
|
4775
|
+
title: "Resend Partner Ownership Invitation",
|
|
4776
|
+
description: "Revoke the pending ownership link and email a new single-use link.",
|
|
4777
|
+
inputSchema: resendPartnerInvitationInputSchema,
|
|
4778
|
+
outputSchema: partnerInvitationOutputSchema,
|
|
4779
|
+
annotations: {
|
|
4780
|
+
readOnlyHint: false,
|
|
4781
|
+
destructiveHint: false,
|
|
4782
|
+
idempotentHint: true,
|
|
4783
|
+
openWorldHint: true
|
|
4784
|
+
}
|
|
4785
|
+
},
|
|
4786
|
+
async (args) => runTool(
|
|
4787
|
+
"shipmail_resend_partner_ownership_invitation",
|
|
4788
|
+
partnerInvitationOutputSchema,
|
|
4789
|
+
async () => ({
|
|
4790
|
+
invitation: await client.partner.resendOwnershipInvitation(
|
|
4791
|
+
args.id,
|
|
4792
|
+
{ owner_email: args.owner_email },
|
|
4793
|
+
mutationOptions(args)
|
|
4794
|
+
)
|
|
4795
|
+
})
|
|
4796
|
+
)
|
|
4797
|
+
);
|
|
4798
|
+
});
|
|
4799
|
+
for (const transition of ["suspend", "resume", "offboard"]) {
|
|
4800
|
+
const toolName = `shipmail_${transition}_partner_organization`;
|
|
4801
|
+
registerIfAllowed(toolName, () => {
|
|
4802
|
+
server.registerTool(
|
|
4803
|
+
toolName,
|
|
4804
|
+
{
|
|
4805
|
+
title: `${transition[0]?.toUpperCase() ?? ""}${transition.slice(1)} Partner Organization`,
|
|
4806
|
+
description: transition === "suspend" ? "Suspend outbound sending for one operator organization. Inbound mail and storage continue." : transition === "resume" ? "Resume partner-managed outbound sending for one operator organization." : "Start non-destructive offboarding and immediately remove delegated access.",
|
|
4807
|
+
inputSchema: partnerOrganizationByIdInputSchema,
|
|
4808
|
+
outputSchema: partnerOrganizationOutputSchema,
|
|
4809
|
+
annotations: {
|
|
4810
|
+
readOnlyHint: false,
|
|
4811
|
+
destructiveHint: transition !== "resume",
|
|
4812
|
+
idempotentHint: true,
|
|
4813
|
+
openWorldHint: false
|
|
4814
|
+
}
|
|
4815
|
+
},
|
|
4816
|
+
async ({ id }) => runTool(toolName, partnerOrganizationOutputSchema, async () => ({
|
|
4817
|
+
organization: transition === "suspend" ? await client.partner.suspendOrganization(id) : transition === "resume" ? await client.partner.resumeOrganization(id) : await client.partner.offboardOrganization(id)
|
|
4818
|
+
}))
|
|
4819
|
+
);
|
|
4820
|
+
});
|
|
4821
|
+
}
|
|
4822
|
+
registerIfAllowed("shipmail_get_partner_usage", () => {
|
|
4823
|
+
server.registerTool(
|
|
4824
|
+
"shipmail_get_partner_usage",
|
|
4825
|
+
{
|
|
4826
|
+
title: "Get Partner Usage",
|
|
4827
|
+
description: "Get consolidated child and mailbox usage for the current UTC month.",
|
|
4828
|
+
outputSchema: partnerUsageOutputSchema,
|
|
4829
|
+
annotations: { readOnlyHint: true, openWorldHint: false }
|
|
4830
|
+
},
|
|
4831
|
+
async () => runTool("shipmail_get_partner_usage", partnerUsageOutputSchema, async () => ({
|
|
4832
|
+
usage: await client.partner.usage()
|
|
4833
|
+
}))
|
|
4834
|
+
);
|
|
4835
|
+
});
|
|
4558
4836
|
if (selectedTools) {
|
|
4559
4837
|
const unknown = [...selectedTools].filter((name) => !knownTools.includes(name));
|
|
4560
4838
|
if (unknown.length > 0) {
|
|
@@ -4565,7 +4843,7 @@ function registerTools(server, client, selectedTools) {
|
|
|
4565
4843
|
}
|
|
4566
4844
|
|
|
4567
4845
|
// src/version.ts
|
|
4568
|
-
var VERSION = "0.2.
|
|
4846
|
+
var VERSION = "0.2.10";
|
|
4569
4847
|
|
|
4570
4848
|
// src/server.ts
|
|
4571
4849
|
var INSTRUCTIONS = `ShipMail MCP exposes business email tools for domains, mailboxes, messages, threads, webhooks, and suppressions.
|
|
@@ -4590,6 +4868,7 @@ function createShipMailMcpServer(config) {
|
|
|
4590
4868
|
const client = new ShipMailClient({
|
|
4591
4869
|
apiKey: config.apiKey,
|
|
4592
4870
|
...config.baseUrl ? { baseUrl: config.baseUrl } : {},
|
|
4871
|
+
...config.organizationId ? { organizationId: config.organizationId } : {},
|
|
4593
4872
|
defaultHeaders
|
|
4594
4873
|
});
|
|
4595
4874
|
const server = new McpServer4(
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "shipmail-mcp",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.10",
|
|
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.1.
|
|
62
|
+
"shipmail": "0.1.33",
|
|
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.2.
|
|
9
|
+
"version": "0.2.10",
|
|
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.2.
|
|
16
|
+
"version": "0.2.10",
|
|
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.2.
|
|
3
|
+
version: 0.2.10
|
|
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
|