Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,20 @@
# Changelog

## 0.34.0 — 2026-09-02 — Leadbay on ChatGPT gets its own address

- **On ChatGPT, add Leadbay as `https://mcp.leadbay.app/chatgpt/mcp`.** Same
Leadbay, same sign-in, same leads, same everything — except the assistant
cannot generate a top-up link or open your billing page there, and will not
suggest buying credits at all. ChatGPT's rules for apps do not allow an app
to sell credits or plans, or to push you toward an upgrade. When you run out
of quota it tells you which window is empty and when it refills. Buy credits
in your Leadbay account as usual; tell the assistant you did, and it picks
straight back up where it stopped.
- **Nothing changes on Claude.** `https://mcp.leadbay.app/mcp` keeps the
30-second top-up and the billing link exactly as before.
- **If ChatGPT was already set up for you**, our installer now points it at the
new address on its own.
Comment on lines +15 to +16

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Correct the automatic ChatGPT migration claim

For an existing ChatGPT connector, the installer does not update its configured URL: both installer implementations handle chatgpt-desktop by returning an ok result whose message explicitly says “manual setup required,” without writing any configuration. The existing connector therefore remains on /mcp and continues receiving the commerce-enabled catalog until the user manually replaces it, contrary to this release note; document the required manual migration or implement an actual update path.

Useful? React with 👍 / 👎.


## 0.33.4 — 2026-09-02 — Enrich the one person you named

- **You can now ask for one specific person's email or phone.** "Get me the
Expand Down
24 changes: 24 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -250,6 +250,30 @@ Common shared blocks live in `packages/promptforge/snippets/`:
| `headers/*.md` | The tiny shared header fragments promptforge stitches in |
| `server-instructions/*.md` | Server-instruction blocks — emitted as consts by `emitServerInstructions`, NOT resolved via `{{include:}}` |

### `{{commerce}}` — prose that only exists where selling is allowed

The OpenAI app directory forbids promoting a purchase; Anthropic's does not. A
handful of paragraphs therefore ship to Claude and not to ChatGPT. Wrap them:

```markdown
{{commerce}}
**Top-ups always beat waiting.** …
{{/commerce}}
```

Promptforge emits the tool's normal const plus an entry in
`NO_COMMERCE_TOOL_DESCRIPTIONS` with the block deleted;
`buildServer({ includeCommerce: false })` serves the second one. Rules:

- **The marker DELETES; it never substitutes.** Never write a softened
"ChatGPT version" of a paragraph. If a sentence cannot be removed without
rewording the prose around it, gate the whole paragraph instead.
- Markers go on their own lines for a block. For an inline span, put the
leading space *inside* the markers — `resets{{commerce}} (or top
up){{/commerce}}.` — so deleting it leaves `resets.`, not a double space.
- `packages/mcp/test/unit/commerce-gate.test.ts` asserts the gated strings are
character-level subsequences of the default ones, so any rewording fails.

Include them via `{{include:rendering/score-bar}}` etc. Don't duplicate
content across templates — extract a snippet if you find yourself
copy-pasting.
Expand Down
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ If you use Claude on the web, Claude Desktop, or ChatGPT, the fastest path is a

- **Name:** `Leadbay`
- **URL:** `https://mcp.leadbay.app/mcp` — one URL for every region (`/fr/mcp` remains a compatibility alias)
- **On ChatGPT, use `https://mcp.leadbay.app/chatgpt/mcp` instead.** Same server, same sign-in, same leads — but the assistant cannot generate a top-up link or open your billing page there, because the OpenAI app directory does not allow an app to sell credits. Buy credits or change your plan in your Leadbay account instead.

In Claude: **Settings → Connectors → + → Add custom connector**, paste the URL, then open the connector and **Connect**. Sign in with Leadbay, click **Approve**, and you're linked. The server handles OAuth in-app; updates are automatic — you never touch a config file.

Expand Down Expand Up @@ -126,7 +127,8 @@ Every supported way to connect Leadbay MCP:

| Method | Command / action | Platforms | Notes |
|--------|------------------|-----------|-------|
| **Hosted connector (no install)** | Add custom connector → `https://mcp.leadbay.app/mcp` (all regions) | Claude web / Desktop, ChatGPT | Browser OAuth in-app. Nothing to install; auto-updates. |
| **Hosted connector (no install)** | Add custom connector → `https://mcp.leadbay.app/mcp` (all regions) | Claude web / Desktop | Browser OAuth in-app. Nothing to install; auto-updates. |
| **Hosted connector — ChatGPT** | Add custom connector → `https://mcp.leadbay.app/chatgpt/mcp` | ChatGPT | Same server; the top-up and billing tools are not registered (OpenAI directory rule). |
| **`.dxt` / `.mcpb` bundle** | Download from [Releases](https://github.com/leadbay/mcp/releases/latest), double-click → **Install** | Claude Desktop | One-click desktop extension. |
| **Guided installer (GUI)** | `npx -y -p @leadbay/mcp@latest installer` | macOS, Windows, Linux | Browser wizard: sign in with Leadbay, pick clients. Works for everyone. |
| **Local dev build** | `pnpm --filter @leadbay/mcp installer -- --local` | macOS, Windows, Linux | Registers clients against your local build. OAuth automatic. Build from source first (above). |
Expand Down
22 changes: 20 additions & 2 deletions packages/core/src/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -538,6 +538,16 @@ export class LeadbayClient {
}
}

/**
* Whether this client may compose text that promotes a purchase. Default
* true. The MCP server sets it false for a host whose directory forbids
* promoting upgrades (see BuildServerOptions.includeCommerce); the only
* effect is that the QUOTA_EXCEEDED hint drops its two selling sentences.
* Set per client, and the hosted server builds one client per session, so
* this never leaks across tenants.
*/
commerce = true;

get baseUrl(): string {
return this._baseUrl;
}
Expand Down Expand Up @@ -1008,8 +1018,16 @@ export class LeadbayClient {
// agent can generate the URL itself instead of asking the user to
// navigate to a website. Once the user has topped up, the previous
// 429 is stale — retry the failed call.
`${hintBase}, OR top up AI credits — top-ups clear the throttle immediately. ` +
`Offer the user to generate a Stripe checkout URL via leadbay_create_topup_link, OR direct them to app.leadbay.ai → Billing. ` +
//
// The two selling sentences are dropped when `commerce` is off — this
// hint is text the agent reads out, and a host may forbid promoting a
// purchase. Nothing is reworded; the rest of the hint is unchanged, and
// "the user topped up (elsewhere), so retry" survives either way.
`${hintBase}` +
(this.commerce
? `, OR top up AI credits — top-ups clear the throttle immediately. ` +
`Offer the user to generate a Stripe checkout URL via leadbay_create_topup_link, OR direct them to app.leadbay.ai → Billing. `
: `. `) +
`Check leadbay_account_status / leadbay_get_quota to see which resource window (daily/weekly/monthly) was hit. ` +
`Once the user has topped up, the previous QUOTA_EXCEEDED is stale — re-call leadbay_account_status to refresh, then RETRY the original operation.`,
endpoint,
Expand Down
5 changes: 5 additions & 0 deletions packages/core/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -443,3 +443,8 @@ export const compositeTools: Tool[] = [
];

export const tools: Tool[] = [...compositeTools, ...granularTools];

// Descriptions with the {{commerce}} blocks deleted, emitted by promptforge for
// the templates that carry the marker. The MCP server swaps these in on a
// surface that may not promote a purchase; nothing is reworded.
export { NO_COMMERCE_TOOL_DESCRIPTIONS } from "./tool-descriptions.generated.js";
Loading
Loading