@migma/mcp 1.1.2 → 1.3.1
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/build/client.d.ts.map +1 -1
- package/build/client.js +3 -1
- package/build/client.js.map +1 -1
- package/build/config.d.ts.map +1 -1
- package/build/config.js +22 -4
- package/build/config.js.map +1 -1
- package/build/index.d.ts +1 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +14 -11
- package/build/index.js.map +1 -1
- package/build/permissions.d.ts +2 -0
- package/build/permissions.d.ts.map +1 -0
- package/build/permissions.js +17 -0
- package/build/permissions.js.map +1 -0
- package/build/prompts/index.d.ts.map +1 -1
- package/build/prompts/index.js +4 -3
- package/build/prompts/index.js.map +1 -1
- package/build/tools/__tests__/catalog.test.js +20 -9
- package/build/tools/__tests__/catalog.test.js.map +1 -1
- package/build/tools/campaigns.d.ts +1 -1
- package/build/tools/campaigns.d.ts.map +1 -1
- package/build/tools/campaigns.js +244 -222
- package/build/tools/campaigns.js.map +1 -1
- package/build/tools/capabilities.d.ts.map +1 -1
- package/build/tools/capabilities.js +14 -5
- package/build/tools/capabilities.js.map +1 -1
- package/build/tools/contacts.d.ts +1 -1
- package/build/tools/contacts.d.ts.map +1 -1
- package/build/tools/contacts.js +356 -156
- package/build/tools/contacts.js.map +1 -1
- package/build/tools/domains.d.ts +1 -1
- package/build/tools/domains.d.ts.map +1 -1
- package/build/tools/domains.js +98 -96
- package/build/tools/domains.js.map +1 -1
- package/build/tools/export.d.ts +1 -1
- package/build/tools/export.d.ts.map +1 -1
- package/build/tools/export.js +97 -78
- package/build/tools/export.js.map +1 -1
- package/build/tools/generate.d.ts +1 -1
- package/build/tools/generate.d.ts.map +1 -1
- package/build/tools/generate.js +217 -109
- package/build/tools/generate.js.map +1 -1
- package/build/tools/metrics.d.ts +4 -0
- package/build/tools/metrics.d.ts.map +1 -0
- package/build/tools/metrics.js +39 -0
- package/build/tools/metrics.js.map +1 -0
- package/build/tools/projects.d.ts +1 -1
- package/build/tools/projects.d.ts.map +1 -1
- package/build/tools/projects.js +95 -77
- package/build/tools/projects.js.map +1 -1
- package/build/tools/segments.d.ts +1 -1
- package/build/tools/segments.d.ts.map +1 -1
- package/build/tools/segments.js +91 -67
- package/build/tools/segments.js.map +1 -1
- package/build/tools/send.d.ts +1 -1
- package/build/tools/send.d.ts.map +1 -1
- package/build/tools/send.js +72 -69
- package/build/tools/send.js.map +1 -1
- package/build/tools/tags.d.ts +1 -1
- package/build/tools/tags.d.ts.map +1 -1
- package/build/tools/tags.js +77 -69
- package/build/tools/tags.js.map +1 -1
- package/build/tools/validate.d.ts +1 -1
- package/build/tools/validate.d.ts.map +1 -1
- package/build/tools/validate.js +54 -44
- package/build/tools/validate.js.map +1 -1
- package/build/tools/webhooks.d.ts +1 -1
- package/build/tools/webhooks.d.ts.map +1 -1
- package/build/tools/webhooks.js +67 -57
- package/build/tools/webhooks.js.map +1 -1
- package/package.json +2 -2
package/build/tools/campaigns.js
CHANGED
|
@@ -1,227 +1,249 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
description: "Create a campaign from a generated email. Use emailId for the exact email, especially series slots. The campaign starts in draft status; use migma_send_campaign or migma_schedule_campaign to send it.",
|
|
39
|
-
inputSchema: z.object({
|
|
40
|
-
projectId: z
|
|
41
|
-
.string()
|
|
42
|
-
.optional()
|
|
43
|
-
.describe("Project ID. Local stdio uses MIGMA_PROJECT_ID if not provided; hosted remote clients should pass projectId."),
|
|
44
|
-
name: z.string().describe("Campaign name"),
|
|
45
|
-
conversationId: z
|
|
46
|
-
.string()
|
|
47
|
-
.describe("Conversation ID that owns the generated email"),
|
|
48
|
-
emailId: z
|
|
49
|
-
.string()
|
|
50
|
-
.optional()
|
|
51
|
-
.describe("Generated email ID from result.emails[].emailId. Recommended for series slots."),
|
|
52
|
-
subject: z
|
|
53
|
-
.string()
|
|
54
|
-
.optional()
|
|
55
|
-
.describe("Email subject (auto-populated from conversation if omitted)"),
|
|
56
|
-
preheaderText: z.string().optional().describe("Preheader text"),
|
|
57
|
-
from: z.string().describe("Sender email address (e.g. hello@yourbrand.migma.email)"),
|
|
58
|
-
fromName: z.string().describe("Sender display name"),
|
|
59
|
-
replyTo: z.string().optional().describe("Reply-to email address"),
|
|
60
|
-
recipientType: z
|
|
61
|
-
.enum(["audience", "tag"])
|
|
62
|
-
.describe("Send to a segment (audience) or a tag"),
|
|
63
|
-
recipientId: z.string().describe("Segment or tag ID"),
|
|
64
|
-
topicId: z.string().optional().describe("Topic ID for preference filtering"),
|
|
65
|
-
providerType: z
|
|
66
|
-
.enum(["ses", "resend", "sendgrid", "mailgun", "migma"])
|
|
67
|
-
.optional()
|
|
68
|
-
.describe("Email provider (default: migma)"),
|
|
69
|
-
idempotency_key: z
|
|
70
|
-
.string()
|
|
71
|
-
.max(100)
|
|
72
|
-
.optional()
|
|
73
|
-
.describe("Optional Idempotency-Key for safe retries; same key+body within 24h replays the original result."),
|
|
74
|
-
}),
|
|
75
|
-
}, async (args) => {
|
|
76
|
-
const projectId = args.projectId || config.projectId;
|
|
77
|
-
if (!projectId) {
|
|
78
|
-
return toolError("projectId is required. Provide projectId, or set MIGMA_PROJECT_ID when using local stdio.");
|
|
79
|
-
}
|
|
80
|
-
const params = {
|
|
81
|
-
projectId,
|
|
82
|
-
name: args.name,
|
|
83
|
-
conversationId: args.conversationId,
|
|
84
|
-
emailId: args.emailId,
|
|
85
|
-
subject: args.subject,
|
|
86
|
-
preheaderText: args.preheaderText,
|
|
87
|
-
from: args.from,
|
|
88
|
-
fromName: args.fromName,
|
|
89
|
-
replyTo: args.replyTo,
|
|
90
|
-
recipientType: args.recipientType,
|
|
91
|
-
recipientId: args.recipientId,
|
|
92
|
-
topicId: args.topicId,
|
|
93
|
-
providerType: args.providerType,
|
|
94
|
-
};
|
|
95
|
-
const { data, error } = await client.campaigns.create(params, args.idempotency_key ? { idempotencyKey: args.idempotency_key } : undefined);
|
|
96
|
-
if (error)
|
|
97
|
-
return toolError(error.message);
|
|
98
|
-
return toolResult(data);
|
|
99
|
-
});
|
|
100
|
-
server.registerTool("migma_send_campaign", {
|
|
101
|
-
title: "Send Campaign",
|
|
102
|
-
description: "Send a draft or scheduled campaign immediately. The campaign must be in 'draft' or 'scheduled' status.",
|
|
103
|
-
inputSchema: z.object({
|
|
104
|
-
campaignId: z.string().describe("Campaign ID to send"),
|
|
105
|
-
idempotency_key: z
|
|
106
|
-
.string()
|
|
107
|
-
.max(100)
|
|
108
|
-
.optional()
|
|
109
|
-
.describe("Optional Idempotency-Key for safe retries; same key+body within 24h replays the original result."),
|
|
110
|
-
}),
|
|
111
|
-
}, async (args) => {
|
|
112
|
-
const { data, error } = await client.campaigns.send(args.campaignId, args.idempotency_key ? { idempotencyKey: args.idempotency_key } : undefined);
|
|
113
|
-
if (error)
|
|
114
|
-
return toolError(error.message);
|
|
115
|
-
return toolResult(data);
|
|
116
|
-
});
|
|
117
|
-
server.registerTool("migma_schedule_campaign", {
|
|
118
|
-
title: "Schedule Campaign",
|
|
119
|
-
description: "Schedule a campaign for future delivery. The scheduledAt time must be in the future.",
|
|
120
|
-
inputSchema: z.object({
|
|
121
|
-
campaignId: z.string().describe("Campaign ID to schedule"),
|
|
122
|
-
scheduledAt: z
|
|
123
|
-
.string()
|
|
124
|
-
.describe("ISO 8601 datetime for sending (e.g. 2026-03-15T14:00:00Z)"),
|
|
125
|
-
scheduledTimezone: z
|
|
126
|
-
.string()
|
|
127
|
-
.optional()
|
|
128
|
-
.describe("IANA timezone (e.g. America/New_York). Defaults to UTC."),
|
|
129
|
-
idempotency_key: z
|
|
130
|
-
.string()
|
|
131
|
-
.max(100)
|
|
132
|
-
.optional()
|
|
133
|
-
.describe("Optional Idempotency-Key for safe retries; same key+body within 24h replays the original result."),
|
|
134
|
-
}),
|
|
135
|
-
}, async (args) => {
|
|
136
|
-
const { data, error } = await client.campaigns.schedule(args.campaignId, {
|
|
137
|
-
scheduledAt: args.scheduledAt,
|
|
138
|
-
scheduledTimezone: args.scheduledTimezone,
|
|
139
|
-
}, args.idempotency_key ? { idempotencyKey: args.idempotency_key } : undefined);
|
|
140
|
-
if (error)
|
|
141
|
-
return toolError(error.message);
|
|
142
|
-
return toolResult(data);
|
|
143
|
-
});
|
|
144
|
-
server.registerTool("migma_get_campaign_stats", {
|
|
145
|
-
title: "Get Campaign Stats",
|
|
146
|
-
description: "Aggregated engagement metrics for a campaign: totalSent, totalDelivered, uniqueOpens/totalOpens, uniqueClicks/totalClicks, unsubscribes, bounces, openRate, clickRate (0-100), and lastUpdated. May include botOpens/botClicks/mppOpens (Apple Mail Privacy Protection and bot detection) when available. Stats are sourced from the tracking worker and may be cached or slightly stale.",
|
|
147
|
-
inputSchema: z.object({
|
|
148
|
-
campaignId: z.string().describe("Campaign ID to fetch stats for"),
|
|
149
|
-
}),
|
|
150
|
-
}, async (args) => {
|
|
151
|
-
const { data, error } = await client.campaigns.stats(args.campaignId);
|
|
152
|
-
if (error)
|
|
153
|
-
return toolError(error.message);
|
|
154
|
-
return toolResult(data);
|
|
155
|
-
});
|
|
156
|
-
server.registerTool("migma_get_campaign_logs", {
|
|
157
|
-
title: "Get Campaign Logs",
|
|
158
|
-
description: "Per-recipient delivery logs for a campaign, cursor-paginated. Each row comes straight from the tracking worker's D1 table, so fields are snake_case: to_email, from_email, subject, status, opened_at, clicked_at, open_count, click_count, bounce_type, complaint_type, suppression_type, created_at. Returns { emails, nextCursor, hasMore }.",
|
|
159
|
-
inputSchema: z.object({
|
|
160
|
-
campaignId: z.string().describe("Campaign ID to fetch logs for"),
|
|
161
|
-
limit: z
|
|
162
|
-
.number()
|
|
163
|
-
.int()
|
|
164
|
-
.min(1)
|
|
165
|
-
.max(100)
|
|
166
|
-
.optional()
|
|
167
|
-
.describe("Max rows per page (default 20, capped at 100)"),
|
|
168
|
-
cursor: z
|
|
169
|
-
.string()
|
|
170
|
-
.optional()
|
|
171
|
-
.describe("Pagination cursor from a previous response's nextCursor"),
|
|
172
|
-
status: z
|
|
173
|
-
.enum(["delivered", "opened", "clicked", "bounced", "spam_report"])
|
|
174
|
-
.optional()
|
|
175
|
-
.describe("Filter rows by delivery/engagement status"),
|
|
176
|
-
}),
|
|
177
|
-
}, async (args) => {
|
|
178
|
-
const { data, error } = await client.campaigns.logs(args.campaignId, {
|
|
179
|
-
limit: args.limit,
|
|
180
|
-
cursor: args.cursor,
|
|
181
|
-
status: args.status,
|
|
2
|
+
import { canUse } from "../permissions.js";
|
|
3
|
+
export function registerCampaignTools(server, client, config, grantedPermissions) {
|
|
4
|
+
if (canUse(grantedPermissions, ["campaign:read"])) {
|
|
5
|
+
server.registerTool("migma_list_campaigns", {
|
|
6
|
+
title: "List Campaigns",
|
|
7
|
+
description: "List audience sends for a project (draft/scheduled/sent campaigns). These are not email designs. An empty list means nothing has been sent or queued to contacts — designed emails still live in migma_list_emails. Filter by status: draft, pending_review, scheduled, sending, throttled, ab_testing, sent, failed, cancelled.",
|
|
8
|
+
annotations: { readOnlyHint: true },
|
|
9
|
+
inputSchema: z.object({
|
|
10
|
+
projectId: z
|
|
11
|
+
.string()
|
|
12
|
+
.optional()
|
|
13
|
+
.describe("Project ID. Local stdio uses MIGMA_PROJECT_ID if not provided; hosted remote clients should pass projectId."),
|
|
14
|
+
status: z
|
|
15
|
+
.enum(["draft", "pending_review", "scheduled", "sending", "throttled", "ab_testing", "sent", "failed", "cancelled"])
|
|
16
|
+
.optional()
|
|
17
|
+
.describe("Filter by campaign status"),
|
|
18
|
+
page: z.number().optional().describe("Page number (default 1)"),
|
|
19
|
+
limit: z.number().optional().describe("Results per page (default 20)"),
|
|
20
|
+
archived: z.boolean().optional().describe("Set to true to show only archived campaigns"),
|
|
21
|
+
}),
|
|
22
|
+
}, async (args) => {
|
|
23
|
+
const projectId = args.projectId || config.projectId;
|
|
24
|
+
if (!projectId) {
|
|
25
|
+
return toolError("projectId is required. Provide projectId, or set MIGMA_PROJECT_ID when using local stdio.");
|
|
26
|
+
}
|
|
27
|
+
const listParams = {
|
|
28
|
+
projectId,
|
|
29
|
+
status: args.status,
|
|
30
|
+
page: args.page,
|
|
31
|
+
limit: args.limit,
|
|
32
|
+
archived: args.archived,
|
|
33
|
+
};
|
|
34
|
+
const { data, error } = await client.campaigns.list(listParams);
|
|
35
|
+
if (error)
|
|
36
|
+
return toolError(error.message);
|
|
37
|
+
return toolResult(data);
|
|
182
38
|
});
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
39
|
+
}
|
|
40
|
+
if (canUse(grantedPermissions, ["campaign:write"])) {
|
|
41
|
+
server.registerTool("migma_create_campaign", {
|
|
42
|
+
title: "Create Campaign",
|
|
43
|
+
description: "Create a campaign from a generated email. Use emailId for the exact email, especially series slots. The campaign starts in draft status; use migma_send_campaign or migma_schedule_campaign to send it.",
|
|
44
|
+
inputSchema: z.object({
|
|
45
|
+
projectId: z
|
|
46
|
+
.string()
|
|
47
|
+
.optional()
|
|
48
|
+
.describe("Project ID. Local stdio uses MIGMA_PROJECT_ID if not provided; hosted remote clients should pass projectId."),
|
|
49
|
+
name: z.string().describe("Campaign name"),
|
|
50
|
+
conversationId: z
|
|
51
|
+
.string()
|
|
52
|
+
.describe("Conversation ID that owns the generated email"),
|
|
53
|
+
emailId: z
|
|
54
|
+
.string()
|
|
55
|
+
.optional()
|
|
56
|
+
.describe("Generated email ID from result.emails[].emailId. Recommended for series slots."),
|
|
57
|
+
subject: z
|
|
58
|
+
.string()
|
|
59
|
+
.optional()
|
|
60
|
+
.describe("Email subject (auto-populated from conversation if omitted)"),
|
|
61
|
+
preheaderText: z.string().optional().describe("Preheader text"),
|
|
62
|
+
from: z.string().describe("Sender email address (e.g. hello@yourbrand.migma.email)"),
|
|
63
|
+
fromName: z.string().describe("Sender display name"),
|
|
64
|
+
replyTo: z.string().optional().describe("Reply-to email address"),
|
|
65
|
+
recipientType: z
|
|
66
|
+
.enum(["audience", "tag"])
|
|
67
|
+
.describe("Send to a segment (audience) or a tag"),
|
|
68
|
+
recipientId: z.string().describe("Segment or tag ID"),
|
|
69
|
+
topicId: z.string().optional().describe("Topic ID for preference filtering"),
|
|
70
|
+
providerType: z
|
|
71
|
+
.enum(["ses", "resend", "sendgrid", "mailgun", "migma"])
|
|
72
|
+
.optional()
|
|
73
|
+
.describe("Email provider (default: migma)"),
|
|
74
|
+
idempotency_key: z
|
|
75
|
+
.string()
|
|
76
|
+
.max(100)
|
|
77
|
+
.optional()
|
|
78
|
+
.describe("Optional Idempotency-Key for safe retries; same key+body within 24h replays the original result."),
|
|
79
|
+
}),
|
|
80
|
+
}, async (args) => {
|
|
81
|
+
const projectId = args.projectId || config.projectId;
|
|
82
|
+
if (!projectId) {
|
|
83
|
+
return toolError("projectId is required. Provide projectId, or set MIGMA_PROJECT_ID when using local stdio.");
|
|
84
|
+
}
|
|
85
|
+
const params = {
|
|
86
|
+
projectId,
|
|
87
|
+
name: args.name,
|
|
88
|
+
conversationId: args.conversationId,
|
|
89
|
+
emailId: args.emailId,
|
|
90
|
+
subject: args.subject,
|
|
91
|
+
preheaderText: args.preheaderText,
|
|
92
|
+
from: args.from,
|
|
93
|
+
fromName: args.fromName,
|
|
94
|
+
replyTo: args.replyTo,
|
|
95
|
+
recipientType: args.recipientType,
|
|
96
|
+
recipientId: args.recipientId,
|
|
97
|
+
topicId: args.topicId,
|
|
98
|
+
providerType: args.providerType,
|
|
99
|
+
};
|
|
100
|
+
const { data, error } = await client.campaigns.create(params, args.idempotency_key ? { idempotencyKey: args.idempotency_key } : undefined);
|
|
101
|
+
if (error)
|
|
102
|
+
return toolError(error.message);
|
|
103
|
+
return toolResult(data);
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
if (canUse(grantedPermissions, ["campaign:write"])) {
|
|
107
|
+
server.registerTool("migma_send_campaign", {
|
|
108
|
+
title: "Send Campaign",
|
|
109
|
+
description: "Send a draft or scheduled campaign immediately. The campaign must be in 'draft' or 'scheduled' status.",
|
|
110
|
+
inputSchema: z.object({
|
|
111
|
+
campaignId: z.string().describe("Campaign ID to send"),
|
|
112
|
+
idempotency_key: z
|
|
113
|
+
.string()
|
|
114
|
+
.max(100)
|
|
115
|
+
.optional()
|
|
116
|
+
.describe("Optional Idempotency-Key for safe retries; same key+body within 24h replays the original result."),
|
|
117
|
+
}),
|
|
118
|
+
}, async (args) => {
|
|
119
|
+
const { data, error } = await client.campaigns.send(args.campaignId, args.idempotency_key ? { idempotencyKey: args.idempotency_key } : undefined);
|
|
120
|
+
if (error)
|
|
121
|
+
return toolError(error.message);
|
|
122
|
+
return toolResult(data);
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
if (canUse(grantedPermissions, ["campaign:write"])) {
|
|
126
|
+
server.registerTool("migma_schedule_campaign", {
|
|
127
|
+
title: "Schedule Campaign",
|
|
128
|
+
description: "Schedule a campaign for future delivery. The scheduledAt time must be in the future.",
|
|
129
|
+
inputSchema: z.object({
|
|
130
|
+
campaignId: z.string().describe("Campaign ID to schedule"),
|
|
131
|
+
scheduledAt: z
|
|
132
|
+
.string()
|
|
133
|
+
.describe("ISO 8601 datetime for sending (e.g. 2026-03-15T14:00:00Z)"),
|
|
134
|
+
scheduledTimezone: z
|
|
135
|
+
.string()
|
|
136
|
+
.optional()
|
|
137
|
+
.describe("IANA timezone (e.g. America/New_York). Defaults to UTC."),
|
|
138
|
+
idempotency_key: z
|
|
139
|
+
.string()
|
|
140
|
+
.max(100)
|
|
141
|
+
.optional()
|
|
142
|
+
.describe("Optional Idempotency-Key for safe retries; same key+body within 24h replays the original result."),
|
|
143
|
+
}),
|
|
144
|
+
}, async (args) => {
|
|
145
|
+
const { data, error } = await client.campaigns.schedule(args.campaignId, {
|
|
146
|
+
scheduledAt: args.scheduledAt,
|
|
147
|
+
scheduledTimezone: args.scheduledTimezone,
|
|
148
|
+
}, args.idempotency_key ? { idempotencyKey: args.idempotency_key } : undefined);
|
|
149
|
+
if (error)
|
|
150
|
+
return toolError(error.message);
|
|
151
|
+
return toolResult(data);
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
if (canUse(grantedPermissions, ["campaign:read"])) {
|
|
155
|
+
server.registerTool("migma_get_campaign_stats", {
|
|
156
|
+
title: "Get Campaign Stats",
|
|
157
|
+
description: "Aggregated engagement metrics for a campaign: totalSent, totalDelivered, uniqueOpens/totalOpens, uniqueClicks/totalClicks, unsubscribes, bounces, openRate, clickRate (0-100), and lastUpdated. May include botOpens/botClicks/mppOpens (Apple Mail Privacy Protection and bot detection) when available. Stats are sourced from the tracking worker and may be cached or slightly stale.",
|
|
158
|
+
annotations: { readOnlyHint: true },
|
|
159
|
+
inputSchema: z.object({
|
|
160
|
+
campaignId: z.string().describe("Campaign ID to fetch stats for"),
|
|
161
|
+
}),
|
|
162
|
+
}, async (args) => {
|
|
163
|
+
const { data, error } = await client.campaigns.stats(args.campaignId);
|
|
164
|
+
if (error)
|
|
165
|
+
return toolError(error.message);
|
|
166
|
+
return toolResult(data);
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
if (canUse(grantedPermissions, ["campaign:read"])) {
|
|
170
|
+
server.registerTool("migma_get_campaign_logs", {
|
|
171
|
+
title: "Get Campaign Logs",
|
|
172
|
+
description: "Per-recipient delivery logs for a campaign, cursor-paginated. Each row comes straight from the tracking worker's D1 table, so fields are snake_case: to_email, from_email, subject, status, opened_at, clicked_at, open_count, click_count, bounce_type, complaint_type, suppression_type, created_at. Returns { emails, nextCursor, hasMore }.",
|
|
173
|
+
annotations: { readOnlyHint: true },
|
|
174
|
+
inputSchema: z.object({
|
|
175
|
+
campaignId: z.string().describe("Campaign ID to fetch logs for"),
|
|
176
|
+
limit: z
|
|
177
|
+
.number()
|
|
178
|
+
.int()
|
|
179
|
+
.min(1)
|
|
180
|
+
.max(100)
|
|
181
|
+
.optional()
|
|
182
|
+
.describe("Max rows per page (default 20, capped at 100)"),
|
|
183
|
+
cursor: z
|
|
184
|
+
.string()
|
|
185
|
+
.optional()
|
|
186
|
+
.describe("Pagination cursor from a previous response's nextCursor"),
|
|
187
|
+
status: z
|
|
188
|
+
.enum(["delivered", "opened", "clicked", "bounced", "complained"])
|
|
189
|
+
.optional()
|
|
190
|
+
.describe("Filter rows by delivery/engagement status"),
|
|
191
|
+
}),
|
|
192
|
+
}, async (args) => {
|
|
193
|
+
const { data, error } = await client.campaigns.logs(args.campaignId, {
|
|
194
|
+
limit: args.limit,
|
|
195
|
+
cursor: args.cursor,
|
|
196
|
+
status: args.status,
|
|
197
|
+
});
|
|
198
|
+
if (error)
|
|
199
|
+
return toolError(error.message);
|
|
200
|
+
return toolResult(data);
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
if (canUse(grantedPermissions, ["campaign:write"])) {
|
|
204
|
+
server.registerTool("migma_cancel_campaign", {
|
|
205
|
+
title: "Cancel Campaign",
|
|
206
|
+
description: "Cancel a scheduled campaign. Only campaigns with 'scheduled' status can be cancelled.",
|
|
207
|
+
inputSchema: z.object({
|
|
208
|
+
campaignId: z.string().describe("Campaign ID to cancel"),
|
|
209
|
+
}),
|
|
210
|
+
}, async (args) => {
|
|
211
|
+
const { data, error } = await client.campaigns.cancel(args.campaignId);
|
|
212
|
+
if (error)
|
|
213
|
+
return toolError(error.message);
|
|
214
|
+
return toolResult(data);
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
if (canUse(grantedPermissions, ["campaign:write"])) {
|
|
218
|
+
server.registerTool("migma_archive_campaign", {
|
|
219
|
+
title: "Archive Campaign",
|
|
220
|
+
description: "Archive a campaign to hide it from the default list. Works for any status.",
|
|
221
|
+
inputSchema: z.object({
|
|
222
|
+
campaignId: z.string().describe("Campaign ID to archive"),
|
|
223
|
+
}),
|
|
224
|
+
}, async (args) => {
|
|
225
|
+
const campaigns = client.campaigns;
|
|
226
|
+
const { data, error } = await campaigns.archive(args.campaignId);
|
|
227
|
+
if (error)
|
|
228
|
+
return toolError(error.message);
|
|
229
|
+
return toolResult(data);
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
if (canUse(grantedPermissions, ["campaign:write"])) {
|
|
233
|
+
server.registerTool("migma_unarchive_campaign", {
|
|
234
|
+
title: "Unarchive Campaign",
|
|
235
|
+
description: "Unarchive a previously archived campaign, restoring it to the default list.",
|
|
236
|
+
inputSchema: z.object({
|
|
237
|
+
campaignId: z.string().describe("Campaign ID to unarchive"),
|
|
238
|
+
}),
|
|
239
|
+
}, async (args) => {
|
|
240
|
+
const campaigns = client.campaigns;
|
|
241
|
+
const { data, error } = await campaigns.unarchive(args.campaignId);
|
|
242
|
+
if (error)
|
|
243
|
+
return toolError(error.message);
|
|
244
|
+
return toolResult(data);
|
|
245
|
+
});
|
|
246
|
+
}
|
|
225
247
|
}
|
|
226
248
|
function toolResult(data) {
|
|
227
249
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"campaigns.js","sourceRoot":"","sources":["../../src/tools/campaigns.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"campaigns.js","sourceRoot":"","sources":["../../src/tools/campaigns.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../src/tools/capabilities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;;;GAIG;AACH,eAAO,MAAM,YAAY,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../src/tools/capabilities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;;;GAIG;AACH,eAAO,MAAM,YAAY,EAAE,gBAAgB,EAgF1C,CAAC;AAEF,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,QA0CzD"}
|
|
@@ -9,19 +9,23 @@ import { WORKFLOWS } from "../prompts/index.js";
|
|
|
9
9
|
export const TOOL_CATALOG = [
|
|
10
10
|
// Projects / brands
|
|
11
11
|
{ name: "migma_list_projects", domain: "projects", summary: "List Migma projects (brands) with ids, names, domains, and statuses.", write: false, idempotent: false },
|
|
12
|
-
{ name: "migma_get_project", domain: "projects", summary: "Get
|
|
12
|
+
{ name: "migma_get_project", domain: "projects", summary: "Get brand details (colors, fonts, logos, voice). Not the email list — use migma_list_emails.", write: false, idempotent: false },
|
|
13
13
|
{ name: "migma_import_brand", domain: "projects", summary: "Import a brand from website URLs and poll until the import completes.", write: true, idempotent: false },
|
|
14
14
|
{ name: "migma_get_field_catalog", domain: "projects", summary: "List subscriber fields, fill rates, and example values for template variables.", write: false, idempotent: false },
|
|
15
15
|
// Email generation
|
|
16
|
-
{ name: "migma_generate_email", domain: "emails", summary: "
|
|
17
|
-
{ name: "migma_get_generation_status", domain: "emails", summary: "
|
|
16
|
+
{ name: "migma_generate_email", domain: "emails", summary: "Start email generation; returns conversationId. Poll migma_get_generation_status.", write: true, idempotent: false },
|
|
17
|
+
{ name: "migma_get_generation_status", domain: "emails", summary: "Poll a generation by conversationId until completed or failed.", write: false, idempotent: false },
|
|
18
|
+
{ name: "migma_list_emails", domain: "emails", summary: "List generated email designs for a project. Not campaigns.", write: false, idempotent: false },
|
|
18
19
|
{ name: "migma_send_test_email", domain: "emails", summary: "Send a test email for a generated email id or single-email conversation.", write: true, idempotent: false },
|
|
19
|
-
{ name: "migma_get_email", domain: "emails", summary: "Fetch one generated email by emailId with HTML, subject, and
|
|
20
|
+
{ name: "migma_get_email", domain: "emails", summary: "Fetch one generated email by emailId with HTML, subject, screenshots, and variable requirements.", write: false, idempotent: false },
|
|
20
21
|
{ name: "migma_edit_email", domain: "emails", summary: "Edit a generated email with a natural-language prompt; returns the new version.", write: true, idempotent: false },
|
|
22
|
+
{ name: "migma_get_email_metrics", domain: "emails", summary: "Aggregate performance for one generated email across its API sends: delivery, opens, clicks, bounces, unsubscribes + time series.", write: false, idempotent: false },
|
|
23
|
+
{ name: "migma_get_email_logs", domain: "emails", summary: "Per-recipient send log for one generated email, cursor-paginated.", write: false, idempotent: false },
|
|
21
24
|
// Sending
|
|
22
25
|
{ name: "migma_send_email", domain: "sending", summary: "Send a generated email to an individual, tag, or segment.", write: true, idempotent: true },
|
|
26
|
+
{ name: "migma_get_sending_metrics", domain: "sending", summary: "Get account sending usage, limits, remaining capacity, and monthly delivery outcomes.", write: false, idempotent: false },
|
|
23
27
|
// Campaigns
|
|
24
|
-
{ name: "migma_list_campaigns", domain: "campaigns", summary: "List
|
|
28
|
+
{ name: "migma_list_campaigns", domain: "campaigns", summary: "List audience sends (draft/scheduled/sent). Not designed emails.", write: false, idempotent: false },
|
|
25
29
|
{ name: "migma_create_campaign", domain: "campaigns", summary: "Create a draft campaign from a generated email.", write: true, idempotent: true },
|
|
26
30
|
{ name: "migma_send_campaign", domain: "campaigns", summary: "Send a draft or scheduled campaign immediately.", write: true, idempotent: true },
|
|
27
31
|
{ name: "migma_schedule_campaign", domain: "campaigns", summary: "Schedule a campaign for future delivery.", write: true, idempotent: true },
|
|
@@ -50,6 +54,9 @@ export const TOOL_CATALOG = [
|
|
|
50
54
|
// Contacts
|
|
51
55
|
{ name: "migma_list_contacts", domain: "contacts", summary: "List contacts with optional filters and pagination.", write: false, idempotent: false },
|
|
52
56
|
{ name: "migma_add_contact", domain: "contacts", summary: "Create a new contact/subscriber.", write: true, idempotent: true },
|
|
57
|
+
{ name: "migma_bulk_import_contacts", domain: "contacts", summary: "Bulk import contacts from structured data.", write: true, idempotent: true },
|
|
58
|
+
{ name: "migma_create_contact_import", domain: "contacts", summary: "Import contacts from a CSV file or CSV text; runs in the background.", write: true, idempotent: false },
|
|
59
|
+
{ name: "migma_get_contact_import", domain: "contacts", summary: "Get a CSV contact import's status and counts.", write: false, idempotent: false },
|
|
53
60
|
{ name: "migma_get_contact", domain: "contacts", summary: "Get details about a contact by id.", write: false, idempotent: false },
|
|
54
61
|
{ name: "migma_remove_contact", domain: "contacts", summary: "Delete a contact by id.", write: true, idempotent: false },
|
|
55
62
|
{ name: "migma_batch_delete_contacts_by_email", domain: "contacts", summary: "Delete up to 1000 contacts by email in one call.", write: true, idempotent: false },
|
|
@@ -74,12 +81,14 @@ export function registerCapabilitiesTool(server) {
|
|
|
74
81
|
server.registerTool("migma_get_capabilities", {
|
|
75
82
|
title: "Get Capabilities",
|
|
76
83
|
description: "Self-describe this server: the full tool catalog, guided workflows, idempotency contract, and brand-scoping rules. Call this first so you can plan a sequence of tool calls.",
|
|
84
|
+
annotations: { readOnlyHint: true },
|
|
77
85
|
inputSchema: z.object({}),
|
|
78
86
|
}, async () => {
|
|
79
87
|
const catalog = {
|
|
80
88
|
server: "migma",
|
|
81
89
|
version,
|
|
82
90
|
brandScoping: "API key is account-scoped; pass projectId per tool (or set MIGMA_PROJECT_ID). Resources in another project return 404.",
|
|
91
|
+
emailsVsCampaigns: "Designed emails = migma_list_emails / migma_get_generation_status. Audience sends = migma_list_campaigns. migma_get_project is brand only — ignore templateCount.",
|
|
83
92
|
idempotency: {
|
|
84
93
|
header: "Idempotency-Key",
|
|
85
94
|
maxLength: 100,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../src/tools/capabilities.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAUhD;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GAAuB;IAC9C,oBAAoB;IACpB,EAAE,IAAI,EAAE,qBAAqB,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,sEAAsE,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE;IACrK,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../src/tools/capabilities.ts"],"names":[],"mappings":"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"}
|