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
- "What are my top plays this week?"
- "Run the Reddit agent and show me the replies."
- "Rewrite the third one, less salesy."
- "Send the first two to my browser."
- "What is still waiting on me?"
- "Score competitor.com and tell me what they get wrong."
- "How is my visibility on ChatGPT compared to last week?"
The tools
workspacefreeYour product, credits left, whether a paid plan is active. Call it first.
- Input
- none
- Returns
- name, url, visibilityScore, credits, paidPlan, key { name, dailyCreditCap, spentToday }
visibilityfreeYour 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
scanfreeScore 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
agentsfreeOne 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 creditsRun 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_itemsfreeEverything 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_itemfreeSend 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_itemfreeDrop one and never offer that target again. A reason teaches the agent.
- Input
- itemId, reason (optional)
- Returns
- the item
list_playsfreeThe 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_playfreeOne 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 creditsRun 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_targetfreeNever offer this target again.
- Input
- stepId, targetKey
- Returns
- remaining
post_targetfreeSend 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
submissionsfreeEvery 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_completedA full weekly check finished.
data: snapshotId, checkedAt, composite, aiScore, namedPairs, totalPairs, named[]
visibility.named_changedA 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_foundThe technical audit fails a blocker that was not failing on the previous check.
data: snapshotId, url, blockers[]: id, title, detail
guarantee.status_changedThe 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.
