@migma/mcp 1.9.1-automations.1 → 1.10.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/README.md +25 -26
- package/build/index.d.ts.map +1 -1
- package/build/index.js +5 -11
- package/build/index.js.map +1 -1
- package/build/prompts/index.d.ts +0 -1
- package/build/prompts/index.d.ts.map +1 -1
- package/build/prompts/index.js +5 -20
- package/build/prompts/index.js.map +1 -1
- package/build/tools/__tests__/brand.test.js +25 -0
- package/build/tools/__tests__/brand.test.js.map +1 -1
- package/build/tools/__tests__/campaign-recipients.test.js +5 -2
- package/build/tools/__tests__/campaign-recipients.test.js.map +1 -1
- package/build/tools/__tests__/campaign-schedule.test.d.ts +2 -0
- package/build/tools/__tests__/campaign-schedule.test.d.ts.map +1 -0
- package/build/tools/__tests__/campaign-schedule.test.js +32 -0
- package/build/tools/__tests__/campaign-schedule.test.js.map +1 -0
- package/build/tools/__tests__/catalog.test.js +27 -21
- package/build/tools/__tests__/catalog.test.js.map +1 -1
- package/build/tools/__tests__/provider-imports.test.js +23 -0
- package/build/tools/__tests__/provider-imports.test.js.map +1 -1
- package/build/tools/__tests__/review-annotations.test.js +7 -13
- package/build/tools/__tests__/review-annotations.test.js.map +1 -1
- package/build/tools/__tests__/send-approval.test.d.ts +2 -0
- package/build/tools/__tests__/send-approval.test.d.ts.map +1 -0
- package/build/tools/__tests__/send-approval.test.js +71 -0
- package/build/tools/__tests__/send-approval.test.js.map +1 -0
- package/build/tools/api-request.d.ts +11 -0
- package/build/tools/api-request.d.ts.map +1 -0
- package/build/tools/api-request.js +35 -0
- package/build/tools/api-request.js.map +1 -0
- package/build/tools/brand.d.ts.map +1 -1
- package/build/tools/brand.js +10 -7
- package/build/tools/brand.js.map +1 -1
- package/build/tools/campaigns.d.ts +2 -0
- package/build/tools/campaigns.d.ts.map +1 -1
- package/build/tools/campaigns.js +49 -33
- package/build/tools/campaigns.js.map +1 -1
- package/build/tools/capabilities.d.ts +1 -3
- package/build/tools/capabilities.d.ts.map +1 -1
- package/build/tools/capabilities.js +11 -55
- package/build/tools/capabilities.js.map +1 -1
- package/build/tools/contacts.d.ts.map +1 -1
- package/build/tools/contacts.js +31 -48
- package/build/tools/contacts.js.map +1 -1
- package/build/tools/context.js +1 -1
- package/build/tools/context.js.map +1 -1
- package/build/tools/generate.js +4 -4
- package/build/tools/generate.js.map +1 -1
- package/build/tools/segments.d.ts +16 -16
- package/build/tools/send-approval.d.ts +29 -0
- package/build/tools/send-approval.d.ts.map +1 -0
- package/build/tools/send-approval.js +51 -0
- package/build/tools/send-approval.js.map +1 -0
- package/build/tools/send.d.ts +1 -1
- package/build/tools/send.d.ts.map +1 -1
- package/build/tools/send.js +24 -35
- package/build/tools/send.js.map +1 -1
- package/build/tools/sender-check.d.ts +16 -0
- package/build/tools/sender-check.d.ts.map +1 -0
- package/build/tools/sender-check.js +28 -0
- package/build/tools/sender-check.js.map +1 -0
- package/package.json +3 -3
- package/build/tools/__tests__/automations.test.d.ts +0 -2
- package/build/tools/__tests__/automations.test.d.ts.map +0 -1
- package/build/tools/__tests__/automations.test.js +0 -259
- package/build/tools/__tests__/automations.test.js.map +0 -1
- package/build/tools/__tests__/forms.test.d.ts +0 -2
- package/build/tools/__tests__/forms.test.d.ts.map +0 -1
- package/build/tools/__tests__/forms.test.js +0 -127
- package/build/tools/__tests__/forms.test.js.map +0 -1
- package/build/tools/__tests__/websites.test.d.ts +0 -2
- package/build/tools/__tests__/websites.test.d.ts.map +0 -1
- package/build/tools/__tests__/websites.test.js +0 -138
- package/build/tools/__tests__/websites.test.js.map +0 -1
- package/build/tools/automations.d.ts +0 -22
- package/build/tools/automations.d.ts.map +0 -1
- package/build/tools/automations.js +0 -134
- package/build/tools/automations.js.map +0 -1
- package/build/tools/forms.d.ts +0 -6
- package/build/tools/forms.d.ts.map +0 -1
- package/build/tools/forms.js +0 -97
- package/build/tools/forms.js.map +0 -1
- package/build/tools/websites.d.ts +0 -4
- package/build/tools/websites.d.ts.map +0 -1
- package/build/tools/websites.js +0 -114
- package/build/tools/websites.js.map +0 -1
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
-
import { MigmaClient, type Migma } from 'migma';
|
|
3
|
-
import type { Config } from '../config.js';
|
|
4
|
-
/** Public API failures keep their status, server code and data for the agent. */
|
|
5
|
-
export declare function publicApiToolError(error: unknown): {
|
|
6
|
-
content: {
|
|
7
|
-
type: "text";
|
|
8
|
-
text: string;
|
|
9
|
-
}[];
|
|
10
|
-
structuredContent: {
|
|
11
|
-
error: {
|
|
12
|
-
data?: Record<string, unknown> | undefined;
|
|
13
|
-
code?: string | undefined;
|
|
14
|
-
statusCode?: number | undefined;
|
|
15
|
-
message: string;
|
|
16
|
-
};
|
|
17
|
-
};
|
|
18
|
-
isError: boolean;
|
|
19
|
-
};
|
|
20
|
-
/** Uses the public transport so hosted MCP also works with older SDK hosts. */
|
|
21
|
-
export declare function registerAutomationTools(server: McpServer, resolverClient: Migma, config: Config, grantedPermissions?: string[], suppliedClient?: Pick<MigmaClient, 'get' | 'post' | 'put' | 'patch'>): void;
|
|
22
|
-
//# sourceMappingURL=automations.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"automations.d.ts","sourceRoot":"","sources":["../../src/tools/automations.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,KAAK,KAAK,EAAE,MAAM,OAAO,CAAC;AAEhD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAI3C,iFAAiF;AACjF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO;;;;;;;;;;;;;;EA4BhD;AAED,+EAA+E;AAC/E,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,SAAS,EACjB,cAAc,EAAE,KAAK,EACrB,MAAM,EAAE,MAAM,EACd,kBAAkB,CAAC,EAAE,MAAM,EAAE,EAC7B,cAAc,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,CAAC,QAkIrE"}
|
|
@@ -1,134 +0,0 @@
|
|
|
1
|
-
import { randomUUID } from 'node:crypto';
|
|
2
|
-
import { MigmaClient } from 'migma';
|
|
3
|
-
import { z } from 'zod';
|
|
4
|
-
import { canUse } from '../permissions.js';
|
|
5
|
-
import { resolveProjectId } from './projects.js';
|
|
6
|
-
/** Public API failures keep their status, server code and data for the agent. */
|
|
7
|
-
export function publicApiToolError(error) {
|
|
8
|
-
const value = error !== null && typeof error === 'object'
|
|
9
|
-
? error
|
|
10
|
-
: {};
|
|
11
|
-
const message = error instanceof Error
|
|
12
|
-
? error.message
|
|
13
|
-
: typeof value.message === 'string'
|
|
14
|
-
? value.message
|
|
15
|
-
: 'Could not complete this automation request.';
|
|
16
|
-
const code = typeof value.serverCode === 'string'
|
|
17
|
-
? value.serverCode
|
|
18
|
-
: typeof value.code === 'string'
|
|
19
|
-
? value.code
|
|
20
|
-
: undefined;
|
|
21
|
-
const data = value.data !== null && typeof value.data === 'object' && !Array.isArray(value.data)
|
|
22
|
-
? value.data
|
|
23
|
-
: undefined;
|
|
24
|
-
const structured = {
|
|
25
|
-
message,
|
|
26
|
-
...(typeof value.statusCode === 'number' && { statusCode: value.statusCode }),
|
|
27
|
-
...(code !== undefined && { code }),
|
|
28
|
-
...(data !== undefined && { data }),
|
|
29
|
-
};
|
|
30
|
-
return {
|
|
31
|
-
content: [{ type: 'text', text: message }],
|
|
32
|
-
structuredContent: { error: structured },
|
|
33
|
-
isError: true,
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
/** Uses the public transport so hosted MCP also works with older SDK hosts. */
|
|
37
|
-
export function registerAutomationTools(server, resolverClient, config, grantedPermissions, suppliedClient) {
|
|
38
|
-
let transport = suppliedClient;
|
|
39
|
-
const client = () => transport ??= new MigmaClient(config.apiKey, {
|
|
40
|
-
baseUrl: config.baseUrl || 'https://api.migma.ai/v1', maxRetries: 2, retryDelay: 1000,
|
|
41
|
-
});
|
|
42
|
-
const project = z.string().optional().describe("Brand ID from migma_list_projects. Defaults to MIGMA_PROJECT_ID for local stdio, then the account's only brand.");
|
|
43
|
-
const id = z.string().min(1).describe('Automation ID returned by list, get, or generation status.');
|
|
44
|
-
const definitionHash = z.string().regex(/^[a-fA-F0-9]{64}$/).describe('Exact definitionHash returned by migma_get_automation for the flow the user reviewed. Never fetch a newer hash automatically.');
|
|
45
|
-
const day = z.string().regex(/^\d{4}-\d{2}-\d{2}$/).refine(value => {
|
|
46
|
-
const date = new Date(`${value}T00:00:00Z`);
|
|
47
|
-
return value >= '1970-01-01' && Number.isFinite(date.getTime()) && date.toISOString().slice(0, 10) === value;
|
|
48
|
-
}, 'Invalid calendar date');
|
|
49
|
-
const metricsInput = z.object({
|
|
50
|
-
automationId: id,
|
|
51
|
-
startDate: day.optional().describe('Inclusive start date, YYYY-MM-DD. Supply endDate and timezone too.'),
|
|
52
|
-
endDate: day.optional().describe('Inclusive end date, YYYY-MM-DD. Period may span at most 366 days.'),
|
|
53
|
-
timezone: z.string().min(1).max(100).refine(value => {
|
|
54
|
-
try {
|
|
55
|
-
new Intl.DateTimeFormat('en', { timeZone: value });
|
|
56
|
-
return true;
|
|
57
|
-
}
|
|
58
|
-
catch {
|
|
59
|
-
return false;
|
|
60
|
-
}
|
|
61
|
-
}, 'Invalid time zone').optional().describe('IANA time zone, for example Europe/Madrid. Required with dates.'),
|
|
62
|
-
}).superRefine((value, ctx) => {
|
|
63
|
-
const fields = ['startDate', 'endDate', 'timezone'];
|
|
64
|
-
if (!fields.some(field => value[field] !== undefined))
|
|
65
|
-
return;
|
|
66
|
-
for (const field of fields) {
|
|
67
|
-
if (value[field] === undefined)
|
|
68
|
-
ctx.addIssue({ code: z.ZodIssueCode.custom, path: [field], message: 'Supply startDate, endDate, and timezone together.' });
|
|
69
|
-
}
|
|
70
|
-
if (value.startDate && value.endDate && (value.startDate > value.endDate
|
|
71
|
-
|| Date.parse(value.endDate) - Date.parse(value.startDate) >= 366 * 86400000)) {
|
|
72
|
-
ctx.addIssue({ code: z.ZodIssueCode.custom, path: ['endDate'], message: 'Choose an ordered period of up to 366 days.' });
|
|
73
|
-
}
|
|
74
|
-
});
|
|
75
|
-
// Matches the public API: at most 20 filters, values only for value operators.
|
|
76
|
-
const propertyFilter = z.object({
|
|
77
|
-
path: z.string().trim().min(1).max(200),
|
|
78
|
-
op: z.enum(['eq', 'neq', 'gt', 'lt', 'gte', 'lte', 'contains', 'starts_with', 'ends_with', 'exists', 'is_empty']),
|
|
79
|
-
value: z.union([z.string(), z.number(), z.boolean()]).optional(),
|
|
80
|
-
}).strict().refine(filter => ['exists', 'is_empty'].includes(filter.op) || filter.value !== undefined, { message: 'value is required for this operator', path: ['value'] });
|
|
81
|
-
const trigger = z.object({ type: z.literal('event'), event: z.object({
|
|
82
|
-
name: z.string().trim().min(1), origin: z.string().trim().min(1).optional(), eventVersion: z.string().trim().min(1).optional(),
|
|
83
|
-
propertyFilters: z.array(propertyFilter).max(20).optional(),
|
|
84
|
-
}).strict() }).strict();
|
|
85
|
-
// One replay identity per tool call, reused by the transport's own retries.
|
|
86
|
-
const retryKey = z.string().min(1).max(100).optional().describe('Reuse the same key only when retrying this exact change after an uncertain result.');
|
|
87
|
-
const keyed = (args) => ({ idempotencyKey: args.idempotency_key || randomUUID() });
|
|
88
|
-
const path = (value) => `/automations/${encodeURIComponent(value)}`;
|
|
89
|
-
const projectId = (value) => resolveProjectId(resolverClient, config, value);
|
|
90
|
-
const register = (name, title, description, inputSchema, permissions, run) => {
|
|
91
|
-
if (!canUse(grantedPermissions, permissions))
|
|
92
|
-
return;
|
|
93
|
-
server.registerTool(name, { title, description, inputSchema }, async (args) => {
|
|
94
|
-
try {
|
|
95
|
-
const result = await run(args);
|
|
96
|
-
if (result.error)
|
|
97
|
-
return publicApiToolError(result.error);
|
|
98
|
-
return { content: [{ type: 'text', text: JSON.stringify(result.data) }] };
|
|
99
|
-
}
|
|
100
|
-
catch (error) {
|
|
101
|
-
return publicApiToolError(error);
|
|
102
|
-
}
|
|
103
|
-
});
|
|
104
|
-
};
|
|
105
|
-
const read = ['campaign:read'];
|
|
106
|
-
const write = ['campaign:write'];
|
|
107
|
-
register('migma_get_automation_capabilities', 'Automation Capabilities', 'Discover supported automation steps, real trigger events and connection requirements for a brand. Use before promising a trigger or integration.', z.object({ projectId: project }), read, async (args) => client().get('/automations/capabilities', { projectId: await projectId(args.projectId) }));
|
|
108
|
-
register('migma_list_automations', 'List Automations', 'Find saved automation drafts, active flows, and paused flows for a brand, newest edited first. Use nextCursor to continue a page. Archived flows are omitted unless includeArchived is true. Use the returned ID for follow-up work.', z.object({
|
|
109
|
-
projectId: project,
|
|
110
|
-
cursor: z.string().max(200).optional().describe('Opaque nextCursor returned by the previous page.'),
|
|
111
|
-
limit: z.number().int().min(1).max(200).optional().describe('Page size; defaults to 200.'),
|
|
112
|
-
includeArchived: z.boolean().optional().describe('Include archived flows; defaults to false.'),
|
|
113
|
-
}).strict(), read, async (args) => client().get('/automations', {
|
|
114
|
-
projectId: await projectId(args.projectId), cursor: args.cursor, limit: args.limit, includeArchived: args.includeArchived,
|
|
115
|
-
}));
|
|
116
|
-
register('migma_get_automation', 'Get Automation', 'Read an automation and its review link. Native reviewed flows include definitionHash; list summaries do not, and imported migration drafts can omit it. Keep an observed definitionHash with the reviewed flow because activation and edits require that exact value.', z.object({ automationId: id }), read, args => client().get(path(args.automationId)));
|
|
117
|
-
register('migma_get_automation_metrics', 'Automation Campaign Reports', 'Read delivery and unique human engagement. Supply startDate, endDate, and timezone together for the same send-date report as the canvas; resolve requested dates and timezone first. Omit all three only for lifetime metrics, returned with period:lifetime. Preserve cohort, window, coverage, revenue status, and reporting warnings. The period report counts every version of each email step (sends before an edit included) and returns bounced, unsubscribed and complained with their rates, attributed orders and net sales per delivered email per currency, plus definitions: explain numbers with those definitions. A null rate means nothing was delivered; sales are attributed (last click within 5 days), never proof the email caused them. Missing numbers are unavailable, never zero. Completed journeys are not delivery metrics; never add these to the same campaign totals.', metricsInput, read, async (args) => {
|
|
118
|
-
const { automationId, startDate, endDate, timezone } = metricsInput.parse(args);
|
|
119
|
-
if (startDate && endDate && timezone)
|
|
120
|
-
return client().get(`${path(automationId)}/report`, { startDate, endDate, timezone });
|
|
121
|
-
const result = await client().get(`${path(automationId)}/metrics`);
|
|
122
|
-
return result.error ? result : { ...result, data: { ...result.data, period: 'lifetime' } };
|
|
123
|
-
});
|
|
124
|
-
register('migma_generate_automation', 'Create Automation from Text or Image', 'Build a draft automation and branded emails from a brief or workflow screenshots. Preserves visible timing and branches; reports missing details. Returns a jobId: poll migma_get_automation_generation. Creates a draft that stays off. Use this for recurring/triggered journeys, not a standalone email design.', z.object({ projectId: project, brief: z.string().trim().min(1).max(12000), name: z.string().trim().min(1).max(160).optional(), emailCount: z.number().int().min(0).max(12).optional().describe('Number of emails; use 0 for an action-only journey with no email steps.'), imageUrls: z.array(z.string().url().max(2048).refine(value => new URL(value).protocol === 'https:', 'Use HTTPS image URLs')).max(5).optional().describe('Public HTTPS workflow screenshots supplied by the user. Never invent URLs.'), idempotency_key: z.string().min(1).max(100).optional().describe('Keep the same key when retrying the same submission.') }), ['campaign:write', 'email:write'], async (args) => client().post('/automations/generate', { projectId: await projectId(args.projectId), brief: args.brief, name: args.name, emailCount: args.emailCount, imageUrls: args.imageUrls }, { idempotencyKey: args.idempotency_key || randomUUID() }));
|
|
125
|
-
register('migma_get_automation_generation', 'Automation Generation Status', 'Poll the jobId from migma_generate_automation. On completion show the review link and unresolved details. A completed generation is still an off draft.', z.object({ jobId: z.string().min(1) }), read, args => client().get(`/automations/generations/${encodeURIComponent(args.jobId)}`));
|
|
126
|
-
register('migma_validate_automation', 'Check Automation Setup', 'Check graph, email assets, audience, triggers and sending setup. Prepares delivery drafts but never activates or sends. Show actionable blockers in plain language.', z.object({ automationId: id, idempotency_key: retryKey }), write, args => client().post(`${path(args.automationId)}/validate`, undefined, keyed(args)));
|
|
127
|
-
register('migma_activate_automation', 'Turn On Automation', 'Turn on the exact reviewed automation ONLY when the user explicitly asks to activate it. First call migma_get_automation, review the flow, and pass its definitionHash unchanged. Validate first. If AUTOMATION_GRAPH_CHANGED is returned, reload and review the changed flow before retrying. Never fetch a fresh hash automatically or treat creating a flow as activation consent.', z.object({ automationId: id, confirmed: z.literal(true).describe('True only when the user explicitly requested activation of this automation.'), expectedDefinitionHash: definitionHash, idempotency_key: retryKey }), write, args => client().post(`${path(args.automationId)}/activate`, { confirmed: args.confirmed, expectedDefinitionHash: args.expectedDefinitionHash }, keyed(args)));
|
|
128
|
-
register('migma_pause_automation', 'Pause Automation', 'Pause this flow when requested. Stops new entries and future automation steps; queued automation emails wait at the final delivery check. Messages already being sent to a provider cannot be recalled. Reactivate the unchanged flow to resume existing contacts.', z.object({ automationId: id, idempotency_key: retryKey }), write, args => client().post(`${path(args.automationId)}/pause`, undefined, keyed(args)));
|
|
129
|
-
register('migma_update_automation_trigger', 'Edit Automation Start Rule', 'Update the existing flow start rule after inspecting it with migma_get_automation. Pass the returned definitionHash unchanged and preserve filters the user did not ask to change (at most 20; values are strings, numbers or booleans). If AUTOMATION_GRAPH_CHANGED is returned, reload and review before retrying. Saves to the same canvas. Only draft/paused flows with no contacts in progress are editable; contacts in progress must finish or be cancelled in Migma under Results → Activity.', z.object({ automationId: id, expectedDefinitionHash: definitionHash, trigger, idempotency_key: retryKey }), write, args => client().put(`${path(args.automationId)}/trigger`, { trigger: args.trigger, expectedDefinitionHash: args.expectedDefinitionHash }, keyed(args)));
|
|
130
|
-
register('migma_update_automation_wait', 'Edit Automation Wait', 'Change one existing wait duration, preserving its connections. First inspect the flow with migma_get_automation, use the actual wait step ID, and pass its definitionHash unchanged. If AUTOMATION_GRAPH_CHANGED is returned, reload and review before retrying. Draft/paused flows with no contacts in progress only. Duration is positive ISO 8601, at most 365 days; examples P2D or PT1H.', z.object({ automationId: id, stepId: z.string().min(1).max(160), duration: z.string().min(1).max(50), expectedDefinitionHash: definitionHash, idempotency_key: retryKey }), write, args => client().patch(`${path(args.automationId)}/steps/${encodeURIComponent(args.stepId)}`, { duration: args.duration, expectedDefinitionHash: args.expectedDefinitionHash }, keyed(args)));
|
|
131
|
-
register('migma_list_automation_runs', 'Automation Activity', 'Inspect contact journeys: status, current step, next run time, and failureReason, exitReason or suppressionReason when recorded. Contact email and name need audience:read. Use the returned cursor for the next page. Runs cannot be cancelled here; the user can cancel them in Migma under Results → Activity.', z.object({ automationId: id, status: z.enum(['active', 'waiting', 'completed', 'failed', 'exited', 'suppressed']).optional(), cursor: z.string().optional(), limit: z.number().int().min(1).max(100).optional() }), read, args => client().get(`${path(args.automationId)}/runs`, { status: args.status, cursor: args.cursor, limit: args.limit }));
|
|
132
|
-
register('migma_get_automation_run', 'Automation Contact Timeline', 'Read one contact journey with its reasons and most recent steps (historyTotal says how many were kept). Completed means the journey ended, not proof of inbox delivery.', z.object({ automationId: id, runId: z.string().min(1), historyLimit: z.number().int().min(1).max(100).optional().describe('Most recent steps to return; default 25.') }), read, args => client().get(`${path(args.automationId)}/runs/${encodeURIComponent(args.runId)}`, { historyLimit: args.historyLimit }));
|
|
133
|
-
}
|
|
134
|
-
//# sourceMappingURL=automations.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"automations.js","sourceRoot":"","sources":["../../src/tools/automations.ts"],"names":[],"mappings":"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"}
|
package/build/tools/forms.d.ts
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
-
import { MigmaClient, type Migma } from 'migma';
|
|
3
|
-
import type { Config } from '../config.js';
|
|
4
|
-
/** Uses the public transport so hosted MCP also works with older SDK hosts. */
|
|
5
|
-
export declare function registerFormTools(server: McpServer, resolverClient: Migma, config: Config, grantedPermissions?: string[], suppliedClient?: Pick<MigmaClient, 'get' | 'post' | 'patch' | 'delete'>): void;
|
|
6
|
-
//# sourceMappingURL=forms.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"forms.d.ts","sourceRoot":"","sources":["../../src/tools/forms.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,KAAK,KAAK,EAAE,MAAM,OAAO,CAAC;AAEhD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAqC3C,+EAA+E;AAC/E,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,SAAS,EACjB,cAAc,EAAE,KAAK,EACrB,MAAM,EAAE,MAAM,EACd,kBAAkB,CAAC,EAAE,MAAM,EAAE,EAC7B,cAAc,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC,QAsFxE"}
|
package/build/tools/forms.js
DELETED
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
import { randomUUID } from 'node:crypto';
|
|
2
|
-
import { MigmaClient } from 'migma';
|
|
3
|
-
import { z } from 'zod';
|
|
4
|
-
import { canUse } from '../permissions.js';
|
|
5
|
-
import { publicApiToolError } from './automations.js';
|
|
6
|
-
import { resolveProjectId } from './projects.js';
|
|
7
|
-
// Mirrors the public API spec limits; the server validates the full rules.
|
|
8
|
-
const field = z.object({
|
|
9
|
-
key: z.string().regex(/^[a-zA-Z][a-zA-Z0-9_]*$/).max(60),
|
|
10
|
-
label: z.string().min(1).max(120),
|
|
11
|
-
type: z.enum(['text', 'email', 'tel', 'select', 'checkbox']),
|
|
12
|
-
required: z.boolean(),
|
|
13
|
-
bindsTo: z.string().max(120).optional().describe('Contact field to fill, such as firstName, lastName or a custom field key.'),
|
|
14
|
-
options: z.array(z.string().max(120)).max(20).optional().describe('Unique choices; required for select fields.'),
|
|
15
|
-
}).strict();
|
|
16
|
-
const copy = z.object({ headline: z.string().min(1).max(200), body: z.string().max(500).optional() }).strict();
|
|
17
|
-
const specShape = {
|
|
18
|
-
kind: z.enum(['subscribe', 'waitlist', 'leadgen', 'rsvp', 'gated']),
|
|
19
|
-
steps: z.array(z.object({
|
|
20
|
-
id: z.string().min(1).max(60), headline: z.string().min(1).max(200), subheadline: z.string().max(300).optional(),
|
|
21
|
-
ctaLabel: z.string().min(1).max(60), fields: z.array(field).max(10),
|
|
22
|
-
}).strict()).min(1).max(5).optional(),
|
|
23
|
-
success: copy.optional(),
|
|
24
|
-
confirmed: copy.optional(),
|
|
25
|
-
subscribed: copy.optional(),
|
|
26
|
-
teaser: z.object({ label: z.string().min(1).max(60) }).strict().optional(),
|
|
27
|
-
display: z.enum(['inline', 'popup']).optional(),
|
|
28
|
-
confirmation: z.object({
|
|
29
|
-
mode: z.enum(['message', 'redirect', 'doubleOptIn']),
|
|
30
|
-
value: z.string().min(1).max(2000),
|
|
31
|
-
}).strict().describe('message shows value after signup; redirect goes to an absolute http(s) URL; doubleOptIn emails a confirmation link and needs a verified transactional sender to publish.'),
|
|
32
|
-
styleTokens: z.record(z.string(), z.string()),
|
|
33
|
-
};
|
|
34
|
-
const spec = z.object(specShape).strict()
|
|
35
|
-
.describe('1-5 steps with 1-10 fields in total and exactly one required email field.');
|
|
36
|
-
const partialSpec = z.object(specShape).partial().strict()
|
|
37
|
-
.describe('Only the parts to change; merged into the saved draft.');
|
|
38
|
-
/** Uses the public transport so hosted MCP also works with older SDK hosts. */
|
|
39
|
-
export function registerFormTools(server, resolverClient, config, grantedPermissions, suppliedClient) {
|
|
40
|
-
let transport = suppliedClient;
|
|
41
|
-
const client = () => transport ??= new MigmaClient(config.apiKey, {
|
|
42
|
-
baseUrl: config.baseUrl || 'https://api.migma.ai/v1', maxRetries: 2, retryDelay: 1000,
|
|
43
|
-
});
|
|
44
|
-
const project = z.string().optional().describe("Brand ID from migma_list_projects. Defaults to MIGMA_PROJECT_ID for local stdio, then the account's only brand.");
|
|
45
|
-
const id = z.string().min(1).describe('Form ID returned by migma_list_forms or migma_create_form.');
|
|
46
|
-
const tagIds = z.array(z.string()).max(50).optional().describe('Saved tag IDs from migma_list_tags added to every new signup.');
|
|
47
|
-
const audienceId = z.string().max(100).optional().describe('Saved audience ID; omit for every contact in the brand.');
|
|
48
|
-
const formName = z.string().trim().min(1).max(120).describe('The form\'s name in lists, never shown to visitors: the user\'s own name for it, else a short descriptive one.');
|
|
49
|
-
const retryKey = z.string().min(1).max(100).optional().describe('Reuse the same key only when retrying this exact change after an uncertain result.');
|
|
50
|
-
const keyed = (args) => ({ idempotencyKey: args.idempotency_key || randomUUID() });
|
|
51
|
-
const path = (value) => `/forms/${encodeURIComponent(value)}`;
|
|
52
|
-
const projectId = (value) => resolveProjectId(resolverClient, config, value);
|
|
53
|
-
const register = (name, title, description, inputSchema, permissions, run) => {
|
|
54
|
-
if (!canUse(grantedPermissions, permissions))
|
|
55
|
-
return;
|
|
56
|
-
server.registerTool(name, { title, description, inputSchema }, async (args) => {
|
|
57
|
-
try {
|
|
58
|
-
const result = await run(args);
|
|
59
|
-
if (result.error)
|
|
60
|
-
return publicApiToolError(result.error);
|
|
61
|
-
return { content: [{ type: 'text', text: JSON.stringify(result.data) }] };
|
|
62
|
-
}
|
|
63
|
-
catch (error) {
|
|
64
|
-
return publicApiToolError(error);
|
|
65
|
-
}
|
|
66
|
-
});
|
|
67
|
-
};
|
|
68
|
-
const read = ['campaign:read'];
|
|
69
|
-
const write = ['campaign:write'];
|
|
70
|
-
register('migma_list_forms', 'List Signup Forms', 'List a brand\'s signup forms with status, hosted link and embed code. Use a form ID as formId in a form.submitted or form.confirmed automation trigger.', z.object({ projectId: project, status: z.enum(['draft', 'live', 'paused']).optional() }).strict(), read, async (args) => client().get('/forms', { projectId: await projectId(args.projectId), status: args.status }));
|
|
71
|
-
register('migma_get_form', 'Get Signup Form', 'Read one form: draft and published versions, hosted link, embed code, view/submission/confirmation counters (null when unavailable, never zero) and the automations it starts.', z.object({ formId: id }).strict(), read, args => client().get(path(args.formId)));
|
|
72
|
-
register('migma_create_form', 'Create Signup Form', 'Save a new signup form as a draft. Nothing is public until migma_publish_form. Show the draft to the user before publishing.', z.object({ projectId: project, name: formName.optional(), spec, tagIds, audienceId, idempotency_key: retryKey }).strict(), write, async (args) => client().post('/forms', { projectId: await projectId(args.projectId), name: args.name, spec: args.spec, tagIds: args.tagIds, audienceId: args.audienceId }, keyed(args)));
|
|
73
|
-
register('migma_update_form', 'Edit Signup Form Draft', 'Rename a form or change its draft, tags or audience. A rename applies at once; a live form keeps its published version until migma_publish_form.', z.object({ formId: id, name: formName.nullable().optional(), spec: partialSpec.optional(), tagIds, audienceId, idempotency_key: retryKey }).strict(), write, args => client().patch(path(args.formId), { name: args.name, spec: args.spec, tagIds: args.tagIds, audienceId: args.audienceId }, keyed(args)));
|
|
74
|
-
register('migma_publish_form', 'Publish Signup Form', 'Make the current draft live on the hosted page and embeds, replacing the published version. Only when the user asks to publish. Double opt-in forms need a verified transactional sender.', z.object({ formId: id, idempotency_key: retryKey }).strict(), write, args => client().post(`${path(args.formId)}/publish`, undefined, keyed(args)));
|
|
75
|
-
register('migma_pause_form', 'Pause Signup Form', 'Stop new submissions to a live form. Returns FORM_USED_BY_AUTOMATION while an enabled automation starts from it; tell the user which flows to pause or change first.', z.object({ formId: id, idempotency_key: retryKey }).strict(), write, args => client().post(`${path(args.formId)}/pause`, undefined, keyed(args)));
|
|
76
|
-
register('migma_delete_form', 'Delete Signup Form', 'Delete a form only after the user explicitly confirms. Its hosted page and embeds stop working; past submissions and contacts remain. Blocked like pause while an enabled automation uses it.', z.object({ formId: id, idempotency_key: retryKey }).strict(), write, args => client().delete(path(args.formId), undefined, keyed(args)));
|
|
77
|
-
const attribution = z.string().max(500).optional();
|
|
78
|
-
register('migma_submit_form', 'Submit Signup Form', 'Sign up one person through a live form, for a person who asked to join, as if they used the form: its fields, tags, double opt-in and form.submitted/form.confirmed automations. Not for bulk-adding contacts (use the contact import tools). Add-only: an existing contact keeps its status, and the result never reveals it. state confirmation_pending means the person was emailed a confirmation link; duplicate true means this email was already submitted to this form with this API key, so no new submission or automation entry was recorded.', z.object({
|
|
79
|
-
formId: id,
|
|
80
|
-
email: z.string().trim().max(254).email(),
|
|
81
|
-
fields: z.record(z.string(), z.union([z.string().max(500), z.boolean()])).optional()
|
|
82
|
-
.describe("Values keyed by the form's field keys from migma_get_form; checkboxes may be true/false. Unknown keys are rejected."),
|
|
83
|
-
attribution: z.object({
|
|
84
|
-
utmSource: attribution, utmMedium: attribution, utmCampaign: attribution, utmTerm: attribution,
|
|
85
|
-
utmContent: attribution, referrer: attribution, landingUrl: attribution,
|
|
86
|
-
}).strict().optional().describe('Where the signup came from; saved on new contacts only.'),
|
|
87
|
-
consent: z.object({
|
|
88
|
-
ip: z.string().trim().ip().optional().describe("The signing-up person's IP address; the API stores it hashed."),
|
|
89
|
-
userAgent: z.string().trim().max(1000).optional().describe("The signing-up person's user agent."),
|
|
90
|
-
}).strict().optional().describe("Original signup request evidence supplied by the caller. Never substitute the MCP host or agent's IP or user agent."),
|
|
91
|
-
idempotency_key: retryKey,
|
|
92
|
-
}).strict(), ['campaign:write', 'audience:write'], args => client().post(`${path(args.formId)}/submissions`, {
|
|
93
|
-
email: args.email, fields: args.fields, attribution: args.attribution, consent: args.consent,
|
|
94
|
-
}, keyed(args)));
|
|
95
|
-
register('migma_list_form_submissions', 'Signup Form Submissions', 'Read recent submissions, newest first, with confirmation time for double opt-in signups. Contains contact data. Use nextCursor for older entries.', z.object({ formId: id, limit: z.number().int().min(1).max(100).optional(), cursor: z.string().optional() }).strict(), ['campaign:read', 'audience:read'], args => client().get(`${path(args.formId)}/submissions`, { limit: args.limit, cursor: args.cursor }));
|
|
96
|
-
}
|
|
97
|
-
//# sourceMappingURL=forms.js.map
|
package/build/tools/forms.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"forms.js","sourceRoot":"","sources":["../../src/tools/forms.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"websites.d.ts","sourceRoot":"","sources":["../../src/tools/websites.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAmBnC,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,KAAK,EACb,kBAAkB,CAAC,EAAE,MAAM,EAAE,QAgG9B"}
|
package/build/tools/websites.js
DELETED
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
import { randomUUID } from "node:crypto";
|
|
2
|
-
import { z } from "zod";
|
|
3
|
-
import { canUse } from "../permissions.js";
|
|
4
|
-
import { MUTATING_TOOL, READ_ONLY_TOOL } from "./annotations.js";
|
|
5
|
-
const objectIdSchema = z.string().regex(/^[a-f0-9]{24}$/, "Use a 24-character lowercase object ID");
|
|
6
|
-
const websiteOriginSchema = z.string().max(300).url().refine((value) => {
|
|
7
|
-
try {
|
|
8
|
-
const url = new URL(value);
|
|
9
|
-
const loopback = ["127.0.0.1", "localhost", "[::1]"].includes(url.hostname);
|
|
10
|
-
return value === url.origin && !url.username && !url.password
|
|
11
|
-
&& (url.protocol === "https:" || url.protocol === "http:" && loopback);
|
|
12
|
-
}
|
|
13
|
-
catch {
|
|
14
|
-
return false;
|
|
15
|
-
}
|
|
16
|
-
}, "Use an HTTPS origin, or a loopback HTTP origin for local testing");
|
|
17
|
-
export function registerWebsiteTools(server, client, grantedPermissions) {
|
|
18
|
-
if (canUse(grantedPermissions, ["audience:read"])) {
|
|
19
|
-
server.registerTool("migma_list_websites", {
|
|
20
|
-
title: "List Website Trackers",
|
|
21
|
-
annotations: READ_ONLY_TOOL,
|
|
22
|
-
description: "List up to 100 website tracking installations for a project.",
|
|
23
|
-
inputSchema: z.object({
|
|
24
|
-
projectId: objectIdSchema.describe("Project ID"),
|
|
25
|
-
}).strict(),
|
|
26
|
-
}, async (args) => {
|
|
27
|
-
const websites = websiteApi(client);
|
|
28
|
-
if (!websites)
|
|
29
|
-
return toolError("This MCP build needs a newer migma package with website tracking support.");
|
|
30
|
-
const { data, error } = await websites.list(args.projectId);
|
|
31
|
-
if (error)
|
|
32
|
-
return toolError(error.message);
|
|
33
|
-
return toolResult(data);
|
|
34
|
-
});
|
|
35
|
-
server.registerTool("migma_get_website_events", {
|
|
36
|
-
title: "Inspect Website Observations",
|
|
37
|
-
annotations: READ_ONLY_TOOL,
|
|
38
|
-
description: "Inspect the bounded recent history sample for one website tracking installation.",
|
|
39
|
-
inputSchema: z.object({
|
|
40
|
-
websiteId: objectIdSchema.describe("Website tracking installation ID"),
|
|
41
|
-
}).strict(),
|
|
42
|
-
}, async (args) => {
|
|
43
|
-
const websites = websiteApi(client);
|
|
44
|
-
if (!websites)
|
|
45
|
-
return toolError("This MCP build needs a newer migma package with website tracking support.");
|
|
46
|
-
const { data, error } = await websites.events(args.websiteId);
|
|
47
|
-
if (error)
|
|
48
|
-
return toolError(error.message);
|
|
49
|
-
return toolResult(data);
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
if (canUse(grantedPermissions, ["audience:write"])) {
|
|
53
|
-
server.registerTool("migma_create_website", {
|
|
54
|
-
title: "Create Website Tracker",
|
|
55
|
-
annotations: MUTATING_TOOL,
|
|
56
|
-
description: "Register one to ten exact storefront origins. Start with environment test; test observations remain history only. Reuse idempotency_key to retry the same logical creation across calls. Without a key, each call creates a separate installation. This tool returns installation settings and never issues browser identity credentials.",
|
|
57
|
-
inputSchema: z.object({
|
|
58
|
-
projectId: objectIdSchema.describe("Project ID"),
|
|
59
|
-
name: z.string().trim().min(1).max(100).describe("Installation name"),
|
|
60
|
-
origins: z.array(websiteOriginSchema).min(1).max(10)
|
|
61
|
-
.refine((values) => new Set(values).size === values.length, "Origins must be unique")
|
|
62
|
-
.describe("Exact HTTPS storefront origins"),
|
|
63
|
-
environment: z.enum(["live", "test"]).describe("Use test for history-only verification or live for identified execution"),
|
|
64
|
-
idempotency_key: z.string().min(1).max(128).optional()
|
|
65
|
-
.describe("Stable retry key. Omit to generate one for this tool call."),
|
|
66
|
-
}).strict(),
|
|
67
|
-
}, async (args) => {
|
|
68
|
-
const websites = websiteApi(client);
|
|
69
|
-
if (!websites)
|
|
70
|
-
return toolError("This MCP build needs a newer migma package with website tracking support.");
|
|
71
|
-
const { idempotency_key, ...input } = args;
|
|
72
|
-
const { data, error } = await websites.create(input, idempotency_key || randomUUID());
|
|
73
|
-
if (error)
|
|
74
|
-
return toolError(error.message);
|
|
75
|
-
return toolResult(data);
|
|
76
|
-
});
|
|
77
|
-
server.registerTool("migma_update_website", {
|
|
78
|
-
title: "Update Website Tracker",
|
|
79
|
-
annotations: MUTATING_TOOL,
|
|
80
|
-
description: "Rename, enable, or disable a website tracking installation. Origins and environment cannot be changed after creation.",
|
|
81
|
-
inputSchema: z.object({
|
|
82
|
-
websiteId: objectIdSchema.describe("Website tracking installation ID"),
|
|
83
|
-
name: z.string().trim().min(1).max(100).optional().describe("New installation name"),
|
|
84
|
-
status: z.enum(["enabled", "disabled"]).optional().describe("Collection status"),
|
|
85
|
-
}).strict().refine((value) => value.name !== undefined || value.status !== undefined, {
|
|
86
|
-
message: "Provide name or status",
|
|
87
|
-
}),
|
|
88
|
-
}, async (args) => {
|
|
89
|
-
const websites = websiteApi(client);
|
|
90
|
-
if (!websites)
|
|
91
|
-
return toolError("This MCP build needs a newer migma package with website tracking support.");
|
|
92
|
-
const { websiteId, ...input } = args;
|
|
93
|
-
const { data, error } = await websites.update(websiteId, input);
|
|
94
|
-
if (error)
|
|
95
|
-
return toolError(error.message);
|
|
96
|
-
return toolResult(data);
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
function websiteApi(client) {
|
|
101
|
-
return client.websites;
|
|
102
|
-
}
|
|
103
|
-
function toolResult(data) {
|
|
104
|
-
return {
|
|
105
|
-
content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
|
|
106
|
-
};
|
|
107
|
-
}
|
|
108
|
-
function toolError(message) {
|
|
109
|
-
return {
|
|
110
|
-
content: [{ type: "text", text: message }],
|
|
111
|
-
isError: true,
|
|
112
|
-
};
|
|
113
|
-
}
|
|
114
|
-
//# sourceMappingURL=websites.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"websites.js","sourceRoot":"","sources":["../../src/tools/websites.ts"],"names":[],"mappings":"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"}
|