MCP server

The welaunch MCP server

welaunch finds where people who need what you sell are already looking, on ChatGPT, Google, Reddit and X, and writes the posts, replies and pages that bring them to you. As an MCP server, it does that from any agent that speaks MCP: Claude Code, Cursor, Windsurf, the Claude app, or one you built. Ask it to run a play, read the five replies it wrote, and send the ones you like to your browser.

Connect

On every plan, Free included. Reading is free; the tools that run agents spend credits exactly as the app does, and each connection has a daily credit cap.

ChatGPT and Claude (OAuth, no key)

Add a custom connector with the URL below. In Claude: Settings, Connectors, Add custom connector. In ChatGPT: turn on developer mode in Settings, then create a connector. You sign in to welaunch, pick the product, and choose Allow. The server follows the MCP authorization spec: OAuth 2.1 with PKCE, dynamic client registration, and the protected resource and authorization server metadata documents.

https://api.welaunch.sh/mcp

Claude Code, Cursor, Windsurf (API key)

Make a key in Settings, MCP server. Then:

Claude Code

claude mcp add --transport http welaunch https://api.welaunch.sh/mcp --header "Authorization: Bearer wl_YOUR_KEY"

Cursor, Windsurf, the Claude app: add to mcp.json

{
  "mcpServers": {
    "welaunch": {
      "url": "https://api.welaunch.sh/mcp",
      "headers": {
        "Authorization": "Bearer wl_YOUR_KEY"
      }
    }
  }
}

What you can ask

The tools

workspacefree

Your product, credits left, whether a paid plan is active. Call it first.

Input
none
Returns
name, url, visibilityScore, credits, paidPlan, key { name, dailyCreditCap, spentToday }
visibilityfree

Your latest full check and the one before it.

Input
none
Returns
latest and previous: composite score, the five surfaces (AI answers, Google, Reddit, X, directories), counts
scanfree

Score any public URL's landing page against twelve rules, with the top findings. Works on a competitor too.

Input
url (https)
Returns
score, band, passed, total, findings, checks
agentsfree

One agent per place your buyers are: what each does, what is in its pool, what is waiting on you.

Input
none
Returns
kind, label, does, perRun, credits, pool, waiting, enabled, lastRunAt
run_agent8 credits

Run one agent: up to five live targets, each with the reply, post or listing already written.

Input
kind (from agents)
Returns
run, credits, note, items: id, label, url, why, draft
agent_itemsfree

Everything the agents found and wrote that you have not acted on, with the drafts.

Input
kind (optional)
Returns
items: id, agent, status, label, url, why, draft, postedUrl, foundAt
approve_itemfree

Send one item to the Browser Agent in your own browser, which fills it in and waits for you to press submit.

Input
itemId, draft (optional, your edit)
Returns
the item, and a jobId, or an openUrl when no browser is paired
skip_itemfree

Drop one and never offer that target again. A reason teaches the agent.

Input
itemId, reason (optional)
Returns
the item
list_playsfree

The ranked backlog: title, category, status, and which steps have a job we run.

Input
status (open, shipped, all), limit
Returns
id, rank, title, category, status, summary, steps, done, jobs
get_playfree

One play in full: the steps, the targets each find handed back, their drafts, what has been posted.

Input
playId
Returns
the play with steps, actions, targets and drafts
run_stepthe step's price, usually 8 credits

Run a step's job: up to five live threads, posts, questions, directories or keywords, with a draft for each where the find writes. Needs a paid plan, as in the app.

Input
stepId, replace (optional)
Returns
message, credits, the step with its targets
rewrite_target1 credit (5 for all of them)

A different draft for one target, same target. Needs a paid plan.

Input
stepId, targetKey (optional)
Returns
message, credits, drafts
skip_targetfree

Never offer this target again.

Input
stepId, targetKey
Returns
remaining
post_targetfree

Send a draft to the Browser Agent in your own browser, which fills it in and waits for you to press submit.

Input
stepId, targetKey
Returns
jobId, trust, note
submissionsfree

Every directory you have submitted to, and whether the listing is live.

Input
none
Returns
directory, status, listingUrl, submittedAt, verifiedAt

Two rules

Nothing is posted from the MCP. post_target queues the draft for the welaunch Browser Agent, the Chrome extension in your own browser, which opens the page, fills the reply in, and waits for you to press submit. An assistant with a tool that posts to Reddit on its own is how accounts get banned; yours never has one.

Every key has a daily credit ceiling, 50 by default, set per key in Settings. A step that finds and writes costs 8 credits; an agent in a loop stops at the cap, not at your balance.

Webhooks

Add an https endpoint in Settings, Webhooks and pick events. Each event is a POST with a JSON body { type, timestamp, data }, where data always carries workspaceId. Answer with any 2xx. A delivery is tried three times: at once, a minute later, and ten minutes after that. The log in Settings shows what each attempt got back.

visibility.check_completed

A full weekly check finished.

data: snapshotId, checkedAt, composite, aiScore, namedPairs, totalPairs, named[]

visibility.named_changed

A question and engine crossed the named line (at least 2 of 4 runs) since the previous full check, either way. Noise under the line is not sent.

data: snapshotId, previousSnapshotId, changes[]: question, engine, namedRuns, totalRuns, gained

audit.blocker_found

The technical audit fails a blocker that was not failing on the previous check.

data: snapshotId, url, blockers[]: id, title, detail

guarantee.status_changed

The Growth promise changed status: ACTIVE, MET, OWED, CREDITED or VOID.

data: guaranteeId, status, previousStatus, deadline, freeMonthsGranted, reason

Signed the Standard Webhooks way, so any of its libraries verifies them. Three headers: webhook-id (the same on every retry, so you can drop duplicates), webhook-timestamp (Unix seconds) and webhook-signature, which is v1, and a base64 HMAC-SHA256 of id.timestamp.body keyed with your secret. By hand, in Node:

import crypto from "node:crypto";

// secret: the whsec_... value shown once when you added the endpoint.
// body: the raw request body, as a string, before any JSON parsing.
function verify(secret, headers, body) {
  const id = headers["webhook-id"];
  const ts = headers["webhook-timestamp"];
  if (Math.abs(Date.now() / 1000 - Number(ts)) > 300) return false; // replay
  const key = Buffer.from(secret.replace(/^whsec_/, ""), "base64");
  const want = crypto.createHmac("sha256", key).update(`${id}.${ts}.${body}`).digest("base64");
  return headers["webhook-signature"].split(" ").some((part) => {
    const [v, sig] = part.split(",");
    return v === "v1" && sig.length === want.length &&
      crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(want));
  });
}

The skill

Agents that load skills can take /skills/welaunch/SKILL.md: when to reach for welaunch, how to read a play, and how to talk about drafts (as drafts, until the founder presses submit).

Not on welaunch yet?

Paste your URL. See what ChatGPT, Perplexity and Google AI answer when your buyers ask, who they name instead of you, and which pages they read. Then we do the work to get you onto those pages.

Free scan, no signup, no card.