@migma/mcp 1.7.2 → 1.7.3
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 +26 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +3 -2
- package/build/index.js.map +1 -1
- package/build/prompts/index.d.ts.map +1 -1
- package/build/prompts/index.js +21 -8
- package/build/prompts/index.js.map +1 -1
- package/build/tools/__tests__/brand.test.d.ts +2 -0
- package/build/tools/__tests__/brand.test.d.ts.map +1 -0
- package/build/tools/__tests__/brand.test.js +36 -0
- package/build/tools/__tests__/brand.test.js.map +1 -0
- package/build/tools/__tests__/campaign-recipients.test.d.ts +2 -0
- package/build/tools/__tests__/campaign-recipients.test.d.ts.map +1 -0
- package/build/tools/__tests__/campaign-recipients.test.js +61 -0
- package/build/tools/__tests__/campaign-recipients.test.js.map +1 -0
- package/build/tools/__tests__/catalog.test.js +15 -1
- package/build/tools/__tests__/catalog.test.js.map +1 -1
- package/build/tools/__tests__/context.test.d.ts +2 -0
- package/build/tools/__tests__/context.test.d.ts.map +1 -0
- package/build/tools/__tests__/context.test.js +89 -0
- package/build/tools/__tests__/context.test.js.map +1 -0
- package/build/tools/__tests__/email-edit.test.d.ts +2 -0
- package/build/tools/__tests__/email-edit.test.d.ts.map +1 -0
- package/build/tools/__tests__/email-edit.test.js +82 -0
- package/build/tools/__tests__/email-edit.test.js.map +1 -0
- package/build/tools/__tests__/segments.test.d.ts +2 -0
- package/build/tools/__tests__/segments.test.d.ts.map +1 -0
- package/build/tools/__tests__/segments.test.js +149 -0
- package/build/tools/__tests__/segments.test.js.map +1 -0
- package/build/tools/brand.d.ts.map +1 -1
- package/build/tools/brand.js +12 -7
- package/build/tools/brand.js.map +1 -1
- package/build/tools/campaigns.d.ts.map +1 -1
- package/build/tools/campaigns.js +13 -1
- package/build/tools/campaigns.js.map +1 -1
- package/build/tools/capabilities.d.ts +1 -0
- package/build/tools/capabilities.d.ts.map +1 -1
- package/build/tools/capabilities.js +13 -6
- package/build/tools/capabilities.js.map +1 -1
- package/build/tools/contacts.js +5 -5
- package/build/tools/contacts.js.map +1 -1
- package/build/tools/context.d.ts.map +1 -1
- package/build/tools/context.js +55 -32
- package/build/tools/context.js.map +1 -1
- package/build/tools/email-edit-client.d.ts +15 -0
- package/build/tools/email-edit-client.d.ts.map +1 -0
- package/build/tools/email-edit-client.js +38 -0
- package/build/tools/email-edit-client.js.map +1 -0
- package/build/tools/generate.d.ts.map +1 -1
- package/build/tools/generate.js +31 -7
- package/build/tools/generate.js.map +1 -1
- package/build/tools/segments.d.ts.map +1 -1
- package/build/tools/segments.js +34 -2
- package/build/tools/segments.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import test from "node:test";
|
|
3
|
+
import { createMigmaMcpServer } from "../../index.js";
|
|
4
|
+
function tools(emails, config = { apiKey: "test", baseUrl: "https://api.example.test/v1" }) {
|
|
5
|
+
const server = createMigmaMcpServer({ client: { emails }, config });
|
|
6
|
+
return server._registeredTools;
|
|
7
|
+
}
|
|
8
|
+
const data = (reply) => {
|
|
9
|
+
for (const item of reply.content) {
|
|
10
|
+
if (item.type !== 'text' || !item.text)
|
|
11
|
+
continue;
|
|
12
|
+
try {
|
|
13
|
+
return JSON.parse(item.text);
|
|
14
|
+
}
|
|
15
|
+
catch { /* Preview guidance precedes JSON. */ }
|
|
16
|
+
}
|
|
17
|
+
throw new Error('Missing JSON payload');
|
|
18
|
+
};
|
|
19
|
+
test('edit returns a queued handle without waiting, legacy editing, or preview fetch', async () => {
|
|
20
|
+
let starts = 0;
|
|
21
|
+
const registry = tools({
|
|
22
|
+
edit: () => { throw new Error('legacy edit must never run'); },
|
|
23
|
+
startEdit: async (emailId, params, options) => {
|
|
24
|
+
starts++;
|
|
25
|
+
assert.deepEqual(params, { prompt: 'Add Cursor + Grok Bot', label: undefined });
|
|
26
|
+
assert.deepEqual(options, { idempotencyKey: 'weekly-v2' });
|
|
27
|
+
return { data: { emailId, editId: 'edit-1', conversationId: 'conv-1', status: 'pending' } };
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
const result = data(await registry.migma_edit_email.handler({ emailId: 'email-1', prompt: 'Add Cursor + Grok Bot', idempotency_key: 'weekly-v2' }));
|
|
31
|
+
assert.equal(starts, 1);
|
|
32
|
+
assert.equal(result.status, 'pending');
|
|
33
|
+
assert.equal(result.editId, 'edit-1');
|
|
34
|
+
assert.equal(result.appUrl, 'https://migma.ai/chat?c=conv-1');
|
|
35
|
+
assert.match(result.nextStep, /migma_get_email_edit_status/);
|
|
36
|
+
});
|
|
37
|
+
test('status follows exact edit and exposes failures without another rewrite', async () => {
|
|
38
|
+
let state = 'processing';
|
|
39
|
+
const registry = tools({ getEditStatus: async (email, edit) => {
|
|
40
|
+
assert.equal(email, 'email-1');
|
|
41
|
+
assert.equal(edit, 'edit-1');
|
|
42
|
+
return { data: { editId: edit, status: state, ...(state === 'failed' ? { error: 'Provider failed', changesMayHaveBeenSaved: true }
|
|
43
|
+
: state === 'completed' ? { result: { emailId: email, conversationId: 'conv', html: '<p>updated</p>' } } : {}) } };
|
|
44
|
+
} });
|
|
45
|
+
const poll = (includeHtml = false) => registry.migma_get_email_edit_status.handler({ emailId: 'email-1', editId: 'edit-1', includeHtml });
|
|
46
|
+
assert.equal(data(await poll()).status, 'processing');
|
|
47
|
+
state = 'failed';
|
|
48
|
+
assert.equal(data(await poll()).error, 'Provider failed');
|
|
49
|
+
state = 'completed';
|
|
50
|
+
assert.equal(data(await poll()).result.html, undefined);
|
|
51
|
+
assert.equal(data(await poll(true)).result.html, '<p>updated</p>');
|
|
52
|
+
});
|
|
53
|
+
test('older SDK uses async REST with bounded wait and same replay key, never synchronous fallback', async () => {
|
|
54
|
+
const original = globalThis.fetch;
|
|
55
|
+
const calls = [];
|
|
56
|
+
globalThis.fetch = async (url, init) => {
|
|
57
|
+
calls.push({ url: String(url), init });
|
|
58
|
+
return new Response(JSON.stringify({ success: true, data: { editId: 'edit-1', emailId: 'email-1', status: 'pending' } }), { status: 202 });
|
|
59
|
+
};
|
|
60
|
+
try {
|
|
61
|
+
const registry = tools({ edit: () => { throw new Error('unsafe legacy call'); } });
|
|
62
|
+
await registry.migma_edit_email.handler({ emailId: 'email-1', prompt: 'Update', idempotency_key: 'stable-key' });
|
|
63
|
+
assert.equal(calls[0].url, 'https://api.example.test/v1/emails/email-1/edit');
|
|
64
|
+
assert.deepEqual(JSON.parse(String(calls[0].init?.body)), { prompt: 'Update', async: true });
|
|
65
|
+
assert.equal((calls[0].init?.headers)['Idempotency-Key'], 'stable-key');
|
|
66
|
+
assert.ok(calls[0].init?.signal);
|
|
67
|
+
await registry.migma_get_email_edit_status.handler({ emailId: 'email-1', editId: 'edit-1' });
|
|
68
|
+
assert.equal(calls[1].init?.method, 'GET');
|
|
69
|
+
assert.equal(calls[1].url, 'https://api.example.test/v1/emails/email-1/edits/edit-1');
|
|
70
|
+
}
|
|
71
|
+
finally {
|
|
72
|
+
globalThis.fetch = original;
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
test('uncertain submission preserves retry key and never claims processing', async () => {
|
|
76
|
+
const registry = tools({ startEdit: async () => ({ error: { message: 'Connection closed' } }) });
|
|
77
|
+
const reply = await registry.migma_edit_email.handler({ emailId: 'email-1', prompt: 'Update', idempotency_key: 'keep-me' });
|
|
78
|
+
assert.equal(reply.isError, true);
|
|
79
|
+
assert.equal(data(reply).idempotency_key, 'keep-me');
|
|
80
|
+
assert.equal(data(reply).status, undefined);
|
|
81
|
+
});
|
|
82
|
+
//# sourceMappingURL=email-edit.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-edit.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/email-edit.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"segments.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/segments.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import test from "node:test";
|
|
3
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
4
|
+
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
5
|
+
import { InMemoryTransport } from "@modelcontextprotocol/sdk/inMemory.js";
|
|
6
|
+
import { registerSegmentTools } from "../segments.js";
|
|
7
|
+
function createTool() {
|
|
8
|
+
const calls = [];
|
|
9
|
+
const client = {
|
|
10
|
+
segments: {
|
|
11
|
+
create: async (body) => {
|
|
12
|
+
calls.push(body);
|
|
13
|
+
return { data: { id: "segment-1" } };
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
const server = new McpServer({ name: "test", version: "1" });
|
|
18
|
+
registerSegmentTools(server, client, { apiKey: "test", projectId: "brand-1" });
|
|
19
|
+
const registered = server._registeredTools;
|
|
20
|
+
return { tool: registered.migma_create_segment, calls, server };
|
|
21
|
+
}
|
|
22
|
+
const fields = [{ key: "country", mode: "is", values: ["US"] }];
|
|
23
|
+
test("create segment preserves omitted filters and legacy/all matching", async () => {
|
|
24
|
+
const { tool, calls } = createTool();
|
|
25
|
+
for (const filters of [undefined, { fields }, { match: "all", fields }]) {
|
|
26
|
+
const args = tool.inputSchema.parse({ name: "Readers", filters });
|
|
27
|
+
await tool.handler(args, {});
|
|
28
|
+
assert.deepEqual(calls.at(-1), {
|
|
29
|
+
name: "Readers", description: undefined, filters, projectId: "brand-1",
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
test("create segment accepts any global activity and forwards complete parsed filters", async () => {
|
|
34
|
+
const { tool, calls } = createTool();
|
|
35
|
+
const filters = {
|
|
36
|
+
match: "any", fields, tags: ["customers"], excludeTags: ["staff"],
|
|
37
|
+
activity: [{ action: "opened", mode: "within", unit: "days", amount: 30 }],
|
|
38
|
+
};
|
|
39
|
+
const args = tool.inputSchema.parse({ name: "Engaged readers", filters, projectId: "brand-2" });
|
|
40
|
+
await tool.handler(args, {});
|
|
41
|
+
assert.deepEqual(calls, [{
|
|
42
|
+
name: "Engaged readers", description: undefined, filters, projectId: "brand-2",
|
|
43
|
+
}]);
|
|
44
|
+
});
|
|
45
|
+
test("create segment rejects campaign-specific any while preserving campaign all", () => {
|
|
46
|
+
const { tool, calls } = createTool();
|
|
47
|
+
const filters = {
|
|
48
|
+
match: "any", fields,
|
|
49
|
+
activity: [{ action: "clicked", mode: "never", campaignId: "campaign-1" }],
|
|
50
|
+
};
|
|
51
|
+
const result = tool.inputSchema.safeParse({ name: "Readers", filters });
|
|
52
|
+
assert.equal(result.success, false);
|
|
53
|
+
if (!result.success)
|
|
54
|
+
assert.deepEqual(result.error.issues[0].path, ["filters", "match"]);
|
|
55
|
+
assert.equal(tool.inputSchema.safeParse({ name: "Readers", filters: { ...filters, match: "all" } }).success, true);
|
|
56
|
+
assert.deepEqual(calls, []);
|
|
57
|
+
});
|
|
58
|
+
test("create segment forwards nested mixed groups without flattening or dropping conditions", async () => {
|
|
59
|
+
const { tool, calls } = createTool();
|
|
60
|
+
const filters = {
|
|
61
|
+
match: "all",
|
|
62
|
+
status: "subscribed",
|
|
63
|
+
groups: [{
|
|
64
|
+
match: "any",
|
|
65
|
+
fields,
|
|
66
|
+
groups: [{
|
|
67
|
+
tags: ["customers"], excludeTags: ["staff"], validationStatus: "valid",
|
|
68
|
+
customFields: { tier: ["premium"] },
|
|
69
|
+
groups: [{ activity: [{ action: "clicked", mode: "within", unit: "days", amount: 7 }] }],
|
|
70
|
+
}],
|
|
71
|
+
}],
|
|
72
|
+
};
|
|
73
|
+
const args = tool.inputSchema.parse({ name: "Mixed audience", filters });
|
|
74
|
+
await tool.handler(args, {});
|
|
75
|
+
assert.deepEqual(calls, [{
|
|
76
|
+
name: "Mixed audience", description: undefined, filters, projectId: "brand-1",
|
|
77
|
+
}]);
|
|
78
|
+
});
|
|
79
|
+
test("campaign activity requires all ancestors but allows an unrelated any sibling", () => {
|
|
80
|
+
const { tool } = createTool();
|
|
81
|
+
const campaign = { activity: [{ action: "clicked", mode: "never", campaignId: "campaign-1" }] };
|
|
82
|
+
for (const { filters, path } of [
|
|
83
|
+
{ filters: { match: "any", groups: [campaign] }, path: ["filters", "match"] },
|
|
84
|
+
{ filters: { groups: [{ match: "any", groups: [campaign] }] }, path: ["filters", "groups", 0, "match"] },
|
|
85
|
+
{ filters: { groups: [{ ...campaign, match: "any" }] }, path: ["filters", "groups", 0, "match"] },
|
|
86
|
+
]) {
|
|
87
|
+
const result = tool.inputSchema.safeParse({ name: "Readers", filters });
|
|
88
|
+
assert.equal(result.success, false);
|
|
89
|
+
if (!result.success) {
|
|
90
|
+
assert.deepEqual(result.error.issues[0].path, path);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
assert.equal(tool.inputSchema.safeParse({
|
|
94
|
+
name: "Readers", filters: { groups: [campaign, { match: "any", tags: ["customers"], fields }] },
|
|
95
|
+
}).success, true);
|
|
96
|
+
});
|
|
97
|
+
test("root may be empty but nested groups must contain a condition", () => {
|
|
98
|
+
const { tool } = createTool();
|
|
99
|
+
for (const empty of [{}, { match: "any" }, { groups: [] }, { tags: [], excludeTags: [], customFields: { tier: [] } }]) {
|
|
100
|
+
assert.equal(tool.inputSchema.safeParse({ name: "Everyone", filters: empty }).success, true);
|
|
101
|
+
const result = tool.inputSchema.safeParse({ name: "Empty group", filters: { groups: [empty] } });
|
|
102
|
+
assert.equal(result.success, false);
|
|
103
|
+
if (!result.success)
|
|
104
|
+
assert.deepEqual(result.error.issues[0].path, ["filters", "groups", 0]);
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
test("nested group depth and child count are bounded", () => {
|
|
108
|
+
const { tool } = createTool();
|
|
109
|
+
const atDepthThree = { groups: [{ groups: [{ groups: [{ status: "subscribed" }] }] }] };
|
|
110
|
+
assert.equal(tool.inputSchema.safeParse({ name: "Three levels", filters: atDepthThree }).success, true);
|
|
111
|
+
assert.equal(tool.inputSchema.safeParse({ name: "Four levels", filters: { groups: [atDepthThree] } }).success, false);
|
|
112
|
+
assert.equal(tool.inputSchema.safeParse({ name: "Invalid fourth level", filters: {
|
|
113
|
+
groups: [{ groups: [{ groups: [{ groups: [null] }] }] }],
|
|
114
|
+
} }).success, false);
|
|
115
|
+
const groups = Array.from({ length: 10 }, () => ({ status: "subscribed" }));
|
|
116
|
+
assert.equal(tool.inputSchema.safeParse({ name: "Ten children", filters: { groups } }).success, true);
|
|
117
|
+
assert.equal(tool.inputSchema.safeParse({ name: "Eleven children", filters: { groups: [...groups, groups[0]] } }).success, false);
|
|
118
|
+
});
|
|
119
|
+
test("condition cap counts leaves across groups, not array values or group containers", () => {
|
|
120
|
+
const { tool } = createTool();
|
|
121
|
+
const groups = Array.from({ length: 5 }, () => ({ fields: Array.from({ length: 10 }, () => fields[0]) }));
|
|
122
|
+
assert.equal(tool.inputSchema.safeParse({ name: "Fifty conditions", filters: { groups } }).success, true);
|
|
123
|
+
assert.equal(tool.inputSchema.safeParse({ name: "Fifty-one conditions", filters: { status: "subscribed", groups } }).success, false);
|
|
124
|
+
const manyValues = Array.from({ length: 100 }, (_, index) => `list-${index}`);
|
|
125
|
+
assert.equal(tool.inputSchema.safeParse({ name: "One condition", filters: { groups: [{ tags: manyValues }] } }).success, true);
|
|
126
|
+
const fiftyCustomFields = Object.fromEntries(Array.from({ length: 50 }, (_, index) => [`key-${index}`, ["value"]]));
|
|
127
|
+
assert.equal(tool.inputSchema.safeParse({ name: "Fifty fields", filters: { customFields: fiftyCustomFields } }).success, true);
|
|
128
|
+
assert.equal(tool.inputSchema.safeParse({ name: "Fifty-one fields", filters: { customFields: fiftyCustomFields, excludeTags: ["staff"] } }).success, false);
|
|
129
|
+
});
|
|
130
|
+
test("MCP advertises bounded nested groups in the create tool JSON schema", async () => {
|
|
131
|
+
const { server } = createTool();
|
|
132
|
+
const client = new Client({ name: "test-client", version: "1" });
|
|
133
|
+
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
|
|
134
|
+
await server.connect(serverTransport);
|
|
135
|
+
await client.connect(clientTransport);
|
|
136
|
+
try {
|
|
137
|
+
const { tools } = await client.listTools();
|
|
138
|
+
const schema = tools.find((tool) => tool.name === "migma_create_segment")?.inputSchema;
|
|
139
|
+
assert.ok(schema);
|
|
140
|
+
const serialized = JSON.stringify(schema);
|
|
141
|
+
assert.match(serialized, /"groups"/);
|
|
142
|
+
assert.match(serialized, /"maxItems":0/);
|
|
143
|
+
}
|
|
144
|
+
finally {
|
|
145
|
+
await client.close();
|
|
146
|
+
await server.close();
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
//# sourceMappingURL=segments.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"segments.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/segments.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAG1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAEtD,SAAS,UAAU;IACjB,MAAM,KAAK,GAAc,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAG;QACb,QAAQ,EAAE;YACR,MAAM,EAAE,KAAK,EAAE,IAAa,EAAE,EAAE;gBAC9B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACjB,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,CAAC;YACvC,CAAC;SACF;KACF,CAAC;IACF,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7D,oBAAoB,CAAC,MAAM,EAAE,MAA0B,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;IACnG,MAAM,UAAU,GAAI,MAKlB,CAAC,gBAAgB,CAAC;IACpB,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,oBAAoB,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAClE,CAAC;AAED,MAAM,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAEhE,IAAI,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;IAClF,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,UAAU,EAAE,CAAC;IACrC,KAAK,MAAM,OAAO,IAAI,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;QAClE,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC7B,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE;YAC7B,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;SACvE,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iFAAiF,EAAE,KAAK,IAAI,EAAE;IACjG,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,UAAU,EAAE,CAAC;IACrC,MAAM,OAAO,GAAG;QACd,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,CAAC,OAAO,CAAC;QACjE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;KAC3E,CAAC;IACF,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;IAChG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC7B,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;YACvB,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;SAC/E,CAAC,CAAC,CAAC;AACN,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,4EAA4E,EAAE,GAAG,EAAE;IACtF,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,UAAU,EAAE,CAAC;IACrC,MAAM,OAAO,GAAG;QACd,KAAK,EAAE,KAAK,EAAE,MAAM;QACpB,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;KAC3E,CAAC;IACF,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;IACxE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACpC,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;IACzF,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACnH,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAC9B,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,uFAAuF,EAAE,KAAK,IAAI,EAAE;IACvG,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,UAAU,EAAE,CAAC;IACrC,MAAM,OAAO,GAAG;QACd,KAAK,EAAE,KAAK;QACZ,MAAM,EAAE,YAAY;QACpB,MAAM,EAAE,CAAC;gBACP,KAAK,EAAE,KAAK;gBACZ,MAAM;gBACN,MAAM,EAAE,CAAC;wBACP,IAAI,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,CAAC,OAAO,CAAC,EAAE,gBAAgB,EAAE,OAAO;wBACtE,YAAY,EAAE,EAAE,IAAI,EAAE,CAAC,SAAS,CAAC,EAAE;wBACnC,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;qBACzF,CAAC;aACH,CAAC;KACH,CAAC;IACF,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC,CAAC;IACzE,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC7B,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;YACvB,IAAI,EAAE,gBAAgB,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;SAC9E,CAAC,CAAC,CAAC;AACN,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,8EAA8E,EAAE,GAAG,EAAE;IACxF,MAAM,EAAE,IAAI,EAAE,GAAG,UAAU,EAAE,CAAC;IAC9B,MAAM,QAAQ,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;IAChG,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI;QAC9B,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE;QAC7E,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE;QACxG,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE;KAClG,EAAE,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;QACxE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACpC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IACD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC;QACtC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;KAChG,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AACpB,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,8DAA8D,EAAE,GAAG,EAAE;IACxE,MAAM,EAAE,IAAI,EAAE,GAAG,UAAU,EAAE,CAAC;IAC9B,KAAK,MAAM,KAAK,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;QACtH,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC7F,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QACjG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACpC,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/F,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gDAAgD,EAAE,GAAG,EAAE;IAC1D,MAAM,EAAE,IAAI,EAAE,GAAG,UAAU,EAAE,CAAC;IAC9B,MAAM,YAAY,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACxF,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACxG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACtH,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE;YAC/E,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;SACzD,EAAE,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACrB,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;IAC5E,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACtG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AACpI,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iFAAiF,EAAE,GAAG,EAAE;IAC3F,MAAM,EAAE,IAAI,EAAE,GAAG,UAAU,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1G,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC1G,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACrI,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,QAAQ,KAAK,EAAE,CAAC,CAAC;IAC9E,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC/H,MAAM,iBAAiB,GAAG,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACpH,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,EAAE,YAAY,EAAE,iBAAiB,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC/H,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,EAAE,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AAC9J,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;IACrF,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;IACjE,MAAM,CAAC,eAAe,EAAE,eAAe,CAAC,GAAG,iBAAiB,CAAC,gBAAgB,EAAE,CAAC;IAChF,MAAM,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IACtC,MAAM,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,sBAAsB,CAAC,EAAE,WAAW,CAAC;QACvF,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;QAClB,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QACrC,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IAC3C,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brand.d.ts","sourceRoot":"","sources":["../../src/tools/brand.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAEnC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AA6D3C,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,KAAK,EACb,MAAM,EAAE,MAAM,EACd,kBAAkB,CAAC,EAAE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"brand.d.ts","sourceRoot":"","sources":["../../src/tools/brand.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAEnC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AA6D3C,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,KAAK,EACb,MAAM,EAAE,MAAM,EACd,kBAAkB,CAAC,EAAE,MAAM,EAAE,QAoI9B"}
|
package/build/tools/brand.js
CHANGED
|
@@ -41,13 +41,14 @@ export function registerBrandTools(server, client, config, grantedPermissions) {
|
|
|
41
41
|
.describe("Project/brand ID. Hosted clients should pass this."),
|
|
42
42
|
instructions: z
|
|
43
43
|
.string()
|
|
44
|
+
.trim()
|
|
44
45
|
.max(INSTRUCTIONS_MAX)
|
|
45
46
|
.optional()
|
|
46
|
-
.describe("The complete standing guidelines text, not a diff."),
|
|
47
|
+
.describe("The complete standing guidelines text, not a diff. An empty string clears the rules only when the user asks to remove them."),
|
|
47
48
|
imageStyle: imageStyleSchema.optional(),
|
|
48
49
|
})
|
|
49
|
-
.refine((value) => value.instructions !== undefined || value.imageStyle !== undefined, {
|
|
50
|
-
message: "Provide instructions
|
|
50
|
+
.refine((value) => value.instructions !== undefined || Object.values(value.imageStyle ?? {}).some(field => field !== undefined), {
|
|
51
|
+
message: "Provide instructions or at least one imageStyle field.",
|
|
51
52
|
}),
|
|
52
53
|
}, async (args) => {
|
|
53
54
|
const projectId = resolveProjectId(args.projectId, config);
|
|
@@ -59,7 +60,7 @@ export function registerBrandTools(server, client, config, grantedPermissions) {
|
|
|
59
60
|
}
|
|
60
61
|
const instructions = args.instructions?.trim();
|
|
61
62
|
const { data, error } = await brandClient.projects.updateBrandGuidelines(projectId, {
|
|
62
|
-
...(instructions ? { instructions } : {}),
|
|
63
|
+
...(instructions !== undefined ? { instructions } : {}),
|
|
63
64
|
...(args.imageStyle ? { imageStyle: args.imageStyle } : {}),
|
|
64
65
|
});
|
|
65
66
|
if (error)
|
|
@@ -67,27 +68,31 @@ export function registerBrandTools(server, client, config, grantedPermissions) {
|
|
|
67
68
|
return toolResult(data);
|
|
68
69
|
});
|
|
69
70
|
server.registerTool("migma_save_reference", {
|
|
70
|
-
title: "Save Design Reference",
|
|
71
|
+
title: "Favorite Email / Save Design Reference",
|
|
71
72
|
annotations: MUTATING_TOOL,
|
|
72
|
-
description: "
|
|
73
|
+
description: "Favorite an email / save its style for future emails of the same brand. Call when the user says 'I like this design', 'favorite this email', 'save this style', or 'use this style next time'. For a Migma email, pass only its exact emailId from generation status or list; a series needs the chosen slot's emailId, not conversationId. No HTML fetch or re-import needed. Sets favorite=true, so repeating that emailId is safe. Confirm only after favorite:true. This is a live reference to the latest saved version; future generation uses saved references by default unless disabled. For an external email, pass projectId + title + html (optional screenshotUrl); this creates a reference entry and is not a retry-safe favorite. Screenshot alone is not supported. Ask which email only if unclear. Requires project:write. Does not send mail.",
|
|
73
74
|
inputSchema: z
|
|
74
75
|
.object({
|
|
75
76
|
emailId: z
|
|
76
77
|
.string()
|
|
78
|
+
.trim()
|
|
79
|
+
.min(1)
|
|
77
80
|
.optional()
|
|
78
|
-
.describe("Favorite this generated email.
|
|
81
|
+
.describe("Favorite this exact generated email for its brand's future designs. For a series, use the chosen slot's emailId from generation status or list, not conversationId."),
|
|
79
82
|
projectId: z
|
|
80
83
|
.string()
|
|
81
84
|
.optional()
|
|
82
85
|
.describe("Project/brand ID for a pasted design. Hosted clients should pass this."),
|
|
83
86
|
title: z
|
|
84
87
|
.string()
|
|
88
|
+
.trim()
|
|
85
89
|
.min(1)
|
|
86
90
|
.max(100)
|
|
87
91
|
.optional()
|
|
88
92
|
.describe("Short label for a pasted design, e.g. Spring launch email."),
|
|
89
93
|
html: z
|
|
90
94
|
.string()
|
|
95
|
+
.trim()
|
|
91
96
|
.min(1)
|
|
92
97
|
.max(CONTENT_MAX)
|
|
93
98
|
.optional()
|
package/build/tools/brand.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brand.js","sourceRoot":"","sources":["../../src/tools/brand.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM,WAAW,GAAG,MAAM,CAAC;AAC3B,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAChC,MAAM,SAAS,GAAG,GAAG,CAAC;AAgCtB,SAAS,gBAAgB,CAAC,SAA6B,EAAE,MAAc;IACrE,OAAO,SAAS,IAAI,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC;AAC/C,CAAC;AAED,MAAM,gBAAgB,GAAG,CAAC;KACvB,MAAM,CAAC;IACN,UAAU,EAAE,CAAC;SACV,MAAM,EAAE;SACR,GAAG,CAAC,SAAS,CAAC;SACd,QAAQ,EAAE;SACV,QAAQ,CAAC,0EAA0E,CAAC;IACvF,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,GAAG,CAAC,SAAS,CAAC;SACd,QAAQ,EAAE;SACV,QAAQ,CAAC,wCAAwC,CAAC;IACrD,cAAc,EAAE,CAAC;SACd,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CAAC,+CAA+C,CAAC;CAC7D,CAAC;KACD,MAAM,EAAE,CAAC;AAEZ,MAAM,UAAU,kBAAkB,CAChC,MAAiB,EACjB,MAAa,EACb,MAAc,EACd,kBAA6B;IAE7B,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC,eAAe,CAAC,CAAC;QAAE,OAAO;IAC3D,MAAM,WAAW,GAAG,MAAqB,CAAC;IAE1C,MAAM,CAAC,YAAY,CACjB,+BAA+B,EAC/B;QACE,KAAK,EAAE,yBAAyB;QAChC,WAAW,EAAE,aAAa;QAC1B,WAAW,EACT,siBAAsiB;QACxiB,WAAW,EAAE,CAAC;aACX,MAAM,CAAC;YACN,SAAS,EAAE,CAAC;iBACT,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,oDAAoD,CAAC;YACjE,YAAY,EAAE,CAAC;iBACZ,MAAM,EAAE;iBACR,GAAG,CAAC,gBAAgB,CAAC;iBACrB,QAAQ,EAAE;iBACV,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"brand.js","sourceRoot":"","sources":["../../src/tools/brand.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"campaigns.d.ts","sourceRoot":"","sources":["../../src/tools/campaigns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAEnC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAS3C,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,KAAK,EACb,MAAM,EAAE,MAAM,EACd,kBAAkB,CAAC,EAAE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"campaigns.d.ts","sourceRoot":"","sources":["../../src/tools/campaigns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAEnC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAS3C,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,KAAK,EACb,MAAM,EAAE,MAAM,EACd,kBAAkB,CAAC,EAAE,MAAM,EAAE,QA6U9B"}
|
package/build/tools/campaigns.js
CHANGED
|
@@ -67,7 +67,12 @@ export function registerCampaignTools(server, client, config, grantedPermissions
|
|
|
67
67
|
recipientType: z
|
|
68
68
|
.enum(["audience", "tag"])
|
|
69
69
|
.describe("Send to a segment (audience) or a tag"),
|
|
70
|
-
recipientId: z.string().describe("Segment or
|
|
70
|
+
recipientId: z.string().describe("Segment or list ID"),
|
|
71
|
+
recipientIds: z
|
|
72
|
+
.array(z.string())
|
|
73
|
+
.max(20)
|
|
74
|
+
.optional()
|
|
75
|
+
.describe("Extra segment or list IDs of the same type. At most 20 unique IDs including recipientId. Unique people receive one email. Cannot mix segments and lists."),
|
|
71
76
|
topicId: z.string().optional().describe("Topic ID for preference filtering"),
|
|
72
77
|
providerType: z
|
|
73
78
|
.enum(["ses", "resend", "sendgrid", "mailgun", "migma"], {
|
|
@@ -86,6 +91,12 @@ export function registerCampaignTools(server, client, config, grantedPermissions
|
|
|
86
91
|
if (!projectId) {
|
|
87
92
|
return toolError("projectId is required. Provide projectId, or set MIGMA_PROJECT_ID when using local stdio.");
|
|
88
93
|
}
|
|
94
|
+
const recipientIds = args.recipientIds?.length
|
|
95
|
+
? Array.from(new Set([args.recipientId, ...args.recipientIds]))
|
|
96
|
+
: undefined;
|
|
97
|
+
if (recipientIds && recipientIds.length > 20) {
|
|
98
|
+
return toolError("recipientIds: at most 20 unique IDs including recipientId");
|
|
99
|
+
}
|
|
89
100
|
const params = {
|
|
90
101
|
projectId,
|
|
91
102
|
name: args.name,
|
|
@@ -98,6 +109,7 @@ export function registerCampaignTools(server, client, config, grantedPermissions
|
|
|
98
109
|
replyTo: args.replyTo,
|
|
99
110
|
recipientType: args.recipientType,
|
|
100
111
|
recipientId: args.recipientId,
|
|
112
|
+
recipientIds,
|
|
101
113
|
topicId: args.topicId,
|
|
102
114
|
providerType: args.providerType,
|
|
103
115
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"campaigns.js","sourceRoot":"","sources":["../../src/tools/campaigns.ts"],"names":[],"mappings":"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
|
|
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;AAMzE,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,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,OAAO,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;
|
|
1
|
+
{"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../src/tools/capabilities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE,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,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,OAAO,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAkCD;;;;GAIG;AACH,eAAO,MAAM,YAAY,EAAE,gBAAgB,EAkG1C,CAAC;AAEF,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,qBAAqB,CAa5E;AAeD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAoC5D;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB,EAAE,CAE1E;AAED,8FAA8F;AAC9F,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA0B/D;AAWD,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,EACf,kBAAkB,CAAC,EAAE,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsD9B;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,SAAS,EACjB,kBAAkB,CAAC,EAAE,MAAM,EAAE,QAyB9B"}
|
|
@@ -25,6 +25,7 @@ const DESTRUCTIVE_TOOL_NAMES = new Set([
|
|
|
25
25
|
"migma_cancel_campaign",
|
|
26
26
|
"migma_remove_contact",
|
|
27
27
|
"migma_batch_delete_contacts_by_email",
|
|
28
|
+
"migma_create_contact_import",
|
|
28
29
|
"migma_delete_tag",
|
|
29
30
|
"migma_delete_segment",
|
|
30
31
|
"migma_delete_webhook",
|
|
@@ -46,7 +47,7 @@ export const TOOL_CATALOG = [
|
|
|
46
47
|
{ name: "migma_list_knowledge_base", domain: "knowledge", summary: "List knowledge-base titles (compact; optional full content).", write: false, idempotent: false },
|
|
47
48
|
{ name: "migma_add_knowledge_base", domain: "knowledge", summary: "Append one lasting brand fact. No list-first required.", write: true, idempotent: false },
|
|
48
49
|
{ name: "migma_update_brand_guidelines", domain: "knowledge", summary: "Replace the brand's standing rules (binding text in every future email) and image style notes. Snapshot taken first.", write: true, idempotent: false },
|
|
49
|
-
{ name: "migma_save_reference", domain: "knowledge", summary: "
|
|
50
|
+
{ name: "migma_save_reference", domain: "knowledge", summary: "Favorite a liked email by exact emailId so future emails for its brand use its saved style. Also accepts external title + html.", write: true, idempotent: false },
|
|
50
51
|
// Email generation
|
|
51
52
|
{ name: "migma_generate_email", domain: "emails", summary: "Create, design, write, or generate one email or a series in a single call (pass count, max 12). Optional images, referenceId, idempotency_key. Returns conversationId. Poll status.", write: true, idempotent: true },
|
|
52
53
|
{ name: "migma_import_html", domain: "emails", summary: "Import or convert existing HTML / .eml into editable emails (optional instruction). One call, max 12 files. Returns conversationId. Poll status.", write: true, idempotent: true },
|
|
@@ -54,7 +55,8 @@ export const TOOL_CATALOG = [
|
|
|
54
55
|
{ name: "migma_list_emails", domain: "emails", summary: "List generated email designs with preview images and appUrl.", write: false, idempotent: false },
|
|
55
56
|
{ 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 },
|
|
56
57
|
{ name: "migma_get_email", domain: "emails", summary: "Fetch one email: preview image, appUrl, screenshotStatus. HTML off unless includeHtml.", write: false, idempotent: false },
|
|
57
|
-
{ name: "migma_edit_email", domain: "emails", summary: "
|
|
58
|
+
{ name: "migma_edit_email", domain: "emails", summary: "Queue an edit and return editId immediately. Poll migma_get_email_edit_status. Reuse idempotency_key after uncertain submission.", write: true, idempotent: true },
|
|
59
|
+
{ name: "migma_get_email_edit_status", domain: "emails", summary: "Poll one exact edit job by emailId and editId. Completed includes saved preview; failed includes error.", write: false, idempotent: false },
|
|
58
60
|
{ 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 },
|
|
59
61
|
{ name: "migma_get_email_logs", domain: "emails", summary: "Per-recipient send log for one generated email, cursor-paginated.", write: false, idempotent: false },
|
|
60
62
|
// Sending
|
|
@@ -101,7 +103,7 @@ export const TOOL_CATALOG = [
|
|
|
101
103
|
{ name: "migma_list_contacts", domain: "contacts", summary: "List contacts with optional filters and pagination.", write: false, idempotent: false },
|
|
102
104
|
{ name: "migma_add_contact", domain: "contacts", summary: "Create a new contact/subscriber.", write: true, idempotent: true },
|
|
103
105
|
{ name: "migma_bulk_import_contacts", domain: "contacts", summary: "Bulk import contacts from a JSON array (not CSV).", write: true, idempotent: true },
|
|
104
|
-
{ name: "migma_create_contact_import", domain: "contacts", summary: "
|
|
106
|
+
{ name: "migma_create_contact_import", domain: "contacts", summary: "CSV contact import with auto column mapping, tags, and counts. Default upsert can overwrite existing fields; onConflict=skip leaves existing contacts unchanged.", write: true, idempotent: false },
|
|
105
107
|
{ name: "migma_get_contact_import", domain: "contacts", summary: "Poll CSV import status when wait=false.", write: false, idempotent: false },
|
|
106
108
|
{ name: "migma_get_contact", domain: "contacts", summary: "Get details about a contact by id.", write: false, idempotent: false },
|
|
107
109
|
{ name: "migma_remove_contact", domain: "contacts", summary: "Delete a contact by id.", write: true, idempotent: false },
|
|
@@ -161,6 +163,8 @@ export function getToolRequiredScopes(name) {
|
|
|
161
163
|
return ["project:write"];
|
|
162
164
|
if (name === "migma_generate_email")
|
|
163
165
|
return ["email:write", "email:read"];
|
|
166
|
+
if (name === "migma_edit_email")
|
|
167
|
+
return ["email:write", "email:read"];
|
|
164
168
|
if (name === "migma_import_html")
|
|
165
169
|
return ["email:write", "email:read"];
|
|
166
170
|
if (name === "migma_send_test_email" || name === "migma_send_email")
|
|
@@ -228,7 +232,7 @@ export function buildCapabilitiesPayload(version, grantedPermissions) {
|
|
|
228
232
|
server: "migma",
|
|
229
233
|
version,
|
|
230
234
|
grantedScopes: grantedPermissions ?? null,
|
|
231
|
-
voice: "
|
|
235
|
+
voice: "Write like a person on WhatsApp: usually 1-2 short sentences, simple everyday words, matching the user's language. Lead with the result and relevant returned links using short labels. No fluff, hype, headings, long recaps, process narration, or automatic follow-up offers. Stop when the request is done. Ask one question only for missing input or approval. Expand when asked or needed for a decision; keep all send-approval details and material errors. Show returned previews. Keep tool names, IDs, and setup mechanics internal unless asked. Offer only tools below; a draft series is not an active automation, and email results do not prove sales or bookings.",
|
|
232
236
|
deliveryAccess: {
|
|
233
237
|
directAndTestEmail: hasScopes(grantedPermissions, ["email:send"]),
|
|
234
238
|
campaignCreateSendAndSchedule: hasScopes(grantedPermissions, ["campaign:write"]),
|
|
@@ -237,8 +241,11 @@ export function buildCapabilitiesPayload(version, grantedPermissions) {
|
|
|
237
241
|
channelRule: "Use one write channel per task. When MCP is selected, stop browser/REST creation, wait for in-flight work, list existing drafts, and reconcile before generating again.",
|
|
238
242
|
designFlow: "Resolve exact brand → build a source-backed required-fact checklist → one migma_generate_email (pass count; pass up to 5 public HTTPS source images through images, not only prompt text) → poll status → IMMEDIATELY show preview images + appUrl. After that first show, verify requested facts and source images before claiming success. Do not validate or edit before the first show.",
|
|
239
243
|
knowledgeBase: "Call migma_add_knowledge_base when the user shares lasting brand facts. Do not list first. List is optional review only.",
|
|
244
|
+
designReferences: availableToolNames.has("migma_save_reference")
|
|
245
|
+
? "When the user likes an email's design or asks to favorite/save its style, call migma_save_reference with the exact emailId (the selected slot for a series). No HTML fetch or re-import. Confirm only after favorite:true. Future emails for the same brand use saved references by default unless disabled; later edits update the reference. Repeating emailId is safe. External title + html creates a separate entry; screenshot alone cannot be saved. Keep one-off edits and lasting brand rules separate."
|
|
246
|
+
: "Saving a favorite or design reference requires project:write; migma_save_reference is unavailable to this connection.",
|
|
240
247
|
brandScoping: "The connection credential is account-scoped; pass projectId per tool (or set MIGMA_PROJECT_ID for local stdio). Resources in another project return 404.",
|
|
241
|
-
emailsVsCampaigns: "Designed emails use migma_list_emails and migma_get_generation_status. Audience sends use migma_list_campaigns. Brand details use migma_get_project. List, get,
|
|
248
|
+
emailsVsCampaigns: "Designed emails use migma_list_emails and migma_get_generation_status. Edits return editId immediately; poll migma_get_email_edit_status until completed, then show the preview. Never resubmit a processing edit. Audience sends use migma_list_campaigns. Brand details use migma_get_project. List, get, and completed status return preview images and appUrl. Set includeHtml when markup is needed.",
|
|
242
249
|
idempotency: {
|
|
243
250
|
header: "Idempotency-Key",
|
|
244
251
|
maxLength: 100,
|
|
@@ -257,7 +264,7 @@ export function registerCapabilitiesTool(server, grantedPermissions) {
|
|
|
257
264
|
server.registerTool("migma_get_capabilities", {
|
|
258
265
|
title: "Get Capabilities",
|
|
259
266
|
annotations: READ_ONLY_TOOL,
|
|
260
|
-
description: "Self-description of this server (migma_get_context returns live account state). Catalog includes migma_generate_email (new emails from a prompt; one call with count for a series), migma_import_html (convert existing HTML or .eml), edit, send, campaigns, audience, domains, and billing. Returns granted scopes, tools available to this connection, unavailable tools with missing scopes, compatible guided workflows, idempotency rules, and brand scoping. Use this result instead of promising tools hidden by the current credential.",
|
|
267
|
+
description: "Self-description of this server (migma_get_context returns live account state). Catalog includes migma_generate_email (new emails from a prompt; one call with count for a series), migma_import_html (convert existing HTML or .eml), migma_save_reference (favorite liked emails for future style), edit, send, campaigns, audience, domains, and billing. Returns granted scopes, tools available to this connection, unavailable tools with missing scopes, compatible guided workflows, idempotency rules, and brand scoping. Use this result instead of promising tools hidden by the current credential.",
|
|
261
268
|
inputSchema: z.object({}),
|
|
262
269
|
}, async () => {
|
|
263
270
|
const catalog = buildCapabilitiesPayload(version, grantedPermissions);
|