@messegy/mcp 1.0.0

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 (77) hide show
  1. package/README.md +133 -0
  2. package/api/index.js +3 -0
  3. package/dist/api-client.d.ts +10 -0
  4. package/dist/api-client.js +100 -0
  5. package/dist/api-client.js.map +1 -0
  6. package/dist/cli-setup.d.ts +1 -0
  7. package/dist/cli-setup.js +74 -0
  8. package/dist/cli-setup.js.map +1 -0
  9. package/dist/config.d.ts +18 -0
  10. package/dist/config.js +88 -0
  11. package/dist/config.js.map +1 -0
  12. package/dist/index.d.ts +2 -0
  13. package/dist/index.js +56 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/lib/quota-guard.d.ts +19 -0
  16. package/dist/lib/quota-guard.js +101 -0
  17. package/dist/lib/quota-guard.js.map +1 -0
  18. package/dist/resources/index.d.ts +2 -0
  19. package/dist/resources/index.js +62 -0
  20. package/dist/resources/index.js.map +1 -0
  21. package/dist/server.d.ts +10 -0
  22. package/dist/server.js +364 -0
  23. package/dist/server.js.map +1 -0
  24. package/dist/tools/analytics.d.ts +2 -0
  25. package/dist/tools/analytics.js +42 -0
  26. package/dist/tools/analytics.js.map +1 -0
  27. package/dist/tools/auth.d.ts +2 -0
  28. package/dist/tools/auth.js +113 -0
  29. package/dist/tools/auth.js.map +1 -0
  30. package/dist/tools/auto-replies.d.ts +2 -0
  31. package/dist/tools/auto-replies.js +117 -0
  32. package/dist/tools/auto-replies.js.map +1 -0
  33. package/dist/tools/broadcasts.d.ts +2 -0
  34. package/dist/tools/broadcasts.js +58 -0
  35. package/dist/tools/broadcasts.js.map +1 -0
  36. package/dist/tools/chats.d.ts +2 -0
  37. package/dist/tools/chats.js +77 -0
  38. package/dist/tools/chats.js.map +1 -0
  39. package/dist/tools/contacts.d.ts +2 -0
  40. package/dist/tools/contacts.js +79 -0
  41. package/dist/tools/contacts.js.map +1 -0
  42. package/dist/tools/flows.d.ts +2 -0
  43. package/dist/tools/flows.js +148 -0
  44. package/dist/tools/flows.js.map +1 -0
  45. package/dist/tools/messages.d.ts +2 -0
  46. package/dist/tools/messages.js +149 -0
  47. package/dist/tools/messages.js.map +1 -0
  48. package/dist/tools/shopify.d.ts +2 -0
  49. package/dist/tools/shopify.js +66 -0
  50. package/dist/tools/shopify.js.map +1 -0
  51. package/dist/tools/templates.d.ts +2 -0
  52. package/dist/tools/templates.js +160 -0
  53. package/dist/tools/templates.js.map +1 -0
  54. package/dist/web-app.d.ts +1 -0
  55. package/dist/web-app.js +845 -0
  56. package/dist/web-app.js.map +1 -0
  57. package/package.json +42 -0
  58. package/src/api-client.ts +112 -0
  59. package/src/cli-setup.ts +87 -0
  60. package/src/config.ts +111 -0
  61. package/src/index.ts +66 -0
  62. package/src/lib/quota-guard.ts +138 -0
  63. package/src/resources/index.ts +70 -0
  64. package/src/server.ts +408 -0
  65. package/src/tools/analytics.ts +58 -0
  66. package/src/tools/auth.ts +136 -0
  67. package/src/tools/auto-replies.ts +144 -0
  68. package/src/tools/broadcasts.ts +73 -0
  69. package/src/tools/chats.ts +100 -0
  70. package/src/tools/contacts.ts +99 -0
  71. package/src/tools/flows.ts +192 -0
  72. package/src/tools/messages.ts +177 -0
  73. package/src/tools/shopify.ts +80 -0
  74. package/src/tools/templates.ts +193 -0
  75. package/src/web-app.ts +844 -0
  76. package/tsconfig.json +18 -0
  77. package/vercel.json +10 -0
