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
{
"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.
{
"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.
# 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.
{
"mcpServers": {
"enlist": {
"command": "npx",
"args": ["-y", "@enlistdev/mcp"],
"env": { "ENLIST_API_KEY": "en_live_your_key" }
}
}
}Tools
| Tool | Arguments | Returns |
|---|---|---|
create_waitlist | name | The created waitlist |
list_waitlists | — | All waitlists with live counts |
add_signup | waitlistId, email, utmSource?, referrer?, referralCode?, metadata?, fields? | { id, position, total, referral_code } |
list_signups | waitlistId, limit?, offset? | Paginated signups |
get_waitlist_stats | waitlistId, from?, to? | Daily series + referrer breakdown |
get_signup_position | waitlistId, email | That person's position |
remove_signup | waitlistId, signupId | { removed: true } |
list_waitlist_fields | waitlistId | Field definitions for the waitlist |
update_waitlist | waitlistId, name | The 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.