Skip to content

Capabilities Reference

Capability reference

Generated from packages/core/src/lib/capabilities/catalog.ts. Do not hand-edit — run node scripts/gen-agent-docs.mjs.

Every row is one registry entry; the same entry drives the MCP tool, the /api/v1 request, the public mcp.json, the aicmo run <id> CLI dispatcher, and (where chat is a surface) the AI CMO runtime tool.

Legend — effect: read no state change · internal_write changes AICMOHQ state only · external_write posts/sends outside AICMOHQ · spend consumes credits · delete is irreversible. confirmation: approval = a human must approve before the effect lands, step_up = approval plus re-auth; the kernel enforces external_write ⇒ approval or step_up. * = required input.

Capability idMCP toolHTTP (/api/v1)ScopeEffectRiskConfirmationSurfacesInputsDescription
capabilities.listcapabilities_list— (local)nonereadlownonecli, mcpList supported chatbot, CLI, and MCP capabilities with risk and confirmation metadata.
strategy.runstrategy_runPOST /strategy/runstrategy:runspendmediumapprovalcli, mcpkeywords, platform*Run the full strategy loop: extract git context and generate ICP-validated drafts into the queue (LinkedIn, X, Reddit).
scout.researchscoutPOST /scoutstrategy:runspendlownonechat, cli, mcpkeywordsFind marketing opportunities based on product and keywords.
writer.generatewritePOST /writestrategy:runspendmediumapprovalchat, cli, mcpplatform*, from_git, topic, enqueueDraft content from a topic or from recent git commits. Set enqueue=true to put the draft in the queue for LinkedIn/X publish.
credits.costscredit_costs— (local)nonereadlownonecli, mcpList the credit cost of each AICMOHQ agent action. Local, read-only; no auth required.
connections.listconnections_listGET /connectionsconnections:readreadlownonecli, mcpList connected platforms (check LinkedIn before publishing).
queue.listqueue_listGET /queue?status={status}queue:readreadlownonecli, mcpstatusList content queue items for the authenticated AICMOHQ account.
queue.getqueue_getGET /queue/{id}queue:readreadlownonecli, mcpid*Fetch one content queue item by id.
queue.deletequeue_deleteDELETE /queue/{id}queue:writedeletemediumapprovalcli, mcpid*Permanently delete a queued draft.
queue.updatequeue_updatePATCH /queue/{id}queue:writeinternal_writelownonecli, mcpid*, content*Update the content of a queued draft.
queue.approvequeue_approvePOST /queue/{id}/approvequeue:writeinternal_writemediumapprovalcli, mcpid*Approve a draft queue item so it can be published.
queue.publishqueue_publishPOST /queue/{id}/publishpublishexternal_writehighapprovalcli, mcpid*Publish an approved queue item (requires platform connection, e.g. LinkedIn).
queue.rejectqueue_rejectPATCH /queue/{id}queue:writeinternal_writelownonecli, mcpid*Reject a draft so it will not publish.
queue.best_timequeue_best_timeGET /queue/best-time?platform={platform}&tz={tz}queue:readreadlownonecli, mcpplatform*, tzSuggest the best publish time for a platform — the workspace’s measured engagement history when available, else the platform’s researched golden-hour window. Advisory only; scheduling still goes through queue_schedule.
queue.schedulequeue_schedulePATCH /queue/{id}queue:writeinternal_writemediumapprovalcli, mcpid*, scheduled_for*Schedule an approved queue item for cron publish (ISO timestamp).
queue.proofqueue_proofPOST /queue/{id}/proofqueue:writeinternal_writelownonecli, mcpid*, proofUrl*Save a live post URL for Hacker News or Product Hunt (no API). Then call queue_publish to mark the item published.
reddit.statusreddit_statusGET /reddit/statusconnections:readreadlownonecli, mcpInspect the connected Reddit account’s conservative warm-up stage and engagement limits.
reddit.warmupreddit_warmupPOST /reddit/warmupstrategy:runspendlownonechat, cli, mcpkeywords, subreddits, limit, productIdUse the connected Reddit OAuth account to find value-first threads. Saves opportunities only; never comments or publishes.
command.chatcommand_chatPOST /command/chatstrategy:runinternal_writelownonecli, mcpmessage*, sessionId, agentIdSend a natural-language mission to AICMOHQ Agent. Persists session memory and returns a proposed plan (approval-first; does not publish). When the response includes a plan, executionPolicy tells you the next step: call command_run with message.id to execute (auto=true only when auto_run_eligible), or command_status with runId to inspect a running one.
command.sessionscommand_sessionsGET /command/sessions?limit=20strategy:runreadlownonecli, mcplimitList recent AICMOHQ Agent chat sessions (shared memory with dashboard + CLI).
command.runcommand_runPOST /command/runstrategy:runinternal_writemediumapprovalcli, mcpmessageId*, autoExecute a proposed command plan by assistant message id. Rejects auto=true when approval is required. Streams NDJSON progress.
command.statuscommand_statusGET /command/run/{runId}strategy:runreadlownonecli, mcprunId*Inspect a durable command run and its approval-gated steps.
command.approve_stepcommand_approve_stepPOST /command/run/{runId}strategy:runinternal_writemediumapprovalcli, mcprunId*, stepId*Approve one bound CMO step so execution resumes (expires in 15 minutes).
workspace.contextworkspace_contextGET /workspace/contextstrategy:runreadlownonecli, mcpRead the workspace strategy context (product, ICPs, positioning, brand voice) agents ground drafts on.
workspace.getworkspace_getGET /workspacestrategy:runreadlownonecli, mcpRead the raw workspace record (company profile, positioning, ICPs) the agents ground on.
products.listproducts_listGET /productsstrategy:runreadlownonecli, mcpList the products in the workspace. Most agent work needs a product_id from here first.
products.createproducts_createPOST /productsworkspace:writeinternal_writelownonecli, mcpname*, description, url, target_audience, competitorsAdd a product to the workspace so scans and drafts can be scoped to it.
products.updateproducts_updatePUT /products/{id}workspace:writeinternal_writelownonecli, mcpid*, name, tagline, description, urlUpdate a product’s name, tagline, description, or url.
products.archiveproducts_archiveDELETE /products/{id}workspace:writedeletemediumapprovalcli, mcpid*Delete a product. Its past artifacts stay, but new work can no longer target it.
artifacts.listartifacts_listGET /artifactsstrategy:runreadlownonecli, mcpList agent artifacts (research briefs, drafts, reports) produced for this workspace.
listening.listlistening_listGET /listeningstrategy:runreadlownonecli, mcpList captured listening mentions — places the product or its category was discussed.
listening.scanlistening_scanPOST /listening/scanstrategy:runspendlownonecli, mcpproduct_id, limitRun a listening scan for new mentions of the product. Costs credits.
signals.scansignals_scanPOST /signals/scanstrategy:runinternal_writelownonecli, mcpquery*, perSourceSearch external sources for demand signals matching a query.
trends.listtrends_listGET /trends?range={range}nonereadlownonecli, mcprangeRead trending topics for the day or week to ground timely content.
opportunities.listopportunities_listGET /opportunitiesstrategy:runreadlownonecli, mcpList scored growth opportunities derived from listening and signals.
opportunities.draftopportunities_draftPOST /opportunities/{id}/draftstrategy:runspendlownonecli, mcpid*Draft content for an opportunity. Costs credits; the draft still needs human approval to publish.
opportunities.queueopportunities_queuePOST /opportunities/{id}/queuequeue:writeinternal_writelownonecli, mcpid*Move an opportunity’s draft into the content queue as a pending item.
geo.statusgeo_statusGET /geostrategy:runreadlownonecli, mcpRead current GEO (AI-citation) status: which AI answers mention the product.
geo.scangeo_scanPOST /geo/scangeo:runspendlownonecli, mcpproduct_idRun a GEO scan to check whether AI assistants cite the product. Costs credits.
geo.checklistgeo_checklistGET /geo/checkliststrategy:runreadlownonecli, mcpRead the GEO readiness checklist (signal, status) plus which sources already cite the product.
geo.competitorsgeo_competitorsGET /geo/competitorsstrategy:runreadlownonecli, mcpList competitor citation share and latest GEO visibility data.
geo.uncitedgeo_uncitedGET /geo/uncitedstrategy:runreadlownonecli, mcpList high-value GEO queries where the product is not cited.
echo.mentionsecho_mentionsGET /echo/mentionsanalytics:readreadlownonecli, mcpList tracked brand and competitor mentions.
echo.scanecho_scanPOST /echo/scananalytics:readspendmediumapprovalcli, mcpScan tracked sources for brand and competitor mentions.
voice.getvoice_getGET /settings/voicestrategy:runreadlownonecli, mcpRead canonical workspace brand voice.
voice.setvoice_setPUT /settings/voicesettings:writeinternal_writemediumapprovalcli, mcpvoice, guidelines, revisionUpdate canonical workspace brand voice with optimistic revision control.
audience.importaudience_importPOST /audience/importworkspace:writeinternal_writemediumapprovalcli, mcpcsv*, consentSource*, source, enrollImport subscribers from CSV with a required consent source.
recommendations.listrecommendations_listGET /recommendationsstrategy:runreadlownonecli, mcpList the CMO’s current recommendations for the workspace.
recommendations.generaterecommendations_generatePOST /recommendationsstrategy:runinternal_writelownonecli, mcpRegenerate the recommendation set from the latest workspace data.
recommendations.deciderecommendations_decidePATCH /recommendations/{id}strategy:runinternal_writelownonecli, mcpid*, action*Accept or dismiss one recommendation. Accepting is what changes prioritization.
campaigns.listcampaigns_listGET /campaignsstrategy:runreadlownonecli, mcpList campaigns (multi-step marketing graphs) in the workspace.
campaigns.createcampaigns_createPOST /campaignscampaigns:writeinternal_writelownonecli, mcpname*, graphCreate a campaign. Pass a node/edge graph to define its steps, or omit it for an empty draft.
campaigns.getcampaigns_getGET /campaigns/{id}strategy:runreadlownonecli, mcpid*Read one campaign including its full step graph.
campaigns.updatecampaigns_updatePATCH /campaigns/{id}campaigns:writeinternal_writelownonecli, mcpid*, name, status, graphUpdate a campaign’s name, status (draft/active/archived), or step graph.
campaigns.archivecampaigns_archiveDELETE /campaigns/{id}campaigns:writedeletemediumapprovalcli, mcpid*Delete a campaign.
workflows.startworkflows_startPOST /workflows/startstrategy:runspendlownonecli, mcpkind*, product_id*, limit, countStart a background workflow (e.g. reddit_scan, hn_scan, content drafts) for a product. Costs credits.
workflows.executeworkflows_executePOST /workflows/executestrategy:runspendlownonecli, mcpworkflowType*, inputExecute a named workflow synchronously with a small input map. Costs credits.
workflows.statusworkflows_statusGET /workflows/{id}strategy:runreadlownonecli, mcpid*Read a running workflow’s status and step results.
tasks.listtasks_listGET /tasks?status={status}&agent_id={agent_id}strategy:runreadlownonecli, mcpstatus, agent_idList agent tasks, optionally filtered by status or agent.
tasks.createtasks_createPOST /tasksstrategy:runinternal_writelownonecli, mcpagent_id*, type*, inputQueue a task for one of the agents (scout, writer, publisher, engage, analyst).
tasks.gettasks_getGET /tasks/{id}strategy:runreadlownonecli, mcpid*Read one task with its input, result, and error.
tasks.updatetasks_updatePATCH /tasks/{id}strategy:runinternal_writelownonecli, mcpid*, status, result, errorUpdate a task’s status, result, or error.
tasks.approvetasks_approvePOST /tasks/{id}/approvestrategy:runinternal_writemediumapprovalcli, mcpid*Approve a task that is waiting for a human decision. Never approve your own work.
tasks.executetasks_executePOST /tasks/{id}/executestrategy:runinternal_writemediumapprovalcli, mcpid*Run an approved task now instead of waiting for the scheduler.
approvals.listapprovals_listGET /approvalsqueue:readreadlownonecli, mcpList items waiting for a human approval decision.
approvals.approveapprovals_approvePOST /approvals/{id}/approvepublishexternal_writehighstep_upcli, mcpid*Record a human approval, which releases the item to publish. Agents must not call this on their own drafts.
approvals.rejectapprovals_rejectPOST /approvals/{id}/rejectqueue:writeinternal_writemediumapprovalcli, mcpid*Reject a pending approval so the item is never published.
launch.preparelaunch_preparePOST /agents/launchstrategy:runinternal_writelownonecli, mcpproductIdPrepare launch assets (Product Hunt / Hacker News copy) for a product. Submission stays human-assisted.
listings.listlistings_listGET /listingsstrategy:runreadlownonecli, mcpList directory launch listings (Product Hunt, Hacker News, directories) tracked for the workspace.
listings.createlistings_createPOST /listingsworkspace:writeinternal_writelownonecli, mcpname*, url, status, notesTrack a new directory launch listing. Records intent only; submission stays human-assisted.
listings.updatelistings_updatePATCH /listings/{id}workspace:writeinternal_writelownonecli, mcpid*, name, url, status, notesUpdate a tracked launch listing (status, URL, notes).
listings.archivelistings_archiveDELETE /listings/{id}workspace:writedeletemediumapprovalcli, mcpid*Remove a tracked launch listing.
prospects.scanprospects_scanPOST /prospect/scanstrategy:runspendlownonecli, mcpsources, keywordsScan for prospects matching the workspace ICP. Costs credits.
inbox.listinbox_listGET /inboxstrategy:runreadlownonecli, mcpList inbox conversations with prospects across email and DMs.
inbox.getinbox_getGET /inbox/{contactId}strategy:runreadlownonecli, mcpcontactId*Read one contact’s full inbox thread.
outreach.draftoutreach_draftPOST /inbox/sendoutreach:writeinternal_writelownonecli, mcpcontactId*, channel*, subject, body*Draft an outreach message to a contact and queue it for human approval. Nothing is sent — approve and publish the queued item to actually deliver it.
crm.synccrm_syncPOST /integrations/hubspot/syncoutreach:writeexternal_writehighapprovalcli, mcpcontactIdPush a contact to the connected HubSpot CRM. Writes to an external system, so it needs approval.
analytics.overviewanalytics_overviewGET /analytics/overview?days=30analytics:readreadlownonecli, mcpdaysRead aggregate performance over the last N days: totals per metric, per platform, and queue status.
analytics.attributionanalytics_attributionGET /analytics/attributionanalytics:readreadlownonecli, mcpRead attribution: which content and channels drove signups.
analytics.pagespeedanalytics_pagespeedGET /analytics/pagespeed?url={url}analytics:readreadlownonecli, mcpurl*Run a PageSpeed check on a public url and return its performance scores.
analytics.reportanalytics_reportGET /analytics/report?days=7analytics:readreadlownonecli, mcpdaysRead the rolled-up performance report for the last N days (default 7).
feed.listfeed_listGET /feedstrategy:runreadlownonecli, mcpRead the agent activity feed — what the agents did and what needs attention.
feed.updatefeed_updatePATCH /feed/{id}strategy:runinternal_writelownonecli, mcpid*Mark one feed item as read or acted on.
ga4.pullga4_pullGET /integrations/ga4analytics:readreadlownonecli, mcpPull the latest metrics from the connected GA4 property.
github.reposgithub_reposGET /integrations/github/reposconnections:readreadlownonecli, mcpList repos visible through the connected GitHub account, for shipping-log content.
connections.healthconnections_healthGET /integrations/healthconnections:readreadlownonecli, mcpCheck each connected platform’s token health before trying to publish.
agent_mode.getagent_mode_getGET /settings/agent-modestrategy:runreadlownoneui, cli, mcpRead the publishing mode (approve or autonomous) plus any per-agent overrides.
agent_mode.setagent_mode_setPUT /settings/agent-modesettings:writeinternal_writehighstep_upui, cli, mcpglobal_mode, orchestrate_enabled, overridesChange the publishing mode. Switching to autonomous removes the human approval gate, so it needs a human.
billing.statusbilling_statusGET /billing/statusbilling:readreadlownonecli, mcpRead the active plan, credit balance, and renewal date.
me.getme_getGET /mebilling:readreadlownonecli, mcpRead the authenticated identity: user id, token type, and granted scopes.
audience.listaudience_listGET /audience?status={status}&segment={segment}strategy:runreadlownonecli, mcpstatus, segmentList the email marketing audience for the workspace, with status and segment filters.
audience.createaudience_createPOST /audienceworkspace:writeinternal_writelownonecli, mcpemail*, consentSource, source, segmentsAdd one subscriber to the email audience. A consent source is recorded for compliance (defaults to manual).
brief.getbrief_getGET /briefqueue:readreadlownonecli, mcpRead the most recent stored daily brief: yesterday’s shipped items, engagement, pending actions, and alerts.
creative.plancreative_planPOST /creative/runscreative:runspendmediumapprovalui, cli, mcpproductUrl*, productId, feature, aspectDerive a launch-video brief and storyboard. Creates an approval; does not render or publish.
creative.rendercreative_renderPOST /creative/runs/{runId}/rendercreative:runspendmediumapprovalui, cli, mcprunId*Start rendering an approved storyboard. Heavy work runs on the media worker.
creative.statuscreative_statusGET /creative/runs/{runId}creative:readreadlownoneui, cli, mcprunId*Read a creative run, its stages, and signed preview URLs.
creative.reviewcreative_reviewGET /creative/runs/{runId}/reviewcreative:readreadlownoneui, cli, mcprunId*Read the storyboard awaiting approval for a run.
creative.assetscreative_assetsGET /creative/runs/{runId}/assetscreative:readreadlownoneui, cli, mcprunId*List signed output assets for a completed creative run.
creative.cancelcreative_cancelPOST /creative/runs/{runId}/cancelcreative:runinternal_writelownoneui, cli, mcprunId*Cancel a creative run and refund unstarted stages.
creative.queuecreative_queuePOST /creative/runs/{runId}/queuequeue:writeinternal_writemediumapprovalui, cli, mcprunId*, platformsCreate content_queue drafts from a completed creative run. Does not publish.
creative.modelscreative_modelsGET /creative/modelscreative:readreadlownoneui, cli, mcpList the active Creative Studio generation models with their credit cost per billing unit.
creative.generatecreative_generatePOST /creative/generatecreative:runspendmediumapprovalui, cli, mcpprompt*, modelId*, kind, mode, duration, imageUrl, videoUrl, referenceUrls, targetPlatform, audioGenerate a Creative Studio image or video. Debits credits and drafts the result into the content queue for approval; never publishes.
creative.gallerycreative_galleryGET /creative/gallery?kind={kind}&status={status}&cursor={cursor}&limit={limit}creative:readreadlownoneui, cli, mcpkind, status, cursor, limitList Creative Studio generation jobs with signed output URLs, newest first.
creative.jobcreative_jobGET /creative/jobs/{jobId}creative:readreadlownoneui, cli, mcpjobId*Read one Creative Studio generation job and its signed output URL.
creative.abortcreative_abortPOST /creative/jobs/{jobId}/abortcreative:runinternal_writelownoneui, cli, mcpjobId*Abort an in-flight Creative Studio generation job; credits are refunded when the provider had not yet spent them.
creative.revisecreative_revisePOST /creative/runs/{runId}/revisecreative:runspendmediumapprovalui, cli, mcprunId*, noteOpen a new storyboard revision that supersedes a previous run. Does not render or publish.
adlib.searchadlib_searchPOST /ad-library/searchdiscovery:runspendlownonecli, mcpquery, platforms, country, limitCollect competitor ads from the public ad libraries (Meta/Google/LinkedIn/TikTok/X) for a query, persist them, and return the scored page. Costs ad_library_scan credits; a live scan can take 15-40s.
adlib.browseadlib_browseGET /ad-library?q={q}&platform={platform}&competitor={competitor}&tier={tier}&board={board}&sort={sort}&limit={limit}&offset={offset}&min_runtime_days={min_runtime_days}&saved_only=1discovery:readreadlownonecli, mcpq, platform, competitor, tier, board, saved_only, min_runtime_days, sort, limit, offsetBrowse ads already stored in the workspace’s ad library. Tiers are high_conf | winner | emerging | loser (not the winner_engine vocabulary).
adlib.get_adadlib_get_adGET /ad-library/{ad_id}discovery:readreadlownonecli, mcpad_id*Read one stored ad by its ad_id.
adlib.savedadlib_savedGET /ad-library/saved?board={board}discovery:readreadlownonecli, mcpboard, limitList saved ads with per-board counts.
adlib.save_adadlib_save_adPOST /ad-library/saveddiscovery:runinternal_writelownonecli, mcpad_id*, board, noteSave an ad to a swipe-file board (default board when omitted).
adlib.unsave_adadlib_unsave_adDELETE /ad-library/saved/{ad_id}?board={board}discovery:runinternal_writelownonecli, mcpad_id*, boardRemove an ad from a board (default board when omitted).
adlib.alertsadlib_alertsGET /ad-library/alerts?unread_only=truediscovery:readreadlownonecli, mcpunread_only, limitCompetitor ads seen for the first time — the launch-alert feed.
adlib.ack_alertsadlib_ack_alertsPOST /ad-library/alerts/ackdiscovery:runinternal_writelownonecli, mcpad_idsMark launch alerts read. Omit ad_ids to acknowledge everything unread.
adlib.competitorsadlib_competitorsGET /ad-library/competitorsdiscovery:readreadlownonecli, mcpList the competitor watchlist merged with advertisers already seen in the library.
adlib.track_competitoradlib_track_competitorPOST /ad-library/competitorsdiscovery:runinternal_writelownonecli, mcpname*, platform, domainAdd a competitor name to the watchlist (idempotent).
adlib.untrack_competitoradlib_untrack_competitorDELETE /ad-library/competitors/{name}discovery:runinternal_writelownonecli, mcpname*Remove a competitor from the watchlist.
adlib.sync_competitoradlib_sync_competitorPOST /ad-library/competitors/{name}/syncdiscovery:runspendlownonecli, mcpname*, platform, domain, country, limitTrack a competitor and refresh-pull its live ads now. Costs ad_library_scan credits; new ads raise alerts.
adlib.cloneadlib_clonePOST /ad-library/clonediscovery:runinternal_writelownonecli, mcpad_id*Remix an ad’s hook into 3 deterministic variants for your own creatives.
ads.launchads_launchPOST /ads/launchcampaigns:writeexternal_writehighapprovalcli, mcpplatform*, ad_id, name, hook, body, cta, creative_url, persona, score, daily_budget, draft_copy, dry_runPlan (dry_run=true, default) or execute an ad launch. Execution is policy-gated: winner score >= 60 creates a paused campaign draft, below that it lands pending_approval for human sign-off — nothing ever goes live directly.
ads.launchesads_launchesGET /ads/launches?status={status}analytics:readreadlownonecli, mcpstatus, limitList launched/paused/pending ad campaigns in the workspace.
ads.getads_getGET /ads/launches/{id}analytics:readreadlownonecli, mcpid*Read one ad launch by id.
ads.manageads_managePATCH /ads/launches/{id}campaigns:writeexternal_writehighapprovalcli, mcpid*, action, daily_budgetManage one launch: action approve|activate|pause|archive (approve pending_approval -> paused; activate paused -> active; pause active -> paused; archive any -> archived) and/or set daily_budget.
ads.performanceads_performanceGET /ads/launches/{id}/performanceanalytics:readreadlownonecli, mcpid*Performance for one launch: spend, impressions, clicks, conversions, CTR, CPA, ROAS. synced:false + zeros until a platform metrics sync has written data.
autopilot.statusautopilot_statusGET /autopilot/statusautopilot:readreadlownonecli, mcpAutopilot rollup: active loops, cycles run, pending proposals, learnings this week, plus every loop’s last-run state.
autopilot.learningsautopilot_learningsGET /autopilot/learnings?channel={channel}&kind={kind}&limit={limit}autopilot:readreadlownonecli, mcpchannel, kind, limitThe readable learning files the loops append to each run — winner/miss/audit/digest lessons per channel with the rows that earned them.
autopilot.runautopilot_runPOST /autopilot/runautopilot:runinternal_writelownonecli, mcploopRun one autopilot cycle now (or the weekly audit with loop=audit). Deterministic — grades signals, writes learnings, proposes actions. No credits; proposals still need approval.
autopilot.actionsautopilot_actionsGET /autopilot/actions?status={status}autopilot:readreadlownonecli, mcpstatusList autopilot proposals — pending ones awaiting a decision, or applied/dismissed history.
autopilot.decideautopilot_decidePOST /autopilot/actionsautopilot:writeexternal_writehighapprovalcli, mcpid*, decision*Decide one autopilot proposal: apply executes it (scale budget / pause launch / pause loop), dismiss closes it without side effects.
advocacy.listadvocates_listGET /advocates?status={status}advocacy:readreadlownonecli, mcpstatusAdvocate leaderboard: repeat positive engagers scored on reach(momentum), loyalty, content and amplification, tiered micro_influencer/loyal_customer/ugc_creator/advocate.
advocacy.outreachadvocates_outreachGET /advocates/{id}/outreachadvocacy:readreadlownonecli, mcpid*Ready-to-send DM template for one advocate, worded per tier (micro-influencer affiliate offer, loyal-customer early access, UGC feature request).
advocacy.set_statusadvocates_set_statusPATCH /advocatesadvocacy:writeinternal_writelownonecli, mcpid*, status*Mark an advocate contacted / partner / dismissed once you’ve reached out.
sentiment.seriessentiment_seriesGET /sentiment?days={days}sentiment:readreadlownonecli, mcpdaysDaily per-platform sentiment rollup (positive/neutral/negative %) plus live anomalies vs the 7-day baseline — the crisis early-warning feed.

