@leadbay/mcp 0.42.0 → 0.43.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/CHANGELOG.md +16 -0
- package/dist/bin.js +76 -6
- package/dist/http-server.js +76 -6
- package/dist/installer-electron.js +1 -1
- package/dist/installer-gui.js +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# Changelog — @leadbay/mcp
|
|
2
2
|
|
|
3
|
+
## 0.43.0 — 2026-09-30 — a misnamed argument is read or named, never dropped
|
|
4
|
+
|
|
5
|
+
- **`lead_id` and `leadId` both work.** Leadbay tools spell the lead id
|
|
6
|
+
differently: researching a lead and adding a note take `leadId`, setting a
|
|
7
|
+
CRM status takes `lead_ids`. An assistant that used the other spelling was
|
|
8
|
+
told the id was missing, and a scheduled run lost a night's notes and
|
|
9
|
+
statuses this way. An argument that differs only by capitals or underscores
|
|
10
|
+
is now read as the one the tool expects, and setting a status also takes a
|
|
11
|
+
single lead id.
|
|
12
|
+
- **Any other unknown argument is named.** It used to be dropped silently. It
|
|
13
|
+
now comes back as an error that names it, suggests the argument it probably
|
|
14
|
+
meant, and lists the ones the tool takes. A call rejected this way writes
|
|
15
|
+
nothing.
|
|
16
|
+
- **Team prospecting setup names the right arguments.** It told the assistant
|
|
17
|
+
to pass `user_prompt` to two tools that take `prompt` and `base`.
|
|
18
|
+
|
|
3
19
|
## 0.42.0 — 2026-09-28 — every rep gets the same boards
|
|
4
20
|
|
|
5
21
|
- **The route planner and the lead triage board are now finished pages.**
|
package/dist/bin.js
CHANGED
|
@@ -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({
|
|
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({
|
|
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({
|
|
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
|
|
32903
|
-
const
|
|
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.
|
|
34719
|
+
var VERSION = "0.43.0";
|
|
34650
34720
|
var HELP = `
|
|
34651
34721
|
leadbay-mcp ${VERSION} \u2014 Leadbay Model Context Protocol server
|
|
34652
34722
|
|
package/dist/http-server.js
CHANGED
|
@@ -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({
|
|
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({
|
|
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({
|
|
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
|
|
|
@@ -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
|
|
31405
|
-
const
|
|
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.
|
|
31953
|
+
var VERSION = true ? "0.43.0" : "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 = {
|
package/dist/installer-gui.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@leadbay/mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.43.0",
|
|
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",
|