kickload-watcher-mcp 0.1.0 → 0.1.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.
- package/email-sender.js +5 -1
- package/index.js +5 -1
- package/kickload-client.js +14 -10
- package/package.json +6 -6
- package/pipeline.js +13 -1
- package/setup.js +9 -19
package/email-sender.js
CHANGED
|
@@ -52,7 +52,11 @@ export async function verifyEmailService() {
|
|
|
52
52
|
console.log("✅ Email service verified");
|
|
53
53
|
} catch (err) {
|
|
54
54
|
console.log(""); // newline after the "..."
|
|
55
|
-
console.error("\n❌ Email verification failed
|
|
55
|
+
console.error("\n❌ Email verification failed");
|
|
56
|
+
console.error(" Fix:");
|
|
57
|
+
console.error(" • Use Gmail App Password (NOT your real password)");
|
|
58
|
+
console.error(" • Enable 2-Step Verification");
|
|
59
|
+
console.error(" • Check SMTP_USER and SMTP_PASS\n");
|
|
56
60
|
console.error(` Provider : ${config.email.provider}`);
|
|
57
61
|
console.error(` User : ${config.email.smtp.user || "(none)"}`);
|
|
58
62
|
console.error(` Error : ${err.message}`);
|
package/index.js
CHANGED
|
@@ -262,7 +262,11 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
262
262
|
const transport = new StdioServerTransport();
|
|
263
263
|
await server.connect(transport);
|
|
264
264
|
|
|
265
|
-
console.log("
|
|
265
|
+
console.log(" System Status:");
|
|
266
|
+
console.log(" • Setup : Complete");
|
|
267
|
+
console.log(" • Email : Verified");
|
|
268
|
+
console.log(" • ngrok : Auto (required for localhost)");
|
|
269
|
+
console.log(" • Mode : Production-ready\n");
|
|
266
270
|
console.log(` Mode : ${config.triggerMode}`);
|
|
267
271
|
console.log(` KickLoad: ${config.kickload.baseUrl}`);
|
|
268
272
|
console.log(` ngrok : auto-mode (localhost backends tunneled automatically)`);
|
package/kickload-client.js
CHANGED
|
@@ -59,16 +59,20 @@ export class KickloadClient {
|
|
|
59
59
|
}
|
|
60
60
|
|
|
61
61
|
if (!response.ok) {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
62
|
+
if (response.status === 401 || response.status === 403) {
|
|
63
|
+
throw new Error(
|
|
64
|
+
"Kickload authentication failed — check your API token or subscription"
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
if (response.status === 504) {
|
|
69
|
+
throw new Error("Kickload server timeout (504)");
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
throw new Error(
|
|
73
|
+
`Kickload ${method} ${endpoint} → ${response.status} ${response.statusText}`
|
|
74
|
+
);
|
|
75
|
+
}
|
|
72
76
|
|
|
73
77
|
return parsed;
|
|
74
78
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "kickload-watcher-mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Automated API performance testing for Claude Code teams via KickLoad",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -43,9 +43,9 @@
|
|
|
43
43
|
},
|
|
44
44
|
"homepage": "https://github.com/KickLoad/kickload-watcher-mcp",
|
|
45
45
|
"files": [
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
46
|
+
"**/*.js",
|
|
47
|
+
"users.json",
|
|
48
|
+
"README.md"
|
|
49
|
+
],
|
|
50
50
|
"preferGlobal": true
|
|
51
|
-
}
|
|
51
|
+
}
|
package/pipeline.js
CHANGED
|
@@ -278,7 +278,19 @@ export async function runPhase1Pipeline(event) {
|
|
|
278
278
|
return { success: true, backendUrl, jmxFilename, taskId, jtlFilename: taskResult.result_file, pdfFilename, downloadUrl, summary };
|
|
279
279
|
|
|
280
280
|
} catch (err) {
|
|
281
|
-
|
|
281
|
+
if (err.message.includes("504") || err.message.includes("Gateway")) {
|
|
282
|
+
logger.error("❌ Kickload server is currently unavailable (504 timeout)");
|
|
283
|
+
logger.error(" This is a server-side issue, not your API");
|
|
284
|
+
logger.error(" Try again after some time\n");
|
|
285
|
+
} else if (err.message.includes("401") || err.message.includes("403")) {
|
|
286
|
+
logger.error("❌ Kickload authentication failed");
|
|
287
|
+
logger.error(" Possible reasons:");
|
|
288
|
+
logger.error(" • Invalid API token");
|
|
289
|
+
logger.error(" • Token expired");
|
|
290
|
+
logger.error(" • Subscription required\n");
|
|
291
|
+
} else {
|
|
292
|
+
logger.error(`Pipeline failed: ${err.message}`);
|
|
293
|
+
}
|
|
282
294
|
|
|
283
295
|
if (devEmail) {
|
|
284
296
|
await safeResultEmail({
|
package/setup.js
CHANGED
|
@@ -18,33 +18,23 @@ export async function runFirstRunSetup() {
|
|
|
18
18
|
|
|
19
19
|
printBanner();
|
|
20
20
|
console.log("No .env found — running one-time setup before starting.\n");
|
|
21
|
-
console.log("You will need:");
|
|
22
|
-
console.log(" • ANTHROPIC_API_KEY
|
|
23
|
-
console.log(" • KICKLOAD_API_TOKEN
|
|
24
|
-
console.log(" • Gmail
|
|
25
|
-
console.log(" • NGROK_AUTHTOKEN
|
|
26
|
-
console.log("⚠️ Values are stored in a local .env file. Never commit it.\n");
|
|
27
|
-
|
|
21
|
+
console.log("You will need (REQUIRED):");
|
|
22
|
+
console.log(" • ANTHROPIC_API_KEY → https://console.anthropic.com");
|
|
23
|
+
console.log(" • KICKLOAD_API_TOKEN → https://kickload.neeyatai.com");
|
|
24
|
+
console.log(" • Gmail + App Password → https://myaccount.google.com/apppasswords");
|
|
25
|
+
console.log(" • NGROK_AUTHTOKEN → https://dashboard.ngrok.com/get-started/your-authtoken\n");
|
|
28
26
|
const anthropicKey = await askRequired("ANTHROPIC_API_KEY : ", true);
|
|
29
27
|
const kickloadToken = await askRequired("KICKLOAD_API_TOKEN : ", true);
|
|
30
|
-
|
|
28
|
+
const smtpEmail = await askEmail("Your Gmail address (for sending reports): ");
|
|
31
29
|
const smtpPass = await askRequired(
|
|
32
30
|
"Gmail App Password : (Use App Password, NOT your normal password)\n Create here: https://myaccount.google.com/apppasswords\n> ",
|
|
33
31
|
true
|
|
34
32
|
);
|
|
35
|
-
|
|
33
|
+
const devEmail = await askEmail("Developer email (to receive reports): ");
|
|
36
34
|
const ngrokToken = await askRequired(
|
|
37
35
|
"NGROK_AUTHTOKEN : (Required for localhost testing)\n Get it from: https://dashboard.ngrok.com/get-started/your-authtoken\n> ",
|
|
38
36
|
true
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
if (!ngrokToken) {
|
|
42
|
-
console.log("\n⚠️ ngrok skipped.");
|
|
43
|
-
console.log(" Localhost backends will attempt unauthenticated tunnels (may be rate-limited).");
|
|
44
|
-
console.log(" For reliable testing, add to .env later:");
|
|
45
|
-
console.log(" NGROK_AUTHTOKEN=<your_token> (dashboard.ngrok.com)");
|
|
46
|
-
console.log("");
|
|
47
|
-
}
|
|
37
|
+
);
|
|
48
38
|
|
|
49
39
|
const lines = [
|
|
50
40
|
"# KickLoad Watcher — generated by setup",
|
|
@@ -55,7 +45,7 @@ export async function runFirstRunSetup() {
|
|
|
55
45
|
`KICKLOAD_BASE_URL=https://kickload.neeyatai.com/api`,
|
|
56
46
|
"",
|
|
57
47
|
`# ngrok: auto-enabled for localhost backends regardless of this flag`,
|
|
58
|
-
`NGROK_AUTHTOKEN=${ngrokToken
|
|
48
|
+
`NGROK_AUTHTOKEN=${ngrokToken}`,
|
|
59
49
|
"",
|
|
60
50
|
`EMAIL_PROVIDER=smtp`,
|
|
61
51
|
`EMAIL_FROM_NAME=KickLoad Watcher`,
|