Run a waitlist from Claude Desktop
Run a pre-launch waitlist without opening a dashboard. The agent can report how signups are going, send the next batch of invites, pause intake, and produce the HTML to embed the form while it is editing your landing page.
Claude Desktop's config file starts local processes, so a remote server with a header is reached through the mcp-remote bridge. Node.js 18 or later must be installed.
Setup
You need a secret key (nv_live_…) from Dashboard → API keys.
01Add the bridge to the config file
claude_desktop_config.json (Settings → Developer → Edit Config)
{
"mcpServers": {
"nordva": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://mcp.nordva.dev",
"--header",
"Authorization:${NORDVA_AUTH}"
],
"env": {
"NORDVA_AUTH": "Bearer nv_live_..."
}
}
}
}The header value is passed through an environment variable because some platforms split arguments that contain a space. On macOS the file is in ~/Library/Application Support/Claude/, on Windows in %APPDATA%\Claude\.
02Check the connection
Quit and reopen Claude Desktop. The nordva tools should appear in the tools menu of a new chat. Ask it to run setup_check.
Then ask Claude Desktop
- How is the waitlist doing? Who are the top referrers?
- Give me the embed snippet for the waitlist and put it in the hero section.
- Invite the next 50 people on the waitlist.
- Pause signups and change the headline to "We're full for now".
- Export the waitlist as CSV.
For “Invite the next 50 people on the waitlist.” Claude Desktop calls invite_from_waitlist with:
{
"count": 50
} Returned: The number of people invited and a sample of their addresses. Each one is sent an invite email and marked invited; people who were already invited are skipped.
Waitlist tools and arguments
add_to_waitlist
Add an email to a waitlist
| required | string | Subscriber's email address. | |
| referrer_code | optional | string | Optional 8-character referral code from another signup. Invalid codes are ignored. |
| metadata | optional | object | Optional key-value metadata, e.g. { source: 'producthunt' }. ≤1KB serialized. |
import_waitlist
Import an existing list into the waitlist
| rows | required | array | People to import, at most 1000 per call. |
| consent_confirmed | required | literal | true only after the developer confirmed these people consented. |
get_waitlist_stats
Read-onlyGet waitlist stats and top referrers (admin view)
No arguments.
get_waitlist_leaderboard
Read-onlyIndie and BuilderGet the public-safe waitlist leaderboard
| limit | optional | number, 0–50 | How many entries to return. 1–50. Default 10. |
invite_from_waitlist
Confirms firstIndie and BuilderInvite people from the waitlist
| count | optional | number, 0–500 | Next-in-queue count. Cap 500. Cannot be combined with specific_email. |
| specific_email | optional | string | Specific email to invite. Cannot be combined with count. |
export_waitlist
Read-onlyIndie and BuilderExport waitlist to CSV or JSON
| format | optional | "csv" | "json" | Output format. Default csv. |
| include_flagged | optional | boolean | Include anti-abuse-flagged rows. Default false. |
get_waitlist_settings
Read-onlyGet current waitlist pause state and custom copy
No arguments.
update_waitlist_settings
Pause/resume waitlist or set custom landing-page copy
| accepting_signups | optional | boolean | true to allow new signups, false to freeze intake. Hides the public form when false. |
| header_text | optional | string, max 120 | Custom headline (up to 120 chars). null clears and reverts to the default. |
| body_text | optional | string, max 500 | Custom supporting paragraph (up to 500 chars). null clears and reverts to the default. |
| welcome_url | optional | string, max 2,048 | Absolute http(s) URL invited signups are sent to (invite email CTA + hosted welcome page). null clears. |
get_waitlist_embed_snippet
Read-onlyGet HTML snippet to embed the waitlist on the developer's site
| slug | required | string, max 64 | The project slug, e.g. 'demo' or 'my-product'. |
| height | optional | number, 200–2,000 | Initial iframe height in px before auto-resize. Default 480. |
| title | optional | string, max 120 | Accessible name for the iframe. Default 'Join the waitlist'. |
Behaviour worth knowing
- invite_from_waitlist sends real email. The server marks it destructive and its description tells the agent to confirm the count with you before calling.
- get_waitlist_stats returns full email addresses of the top ten referrers; get_waitlist_leaderboard returns the top fifty with masked addresses.
- export_waitlist returns a signed download URL that is valid for 15 minutes and covers up to 10,000 rows. Flagged and unsubscribed rows are left out unless asked for.
- add_to_waitlist on an address that is already signed up returns the existing signup with already_registered set, not an error. Disposable email domains are refused.
- get_waitlist_embed_snippet builds the iframe HTML locally and makes no API call.
- The Connectors screen in Claude Desktop and claude.ai expects OAuth. The Nordva Launch server authenticates with an API key header instead, which is why the bridge is needed there.