@@ -0,0 +1,149 @@
1
+ import { z } from 'zod';
2
+ import { api } from '../api-client.js';
3
+ import { enforcePlanQuota } from '../lib/quota-guard.js';
4
+ export function registerMessageTools(server) {
5
+ /**
6
+ * 1. Send Single WhatsApp Message (Text or Media)
7
+ */
8
+ server.tool('messegy_send_whatsapp_message', 'Send a direct WhatsApp message (text, image, video, document, audio) to a customer phone number via Messegy WhatsApp Cloud API', {
9
+ to: z.string().describe('Recipient phone number with country code (e.g. 919876543210 or +14155552671)'),
10
+ type: z.enum(['text', 'image', 'video', 'document', 'audio']).default('text').describe('Message type'),
11
+ text: z.string().optional().describe('Text message body (required if type is text)'),
12
+ media_url: z.string().url().optional().describe('Direct publicly accessible URL for image, video, document, or audio'),
13
+ caption: z.string().optional().describe('Optional caption for media files'),
14
+ filename: z.string().optional().describe('Optional custom filename for document attachments'),
15
+ }, async (params) => {
16
+ // 1. Quota & Plan Limits Check
17
+ await enforcePlanQuota('send_message');
18
+ const cleanTo = params.to.replace(/[^\d]/g, '');
19
+ const payload = {
20
+ to: cleanTo,
21
+ type: params.type,
22
+ };
23
+ if (params.type === 'text') {
24
+ if (!params.text) {
25
+ return {
26
+ content: [{ type: 'text', text: 'Error: "text" parameter is required when type is "text".' }],
27
+ isError: true,
28
+ };
29
+ }
30
+ payload.message = params.text;
31
+ payload.text = { body: params.text };
32
+ }
33
+ else {
34
+ if (!params.media_url) {
35
+ return {
36
+ content: [{ type: 'text', text: `Error: "media_url" parameter is required when type is "${params.type}".` }],
37
+ isError: true,
38
+ };
39
+ }
40
+ payload[params.type] = {
41
+ link: params.media_url,
42
+ caption: params.caption,
43
+ filename: params.filename,
44
+ };
45
+ }
46
+ const result = await api.post('/v1/messages/send', payload);
47
+ return {
48
+ content: [
49
+ {
50
+ type: 'text',
51
+ text: `✅ WhatsApp message dispatched successfully to +${cleanTo}!\n\nResponse:\n${JSON.stringify(result, null, 2)}`,
52
+ },
53
+ ],
54
+ };
55
+ });
56
+ /**
57
+ * 2. Send Interactive Quick Reply Buttons
58
+ */
59
+ server.tool('messegy_send_interactive_buttons', 'Send an interactive WhatsApp message with up to 3 clickable quick-reply buttons', {
60
+ to: z.string().describe('Recipient phone number with country code'),
61
+ body_text: z.string().describe('Main body text of the message'),
62
+ header_text: z.string().optional().describe('Optional header text'),
63
+ footer_text: z.string().optional().describe('Optional small footer text'),
64
+ buttons: z
65
+ .array(z.object({
66
+ id: z.string().describe('Unique button identifier payload (e.g. btn_confirm, btn_cancel)'),
67
+ title: z.string().max(20).describe('Button label text (max 20 chars)'),
68
+ }))
69
+ .min(1)
70
+ .max(3)
71
+ .describe('List of 1 to 3 interactive buttons'),
72
+ }, async (params) => {
73
+ const cleanTo = params.to.replace(/[^\d]/g, '');
74
+ const payload = {
75
+ to: cleanTo,
76
+ type: 'interactive',
77
+ interactive: {
78
+ type: 'button',
79
+ header: params.header_text ? { type: 'text', text: params.header_text } : undefined,
80
+ body: { text: params.body_text },
81
+ footer: params.footer_text ? { text: params.footer_text } : undefined,
82
+ action: {
83
+ buttons: params.buttons.map((b) => ({
84
+ type: 'reply',
85
+ reply: {
86
+ id: b.id,
87
+ title: b.title,
88
+ },
89
+ })),
90
+ },
91
+ },
92
+ };
93
+ const result = await api.post('/v1/messages/interactive', payload);
94
+ return {
95
+ content: [
96
+ {
97
+ type: 'text',
98
+ text: `✅ Interactive button message sent to +${cleanTo}!\n\n${JSON.stringify(result, null, 2)}`,
99
+ },
100
+ ],
101
+ };
102
+ });
103
+ /**
104
+ * 3. Send Interactive List Menu
105
+ */
106
+ server.tool('messegy_send_list_menu', 'Send an interactive WhatsApp dropdown list menu with structured sections and selectable rows (up to 10 rows)', {
107
+ to: z.string().describe('Recipient phone number with country code'),
108
+ button_text: z.string().max(20).describe('Label on the list menu trigger button (e.g. "Select Option")'),
109
+ body_text: z.string().describe('Main body description text'),
110
+ header_text: z.string().optional().describe('Optional header text'),
111
+ footer_text: z.string().optional().describe('Optional footer text'),
112
+ sections: z
113
+ .array(z.object({
114
+ title: z.string().describe('Section category title'),
115
+ rows: z.array(z.object({
116
+ id: z.string().describe('Unique row ID (e.g. opt_1)'),
117
+ title: z.string().max(24).describe('Row title (max 24 chars)'),
118
+ description: z.string().max(72).optional().describe('Optional row description'),
119
+ })),
120
+ }))
121
+ .describe('Sections containing menu items'),
122
+ }, async (params) => {
123
+ const cleanTo = params.to.replace(/[^\d]/g, '');
124
+ const payload = {
125
+ to: cleanTo,
126
+ type: 'interactive',
127
+ interactive: {
128
+ type: 'list',
129
+ header: params.header_text ? { type: 'text', text: params.header_text } : undefined,
130
+ body: { text: params.body_text },
131
+ footer: params.footer_text ? { text: params.footer_text } : undefined,
132
+ action: {
133
+ button: params.button_text,
134
+ sections: params.sections,
135
+ },
136
+ },
137
+ };
138
+ const result = await api.post('/v1/messages/interactive', payload);
139
+ return {
140
+ content: [
141
+ {
142
+ type: 'text',
143
+ text: `✅ Interactive list menu sent to +${cleanTo}!\n\n${JSON.stringify(result, null, 2)}`,
144
+ },
145
+ ],
146
+ };
147
+ });
148
+ }
149
+ //# sourceMappingURL=messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/tools/messages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerShopifyTools(server: McpServer): void;
@@ -0,0 +1,66 @@
1
+ import { z } from 'zod';
2
+ import { api } from '../api-client.js';
3
+ export function registerShopifyTools(server) {
4
+ /**
5
+ * 1. Send Abandoned Cart Recovery Message
6
+ */
7
+ server.tool('messegy_trigger_shopify_abandoned_cart', 'Trigger an automated WhatsApp abandoned checkout recovery message with customer name, item details, and direct checkout link', {
8
+ customer_phone: z.string().describe('Customer phone number with country code'),
9
+ customer_name: z.string().describe('Customer first name'),
10
+ checkout_url: z.string().url().describe('Direct Shopify abandoned checkout URL with auto-applied discount'),
11
+ cart_total: z.string().optional().describe('Cart total with currency symbol (e.g. "₹1,499" or "$49.99")'),
12
+ discount_code: z.string().optional().describe('Optional coupon code (e.g. "SAVE10")'),
13
+ }, async (params) => {
14
+ const cleanPhone = params.customer_phone.replace(/[^\d]/g, '');
15
+ const payload = {
16
+ phone: cleanPhone,
17
+ event: 'abandoned_checkout',
18
+ variables: {
19
+ name: params.customer_name,
20
+ checkout_url: params.checkout_url,
21
+ cart_total: params.cart_total,
22
+ discount_code: params.discount_code,
23
+ },
24
+ };
25
+ const result = await api.post('/v1/integrations/shopify/trigger', payload);
26
+ return {
27
+ content: [
28
+ {
29
+ type: 'text',
30
+ text: `🛒 Abandoned cart recovery WhatsApp message triggered for +${cleanPhone}!\n\n${JSON.stringify(result, null, 2)}`,
31
+ },
32
+ ],
33
+ };
34
+ });
35
+ /**
36
+ * 2. Send Order Confirmation / Fulfillment Tracking
37
+ */
38
+ server.tool('messegy_send_order_notification', 'Send an automated WhatsApp notification for order confirmation, shipping update, or tracking link', {
39
+ customer_phone: z.string().describe('Customer phone number with country code'),
40
+ order_number: z.string().describe('Order ID (e.g. "#1048")'),
41
+ event_type: z.enum(['order_created', 'order_shipped', 'order_delivered', 'cod_verification']).describe('Type of order event'),
42
+ tracking_url: z.string().url().optional().describe('Package tracking link'),
43
+ order_total: z.string().optional().describe('Order total with currency'),
44
+ }, async (params) => {
45
+ const cleanPhone = params.customer_phone.replace(/[^\d]/g, '');
46
+ const payload = {
47
+ phone: cleanPhone,
48
+ event: params.event_type,
49
+ variables: {
50
+ order_number: params.order_number,
51
+ tracking_url: params.tracking_url,
52
+ order_total: params.order_total,
53
+ },
54
+ };
55
+ const result = await api.post('/v1/integrations/shopify/trigger', payload);
56
+ return {
57
+ content: [
58
+ {
59
+ type: 'text',
60
+ text: `📦 Order notification [${params.event_type}] sent to +${cleanPhone}!\n\n${JSON.stringify(result, null, 2)}`,
61
+ },
62
+ ],
63
+ };
64
+ });
65
+ }
66
+ //# sourceMappingURL=shopify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shopify.js","sourceRoot":"","sources":["../../src/tools/shopify.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAEvC,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD;;OAEG;IACH,MAAM,CAAC,IAAI,CACT,wCAAwC,EACxC,8HAA8H,EAC9H;QACE,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;QAC9E,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;QACzD,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,kEAAkE,CAAC;QAC3G,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6DAA6D,CAAC;QACzG,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;KACtF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,UAAU,GAAG,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC/D,MAAM,OAAO,GAAG;YACd,KAAK,EAAE,UAAU;YACjB,KAAK,EAAE,oBAAoB;YAC3B,SAAS,EAAE;gBACT,IAAI,EAAE,MAAM,CAAC,aAAa;gBAC1B,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,aAAa,EAAE,MAAM,CAAC,aAAa;aACpC;SACF,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,kCAAkC,EAAE,OAAO,CAAC,CAAC;QAC3E,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,8DAA8D,UAAU,QAAQ,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;iBACxH;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;IAEF;;OAEG;IACH,MAAM,CAAC,IAAI,CACT,iCAAiC,EACjC,mGAAmG,EACnG;QACE,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;QAC9E,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QAC5D,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,eAAe,EAAE,eAAe,EAAE,iBAAiB,EAAE,kBAAkB,CAAC,CAAC,CAAC,QAAQ,CAAC,qBAAqB,CAAC;QAC7H,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QAC3E,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;KACzE,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,UAAU,GAAG,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC/D,MAAM,OAAO,GAAG;YACd,KAAK,EAAE,UAAU;YACjB,KAAK,EAAE,MAAM,CAAC,UAAU;YACxB,SAAS,EAAE;gBACT,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,WAAW,EAAE,MAAM,CAAC,WAAW;aAChC;SACF,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,kCAAkC,EAAE,OAAO,CAAC,CAAC;QAC3E,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,0BAA0B,MAAM,CAAC,UAAU,cAAc,UAAU,QAAQ,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;iBACnH;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerTemplateTools(server: McpServer): void;
@@ -0,0 +1,160 @@
1
+ import { z } from 'zod';
2
+ import { api } from '../api-client.js';
3
+ export function registerTemplateTools(server) {
4
+ /**
5
+ * 1. List Meta WhatsApp Templates
6
+ */
7
+ server.tool('messegy_list_templates', 'List all WhatsApp templates registered in your Messegy account, with status (APPROVED, PENDING, REJECTED) and category', {
8
+ status: z.enum(['ALL', 'APPROVED', 'PENDING', 'REJECTED']).optional().describe('Filter by template status'),
9
+ search: z.string().optional().describe('Search templates by name or keyword'),
10
+ }, async (params) => {
11
+ const queryParams = {};
12
+ if (params.status && params.status !== 'ALL') {
13
+ queryParams.status = params.status;
14
+ }
15
+ if (params.search) {
16
+ queryParams.search = params.search;
17
+ }
18
+ const result = await api.get('/v1/templates', queryParams);
19
+ const templates = result.data || result.templates || result;
20
+ return {
21
+ content: [
22
+ {
23
+ type: 'text',
24
+ text: `📋 Found ${Array.isArray(templates) ? templates.length : 0} templates:\n\n${JSON.stringify(templates, null, 2)}`,
25
+ },
26
+ ],
27
+ };
28
+ });
29
+ /**
30
+ * 2. Send WhatsApp Template Message with Dynamic Variables
31
+ */
32
+ server.tool('messegy_send_template_message', 'Send a pre-approved Meta WhatsApp Template message with dynamic body parameters ({{1}}, {{2}}), header media, or button payloads', {
33
+ to: z.string().describe('Recipient phone number with country code'),
34
+ template_name: z.string().describe('Exact name of the approved template in Messegy / Meta (e.g. order_confirmation_v1)'),
35
+ language_code: z.string().default('en').describe('Language code of the template (e.g. "en", "en_US", "hi")'),
36
+ body_variables: z.array(z.string()).optional().describe('Ordered list of dynamic text values to replace {{1}}, {{2}}, etc. in the template body'),
37
+ header_media_url: z.string().url().optional().describe('Optional image/document/video URL if template has a media header'),
38
+ button_payloads: z.array(z.string()).optional().describe('Dynamic URL parameter or payload for template buttons'),
39
+ }, async (params) => {
40
+ const cleanTo = params.to.replace(/[^\d]/g, '');
41
+ const components = [];
42
+ // Header component if media provided
43
+ if (params.header_media_url) {
44
+ components.push({
45
+ type: 'header',
46
+ parameters: [
47
+ {
48
+ type: 'image',
49
+ image: { link: params.header_media_url },
50
+ },
51
+ ],
52
+ });
53
+ }
54
+ // Body parameters
55
+ if (params.body_variables && params.body_variables.length > 0) {
56
+ components.push({
57
+ type: 'body',
58
+ parameters: params.body_variables.map((val) => ({
59
+ type: 'text',
60
+ text: String(val),
61
+ })),
62
+ });
63
+ }
64
+ // Button parameters
65
+ if (params.button_payloads && params.button_payloads.length > 0) {
66
+ params.button_payloads.forEach((payload, idx) => {
67
+ components.push({
68
+ type: 'button',
69
+ sub_type: 'url',
70
+ index: String(idx),
71
+ parameters: [
72
+ {
73
+ type: 'text',
74
+ text: payload,
75
+ },
76
+ ],
77
+ });
78
+ });
79
+ }
80
+ const payload = {
81
+ to: cleanTo,
82
+ template: {
83
+ name: params.template_name,
84
+ language: { code: params.language_code },
85
+ components,
86
+ },
87
+ };
88
+ const result = await api.post('/v1/messages/template', payload);
89
+ return {
90
+ content: [
91
+ {
92
+ type: 'text',
93
+ text: `✅ Template "${params.template_name}" sent to +${cleanTo}!\n\n${JSON.stringify(result, null, 2)}`,
94
+ },
95
+ ],
96
+ };
97
+ });
98
+ /**
99
+ * 3. Create & Submit New WhatsApp Template to Meta
100
+ */
101
+ server.tool('messegy_create_template', 'Submit a new WhatsApp Template (Marketing, Utility, or Authentication) directly to Meta for instant approval', {
102
+ name: z.string().regex(/^[a-z0-9_]+$/).describe('Template identifier in lowercase with underscores only (e.g. diwali_sale_2026)'),
103
+ category: z.enum(['MARKETING', 'UTILITY', 'AUTHENTICATION']).describe('Template Category'),
104
+ language: z.string().default('en_US').describe('Template language code (e.g. en_US, hi)'),
105
+ body_text: z.string().describe('Main template text containing {{1}}, {{2}} placeholder variables'),
106
+ header_type: z.enum(['NONE', 'TEXT', 'IMAGE', 'DOCUMENT', 'VIDEO']).default('NONE').describe('Header type'),
107
+ header_text: z.string().optional().describe('Text if header_type is TEXT'),
108
+ footer_text: z.string().optional().describe('Optional small footer text'),
109
+ buttons: z
110
+ .array(z.object({
111
+ type: z.enum(['QUICK_REPLY', 'URL', 'PHONE_NUMBER']),
112
+ text: z.string().describe('Button title'),
113
+ url: z.string().url().optional().describe('URL if type is URL'),
114
+ phone_number: z.string().optional().describe('Phone number if type is PHONE_NUMBER'),
115
+ }))
116
+ .optional()
117
+ .describe('Optional interactive buttons'),
118
+ }, async (params) => {
119
+ const components = [];
120
+ if (params.header_type !== 'NONE') {
121
+ components.push({
122
+ type: 'HEADER',
123
+ format: params.header_type,
124
+ text: params.header_type === 'TEXT' ? params.header_text : undefined,
125
+ });
126
+ }
127
+ components.push({
128
+ type: 'BODY',
129
+ text: params.body_text,
130
+ });
131
+ if (params.footer_text) {
132
+ components.push({
133
+ type: 'FOOTER',
134
+ text: params.footer_text,
135
+ });
136
+ }
137
+ if (params.buttons && params.buttons.length > 0) {
138
+ components.push({
139
+ type: 'BUTTONS',
140
+ buttons: params.buttons,
141
+ });
142
+ }
143
+ const payload = {
144
+ name: params.name,
145
+ category: params.category,
146
+ language: params.language,
147
+ components,
148
+ };
149
+ const result = await api.post('/v1/templates', payload);
150
+ return {
151
+ content: [
152
+ {
153
+ type: 'text',
154
+ text: `🚀 Template "${params.name}" submitted to Meta for approval!\n\n${JSON.stringify(result, null, 2)}`,
155
+ },
156
+ ],
157
+ };
158
+ });
159
+ }
160
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/tools/templates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function getWebAppHtml(): string;