@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.
Files changed (71) hide show
  1. package/build/client.d.ts.map +1 -1
  2. package/build/client.js +3 -1
  3. package/build/client.js.map +1 -1
  4. package/build/config.d.ts.map +1 -1
  5. package/build/config.js +22 -4
  6. package/build/config.js.map +1 -1
  7. package/build/index.d.ts +1 -0
  8. package/build/index.d.ts.map +1 -1
  9. package/build/index.js +14 -11
  10. package/build/index.js.map +1 -1
  11. package/build/permissions.d.ts +2 -0
  12. package/build/permissions.d.ts.map +1 -0
  13. package/build/permissions.js +17 -0
  14. package/build/permissions.js.map +1 -0
  15. package/build/prompts/index.d.ts.map +1 -1
  16. package/build/prompts/index.js +4 -3
  17. package/build/prompts/index.js.map +1 -1
  18. package/build/tools/__tests__/catalog.test.js +20 -9
  19. package/build/tools/__tests__/catalog.test.js.map +1 -1
  20. package/build/tools/campaigns.d.ts +1 -1
  21. package/build/tools/campaigns.d.ts.map +1 -1
  22. package/build/tools/campaigns.js +244 -222
  23. package/build/tools/campaigns.js.map +1 -1
  24. package/build/tools/capabilities.d.ts.map +1 -1
  25. package/build/tools/capabilities.js +14 -5
  26. package/build/tools/capabilities.js.map +1 -1
  27. package/build/tools/contacts.d.ts +1 -1
  28. package/build/tools/contacts.d.ts.map +1 -1
  29. package/build/tools/contacts.js +356 -156
  30. package/build/tools/contacts.js.map +1 -1
  31. package/build/tools/domains.d.ts +1 -1
  32. package/build/tools/domains.d.ts.map +1 -1
  33. package/build/tools/domains.js +98 -96
  34. package/build/tools/domains.js.map +1 -1
  35. package/build/tools/export.d.ts +1 -1
  36. package/build/tools/export.d.ts.map +1 -1
  37. package/build/tools/export.js +97 -78
  38. package/build/tools/export.js.map +1 -1
  39. package/build/tools/generate.d.ts +1 -1
  40. package/build/tools/generate.d.ts.map +1 -1
  41. package/build/tools/generate.js +217 -109
  42. package/build/tools/generate.js.map +1 -1
  43. package/build/tools/metrics.d.ts +4 -0
  44. package/build/tools/metrics.d.ts.map +1 -0
  45. package/build/tools/metrics.js +39 -0
  46. package/build/tools/metrics.js.map +1 -0
  47. package/build/tools/projects.d.ts +1 -1
  48. package/build/tools/projects.d.ts.map +1 -1
  49. package/build/tools/projects.js +95 -77
  50. package/build/tools/projects.js.map +1 -1
  51. package/build/tools/segments.d.ts +1 -1
  52. package/build/tools/segments.d.ts.map +1 -1
  53. package/build/tools/segments.js +91 -67
  54. package/build/tools/segments.js.map +1 -1
  55. package/build/tools/send.d.ts +1 -1
  56. package/build/tools/send.d.ts.map +1 -1
  57. package/build/tools/send.js +72 -69
  58. package/build/tools/send.js.map +1 -1
  59. package/build/tools/tags.d.ts +1 -1
  60. package/build/tools/tags.d.ts.map +1 -1
  61. package/build/tools/tags.js +77 -69
  62. package/build/tools/tags.js.map +1 -1
  63. package/build/tools/validate.d.ts +1 -1
  64. package/build/tools/validate.d.ts.map +1 -1
  65. package/build/tools/validate.js +54 -44
  66. package/build/tools/validate.js.map +1 -1
  67. package/build/tools/webhooks.d.ts +1 -1
  68. package/build/tools/webhooks.d.ts.map +1 -1
  69. package/build/tools/webhooks.js +67 -57
  70. package/build/tools/webhooks.js.map +1 -1
  71. package/package.json +2 -2
@@ -1,115 +1,223 @@
1
1
  import { z } from "zod";
