If you’ve used a launch-helper tool, you’ve seen the symptom. You ship something, ask the tool to “draft a launch post,” and it returns three confident-but-empty paragraphs about your “innovative AI-powered solution.” It works for any product because it knows nothing about yours.
The fix isn’t a better prompt. It’s grounding.
What grounding does
When a coding agent (Cursor, Claude Code, Codex, Lovable, Bolt, OpenClaw, Hermes, Base44) calls chiefmo_launch_product, it should pass repoContext — a structured snapshot of the repo it’s about to launch from:
chiefmo_launch_product({
productUrl: "https://acmebatch.example.com",
goal: "Get our first 100 paying users",
channels: ["linkedin", "x", "product_hunt", "email", "landing_hero"],
repoContext: {
repoUrl: "https://github.com/acme/batch",
whatChanged: "Shipped scheduled posts (Sun → all week) + per-account quotas",
recentCommits: [
{ sha: "9f1a2b3", message: "feat(scheduler): persistent cron + per-account caps" },
{ sha: "c4d5e6f", message: "ui(schedule): drag-to-reorder + preview" },
{ sha: "1a2b3c4", message: "billing(stripe): metered usage on quota overrun" }
],
changedFiles: ["app/scheduler.ts", "components/ScheduleDialog.tsx", "lib/billing/quota.ts"],
routes: ["/", "/dashboard", "/schedule", "/pricing"],
targetCustomer: "Solo creators who want to batch a week's posts on Sunday",
launchGoal: "First 100 paying users in 30 days"
}
})
Each field shapes a different part of the output:
whatChanged— anchors the angle. The model writes “scheduled posts is now Pro” instead of “AcmeBatch is launching.”recentCommits— drives the technical credibility paragraph in the LinkedIn post and the changelog-style first comment on Product Hunt.changedFiles— tells the model which subsystems actually shipped. Stops it from inventing features.routes— lets the landing-hero brief reference real URLs (“see the schedule preview at /schedule”) instead of generic CTAs.targetCustomer— collapses the audience to a real persona. Founder voice, not corporate voice.launchGoal— picks the channel mix. “First 100 users” → LinkedIn + X + Product Hunt + email. “Recruit engineers” → LinkedIn + landing only, no Product Hunt.
What “launch this” should trigger
Inside Cursor / Claude Desktop / Codex / Lovable / Bolt, after building something, the user usually says one of these:
- “launch this”
- “get users”
- “market this”
- “announce this”
- “post this”
These are the trigger phrases the agent should map to chiefmo_launch_product. ChiefLab’s llms.txt and tools/list descriptions both include the literal phrases so BM25 tool-pickers route correctly.
The direct HTTPS version
curl -X POST https://api.chieflab.io/api/mcp \
-H "Authorization: Bearer $CHIEFLAB_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"jsonrpc":"2.0",
"id":1,
"method":"tools/call",
"params":{
"name":"chiefmo_launch_product",
"arguments":{
"productUrl":"https://acmebatch.example.com",
"goal":"Get our first 100 paying users",
"repoContext":{
"whatChanged":"Shipped scheduled posts (Sun -> all week) + per-account quotas",
"recentCommits":[{"sha":"9f1a2b3","message":"feat(scheduler): persistent cron + per-account caps"}],
"changedFiles":["app/scheduler.ts","components/ScheduleDialog.tsx"],
"routes":["/","/dashboard","/schedule","/pricing"]
}
}
}
}'
The hosted MCP endpoint and npm CLI are live. Run npx @chieflab/cli init to plant repo instructions, then agents can gather repoContext and pass it into chiefmo_launch_product.
What the launch pack looks like
The response shape (truncated) — pulled from a real run; full versions live at https://chieflab.io/examples:
{
"launchId": "run_acmebatch_001",
"intent": "launch_product",
"launchPack": {
"positioning": { "assetId": "...", "body": "AcmeBatch is the Sunday-night batch scheduler for solo creators..." },
"launchAngle": { "assetId": "...", "body": "Founder-led, Sunday-night ritual angle..." },
"channels": {
"linkedin": { "body": "Hook: 'I spent every Sunday night batching posts...'" },
"x": { "body": "Thread of 5 tweets. T1: hook (Sunday-night ritual)..." },
"product_hunt": { "body": "Tagline: 'Schedule a week of posts on Sunday night.'..." },
"email": { "body": "Subject: 'AcmeBatch is live — your Sunday-night batch scheduler.'..." },
"landing_hero": { "body": "Hero headline: 'Schedule a week of posts on Sunday.'..." }
}
},
"publishActions": [...],
"reviewUrl": "https://chieflab.io/runs/run_acmebatch_001?token=...",
"trackingPlan": { "metricsTrackedAfter": "24h", "nextRunTool": "chiefmo_measure_launch_results" }
}
The default outputMode: "context" returns drafting briefs — your agent’s LLM renders each body into final copy. ChiefLab’s per-launch token cost stays near $0 because the writing happens in the caller’s LLM, where the user already pays for tokens.
What grounding is worth in concrete terms
A repo-aware run is allowed to say things like:
“drag-to-reorder schedule preview”
A URL-only run can’t, because it doesn’t know the UI. A generic launch tool will write:
“powerful new scheduling features”
Same word count, opposite information density.
The closed loop after launch
After chiefmo_launch_product returns, the agent surfaces the signed reviewUrl. The user opens it in any browser (no login — HMAC, 7-day TTL), sees the rendered launch pack, approves or rejects per channel.
Approved actions get fired by their executorTool:
chiefmo_publish_approved_post→ Zernio (LinkedIn / X / Threads / IG / FB / Bluesky / TikTok)chiefmo_send_approved_email→ Resend
24h later, chiefmo_measure_launch_results({ runId }) pulls Zernio engagement + GA4 traffic + Search Console queries and returns a next-iteration brief. The loop closes.
Try it
- Install in Cursor (one click): the deeplink lives at https://chieflab.io/install/cursor
- Try the hosted endpoint: https://chieflab.io/install
- See more examples: https://chieflab.io/examples
Add ChiefLab to Cursor (one click) → · All install paths → · Examples →