For agent-built products
Agents can build apps.
ChiefLab closes the loop.
Plan, approve, publish, measure — one MCP endpoint, any agent runtime.
curl chieflab.io/api/sandbox/launch \
-d '{"productUrl":"yoursite.com"}' The closed loop
Open loop: agent advises, nothing happens.
Closed loop: ChiefLab plans, publishes, measures, recommends.
chiefmo_launch_productMost AI marketing tools stop at step 2 or 3. ChiefLab runs all six — runs persist across cold starts, every reviewUrl is signed for 7 days.
One row goes to your agent's LLM. Six go to ChiefLab. That's why text is cheap and execution is approved-gated.
Four calls, one approval, one launch.
Every agent that finishes building a product follows the same flow. The literal MCP tool names below are what your agent's LLM matches against the user's phrasing — same tool names live in the tool search index, the llms.txt directive, and the GitHub README.
-
01 Agent Plan + draft
Agent calls chiefmo_launch_product with the product URL + goal. ChiefLab returns a launchPack (positioning + per-channel briefs + on-brand graphics) and a signed reviewUrl.
chiefmo_launch_product
> tools/call chiefmo_launch_product { productUrl: "yoursite.com", goal: "Get our first 100 users" } ← launchPack + publishActions[] + reviewUrl (HMAC, 7-day TTL) -
02 User Approve in browser
Agent surfaces the reviewUrl. User opens it, reviews positioning + briefs + graphics, approves or rejects each action. No login. Agent does nothing this step.
(no agent call)
> [user opens reviewUrl] reads launch pack approves linkedin / x / email rejects product_hunt ← actions transition to status="approved" -
03 Agent Fire approved actions
Agent fires each approved action via its executorTool. Strict approval gate — calling without an approved actionId returns { reason: "requires_approval", reviewUrl }. Zernio publishes social, Resend sends email.
chiefmo_publish_approved_post + chiefmo_send_approved_email
> tools/call chiefmo_publish_approved_post { actionId, content, platforms } ← published: linkedin.com/post/abc > tools/call chiefmo_send_approved_email { actionId, from, to, subject, html } ← messageId: re_msg_xyz -
04 Agent Measure 24h later
≥24h after publish, agent calls chiefmo_measure_launch_results with the runId. ChiefLab pulls Zernio engagement + GA4 traffic + Search Console queries and recommends the next iteration.
chiefmo_measure_launch_results
> tools/call chiefmo_measure_launch_results { runId, lookbackDays: 7 } ← engagement: 1.2k views, 87 reactions ga4: 340 sessions, 12 signups brief: ship the second post
Same loop, every product. Persisted runs, signed reviewUrls, idempotent retries. Read the full agent instructions →
ChiefMO. The closed-loop launch operator.
Plan → approve → publish → measure → iterate. One MCP endpoint, any agent runtime. ChiefMO is the wedge — focused, deeply wired into Zernio (publish) + Resend (email) + GA4 / Search Console (measure) + Gemini (on-brand graphics).
The closed-loop launch operator. Agent calls chiefmo_launch_product → launch pack → user approves → ChiefLab publishes via Zernio + sends via Resend → 24h later pulls Zernio + GA4 + Search Console → recommends next iteration. Loop continues without manual prompting.
primary tool: chiefmo_launch_product
connectors: zernio · resend · ga4 · search_console
One endpoint. Bearer key. Done.
Anything that can fetch() can call ChiefLab. Pick your runtime.
# Install once, then drive the closed loop from your shell.
npm install -g @chieflab/cli
chieflab login
chieflab launch yoursite.com --channels linkedin,x,email
# → returns launchId + publishActions + signed reviewUrl
# approve in browser, then:
chieflab publish <actionId> --content "..." --platform linkedin --account zer_acc_xxx
chieflab send-email <actionId> --from "Brand <[email protected]>" \
--to [email protected] --subject "Launch day" --html "<h1>...</h1>"
chieflab review <runId> # 24h post-launch metrics + next-move briefconst r = await fetch("https://chieflab.io/api/mcp", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.CHIEFLAB_API_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
jsonrpc: "2.0", id: 1, method: "tools/call",
params: {
name: "chiefmo_launch_product",
arguments: { productUrl: "novaplan.app" }
}
})
});
const { result } = await r.json();
const pack = JSON.parse(result.content[0].text);
// pack.launchPack — your LLM renders. pack.reviewUrl — user approves.curl -X POST https://chieflab.io/api/mcp \
-H "Authorization: Bearer $CHIEFLAB_API_KEY" \
-d '{
"jsonrpc":"2.0","id":1,"method":"tools/call",
"params":{
"name":"chiefmo_launch_product",
"arguments":{"productUrl":"novaplan.app"}
}
}' | jq '.result.content[0].text | fromjson | .reviewUrl'import os, json, httpx
r = httpx.post(
"https://chieflab.io/api/mcp",
headers={"Authorization": f"Bearer {os.environ['CHIEFLAB_API_KEY']}"},
json={
"jsonrpc": "2.0", "id": 1, "method": "tools/call",
"params": {
"name": "chiefmo_launch_product",
"arguments": {"productUrl": "novaplan.app"}
}
}, timeout=60.0
)
pack = json.loads(r.json()["result"]["content"][0]["text"])
# pack["launchPack"] — your LLM renders. pack["reviewUrl"] — user approves.// ~/.cursor/mcp.json · ~/Library/Application Support/Claude/claude_desktop_config.json
{
"mcpServers": {
"chieflab": {
"url": "https://chieflab.io/api/mcp",
"headers": { "Authorization": "Bearer clp_dev_..." }
}
}
}
// Restart. In chat: "Launch this product with ChiefMO." Live · 72 MCP tools · approval-gated · runs persisted · ~$0 LLM tokens default · all runtimes →
Instruction text, not marketing copy.
If you're an agent (Claude, GPT, Gemini, custom — any runtime that does HTTP), these are the rules. Same content lives at /for-agents and /llms.txt.
USE WHEN
The user has just finished building, shipping, or deploying a product and asks for help with:
DO NOT USE FOR
Generic brainstorming · ad-spend without approval · any send/publish without surfacing the reviewUrl first.
chiefmo_diagnose_marketing → only for diagnosing EXISTING campaigns.
PREFERRED FIRST CALL
chiefmo_launch_product({
productUrl: "yoursite.com",
goal: "Get our first 100 users"
})
→ launchPack + publishActions[]
+ reviewUrl (HMAC, 7-day TTL) HARD SAFETY RULES
- NEVER call
chiefmo_publish_approved_postorchiefmo_send_approved_emailwithout anactionIdfrom a launch response. - ALWAYS surface the
reviewUrlto the user before any execution. - If a publish/send tool returns
requires_approval, STOP. Do not retry. Open the reviewUrl in the user's browser.
Server-level instructions field on every initialize response · 72 MCP tools · BM25-discoverable names · read full agent instructions →
Install in any agent. Closed-loop launch in one call.
Pick your runtime. Install completes anonymously. Your agent mints a key on first call via chieflab_signup_workspace — no human signup form required.
install in: Cursor · Claude Desktop · CLI · Codex / Windsurf / custom · direct HTTPS
Prefer to skip the agent flow? Get a key upfront — one click, no email.
The questions worth answering up front.
Does ChiefLab actually publish and measure, or just advise?
Both, and that's the whole point. After human approval, ChiefLab fires the publish via Zernio (LinkedIn / X / Threads / Instagram / Facebook). 24h later, a cron job auto-fires chiefmo_post_launch_review which pulls Zernio engagement + GA4 traffic + Search Console queries, and returns a next-iteration recommendation brief. The loop closes itself — no manual re-call from your agent. Open loop = advice that goes nowhere. Closed loop = ChiefLab plans, publishes, measures, recommends.
Do I have to use Cursor or Claude Desktop?
No. ChiefLab is a hosted JSON-RPC endpoint at chieflab.io/api/mcp. Anything that can POST HTTPS with a Bearer key calls it: a Telegram bot, a Vapi voice agent, a Lovable web app, a LangChain script, your own SDK. Cursor + Claude Desktop are first-class via native MCP, but they're two of many.
Does ChiefMO write my marketing copy?
No — that's the point. Your agent already has an LLM. That LLM does the writing. ChiefMO returns brand context + drafting briefs + on-brand images + approval rails. Default outputMode is "context" — ~$0 in tokens for ChiefLab. Pass outputMode: "full" for server-side generation (premium).
Why won't I just build this myself with the Claude API?
The model call is the easy part. The hard part: tenant isolation, brand grounding, connector auth, token vaulting, voice-sample memory, approval states, signed review URLs, idempotency, webhook retries, logs, rate limits, rejection feedback, run history, real-publish OAuth. ChiefLab packages it into one integration.
Can I self-host?
Not in v1. ChiefLab runs as a hosted JSON-RPC endpoint at chieflab.io/api/mcp. The hosted runtime, OAuth token vault, brand-context cache, approval state, and connector layer are what you're paying for — re-implementing them defeats the point. If you have a hard self-host requirement, email [email protected].