Skip to main content

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

emailrequiredstringSubscriber's email address.
referrer_codeoptionalstringOptional 8-character referral code from another signup. Invalid codes are ignored.
metadataoptionalobjectOptional key-value metadata, e.g. { source: 'producthunt' }. ≤1KB serialized.

import_waitlist

Import an existing list into the waitlist

rowsrequiredarrayPeople to import, at most 1000 per call.
consent_confirmedrequiredliteraltrue only after the developer confirmed these people consented.

get_waitlist_stats

Read-only

Get waitlist stats and top referrers (admin view)

No arguments.

get_waitlist_leaderboard

Read-onlyIndie and Builder

Get the public-safe waitlist leaderboard

limitoptionalnumber, 0–50How many entries to return. 1–50. Default 10.

invite_from_waitlist

Confirms firstIndie and Builder

Invite people from the waitlist

countoptionalnumber, 0–500Next-in-queue count. Cap 500. Cannot be combined with specific_email.
specific_emailoptionalstringSpecific email to invite. Cannot be combined with count.

export_waitlist

Read-onlyIndie and Builder

Export waitlist to CSV or JSON

formatoptional"csv" | "json"Output format. Default csv.
include_flaggedoptionalbooleanInclude anti-abuse-flagged rows. Default false.

get_waitlist_settings

Read-only

Get current waitlist pause state and custom copy

No arguments.

update_waitlist_settings

Pause/resume waitlist or set custom landing-page copy

accepting_signupsoptionalbooleantrue to allow new signups, false to freeze intake. Hides the public form when false.
header_textoptionalstring, max 120Custom headline (up to 120 chars). null clears and reverts to the default.
body_textoptionalstring, max 500Custom supporting paragraph (up to 500 chars). null clears and reverts to the default.
welcome_urloptionalstring, max 2,048Absolute http(s) URL invited signups are sent to (invite email CTA + hosted welcome page). null clears.

get_waitlist_embed_snippet

Read-only

Get HTML snippet to embed the waitlist on the developer's site

slugrequiredstring, max 64The project slug, e.g. 'demo' or 'my-product'.
heightoptionalnumber, 200–2,000Initial iframe height in px before auto-resize. Default 480.
titleoptionalstring, max 120Accessible 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.