2
- export function registerGenerateTools(server, client, config) {
3
- server.registerTool("migma_generate_email", {
4
- title: "Generate Email",
5
- description: "Generate one email or a series from a text prompt. Uses the project's brand identity and returns finished HTML, subject lines, email IDs, and screenshots when complete.",
6
- inputSchema: z.object({
7
- projectId: z
8
- .string()
9
- .optional()
10
- .describe("Project/brand ID. Local stdio uses MIGMA_PROJECT_ID if not provided; hosted remote clients should pass projectId."),
11
- prompt: z.string().min(1).describe("Email generation prompt"),
12
- languages: z
13
- .array(z.string())
14
- .max(5)
15
- .optional()
16
- .describe("Languages (e.g. ['en', 'fr']). Default: ['en']"),
17
- count: z
18
- .number()
19
- .int()
20
- .min(1)
21
- .max(12)
22
- .optional()
23
- .describe("Target email count for a series. Omit to infer from prompt."),
24
- }),
25
- }, async (args) => {
26
- const projectId = args.projectId || config.projectId;
27
- if (!projectId) {
28
- return toolError("projectId is required. Provide projectId, or set MIGMA_PROJECT_ID when using local stdio.");
29
- }
30
- const { data, error } = await client.emails.generateAndWait({
31
- projectId,
32
- prompt: args.prompt,
33
- languages: args.languages,
34
- count: args.count,
2
+ import { canUse } from "../permissions.js";
3
+ export function registerGenerateTools(server, client, config, grantedPermissions) {
4
+ if (canUse(grantedPermissions, ["email:write", "email:read"])) {
5
+ server.registerTool("migma_generate_email", {
6
+ title: "Generate Email",
7
+ description: "Start generating one email or a series from a prompt. Returns conversationId immediately — generation keeps running in the background. Poll migma_get_generation_status with that id until status is completed or failed. Do not use migma_get_project or migma_list_campaigns to check progress. Charges 1 email credit per finished email.",
8
+ inputSchema: z.object({
9
+ projectId: z
10
+ .string()
11
+ .optional()
12
+ .describe("Project/brand ID. Local stdio uses MIGMA_PROJECT_ID if not provided; hosted remote clients should pass projectId."),
13
+ prompt: z.string().min(1).describe("Email generation prompt"),
14
+ languages: z
15
+ .array(z.string())
16
+ .max(5)
17
+ .optional()
18
+ .describe("Languages (e.g. ['en', 'fr']). Default: ['en']"),
19
+ count: z
20
+ .number()
21
+ .int()
22
+ .min(1)
23
+ .max(12)
24
+ .optional()
25
+ .describe("Target email count for a series. Omit to infer from prompt."),
26
+ }),
27
+ }, async (args) => {
28
+ const projectId = args.projectId || config.projectId;
29
+ if (!projectId) {
30
+ return toolError("projectId is required. Provide projectId, or set MIGMA_PROJECT_ID when using local stdio.");
31
+ }
32
+ const { data, error } = await client.emails.generate({
33
+ projectId,
34
+ prompt: args.prompt,
35
+ languages: args.languages,
36
+ count: args.count,
37
+ });
38
+ if (error)
39
+ return toolError(error.message);
40
+ return toolResult(data);
35
41
  });
36
- if (error)
37
- return toolError(error.message);
38
- return toolResult(data);
39
- });
40
- server.registerTool("migma_get_generation_status", {
41
- title: "Get Generation Status",
42
- description: "Check the status of an email generation. When complete, result.emails[] contains each generated email's emailId, HTML, subject, and screenshot URLs.",
43
- inputSchema: z.object({
44
- conversationId: z.string().describe("The conversation/generation ID"),
45
- }),
46
- }, async (args) => {
47
- const { data, error } = await client.emails.getGenerationStatus(args.conversationId);
48
- if (error)
49
- return toolError(error.message);
50
- return toolResult(data);
51
- });
52
- server.registerTool("migma_send_test_email", {
53
- title: "Send Test Email",
54
- description: "Send a test email for a generated email ID or a single-email conversation.",
55
- inputSchema: z.object({
56
- emailId: z
57
- .string()
58
- .optional()
59
- .describe("Generated email ID from result.emails[].emailId"),
60
- conversationId: z
61
- .string()
62
- .optional()
63
- .describe("Conversation ID. Works when the conversation contains a single email."),
64
- to: z.string().email().describe("Recipient email address"),
65
- }),
66
- }, async (args) => {
67
- if (!args.emailId && !args.conversationId) {
68
- return toolError("emailId or conversationId is required.");
69
- }
70
- const sendTestParams = {
71
- emailId: args.emailId,
72
- conversationId: args.conversationId,
73
- to: args.to,
74
- };
75
- const { data, error } = await client.emails.sendTest(sendTestParams);
76
- if (error)
77
- return toolError(error.message);
78
- return toolResult(data);
79
- });
80
- server.registerTool("migma_get_email", {
81
- title: "Get Email",
82
- description: "Fetch one generated email by emailId. Returns email-safe HTML, subject, screenshot URLs, and metadata.",
83
- inputSchema: z.object({
84
- emailId: z.string().describe("Generated email ID from result.emails[].emailId"),
85
- }),
86
- }, async (args) => {
87
- const { data, error } = await client.emails.get(args.emailId);
88
- if (error)
89
- return toolError(error.message);
90
- return toolResult(data);
91
- });
92
- server.registerTool("migma_edit_email", {
93
- title: "Edit Email",
94
- description: "Edit one generated email with a natural-language prompt. Returns the updated HTML, subject, screenshot URLs, and metadata.",
95
- inputSchema: z.object({
96
- emailId: z.string().describe("Generated email ID from result.emails[].emailId"),
97
- prompt: z
98
- .string()
99
- .min(1)
100
- .describe("Edit instruction, e.g. 'Make the welcome email shorter and more transactional.'"),
101
- label: z.string().optional().describe("Optional version label for this edit."),
102
- }),
103
- }, async (args) => {
104
- const emails = client.emails;
105
- const { data, error } = await emails.edit(args.emailId, {
106
- prompt: args.prompt,
107
- label: args.label,
42
+ }
43
+ if (canUse(grantedPermissions, ["email:read"])) {
44
+ server.registerTool("migma_get_generation_status", {
45
+ title: "Get Generation Status",
46
+ description: "Poll a generation started by migma_generate_email. Pass conversationId. Status is pending, processing, completed, or failed. When completed, result.emails[] has emailId, HTML, subject, and screenshots. This is how you check email design progress — not campaigns.",
47
+ annotations: { readOnlyHint: true },
48
+ inputSchema: z.object({
49
+ conversationId: z.string().describe("The conversation/generation ID"),
50
+ }),
51
+ }, async (args) => {
52
+ const { data, error } = await client.emails.getGenerationStatus(args.conversationId);
53
+ if (error)
54
+ return toolError(error.message);
55
+ return toolResult(data);
108
56
  });
109
- if (error)
110
- return toolError(error.message);
111
- return toolResult(data);
112
- });
57
+ }
58
+ if (canUse(grantedPermissions, ["email:send"])) {
59
+ server.registerTool("migma_send_test_email", {
60
+ title: "Send Test Email",
61
+ description: "Send a test email for a generated email ID or a single-email conversation.",
62
+ inputSchema: z.object({
63
+ emailId: z
64
+ .string()
65
+ .optional()
66
+ .describe("Generated email ID from result.emails[].emailId"),
67
+ conversationId: z
68
+ .string()
69
+ .optional()
70
+ .describe("Conversation ID. Works when the conversation contains a single email."),
71
+ to: z.string().email().describe("Recipient email address"),
72
+ }),
73
+ }, async (args) => {
74
+ if (!args.emailId && !args.conversationId) {
75
+ return toolError("emailId or conversationId is required.");
76
+ }
77
+ const sendTestParams = {
78
+ emailId: args.emailId,
79
+ conversationId: args.conversationId,
80
+ to: args.to,
81
+ };
82
+ const { data, error } = await client.emails.sendTest(sendTestParams);
83
+ if (error)
84
+ return toolError(error.message);
85
+ return toolResult(data);
86
+ });
87
+ }
88
+ if (canUse(grantedPermissions, ["email:read"])) {
89
+ server.registerTool("migma_list_emails", {
90
+ title: "List Emails",
91
+ description: "List generated email designs for a project (drafts in the canvas). Returns conversationId, title, subject, status (pending/processing/completed/failed), and screenshot. Use this to answer 'what emails do we have?'. Not campaigns — those are audience sends via migma_list_campaigns. Ignore project.templateCount.",
92
+ annotations: { readOnlyHint: true },
93
+ inputSchema: z.object({
94
+ projectId: z
95
+ .string()
96
+ .optional()
97
+ .describe("Project/brand ID. Local stdio uses MIGMA_PROJECT_ID if not provided; hosted remote clients should pass projectId."),
98
+ limit: z
99
+ .number()
100
+ .int()
101
+ .min(1)
102
+ .max(100)
103
+ .optional()
104
+ .describe("Max results (default 20)"),
105
+ page: z
106
+ .number()
107
+ .int()
108
+ .min(1)
109
+ .optional()
110
+ .describe("Page number (default 1)"),
111
+ status: z
112
+ .enum(["pending", "processing", "completed", "failed"])
113
+ .optional()
114
+ .describe("Filter by generation status"),
115
+ search: z.string().optional().describe("Search title or subject"),
116
+ }),
117
+ }, async (args) => {
118
+ const projectId = args.projectId || config.projectId;
119
+ if (!projectId) {
120
+ return toolError("projectId is required. Provide projectId, or set MIGMA_PROJECT_ID when using local stdio.");
121
+ }
122
+ const { data, error } = await client.emails.list({
123
+ projectId,
124
+ limit: args.limit,
125
+ page: args.page,
126
+ status: args.status,
127
+ search: args.search,
128
+ });
129
+ if (error)
130
+ return toolError(error.message);
131
+ return toolResult(data);
132
+ });
133
+ }
134
+ if (canUse(grantedPermissions, ["email:read"])) {
135
+ server.registerTool("migma_get_email", {
136
+ title: "Get Email",
137
+ description: "Fetch one generated email by emailId. Returns email-safe HTML, subject, screenshot URLs, variable requirements, and metadata.",
138
+ annotations: { readOnlyHint: true },
139
+ inputSchema: z.object({
140
+ emailId: z.string().describe("Generated email ID from result.emails[].emailId"),
141
+ }),
142
+ }, async (args) => {
143
+ const { data, error } = await client.emails.get(args.emailId);
144
+ if (error)
145
+ return toolError(error.message);
146
+ return toolResult(data);
147
+ });
148
+ }
149
+ if (canUse(grantedPermissions, ["email:write"])) {
150
+ server.registerTool("migma_edit_email", {
151
+ title: "Edit Email",
152
+ description: "Edit one generated email with a natural-language prompt. Returns the updated HTML, subject, screenshot URLs, and metadata. Charges 0.5 email credit, the same as an edit in the dashboard, taken only after the edit persists.",
153
+ inputSchema: z.object({
154
+ emailId: z.string().describe("Generated email ID from result.emails[].emailId"),
155
+ prompt: z
156
+ .string()
157
+ .min(1)
158
+ .describe("Edit instruction, e.g. 'Make the welcome email shorter and more transactional.'"),
159
+ label: z.string().optional().describe("Optional version label for this edit."),
160
+ }),
161
+ }, async (args) => {
162
+ const emails = client.emails;
163
+ const { data, error } = await emails.edit(args.emailId, {
164
+ prompt: args.prompt,
165
+ label: args.label,
166
+ });
167
+ if (error)
168
+ return toolError(error.message);
169
+ return toolResult(data);
170
+ });
171
+ }
172
+ if (canUse(grantedPermissions, ["email:read"])) {
173
+ server.registerTool("migma_get_email_metrics", {
174
+ title: "Get Email Metrics",
175
+ description: "Aggregate performance for one generated email across every API send of it: summary (totalEmails, delivered, opened, clicked, bounced, complained, unsubscribed, plus 0-100 rates), a daily timeSeries, and countryBreakdown. Sourced from the tracking worker (may be slightly stale, ~30-day raw window). Opens are directional — Apple Mail Privacy Protection and bots inflate them; clicks and delivery events are stronger signals.",
176
+ annotations: { readOnlyHint: true },
177
+ inputSchema: z.object({
178
+ emailId: z.string().describe("Generated email ID from result.emails[].emailId"),
179
+ }),
180
+ }, async (args) => {
181
+ const { data, error } = await client.emails.metrics(args.emailId);
182
+ if (error)
183
+ return toolError(error.message);
184
+ return toolResult(data);
185
+ });
186
+ }
187
+ if (canUse(grantedPermissions, ["email:read"])) {
188
+ server.registerTool("migma_get_email_logs", {
189
+ title: "Get Email Logs",
190
+ description: "Per-recipient send log for one generated email, cursor-paginated. Each row comes from the tracking worker's D1 table (snake_case): to_email, from_email, subject, status, opened_at, clicked_at, open_count, click_count, bounce_type, complaint_type, created_at. Returns { emails, nextCursor, hasMore }.",
191
+ annotations: { readOnlyHint: true },
192
+ inputSchema: z.object({
193
+ emailId: z.string().describe("Generated email ID from result.emails[].emailId"),
194
+ limit: z
195
+ .number()
196
+ .int()
197
+ .min(1)
198
+ .max(100)
199
+ .optional()
200
+ .describe("Max rows per page (default 20, capped at 100)"),
201
+ cursor: z
202
+ .string()
203
+ .optional()
204
+ .describe("Pagination cursor from a previous response's nextCursor"),
205
+ status: z
206
+ .enum(["delivered", "opened", "clicked", "bounced", "complained", "suppressed", "sent"])
207
+ .optional()
208
+ .describe("Filter rows by delivery/engagement status"),
209
+ }),
210
+ }, async (args) => {
211
+ const { data, error } = await client.emails.logs(args.emailId, {
212
+ limit: args.limit,
213
+ cursor: args.cursor,
214
+ status: args.status,
215
+ });
216
+ if (error)
217
+ return toolError(error.message);
218
+ return toolResult(data);
219
+ });
220
+ }
113
221
  }
114
222
  function toolResult(data) {
115
223
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/tools/generate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/tools/generate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { Migma } from "migma";
3
+ export declare function registerMetricsTools(server: McpServer, client: Migma, grantedPermissions?: string[]): void;
4
+ //# sourceMappingURL=metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/tools/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAInC,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,KAAK,EACb,kBAAkB,CAAC,EAAE,MAAM,EAAE,QA2B9B"}
@@ -0,0 +1,39 @@
1
+ import { z } from "zod";
2
+ import { canUse } from "../permissions.js";
3
+ export function registerMetricsTools(server, client, grantedPermissions) {
4
+ if (canUse(grantedPermissions, ["email:read"])) {
5
+ server.registerTool("migma_get_sending_metrics", {
6
+ title: "Get Sending Metrics",
7
+ description: "Get account sending usage, delivery outcomes, daily and monthly limits, remaining capacity, and optional monthly history.",
8
+ annotations: { readOnlyHint: true },
9
+ inputSchema: z.object({
10
+ months: z
11
+ .number()
12
+ .int()
13
+ .min(1)
14
+ .max(12)
15
+ .optional()
16
+ .describe("Number of monthly history periods to include (1-12)"),
17
+ }),
18
+ }, async (args) => {
19
+ const { data, error } = await client.metrics.sending({ months: args.months });
20
+ if (error)
21
+ return toolError(error.message);
22
+ return toolResult(data);
23
+ });
24
+ }
25
+ }
26
+ function toolResult(data) {
27
+ return {
28
+ content: [
29
+ { type: "text", text: JSON.stringify(data, null, 2) },
30
+ ],
31
+ };
32
+ }
33
+ function toolError(message) {
34
+ return {
35
+ content: [{ type: "text", text: message }],
36
+ isError: true,
37
+ };
38
+ }
39
+ //# sourceMappingURL=metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/tools/metrics.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,MAAM,UAAU,oBAAoB,CAClC,MAAiB,EACjB,MAAa,EACb,kBAA6B;IAE7B,IAAI,MAAM,CAAC,kBAAkB,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;QAC/C,MAAM,CAAC,YAAY,CACjB,2BAA2B,EAC3B;YACE,KAAK,EAAE,qBAAqB;YAC5B,WAAW,EACT,2HAA2H;YAC7H,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;YACnC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;gBACpB,MAAM,EAAE,CAAC;qBACN,MAAM,EAAE;qBACR,GAAG,EAAE;qBACL,GAAG,CAAC,CAAC,CAAC;qBACN,GAAG,CAAC,EAAE,CAAC;qBACP,QAAQ,EAAE;qBACV,QAAQ,CAAC,qDAAqD,CAAC;aACnE,CAAC;SACH,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;YACb,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YAC9E,IAAI,KAAK;gBAAE,OAAO,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC3C,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC,CACF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,IAAa;IAC/B,OAAO;QACL,OAAO,EAAE;YACP,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;SAC/D;KACF,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,OAAe;IAChC,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QACnD,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
2
  import type { Migma } from "migma";
3
3
  import type { Config } from "../config.js";
4
- export declare function registerProjectTools(server: McpServer, client: Migma, config: Config): void;
4
+ export declare function registerProjectTools(server: McpServer, client: Migma, config: Config, grantedPermissions?: string[]): void;
5
5
  //# sourceMappingURL=projects.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/tools/projects.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,oBAAoB,CAClC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,KAAK,EACb,MAAM,EAAE,MAAM,QAsGf"}
1
+ {"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/tools/projects.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;AAU3C,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,KAAK,EACb,MAAM,EAAE,MAAM,EACd,kBAAkB,CAAC,EAAE,MAAM,EAAE,QAiH9B"}
@@ -1,83 +1,101 @@
1
1
  import { z } from "zod";
2
- export function registerProjectTools(server, client, config) {
3
- server.registerTool("migma_list_projects", {
4
- title: "List Projects",
5
- description: "List all Migma projects (brands). Returns project IDs, names, domains, and statuses.",
6
- inputSchema: z.object({
7
- limit: z
8
- .number()
9
- .int()
10
- .min(1)
11
- .max(100)
12
- .optional()
13
- .describe("Max results (default 20)"),
14
- offset: z
15
- .number()
16
- .int()
17
- .min(0)
18
- .optional()
19
- .describe("Pagination offset"),
20
- }),
21
- }, async (args) => {
22
- const { data, error } = await client.projects.list({
23
- limit: args.limit,
24
- offset: args.offset,
2
+ import { canUse } from "../permissions.js";
3
+ export function registerProjectTools(server, client, config, grantedPermissions) {
4
+ if (canUse(grantedPermissions, ["email:read"])) {
5
+ server.registerTool("migma_list_projects", {
6
+ title: "List Projects",
7
+ description: "List all Migma projects (brands). Returns project IDs, names, domains, and statuses.",
8
+ annotations: { readOnlyHint: true },
9
+ inputSchema: z.object({
10
+ limit: z
11
+ .number()
12
+ .int()
13
+ .min(1)
14
+ .max(100)
15
+ .optional()
16
+ .describe("Max results (default 20)"),
17
+ offset: z
18
+ .number()
19
+ .int()
20
+ .min(0)
21
+ .optional()
22
+ .describe("Pagination offset"),
23
+ }),
24
+ }, async (args) => {
25
+ const { data, error } = await client.projects.list({
26
+ limit: args.limit,
27
+ offset: args.offset,
28
+ });
29
+ if (error)
30
+ return toolError(error.message);
31
+ return toolResult(data);
25
32
  });
26
- if (error)
27
- return toolError(error.message);
28
- return toolResult(data);
29
- });
30
- server.registerTool("migma_get_project", {
31
- title: "Get Project Details",
32
- description: "Get detailed information about a Migma project/brand including colors, fonts, logos, and tone of voice.",
33
- inputSchema: z.object({
34
- projectId: z.string().describe("The project ID"),
35
- }),
36
- }, async (args) => {
37
- const { data, error } = await client.projects.get(args.projectId);
38
- if (error)
39
- return toolError(error.message);
40
- return toolResult(data);
41
- });
42
- server.registerTool("migma_import_brand", {
43
- title: "Import Brand",
44
- description: "Import a brand from one or more website URLs. Extracts colors, fonts, logos, and tone of voice. Polls until import completes.",
45
- inputSchema: z.object({
46
- urls: z
47
- .array(z.string())
48
- .min(1)
49
- .max(10)
50
- .describe("Website URLs to import brand from"),
51
- }),
52
- }, async (args) => {
53
- const { data, error } = await client.projects.importAndWait({
54
- urls: args.urls,
33
+ }
34
+ if (canUse(grantedPermissions, ["email:read"])) {
35
+ server.registerTool("migma_get_project", {
36
+ title: "Get Project Details",
37
+ description: "Get brand details for a project: colors, fonts, logos, voice, knowledge base. Not the email inventory — templateCount, templates, and emails on this payload are unused leftovers. To list designed emails use migma_list_emails. To list audience sends use migma_list_campaigns.",
38
+ annotations: { readOnlyHint: true },
39
+ inputSchema: z.object({
40
+ projectId: z.string().describe("The project ID"),
41
+ }),
42
+ }, async (args) => {
43
+ const { data, error } = await client.projects.get(args.projectId);
44
+ if (error)
45
+ return toolError(error.message);
46
+ return toolResult(stripStaleProjectInventory(data));
55
47
  });
56
- if (error)
57
- return toolError(error.message);
58
- return toolResult(data);
59
- });
60
- server.registerTool("migma_get_field_catalog", {
61
- title: "Get Project Field Catalog",
62
- description: "Get the project's subscriber field catalog: which fields exist (e.g. firstName, company), how often each is populated (fillRate 0–1), example values, and whether the field is auto-filled at send time. Use this to discover available template variables before drafting an email. Optionally scope by segmentId or tag.",
63
- inputSchema: z.object({
64
- projectId: z.string().describe("The project ID"),
65
- segmentId: z
66
- .string()
67
- .optional()
68
- .describe("Restrict the catalog to subscribers in this segment"),
69
- tag: z
70
- .string()
71
- .optional()
72
- .describe("Restrict the catalog to subscribers with this tag id"),
73
- }),
74
- }, async (args) => {
75
- const projects = client.projects;
76
- const { data, error } = await projects.fieldCatalog(args.projectId, { segmentId: args.segmentId, tag: args.tag });
77
- if (error)
78
- return toolError(error.message);
79
- return toolResult(data);
80
- });
48
+ }
49
+ if (canUse(grantedPermissions, ["project:write", "email:read"])) {
50
+ server.registerTool("migma_import_brand", {
51
+ title: "Import Brand",
52
+ description: "Import a brand from one or more website URLs. Extracts colors, fonts, logos, and tone of voice. Polls until import completes.",
53
+ inputSchema: z.object({
54
+ urls: z
55
+ .array(z.string())
56
+ .min(1)
57
+ .max(10)
58
+ .describe("Website URLs to import brand from"),
59
+ }),
60
+ }, async (args) => {
61
+ const { data, error } = await client.projects.importAndWait({
62
+ urls: args.urls,
63
+ });
64
+ if (error)
65
+ return toolError(error.message);
66
+ return toolResult(data);
67
+ });
68
+ }
69
+ if (canUse(grantedPermissions, ["audience:read"])) {
70
+ server.registerTool("migma_get_field_catalog", {
71
+ title: "Get Project Field Catalog",
72
+ description: "Get the project's subscriber field catalog: which fields exist (e.g. firstName, company), how often each is populated (fillRate 0–1), example values, and whether the field is auto-filled at send time. Use this to discover available template variables before drafting an email. Optionally scope by segmentId or tag.",
73
+ annotations: { readOnlyHint: true },
74
+ inputSchema: z.object({
75
+ projectId: z.string().describe("The project ID"),
76
+ segmentId: z
77
+ .string()
78
+ .optional()
79
+ .describe("Restrict the catalog to subscribers in this segment"),
80
+ tag: z
81
+ .string()
82
+ .optional()
83
+ .describe("Restrict the catalog to subscribers with this tag id"),
84
+ }),
85
+ }, async (args) => {
86
+ const projects = client.projects;
87
+ const { data, error } = await projects.fieldCatalog(args.projectId, { segmentId: args.segmentId, tag: args.tag });
88
+ if (error)
89
+ return toolError(error.message);
90
+ return toolResult(data);
91
+ });
92
+ }
93
+ }
94
+ function stripStaleProjectInventory(data) {
95
+ if (!data || typeof data !== "object")
96
+ return data;
97
+ const { templateCount: _templateCount, templates: _templates, emails: _emails, ...brand } = data;
98
+ return brand;
81
99
  }
82
100
  function toolResult(data) {
83
101
  return {