Scopes

ScopeCapabilities
advocacy:readadvocacy.list, advocacy.outreach
advocacy:writeadvocacy.set_status
analytics:readecho.mentions, echo.scan, analytics.overview, analytics.attribution, analytics.pagespeed, analytics.report, ga4.pull, ads.launches, ads.get, ads.performance
autopilot:readautopilot.status, autopilot.learnings, autopilot.actions
autopilot:runautopilot.run
autopilot:writeautopilot.decide
billing:readbilling.status, me.get
campaigns:writecampaigns.create, campaigns.update, campaigns.archive, ads.launch, ads.manage
connections:readconnections.list, reddit.status, github.repos, connections.health
creative:readcreative.status, creative.review, creative.assets, creative.models, creative.gallery, creative.job
creative:runcreative.plan, creative.render, creative.cancel, creative.generate, creative.abort, creative.revise
discovery:readadlib.browse, adlib.get_ad, adlib.saved, adlib.alerts, adlib.competitors
discovery:runadlib.search, adlib.save_ad, adlib.unsave_ad, adlib.ack_alerts, adlib.track_competitor, adlib.untrack_competitor, adlib.sync_competitor, adlib.clone
geo:rungeo.scan
outreach:writeoutreach.draft, crm.sync
publishqueue.publish, approvals.approve
queue:readqueue.list, queue.get, queue.best_time, approvals.list, brief.get
queue:writequeue.delete, queue.update, queue.approve, queue.reject, queue.schedule, queue.proof, opportunities.queue, approvals.reject, creative.queue
sentiment:readsentiment.series
settings:writevoice.set, agent_mode.set
strategy:runstrategy.run, scout.research, writer.generate, reddit.warmup, command.chat, command.sessions, command.run, command.status, command.approve_step, workspace.context, workspace.get, products.list, artifacts.list, listening.list, listening.scan, signals.scan, opportunities.list, opportunities.draft, geo.status, geo.checklist, geo.competitors, geo.uncited, voice.get, recommendations.list, recommendations.generate, recommendations.decide, campaigns.list, campaigns.get, workflows.start, workflows.execute, workflows.status, tasks.list, tasks.create, tasks.get, tasks.update, tasks.approve, tasks.execute, launch.prepare, listings.list, prospects.scan, inbox.list, inbox.get, feed.list, feed.update, agent_mode.get, audience.list
workspace:writeproducts.create, products.update, products.archive, audience.import, listings.create, listings.update, listings.archive, audience.create

