Skip to content

Commit 11d9a94

Browse files
authored
create_blast_campaign tool with scheduleSend=false (#34)
1 parent 2f0226c commit 11d9a94

11 files changed

Lines changed: 24 additions & 26 deletions

TOOLS.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
- **activate_triggered_campaign** ✏️✉️: Activate a triggered campaign (requires API triggered campaign activation enabled)
1212
- **archive_campaigns** ✏️: Archive one or more campaigns. Scheduled/recurring campaigns will be cancelled, running campaigns will be aborted.
1313
- **cancel_campaign** ✏️: Cancel a scheduled or recurring campaign
14-
- **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.
14+
- **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.
1515
- **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.
1616
- **deactivate_triggered_campaign** ✏️: Deactivate a triggered campaign (requires API triggered campaign deactivation enabled)
1717
- **get_campaign**: Get detailed information about a specific campaign

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@
7676
},
7777
"dependencies": {
7878
"@alcyone-labs/zod-to-json-schema": "4.0.10",
79-
"@iterable/api": "0.8.0",
79+
"@iterable/api": "0.8.1",
8080
"@modelcontextprotocol/sdk": "1.18.1",
8181
"@primno/dpapi": "2.0.1",
8282
"@types/json-schema": "7.0.15",

pnpm-lock.yaml

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/tool-filter.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export const NON_PII_TOOLS: Set<string> = new Set([
1313
"archive_campaigns",
1414
"bulk_delete_catalog_items",
1515
"cancel_campaign",
16-
"create_and_schedule_campaign",
16+
"create_blast_campaign",
1717
"create_triggered_campaign",
1818
"create_catalog",
1919
"create_list",
@@ -125,7 +125,7 @@ export const SEND_TOOLS: Set<string> = new Set([
125125
"trigger_campaign",
126126
"schedule_campaign",
127127
// Creating a blast campaign schedules a send
128-
"create_and_schedule_campaign",
128+
"create_blast_campaign",
129129
// Triggered campaigns can cause sends upon activation; block unless explicitly allowed
130130
"activate_triggered_campaign",
131131
// Journey triggers enqueue users which may send

src/tools/campaigns.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {
88
ActivateTriggeredCampaignParamsSchema,
99
ArchiveCampaignsParamsSchema,
1010
CancelCampaignParamsSchema,
11-
CreateAndScheduleCampaignParamsSchema,
11+
CreateBlastCampaignParamsSchema,
1212
CreateTriggeredCampaignParamsSchema,
1313
DeactivateTriggeredCampaignParamsSchema,
1414
GetCampaignMetricsParamsSchema,
@@ -46,11 +46,11 @@ export function createCampaignTools(client: IterableClient): Tool[] {
4646
execute: (params) => client.getCampaignMetrics(params),
4747
}),
4848
createTool({
49-
name: "create_and_schedule_campaign",
49+
name: "create_blast_campaign",
5050
description:
51-
"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.",
52-
schema: CreateAndScheduleCampaignParamsSchema,
53-
execute: (params) => client.createAndScheduleCampaign(params),
51+
"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.",
52+
schema: CreateBlastCampaignParamsSchema,
53+
execute: (params) => client.createBlastCampaign(params),
5454
}),
5555
createTool({
5656
name: "create_triggered_campaign",

tests/unit/prompts.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ describe("MCP Prompts", () => {
6161
expect(promptNames).toContain("get-user-by-user-id");
6262
expect(promptNames).toContain("get-campaigns");
6363
expect(promptNames).toContain("get-experiment-metrics");
64-
expect(promptNames).toContain("create-and-schedule-campaign");
64+
expect(promptNames).toContain("create-blast-campaign");
6565
expect(promptNames).toContain("create-triggered-campaign");
6666
expect(promptNames).toContain("get-child-campaigns");
6767
});
@@ -132,7 +132,7 @@ describe("MCP Prompts", () => {
132132
expect(promptNames).toContain("get-campaigns");
133133

134134
// Should NOT include write or send tools
135-
expect(promptNames).not.toContain("create-and-schedule-campaign");
135+
expect(promptNames).not.toContain("create-blast-campaign");
136136
expect(promptNames).not.toContain("update-user");
137137
expect(promptNames).not.toContain("send-email");
138138
expect(promptNames).not.toContain("send-email-template-proof");

tests/unit/send-tools-registry.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ describe("SEND_TOOLS registry", () => {
2828
"send_campaign",
2929
"trigger_campaign",
3030
"schedule_campaign",
31-
"create_and_schedule_campaign",
31+
"create_blast_campaign",
3232
"activate_triggered_campaign",
3333
"trigger_journey",
3434
"track_event",

tests/unit/tool-filter-defaults.test.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ describe("filterTools defaults", () => {
1010
} as any;
1111

1212
const writeTool: any = {
13-
name: "create_and_schedule_campaign", // NOT in READ_ONLY_TOOLS
13+
name: "create_blast_campaign", // NOT in READ_ONLY_TOOLS
1414
description: "",
1515
inputSchema: { type: "object", properties: {} },
1616
handler: async () => ({}),
@@ -26,9 +26,7 @@ describe("filterTools defaults", () => {
2626
})
2727
);
2828
expect(out.map((t) => t.name)).toContain("get_campaigns");
29-
expect(out.map((t) => t.name)).not.toContain(
30-
"create_and_schedule_campaign"
31-
);
29+
expect(out.map((t) => t.name)).not.toContain("create_blast_campaign");
3230
});
3331

3432
it("includes write tools when allowWrites=true", () => {
@@ -40,6 +38,6 @@ describe("filterTools defaults", () => {
4038
allowSends: true,
4139
})
4240
);
43-
expect(out.map((t) => t.name)).toContain("create_and_schedule_campaign");
41+
expect(out.map((t) => t.name)).toContain("create_blast_campaign");
4442
});
4543
});

tests/unit/tool-filter-sends.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ describe("filterTools with allowSends", () => {
1616
mkTool("send_campaign"),
1717
mkTool("trigger_campaign"),
1818
mkTool("schedule_campaign"),
19-
mkTool("create_and_schedule_campaign"),
19+
mkTool("create_blast_campaign"),
2020
mkTool("track_event"),
2121
mkTool("track_bulk_events"),
2222
mkTool("trigger_journey"),
@@ -47,7 +47,7 @@ describe("filterTools with allowSends", () => {
4747
expect(names.has("send_campaign")).toBe(false);
4848
expect(names.has("trigger_campaign")).toBe(false);
4949
expect(names.has("schedule_campaign")).toBe(false);
50-
expect(names.has("create_and_schedule_campaign")).toBe(false);
50+
expect(names.has("create_blast_campaign")).toBe(false);
5151
expect(names.has("track_event")).toBe(false);
5252
expect(names.has("track_bulk_events")).toBe(false);
5353
expect(names.has("trigger_journey")).toBe(false);

tests/unit/tool-filter.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ describe("Tool Filter", () => {
145145
const filteredNames = filteredTools.map((tool) => tool.name);
146146

147147
const writeTools = [
148-
"create_and_schedule_campaign",
148+
"create_blast_campaign",
149149
"create_triggered_campaign",
150150
"update_user",
151151
"delete_user_by_email",

0 commit comments

Comments
 (0)