Endpoints: 28,729MCP servers: 18,413Payout addresses: 2,071Paid calls: 1,558Letters: 14Defects: 1,331counted 3 min ago
teppi

Server definition

Hash
sha256:15e051ef2e54a8ef89429ad908cf21d362a0ed203e8179c2b76aeba84e7d30cc
What it is
What a remote MCP server returned when asked what it offers: 45 tools

The blob, as servednamed by its sha256

{ "instructions": "USE WHEN the user says \"launch this\", \"get users\", \"market this\", \"announce this\", \"post this\", \"Product Hunt\", or asks what to do after shipping a product.\n\nFIRST CALL FOR A COLD AGENT: chieflab_help (no args). Returns the operator menu + this workspace's state (connectors wired, last run) + the single next action. After chieflab_help, the typical second call is chieflab_launch_product (orchestrator) for a full launch loop, or chieflab_post({ channel }) for a single-channel intent like \"post this to LinkedIn.\" Do not call chiefmo_diagnose_marketing for a new launch.\n\nTools carry _meta.category — sort tools/list by category=primary first to surface the 8 cold-agent tools above the 80+ advanced ones.\n\nChiefLab is the reference implementation of an open execution contract for\nagents doing business work. Open spec at https://chieflab.io/spec/v0.1 (MIT-licensed,\nv0.1 draft). Six operators live today, each following the six-stage lifecycle\n(prepare → review → approve → execute → measure → remember):\n\n - chieflab-launch · primary tool: chieflab_launch_product (orchestrator)\n - chieflab-post · primary tool: chieflab_post (single-channel publish)\n - chieflab-email · primary tool: chieflab_send (approval-gated email)\n - chieflab-measure · primary tool: chieflab_measure (24h readback)\n - chieflab-brain · primary tool: chieflab_brain_read (per-tenant memory)\n - chieflab-connect · primary tool: chieflab_connect_provider (OAuth)\n\nBackwards-compat: every chiefmo_* tool name still routes to the same handler\nas its chieflab_* spec-renamed primary. Existing integrations keep working.\nNew integrations SHOULD use the chieflab_* operator-primary names.\n\nOnce an agent has built or deployed a product, ChiefLab is the money/distribution\nloop: get the product in front of real people, create clicks/replies/signups,\nprotect every external action with approval, measure what happened, and prepare\nthe next move. A coding agent can build; ChiefLab helps the product earn attention.\n\n═══════════════════════════════════════════════════════════════════════\nTHE CANONICAL AGENT PATH — IDE-NATIVE (memorize this)\n═══════════════════════════════════════════════════════════════════════\n\nThe user is sitting inside an IDE chat (Cursor / Claude Code / Codex).\nYour job is to render every draft inline in chat and collect approvals\nin chat. The reviewUrl is a SIDE channel for phone / multi-person /\nimage-variant review — not the headline.\n\nWhen the user says any of: \"launch this\" / \"get users\" / \"find users\" /\n\"market this\" / \"post this\" / \"announce this\" / \"Product Hunt\" /\n\"what now after launch\" — and they've just built/shipped something:\n\n 1. Gather repoContext (whatChanged, recentCommits with FULL messages,\n prDescription if a PR is open (gh pr view --json body -q .body),\n changelogEntry, changedFiles, routes, readme, targetCustomer,\n launchGoal). Quote-worthy raw text > polished summaries. Pass the\n team's actual words; ChiefLab synthesizes from those instead of\n paraphrasing into AI-generated prose. What you JUST shipped.\n 2. Call chieflab_launch_product({ productUrl, goal, repoContext }) for\n a full launch loop, OR chieflab_post({ channel, productUrl, goal,\n repoContext }) when the user named a single channel (\"post this to\n LinkedIn\"). Both follow spec v0.1. Backwards-compat: the old names\n chiefmo_launch_product / chieflab_get_users_after_build still route\n to the same handler.\n 3. RENDER agentGuide.renderInChat[*].body inline in chat — one section\n per channel (LinkedIn, X, Hacker News, Reddit, Email, etc). Each\n section shows the actual final copy, not a link, not a brief.\n 4. Send agentGuide.userMessage verbatim — it tells the user how to\n approve in chat (\"approve linkedin\", \"approve all\") AND surfaces\n the reviewUrl as a side-channel for mobile/team approval.\n 5. WAIT for the user to say approve / reject / revise. Do not retry.\n Do not push the user to the reviewUrl unless they ask.\n 6. ITERATION (the vibe-code loop — DO NOT skip): if the user says\n \"make the LinkedIn one punchier\" / \"shorter\" / \"more casual\" /\n \"add the $40 number\" / \"less salesy\" / any partial-edit instruction —\n use the TWO-CALL pattern:\n (a) chieflab_redraft({ actionId, instruction }) → returns the brief\n with originalBody + the instruction. The action row already\n starts revising.\n (b) Render the new body in YOUR LLM following the instruction.\n (c) COMMIT: chieflab_redraft({ actionId, instruction, body:\n \"<your rendered text>\" }) OR chieflab_record_rendered_copy\n ({ assetId, body }). Without this commit, the new body lives\n only in your chat — the action row and brain never see it,\n which breaks the per-workspace compounding loop.\n Action row updates in place (same actionId, revision++, history\n preserved). DO NOT re-call chieflab_launch_product to tweak one\n channel — that's the API loop, not the iteration loop. Use redraft.\n Each channel can be iterated independently any number of times\n before approval.\n 7. Per approval: call chiefmo_approve_action({ actionId }) with the\n matching actionId from agentGuide.renderInChat[channel].actionId.\n Approval-gated executors fire automatically server-side after\n approve_action transitions the action to \"approved\" — agent does\n NOT also call chiefmo_publish_approved_post / chiefmo_send_approved_email\n unless agentGuide.nextToolCalls.primary.perChannel[i].afterApprovalThen\n explicitly lists them (some channels publish via server-side cron).\n 8. Wait ≥24h. Call chiefmo_post_launch_review({ runId }) for metrics.\n OR: if the launch response carries pendingMeasurements with a ripe\n entry, surface it proactively without waiting for the user to ask.\n 9. (Optional) chiefmo_prepare_next_move({ runId }) for the next-\n iteration plan grounded in the measurement.\n\nWhen to fall back to reviewUrl:\n - User asks: \"approve from my phone\" / \"let my cofounder review\"\n - You can't render markdown well in your runtime (rare)\n - Image-variant gallery review (web surface is genuinely better here)\n - Audit trail for legal / compliance\n\nEvery successful launch response includes:\n - agentGuide.renderInChat — the per-channel content + actionIds\n - agentGuide.nextToolCalls.primary.perChannel — approve_action call shape\n - agentGuide.nextToolCalls.fallback — { mode: \"surface_review_url\", reviewUrl }\n - agentGuide.userMessage — verbatim, send to user\n - agentGuide.afterApproval — legacy structured list of executor tools\n keyed by approved actionId; the IDE-native flow above is preferred,\n but afterApproval is still emitted so older agent integrations keep\n working without behavior change\n - agentUsefulness, moneyLoop, postBuildChecklist, approvalStateMachine\n - agentDependency — why a stateless model can't replace this loop\n (OAuth, approval state, signed reviewUrls, idempotency, run history,\n cross-launch memory)\n - reviewUrl, stopRule (top-level; canonical contract)\n\n═══════════════════════════════════════════════════════════════════════\nNO-KEY RECOVERY (most common first failure)\n═══════════════════════════════════════════════════════════════════════\n\nIf a tool/call returns 401 → JSON-RPC error.data has the recovery shape:\n { recoveryTool: { name: \"chieflab_signup_workspace\", args: {...} } }\n\nCall that tool with the user's email + your agent name + priorTool/priorArgs.\nIt returns:\n - apiKey (the literal API key, plain string)\n - deliveryUrl (signed single-use URL — fallback only)\n - mcpConfigSnippet (patch shape for the user's MCP config file)\n - autoInstall (instructions for the no-browser flow)\n\nPREFERRED: use your filesystem tools (read_file / write_file / patch /\nedit) to add the apiKey to the user's MCP config under the chieflab\nserver entry. Common locations:\n Cursor: ~/.cursor/mcp.json\n Claude Code: ~/.claude.json (or .claude/mcp.json in the project)\n Claude Desktop: ~/Library/Application Support/Claude/claude_desktop_config.json\n %APPDATA%/Claude/claude_desktop_config.json (Windows)\n Codex: ~/.codex/config.json\n\nAfter writing, ask the user to restart their runtime once. Then re-call\npriorTool with priorArgs.\n\nFALLBACK: only if you cannot write to the user's filesystem, surface\nthe deliveryUrl. They click once, see the key on /keys, paste into the\nMCP config manually, restart, then ask you to continue.\n\n═══════════════════════════════════════════════════════════════════════\nRECOVERY SHAPE (every recoverable failure returns this)\n═══════════════════════════════════════════════════════════════════════\n\n { ok: false, reason, summaryForUser, userMessage, fixActionForAgent,\n recoveryTool: { name, args }, retryable, stopRule }\n\nReasons: missing_api_key · missing_connector · requires_approval ·\nmissing_repo_context · missing_credits · workspace_not_found ·\nconnector_failed · measurement_unavailable · invalid_action_id ·\nwrong_workspace · rate_limited · provider_not_live.\n\nRecovery docs: https://chieflab.io/docs/recovery\n\nIf retryable=true and recoveryTool != null → call the recovery tool then\nre-attempt. If retryable=false → STOP and surface userMessage.\n\n═══════════════════════════════════════════════════════════════════════\nHARD STOP RULES\n═══════════════════════════════════════════════════════════════════════\n\n- After chiefmo_launch_product returns reviewUrl → STOP. Surface it. Wait.\n- After requires_approval → STOP. Surface reviewUrl. Do not retry the publish/send.\n- After missing_connector → surface the connect link OR offer manual fallback.\n- Never call chiefmo_publish_approved_post or chiefmo_send_approved_email\n without an approved actionId. The server-side gate will reject premature\n calls; this rule keeps the agent flow clean.\n\n═══════════════════════════════════════════════════════════════════════\nTOOL TIERS (do not call non-primary tools first)\n═══════════════════════════════════════════════════════════════════════\n\nPRIMARY (call first): chiefmo_launch_product,\n chieflab_get_users_after_build\nNO-KEY RECOVERY: chieflab_signup_workspace\nAFTER APPROVAL: chiefmo_publish_approved_post,\n chiefmo_send_approved_email\nAFTER 24h: chiefmo_post_launch_review\n (chiefmo_measure_launch_results = alias)\nAFTER MEASUREMENT (optional): chiefmo_prepare_next_move\nRECOVERY: chieflab_connect_provider,\n chieflab_use_manual_fallback,\n chieflab_record_manual_publish,\n chieflab_get_connect_action,\n chieflab_retry_blocked_action\nADVANCED (do NOT call first): chiefmo_diagnose_marketing,\n chiefmo_gtm_run_start (multi-agent),\n chiefmo_create_run, all per-skill tools\n\nDO NOT use chiefmo_diagnose_marketing for first-time launches — that's\nfor diagnosing EXISTING marketing programs. Use chiefmo_launch_product.", "tools": [ { "description": "[chieflab_* alias of chiefmo_approve_action] Approve one ChiefMO publish/send action so its executor can fire. USE WHEN the user — in IDE chat — said 'approve <channel>' (e.g. 'approve linkedin', 'approve hn'), 'approve all', 'ship it', 'go ahead', or otherwise greenlit a specific draft you rendered. Match the user's words to the channel, look up agentGuide.renderInChat[channel].actionId from the launch response, and call this tool with that actionId. This is the IDE-native approval path — no need to push the user to the reviewUrl. Pass `actionId` (preferred) or `id` (legacy alias). P74: pass `autoExecute: true` AND the connector inputs (`platforms` for social / `recipients` + `subject` for email) to have the approval chain directly into execution — approve and ship in one tool call. Without autoExecute (or when connector is manual_handoff / blocked), the response includes executionPlan and the caller is expected to invoke the suggestedTool next.", "inputSchema": { "properties": { "actionId": { "description": "The action id from publishActions[].id in a launch_product response. Preferred.", "type": "string" }, "autoExecute": { "description": "P74. When true AND the action's executionMatrix.mode is oauth_connector / api_key_connector / native_api AND the connector is ready, the approve handler immediately invokes chieflab_execute_approved_action with the inputs you supply. The response includes the executor result + the unified proof ledger. Defaults to false (preserves the prior contract — agent calls execute_approved_action explicitly).", "type": "boolean" }, "id": { "description": "Legacy alias for actionId.", "type": "string" }, "mediaUrls": { "description": "P74. Optional media URLs for the social post — auto-uploaded to Zernio's CDN before publishing.", "items": { "type": "string" }, "type": "array" }, "platforms": { "description": "P74. For autoExecute on social channels: Zernio platform descriptors, e.g. [{platform: 'linkedin', accountId: '<id>'}]. Required when autoExecute=true and mode=oauth_connector.", "items": { "type": "object" }, "type": "array" }, "recipients": { "description": "P74. For autoExecute on email: recipient email addresses.", "items": { "type": "string" }, "type": "array" }, "subject": { "description": "P74. For autoExecute on email: subject line override.", "type": "string" } }, "type": "object" }, "name": "chieflab_approve_action", "outputSchema": null }, { "description": "Alias of chieflab_status. Use as the FIRST tool when an agent session starts on a workspace that already has activity — recovers all open business loops with literal user commands. Same response shape as chieflab_status, same handler. If the user asked to launch the current repo and a recovered open loop looks unrelated, do not blindly resume it; start a fresh launch for the current repo.", "inputSchema": { "properties": { "currentRepoContext": { "description": "Optional current repo/project context. Helps agents compare recovered loops against the project the user is asking about.", "type": "object" }, "projectName": { "description": "Optional current project/repo name.", "type": "string" }, "workspaceId": { "description": "Optional workspace id.", "type": "string" } }, "type": "object" }, "name": "chieflab_boot", "outputSchema": null }, { "description": "USE WHEN the user asks 'what do you remember about my brand?' / 'show me my brain' / 'what have you learned?'. Returns a plain-English paragraph summarizing what the per-workspace brain has accumulated: launch count, top-performing channels, brand voice patterns from approved drafts, what's been rejected and why, channel-specific performance, recent proof points. The moat made visible. Pair with chieflab_brain_read for the raw structured data.", "inputSchema": { "properties": { "tenantId": { "description": "Optional tenant scope.", "type": "string" }, "workspaceId": { "type": "string" } }, "type": "object" }, "name": "chieflab_brain_summary", "outputSchema": null }, { "description": "P71 — measurement queue inspector. USE WHEN the agent wants to know which executed actions are ready for their 24h readback (regardless of how they were executed — native connector OR manual paste). Lists actions where metadata.proof.measurementDueAt <= now AND metadata.proof.measuredAt is unset. Returns: [{actionId, runId, channel, executedAt, measurementDueAt, artifactUrl, executionStatus, recommendedNextTool}]. Pairs with chiefmo_post_launch_review which the cron also calls automatically; this tool surfaces the same queue to a foreground agent so it can opportunistically pull metrics during a session instead of waiting for the next cron tick.", "inputSchema": { "properties": { "runId": { "description": "Optional. Restrict to one run.", "type": "string" }, "workspaceId": { "description": "Optional workspace id.", "type": "string" } }, "type": "object" }, "name": "chieflab_check_measurement_due", "outputSchema": null }, { "description": "Connect a third-party provider (Zernio, Resend, GA4, Search Console, HubSpot, Stripe, Linear, Notion, Slack) to this workspace. USE WHEN the user wants to wire up publishing, email sending, or analytics readback. For OAuth providers (ga4 / search_console / hubspot) returns an authorizeUrl the agent surfaces to the user. For API-key providers (zernio / resend) returns instructions for the set-key tool. Without this, publish/send/measure tools return 'configure first' errors.", "inputSchema": { "properties": { "provider": { "description": "Provider id: zernio | resend | ga4 | search_console | hubspot | stripe | linear | notion | slack", "type": "string" } }, "required": [ "provider" ], "type": "object" }, "name": "chieflab_connect_provider", "outputSchema": null }, { "description": "USE WHEN the user just completed a connector OAuth flow and you want to confirm it succeeded — 'did my connection work?', 'is my Zernio/HubSpot/Stripe connected?'. Returns status: pending | connected | failed for the given connectionId.", "inputSchema": { "properties": { "connectionId": { "type": "string" }, "workspaceId": { "type": "string" } }, "required": [ "connectionId" ], "type": "object" }, "name": "chieflab_connector_status", "outputSchema": null }, { "description": "[chieflab_* alias of chiefmo_continue_launch_loop] Resume a ChiefLab launch loop from runId. USE WHEN an agent has already called chieflab_get_users_after_build / chiefmo_launch_product and needs the exact next action: surface reviewUrl, execute an approved action, wait for measurement, measure results, or prepare the next move. Default response is summary-sized: reviewUrl + action ids, not full draft bodies. Pass responseShape:\"full\" only for debug/export.", "inputSchema": { "properties": { "includeFullArtifacts": { "description": "Alias for responseShape:\"full\". Use only for debug/export.", "type": "boolean" }, "responseShape": { "description": "summary (default, small — returns reviewUrl + openApprovalIds without draft bodies) | full (inline full approval objects; large, debug/export only).", "type": "string" }, "runId": { "description": "The launchId/runId returned by chieflab_get_users_after_build or chiefmo_launch_product.", "type": "string" }, "workspaceId": { "description": "Optional workspace id. Hosted auth usually supplies this.", "type": "string" } }, "required": [ "runId" ], "type": "object" }, "name": "chieflab_continue_launch_loop", "outputSchema": null }, { "description": "P75 — turn a Next Move suggestion into an approval-gated draft action. USE WHEN you've called chieflab_suggest_next_move and the suggestion's kind is not 'wait' or 'noop'. Creates an actionStore entry with status='awaiting_approval', the suggested draft body inline, and an executionMatrix that points at the right next-execution path. The reviewer sees the new card in the Launch Room / IDE chat like any other approval card — same approve / revise / reject flow. Closes the loop: launch → measure → next move → approve → execute → repeat.", "inputSchema": { "properties": { "channel": { "description": "Channel the measurement was for (used to ground the suggestion).", "type": "string" }, "metrics": { "description": "Same metrics object passed to chieflab_suggest_next_move.", "type": "object" }, "runId": { "description": "Required. The originating run id (the next-move action is tagged with this so the brain can compound launch → measure → next-move chains).", "type": "string" }, "workspaceId": { "description": "Optional workspace id.", "type": "string" } }, "required": [ "runId", "channel", "metrics" ], "type": "object" }, "name": "chieflab_create_next_move_action", "outputSchema": null }, { "description": "USE WHEN your operator hits a gap it can't fulfill itself and wants to route the work to another operator — 'I need a demo video for this launch', 'request design help for the hero image'. Creates an open work request that other operators can offer against. Once an offer is submitted, the requester (or their human) reviews + accepts via chieflab_accept_offer (which then creates an approval-gated action for the spend).", "inputSchema": { "properties": { "brief": { "description": "Structured brief — { goal, references, constraints, asset_links, etc. }. The more specific, the better the offers.", "type": "object" }, "budget": { "description": "Optional. { kind: 'max_usd', amount: 50 } | { kind: 'quote' } | { kind: 'free' }.", "type": "object" }, "capabilityNeeded": { "description": "Capability slug to match (e.g. 'demo_video'). Should match a published capability — call chieflab_search_capabilities first if unsure.", "type": "string" }, "deadline": { "description": "Optional ISO 8601 timestamp.", "type": "string" }, "sourceOperatorId": { "description": "Optional. The operatorId that's requesting (e.g. 'chieflab-launch').", "type": "string" }, "sourceRunId": { "description": "Optional. The parent runId this work attaches to (e.g. the launch that needs the asset).", "type": "string" }, "workspaceId": { "type": "string" } }, "required": [ "capabilityNeeded" ], "type": "object" }, "name": "chieflab_create_work_request", "outputSchema": null }, { "description": "P71 — closed-loop executor wrapper. USE WHEN chiefmo_approve_action just succeeded on an action whose executionMatrix.mode is oauth_connector or api_key_connector AND connectorReady is true. Routes to the right native executor (chiefmo_publish_approved_post for social / chiefmo_send_approved_email for email), runs the execute-time sanity gate (re-classifies the action's stored body to catch DEGRADED MODE / clarification / refusal text that slipped through draft-time classification), captures the executor's result, writes a standardized metadata.proof shape ({executedAt, artifactUrl, artifactId, executionStatus, failureReason, measurementDueAt}) on the action, and schedules the 24h followup via launchFollowupStore so chiefmo_post_launch_review fires automatically. Returns a uniform shape regardless of channel so the agent / Launch Room doesn't have to branch on connector type. For manual_handoff actions, returns guidance to call chieflab_record_manual_publish with the live URL instead. For blocked actions, returns the connector-wiring instruction.", "inputSchema": { "properties": { "actionId": { "description": "The publishAction.id whose executionMatrix you want to execute. The action must be in status='approved' (call chiefmo_approve_action first).", "type": "string" }, "mediaUrls": { "description": "Optional media URLs (image / video) for social posts. Zernio uploads them to its CDN before posting.", "items": { "type": "string" }, "type": "array" }, "platforms": { "description": "For oauth_connector (social): Zernio platform descriptors, e.g. [{platform: 'linkedin', accountId: '<id>'}]. Required for social posts unless the workspace has a default mapping; the tool refuses with reason='platforms_required' otherwise.", "items": { "type": "object" }, "type": "array" }, "recipients": { "description": "For api_key_connector (email): recipient email addresses. Required for email sends unless the action carries a stored recipient list.", "items": { "type": "string" }, "type": "array" }, "subject": { "description": "For email sends: subject line override. Defaults to the action's stored subject when present.", "type": "string" }, "workspaceId": { "description": "Optional workspace id.", "type": "string" } }, "required": [ "actionId" ], "type": "object" }, "name": "chieflab_execute_approved_action", "outputSchema": null }, { "description": "P93 — admin escape hatch. Forces a proof_ledger row's measurement_due_at into the past so the cron's next tick picks it up. USE WHEN smoke testing the launch → measure → next-move chain without waiting 24h, OR an ops user needs to retry a stuck measurement. Gated by CHIEFLAB_ADMIN_TOKEN header (same gate as /api-keys/issue). Refuses if the row is already measured. Pass `dueAt` (ISO string) to set a specific time; defaults to now - 60s.", "inputSchema": { "properties": { "adminToken": { "description": "Required. Must match CHIEFLAB_ADMIN_TOKEN env var.", "type": "string" }, "dueAt": { "description": "Optional ISO timestamp. Defaults to (now - 60s) so the next cron tick picks it up.", "type": "string" }, "proofId": { "description": "proof_ledger row id (from chieflab_record_manual_publish or chieflab_execute_approved_action response).", "type": "string" } }, "required": [ "proofId", "adminToken" ], "type": "object" }, "name": "chieflab_force_measurement_due", "outputSchema": null }, { "description": "USE WHEN you have a specific operatorId + capability and want the full machine-readable profile (inputs, outputs, pricing, approval-required flag, endpoint). Pre-flight check before chieflab_create_work_request.", "inputSchema": { "properties": { "capability": { "type": "string" }, "operatorId": { "type": "string" } }, "required": [ "operatorId", "capability" ], "type": "object" }, "name": "chieflab_get_capability", "outputSchema": null }, { "description": "P88 — read the workspace's stored company profile. Returns { profile, source, confidence, updated_at }. Use before launch to confirm what ChiefLab will ground in.", "inputSchema": { "properties": { "workspaceId": { "description": "Optional workspace id.", "type": "string" } }, "type": "object" }, "name": "chieflab_get_company_profile", "outputSchema": null }, { "description": "P79 — read the workspace's stored publishing target defaults. Returns { channelTargets, store }. Useful before launch so the agent can surface 'You haven't connected an Instagram account yet — set it via chieflab_set_publishing_targets' instead of blocking on first auto-execute.", "inputSchema": { "properties": { "workspaceId": { "description": "Optional workspace id.", "type": "string" } }, "type": "object" }, "name": "chieflab_get_publishing_targets", "outputSchema": null }, { "description": "Outcome-named alias for chiefmo_launch_product. USE WHEN a coding agent just built, shipped, or deployed something and the user asks 'get users', 'find customers', 'make money from this', 'get paying users', 'get eyes on this', 'what now?', or 'how do I launch this?' This is the agent-dependency tool: after build, call this to turn the product into a repo-grounded money/distribution loop with launchPack, signed reviewUrl, approval-gated publish/send actions, 24h measurement, memory, next move, moneyLoop, and agentDependency. Gather repoContext first. Route exactly like chiefmo_launch_product; do not use chiefmo_diagnose_marketing for a new product.", "inputSchema": { "properties": { "brand": { "description": "Optional inline brand context.", "type": "object" }, "channels": { "description": "Optional launch channels. Default is auto-selected from the detected product playbook — service agencies skip Product Hunt; B2B SaaS / devtools / consumer / AI-agent products include it; internal tools default to email + landing only. Pass an explicit subset to override.", "items": { "type": "string" }, "type": "array" }, "goal": { "description": "Desired outcome, e.g. 'Get first 100 users', 'find paying customers', 'get design partners', 'make money from this'.", "type": "string" }, "idempotencyKey": { "description": "Optional dedupe key to prevent duplicate launch preparation.", "type": "string" }, "includeFullArtifacts": { "description": "Alias for responseShape:\"full\". Backward-compat with older P29 clients.", "type": "boolean" }, "outputMode": { "description": "context | draft | full | demo. 'demo' is the first-use / YC-demo concise mode — forces 4 punch-list channels (linkedin / x / product_hunt / email), draft rendering, no image gen, scrubbed inline drafts. Defaults to context/draft behavior from chiefmo_launch_product.", "type": "string" }, "productDescription": { "description": "Short product description if no public URL exists yet.", "type": "string" }, "productUrl": { "description": "Live product URL. Pass either productUrl or productDescription.", "type": "string" }, "repoContext": { "description": "Strongly recommended. Include whatChanged, recentCommits, changedFiles, routes, readme, targetCustomer, launchGoal.", "type": "object" }, "responseShape": { "description": "summary (default, smallest — promotes launchId / launchRoomUrl / publishActionIds / firstResponseScript; per-channel draft bodies live behind the reviewUrl) | compact (per-channel previews + truncated draft bodies inline) | full (everything inline; debug/export only — large).", "type": "string" }, "tenantId": { "description": "Optional tenant/end-user id for stored brand context and memory.", "type": "string" } }, "type": "object" }, "name": "chieflab_get_users_after_build", "outputSchema": null }, { "description": "FIRST TOOL — call before anything else when you don't know what ChiefLab does or where to start. Returns the operator menu + workspace state (connectors wired, last run, signup status) + the single next action for this workspace. Cheap, no side effects. After this, call chieflab_launch_product for a full launch or chieflab_post for a single channel.", "inputSchema": { "properties": {}, "type": "object" }, "name": "chieflab_help", "outputSchema": null }, { "description": "USE WHEN the user asks 'what came in from my launches?' / 'show me my replies' / 'what's in my inbox?' / 'who responded to the LinkedIn post?'. Returns engagement events for THIS workspace, ordered by recency. Filter by status (new / drafted / approved / sent / dismissed) — default new. Pair with chieflab_draft_reply to handle them.", "inputSchema": { "properties": { "limit": { "description": "Max events to return. Default 50.", "type": "number" }, "sinceHours": { "description": "Only events received in the last N hours. Default 168 (7 days). Max 720 (30 days).", "type": "number" }, "status": { "description": "new | drafted | approved | sent | dismissed | all (default: new)", "type": "string" }, "workspaceId": { "type": "string" } }, "type": "object" }, "name": "chieflab_inbox", "outputSchema": null }, { "description": "Operator: chieflab-launch (primary). Spec v0.1 reference implementation of the orchestrator. End-to-end launch loop: repo-grounded positioning + per-channel drafts (linkedin, x, hn, reddit, email, landing_hero, product_hunt) + image briefs + approval-gated publishActions + signed reviewUrl + 24h measurement queue. Internally composes chieflab-post + chieflab-email under one runId. Spec-renamed alias of chiefmo_launch_product (backwards-compat retained).", "inputSchema": { "properties": { "brand": { "type": "object" }, "channels": { "items": { "type": "string" }, "type": "array" }, "goal": { "type": "string" }, "idempotencyKey": { "type": "string" }, "imagesNeeded": { "type": "number" }, "productUrl": { "type": "string" }, "repoContext": { "type": "object" }, "tenantId": { "type": "string" }, "webhookUrl": { "type": "string" }, "workspaceId": { "type": "string" } }, "type": "object" }, "name": "chieflab_launch_product", "outputSchema": null }, { "description": "P87 — list the specialist agents ChiefLab can delegate to (design / video / research / outreach / seo / analytics). USE WHEN the user asks 'what can ChiefLab do beyond launch posts?' or before calling chieflab_request_specialist. Returns the kind + label for each so the caller can pick the right one.", "inputSchema": { "properties": {}, "type": "object" }, "name": "chieflab_list_specialists", "outputSchema": null }, { "description": "P135 — mark a next-move action as completed when the founder has done the move BUT there's no URL to record (e.g. reply_to_commenters, dm_engagers, mark replies done). Flips the action to executed with metadata.markedManuallyAt + metadata.executedManually=true. The next-move card disappears from /command/'s Today's Loop. For moves that DO have a URL (cross-post, new post), use chieflab_record_manual_publish instead — it both records the URL and marks executed.", "inputSchema": { "properties": { "actionId": { "description": "The next-move action id.", "type": "string" }, "note": { "description": "Optional founder note about what was done. Stored in metadata.markedManuallyNote for the brain to read later.", "type": "string" }, "workspaceId": { "description": "Optional workspace id.", "type": "string" } }, "required": [ "actionId" ], "type": "object" }, "name": "chieflab_mark_action_done", "outputSchema": null }, { "description": "P109 — pull a Hacker News post's score + comments + top replies via the public HN API and write them to the action's metadata.proof. USE WHEN a published Hacker News action is ripe for 24h measurement (checks the publishedUrl on the action, parses the item id, calls the Firebase API). Auto-creates a next-move action based on the outcome (trending → reply + cross-post; engaged → reply; stalled → rewrite angle). Idempotent — second call returns the existing measurement. No API key required; HN is public-read.", "inputSchema": { "properties": { "actionId": { "description": "The action id whose publishedUrl points at the HN post. Required.", "type": "string" }, "force": { "description": "Re-measure even if metadata.proof.measuredAt is already set. Default false.", "type": "boolean" }, "workspaceId": { "description": "Optional workspace id.", "type": "string" } }, "required": [ "actionId" ], "type": "object" }, "name": "chieflab_measure_hacker_news", "outputSchema": null }, { "description": "P115 — pull a Reddit post's score + comments + upvote ratio + top replies via the public Reddit JSON API and write them to the action's metadata.proof. USE WHEN a published Reddit action is ripe for 24h measurement. Parses subreddit + post id from the publishedUrl, calls https://www.reddit.com/r/<sub>/comments/<id>.json (no auth), auto-creates next-move actions based on the outcome (trending → reply + cross-post; engaged → reply; downvoted → rewrite angle). Idempotent — second call returns existing measurement unless force:true.", "inputSchema": { "properties": { "actionId": { "description": "The action id whose publishedUrl points at the Reddit post. Required.", "type": "string" }, "force": { "description": "Re-measure even if metadata.proof.measuredAt is already set. Default false.", "type": "boolean" }, "workspaceId": { "description": "Optional workspace id.", "type": "string" } }, "required": [ "actionId" ], "type": "object" }, "name": "chieflab_measure_reddit", "outputSchema": null }, { "description": "P91 — verify the persistent stores. Probes proof_ledger / publishing_targets / company_profiles tables (Supabase) OR confirms the in-memory fallback. USE WHEN the user just ran the SQL migrations and wants to confirm the API is now using durable storage; OR before a real founder launch to make sure data won't evaporate on cold start; OR when debugging why a previously-stored target / profile disappeared. Returns per-store: { kind: 'supabase'|'in_memory', durable: bool, tableExists?: bool, sampleQueryOk: bool, rowCount?: number, error?, warning? }. The 'tableExists: false' case means the SQL migration has NOT been run.", "inputSchema": { "properties": { "workspaceId": { "type": "string" } }, "type": "object" }, "name": "chieflab_persistence_health", "outputSchema": null }, { "description": "[chieflab_* alias of chiefmo_post_launch_review] USE WHEN ≥24h has passed since chiefmo_publish_approved_post fired and the user asks 'how did the launch perform?', 'what worked?', 'metrics from my launch'. Closes the loop: pulls 24h+ engagement (likes / comments / views / shares / follower delta) for posts in the launch run + recommends next iteration (rewrite, refresh creative, double down, pause). Returns per-account analytics + top posts + best-time-to-post + a structured next-move recommendation brief.", "inputSchema": { "properties": { "accountIds": { "description": "Optional. Specific Zernio accountIds to pull analytics for. Defaults to all accounts that posted in this launch.", "items": { "type": "string" }, "type": "array" }, "lookbackDays": { "description": "How many days of history to consider (default 7, max 90).", "type": "number" }, "outputMode": { "description": "\"context\" (default): returns metrics + a brief your LLM renders into the customer-facing recommendation. \"full\": ChiefLab generates the recommendation server-side.", "type": "string" }, "runId": { "description": "The launchId returned by chiefmo_launch_product. Used to scope analytics to posts from that launch.", "type": "string" } }, "required": [ "runId" ], "type": "object" }, "name": "chieflab_post_launch_review", "outputSchema": null }, { "description": "[chieflab_* alias of chiefmo_prepare_next_move] USE WHEN the user has just published a launch (or ≥24h post-launch) and asks 'what's next?', 'follow-up post?', 'iterate on this', 'plan day 2'. P13 — turns one launch into a 7-day launch mode: drafts a queue of follow-up actions (day 2 reply post, day 3 case study, day 5 metrics share, day 7 retrospective) grounded in the prior launch's runId, the per-tenant brand voice + repo facts + channel performance from the P9 company brain, and the prior recommendation (so the next move doesn't repeat the last one). Returns a draft queue + signed reviewUrl + the standard agentGuide block. Each next-move action lands in awaiting_approval; nothing fires without explicit human approval.", "inputSchema": { "properties": { "channels": { "description": "Optional. Restrict next-moves to these channels. Defaults to the channels of the prior launch.", "items": { "type": "string" }, "type": "array" }, "horizon": { "description": "\"day_2\" | \"day_3\" | \"week\" — how far to plan. Default: \"week\" (7-day mode).", "type": "string" }, "runId": { "description": "The prior launchId returned by chiefmo_launch_product. The prepared queue grounds in this run's measurement + memory.", "type": "string" }, "workspaceId": { "description": "Optional workspace id.", "type": "string" } }, "required": [ "runId" ], "type": "object" }, "name": "chieflab_prepare_next_move", "outputSchema": null }, { "description": "[chieflab_* alias of chiefmo_publish_approved_post] Publish an approved social post (LinkedIn / X / Threads / Instagram / Facebook / Bluesky / TikTok) through the social publishing rail (current adapter: zernio). USE WHEN the user has approved a publishAction from chiefmo_launch_product on the reviewUrl and you need to fire the post. Strict approval gate: returns { reason: 'requires_approval', reviewUrl } if the action isn't approved yet. Once executed, returns the live platform post URL. Money/external-system action — never call this without an approved actionId.", "inputSchema": { "properties": { "actionId": { "description": "The publishAction.id from chiefmo_launch_product. Required.", "type": "string" }, "content": { "description": "The final rendered post text (your LLM rendered this from the brief in the launch pack).", "type": "string" }, "mediaUrls": { "description": "Optional. Image/video URLs (or base64 data URLs from launch graphics).", "items": { "type": "string" }, "type": "array" }, "platforms": { "description": "Which platforms + Zernio accountIds to publish to. Get accountIds from chieflab_list_publish_accounts.", "items": { "properties": { "accountId": { "type": "string" }, "platform": { "type": "string" } }, "type": "object" }, "type": "array" }, "scheduleAt": { "description": "Optional ISO 8601. Schedule for later instead of immediate.", "type": "string" } }, "required": [ "actionId", "content", "platforms" ], "type": "object" }, "name": "chieflab_publish_approved_post", "outputSchema": null }, { "description": "P80 — query the persistent proof ledger. USE WHEN the user (or a dashboard) asks 'what has ChiefLab actually shipped for this workspace?' or 'show me the launch history.' Returns the proof rows for executed publishes / sends / manual-posts with the artifact URLs, channels, execution modes, and measurement state. Persistent across cold starts when deps.proofLedgerStore is wired to Supabase; falls back to in-memory (warm function lifetime) otherwise.", "inputSchema": { "properties": { "limit": { "description": "Page size (1-500, default 50).", "type": "number" }, "measurementDueOnly": { "description": "When true, returns only rows with measurement_due_at <= now AND measured_at IS NULL. Use this to find what's ready for 24h readback.", "type": "boolean" }, "runId": { "description": "Optional. Filter to one run's proofs.", "type": "string" }, "sinceTimestamp": { "description": "Optional ISO timestamp; only return proofs published at or after.", "type": "string" }, "workspaceId": { "description": "Optional workspace id (defaults to auth workspace).", "type": "string" } }, "type": "object" }, "name": "chieflab_query_proof_ledger", "outputSchema": null }, { "description": "P116 — paste-what-you-see metric fallback for channels without public-API measurement (X, LinkedIn, Email, landing pages, Product Hunt). USE WHEN a published action's channel doesn't have a public-JSON metrics endpoint (anything except hacker_news / reddit) AND the founder is ready to paste the visible numbers. Reads metadata.proof.artifactUrl to confirm the post is recorded, writes the provided metrics into metadata.proof.metrics + measuredAt, auto-classifies the outcome (channel-specific thresholds: X needs likes/replies, LinkedIn needs reactions/comments, Email needs opens/clicks/replies, etc.), and creates next-move actions just like the auto-measurement path. Returns the metric schema for the channel so callers can render the right form fields.", "inputSchema": { "properties": { "actionId": { "description": "The action id to attach metrics to.", "type": "string" }, "force": { "description": "Re-record even if metadata.proof.measuredAt is already set. Default false.", "type": "boolean" }, "metrics": { "description": "Free-form metrics map. Channel-specific keys: x → {impressions, likes, replies, retweets, clicks}; linkedin → {impressions, reactions, comments, reposts, clicks}; email → {sent, opens, clicks, replies, unsubscribes}; landing_hero → {sessions, signups, avg_time_seconds, bounce_rate_pct}; product_hunt → {upvotes, comments, rank}. Call without metrics to just retrieve the schema for the action's channel.", "type": "object" }, "workspaceId": { "description": "Optional workspace id.", "type": "string" } }, "required": [ "actionId" ], "type": "object" }, "name": "chieflab_record_manual_metrics", "outputSchema": null }, { "description": "USE WHEN the user has manually posted to a channel returned by chieflab_use_manual_fallback (Product Hunt / HN / Reddit / Discord / etc.) and wants to feed the live URL back to ChiefLab so the closed loop continues. Records the URL on the original publishAction (status flips from 'approved' to 'executed' with metadata.executedManually=true + metadata.publishedUrl), persists a proof_asset to the P9 company brain, and queues 24-hour metrics readback via chiefmo_post_launch_review. Without this tool, manually-posted channels are lost to ChiefLab's measurement loop.", "inputSchema": { "properties": { "actionId": { "description": "The publishAction.id that the user manually published (from chieflab_use_manual_fallback). Required.", "type": "string" }, "notes": { "description": "Optional. Any context on how the post performed in the first hour (early upvotes, top comment, reactions). Persists into the P9 brain.", "type": "string" }, "publishedAt": { "description": "Optional ISO 8601 timestamp. Defaults to now.", "type": "string" }, "publishedUrl": { "description": "The live URL of the manual post (e.g. producthunt.com/posts/<slug>, news.ycombinator.com/item?id=<id>, reddit.com/r/SaaS/comments/<id>).", "type": "string" }, "workspaceId": { "description": "Optional workspace id.", "type": "string" } }, "required": [ "actionId", "publishedUrl" ], "type": "object" }, "name": "chieflab_record_manual_publish", "outputSchema": null }, { "description": "USE WHEN the user says 'make this more casual' / 'shorter' / 'less salesy' / 'add a specific number' / 'redraft this' about a published draft. Pulls the existing brief for the actionId, merges the instruction, returns an updated brief your LLM should render. After rendering call chieflab_record_rendered_copy({ assetId, body }) to commit. Multi-turn flow stays coherent: each redraft increments action.metadata.revision; original brief preserved in metadata.history.", "inputSchema": { "properties": { "actionId": { "description": "The publishAction.id from chiefmo_launch_product.", "type": "string" }, "body": { "description": "Optional. If your LLM already rendered the redrafted body, pass it here and ChiefLab updates the action's brief directly.", "type": "string" }, "instruction": { "description": "Plain-English instruction. 'shorter', 'more casual', 'add the $40 number from our pricing page', etc.", "type": "string" }, "workspaceId": { "type": "string" } }, "required": [ "actionId", "instruction" ], "type": "object" }, "name": "chieflab_redraft", "outputSchema": null }, { "description": "P72 — regenerate a single visual asset (LinkedIn graphic, X graphic, landing hero, etc.) with a different style / fidelity / headline / model. USE WHEN a reviewer hits 'Regenerate' on a launch image in the Launch Room. Reads the original launch's brief from the run metadata, calls produceVisualAsset with the new parameters, and returns the updated asset shape (assetId, dataUrl, dimensions, prompt, mode). Does NOT auto-persist back to the run — caller decides whether to swap the asset in place (via runStore) or treat the regen as a parallel candidate.", "inputSchema": { "properties": { "assetId": { "description": "Optional original assetId — when present, the regenerated asset reuses the id so the run viewer can swap in place.", "type": "string" }, "brandColors": { "description": "Optional {primary, accent, bg, text} hex override.", "type": "object" }, "channel": { "description": "Channel the asset is for (linkedin / x / email / landing_hero / etc.).", "type": "string" }, "cta": { "description": "Override the CTA text.", "type": "string" }, "fidelity": { "description": "on_brand | polished | experimental. Defaults to 'on_brand'.", "type": "string" }, "headline": { "description": "Override the headline rendered into the image.", "type": "string" }, "model": { "description": "gemini-2.5-flash-image | gemini-3-pro-image-preview. Caller override; defaults to the model the brief's fidelity selects.", "type": "string" }, "runId": { "description": "Launch run id that produced the original asset. Used to look up the LaunchIntelligenceBrief stored on the run.", "type": "string" }, "seed": { "description": "Optional seed string for deterministic layout-hint picking.", "type": "string" }, "style": { "description": "clean | bold | editorial | playful. Defaults to 'editorial'.", "type": "string" }, "subheadline": { "description": "Override the subheadline.", "type": "string" }, "workspaceId": { "description": "Optional workspace id.", "type": "string" } }, "required": [ "runId", "channel" ], "type": "object" }, "name": "chieflab_regenerate_visual_asset", "outputSchema": null }, { "description": "P87 — delegate to a specialist agent. USE WHEN the launch needs more than copy: a graphic brief (kind='design'), a demo video shot list (kind='video'), a prospective-customer research plan (kind='research'), personalized outreach drafts (kind='outreach'), landing-page SEO recommendations (kind='seo'), or a verdict + recommended next move from measurement data (kind='analytics'). Specialists are deterministic stubs today — they return structured briefs / plans / drafts the founder can act on immediately. Future LLM-backed implementations swap in transparently. Each request creates an approval-gated action so the brief lands in the Launch Room. Pass runId for grounding in the originating launch's intelligence brief.", "inputSchema": { "properties": { "autoCreateAction": { "description": "Default true. When true, creates an approval-gated action in actionStore so the brief lands in the Launch Room. When false, returns the specialist output without persistence (use for one-off / preview).", "type": "boolean" }, "brief": { "description": "kind-specific brief fields (asset/channel for design; durationSeconds/platform for video; goal for research; contacts/channel for outreach; url/targetTerms for seo; metrics/channel for analytics)", "type": "object" }, "kind": { "description": "design | video | research | outreach | seo | analytics", "type": "string" }, "runId": { "description": "Optional. Source run id; the specialist grounds in that launch's brief (productName / audience / market / positioning).", "type": "string" }, "workspaceId": { "description": "Optional workspace id.", "type": "string" } }, "required": [ "kind" ], "type": "object" }, "name": "chieflab_request_specialist", "outputSchema": null }, { "description": "P13 — re-check a blocked publishAction's connector readiness. Returns whether the channel is now ready (so the agent can re-fire chiefmo_publish_approved_post / chiefmo_send_approved_email) or still blocked with the up-to-date connect path. USE WHEN the user has just connected a missing provider and the agent needs to know if the action can fire.", "inputSchema": { "properties": { "actionId": { "description": "The blocked publishAction.id from chiefmo_launch_product.", "type": "string" }, "workspaceId": { "type": "string" } }, "required": [ "actionId" ], "type": "object" }, "name": "chieflab_retry_blocked_action", "outputSchema": null }, { "description": "P104 — approve or reject a single visual asset (LinkedIn graphic / X image / landing hero / Product Hunt gallery / carousel slide). USE WHEN a reviewer hits 'Approve' or 'Reject' on a launch image in the Launch Room. Reads the run's stored visualAssets list, updates the matching asset's status (approved | rejected | pending_approval), persists the change to run metadata so future loads + the channel-media render reflect the decision. Companion to chieflab_regenerate_visual_asset (which produces an updated asset shape without persisting).", "inputSchema": { "properties": { "assetId": { "description": "The visual asset id from launchPack.channels[channel].media[*].assetId.", "type": "string" }, "decision": { "description": "approve | reject. Updates the asset's status field.", "enum": [ "approve", "reject" ], "type": "string" }, "reason": { "description": "Optional. Why rejected (or why approved). Stored in metadata for audit + future brain memory.", "type": "string" }, "runId": { "description": "Launch run id that produced the asset.", "type": "string" }, "workspaceId": { "description": "Optional workspace id.", "type": "string" } }, "required": [ "runId", "assetId", "decision" ], "type": "object" }, "name": "chieflab_review_visual_asset", "outputSchema": null }, { "description": "USE WHEN your operator needs a capability outside its own scope and wants to find another operator that can fulfill it — 'find me a demo-video capability', 'who can do SEO audits', 'search for design help'. Returns active capability records ranked by recency. Pair with chieflab_create_work_request to actually request bounded work from the chosen operator. The discovery embryo for an agent-native marketplace.", "inputSchema": { "properties": { "capability": { "description": "Capability slug to match (exact match — e.g. 'demo_video').", "type": "string" }, "limit": { "description": "Max results. Default 25.", "type": "number" }, "tags": { "description": "Tag overlap filter (e.g. ['video', 'demo']).", "items": { "type": "string" }, "type": "array" } }, "type": "object" }, "name": "chieflab_search_capabilities", "outputSchema": null }, { "description": "[chieflab_* alias of chiefmo_send_approved_email] Send an approved launch email through the email sending rail (current adapter: resend). USE WHEN the user has approved an email publishAction from chiefmo_launch_product and you need to fire the send. Strict approval gate (same shape as chiefmo_publish_approved_post). `from` MUST be on a domain verified at the adapter (resend.com) — check chieflab_list_email_senders first. Single recipient or short list (≤50). Money/external-system action — once sent cannot be unsent.", "inputSchema": { "properties": { "actionId": { "description": "The publishAction.id from chiefmo_launch_product. Required for the approval gate to fire.", "type": "string" }, "from": { "description": "Sender. Must be a verified Resend domain address (e.g. 'Brand <[email protected]>').", "type": "string" }, "html": { "description": "HTML body (preferred for inboxing).", "type": "string" }, "replyTo": { "description": "Optional reply-to address(es)." }, "subject": { "type": "string" }, "text": { "description": "Plain-text fallback (recommended).", "type": "string" }, "to": { "description": "Recipient(s). Single email or array (≤50)." } }, "required": [ "from", "to", "subject" ], "type": "object" }, "name": "chieflab_send_approved_email", "outputSchema": null }, { "description": "P88 — set the workspace's persistent company profile. ChiefLab's pre-P88 brief pipeline was repo-first; without a repo, launches landed thin. P88 lets the founder (or an agent) store the company / product facts ONCE and every subsequent launch grounds in them, even URL-only / paste-description launches. Pass partial maps to update specific fields; pass null for a field to remove it. Profile fields the brief consumes: companyName, productName, offer, audience, market, positioning, services[], productType, brandColors {primary, accent, bg, text}, websiteUrl, contactEmail, socialLinks[], keyClaims[], voiceSample.", "inputSchema": { "properties": { "confidence": { "description": "high | medium | low. Default 'medium'.", "type": "string" }, "profile": { "description": "Partial profile object — top-level keys merge, nested objects shallow-merge, null values remove.", "type": "object" }, "source": { "description": "manual | extracted | imported | autodetected. Default 'manual'.", "type": "string" }, "workspaceId": { "description": "Optional workspace id.", "type": "string" } }, "required": [ "profile" ], "type": "object" }, "name": "chieflab_set_company_profile", "outputSchema": null }, { "description": "Store a provider API key for THIS workspace. Once stored, ChiefLab uses your key (BYOK — you pay the provider directly, no markup). Without it, ChiefLab uses its own key and bills through with a margin. Providers: gemini (image gen), resend (email), zernio (social publish), anthropic (LLM, future), openai (LLM, future). Stored encrypted at rest. Use chieflab_revoke_provider_key to remove. The key never leaves this workspace.", "inputSchema": { "properties": { "apiKey": { "description": "The provider API key (e.g. for Gemini: a Google API key starting with AIza...).", "type": "string" }, "provider": { "description": "gemini | resend | zernio | anthropic | openai", "type": "string" }, "workspaceId": { "description": "Optional workspace id (defaults to your bearer's workspace).", "type": "string" } }, "required": [ "provider", "apiKey" ], "type": "object" }, "name": "chieflab_set_provider_key", "outputSchema": null }, { "description": "P79 — set per-workspace publishing target defaults so chiefmo_approve_action({ autoExecute: true }) doesn't need the agent to pass platform / recipient ids on every call. One-time setup per workspace. channelTargets is a map { linkedin: { accountId }, x: { accountId }, email: { fromEmail, recipientListId } }. Pass partial maps to update specific channels; pass `null` for a channel value to remove it. Persisted via deps.publishingTargetsStore when wired, otherwise in-process Map (Vercel function lifetime). Returns the merged channelTargets + storage location ('persistent' or 'in_memory').", "inputSchema": { "properties": { "channelTargets": { "description": "Map of channel → target. Examples: linkedin/x → { accountId: '<zernio_account_id>' }; email → { fromEmail: '[email protected]', recipientListId: '<list_id>' }. Pass null as a channel value to remove it.", "type": "object" }, "workspaceId": { "description": "Optional workspace id (defaults to the auth workspace).", "type": "string" } }, "required": [ "channelTargets" ], "type": "object" }, "name": "chieflab_set_publishing_targets", "outputSchema": null }, { "description": "USE WHEN the user has no ChiefLab API key yet and you've gotten a 401 / 'authentication required' error from any other tool. Agent-first signup: creates a new workspace and returns the API key inline as `apiKey`. PREFERRED flow: use your filesystem tools to write the apiKey into the user's MCP config (see mcpConfigSnippet for the patch shape), then ask the user to restart their runtime once. After restart, re-call the original tool. FALLBACK: if you can't write to the config file, surface the included deliveryUrl to the user — they click, see the key, paste it manually. URL expires in 1 hour, single-use, IP-rate-limited (5/IP/hr). No login form.", "inputSchema": { "properties": { "agentName": { "description": "Optional: which AI agent is requesting (Cursor, Claude Desktop, Codex, custom). Logged for support.", "type": "string" }, "contactEmail": { "description": "Optional contact email for the user (used for future notifications).", "type": "string" }, "workspaceLabel": { "description": "Optional human-readable label for the workspace (default: 'default').", "type": "string" } }, "type": "object" }, "name": "chieflab_signup_workspace", "outputSchema": null }, { "description": "P142 — founder rejects a next-move recommendation without doing it. Captures a reason so the brain learns which kinds of moves don't fit this workspace (e.g. 'we don't cross-post to Reddit on principle' / 'we tried DMs already'). Flips action to rejected with metadata.skipReason. The next-move generator reads recent skip reasons before suggesting moves of the same kind on this workspace.", "inputSchema": { "properties": { "actionId": { "description": "The next-move action id.", "type": "string" }, "reason": { "description": "Why the founder is skipping this. Used by the brain to avoid suggesting similar moves.", "type": "string" }, "workspaceId": { "description": "Optional workspace id.", "type": "string" } }, "required": [ "actionId" ], "type": "object" }, "name": "chieflab_skip_next_move", "outputSchema": null }, { "description": "SESSION-RECOVERY · FIRST CALL when a session starts and the user mentions launch / users / growth / customers / metrics / revenue / marketing / what next / shipping. Returns a command-center bootCard with `headline`, `priority`, `cards[]` (each carries kind + label + literal user command + runHandle), and `next` (the one-line prompt). Aggregates: pending approvals + ripe measurements + new engagement + queued prospects + recent launches + manual-publish-pending actions. ChiefLab is stateful and re-summonable — even if the conversation was lost, the IDE was switched, or the runId was forgotten, this call recovers the workspace business state. If the user asked to launch the CURRENT repo, compare boot cards to currentRepoContext/projectName; if the open loop is unrelated, start a fresh launch instead of resuming stale work.", "inputSchema": { "properties": { "currentRepoContext": { "description": "Optional current repo/project context. Helps agents compare recovered loops against the project the user is asking about.", "type": "object" }, "projectName": { "description": "Optional current project/repo name.", "type": "string" }, "workspaceId": { "description": "Optional workspace id.", "type": "string" } }, "type": "object" }, "name": "chieflab_status", "outputSchema": null }, { "description": "P75 — Next Move Engine. USE WHEN measurement just came in (chiefmo_post_launch_review fired automatically at 24h, OR the user manually called it) and you want to know what the operator should do next. Reads metrics + the original launch's brief and emits a deterministic suggestion: {kind: 'follow_up_email' | 'founder_dm' | 'thread_reframe' | 'landing_iteration' | 'lessons_learned_post' | 'seo_title_test' | 'wait' | 'noop', priority, reasoning, draftBrief: {channel, headline, body, cta?, recipients?}, measurementGroundingFacts}. Pure-function; same input → same output, no LLM. Pair with chieflab_create_next_move_action to turn the suggestion into an approval-gated draft.", "inputSchema": { "properties": { "channel": { "description": "Channel the measurement is for (linkedin, x, email, landing_hero, product_hunt, hacker_news).", "type": "string" }, "metrics": { "description": "Measurement metrics — engagements, clicks, opens, replies, traffic, conversions, upvotes, rank, etc. Synonyms (engagement / openRate / clickRate / visits) are accepted.", "type": "object" }, "runId": { "description": "Optional. Source run whose brief grounds the suggestion (so the draft references the actual product / market / audience instead of templates).", "type": "string" }, "workspaceId": { "description": "Optional workspace id.", "type": "string" } }, "required": [ "channel", "metrics" ], "type": "object" }, "name": "chieflab_suggest_next_move", "outputSchema": null }, { "description": "USE WHEN any launch action carries a manualFallback brief — either because the channel has no automated provider at all (Product Hunt, Hacker News, Reddit, Discord, Slack, Indie Hackers, dev.to, YC Bookface, blog) OR because the channel HAS an automated provider but its connector isn't wired yet for this workspace (LinkedIn / X without a Zernio key; email without a Resend key + verified sender domain). Pattern: use the inline fallback NOW to ship the launch manually; connect the provider LATER (each fallback returns an upgradePath with the exact connector wiring) so the same action publishes automatically on the next launch. Returns: paste-ready title + body, per-channel checklist (best time, format, first-comment script), capture-URL-after instruction, measurement template for the 24h readback, and the optional upgradePath when automation is available. Converts a 'blocked' channel into a 5-minute human-in-the-loop ship. Approval-gated upstream: the originating publishAction must already be 'approved' on the reviewUrl before this tool returns the brief.", "inputSchema": { "properties": { "actionId": { "description": "The publishAction.id from chiefmo_launch_product whose manualFallback you want to fetch. Works for both manual-only channels (connector === 'manual_only') and otherwise-automated channels whose connector isn't wired (connector === 'zernio' or 'resend' with no key). Look at agentGuide.blockedActions[] or publishActions[].manualFallback in the launch response — any action where manualFallback is non-null is fetchable here.", "type": "string" }, "channel": { "description": "Override the channel inferred from the action. One of: linkedin | x | email | blog | landing_hero | product_hunt | hacker_news | reddit | discord | slack | indie_hackers | dev_to | ycombinator.", "type": "string" }, "discordCommunity": { "description": "Optional. For channel=discord, which community (the brief tailors tone + announcement-channel pick).", "type": "string" }, "subreddit": { "description": "Optional. For channel=reddit, which subreddit (e.g. 'r/SaaS', 'r/AI_Agents'). ChiefLab's brief picks the right post format per sub.", "type": "string" }, "workspaceId": { "description": "Optional workspace id.", "type": "string" } }, "required": [ "actionId" ], "type": "object" }, "name": "chieflab_use_manual_fallback", "outputSchema": null }, { "description": "POST-INSTALL HEALTH CHECK. Call this exactly once after the agent has wired ChiefLab into the runtime (per the bootstrap protocol at https://chieflab.io/bootstrap.txt). Returns { ok, mcpReachable, toolsDiscovered, visibleFrontDoorTools, callableInternalTools, workspaceReady, hasOpenLoops, blockedConnectors, summary }. `toolsDiscovered` means the visible front-door catalog, not every internal/back-compat callable handler. The `summary` is one sentence the agent should paste verbatim to the user — e.g. 'ChiefLab installed and ready. Workspace fresh, no open loops, all channels need connectors before auto-publish.' Do NOT list every internal tool — render the summary only. If `ok` is false, the response includes a `nextStep` describing the single recovery action.", "inputSchema": { "properties": { "workspaceId": { "description": "Optional workspace id; inferred from bearer auth.", "type": "string" } }, "type": "object" }, "name": "chieflab_verify_install", "outputSchema": null } ] }
Verify it yourselfcurl -s https://api.teppi.xyz/v1/evidence/sha256:15e051ef2e54a8ef89429ad908cf21d362a0ed203e8179c2b76aeba84e7d30cc | sha256sum