Skip to main content

Look up your contacts from Claude Desktop

A contact is one person across everything Launch knows about them. With the MCP server connected, the agent can answer questions that otherwise mean exporting three CSV files and matching emails by hand.

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

  • Which of my waitlist signups are paying customers now?
  • What has [email protected] asked for, and is she paying?
  • List paying customers who came from Product Hunt.
  • Mark [email protected] as in talks and note that she wants SSO.

For “Which paying customers left feedback?” Claude Desktop calls list_contacts with:

{
  "paying": true,
  "has_feedback": true,
  "limit": 10
}

Returned: Contacts with id, email, source, waitlist status, subscriber flag, feedback count, Stripe status, plan, MRR and stage, plus a cursor when there are more.

Contacts tools and arguments

list_contacts

Read-only

List people across waitlist, feedback, subscribers and Stripe

payingoptionalboolean
has_feedbackoptionalboolean
statusoptional"waiting" | "invited" | "unsubscribed"
sourceoptionalstring, max 255
stageoptional"potential" | "in_talks" | "customer" | "recurring" | "not_a_fit" | "inactive"
qoptionalstring, max 254Part of an email address.
limitoptionalnumber, 1–100
cursoroptionalstring

get_contact

Read-only

Get one person across every primitive

contact_idrequiredstring, max 64Contact id, e.g. "ct_...".

update_contact

Set a contact's stage or note

contact_idrequiredstring, max 64
stageoptional"potential" | "in_talks" | "customer" | "recurring" | "not_a_fit" | "inactive"
noteoptionalstring, max 5,000

Behaviour worth knowing

  • People are matched on normalised email: lowercase, +alias removed, dots ignored on Gmail.
  • update_contact changes only the stage and the note. It cannot change an email, a waitlist status or anything in Stripe, and a new note replaces the old one.
  • It works without Stripe connected; every contact then has Stripe status none.
  • On the Free plan only waitlist people are listed, in a single page.
  • A contact is removed when the person no longer exists in any source, for example after their signup is deleted.
  • 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.