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 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 — cannot start.");
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("\n✅ KickLoad Watcher running");
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)`);
@@ -59,16 +59,20 @@ export class KickloadClient {
59
59
  }
60
60
 
61
61
  if (!response.ok) {
62
- const err = new Error(
63
- `Kickload ${method} ${endpoint} → ${response.status} ${response.statusText}\n` +
64
- `URL: ${url}\n` +
65
- `Response: ${text.substring(0, 500)}`
66
- );
67
- err.status = response.status;
68
- err.body = text;
69
- err.parsed = parsed;
70
- throw err;
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.0",
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
- "**/*.js",
47
- "users.json",
48
- "README.md"
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
- logger.error(`Pipeline failed: ${err.message}`);
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 console.anthropic.com");
23
- console.log(" • KICKLOAD_API_TOKEN kickload.neeyatai.com");
24
- console.log(" • Gmail address + App Password (for result emails)");
25
- console.log(" • NGROK_AUTHTOKEN dashboard.ngrok.com (required for localhost backends)\n");
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
- const smtpEmail = await askEmail( "Your Gmail address : ");
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
- const devEmail = await askEmail( "Developer email : ");
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`,