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 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 | Required | Description |
244
- | ---------------------------------- | -------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
245
- | `SHIPMAIL_API_KEY` | Yes (or `SHIPMAIL_API_KEY_FILE`) | Shipmail API key (`sm_live_...`). |
246
- | `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`). |
247
- | `SHIPMAIL_BASE_URL` | No | Override the API base URL. Must be https on a `shipmail.to` host. Defaults to `https://shipmail.to/api/v1`. |
248
- | `SHIPMAIL_MCP_TOOLS` | No | Comma-separated tool allowlist. The `--tools` flag overrides this. |
249
- | `SHIPMAIL_ALLOW_INSECURE_BASE_URL` | No | Set to `1` to permit a non-https or non-`shipmail.to` base URL. Local development only. |
250
- | `SHIPMAIL_MCP_DEBUG` | No | Set to `1` to include `request_id` and `status` in stderr tool-call logs. |
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
- mailbox: await client.mailboxes.create(stripIdempotencyKey(args), mutationOptions(args))
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.9";
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.9",
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.32",
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",
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.9",
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.9
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