Enlist

MCP server

Add a waitlist to any project in one agent prompt.

Add a waitlist to any project in one agent prompt. Connect your key once. Your agent creates the waitlist, integrates the signup call, renders the response. No install. No key in your code.

Claude Code

claude mcp add --transport http enlist https://api.enlist.dev/mcp \
  --header "Authorization: Bearer en_live_your_key"

Cursor / anything with mcp.json

.cursor/mcp.json
{
  "mcpServers": {
    "enlist": {
      "url": "https://api.enlist.dev/mcp",
      "headers": { "Authorization": "Bearer en_live_your_key" }
    }
  }
}

Cursor reads ~/.cursor/mcp.json (global) or .cursor/mcp.json (per project).

VS Code

Not the same file as Cursor's, and not the same top-level key — VS Code reads servers, and wants the transport named.

.vscode/mcp.json
{
  "servers": {
    "enlist": {
      "type": "http",
      "url": "https://api.enlist.dev/mcp",
      "headers": { "Authorization": "Bearer en_live_your_key" }
    }
  }
}

Codex

Codex reads the token out of the environment rather than off the config line, so the export is part of the setup rather than a footnote.

~/.codex/config.toml
# export ENLIST_API_KEY="en_live_your_key"

[mcp_servers.enlist]
url = "https://api.enlist.dev/mcp"
bearer_token_env_var = "ENLIST_API_KEY"

Claude Desktop / local stdio

The remote server above needs no install and stays the recommended path. Run the local server when your client does not speak streamable HTTP, or when you want to point an agent at a non-production API with ENLIST_BASE_URL.

Both expose identical tools — the remote endpoint imports them from this same package — so this is a choice of transport, not of capability. The local server still calls the Enlist API over the network; only the client-to-server hop is local.

mcp.json
{
  "mcpServers": {
    "enlist": {
      "command": "npx",
      "args": ["-y", "@enlistdev/mcp"],
      "env": { "ENLIST_API_KEY": "en_live_your_key" }
    }
  }
}

Tools

ToolArgumentsReturns
create_waitlistnameThe created waitlist
list_waitlistsAll waitlists with live counts
add_signupwaitlistId, email, utmSource?, referrer?, referralCode?, metadata?, fields?{ id, position, total, referral_code }
list_signupswaitlistId, limit?, offset?Paginated signups
get_waitlist_statswaitlistId, from?, to?Daily series + referrer breakdown
get_signup_positionwaitlistId, emailThat person's position
remove_signupwaitlistId, signupId{ removed: true }
list_waitlist_fieldswaitlistIdField definitions for the waitlist
update_waitlistwaitlistId, nameThe renamed waitlist

Agents cannot delete a waitlist

There is no delete-waitlist tool. remove_signup takes one person off a list, but destroying a whole list of email addresses is a dashboard action or a deliberate DELETE /v1/waitlists/:id call — a line you wrote, not one a model elected to make mid-loop. Renaming is safe and stays available: update_waitlist changes an internal label and moves nothing else.

About the API key

The key is configured once, on the server connection — it is never a tool argument. An agent can call every tool without ever seeing the key, so it cannot echo it into a file, a commit, or a prompt.

One key per machine

Each MCP connection is scoped to the account behind its key. Use a separate key per machine so you can revoke one without disturbing the others.