@leadbay/mcp 0.35.1 → 0.36.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 +75 -0
- package/dist/bin.js +160 -2
- package/dist/http-server.js +160 -2
- 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,80 @@
|
|
|
1
1
|
# Changelog — @leadbay/mcp
|
|
2
2
|
|
|
3
|
+
## 0.36.0 — 2026-09-08
|
|
4
|
+
|
|
5
|
+
The OpenAI submission form flags every tool without an `outputSchema`
|
|
6
|
+
("Recommended: Add an outputSchema so models can better understand this tool's
|
|
7
|
+
results"). 43 of the 58 tools on `/chatgpt/mcp` already had one. This adds four
|
|
8
|
+
of the remaining 15:
|
|
9
|
+
|
|
10
|
+
- `leadbay_account_history`, `leadbay_team_activity` — rich nested payloads the
|
|
11
|
+
model previously had to infer from prose.
|
|
12
|
+
- `leadbay_getting_started`, `leadbay_artifact_kit` — static manifests; cheap to
|
|
13
|
+
declare, and both are consumed programmatically.
|
|
14
|
+
|
|
15
|
+
Each gets a real entry in `output-schema-conformance.test.ts` CASES, not an
|
|
16
|
+
OPT_OUT: a mocked happy-path round-trip whose structuredContent is asserted
|
|
17
|
+
against the schema. Mutation-checked — renaming `trend` in the team_activity
|
|
18
|
+
schema fails with `$.trend: return contains key not declared in
|
|
19
|
+
outputSchema.properties (drift)`.
|
|
20
|
+
|
|
21
|
+
A local Codex review of this branch found three real defects in the first pass,
|
|
22
|
+
all fixed here:
|
|
23
|
+
|
|
24
|
+
- `account_history` declared `signals` as an object. `research_lead_by_id`,
|
|
25
|
+
whose payload it passes straight through, declares it an **array**. The
|
|
26
|
+
conformance walk checks required keys and undeclared keys, not types, so it
|
|
27
|
+
did not catch this.
|
|
28
|
+
- The `account_history` conformance case under-mocked the fan-out. It never
|
|
29
|
+
mocked `/leads/{id}/contacts?IncludeEnriched=true`, and gave one generic
|
|
30
|
+
`/activities` script for the two reads that happen (research's `count=20`,
|
|
31
|
+
then the tool's own `count=<n>`). The harness consumes a script once, so the
|
|
32
|
+
second read rejected, `.catch()`ed to empty, and the case asserted a degraded
|
|
33
|
+
timeline while staying schema-conformant. Proven: with the old mocks the new
|
|
34
|
+
`account-history-full-fanout.test.ts` fails `expected [] to have a length of
|
|
35
|
+
1`.
|
|
36
|
+
- `artifact_kit`'s schema omitted `_meta`. `buildServer` injects
|
|
37
|
+
`_meta.update_available` / `_meta.notifications` into successful object
|
|
38
|
+
results before setting `structuredContent`, so it is a real top-level key at
|
|
39
|
+
runtime. The other three declared it.
|
|
40
|
+
|
|
41
|
+
Two deliberate limits:
|
|
42
|
+
|
|
43
|
+
- **`leadbay_list_sectors` is excluded.** It returns a bare array, and
|
|
44
|
+
`server.ts` only emits `structuredContent` for plain objects, so a schema
|
|
45
|
+
there would promise a payload the server never sends. Making it honest means
|
|
46
|
+
changing the return to an object, which breaks existing callers.
|
|
47
|
+
- On `account_history`, the blobs passed through verbatim from
|
|
48
|
+
`research_lead_by_id` (`signals`, `firmographics`, `contacts`, `engagement`)
|
|
49
|
+
are declared as bare objects with no `properties`. The conformance walk only
|
|
50
|
+
recurses into declared object-properties that carry their own `properties`,
|
|
51
|
+
so research can grow a field without breaking this tool.
|
|
52
|
+
|
|
53
|
+
The remaining 10 tools without a schema are write acknowledgements
|
|
54
|
+
(`pin_contact`, `like_lead`, `set_telemetry`, …). A schema for `{ok:true}`
|
|
55
|
+
teaches the model nothing; left alone on purpose.
|
|
56
|
+
|
|
57
|
+
## 0.35.2 — 2026-09-08
|
|
58
|
+
|
|
59
|
+
A backend `bad_request` 400 is now `BAD_INPUT` (product#4085).
|
|
60
|
+
|
|
61
|
+
**What happened.** On 8 Sep an unattended routine on the hosted server called
|
|
62
|
+
`leadbay_research_lead_by_id` twenty times in 39 seconds with the first block
|
|
63
|
+
of each lead UUID (`/lenses/48110/leads/5585c198`, …). The backend rejected
|
|
64
|
+
every call in ~30 ms with `400 {"error":{"code":"bad_request","message":"bad
|
|
65
|
+
'leadId' parameter"}}`. `client.ts` `mapErrorResponse` filed that under the
|
|
66
|
+
`API_ERROR` catch-all, whose hint reads "Try again or check the Leadbay API
|
|
67
|
+
status". The agent did what it was told. The same pattern ran on 31 Aug.
|
|
68
|
+
|
|
69
|
+
**Change.** A 400 whose body carries the backend's `bad_request` code (a path
|
|
70
|
+
or query parameter that failed to parse, a body that failed to deserialize) is
|
|
71
|
+
`BAD_INPUT`, with the backend message verbatim and a hint that the call fails
|
|
72
|
+
identically on retry and that ids are the full values Leadbay returned. Other
|
|
73
|
+
400 codes (`duplicate`, `unpaid_invoice`, `not_allowed`, …) are domain answers
|
|
74
|
+
and stay `API_ERROR`. `leadbay_research_lead_by_id`'s `leadId` schema
|
|
75
|
+
description now says the id is the full 36-character UUID from
|
|
76
|
+
`leadbay_pull_leads` `items[].id`, never shortened. No template change.
|
|
77
|
+
|
|
3
78
|
## 0.35.1 — 2026-09-08
|
|
4
79
|
|
|
5
80
|
Release-pipeline only. No source change, no behaviour change: `packages/core`
|
package/dist/bin.js
CHANGED
|
@@ -661,6 +661,9 @@ var init_client = __esm({
|
|
|
661
661
|
if (status === 404) {
|
|
662
662
|
return this.makeError("NOT_FOUND", parsed?.message || parsed?.error?.message || "Resource not found", "Verify the ID is correct", endpoint, null, status);
|
|
663
663
|
}
|
|
664
|
+
if (status === 400 && parsed?.error?.code === "bad_request") {
|
|
665
|
+
return this.makeError("BAD_INPUT", parsed?.error?.message || parsed?.message || "Leadbay rejected the request as malformed", "Leadbay's input validation rejected this call, so the same call will fail the same way \u2014 do not retry it unchanged. Fix the parameter named in the message first; if it is an id, pass it exactly as Leadbay returned it, never shortened or reconstructed.", endpoint, null, status);
|
|
666
|
+
}
|
|
664
667
|
return this.makeError("API_ERROR", parsed?.message || parsed?.error?.message || `API error (${status})`, "Try again or check the Leadbay API status", endpoint, null, status);
|
|
665
668
|
}
|
|
666
669
|
// /me cache (60s TTL). Separate from resolveOrgId() which still works for
|
|
@@ -14817,7 +14820,10 @@ var init_research_lead_by_id = __esm({
|
|
|
14817
14820
|
inputSchema: {
|
|
14818
14821
|
type: "object",
|
|
14819
14822
|
properties: {
|
|
14820
|
-
leadId: {
|
|
14823
|
+
leadId: {
|
|
14824
|
+
type: "string",
|
|
14825
|
+
description: "Full 36-character lead UUID exactly as returned in leadbay_pull_leads items[].id (never shortened)"
|
|
14826
|
+
},
|
|
14821
14827
|
lensId: {
|
|
14822
14828
|
type: "number",
|
|
14823
14829
|
description: "Lens id (escape hatch \u2014 normally omit; auto-resolves to the active lens)"
|
|
@@ -15734,6 +15740,32 @@ var init_getting_started = __esm({
|
|
|
15734
15740
|
openWorldHint: false
|
|
15735
15741
|
},
|
|
15736
15742
|
description: leadbay_getting_started,
|
|
15743
|
+
outputSchema: {
|
|
15744
|
+
type: "object",
|
|
15745
|
+
properties: {
|
|
15746
|
+
version: { type: "number", description: "Manifest version; bump means the script changed." },
|
|
15747
|
+
intro: { type: "string", description: "What to say before gate 1." },
|
|
15748
|
+
one_option_rule: {
|
|
15749
|
+
type: "string",
|
|
15750
|
+
description: "The invariant every gate obeys: one way forward plus one way out, never three."
|
|
15751
|
+
},
|
|
15752
|
+
docs_url: { type: "string", description: "The canonical setup guide." },
|
|
15753
|
+
docs_note: { type: "string", description: "The only two moments that link may appear." },
|
|
15754
|
+
calendly_url: { type: "string", description: "1:1 setup session, offered on exit only." },
|
|
15755
|
+
exit_offer: { type: "string", description: "How and when to make that offer." },
|
|
15756
|
+
steps: {
|
|
15757
|
+
type: "array",
|
|
15758
|
+
description: "The gates, in order. Each carries n, gate_label, gate_description, explain, next_steps (the widget payload), calls, args, and optional forbidden_args / spend / quota_note / pin / branches. Render next_steps VERBATIM."
|
|
15759
|
+
},
|
|
15760
|
+
keep_going: {
|
|
15761
|
+
type: "array",
|
|
15762
|
+
description: "The hand-off cards: what the user should TYPE to get each thing back once the buttons are gone. Every phrase is lifted from a tool's own routing triggers."
|
|
15763
|
+
},
|
|
15764
|
+
stop: { type: "string", description: "How to close the tour." },
|
|
15765
|
+
_meta: { type: "object", description: "Server-injected notices, when present." }
|
|
15766
|
+
},
|
|
15767
|
+
required: ["version", "intro", "steps", "keep_going", "stop"]
|
|
15768
|
+
},
|
|
15737
15769
|
write: false,
|
|
15738
15770
|
inputSchema: {
|
|
15739
15771
|
type: "object",
|
|
@@ -16012,6 +16044,63 @@ var init_account_history = __esm({
|
|
|
16012
16044
|
openWorldHint: true
|
|
16013
16045
|
},
|
|
16014
16046
|
description: leadbay_account_history,
|
|
16047
|
+
outputSchema: {
|
|
16048
|
+
type: "object",
|
|
16049
|
+
properties: {
|
|
16050
|
+
lead: {
|
|
16051
|
+
type: "object",
|
|
16052
|
+
description: "Which account this history is about.",
|
|
16053
|
+
properties: {
|
|
16054
|
+
id: { type: "string" },
|
|
16055
|
+
name: { type: ["string", "null"] }
|
|
16056
|
+
},
|
|
16057
|
+
required: ["id"]
|
|
16058
|
+
},
|
|
16059
|
+
signals: {
|
|
16060
|
+
// An ARRAY of priority-ordered sections, matching what
|
|
16061
|
+
// research_lead_by_id's own outputSchema declares — this is its payload
|
|
16062
|
+
// passed straight through. Null when the research call has no web-fetch
|
|
16063
|
+
// content to reshape.
|
|
16064
|
+
type: ["array", "null"],
|
|
16065
|
+
description: "Live signals, verbatim from leadbay_research_lead_by_id \u2014 why this account is hot NOW."
|
|
16066
|
+
},
|
|
16067
|
+
firmographics: { type: ["object", "null"], description: "Company facts, verbatim from research." },
|
|
16068
|
+
qualification: { type: "array", description: "Per-question qualification answers, verbatim from research." },
|
|
16069
|
+
contacts: { type: ["object", "null"], description: "Reachable contacts + candidates, verbatim from research." },
|
|
16070
|
+
engagement: { type: ["object", "null"], description: "Engagement counters, verbatim from research." },
|
|
16071
|
+
notes: {
|
|
16072
|
+
type: "array",
|
|
16073
|
+
description: "FULL note bodies \u2014 the part research only counts. Oldest first."
|
|
16074
|
+
},
|
|
16075
|
+
activities: {
|
|
16076
|
+
type: "object",
|
|
16077
|
+
description: "The interaction timeline research only summarizes.",
|
|
16078
|
+
properties: {
|
|
16079
|
+
activities: {
|
|
16080
|
+
type: "array",
|
|
16081
|
+
description: "One entry per logged interaction.",
|
|
16082
|
+
items: {
|
|
16083
|
+
type: "object",
|
|
16084
|
+
properties: {
|
|
16085
|
+
type: { type: "string" },
|
|
16086
|
+
date: { type: "string" }
|
|
16087
|
+
}
|
|
16088
|
+
}
|
|
16089
|
+
},
|
|
16090
|
+
total: {
|
|
16091
|
+
type: "number",
|
|
16092
|
+
description: "Total on the server, which can exceed the number returned."
|
|
16093
|
+
}
|
|
16094
|
+
},
|
|
16095
|
+
required: ["activities", "total"]
|
|
16096
|
+
},
|
|
16097
|
+
_meta: {
|
|
16098
|
+
type: "object",
|
|
16099
|
+
description: "Research's pass-through metadata (lens_id, web_fetch_in_progress, has_reachable_contact, \u2026) plus region and this call's counts."
|
|
16100
|
+
}
|
|
16101
|
+
},
|
|
16102
|
+
required: ["lead", "notes", "activities"]
|
|
16103
|
+
},
|
|
16015
16104
|
inputSchema: {
|
|
16016
16105
|
type: "object",
|
|
16017
16106
|
properties: {
|
|
@@ -21356,6 +21445,62 @@ var init_team_activity = __esm({
|
|
|
21356
21445
|
openWorldHint: true
|
|
21357
21446
|
},
|
|
21358
21447
|
description: leadbay_team_activity,
|
|
21448
|
+
outputSchema: {
|
|
21449
|
+
type: "object",
|
|
21450
|
+
properties: {
|
|
21451
|
+
range: {
|
|
21452
|
+
type: "object",
|
|
21453
|
+
description: "The window actually queried, after `weeks` was resolved to dates.",
|
|
21454
|
+
properties: {
|
|
21455
|
+
from: { type: "string", description: "ISO date (YYYY-MM-DD), inclusive." },
|
|
21456
|
+
to: { type: "string", description: "ISO date (YYYY-MM-DD), inclusive." },
|
|
21457
|
+
periodicity: { type: "string", description: "DAILY or WEEKLY \u2014 the trend bucket size." }
|
|
21458
|
+
},
|
|
21459
|
+
required: ["from", "to", "periodicity"]
|
|
21460
|
+
},
|
|
21461
|
+
reps: {
|
|
21462
|
+
type: "array",
|
|
21463
|
+
description: "One row per rep, already renamed from the backend's KPI vocabulary. Non-admins get only themselves; the backend does that scoping.",
|
|
21464
|
+
items: {
|
|
21465
|
+
type: "object",
|
|
21466
|
+
properties: {
|
|
21467
|
+
user_id: { type: "string" },
|
|
21468
|
+
name: { type: ["string", "null"] },
|
|
21469
|
+
email: { type: ["string", "null"] },
|
|
21470
|
+
total_activities: { type: "number" },
|
|
21471
|
+
likes: { type: "number" },
|
|
21472
|
+
saves: { type: "number" },
|
|
21473
|
+
website_clicks: { type: "number" },
|
|
21474
|
+
exported: { type: "number" },
|
|
21475
|
+
profile_views: { type: "number" },
|
|
21476
|
+
contacts_added: { type: "number" },
|
|
21477
|
+
contacts_purchased: { type: "number" },
|
|
21478
|
+
notes: { type: "number" },
|
|
21479
|
+
meetings_or_interest: {
|
|
21480
|
+
type: "number",
|
|
21481
|
+
description: "Epilogue outcomes logged in the window \u2014 the 'deals' signal."
|
|
21482
|
+
},
|
|
21483
|
+
could_not_reach: { type: "number" },
|
|
21484
|
+
lost: { type: "number" },
|
|
21485
|
+
still_chasing: { type: "number" }
|
|
21486
|
+
}
|
|
21487
|
+
}
|
|
21488
|
+
},
|
|
21489
|
+
trend: {
|
|
21490
|
+
type: "array",
|
|
21491
|
+
description: "Activity over time, one point per period.",
|
|
21492
|
+
items: {
|
|
21493
|
+
type: "object",
|
|
21494
|
+
properties: {
|
|
21495
|
+
date: { type: "string" },
|
|
21496
|
+
count: { type: "number" }
|
|
21497
|
+
}
|
|
21498
|
+
}
|
|
21499
|
+
},
|
|
21500
|
+
_meta: { type: "object", description: "Region + any server-injected notices." }
|
|
21501
|
+
},
|
|
21502
|
+
required: ["range", "reps", "trend"]
|
|
21503
|
+
},
|
|
21359
21504
|
write: false,
|
|
21360
21505
|
inputSchema: {
|
|
21361
21506
|
type: "object",
|
|
@@ -21506,6 +21651,19 @@ var init_artifact_kit = __esm({
|
|
|
21506
21651
|
openWorldHint: false
|
|
21507
21652
|
},
|
|
21508
21653
|
description: leadbay_artifact_kit,
|
|
21654
|
+
outputSchema: {
|
|
21655
|
+
type: "object",
|
|
21656
|
+
properties: {
|
|
21657
|
+
version: { type: "string", description: "Kit version; bump means the runtime changed." },
|
|
21658
|
+
runtime: { type: "string", description: "The self-contained JS the artifact inlines." },
|
|
21659
|
+
usage_guide: { type: "string", description: "Markdown guide for building the artifact." },
|
|
21660
|
+
// buildServer injects _meta.update_available / _meta.notifications into
|
|
21661
|
+
// successful object results before emitting structuredContent, so it is a
|
|
21662
|
+
// real top-level key at runtime even though execute() never writes it.
|
|
21663
|
+
_meta: { type: "object", description: "Server-injected notices, when present." }
|
|
21664
|
+
},
|
|
21665
|
+
required: ["version", "runtime", "usage_guide"]
|
|
21666
|
+
},
|
|
21509
21667
|
write: false,
|
|
21510
21668
|
inputSchema: {
|
|
21511
21669
|
type: "object",
|
|
@@ -28045,7 +28203,7 @@ var OAUTH_BASE_URLS = {
|
|
|
28045
28203
|
fr: "https://staging.api.leadbay.app"
|
|
28046
28204
|
}
|
|
28047
28205
|
};
|
|
28048
|
-
var VERSION = "0.
|
|
28206
|
+
var VERSION = "0.36.0";
|
|
28049
28207
|
var HELP = `
|
|
28050
28208
|
leadbay-mcp ${VERSION} \u2014 Leadbay Model Context Protocol server
|
|
28051
28209
|
|
package/dist/http-server.js
CHANGED
|
@@ -3649,6 +3649,9 @@ var LeadbayClient = class _LeadbayClient {
|
|
|
3649
3649
|
if (status === 404) {
|
|
3650
3650
|
return this.makeError("NOT_FOUND", parsed?.message || parsed?.error?.message || "Resource not found", "Verify the ID is correct", endpoint, null, status);
|
|
3651
3651
|
}
|
|
3652
|
+
if (status === 400 && parsed?.error?.code === "bad_request") {
|
|
3653
|
+
return this.makeError("BAD_INPUT", parsed?.error?.message || parsed?.message || "Leadbay rejected the request as malformed", "Leadbay's input validation rejected this call, so the same call will fail the same way \u2014 do not retry it unchanged. Fix the parameter named in the message first; if it is an id, pass it exactly as Leadbay returned it, never shortened or reconstructed.", endpoint, null, status);
|
|
3654
|
+
}
|
|
3652
3655
|
return this.makeError("API_ERROR", parsed?.message || parsed?.error?.message || `API error (${status})`, "Try again or check the Leadbay API status", endpoint, null, status);
|
|
3653
3656
|
}
|
|
3654
3657
|
// /me cache (60s TTL). Separate from resolveOrgId() which still works for
|
|
@@ -16962,7 +16965,10 @@ var researchLeadById = {
|
|
|
16962
16965
|
inputSchema: {
|
|
16963
16966
|
type: "object",
|
|
16964
16967
|
properties: {
|
|
16965
|
-
leadId: {
|
|
16968
|
+
leadId: {
|
|
16969
|
+
type: "string",
|
|
16970
|
+
description: "Full 36-character lead UUID exactly as returned in leadbay_pull_leads items[].id (never shortened)"
|
|
16971
|
+
},
|
|
16966
16972
|
lensId: {
|
|
16967
16973
|
type: "number",
|
|
16968
16974
|
description: "Lens id (escape hatch \u2014 normally omit; auto-resolves to the active lens)"
|
|
@@ -17856,6 +17862,32 @@ var gettingStarted = {
|
|
|
17856
17862
|
openWorldHint: false
|
|
17857
17863
|
},
|
|
17858
17864
|
description: leadbay_getting_started2,
|
|
17865
|
+
outputSchema: {
|
|
17866
|
+
type: "object",
|
|
17867
|
+
properties: {
|
|
17868
|
+
version: { type: "number", description: "Manifest version; bump means the script changed." },
|
|
17869
|
+
intro: { type: "string", description: "What to say before gate 1." },
|
|
17870
|
+
one_option_rule: {
|
|
17871
|
+
type: "string",
|
|
17872
|
+
description: "The invariant every gate obeys: one way forward plus one way out, never three."
|
|
17873
|
+
},
|
|
17874
|
+
docs_url: { type: "string", description: "The canonical setup guide." },
|
|
17875
|
+
docs_note: { type: "string", description: "The only two moments that link may appear." },
|
|
17876
|
+
calendly_url: { type: "string", description: "1:1 setup session, offered on exit only." },
|
|
17877
|
+
exit_offer: { type: "string", description: "How and when to make that offer." },
|
|
17878
|
+
steps: {
|
|
17879
|
+
type: "array",
|
|
17880
|
+
description: "The gates, in order. Each carries n, gate_label, gate_description, explain, next_steps (the widget payload), calls, args, and optional forbidden_args / spend / quota_note / pin / branches. Render next_steps VERBATIM."
|
|
17881
|
+
},
|
|
17882
|
+
keep_going: {
|
|
17883
|
+
type: "array",
|
|
17884
|
+
description: "The hand-off cards: what the user should TYPE to get each thing back once the buttons are gone. Every phrase is lifted from a tool's own routing triggers."
|
|
17885
|
+
},
|
|
17886
|
+
stop: { type: "string", description: "How to close the tour." },
|
|
17887
|
+
_meta: { type: "object", description: "Server-injected notices, when present." }
|
|
17888
|
+
},
|
|
17889
|
+
required: ["version", "intro", "steps", "keep_going", "stop"]
|
|
17890
|
+
},
|
|
17859
17891
|
write: false,
|
|
17860
17892
|
inputSchema: {
|
|
17861
17893
|
type: "object",
|
|
@@ -18112,6 +18144,63 @@ var accountHistory = {
|
|
|
18112
18144
|
openWorldHint: true
|
|
18113
18145
|
},
|
|
18114
18146
|
description: leadbay_account_history,
|
|
18147
|
+
outputSchema: {
|
|
18148
|
+
type: "object",
|
|
18149
|
+
properties: {
|
|
18150
|
+
lead: {
|
|
18151
|
+
type: "object",
|
|
18152
|
+
description: "Which account this history is about.",
|
|
18153
|
+
properties: {
|
|
18154
|
+
id: { type: "string" },
|
|
18155
|
+
name: { type: ["string", "null"] }
|
|
18156
|
+
},
|
|
18157
|
+
required: ["id"]
|
|
18158
|
+
},
|
|
18159
|
+
signals: {
|
|
18160
|
+
// An ARRAY of priority-ordered sections, matching what
|
|
18161
|
+
// research_lead_by_id's own outputSchema declares — this is its payload
|
|
18162
|
+
// passed straight through. Null when the research call has no web-fetch
|
|
18163
|
+
// content to reshape.
|
|
18164
|
+
type: ["array", "null"],
|
|
18165
|
+
description: "Live signals, verbatim from leadbay_research_lead_by_id \u2014 why this account is hot NOW."
|
|
18166
|
+
},
|
|
18167
|
+
firmographics: { type: ["object", "null"], description: "Company facts, verbatim from research." },
|
|
18168
|
+
qualification: { type: "array", description: "Per-question qualification answers, verbatim from research." },
|
|
18169
|
+
contacts: { type: ["object", "null"], description: "Reachable contacts + candidates, verbatim from research." },
|
|
18170
|
+
engagement: { type: ["object", "null"], description: "Engagement counters, verbatim from research." },
|
|
18171
|
+
notes: {
|
|
18172
|
+
type: "array",
|
|
18173
|
+
description: "FULL note bodies \u2014 the part research only counts. Oldest first."
|
|
18174
|
+
},
|
|
18175
|
+
activities: {
|
|
18176
|
+
type: "object",
|
|
18177
|
+
description: "The interaction timeline research only summarizes.",
|
|
18178
|
+
properties: {
|
|
18179
|
+
activities: {
|
|
18180
|
+
type: "array",
|
|
18181
|
+
description: "One entry per logged interaction.",
|
|
18182
|
+
items: {
|
|
18183
|
+
type: "object",
|
|
18184
|
+
properties: {
|
|
18185
|
+
type: { type: "string" },
|
|
18186
|
+
date: { type: "string" }
|
|
18187
|
+
}
|
|
18188
|
+
}
|
|
18189
|
+
},
|
|
18190
|
+
total: {
|
|
18191
|
+
type: "number",
|
|
18192
|
+
description: "Total on the server, which can exceed the number returned."
|
|
18193
|
+
}
|
|
18194
|
+
},
|
|
18195
|
+
required: ["activities", "total"]
|
|
18196
|
+
},
|
|
18197
|
+
_meta: {
|
|
18198
|
+
type: "object",
|
|
18199
|
+
description: "Research's pass-through metadata (lens_id, web_fetch_in_progress, has_reachable_contact, \u2026) plus region and this call's counts."
|
|
18200
|
+
}
|
|
18201
|
+
},
|
|
18202
|
+
required: ["lead", "notes", "activities"]
|
|
18203
|
+
},
|
|
18115
18204
|
inputSchema: {
|
|
18116
18205
|
type: "object",
|
|
18117
18206
|
properties: {
|
|
@@ -23282,6 +23371,62 @@ var teamActivity = {
|
|
|
23282
23371
|
openWorldHint: true
|
|
23283
23372
|
},
|
|
23284
23373
|
description: leadbay_team_activity,
|
|
23374
|
+
outputSchema: {
|
|
23375
|
+
type: "object",
|
|
23376
|
+
properties: {
|
|
23377
|
+
range: {
|
|
23378
|
+
type: "object",
|
|
23379
|
+
description: "The window actually queried, after `weeks` was resolved to dates.",
|
|
23380
|
+
properties: {
|
|
23381
|
+
from: { type: "string", description: "ISO date (YYYY-MM-DD), inclusive." },
|
|
23382
|
+
to: { type: "string", description: "ISO date (YYYY-MM-DD), inclusive." },
|
|
23383
|
+
periodicity: { type: "string", description: "DAILY or WEEKLY \u2014 the trend bucket size." }
|
|
23384
|
+
},
|
|
23385
|
+
required: ["from", "to", "periodicity"]
|
|
23386
|
+
},
|
|
23387
|
+
reps: {
|
|
23388
|
+
type: "array",
|
|
23389
|
+
description: "One row per rep, already renamed from the backend's KPI vocabulary. Non-admins get only themselves; the backend does that scoping.",
|
|
23390
|
+
items: {
|
|
23391
|
+
type: "object",
|
|
23392
|
+
properties: {
|
|
23393
|
+
user_id: { type: "string" },
|
|
23394
|
+
name: { type: ["string", "null"] },
|
|
23395
|
+
email: { type: ["string", "null"] },
|
|
23396
|
+
total_activities: { type: "number" },
|
|
23397
|
+
likes: { type: "number" },
|
|
23398
|
+
saves: { type: "number" },
|
|
23399
|
+
website_clicks: { type: "number" },
|
|
23400
|
+
exported: { type: "number" },
|
|
23401
|
+
profile_views: { type: "number" },
|
|
23402
|
+
contacts_added: { type: "number" },
|
|
23403
|
+
contacts_purchased: { type: "number" },
|
|
23404
|
+
notes: { type: "number" },
|
|
23405
|
+
meetings_or_interest: {
|
|
23406
|
+
type: "number",
|
|
23407
|
+
description: "Epilogue outcomes logged in the window \u2014 the 'deals' signal."
|
|
23408
|
+
},
|
|
23409
|
+
could_not_reach: { type: "number" },
|
|
23410
|
+
lost: { type: "number" },
|
|
23411
|
+
still_chasing: { type: "number" }
|
|
23412
|
+
}
|
|
23413
|
+
}
|
|
23414
|
+
},
|
|
23415
|
+
trend: {
|
|
23416
|
+
type: "array",
|
|
23417
|
+
description: "Activity over time, one point per period.",
|
|
23418
|
+
items: {
|
|
23419
|
+
type: "object",
|
|
23420
|
+
properties: {
|
|
23421
|
+
date: { type: "string" },
|
|
23422
|
+
count: { type: "number" }
|
|
23423
|
+
}
|
|
23424
|
+
}
|
|
23425
|
+
},
|
|
23426
|
+
_meta: { type: "object", description: "Region + any server-injected notices." }
|
|
23427
|
+
},
|
|
23428
|
+
required: ["range", "reps", "trend"]
|
|
23429
|
+
},
|
|
23285
23430
|
write: false,
|
|
23286
23431
|
inputSchema: {
|
|
23287
23432
|
type: "object",
|
|
@@ -23411,6 +23556,19 @@ var artifactKit = {
|
|
|
23411
23556
|
openWorldHint: false
|
|
23412
23557
|
},
|
|
23413
23558
|
description: leadbay_artifact_kit,
|
|
23559
|
+
outputSchema: {
|
|
23560
|
+
type: "object",
|
|
23561
|
+
properties: {
|
|
23562
|
+
version: { type: "string", description: "Kit version; bump means the runtime changed." },
|
|
23563
|
+
runtime: { type: "string", description: "The self-contained JS the artifact inlines." },
|
|
23564
|
+
usage_guide: { type: "string", description: "Markdown guide for building the artifact." },
|
|
23565
|
+
// buildServer injects _meta.update_available / _meta.notifications into
|
|
23566
|
+
// successful object results before emitting structuredContent, so it is a
|
|
23567
|
+
// real top-level key at runtime even though execute() never writes it.
|
|
23568
|
+
_meta: { type: "object", description: "Server-injected notices, when present." }
|
|
23569
|
+
},
|
|
23570
|
+
required: ["version", "runtime", "usage_guide"]
|
|
23571
|
+
},
|
|
23414
23572
|
write: false,
|
|
23415
23573
|
inputSchema: {
|
|
23416
23574
|
type: "object",
|
|
@@ -25410,7 +25568,7 @@ function parseWriteEnv(env = process.env) {
|
|
|
25410
25568
|
}
|
|
25411
25569
|
|
|
25412
25570
|
// src/http-server.ts
|
|
25413
|
-
var VERSION = true ? "0.
|
|
25571
|
+
var VERSION = true ? "0.36.0" : "0.0.0-dev";
|
|
25414
25572
|
var PORT = Number(process.env.PORT ?? 8080);
|
|
25415
25573
|
var HOST = process.env.HOST ?? "0.0.0.0";
|
|
25416
25574
|
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.36.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",
|