@leadbay/mcp 0.5.0 → 0.6.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 +18 -0
- package/MIGRATION.md +96 -0
- package/README.md +219 -10
- package/dist/bin.js +444 -15
- package/dist/{chunk-MCTWP5F2.js → chunk-NLG7GUZ3.js} +1976 -72
- package/dist/{dist-GUZQWQOO.js → dist-JUTSXWBL.js} +1 -1
- package/package.json +2 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# Changelog — @leadbay/mcp
|
|
2
2
|
|
|
3
|
+
## 0.6.1 — UNRELEASED
|
|
4
|
+
|
|
5
|
+
**Distribution**: listed in the official MCP Registry as `io.github.leadbay/leadbay-mcp` (auto-published from CI via GitHub OIDC); installable as a Claude Code plugin via `/plugin marketplace add leadbay/leadclaw` then `/plugin install leadbay@leadbay-leadclaw`; submission packets prepared for the Claude.ai connector directory and Anthropic's curated MCPB extension directory.
|
|
6
|
+
|
|
7
|
+
**Registry verification**: adds `mcpName` to the npm package metadata so the MCP Registry can verify ownership of `io.github.leadbay/leadbay-mcp` against the published `@leadbay/mcp` package.
|
|
8
|
+
|
|
9
|
+
## 0.6.0 — 2026-05-08
|
|
10
|
+
|
|
11
|
+
Massive spec-coverage upgrade. Each tool declares **annotations** (`readOnlyHint` / `destructiveHint` / `idempotentHint` / `openWorldHint`); 17 composites + 12 highest-leverage granulars declare typed `outputSchema` + emit `structuredContent`. New surfaces: `prompts/*` (5 canned slash-commands), `resources/*` (`lead://`, `lens://`, `org://taste-profile`), `notifications/progress` (per-lead streaming on every long-running composite), `notifications/cancelled` → `ToolContext.signal` (bulk-store entries marked `cancelled` so subsequent status polls return `BULK_CANCELLED`), `elicitation/create` (refine_prompt clarification + report_outreach user_confirmed anti-poisoning).
|
|
12
|
+
|
|
13
|
+
**Hardening**: every `inputSchema` declares `additionalProperties: false`. Runtime conformance test pins `structuredContent` against `outputSchema` for every declarer (drift-catcher). Static-scan audit of every error-hint string asserts each names a recovery action. `report_outreach.verification` rejects extra keys at runtime (closes the SDK's nested-additionalProperties limitation). `score_0_to_10` deprecated alias of `boost_score` removed in 0.7.0.
|
|
14
|
+
|
|
15
|
+
**Token economy**: pagination payloads carry `has_more` + `next_page`. `research_lead` truncates large payloads with a `truncation_hint`. Per-tool opt-in `response_format: "json" | "markdown"` lets chat-rendering agents pick the cheaper render (research_lead first; pattern reusable). `LEADBAY_DEBUG=1` enables a per-tools/call observability line on stderr.
|
|
16
|
+
|
|
17
|
+
**DXT → MCPB**: bundle now publishes both `leadbay-X.Y.Z.dxt` (legacy) and `leadbay-X.Y.Z.mcpb` (new Claude Desktop format) for one cycle. Manifest `dxt_version` field stays for backwards-compat with current installers; field rename will follow Anthropic's spec when finalised. The two filenames have identical content; downstream installers can match either glob.
|
|
18
|
+
|
|
19
|
+
**Versioning + docs**: 0.4.0 / 0.6.0 bumps; README §3a "Spec primitives in action" adds wire-level JSON-RPC transcripts for every primitive; MIGRATION.md 0.5 → 0.6 walkthrough.
|
|
20
|
+
|
|
3
21
|
## 0.5.0 — 2026-05-04
|
|
4
22
|
|
|
5
23
|
### `leadbay_import_and_qualify` — new composite
|
package/MIGRATION.md
CHANGED
|
@@ -1,3 +1,99 @@
|
|
|
1
|
+
# Migration: leadbay-mcp 0.5.x → 0.6.0 (UNRELEASED)
|
|
2
|
+
|
|
3
|
+
The "MCP best-practice" upgrade. Five behaviour additions and ONE
|
|
4
|
+
softer-than-it-looks behavior callout. All changes are MCP-spec
|
|
5
|
+
aligned (2025-11-25).
|
|
6
|
+
|
|
7
|
+
## 1. Tool annotations on every tool
|
|
8
|
+
|
|
9
|
+
Every tool now declares `annotations: { readOnlyHint, destructiveHint,
|
|
10
|
+
idempotentHint, openWorldHint, title }` in the `tools/list` payload.
|
|
11
|
+
Capable clients (Claude Desktop, Cursor) use these hints to decide
|
|
12
|
+
whether to auto-approve a call or prompt for confirmation. No agent-
|
|
13
|
+
side change required.
|
|
14
|
+
|
|
15
|
+
## 2. `additionalProperties: false` on every tool's inputSchema
|
|
16
|
+
|
|
17
|
+
**Behavior callout**: any client that was passing extra unrecognized
|
|
18
|
+
fields will now get a schema rejection. This was a deliberate
|
|
19
|
+
hardening — extra fields were never documented, and the rejection
|
|
20
|
+
closes a prompt-injection surface (the eval doc explicitly endorsed
|
|
21
|
+
this). To migrate: drop the unknown field. The error message names
|
|
22
|
+
the rejected field.
|
|
23
|
+
|
|
24
|
+
If you discover an unknown field in your call shape, double-check the
|
|
25
|
+
relevant tool's documented `inputSchema`; if you believe a field
|
|
26
|
+
should exist, file an issue.
|
|
27
|
+
|
|
28
|
+
## 3. `outputSchema` + `structuredContent` on top-5 composites
|
|
29
|
+
|
|
30
|
+
`leadbay_pull_leads`, `leadbay_research_lead`, `leadbay_account_status`,
|
|
31
|
+
`leadbay_bulk_qualify_leads`, `leadbay_report_outreach` now declare
|
|
32
|
+
`outputSchema` AND emit `structuredContent` on success alongside the
|
|
33
|
+
existing text content. Clients that read structuredContent get the
|
|
34
|
+
typed payload without re-parsing through the LLM. Backwards-compat:
|
|
35
|
+
text content is unchanged.
|
|
36
|
+
|
|
37
|
+
## 4. `boost_score` on `research_lead.qualification[]`
|
|
38
|
+
|
|
39
|
+
The qualification entry was previously labelled `score_0_to_10`. The
|
|
40
|
+
actual scale is the discrete `-10|0|10|20` boost (per
|
|
41
|
+
`AiAgentResponse.score`), NOT a 0-10 average. 0.6.0 introduces:
|
|
42
|
+
|
|
43
|
+
```json
|
|
44
|
+
{
|
|
45
|
+
"question": "...",
|
|
46
|
+
"boost_score": 10,
|
|
47
|
+
"score_scale": "-10|0|10|20",
|
|
48
|
+
"score_0_to_10": 10, // DEPRECATED — same value as boost_score
|
|
49
|
+
"response": "...",
|
|
50
|
+
"computed_at": "..."
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
`score_0_to_10` is kept as a deprecated alias for one minor version
|
|
55
|
+
and removed in 0.7.0. Switch to `boost_score` now.
|
|
56
|
+
|
|
57
|
+
## 5. New spec primitives
|
|
58
|
+
|
|
59
|
+
The server now advertises and serves:
|
|
60
|
+
|
|
61
|
+
- **`prompts/*`** — 5 canned slash-commands (`leadbay_daily_check_in`,
|
|
62
|
+
`leadbay_research_a_domain`, `leadbay_refine_audience`,
|
|
63
|
+
`leadbay_log_outreach`, `leadbay_qualify_top_n`). Use these from
|
|
64
|
+
the client UI; agents that read prompts compose workflows
|
|
65
|
+
automatically.
|
|
66
|
+
- **`resources/*`** — three URI schemes addressable by client:
|
|
67
|
+
`lead://{uuid}/profile`, `lens://{id}/definition`,
|
|
68
|
+
`org://taste-profile`. Cache-friendly for capable clients.
|
|
69
|
+
- **`notifications/progress`** — long-running composites (today:
|
|
70
|
+
`leadbay_bulk_qualify_leads`) stream per-lead progress updates
|
|
71
|
+
when the client opts in via `_meta.progressToken`.
|
|
72
|
+
- **`notifications/cancelled`** → `ToolContext.signal` — clients
|
|
73
|
+
that send cancellation now actually stop in-flight work in
|
|
74
|
+
composites that observe `ctx.signal` (`leadbay_import_and_qualify`,
|
|
75
|
+
`leadbay_import_leads`, etc.).
|
|
76
|
+
|
|
77
|
+
Clients without these capabilities negotiate away — backwards-compat
|
|
78
|
+
is preserved.
|
|
79
|
+
|
|
80
|
+
## 6. Pagination metadata: `has_more` + `next_page`
|
|
81
|
+
|
|
82
|
+
`leadbay_pull_leads` and `leadbay_discover_leads` payloads now
|
|
83
|
+
include `has_more: boolean` and `next_page: number | null` next to
|
|
84
|
+
the existing `pagination` object. Spec-aligned; agents no longer
|
|
85
|
+
need to compute `page < pages - 1`.
|
|
86
|
+
|
|
87
|
+
## 7. Truncation steering on `research_lead`
|
|
88
|
+
|
|
89
|
+
When the response would exceed ~25k characters, the composite now
|
|
90
|
+
emits `truncated: true` plus `truncation_hint: "Pass concise:true to
|
|
91
|
+
filter to hot signals only."`. Load-bearing fields (qualification,
|
|
92
|
+
firmographics, contacts) are never trimmed; only signals.entries get
|
|
93
|
+
trimmed first.
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
1
97
|
# Migration: leadbay-mcp 0.2.x → 0.3.0
|
|
2
98
|
|
|
3
99
|
This release fixes [product#3504](https://github.com/leadbay/product/issues/3504): the default-installed MCP server's system prompt told the agent to call tools that the server didn't actually expose. Three behavior changes you need to know about.
|
package/README.md
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# @leadbay/mcp — Leadbay MCP server
|
|
2
2
|
|
|
3
|
+
[](https://registry.modelcontextprotocol.io/v0/servers/io.github.leadbay/leadbay-mcp)
|
|
4
|
+
|
|
3
5
|
<!--
|
|
4
6
|
LLM HINT — if you're an AI agent reading this README to install the server:
|
|
5
7
|
- Use ONLY the commands shown verbatim in §1. Do not invent variants.
|
|
@@ -15,12 +17,14 @@ LLM HINT — if you're an AI agent reading this README to install the server:
|
|
|
15
17
|
|
|
16
18
|
A Model Context Protocol server that lets Claude Desktop, Cursor, Claude Code, and any other MCP-compatible agent find, research, and prepare outreach on B2B prospects using your Leadbay account.
|
|
17
19
|
|
|
20
|
+
> **0.6.x — what's new**: a comprehensive MCP-spec coverage upgrade. Every tool now declares **annotations** (`readOnlyHint`/`destructiveHint`/`idempotentHint`/`openWorldHint`) so capable clients pick the right confirmation UX. The 5 highest-traffic composites ship **`outputSchema` + `structuredContent`** for typed agent consumption. New surfaces: **`prompts/*`** (5 canned slash-commands), **`resources/*`** (`lead://`, `lens://`, `org://taste-profile`), **`notifications/progress`** (per-lead streaming during `bulk_qualify_leads`), **`notifications/cancelled` → `ToolContext.signal`** (client cancels actually stop polling), **`elicitation/create`** (server can ask the user directly). Schema strictness: every `inputSchema` now declares `additionalProperties: false`. `research_lead.qualification[]` ships `boost_score` (canonical) + `score_scale: "-10|0|10|20"` + a deprecated `score_0_to_10` alias. Pagination payloads include `has_more` + `next_page`. `research_lead` includes a `truncated` + `truncation_hint` budget guard. **Behavior callout**: extra unknown fields in tool inputs are now rejected. See [MIGRATION.md](./MIGRATION.md).
|
|
21
|
+
|
|
18
22
|
> **0.3.0 behavior change** — composite write tools (`refine_prompt`, `report_outreach`, `adjust_audience`, `bulk_qualify_leads`, `enrich_titles`, `answer_clarification`, `import_leads`) are **ON by default**. Set `LEADBAY_MCP_WRITE=0` (or `--no-write` on `install`) to restore the previous read-only behavior. `leadbay-mcp install` now also registers Claude Code at `--scope user` so Leadbay is visible from any project. See [MIGRATION.md](./MIGRATION.md).
|
|
19
23
|
|
|
20
24
|
## 1. Install (one command)
|
|
21
25
|
|
|
22
26
|
```bash
|
|
23
|
-
npx -y @leadbay/mcp@0.
|
|
27
|
+
npx -y @leadbay/mcp@0.6 install --email you@yourcompany.com --region us
|
|
24
28
|
# (you'll be prompted for your password — it's not echoed)
|
|
25
29
|
```
|
|
26
30
|
|
|
@@ -39,6 +43,15 @@ The token is **session-scoped** (full account access, password-equivalent). Trea
|
|
|
39
43
|
|
|
40
44
|
**Don't have a Leadbay account?** [Register here](https://wow.leadbay.ai/?register=true).
|
|
41
45
|
|
|
46
|
+
### Install via the Claude Code plugin marketplace
|
|
47
|
+
|
|
48
|
+
```text
|
|
49
|
+
/plugin marketplace add leadbay/leadclaw
|
|
50
|
+
/plugin install leadbay@leadbay-leadclaw
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Claude Code prompts for your token and region through the plugin's `userConfig`. This is equivalent to the npm/CLI install above; users who already ran `leadbay-mcp login` can reuse that token.
|
|
54
|
+
|
|
42
55
|
### Claude Desktop 2026 (DXT)
|
|
43
56
|
|
|
44
57
|
Claude Desktop 2026 ships the DXT (Desktop Extension) system — the legacy `claude_desktop_config.json` is UI-prefs-only there and gets overwritten by the app. If you're on 2026, **install the `.dxt` bundle** from [Releases](https://github.com/leadbay/leadclaw/releases/latest) (drag-drop into Settings → Extensions). `leadbay-mcp install` detects this and skips the legacy write automatically.
|
|
@@ -47,14 +60,14 @@ Claude Desktop 2026 ships the DXT (Desktop Extension) system — the legacy `cla
|
|
|
47
60
|
|
|
48
61
|
If you installed Node from the official [nodejs.org](https://nodejs.org) `.pkg`, `/usr/local/lib/node_modules` is root-owned. Any of these works:
|
|
49
62
|
|
|
50
|
-
- **Use `npx` (recommended, no global install):** all examples above use `npx -y @leadbay/mcp@0.
|
|
63
|
+
- **Use `npx` (recommended, no global install):** all examples above use `npx -y @leadbay/mcp@0.6 ...` — no global install needed.
|
|
51
64
|
- **`sudo npm install -g @leadbay/mcp`** (enter your macOS password).
|
|
52
65
|
- **Use a Node version manager** — [nvm](https://github.com/nvm-sh/nvm), [volta](https://volta.sh), [fnm](https://github.com/Schniz/fnm). They install Node under your home directory, so `npm install -g` works without sudo.
|
|
53
66
|
|
|
54
67
|
### If you'd rather mint a token without auto-install
|
|
55
68
|
|
|
56
69
|
```bash
|
|
57
|
-
npx -y @leadbay/mcp@0.
|
|
70
|
+
npx -y @leadbay/mcp@0.6 login \
|
|
58
71
|
--email you@yourcompany.com \
|
|
59
72
|
--region us
|
|
60
73
|
```
|
|
@@ -72,7 +85,7 @@ Edit `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) o
|
|
|
72
85
|
"mcpServers": {
|
|
73
86
|
"leadbay": {
|
|
74
87
|
"command": "npx",
|
|
75
|
-
"args": ["-y", "@leadbay/mcp@0.
|
|
88
|
+
"args": ["-y", "@leadbay/mcp@0.6"],
|
|
76
89
|
"env": {
|
|
77
90
|
"LEADBAY_TOKEN": "<paste-token-from-step-1>",
|
|
78
91
|
"LEADBAY_REGION": "us"
|
|
@@ -93,7 +106,7 @@ In Cursor settings, add the MCP server:
|
|
|
93
106
|
"mcp.servers": {
|
|
94
107
|
"leadbay": {
|
|
95
108
|
"command": "npx",
|
|
96
|
-
"args": ["-y", "@leadbay/mcp@0.
|
|
109
|
+
"args": ["-y", "@leadbay/mcp@0.6"],
|
|
97
110
|
"env": { "LEADBAY_TOKEN": "<paste-token>", "LEADBAY_REGION": "us" }
|
|
98
111
|
}
|
|
99
112
|
}
|
|
@@ -106,7 +119,7 @@ In Cursor settings, add the MCP server:
|
|
|
106
119
|
claude mcp add leadbay --scope user \
|
|
107
120
|
--env LEADBAY_TOKEN=<paste-token> \
|
|
108
121
|
--env LEADBAY_REGION=us \
|
|
109
|
-
-- npx -y @leadbay/mcp@0.
|
|
122
|
+
-- npx -y @leadbay/mcp@0.6
|
|
110
123
|
```
|
|
111
124
|
|
|
112
125
|
> **`--scope user`** registers Leadbay globally for your account (visible from any project). Without it, `claude mcp add` defaults to project-local scope and the server only appears in conversations opened from the directory where you ran the command.
|
|
@@ -118,7 +131,7 @@ claude mcp add leadbay --scope user \
|
|
|
118
131
|
Before starting Claude, run:
|
|
119
132
|
|
|
120
133
|
```bash
|
|
121
|
-
LEADBAY_TOKEN=<paste-token> npx -y @leadbay/mcp@0.
|
|
134
|
+
LEADBAY_TOKEN=<paste-token> npx -y @leadbay/mcp@0.6 doctor
|
|
122
135
|
```
|
|
123
136
|
|
|
124
137
|
Expected output:
|
|
@@ -138,6 +151,202 @@ Leadbay connection OK.
|
|
|
138
151
|
|
|
139
152
|
> *Prepare an outreach package for Acme Corp — include the recommended contact with enriched email if we have credits.*
|
|
140
153
|
|
|
154
|
+
## 3a. Spec primitives in action
|
|
155
|
+
|
|
156
|
+
> If you're building or auditing an MCP integration, this section shows what each spec primitive looks like on the wire when calling `@leadbay/mcp`. Every example is the actual JSON-RPC frame your client sends or receives — copy verbatim into a debugger.
|
|
157
|
+
|
|
158
|
+
### `tools/list` — annotations + outputSchema
|
|
159
|
+
|
|
160
|
+
Every tool advertises read/write/idempotent/openWorld posture and (for the top declarers) a typed return schema.
|
|
161
|
+
|
|
162
|
+
Request:
|
|
163
|
+
|
|
164
|
+
```json
|
|
165
|
+
{ "jsonrpc": "2.0", "id": 1, "method": "tools/list" }
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
Response (excerpt):
|
|
169
|
+
|
|
170
|
+
```json
|
|
171
|
+
{
|
|
172
|
+
"tools": [
|
|
173
|
+
{
|
|
174
|
+
"name": "leadbay_account_status",
|
|
175
|
+
"description": "Show the user's account state — admin rights, language, last-active lens, current quota …",
|
|
176
|
+
"inputSchema": { "type": "object", "properties": {}, "additionalProperties": false },
|
|
177
|
+
"annotations": {
|
|
178
|
+
"title": "Show Leadbay account + quota state",
|
|
179
|
+
"readOnlyHint": true, "destructiveHint": false,
|
|
180
|
+
"idempotentHint": true, "openWorldHint": true
|
|
181
|
+
},
|
|
182
|
+
"outputSchema": {
|
|
183
|
+
"type": "object",
|
|
184
|
+
"properties": {
|
|
185
|
+
"user": { "type": "object", "properties": { "email": {}, "name": {}, "admin": {}, "manager": {}, "language": {} } },
|
|
186
|
+
"organization": { "type": "object", "properties": { "id": {}, "name": {}, "ai_agent_enabled": {}, "computing_intelligence": {}, "plan": {} } },
|
|
187
|
+
"last_requested_lens": {},
|
|
188
|
+
"quota": {},
|
|
189
|
+
"_meta": { "type": "object", "properties": { "region": {} } }
|
|
190
|
+
},
|
|
191
|
+
"required": ["user", "organization"]
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
]
|
|
195
|
+
}
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
Capable clients use the annotations to decide auto-approve vs prompt; the `outputSchema` lets them dispatch on shape rather than re-parse the text.
|
|
199
|
+
|
|
200
|
+
### `tools/call` with `structuredContent`
|
|
201
|
+
|
|
202
|
+
When the tool declares `outputSchema`, the response carries a typed `structuredContent` block alongside `text` content:
|
|
203
|
+
|
|
204
|
+
Request:
|
|
205
|
+
|
|
206
|
+
```json
|
|
207
|
+
{ "jsonrpc": "2.0", "id": 2, "method": "tools/call",
|
|
208
|
+
"params": { "name": "leadbay_account_status", "arguments": {} } }
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
Response:
|
|
212
|
+
|
|
213
|
+
```json
|
|
214
|
+
{
|
|
215
|
+
"content": [
|
|
216
|
+
{ "type": "text", "text": "{\"user\":{...},\"organization\":{...}, ...}" }
|
|
217
|
+
],
|
|
218
|
+
"structuredContent": {
|
|
219
|
+
"user": { "email": "you@example.com", "name": "You", "admin": true, "manager": false, "language": "en" },
|
|
220
|
+
"organization": { "id": "org-1", "name": "Your Co", "ai_agent_enabled": true, "computing_intelligence": false, "plan": "PRO" },
|
|
221
|
+
"last_requested_lens": 42,
|
|
222
|
+
"quota": { "plan": "PRO", "windows": [...] },
|
|
223
|
+
"_meta": { "region": "us" }
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
### `prompts/list` and `prompts/get` — slash commands
|
|
229
|
+
|
|
230
|
+
Request:
|
|
231
|
+
|
|
232
|
+
```json
|
|
233
|
+
{ "jsonrpc": "2.0", "id": 3, "method": "prompts/list" }
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
Response (excerpt):
|
|
237
|
+
|
|
238
|
+
```json
|
|
239
|
+
{
|
|
240
|
+
"prompts": [
|
|
241
|
+
{ "name": "daily-check-in", "description": "Pull fresh leads, surface auto-qualified top, deepen 1-3 promising ones.", "arguments": [] },
|
|
242
|
+
{ "name": "research-a-domain", "description": "Import a domain → resolve to leadId → research_lead.",
|
|
243
|
+
"arguments": [{ "name": "domain", "description": "Company domain (e.g., acme.com)", "required": true }] },
|
|
244
|
+
{ "name": "log-outreach", "description": "Gather verification → report_outreach.",
|
|
245
|
+
"arguments": [{ "name": "lead_id", "required": true }, { "name": "what", "required": true }] }
|
|
246
|
+
]
|
|
247
|
+
}
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
Then `prompts/get` materialises the chosen workflow as a structured `messages` array the agent unfurls:
|
|
251
|
+
|
|
252
|
+
```json
|
|
253
|
+
{ "jsonrpc": "2.0", "id": 4, "method": "prompts/get",
|
|
254
|
+
"params": { "name": "research-a-domain", "arguments": { "domain": "acme.com" } } }
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
### `resources/list` and `resources/read` — URI-addressable read-only data
|
|
258
|
+
|
|
259
|
+
Three URI schemes are advertised: `lead://{uuid}/profile`, `lens://{id}/definition`, `org://taste-profile`. Capable clients cache them across turns.
|
|
260
|
+
|
|
261
|
+
Request:
|
|
262
|
+
|
|
263
|
+
```json
|
|
264
|
+
{ "jsonrpc": "2.0", "id": 5, "method": "resources/templates/list" }
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
Response (excerpt):
|
|
268
|
+
|
|
269
|
+
```json
|
|
270
|
+
{
|
|
271
|
+
"resourceTemplates": [
|
|
272
|
+
{ "uriTemplate": "lead://{uuid}/profile", "name": "Lead profile", "description": "Lead profile by Leadbay UUID — basics + qualifications + contacts.", "mimeType": "application/json" },
|
|
273
|
+
{ "uriTemplate": "lens://{id}/definition", "name": "Lens definition", "description": "Filter + scoring config for a lens.", "mimeType": "application/json" }
|
|
274
|
+
]
|
|
275
|
+
}
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
Read a specific lead:
|
|
279
|
+
|
|
280
|
+
```json
|
|
281
|
+
{ "jsonrpc": "2.0", "id": 6, "method": "resources/read",
|
|
282
|
+
"params": { "uri": "lead://0xabcd-…/profile" } }
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
Response wraps the JSON in a `text` content block with the URI's mime type so clients can render or cache it.
|
|
286
|
+
|
|
287
|
+
### `notifications/progress` — streaming during long ops
|
|
288
|
+
|
|
289
|
+
When the agent calls a long-running tool with a `progressToken` in `_meta`, the server streams progress notifications back. Long-runners that emit: `bulk_qualify_leads`, `import_and_qualify`, `enrich_titles`, `bulk_enrich_status`, `qualify_status`.
|
|
290
|
+
|
|
291
|
+
Request:
|
|
292
|
+
|
|
293
|
+
```json
|
|
294
|
+
{ "jsonrpc": "2.0", "id": 7, "method": "tools/call",
|
|
295
|
+
"params": {
|
|
296
|
+
"name": "leadbay_bulk_qualify_leads",
|
|
297
|
+
"arguments": { "leadIds": ["lead-1", "lead-2", "lead-3"] },
|
|
298
|
+
"_meta": { "progressToken": "bq-1" }
|
|
299
|
+
} }
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
While the call runs, notifications arrive:
|
|
303
|
+
|
|
304
|
+
```json
|
|
305
|
+
{ "jsonrpc": "2.0", "method": "notifications/progress",
|
|
306
|
+
"params": { "progressToken": "bq-1", "progress": 1, "total": 3, "message": "Qualified Acme Corp (1/3)" } }
|
|
307
|
+
{ "jsonrpc": "2.0", "method": "notifications/progress",
|
|
308
|
+
"params": { "progressToken": "bq-1", "progress": 2, "total": 3, "message": "Qualified Globex (2/3)" } }
|
|
309
|
+
{ "jsonrpc": "2.0", "method": "notifications/progress",
|
|
310
|
+
"params": { "progressToken": "bq-1", "progress": 3, "total": 3, "message": "Qualified Initech (3/3)" } }
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
Then the final `tools/call` response.
|
|
314
|
+
|
|
315
|
+
### `notifications/cancelled` — actually cancelling
|
|
316
|
+
|
|
317
|
+
Send the cancellation by id; the server's `ToolContext.signal` aborts the polling loop within ≤2 seconds, the bulk-store entry is marked `cancelled`, and the next `bulk_enrich_status` returns `BULK_CANCELLED` so the agent stops polling.
|
|
318
|
+
|
|
319
|
+
```json
|
|
320
|
+
{ "jsonrpc": "2.0", "method": "notifications/cancelled",
|
|
321
|
+
"params": { "requestId": 7, "reason": "user clicked cancel" } }
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
### `elicitation/create` — server asks the user
|
|
325
|
+
|
|
326
|
+
Used by `refine_prompt` (clarification flow) and `report_outreach` (anti-poisoning user-confirmation). The server sends an `elicitation/create` request to the client; the client renders a form; the user types; the response feeds back into the tool call. The agent never sees the prompt.
|
|
327
|
+
|
|
328
|
+
Server emits (mid-`tools/call`):
|
|
329
|
+
|
|
330
|
+
```json
|
|
331
|
+
{ "jsonrpc": "2.0", "id": 99, "method": "elicitation/create",
|
|
332
|
+
"params": {
|
|
333
|
+
"message": "An AI agent wants to log outreach on lead-1: 'Called Acme'. The agent claims you confirmed this. Type your literal confirmation to proceed; cancel to reject.",
|
|
334
|
+
"requestedSchema": {
|
|
335
|
+
"type": "object",
|
|
336
|
+
"properties": { "confirmation": { "type": "string", "title": "Your confirmation" } },
|
|
337
|
+
"required": ["confirmation"]
|
|
338
|
+
}
|
|
339
|
+
} }
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
Client returns:
|
|
343
|
+
|
|
344
|
+
```json
|
|
345
|
+
{ "jsonrpc": "2.0", "id": 99, "result": { "action": "accept", "content": { "confirmation": "yes I called Acme today" } } }
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
The user's literal text replaces `verification.ref` in the outreach record, and the response carries `confirmed_via: "elicit"` for the SDR audit trail.
|
|
349
|
+
|
|
141
350
|
## 4. Troubleshooting
|
|
142
351
|
|
|
143
352
|
| Problem | Cause | Fix |
|
|
@@ -148,14 +357,14 @@ Leadbay connection OK.
|
|
|
148
357
|
| `No enrichment credits remaining` | Out of quota | Contact Leadbay support to extend quota |
|
|
149
358
|
| Claude Desktop "loading forever" on first use | `npx` cold-start fetching the package | First run takes ~10s. Prefer `npm install -g @leadbay/mcp` for faster startup. |
|
|
150
359
|
| Claude Desktop doesn't show Leadbay tools | Server crashed at startup | Check `~/Library/Logs/Claude/mcp*.log` (macOS) or `%APPDATA%\Claude\logs\mcp*.log` (Windows). |
|
|
151
|
-
| Claude Code can't find Leadbay in a new conversation | MCP server installed at project scope (default before 0.3.0) | Re-run with `--scope user`: `claude mcp remove leadbay && claude mcp add leadbay --scope user --env LEADBAY_TOKEN=… --env LEADBAY_REGION=us -- npx -y @leadbay/mcp@0.
|
|
360
|
+
| Claude Code can't find Leadbay in a new conversation | MCP server installed at project scope (default before 0.3.0) | Re-run with `--scope user`: `claude mcp remove leadbay && claude mcp add leadbay --scope user --env LEADBAY_TOKEN=… --env LEADBAY_REGION=us -- npx -y @leadbay/mcp@0.6` |
|
|
152
361
|
| Agent reports "tool not found" for `refine_prompt` / `adjust_audience` etc. | Pre-0.3.0 install with `LEADBAY_MCP_WRITE` unset (writes were off) | Either re-run `npx @leadbay/mcp install` or remove `LEADBAY_MCP_WRITE=0` from your client config (writes are on by default in 0.3.0+) |
|
|
153
362
|
|
|
154
363
|
## 5. Upgrade & rotation
|
|
155
364
|
|
|
156
|
-
**Upgrade**: change the pinned minor in your config, e.g. `"@leadbay/mcp@0.2"` → `"@leadbay/mcp@0.
|
|
365
|
+
**Upgrade**: change the pinned minor in your config, e.g. `"@leadbay/mcp@0.2"` → `"@leadbay/mcp@0.6"`, then restart the client. **0.3.0 enables composite write tools by default** — see [MIGRATION.md](./MIGRATION.md). See also the [changelog](https://github.com/leadbay/leadclaw/releases).
|
|
157
366
|
|
|
158
|
-
**Rotate token**: re-run `npx -y @leadbay/mcp@0.
|
|
367
|
+
**Rotate token**: re-run `npx -y @leadbay/mcp@0.6 install --email you@yourcompany.com --region us` (or `login`) — the new session token replaces the old one in your MCP client config, and logging in again invalidates the prior session on most session backends.
|
|
159
368
|
|
|
160
369
|
## 6. Advanced
|
|
161
370
|
|