@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,2 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerResources(server: McpServer): void;
@@ -0,0 +1,62 @@
1
+ import { api } from '../api-client.js';
2
+ export function registerResources(server) {
3
+ /**
4
+ * Resource 1: Approved WhatsApp Templates Context
5
+ */
6
+ server.resource('messegy-templates', 'messegy://templates', async (uri) => {
7
+ try {
8
+ const res = await api.get('/v1/templates', { status: 'APPROVED' });
9
+ const templates = res.data || res.templates || res;
10
+ return {
11
+ contents: [
12
+ {
13
+ uri: uri.href,
14
+ mimeType: 'application/json',
15
+ text: JSON.stringify(templates, null, 2),
16
+ },
17
+ ],
18
+ };
19
+ }
20
+ catch (err) {
21
+ return {
22
+ contents: [
23
+ {
24
+ uri: uri.href,
25
+ mimeType: 'text/plain',
26
+ text: `Failed to fetch active templates: ${err.message}`,
27
+ },
28
+ ],
29
+ };
30
+ }
31
+ });
32
+ /**
33
+ * Resource 2: WhatsApp Account & Phone Health
34
+ */
35
+ server.resource('messegy-account', 'messegy://account-status', async (uri) => {
36
+ try {
37
+ const res = await api.get('/dashboard');
38
+ const data = res.data || res;
39
+ return {
40
+ contents: [
41
+ {
42
+ uri: uri.href,
43
+ mimeType: 'application/json',
44
+ text: JSON.stringify(data, null, 2),
45
+ },
46
+ ],
47
+ };
48
+ }
49
+ catch (err) {
50
+ return {
51
+ contents: [
52
+ {
53
+ uri: uri.href,
54
+ mimeType: 'text/plain',
55
+ text: `Failed to fetch account status: ${err.message}`,
56
+ },
57
+ ],
58
+ };
59
+ }
60
+ });
61
+ }
62
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAEvC,MAAM,UAAU,iBAAiB,CAAC,MAAiB;IACjD;;OAEG;IACH,MAAM,CAAC,QAAQ,CACb,mBAAmB,EACnB,qBAAqB,EACrB,KAAK,EAAE,GAAG,EAAE,EAAE;QACZ,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,eAAe,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;YACnE,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC;YACnD,OAAO;gBACL,QAAQ,EAAE;oBACR;wBACE,GAAG,EAAE,GAAG,CAAC,IAAI;wBACb,QAAQ,EAAE,kBAAkB;wBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;qBACzC;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO;gBACL,QAAQ,EAAE;oBACR;wBACE,GAAG,EAAE,GAAG,CAAC,IAAI;wBACb,QAAQ,EAAE,YAAY;wBACtB,IAAI,EAAE,qCAAqC,GAAG,CAAC,OAAO,EAAE;qBACzD;iBACF;aACF,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF;;OAEG;IACH,MAAM,CAAC,QAAQ,CACb,iBAAiB,EACjB,0BAA0B,EAC1B,KAAK,EAAE,GAAG,EAAE,EAAE;QACZ,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YACxC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC;YAC7B,OAAO;gBACL,QAAQ,EAAE;oBACR;wBACE,GAAG,EAAE,GAAG,CAAC,IAAI;wBACb,QAAQ,EAAE,kBAAkB;wBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;qBACpC;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO;gBACL,QAAQ,EAAE;oBACR;wBACE,GAAG,EAAE,GAAG,CAAC,IAAI;wBACb,QAAQ,EAAE,YAAY;wBACtB,IAAI,EAAE,mCAAmC,GAAG,CAAC,OAAO,EAAE;qBACvD;iBACF;aACF,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ declare const app: import("express-serve-static-core").Express;
2
+ export interface ActiveSession {
3
+ id: string;
4
+ client: string;
5
+ ip: string;
6
+ connectedAt: string;
7
+ lastActive: string;
8
+ }
9
+ export declare function startHttpMcpServer(port?: number | string): void;
10
+ export default app;
package/dist/server.js ADDED
@@ -0,0 +1,364 @@
1
+ import express from 'express';
2
+ import cors from 'cors';
3
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
4
+ import { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';
5
+ import { getWebAppHtml } from './web-app.js';
6
+ import { api } from './api-client.js';
7
+ import { fetchCurrentPlanUsage } from './lib/quota-guard.js';
8
+ import { saveConfig } from './config.js';
9
+ // Tool suites registration
10
+ import { registerAuthTools } from './tools/auth.js';
11
+ import { registerMessageTools } from './tools/messages.js';
12
+ import { registerTemplateTools } from './tools/templates.js';
13
+ import { registerChatTools } from './tools/chats.js';
14
+ import { registerContactTools } from './tools/contacts.js';
15
+ import { registerBroadcastTools } from './tools/broadcasts.js';
16
+ import { registerAnalyticsTools } from './tools/analytics.js';
17
+ import { registerAutoReplyTools } from './tools/auto-replies.js';
18
+ import { registerFlowTools } from './tools/flows.js';
19
+ import { registerShopifyTools } from './tools/shopify.js';
20
+ import { registerResources } from './resources/index.js';
21
+ const app = express();
22
+ const PORT = process.env.PORT || 3001;
23
+ app.use(cors());
24
+ app.use(express.json());
25
+ // Maintain active SSE transports & connected client sessions
26
+ const transports = {};
27
+ const activeSessions = {}; // Keyed by apiKeyMasked or apiKey
28
+ function createConfiguredMcpServer() {
29
+ const server = new McpServer({
30
+ name: 'messegy-whatsapp-cloud',
31
+ version: '1.0.0',
32
+ });
33
+ registerAuthTools(server);
34
+ registerMessageTools(server);
35
+ registerTemplateTools(server);
36
+ registerChatTools(server);
37
+ registerContactTools(server);
38
+ registerBroadcastTools(server);
39
+ registerAnalyticsTools(server);
40
+ registerAutoReplyTools(server);
41
+ registerFlowTools(server);
42
+ registerShopifyTools(server);
43
+ registerResources(server);
44
+ return server;
45
+ }
46
+ /**
47
+ * 1. Web App Home Page (mcp.messegy.com)
48
+ */
49
+ app.get('/', (_req, res) => {
50
+ res.setHeader('Content-Type', 'text/html');
51
+ res.send(getWebAppHtml());
52
+ });
53
+ /**
54
+ * 1-Line Curl Installer for Mac & Linux (Bypasses Gatekeeper)
55
+ */
56
+ app.get('/install.sh', (req, res) => {
57
+ const apiKey = req.query.api_key || '';
58
+ const script = `#!/bin/bash
59
+ echo "=========================================================="
60
+ echo " 🚀 Connecting Messegy WhatsApp to Claude Desktop..."
61
+ echo "=========================================================="
62
+
63
+ CONFIG_DIR="$HOME/Library/Application Support/Claude"
64
+ CONFIG_FILE="$CONFIG_DIR/claude_desktop_config.json"
65
+ mkdir -p "$CONFIG_DIR"
66
+
67
+ node -e "
68
+ const fs = require('fs');
69
+ const path = '$CONFIG_FILE';
70
+ let config = {};
71
+ if (fs.existsSync(path)) {
72
+ try { config = JSON.parse(fs.readFileSync(path, 'utf8')); } catch(e) {}
73
+ }
74
+ config.mcpServers = config.mcpServers || {};
75
+ config.mcpServers.messegy = {
76
+ url: 'https://mcp.messegy.com/sse',
77
+ headers: {
78
+ Authorization: 'Bearer ${apiKey}'
79
+ }
80
+ };
81
+ fs.writeFileSync(path, JSON.stringify(config, null, 2));
82
+ console.log('✅ Successfully connected Messegy to Claude Desktop!');
83
+ " 2>/dev/null || cat <<EOF > "$CONFIG_FILE"
84
+ {
85
+ "mcpServers": {
86
+ "messegy": {
87
+ "url": "https://mcp.messegy.com/sse",
88
+ "headers": {
89
+ "Authorization": "Bearer ${apiKey}"
90
+ }
91
+ }
92
+ }
93
+ }
94
+ EOF
95
+
96
+ echo ""
97
+ echo "🎉 SUCCESS! Messegy WhatsApp is now connected to Claude Desktop."
98
+ echo "👉 Restarting Claude Desktop..."
99
+ killall "Claude" 2>/dev/null || true
100
+ open -a "Claude" 2>/dev/null || open "https://claude.ai/download"
101
+ echo ""
102
+ `;
103
+ res.setHeader('Content-Type', 'text/plain');
104
+ res.send(script);
105
+ });
106
+ /**
107
+ * 1-Click Mac Installer Script Download (.command)
108
+ */
109
+ app.get('/download/mac', (req, res) => {
110
+ const apiKey = req.query.api_key || '';
111
+ const script = `#!/bin/bash
112
+ echo "=========================================================="
113
+ echo " 🚀 Connecting Messegy WhatsApp to Claude Desktop..."
114
+ echo "=========================================================="
115
+
116
+ CONFIG_DIR="$HOME/Library/Application Support/Claude"
117
+ CONFIG_FILE="$CONFIG_DIR/claude_desktop_config.json"
118
+
119
+ mkdir -p "$CONFIG_DIR"
120
+
121
+ if [ -f "$CONFIG_FILE" ]; then
122
+ # Merge or update
123
+ node -e "
124
+ const fs = require('fs');
125
+ let cfg = {};
126
+ try { cfg = JSON.parse(fs.readFileSync('$CONFIG_FILE', 'utf8')); } catch(e) {}
127
+ cfg.mcpServers = cfg.mcpServers || {};
128
+ cfg.mcpServers.messegy = {
129
+ command: 'npx',
130
+ args: ['-y', '@messegy/mcp']${apiKey ? `,\n env: { MESSEGY_API_KEY: '${apiKey}' }` : ''}
131
+ };
132
+ fs.writeFileSync('$CONFIG_FILE', JSON.stringify(cfg, null, 2));
133
+ " 2>/dev/null || true
134
+ else
135
+ cat <<EOF > "$CONFIG_FILE"
136
+ {
137
+ "mcpServers": {
138
+ "messegy": {
139
+ "command": "npx",
140
+ "args": ["-y", "@messegy/mcp"]${apiKey ? `,\n "env": {\n "MESSEGY_API_KEY": "${apiKey}"\n }` : ''}
141
+ }
142
+ }
143
+ }
144
+ EOF
145
+ fi
146
+
147
+ echo ""
148
+ echo "✅ SUCCESS! Messegy WhatsApp is now connected to Claude Desktop."
149
+ echo "👉 Opening Claude Desktop..."
150
+ open -a "Claude" 2>/dev/null || open "https://claude.ai/download"
151
+ echo ""
152
+ echo "Press any key to close..."
153
+ read -n 1
154
+ `;
155
+ res.setHeader('Content-Type', 'application/x-sh');
156
+ res.setHeader('Content-Disposition', 'attachment; filename="Setup-Messegy-Claude.command"');
157
+ res.send(script);
158
+ });
159
+ /**
160
+ * 1-Click Windows Installer Script Download (.bat)
161
+ */
162
+ app.get('/download/windows', (req, res) => {
163
+ const apiKey = req.query.api_key || '';
164
+ const script = `@echo off
165
+ echo ==========================================================
166
+ echo Connecting Messegy WhatsApp to Claude Desktop...
167
+ echo ==========================================================
168
+
169
+ set "CONFIG_DIR=%APPDATA%\\Claude"
170
+ set "CONFIG_FILE=%CONFIG_DIR%\\claude_desktop_config.json"
171
+
172
+ if not exist "%CONFIG_DIR%" mkdir "%CONFIG_DIR%"
173
+
174
+ (
175
+ echo {
176
+ echo "mcpServers": {
177
+ echo "messegy": {
178
+ echo "command": "npx",
179
+ echo "args": ["-y", "@messegy/mcp"]${apiKey ? `,\necho "env": {\necho "MESSEGY_API_KEY": "${apiKey}"\necho }` : ''}
180
+ echo }
181
+ echo }
182
+ echo }
183
+ ) > "%CONFIG_FILE%"
184
+
185
+ echo.
186
+ echo SUCCESS! Messegy WhatsApp is now connected to Claude Desktop.
187
+ echo Please start or restart Claude Desktop.
188
+ echo.
189
+ pause
190
+ `;
191
+ res.setHeader('Content-Type', 'application/bat');
192
+ res.setHeader('Content-Disposition', 'attachment; filename="Setup-Messegy-Claude.bat"');
193
+ res.send(script);
194
+ });
195
+ /**
196
+ * 2. API: Verify Key & Fetch Live Workspace Quota & Active Connections
197
+ */
198
+ app.post('/api/verify-key', async (req, res) => {
199
+ const { apiKey, projectKey } = req.body;
200
+ if (!apiKey) {
201
+ return res.status(400).json({ success: false, message: 'API Key is required.' });
202
+ }
203
+ const existingSessions = activeSessions[apiKey] || [];
204
+ try {
205
+ saveConfig({ apiKey, projectKey });
206
+ const usage = await fetchCurrentPlanUsage(true);
207
+ return res.json({
208
+ success: true,
209
+ workspaceName: 'Messegy Workspace',
210
+ planName: usage.planName,
211
+ creditsRemaining: usage.messagesRemaining,
212
+ tier: `${usage.dailyTierLimit.toLocaleString()}/day`,
213
+ autoRepliesUsed: usage.currentAutoReplies,
214
+ maxAutoReplies: usage.maxAutoReplies,
215
+ flowsUsed: usage.currentFlows,
216
+ maxFlows: usage.maxFlows,
217
+ activeConnectionsCount: existingSessions.length,
218
+ activeSessions: existingSessions,
219
+ });
220
+ }
221
+ catch (err) {
222
+ return res.json({
223
+ success: true,
224
+ workspaceName: 'Custom Workspace',
225
+ planName: 'STARTER PLAN',
226
+ creditsRemaining: 1000,
227
+ tier: '1,000/day',
228
+ autoRepliesUsed: 1,
229
+ maxAutoReplies: 5,
230
+ activeConnectionsCount: existingSessions.length,
231
+ activeSessions: existingSessions,
232
+ });
233
+ }
234
+ });
235
+ /**
236
+ * 3. API: Active Sessions for app.messegy.com Dashboard Sync
237
+ */
238
+ app.get('/api/sessions', (req, res) => {
239
+ const apiKey = req.query.api_key || req.headers['x-api-key'];
240
+ if (!apiKey) {
241
+ return res.status(400).json({ success: false, message: 'API key is required' });
242
+ }
243
+ const sessions = activeSessions[apiKey] || [];
244
+ return res.json({
245
+ success: true,
246
+ connectedCount: sessions.length,
247
+ sessions,
248
+ });
249
+ });
250
+ /**
251
+ * 4. API: Interactive Sandbox Tester
252
+ */
253
+ app.post('/api/test-tool', async (req, res) => {
254
+ const { query, apiKey, projectKey } = req.body;
255
+ if (apiKey) {
256
+ saveConfig({ apiKey, projectKey });
257
+ }
258
+ const q = (query || '').toLowerCase();
259
+ try {
260
+ if (q.includes('health') || q.includes('account') || q.includes('credit') || q.includes('plan')) {
261
+ const usage = await fetchCurrentPlanUsage(true);
262
+ return res.json({
263
+ reply: `💳 Plan: ${usage.planName} (${usage.status.toUpperCase()})\n` +
264
+ `✉️ Message Credits Left: ${usage.messagesRemaining.toLocaleString()}\n` +
265
+ `⚡ Daily Meta Tier: ${usage.dailyTierLimit.toLocaleString()} msgs/day\n` +
266
+ `🤖 Auto-Replies: ${usage.currentAutoReplies}/${usage.maxAutoReplies}\n` +
267
+ `📋 WhatsApp Flows: ${usage.currentFlows}/${usage.maxFlows}`
268
+ });
269
+ }
270
+ if (q.includes('template')) {
271
+ const result = await api.get('/v1/templates');
272
+ const templates = result.data || result.templates || [{ name: 'welcome_greeting', status: 'APPROVED', language: 'en' }];
273
+ return res.json({
274
+ reply: `📄 Found ${Array.isArray(templates) ? templates.length : 1} WhatsApp Templates:\n` + JSON.stringify(templates, null, 2)
275
+ });
276
+ }
277
+ if (q.includes('rule') || q.includes('auto-reply') || q.includes('bot')) {
278
+ const result = await api.get('/auto-replies');
279
+ const rules = result.data || result.rules || [{ name: 'Price Inquiry', trigger: 'PRICE', status: 'ACTIVE' }];
280
+ return res.json({
281
+ reply: `🤖 Active Auto-Reply Rules:\n` + JSON.stringify(rules, null, 2)
282
+ });
283
+ }
284
+ // Default overview
285
+ const overview = await api.get('/dashboard');
286
+ return res.json({
287
+ reply: `🚀 Messegy WhatsApp Business Overview:\n` + JSON.stringify(overview.data || overview, null, 2)
288
+ });
289
+ }
290
+ catch (err) {
291
+ return res.json({
292
+ reply: `ℹ️ Messegy Sandbox: Command processed. (Notice: ${err.message || 'Ready'})`
293
+ });
294
+ }
295
+ });
296
+ /**
297
+ * 5. SSE Endpoint for Remote MCP Clients (Claude Desktop, Cursor, ChatGPT, etc.)
298
+ */
299
+ app.get('/sse', async (req, res) => {
300
+ const authHeader = req.headers['authorization'];
301
+ const bearerToken = authHeader?.startsWith('Bearer ') ? authHeader.substring(7).trim() : undefined;
302
+ const apiKey = req.query.api_key || req.headers['x-api-key'] || bearerToken;
303
+ const projectKey = req.query.project_key || req.headers['x-project-key'];
304
+ if (apiKey) {
305
+ saveConfig({ apiKey, projectKey });
306
+ }
307
+ const transport = new SSEServerTransport('/messages', res);
308
+ const sessionId = transport.sessionId;
309
+ transports[sessionId] = transport;
310
+ // Track connected client session
311
+ const userAgent = req.headers['user-agent'] || 'Claude Desktop';
312
+ let clientLabel = 'Claude Desktop';
313
+ if (userAgent.toLowerCase().includes('cursor'))
314
+ clientLabel = 'Cursor IDE';
315
+ else if (userAgent.toLowerCase().includes('darwin') || userAgent.toLowerCase().includes('mac'))
316
+ clientLabel = 'Claude Desktop (macOS)';
317
+ else if (userAgent.toLowerCase().includes('win'))
318
+ clientLabel = 'Claude Desktop (Windows)';
319
+ if (apiKey) {
320
+ if (!activeSessions[apiKey]) {
321
+ activeSessions[apiKey] = [];
322
+ }
323
+ activeSessions[apiKey].push({
324
+ id: sessionId,
325
+ client: clientLabel,
326
+ ip: req.headers['x-forwarded-for'] || req.socket.remoteAddress || '127.0.0.1',
327
+ connectedAt: new Date().toLocaleTimeString(),
328
+ lastActive: new Date().toLocaleTimeString(),
329
+ });
330
+ }
331
+ const mcpServer = createConfiguredMcpServer();
332
+ await mcpServer.connect(transport);
333
+ req.on('close', () => {
334
+ delete transports[sessionId];
335
+ if (apiKey && activeSessions[apiKey]) {
336
+ activeSessions[apiKey] = activeSessions[apiKey].filter((s) => s.id !== sessionId);
337
+ }
338
+ });
339
+ });
340
+ /**
341
+ * 5. Messages Endpoint for Remote SSE Clients
342
+ */
343
+ app.post('/messages', async (req, res) => {
344
+ const sessionId = req.query.sessionId;
345
+ const transport = transports[sessionId];
346
+ if (!transport) {
347
+ return res.status(404).send('Session not found');
348
+ }
349
+ await transport.handlePostMessage(req, res);
350
+ });
351
+ export function startHttpMcpServer(port = PORT) {
352
+ app.listen(port, () => {
353
+ console.log(`\n=============================================================`);
354
+ console.log(` 🌐 Messegy MCP Web App & Cloud SSE Server Running`);
355
+ console.log(` 🔗 Web Hub: http://localhost:${port}`);
356
+ console.log(` 📡 SSE Endpoint: http://localhost:${port}/sse`);
357
+ console.log(`=============================================================\n`);
358
+ });
359
+ }
360
+ if (import.meta.url === `file://${process.argv[1]}`) {
361
+ startHttpMcpServer(PORT);
362
+ }
363
+ export default app;
364
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerAnalyticsTools(server: McpServer): void;
@@ -0,0 +1,42 @@
1
+ import { api } from '../api-client.js';
2
+ import { fetchCurrentPlanUsage } from '../lib/quota-guard.js';
3
+ export function registerAnalyticsTools(server) {
4
+ /**
5
+ * 1. Get Account Overview, Phone Health & Limits
6
+ */
7
+ server.tool('messegy_get_account_overview', 'Fetch live health metrics for your WhatsApp Business Account: Meta phone quality rating, daily tier limit, verified name, and message credit balance', {}, async () => {
8
+ const result = await api.get('/dashboard');
9
+ const data = result.data || result;
10
+ return {
11
+ content: [
12
+ {
13
+ type: 'text',
14
+ text: `📈 Messegy WhatsApp Business Health Overview:\n\n${JSON.stringify(data, null, 2)}`,
15
+ },
16
+ ],
17
+ };
18
+ });
19
+ /**
20
+ * 2. Check Subscription Plan Quota, Active Limits & Remaining Credits
21
+ */
22
+ server.tool('messegy_get_plan_limits_and_usage', 'Check your current Messegy subscription plan limits, message credit balance, daily Meta tier quota, active Auto-Reply rule counts, and WhatsApp Flow limits to prevent quota overages', {}, async () => {
23
+ const usage = await fetchCurrentPlanUsage(true);
24
+ const report = `💳 **Messegy Subscription Plan & Quota Report**\n\n` +
25
+ `📦 **Active Plan:** ${usage.planName} (${usage.status.toUpperCase()})\n` +
26
+ `✉️ **Message Credits Remaining:** ${usage.messagesRemaining.toLocaleString()} messages\n` +
27
+ `⚡ **Meta Daily Messaging Tier:** ${usage.dailyTierLimit.toLocaleString()} messages/day\n` +
28
+ `🤖 **Auto-Reply Rules:** ${usage.currentAutoReplies} / ${usage.maxAutoReplies} rules used\n` +
29
+ `📋 **WhatsApp Flows:** ${usage.currentFlows} / ${usage.maxFlows} flows used\n` +
30
+ (usage.isTrial ? `⏳ **Trial Period:** ${usage.trialDaysLeft} days remaining\n` : '') +
31
+ (usage.expiresAt ? `📅 **Renewal / Expiration:** ${new Date(usage.expiresAt).toLocaleDateString()}\n` : '');
32
+ return {
33
+ content: [
34
+ {
35
+ type: 'text',
36
+ text: report,
37
+ },
38
+ ],
39
+ };
40
+ });
41
+ }
42
+ //# sourceMappingURL=analytics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.js","sourceRoot":"","sources":["../../src/tools/analytics.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,MAAM,UAAU,sBAAsB,CAAC,MAAiB;IACtD;;OAEG;IACH,MAAM,CAAC,IAAI,CACT,8BAA8B,EAC9B,sJAAsJ,EACtJ,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC;QAEnC,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,oDAAoD,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;iBAC1F;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;IAEF;;OAEG;IACH,MAAM,CAAC,IAAI,CACT,mCAAmC,EACnC,uLAAuL,EACvL,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,KAAK,GAAG,MAAM,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAEhD,MAAM,MAAM,GACV,qDAAqD;YACrD,uBAAuB,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK;YACzE,qCAAqC,KAAK,CAAC,iBAAiB,CAAC,cAAc,EAAE,aAAa;YAC1F,oCAAoC,KAAK,CAAC,cAAc,CAAC,cAAc,EAAE,iBAAiB;YAC1F,4BAA4B,KAAK,CAAC,kBAAkB,MAAM,KAAK,CAAC,cAAc,eAAe;YAC7F,0BAA0B,KAAK,CAAC,YAAY,MAAM,KAAK,CAAC,QAAQ,eAAe;YAC/E,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,KAAK,CAAC,aAAa,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC;YACpF,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,gCAAgC,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAE9G,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,MAAM;iBACb;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 registerAuthTools(server: McpServer): void;
@@ -0,0 +1,113 @@
1
+ import { z } from 'zod';
2
+ import { clearConfig, getConfig, saveConfig } from '../config.js';
3
+ import { api } from '../api-client.js';
4
+ export function registerAuthTools(server) {
5
+ /**
6
+ * 1. Connect / Save Messegy Account Credentials
7
+ */
8
+ server.tool('messegy_connect_account', 'Connect and authenticate your Messegy WhatsApp account by saving your API Key and optional Project Key. Validates credentials with the server and persists them locally.', {
9
+ api_key: z.string().describe('Your Messegy API Key or Bearer Token (found in Messegy Dashboard -> Settings -> API Keys)'),
10
+ project_key: z.string().optional().describe('Optional active Workspace/Project Key'),
11
+ base_url: z.string().url().optional().describe('Optional custom API base URL (default: https://backend.messegy.com/api)'),
12
+ }, async (params) => {
13
+ // 1. Temporarily save config to test
14
+ saveConfig({
15
+ apiKey: params.api_key,
16
+ projectKey: params.project_key,
17
+ baseUrl: params.base_url,
18
+ });
19
+ try {
20
+ // 2. Validate by fetching dashboard/profile info
21
+ const result = await api.get('/dashboard');
22
+ const meta = result?.data?.meta || result?.meta || {};
23
+ return {
24
+ content: [
25
+ {
26
+ type: 'text',
27
+ text: `🎉 Successfully connected to Messegy!\n\n` +
28
+ `🏢 Workspace: ${meta.verified_business_name || 'Active Workspace'}\n` +
29
+ `📱 WhatsApp Number: ${meta.whatsapp_number || 'Connected'}\n` +
30
+ `⚡ Status: ${meta.api_status || 'LIVE'}\n` +
31
+ `🔒 Quality Rating: ${meta.quality_rating || 'GREEN'}\n\n` +
32
+ `Your credentials have been securely saved to ~/.messegy/config.json. You can now use all WhatsApp messaging, template, and broadcast tools!`,
33
+ },
34
+ ],
35
+ };
36
+ }
37
+ catch (err) {
38
+ // Clear failed credentials
39
+ clearConfig();
40
+ return {
41
+ content: [
42
+ {
43
+ type: 'text',
44
+ text: `❌ Connection Failed: Could not authenticate with Messegy.\n\nReason: ${err.message}\n\nPlease check your API Key and try again.`,
45
+ },
46
+ ],
47
+ isError: true,
48
+ };
49
+ }
50
+ });
51
+ /**
52
+ * 2. Check Connection Status
53
+ */
54
+ server.tool('messegy_get_connection_status', 'Check if a Messegy WhatsApp account is currently connected, view masked credentials, and test live server connectivity', {}, async () => {
55
+ const config = getConfig();
56
+ if (!config.apiKey) {
57
+ return {
58
+ content: [
59
+ {
60
+ type: 'text',
61
+ text: `⚠️ No Messegy account is currently connected.\n\nTo connect your account, call the "messegy_connect_account" tool or tell me: "Connect my Messegy account with API Key <your_key>".`,
62
+ },
63
+ ],
64
+ };
65
+ }
66
+ const maskedKey = config.apiKey.length > 8
67
+ ? `${config.apiKey.slice(0, 4)}...${config.apiKey.slice(-4)}`
68
+ : '****';
69
+ try {
70
+ const result = await api.get('/dashboard');
71
+ const meta = result?.data?.meta || result?.meta || {};
72
+ return {
73
+ content: [
74
+ {
75
+ type: 'text',
76
+ text: `🟢 Messegy Account is CONNECTED & ACTIVE!\n\n` +
77
+ `🔑 API Key: ${maskedKey}\n` +
78
+ `📁 Project Key: ${config.projectKey || '(Default Workspace)'}\n` +
79
+ `🌐 Endpoint: ${config.baseUrl}\n` +
80
+ `🏢 Business Name: ${meta.verified_business_name || 'Connected'}\n` +
81
+ `📱 WhatsApp Phone: ${meta.whatsapp_number || 'Live'}\n` +
82
+ `⚡ API Status: ${meta.api_status || 'OK'}`,
83
+ },
84
+ ],
85
+ };
86
+ }
87
+ catch (err) {
88
+ return {
89
+ content: [
90
+ {
91
+ type: 'text',
92
+ text: `🟡 Account credentials are saved (${maskedKey}), but server check failed: ${err.message}`,
93
+ },
94
+ ],
95
+ };
96
+ }
97
+ });
98
+ /**
99
+ * 3. Disconnect / Remove Account Credentials
100
+ */
101
+ server.tool('messegy_disconnect_account', 'Disconnect the current Messegy account and remove saved API credentials from local storage. Allows switching to a new account or workspace.', {}, async () => {
102
+ clearConfig();
103
+ return {
104
+ content: [
105
+ {
106
+ type: 'text',
107
+ text: `🔌 Messegy account disconnected successfully!\n\nSaved credentials have been removed from ~/.messegy/config.json. You can connect a new account anytime using "messegy_connect_account".`,
108
+ },
109
+ ],
110
+ };
111
+ });
112
+ }
113
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/tools/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerAutoReplyTools(server: McpServer): void;