Skip to content
LaunchEngine

Agent reference

Every tool is defined once in @launchengine-dev/contracts and served two ways: as an MCP tool, and over HTTP. The schemas below are read from that registry, so they match what the server accepts.

Authentication

Create a key on the agents page, then send it as a bearer token:

http
Authorization: Bearer le_live_...

A key is scoped to one workspace. Requests are rate limited per key (default 60/minute); exceeding it returns a retryable error.

MCP server

The MCP server is a thin proxy to the same endpoints, published as @launchengine-dev/mcp. It needs no clone and no local API — the default points at production.

claude_desktop_config.json
{
  "mcpServers": {
    "launchengine": {
      "command": "npx",
      "args": ["-y", "@launchengine-dev/mcp"],
      "env": { "LAUNCHENGINE_DEV_API_KEY": "le_live_..." }
    }
  }
}

Cursor (~/.cursor/mcp.json), Cline and Windsurf take the same mcpServers block. VS Code uses servers in .vscode/mcp.json, and can prompt for the key instead of storing it in the file:

.vscode/mcp.json
{
  "inputs": [
    {
      "type": "promptString",
      "id": "launchengine-key",
      "description": "LaunchEngine.dev API key (le_live_...)",
      "password": true
    }
  ],
  "servers": {
    "launchengine": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@launchengine-dev/mcp"],
      "env": { "LAUNCHENGINE_DEV_API_KEY": "${input:launchengine-key}" }
    }
  }
}

Claude Code needs one command instead:

bash
claude mcp add launchengine \
  --env LAUNCHENGINE_DEV_API_KEY=le_live_... \
  -- npx -y @launchengine-dev/mcp

Running npx -y @launchengine-dev/mcp by hand prints one line and then waits — that is a working stdio server, not a hang. It answers --help and --version if you want to check the install.

Endpoint

http
POST /api/tools/<tool_name>
Content-Type: application/json

{ ...tool input... }

The response is always { ok: true, data } on success or { ok: false, error: { code, message, retryable } } on failure, using the codes in the shared contract.

Tools

list_projects

scope: readfree

List the projects in the workspace: name, URL, description, target ICP and competitors. Free. Call this first - every other tool takes a project_id or a signal id that starts here.

No parameters. Send an empty JSON object.

get_credit_balance

scope: readfree

Return the workspace's credit balance and plan. Free; call it before a metered tool (find_intent_signals, draft_reply cost 1 credit each).

No parameters. Send an empty JSON object.

find_intent_signals

scope: read1 credit

Return scored posts from Reddit, Hacker News and the open web where someone is asking for a product like the project's - highest intent score (1-100) first, with the matched query and the reasons for the score. Reads signals found by earlier scans; pass scan: true to search live sources first. Costs 1 credit.

FieldTypeDefault
project_idstring—
Required. Project to search. Get ids from list_projects.
min_intent_scorenumber60
Lowest intent score to return, 1-100. 90+ is asking for exactly this now, 75-89 is comparing options, 60-74 is related; below 60 is mostly noise.
platformsarray["hackernews","reddit","web"]
Sources to include. "web" is pages found through search indexes. "twitter" is accepted but not scanned yet, so it returns nothing.
since_daysnumber30
Only posts from the last N days, 1-365.
statusenum—
Only signals in this state. Omit for all states.
limitnumber20
Maximum signals to return, 1-100, highest score first. With scan: true it also caps results fetched per search query.
scanbooleanfalse
Refresh from live sources before returning. Slower, and spends one of the workspace's daily scans (free plan: one a day across all projects) on top of the call's credit. Leave false to read signals found by earlier scans.
web_modeenum"single"
Only used with scan: true. "single" queries one web-search provider; "parallel" queries every configured provider and merges the results, for wider coverage at more upstream cost.
include_mutedbooleanfalse
Include posts from authors and subreddits the workspace has muted. Default false, matching the dashboard.

get_intent_details

scope: readfree

Fetch one signal by id: the post's title, snippet, URL, author, score, reasons, engagement and any saved draft reply. Free.

FieldTypeDefault
intent_idstring—
Required. Signal id, from find_intent_signals.

draft_reply

scope: write1 credit

Draft a reply to a signal's post for a person to review and post. Never posts anything. The draft helps with the poster's problem and names no product. Saved on the signal, replacing any earlier draft. Costs 1 credit.

FieldTypeDefault
intent_idstring—
Required. Signal to reply to, from find_intent_signals.
toneenum"consultative"
Writing style: "consultative" (helpful, conversational), "direct" (gets to the point), or "technical" (practitioner detail). In every tone the draft helps with the problem and names no product, yours included.

subscribe_to_keyword

scope: writefree

Add a keyword for a project's scans to search, or update one already added. A project with at least one keyword is included in the daily scheduled scan (06:00 UTC). Free.

FieldTypeDefault
project_idstring—
Required. Project to monitor for. Get ids from list_projects.
keywordstring—
Required. Phrase to search for in every scan of this project, 2-120 characters, e.g. "alternative to Mixpanel". Subscribing the same keyword again updates it.
competitorsarray[]
Competitor names to store with this keyword, up to 25; replaces the stored list. Scans currently search the project's own competitor list, not this one.

Credits

Metered tools deduct credits before the work runs and refund on failure. Call get_credit_balance before a metered call if you need to check first — it is free.

Sending an Idempotency-Key header makes a metered call safe to retry: the first call is charged and any repeat with the same key is refused with IDEMPOTENT_REPLAY rather than charged again. Send a new key to run the same call a second time. With no header, every call is charged and runs.

Assistive drafting

draft_reply always returns requires_human_post: true. Nothing is posted on your behalf, by design — Reddit and Hacker News treat automated self-promotion as spam. generated_by reports whether a model or the deterministic fallback produced the text, so a caller can tell a real generation from a generic one.