@leadbay/mcp 0.42.0 → 0.43.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/CHANGELOG.md CHANGED
@@ -1,5 +1,31 @@
1
1
  # Changelog — @leadbay/mcp
2
2
 
3
+ ## 0.43.1 — 2026-10-07 — a job's own spend cap no longer claims to cover any job
4
+
5
+ - **The search's spend cap stops promising it is enough.** The parameter that
6
+ bounds what one lead search may spend used to tell the assistant its default
7
+ "covers any job". It does not: your plan has its own daily allowance, it is
8
+ far smaller, and it stops a search whatever that parameter is set to. The
9
+ parameter now says what it bounds and names your plan's allowance as the
10
+ separate limit. Reported after a paying account spent forty minutes on
11
+ searches that kept running out (product#4250).
12
+
13
+ ## 0.43.0 — 2026-09-30 — a misnamed argument is read or named, never dropped
14
+
15
+ - **`lead_id` and `leadId` both work.** Leadbay tools spell the lead id
16
+ differently: researching a lead and adding a note take `leadId`, setting a
17
+ CRM status takes `lead_ids`. An assistant that used the other spelling was
18
+ told the id was missing, and a scheduled run lost a night's notes and
19
+ statuses this way. An argument that differs only by capitals or underscores
20
+ is now read as the one the tool expects, and setting a status also takes a
21
+ single lead id.
22
+ - **Any other unknown argument is named.** It used to be dropped silently. It
23
+ now comes back as an error that names it, suggests the argument it probably
24
+ meant, and lists the ones the tool takes. A call rejected this way writes
25
+ nothing.
26
+ - **Team prospecting setup names the right arguments.** It told the assistant
27
+ to pass `user_prompt` to two tools that take `prompt` and `base`.
28
+
3
29
  ## 0.42.0 — 2026-09-28 — every rep gets the same boards
4
30
 
5
31
  - **The route planner and the lead triage board are now finished pages.**
package/dist/bin.js CHANGED
@@ -24701,7 +24701,7 @@ var init_find_new_leads = __esm({
24701
24701
  },
24702
24702
  max_cost: {
24703
24703
  type: "number",
24704
- description: "Usage cap for the whole job, in internal units. Leave it unset: the default (100000) covers any job. What the requested channels need is kept for them; a cap below that is refused, naming the minimum. Never show it to the user as money."
24704
+ description: "Usage cap for the whole job, in internal units (default 100000). Leave it unset unless the user asked to bound this job. It caps the JOB only; the org's plan quota is a separate and smaller limit that can stop the job with stop_reason:quota whatever this is set to. What the requested channels need is kept for them; a cap below that is refused, naming the minimum. Never show it to the user as money."
24705
24705
  },
24706
24706
  exploration_cap: {
24707
24707
  type: "number",
@@ -30318,7 +30318,7 @@ single-country cohort along an axis that does not exist here, and PHASE 3 will p
30318
30318
  those campaigns without ever looking again. The three cases do NOT get the same
30319
30319
  treatment:
30320
30320
 
30321
- - **This workspace's own country** ("plumbers across the US" on a US workspace) \u2192 drop only that clause and keep everything else. Say you dropped it, then continue: the lens covers the whole workspace anyway. **Unless dropping it leaves NOTHING** \u2014 \`audience: "France"\` on an FR workspace is entirely that clause, and what remains is an empty string. Do NOT continue into PHASE 1 with it: \`leadbay_refine_lead_targeting({user_prompt: ""})\` would overwrite my refinement prompt with nothing and \`leadbay_create_lens\` + \`leadbay_promote_lens\` would then persist and ACTIVATE a scopeless lens, to express something this workspace already is. Write nothing at all: tell me the workspace already covers exactly that, and ask for a real sector, size, or sub-country criterion before anything is created. Same for \`rep_split\` \u2014 if the sanitized split is empty, there is no split to make.
30321
+ - **This workspace's own country** ("plumbers across the US" on a US workspace) \u2192 drop only that clause and keep everything else. Say you dropped it, then continue: the lens covers the whole workspace anyway. **Unless dropping it leaves NOTHING** \u2014 \`audience: "France"\` on an FR workspace is entirely that clause, and what remains is an empty string. Do NOT continue into PHASE 1 with it: \`leadbay_refine_lead_targeting({prompt: ""})\` would overwrite my refinement prompt with nothing and \`leadbay_create_lens\` + \`leadbay_promote_lens\` would then persist and ACTIVATE a scopeless lens, to express something this workspace already is. Write nothing at all: tell me the workspace already covers exactly that, and ask for a real sector, size, or sub-country criterion before anything is created. Same for \`rep_split\` \u2014 if the sanitized split is empty, there is no split to make.
30322
30322
  - **A different country** ("plumbers across France" on a US workspace) \u2192 **STOP. Create nothing.** Do NOT drop the country and build a lens for this workspace instead \u2014 that would hand me a US lens, plus campaigns, presented as the answer to a France request. Say this workspace holds only its own country's companies, so the ask cannot be filled here, and end your turn.
30323
30323
  - **A supra-national scope** ("plumbers across EMEA") \u2192 also stop: name what the workspace covers and ask whether I want that instead, rather than assuming it.
30324
30324
 
@@ -30333,9 +30333,9 @@ that rep: stop rather than silently handing them an empty campaign or, worse, a
30333
30333
  the home country's leads labelled with another country's name. Carry only the sanitized
30334
30334
  split into PHASE 3.
30335
30335
 
30336
- Call \`leadbay_refine_lead_targeting({user_prompt: "<my audience with the home-country clause removed>"})\` \u2014 pass the SANITIZED text, not the raw argument, or the country label reaches the lens anyway and fences it to a same-named village. This handles the clarification protocol natively \u2014 if the system needs more info (e.g. industry disambiguation, geography precision), it returns \`status: "clarification_needed"\` with options. Surface those to me; on my answer, re-call \`leadbay_refine_lead_targeting\` until the prompt converges.
30336
+ Call \`leadbay_refine_lead_targeting({prompt: "<my audience with the home-country clause removed>"})\` \u2014 pass the SANITIZED text, not the raw argument, or the country label reaches the lens anyway and fences it to a same-named village. This handles the clarification protocol natively \u2014 if the system needs more info (e.g. industry disambiguation, geography precision), it returns \`status: "clarification_needed"\` with options. Surface those to me; on my answer, re-call \`leadbay_refine_lead_targeting\` until the prompt converges.
30337
30337
 
30338
- When the prompt has converged, call \`leadbay_create_lens({user_prompt: <refined>, name: "<short descriptive name>"})\` to create a draft lens, then \`leadbay_promote_lens({lensId})\` to make it the active lens.
30338
+ When the prompt has converged, call \`leadbay_create_lens({base: <the active lens id>, name: "<short descriptive name>"})\` to create a draft lens, then \`leadbay_promote_lens({lensId})\` to make it the active lens.
30339
30339
 
30340
30340
  # PHASE 2 \u2014 PULL + VALIDATE CANDIDATES
30341
30341
 
@@ -32511,6 +32511,70 @@ function findShapeMismatch(tool, args) {
32511
32511
  }
32512
32512
  return void 0;
32513
32513
  }
32514
+ var argKeyNorm = (k) => k.replace(/_/g, "").toLowerCase();
32515
+ function editDistance(a, b) {
32516
+ const row = Array.from({ length: b.length + 1 }, (_, j) => j);
32517
+ for (let i = 1; i <= a.length; i++) {
32518
+ let prev = row[0];
32519
+ row[0] = i;
32520
+ for (let j = 1; j <= b.length; j++) {
32521
+ const cur = row[j];
32522
+ row[j] = Math.min(row[j] + 1, row[j - 1] + 1, prev + (a[i - 1] === b[j - 1] ? 0 : 1));
32523
+ prev = cur;
32524
+ }
32525
+ }
32526
+ return row[b.length];
32527
+ }
32528
+ function normalizeArgKeys(tool, args) {
32529
+ const schema = tool.inputSchema;
32530
+ const props = schema?.properties;
32531
+ if (!props || typeof props !== "object") return { args };
32532
+ const declared = Object.keys(props).filter((k) => k !== ORIGIN_FIELD);
32533
+ const out = {};
32534
+ for (const [key, value] of Object.entries(args)) {
32535
+ if (Object.prototype.hasOwnProperty.call(props, key)) out[key] = value;
32536
+ }
32537
+ const unknown = [];
32538
+ for (const [key, value] of Object.entries(args)) {
32539
+ if (Object.prototype.hasOwnProperty.call(props, key)) continue;
32540
+ const n = argKeyNorm(key);
32541
+ const same = declared.find((d) => argKeyNorm(d) === n);
32542
+ const plural = declared.find(
32543
+ (d) => props[d]?.type === "array" && argKeyNorm(d) === `${n}s`
32544
+ );
32545
+ if (same && !(same in out)) {
32546
+ out[same] = value;
32547
+ } else if (!same && plural && !(plural in out)) {
32548
+ out[plural] = typeof value === "string" && !value.trim().startsWith("[") ? [value] : value;
32549
+ } else {
32550
+ unknown.push(key);
32551
+ }
32552
+ }
32553
+ if (unknown.length === 0) return { args: out };
32554
+ if (schema?.additionalProperties !== false) {
32555
+ for (const key of unknown) out[key] = args[key];
32556
+ return { args: out };
32557
+ }
32558
+ const required = Array.isArray(schema.required) ? schema.required : [];
32559
+ const missing = required.filter((r) => r !== TRIGGERED_BY_FIELD && !(r in out));
32560
+ const suggest = (key) => {
32561
+ const n = argKeyNorm(key);
32562
+ const close2 = declared.map((d) => ({ d, dist: editDistance(n, argKeyNorm(d)) })).filter(({ dist }) => dist <= Math.max(2, Math.floor(n.length / 3))).sort((a, b) => a.dist - b.dist)[0]?.d;
32563
+ return close2 ?? (missing.length === 1 ? missing[0] : void 0);
32564
+ };
32565
+ const named = unknown.map((k) => {
32566
+ const s = suggest(k);
32567
+ return s ? `\`${k}\` (did you mean \`${s}\`?)` : `\`${k}\``;
32568
+ });
32569
+ return {
32570
+ error: {
32571
+ error: true,
32572
+ code: "INVALID_PARAMS",
32573
+ message: `${tool.name} has no argument ${named.join(", ")}`,
32574
+ hint: `Accepted arguments: ${declared.map((d) => `\`${d}\``).join(", ")}. Re-call with those names. Nothing was written.`
32575
+ }
32576
+ };
32577
+ }
32514
32578
  function toolsListPayload(tools2) {
32515
32579
  return tools2.map((t) => {
32516
32580
  const out = {
@@ -32774,6 +32838,7 @@ function buildServer(client, opts = {}) {
32774
32838
  }
32775
32839
  const rawArgs = req.params.arguments ?? {};
32776
32840
  const { triggered_by: rawTriggeredBy, origin, cleaned: args } = extractTriggeredBy(rawArgs);
32841
+ const arg_keys = Object.keys(args).slice(0, 20).map((k) => k.slice(0, 64));
32777
32842
  const triggered_by = name === "leadbay_report_friction" ? void 0 : rawTriggeredBy;
32778
32843
  const progressToken = req.params?._meta?.progressToken;
32779
32844
  const progress = progressToken !== void 0 ? (params) => {
@@ -32899,8 +32964,10 @@ ${url}
32899
32964
  isError: true
32900
32965
  };
32901
32966
  }
32902
- const shapeError = findShapeMismatch(tool, args);
32903
- const result = shapeError ?? await runWithRequestSignal(extra.signal, () => tool.execute(client, args, {
32967
+ const keyed = normalizeArgKeys(tool, args);
32968
+ const callArgs = keyed.error ? args : keyed.args;
32969
+ const shapeError = keyed.error ?? findShapeMismatch(tool, callArgs);
32970
+ const result = shapeError ?? await runWithRequestSignal(extra.signal, () => tool.execute(client, callArgs, {
32904
32971
  logger: opts.logger,
32905
32972
  notificationsInbox: opts.notificationsInbox,
32906
32973
  signal: extra.signal,
@@ -32990,6 +33057,7 @@ ${url}
32990
33057
  format: "error-envelope",
32991
33058
  bytes: envText.length,
32992
33059
  error_code: envCode,
33060
+ arg_keys,
32993
33061
  triggered_by,
32994
33062
  origin
32995
33063
  });
@@ -33130,6 +33198,7 @@ ${url}
33130
33198
  bytes: errText.length,
33131
33199
  error_code: code,
33132
33200
  ...typeof httpStatus2 === "number" ? { http_status: httpStatus2 } : {},
33201
+ arg_keys,
33133
33202
  triggered_by,
33134
33203
  origin
33135
33204
  });
@@ -33161,6 +33230,7 @@ ${url}
33161
33230
  format: "error-envelope",
33162
33231
  bytes: errText.length,
33163
33232
  error_code: code,
33233
+ arg_keys,
33164
33234
  triggered_by,
33165
33235
  origin
33166
33236
  });
@@ -34646,7 +34716,7 @@ var OAUTH_BASE_URLS = {
34646
34716
  fr: "https://staging.api.leadbay.app"
34647
34717
  }
34648
34718
  };
34649
- var VERSION = "0.42.0";
34719
+ var VERSION = "0.43.1";
34650
34720
  var HELP = `
34651
34721
  leadbay-mcp ${VERSION} \u2014 Leadbay Model Context Protocol server
34652
34722
 
@@ -2439,7 +2439,7 @@ single-country cohort along an axis that does not exist here, and PHASE 3 will p
2439
2439
  those campaigns without ever looking again. The three cases do NOT get the same
2440
2440
  treatment:
2441
2441
 
2442
- - **This workspace's own country** ("plumbers across the US" on a US workspace) \u2192 drop only that clause and keep everything else. Say you dropped it, then continue: the lens covers the whole workspace anyway. **Unless dropping it leaves NOTHING** \u2014 \`audience: "France"\` on an FR workspace is entirely that clause, and what remains is an empty string. Do NOT continue into PHASE 1 with it: \`leadbay_refine_lead_targeting({user_prompt: ""})\` would overwrite my refinement prompt with nothing and \`leadbay_create_lens\` + \`leadbay_promote_lens\` would then persist and ACTIVATE a scopeless lens, to express something this workspace already is. Write nothing at all: tell me the workspace already covers exactly that, and ask for a real sector, size, or sub-country criterion before anything is created. Same for \`rep_split\` \u2014 if the sanitized split is empty, there is no split to make.
2442
+ - **This workspace's own country** ("plumbers across the US" on a US workspace) \u2192 drop only that clause and keep everything else. Say you dropped it, then continue: the lens covers the whole workspace anyway. **Unless dropping it leaves NOTHING** \u2014 \`audience: "France"\` on an FR workspace is entirely that clause, and what remains is an empty string. Do NOT continue into PHASE 1 with it: \`leadbay_refine_lead_targeting({prompt: ""})\` would overwrite my refinement prompt with nothing and \`leadbay_create_lens\` + \`leadbay_promote_lens\` would then persist and ACTIVATE a scopeless lens, to express something this workspace already is. Write nothing at all: tell me the workspace already covers exactly that, and ask for a real sector, size, or sub-country criterion before anything is created. Same for \`rep_split\` \u2014 if the sanitized split is empty, there is no split to make.
2443
2443
  - **A different country** ("plumbers across France" on a US workspace) \u2192 **STOP. Create nothing.** Do NOT drop the country and build a lens for this workspace instead \u2014 that would hand me a US lens, plus campaigns, presented as the answer to a France request. Say this workspace holds only its own country's companies, so the ask cannot be filled here, and end your turn.
2444
2444
  - **A supra-national scope** ("plumbers across EMEA") \u2192 also stop: name what the workspace covers and ask whether I want that instead, rather than assuming it.
2445
2445
 
@@ -2454,9 +2454,9 @@ that rep: stop rather than silently handing them an empty campaign or, worse, a
2454
2454
  the home country's leads labelled with another country's name. Carry only the sanitized
2455
2455
  split into PHASE 3.
2456
2456
 
2457
- Call \`leadbay_refine_lead_targeting({user_prompt: "<my audience with the home-country clause removed>"})\` \u2014 pass the SANITIZED text, not the raw argument, or the country label reaches the lens anyway and fences it to a same-named village. This handles the clarification protocol natively \u2014 if the system needs more info (e.g. industry disambiguation, geography precision), it returns \`status: "clarification_needed"\` with options. Surface those to me; on my answer, re-call \`leadbay_refine_lead_targeting\` until the prompt converges.
2457
+ Call \`leadbay_refine_lead_targeting({prompt: "<my audience with the home-country clause removed>"})\` \u2014 pass the SANITIZED text, not the raw argument, or the country label reaches the lens anyway and fences it to a same-named village. This handles the clarification protocol natively \u2014 if the system needs more info (e.g. industry disambiguation, geography precision), it returns \`status: "clarification_needed"\` with options. Surface those to me; on my answer, re-call \`leadbay_refine_lead_targeting\` until the prompt converges.
2458
2458
 
2459
- When the prompt has converged, call \`leadbay_create_lens({user_prompt: <refined>, name: "<short descriptive name>"})\` to create a draft lens, then \`leadbay_promote_lens({lensId})\` to make it the active lens.
2459
+ When the prompt has converged, call \`leadbay_create_lens({base: <the active lens id>, name: "<short descriptive name>"})\` to create a draft lens, then \`leadbay_promote_lens({lensId})\` to make it the active lens.
2460
2460
 
2461
2461
  # PHASE 2 \u2014 PULL + VALIDATE CANDIDATES
2462
2462
 
@@ -27220,7 +27220,7 @@ var findNewLeads = {
27220
27220
  },
27221
27221
  max_cost: {
27222
27222
  type: "number",
27223
- description: "Usage cap for the whole job, in internal units. Leave it unset: the default (100000) covers any job. What the requested channels need is kept for them; a cap below that is refused, naming the minimum. Never show it to the user as money."
27223
+ description: "Usage cap for the whole job, in internal units (default 100000). Leave it unset unless the user asked to bound this job. It caps the JOB only; the org's plan quota is a separate and smaller limit that can stop the job with stop_reason:quota whatever this is set to. What the requested channels need is kept for them; a cap below that is refused, naming the minimum. Never show it to the user as money."
27224
27224
  },
27225
27225
  exploration_cap: {
27226
27226
  type: "number",
@@ -31013,6 +31013,70 @@ function findShapeMismatch(tool, args) {
31013
31013
  }
31014
31014
  return void 0;
31015
31015
  }
31016
+ var argKeyNorm = (k) => k.replace(/_/g, "").toLowerCase();
31017
+ function editDistance(a, b) {
31018
+ const row = Array.from({ length: b.length + 1 }, (_, j) => j);
31019
+ for (let i = 1; i <= a.length; i++) {
31020
+ let prev = row[0];
31021
+ row[0] = i;
31022
+ for (let j = 1; j <= b.length; j++) {
31023
+ const cur = row[j];
31024
+ row[j] = Math.min(row[j] + 1, row[j - 1] + 1, prev + (a[i - 1] === b[j - 1] ? 0 : 1));
31025
+ prev = cur;
31026
+ }
31027
+ }
31028
+ return row[b.length];
31029
+ }
31030
+ function normalizeArgKeys(tool, args) {
31031
+ const schema = tool.inputSchema;
31032
+ const props = schema?.properties;
31033
+ if (!props || typeof props !== "object") return { args };
31034
+ const declared = Object.keys(props).filter((k) => k !== ORIGIN_FIELD);
31035
+ const out = {};
31036
+ for (const [key, value] of Object.entries(args)) {
31037
+ if (Object.prototype.hasOwnProperty.call(props, key)) out[key] = value;
31038
+ }
31039
+ const unknown = [];
31040
+ for (const [key, value] of Object.entries(args)) {
31041
+ if (Object.prototype.hasOwnProperty.call(props, key)) continue;
31042
+ const n = argKeyNorm(key);
31043
+ const same = declared.find((d) => argKeyNorm(d) === n);
31044
+ const plural = declared.find(
31045
+ (d) => props[d]?.type === "array" && argKeyNorm(d) === `${n}s`
31046
+ );
31047
+ if (same && !(same in out)) {
31048
+ out[same] = value;
31049
+ } else if (!same && plural && !(plural in out)) {
31050
+ out[plural] = typeof value === "string" && !value.trim().startsWith("[") ? [value] : value;
31051
+ } else {
31052
+ unknown.push(key);
31053
+ }
31054
+ }
31055
+ if (unknown.length === 0) return { args: out };
31056
+ if (schema?.additionalProperties !== false) {
31057
+ for (const key of unknown) out[key] = args[key];
31058
+ return { args: out };
31059
+ }
31060
+ const required = Array.isArray(schema.required) ? schema.required : [];
31061
+ const missing = required.filter((r) => r !== TRIGGERED_BY_FIELD && !(r in out));
31062
+ const suggest = (key) => {
31063
+ const n = argKeyNorm(key);
31064
+ const close2 = declared.map((d) => ({ d, dist: editDistance(n, argKeyNorm(d)) })).filter(({ dist }) => dist <= Math.max(2, Math.floor(n.length / 3))).sort((a, b) => a.dist - b.dist)[0]?.d;
31065
+ return close2 ?? (missing.length === 1 ? missing[0] : void 0);
31066
+ };
31067
+ const named = unknown.map((k) => {
31068
+ const s = suggest(k);
31069
+ return s ? `\`${k}\` (did you mean \`${s}\`?)` : `\`${k}\``;
31070
+ });
31071
+ return {
31072
+ error: {
31073
+ error: true,
31074
+ code: "INVALID_PARAMS",
31075
+ message: `${tool.name} has no argument ${named.join(", ")}`,
31076
+ hint: `Accepted arguments: ${declared.map((d) => `\`${d}\``).join(", ")}. Re-call with those names. Nothing was written.`
31077
+ }
31078
+ };
31079
+ }
31016
31080
  function toolsListPayload(tools2) {
31017
31081
  return tools2.map((t) => {
31018
31082
  const out = {
@@ -31276,6 +31340,7 @@ function buildServer(client, opts = {}) {
31276
31340
  }
31277
31341
  const rawArgs = req.params.arguments ?? {};
31278
31342
  const { triggered_by: rawTriggeredBy, origin, cleaned: args } = extractTriggeredBy(rawArgs);
31343
+ const arg_keys = Object.keys(args).slice(0, 20).map((k) => k.slice(0, 64));
31279
31344
  const triggered_by = name === "leadbay_report_friction" ? void 0 : rawTriggeredBy;
31280
31345
  const progressToken = req.params?._meta?.progressToken;
31281
31346
  const progress = progressToken !== void 0 ? (params) => {
@@ -31401,8 +31466,10 @@ ${url}
31401
31466
  isError: true
31402
31467
  };
31403
31468
  }
31404
- const shapeError = findShapeMismatch(tool, args);
31405
- const result = shapeError ?? await runWithRequestSignal(extra.signal, () => tool.execute(client, args, {
31469
+ const keyed = normalizeArgKeys(tool, args);
31470
+ const callArgs = keyed.error ? args : keyed.args;
31471
+ const shapeError = keyed.error ?? findShapeMismatch(tool, callArgs);
31472
+ const result = shapeError ?? await runWithRequestSignal(extra.signal, () => tool.execute(client, callArgs, {
31406
31473
  logger: opts.logger,
31407
31474
  notificationsInbox: opts.notificationsInbox,
31408
31475
  signal: extra.signal,
@@ -31492,6 +31559,7 @@ ${url}
31492
31559
  format: "error-envelope",
31493
31560
  bytes: envText.length,
31494
31561
  error_code: envCode,
31562
+ arg_keys,
31495
31563
  triggered_by,
31496
31564
  origin
31497
31565
  });
@@ -31632,6 +31700,7 @@ ${url}
31632
31700
  bytes: errText.length,
31633
31701
  error_code: code,
31634
31702
  ...typeof httpStatus2 === "number" ? { http_status: httpStatus2 } : {},
31703
+ arg_keys,
31635
31704
  triggered_by,
31636
31705
  origin
31637
31706
  });
@@ -31663,6 +31732,7 @@ ${url}
31663
31732
  format: "error-envelope",
31664
31733
  bytes: errText.length,
31665
31734
  error_code: code,
31735
+ arg_keys,
31666
31736
  triggered_by,
31667
31737
  origin
31668
31738
  });
@@ -31880,7 +31950,7 @@ function parseWriteEnv(env = process.env) {
31880
31950
  }
31881
31951
 
31882
31952
  // src/http-server.ts
31883
- var VERSION = true ? "0.42.0" : "0.0.0-dev";
31953
+ var VERSION = true ? "0.43.1" : "0.0.0-dev";
31884
31954
  var PORT = Number(process.env.PORT ?? 8080);
31885
31955
  var HOST = process.env.HOST ?? "0.0.0.0";
31886
31956
  var logger = {
@@ -1805,7 +1805,7 @@ var init_installer_gui = __esm({
1805
1805
  init_install_dxt();
1806
1806
  init_install_shared();
1807
1807
  init_oauth();
1808
- VERSION = true ? "0.42.0" : "0.0.0-dev";
1808
+ VERSION = true ? "0.43.1" : "0.0.0-dev";
1809
1809
  MESSAGES = {
1810
1810
  en: {
1811
1811
  installer: {
@@ -1068,7 +1068,7 @@ async function oauthLogin(opts) {
1068
1068
  }
1069
1069
 
1070
1070
  // installer/installer-gui.ts
1071
- var VERSION = true ? "0.42.0" : "0.0.0-dev";
1071
+ var VERSION = true ? "0.43.1" : "0.0.0-dev";
1072
1072
  var MESSAGES = {
1073
1073
  en: {
1074
1074
  installer: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@leadbay/mcp",
3
- "version": "0.42.0",
3
+ "version": "0.43.1",
4
4
  "mcpName": "io.github.leadbay/leadbay-mcp",
5
5
  "description": "Model Context Protocol (MCP) server for Leadbay — AI lead discovery, qualification, and enrichment for Claude Desktop, Cursor, and Claude Code.",
6
6
  "type": "module",