@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.
- package/README.md +133 -0
- package/api/index.js +3 -0
- package/dist/api-client.d.ts +10 -0
- package/dist/api-client.js +100 -0
- package/dist/api-client.js.map +1 -0
- package/dist/cli-setup.d.ts +1 -0
- package/dist/cli-setup.js +74 -0
- package/dist/cli-setup.js.map +1 -0
- package/dist/config.d.ts +18 -0
- package/dist/config.js +88 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +56 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/quota-guard.d.ts +19 -0
- package/dist/lib/quota-guard.js +101 -0
- package/dist/lib/quota-guard.js.map +1 -0
- package/dist/resources/index.d.ts +2 -0
- package/dist/resources/index.js +62 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/server.d.ts +10 -0
- package/dist/server.js +364 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/analytics.d.ts +2 -0
- package/dist/tools/analytics.js +42 -0
- package/dist/tools/analytics.js.map +1 -0
- package/dist/tools/auth.d.ts +2 -0
- package/dist/tools/auth.js +113 -0
- package/dist/tools/auth.js.map +1 -0
- package/dist/tools/auto-replies.d.ts +2 -0
- package/dist/tools/auto-replies.js +117 -0
- package/dist/tools/auto-replies.js.map +1 -0
- package/dist/tools/broadcasts.d.ts +2 -0
- package/dist/tools/broadcasts.js +58 -0
- package/dist/tools/broadcasts.js.map +1 -0
- package/dist/tools/chats.d.ts +2 -0
- package/dist/tools/chats.js +77 -0
- package/dist/tools/chats.js.map +1 -0
- package/dist/tools/contacts.d.ts +2 -0
- package/dist/tools/contacts.js +79 -0
- package/dist/tools/contacts.js.map +1 -0
- package/dist/tools/flows.d.ts +2 -0
- package/dist/tools/flows.js +148 -0
- package/dist/tools/flows.js.map +1 -0
- package/dist/tools/messages.d.ts +2 -0
- package/dist/tools/messages.js +149 -0
- package/dist/tools/messages.js.map +1 -0
- package/dist/tools/shopify.d.ts +2 -0
- package/dist/tools/shopify.js +66 -0
- package/dist/tools/shopify.js.map +1 -0
- package/dist/tools/templates.d.ts +2 -0
- package/dist/tools/templates.js +160 -0
- package/dist/tools/templates.js.map +1 -0
- package/dist/web-app.d.ts +1 -0
- package/dist/web-app.js +845 -0
- package/dist/web-app.js.map +1 -0
- package/package.json +42 -0
- package/src/api-client.ts +112 -0
- package/src/cli-setup.ts +87 -0
- package/src/config.ts +111 -0
- package/src/index.ts +66 -0
- package/src/lib/quota-guard.ts +138 -0
- package/src/resources/index.ts +70 -0
- package/src/server.ts +408 -0
- package/src/tools/analytics.ts +58 -0
- package/src/tools/auth.ts +136 -0
- package/src/tools/auto-replies.ts +144 -0
- package/src/tools/broadcasts.ts +73 -0
- package/src/tools/chats.ts +100 -0
- package/src/tools/contacts.ts +99 -0
- package/src/tools/flows.ts +192 -0
- package/src/tools/messages.ts +177 -0
- package/src/tools/shopify.ts +80 -0
- package/src/tools/templates.ts +193 -0
- package/src/web-app.ts +844 -0
- package/tsconfig.json +18 -0
- package/vercel.json +10 -0
|
@@ -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"}
|
package/dist/server.d.ts
ADDED
|
@@ -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,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,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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"}
|