diff --git a/TOOLS.md b/TOOLS.md index 8d4bc61..41c8379 100644 --- a/TOOLS.md +++ b/TOOLS.md @@ -11,7 +11,7 @@ - **activate_triggered_campaign** ✏️✉️: Activate a triggered campaign (requires API triggered campaign activation enabled) - **archive_campaigns** ✏️: Archive one or more campaigns. Scheduled/recurring campaigns will be cancelled, running campaigns will be aborted. - **cancel_campaign** ✏️: Cancel a scheduled or recurring campaign -- **create_and_schedule_campaign** ✏️✉️: Create a new blast campaign from an existing template and schedule it for delivery. The campaign is created in Scheduled state and will be sent to the specified lists at the given sendAt time. +- **create_blast_campaign** ✏️✉️: Create a new blast campaign from an existing template. By default, the campaign is created without being scheduled. Set scheduleSend to true to immediately schedule it for delivery at the given sendAt time. - **create_triggered_campaign** ✏️: Create a new triggered campaign from an existing template. The campaign is created in Ready state and must be activated before it can send. - **deactivate_triggered_campaign** ✏️: Deactivate a triggered campaign (requires API triggered campaign deactivation enabled) - **get_campaign**: Get detailed information about a specific campaign diff --git a/package.json b/package.json index aac059e..8a02a62 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,7 @@ }, "dependencies": { "@alcyone-labs/zod-to-json-schema": "4.0.10", - "@iterable/api": "0.8.0", + "@iterable/api": "0.8.1", "@modelcontextprotocol/sdk": "1.18.1", "@primno/dpapi": "2.0.1", "@types/json-schema": "7.0.15", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e7df3b2..e7310e7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,8 +12,8 @@ importers: specifier: 4.0.10 version: 4.0.10(zod@4.1.11) '@iterable/api': - specifier: 0.8.0 - version: 0.8.0(typescript@5.9.3) + specifier: 0.8.1 + version: 0.8.1(typescript@5.9.3) '@modelcontextprotocol/sdk': specifier: 1.18.1 version: 1.18.1 @@ -654,8 +654,8 @@ packages: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} - '@iterable/api@0.8.0': - resolution: {integrity: sha512-ACiQVZXddSibRQoEzwp6eLgS91MVHjAsnszbMYyR0ChOmnzG02Nz3OsroDpr7z/dFCHCNgujPHc8cQ0rl2183g==} + '@iterable/api@0.8.1': + resolution: {integrity: sha512-dPvd7RVnTC7uLqY1m0/0Mepo79Dv4/0sfGqT+X/qVGEMcpgWTnkO0iMT0c7DMyggzRsWHCA3OVT05rpnKbnueg==} engines: {node: '>=18.0.0'} '@jest/console@30.2.0': @@ -3260,7 +3260,7 @@ snapshots: '@istanbuljs/schema@0.1.3': {} - '@iterable/api@0.8.0(typescript@5.9.3)': + '@iterable/api@0.8.1(typescript@5.9.3)': dependencies: '@t3-oss/env-core': 0.13.8(typescript@5.9.3)(zod@4.1.11) axios: 1.13.2 diff --git a/src/tool-filter.ts b/src/tool-filter.ts index 8d6864a..1549450 100644 --- a/src/tool-filter.ts +++ b/src/tool-filter.ts @@ -13,7 +13,7 @@ export const NON_PII_TOOLS: Set = new Set([ "archive_campaigns", "bulk_delete_catalog_items", "cancel_campaign", - "create_and_schedule_campaign", + "create_blast_campaign", "create_triggered_campaign", "create_catalog", "create_list", @@ -125,7 +125,7 @@ export const SEND_TOOLS: Set = new Set([ "trigger_campaign", "schedule_campaign", // Creating a blast campaign schedules a send - "create_and_schedule_campaign", + "create_blast_campaign", // Triggered campaigns can cause sends upon activation; block unless explicitly allowed "activate_triggered_campaign", // Journey triggers enqueue users which may send diff --git a/src/tools/campaigns.ts b/src/tools/campaigns.ts index 47d9046..9647054 100644 --- a/src/tools/campaigns.ts +++ b/src/tools/campaigns.ts @@ -8,7 +8,7 @@ import { ActivateTriggeredCampaignParamsSchema, ArchiveCampaignsParamsSchema, CancelCampaignParamsSchema, - CreateAndScheduleCampaignParamsSchema, + CreateBlastCampaignParamsSchema, CreateTriggeredCampaignParamsSchema, DeactivateTriggeredCampaignParamsSchema, GetCampaignMetricsParamsSchema, @@ -46,11 +46,11 @@ export function createCampaignTools(client: IterableClient): Tool[] { execute: (params) => client.getCampaignMetrics(params), }), createTool({ - name: "create_and_schedule_campaign", + name: "create_blast_campaign", description: - "Create a new blast campaign from an existing template and schedule it for delivery. The campaign is created in Scheduled state and will be sent to the specified lists at the given sendAt time.", - schema: CreateAndScheduleCampaignParamsSchema, - execute: (params) => client.createAndScheduleCampaign(params), + "Create a new blast campaign from an existing template. By default, the campaign is created without being scheduled. Set scheduleSend to true to immediately schedule it for delivery at the given sendAt time.", + schema: CreateBlastCampaignParamsSchema, + execute: (params) => client.createBlastCampaign(params), }), createTool({ name: "create_triggered_campaign", diff --git a/tests/unit/prompts.test.ts b/tests/unit/prompts.test.ts index 23428f9..1e1bab4 100644 --- a/tests/unit/prompts.test.ts +++ b/tests/unit/prompts.test.ts @@ -61,7 +61,7 @@ describe("MCP Prompts", () => { expect(promptNames).toContain("get-user-by-user-id"); expect(promptNames).toContain("get-campaigns"); expect(promptNames).toContain("get-experiment-metrics"); - expect(promptNames).toContain("create-and-schedule-campaign"); + expect(promptNames).toContain("create-blast-campaign"); expect(promptNames).toContain("create-triggered-campaign"); expect(promptNames).toContain("get-child-campaigns"); }); @@ -132,7 +132,7 @@ describe("MCP Prompts", () => { expect(promptNames).toContain("get-campaigns"); // Should NOT include write or send tools - expect(promptNames).not.toContain("create-and-schedule-campaign"); + expect(promptNames).not.toContain("create-blast-campaign"); expect(promptNames).not.toContain("update-user"); expect(promptNames).not.toContain("send-email"); expect(promptNames).not.toContain("send-email-template-proof"); diff --git a/tests/unit/send-tools-registry.test.ts b/tests/unit/send-tools-registry.test.ts index dd32258..bd99f75 100644 --- a/tests/unit/send-tools-registry.test.ts +++ b/tests/unit/send-tools-registry.test.ts @@ -28,7 +28,7 @@ describe("SEND_TOOLS registry", () => { "send_campaign", "trigger_campaign", "schedule_campaign", - "create_and_schedule_campaign", + "create_blast_campaign", "activate_triggered_campaign", "trigger_journey", "track_event", diff --git a/tests/unit/tool-filter-defaults.test.ts b/tests/unit/tool-filter-defaults.test.ts index 71b10ae..4d157bf 100644 --- a/tests/unit/tool-filter-defaults.test.ts +++ b/tests/unit/tool-filter-defaults.test.ts @@ -10,7 +10,7 @@ describe("filterTools defaults", () => { } as any; const writeTool: any = { - name: "create_and_schedule_campaign", // NOT in READ_ONLY_TOOLS + name: "create_blast_campaign", // NOT in READ_ONLY_TOOLS description: "", inputSchema: { type: "object", properties: {} }, handler: async () => ({}), @@ -26,9 +26,7 @@ describe("filterTools defaults", () => { }) ); expect(out.map((t) => t.name)).toContain("get_campaigns"); - expect(out.map((t) => t.name)).not.toContain( - "create_and_schedule_campaign" - ); + expect(out.map((t) => t.name)).not.toContain("create_blast_campaign"); }); it("includes write tools when allowWrites=true", () => { @@ -40,6 +38,6 @@ describe("filterTools defaults", () => { allowSends: true, }) ); - expect(out.map((t) => t.name)).toContain("create_and_schedule_campaign"); + expect(out.map((t) => t.name)).toContain("create_blast_campaign"); }); }); diff --git a/tests/unit/tool-filter-sends.test.ts b/tests/unit/tool-filter-sends.test.ts index add2d47..eff86fc 100644 --- a/tests/unit/tool-filter-sends.test.ts +++ b/tests/unit/tool-filter-sends.test.ts @@ -16,7 +16,7 @@ describe("filterTools with allowSends", () => { mkTool("send_campaign"), mkTool("trigger_campaign"), mkTool("schedule_campaign"), - mkTool("create_and_schedule_campaign"), + mkTool("create_blast_campaign"), mkTool("track_event"), mkTool("track_bulk_events"), mkTool("trigger_journey"), @@ -47,7 +47,7 @@ describe("filterTools with allowSends", () => { expect(names.has("send_campaign")).toBe(false); expect(names.has("trigger_campaign")).toBe(false); expect(names.has("schedule_campaign")).toBe(false); - expect(names.has("create_and_schedule_campaign")).toBe(false); + expect(names.has("create_blast_campaign")).toBe(false); expect(names.has("track_event")).toBe(false); expect(names.has("track_bulk_events")).toBe(false); expect(names.has("trigger_journey")).toBe(false); diff --git a/tests/unit/tool-filter.test.ts b/tests/unit/tool-filter.test.ts index ee80201..3155113 100644 --- a/tests/unit/tool-filter.test.ts +++ b/tests/unit/tool-filter.test.ts @@ -145,7 +145,7 @@ describe("Tool Filter", () => { const filteredNames = filteredTools.map((tool) => tool.name); const writeTools = [ - "create_and_schedule_campaign", + "create_blast_campaign", "create_triggered_campaign", "update_user", "delete_user_by_email", diff --git a/tests/unit/tools.test.ts b/tests/unit/tools.test.ts index bc08d62..221de8b 100644 --- a/tests/unit/tools.test.ts +++ b/tests/unit/tools.test.ts @@ -21,7 +21,7 @@ const EXPECTED_TOOLS = [ "cancel_sms", "cancel_web_push", "cancel_whatsapp", - "create_and_schedule_campaign", + "create_blast_campaign", "create_triggered_campaign", "create_catalog", "create_list",