User tokens (aicmo_usr_…, from aicmo login) carry all scopes. Agent tokens (aicmo_agt_…, from aicmo token create) carry an explicit subset. Capabilities with scope none are local and need no token.

Agent tokens currently reach only the native /api/v1/* handlers (queue, connections, workspace context, me), where withAuth enforces the declared scope. Capabilities served by a legacy /api/* route through the /api/v1 rewrite need a user token: those routes declare no scope, so a scoped agent token cannot be checked against one and is refused rather than silently granted everything. Declaring scopes on those handlers is what lifts the restriction.

Surfaces

chat capabilities are also AI CMO runtime tools under the same id. Every capability with an HTTP transport is reachable from the CLI as aicmo run <capability.id> '<json>' (run aicmo run with no id to list them); hand-written commands like aicmo queue approve are ergonomic aliases over the same registry entries.

Error envelope (all surfaces)

{ "error": { "code": "stable_snake_case", "message": "human readable", "status": 409, "retryable": false } }

MCP wraps it as { isError: true, content: [{ type: "text", text: "<that JSON>" }] }. Codes you will see: missing_auth_token, invalid_arguments, unknown_tool, untrusted_auth_override, untrusted_api_base_url, invalid_api_response, http_<status>, plus server codes such as reddit_not_connected, publish_not_approved, insufficient_credits, assisted_publish.

Live discovery endpoint: GET https://app.aicmohq.com/api/v1/capabilities.