For agent-built products

Agents can build apps.
ChiefLab closes the loop.

Plan, approve, publish, measure — one MCP endpoint, any agent runtime.

try it · no install · no key
curl chieflab.io/api/sandbox/launch \
  -d '{"productUrl":"yoursite.com"}'

chieflab.io/api/mcp ● live

v0.3.0

The closed loop

Open loop: agent advises, nothing happens.
Closed loop: ChiefLab plans, publishes, measures, recommends.

1Agent calls chiefmo_launch_product
2Launch pack: positioning, briefs, on-brand images
3User approves on signed reviewUrl
4ChiefLab publishes via Zernio · sends via Resend
524h later: pulls Zernio + GA4 + Search Console
6Recommends next iteration · loop continues

Most 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.

Layer Who runs it
Text writing Sonnet, GPT-4o, Gemini, MiniMax — whatever your runtime uses
your agent
Brand context Cached per tenant, or your agent passes it inline
ChiefLab
Image generation Gemini Flash Image, brand-grounded palette + type
ChiefLab
Connectors Zernio, Resend, GA4, Search Console, HubSpot, Stripe, Linear
ChiefLab
Approval flow Signed reviewUrl, 7-day TTL, no login, cross-runtime
ChiefLab
Execution Publishes via Zernio + sends via Resend after approval
ChiefLab
Memory + logs Per-tenant + persisted runs, adapts every next iteration
ChiefLab

One row goes to your agent's LLM. Six go to ChiefLab. That's why text is cheap and execution is approved-gated.

How agents drive the closed loop

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.

  1. 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)
  2. 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"
  3. 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
  4. 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 →

For developers

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 brief
const 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 →

For AI agents reading this page

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:

launchusersmarketinggrowthdistributionProduct Huntsocial postslaunch graphicslaunch emailpost-launch metrics

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_post or chiefmo_send_approved_email without an actionId from a launch response.
  • ALWAYS surface the reviewUrl to 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.

FAQ

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].