{"version":1,"source":{"repository":"Continuum-AI-Agency/continuum-backend","revision":"d45c8a83b545ded37306583f7528172bed5fd6d2","date":"2026-11-05","generator":"scripts/mcp-docs.mjs"},"server":{"url":"https://api.trycontinuum.ai/mcp","chatgpt":"https://api.trycontinuum.ai/mcp/chatgpt","auth":"OAuth 2.1 with PKCE; no API keys"},"discovery":{"name":"help_describe","arguments":{"tool":"<name>","action":"<action>"},"note":"The live schema wins over this index."},"counts":{"registered":72,"listed":52,"notListed":20},"legend":{"confirmation":{"none":"None. The call runs when made.","two_phase_confirm_token":"Writes preview first and return a `confirm_token` with `expires_at`. Confirm with that token after the person says yes.","elicitation_or_confirm_token":"Writes preview first: a confirmation dialog in clients that support it, otherwise a `confirm_token` to send back after a yes.","approval_token":"The person approves the pending change; the approval is the yes.","admin_grant":"An Admin or Owner grants a pending change by its token."},"completion":{"sync":"Returns the result in the same call.","async_job":"Returns a `job_id`. Read the result with `jobs_status`.","sync_then_async":"Returns right away. Longer work continues as a job; read the id in the result.","background_refresh":"Returns what is ready now. A refresh keeps running in the background; read again shortly."},"retry":{"natural_read":"Safe to retry: it only reads.","naturally_idempotent":"Safe to retry: repeating the call gives the same result.","idempotency_key":"Retry with the same `idempotency_key` to avoid duplicates.","confirm_token_single_use":"Each `confirm_token` works once. Preview again to retry.","none":"Not idempotent. Check the current state before retrying."},"role":{"none":"No brand role needed.","viewer":"Viewer or higher.","operator":"Operator or higher.","admin":"Admin or Owner."},"errorKind":{"error":"Returned as an error (isError: true).","status":"Returned as a normal result whose status says what to do next."}},"docs":{"overview":"https://docs.trycontinuum.ai/mcp/tools","agentBrief":"https://docs.trycontinuum.ai/mcp/agent-brief","serverReference":"https://docs.trycontinuum.ai/mcp/reference"},"tools":[{"name":"account_map","listed":true,"area":"account","docs":"https://docs.trycontinuum.ai/mcp/tools/account#account_map","summary":"Shows connected platforms and accounts, ad accounts, and your role.","mutates":false,"role":"viewer","integration":null,"brandScoped":true,"confirmation":"none","completion":"sync","retry":"natural_read","roleNote":"Any brand member","rateLimit":null,"inputs":{"depth":{"type":"string","values":["platforms","accounts"],"description":"How much detail to return. See the allowed values."}},"required":[],"schema":"https://docs.trycontinuum.ai/mcp/schemas/account_map.json","examples":[{"title":"Platforms and accounts for the active brand","arguments":{"depth":"accounts"}}],"errors":[{"code":"needs_brand","kind":"status","when":"No brand is active. Call `brands_select`."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."}],"related":["accounts_list","integrations_list","analytics_query"]},{"name":"accounts_list","listed":true,"area":"account","docs":"https://docs.trycontinuum.ai/mcp/tools/account#accounts_list","summary":"Lists the accounts assigned to the brand.","mutates":false,"role":"viewer","integration":null,"brandScoped":true,"confirmation":"none","completion":"sync","retry":"natural_read","roleNote":"Any brand member","rateLimit":null,"inputs":{"platform":{"type":"string","values":["instagram","facebook","tiktok","google","linkedin","youtube","x","threads"],"description":"The network to act on. See the allowed values."},"search":{"type":"string","description":"Filter by name."},"limit":{"type":"integer","description":"The most items to return."},"cursor":{"type":"string","description":"The pagination cursor from the previous result; omit it for the first page."}},"required":[],"schema":"https://docs.trycontinuum.ai/mcp/schemas/accounts_list.json","examples":[{"title":"First page","arguments":{"limit":25}},{"title":"Filter by platform","arguments":{"platform":"instagram"}}],"errors":[{"code":"INTERNAL","kind":"error","when":"Something went wrong on our side. Retry once, then contact support."},{"code":"needs_brand","kind":"status","when":"No brand is active. Call `brands_select`."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."}],"related":["insights_get"]},{"name":"agent_ask","listed":true,"area":"account","docs":"https://docs.trycontinuum.ai/mcp/tools/account#agent_ask","summary":"Asks Jaina or the Organic agent a question. Runs as a job.","mutates":true,"role":"operator","roleByAction":{"jaina":"operator","organic":"operator"},"integration":null,"brandScoped":true,"confirmation":"none","completion":"async_job","retry":"none","roleNote":"Operator or higher.","rateLimit":null,"inputs":{"target":{"type":"string","values":["jaina","organic"],"description":"Where the call applies. See the allowed values."},"query":{"type":"string","description":"What to look for, in plain words."},"sessionId":{"type":"string","description":"An earlier agent conversation's `sessionId`, to continue it instead of starting over."},"context":{"type":"object"}},"actionKey":"target","actions":[{"name":"jaina","required":["target","query"]},{"name":"organic","required":["target","query"]}],"sharedInputs":["query","sessionId","context"],"required":["target","query"],"schema":"https://docs.trycontinuum.ai/mcp/schemas/agent_ask.json","examples":[{"title":"Ask Jaina why a metric moved","arguments":{"target":"jaina","query":"Why did our cost per purchase rise last week, and which ad sets drove it?"}},{"title":"Ask the Organic agent for ideas","arguments":{"target":"organic","query":"Give me three Reel ideas for our autumn launch, based on what performed best last month."}}],"errors":[{"code":"needs_brand","kind":"status","when":"No brand is active. Call `brands_select`."},{"code":"needs_role","kind":"status","when":"The person's role is too low for this call. Needs: Operator or higher. Ask an Admin or Owner."},{"code":"needs_correction","kind":"status","when":"The question went to the wrong agent. Ask the `suggested_target` instead."},{"code":"needs_followup","kind":"status","when":"In the finished job result: the agent produced text only. Continue with the same `sessionId`."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."}],"notes":["Returns a `job_id` right away. Read the answer with `jobs_status`.","The finished result's `status` is `completed` (it wrote a draft or plan) or `needs_followup` (text only). To continue, send the next question with the same `sessionId`.","A question sent to the wrong agent returns `needs_correction` with a `suggested_target`.","When the Organic agent ends with a plan waiting for approval, the result carries `plan_id` and `pending_approval_token`. Commit it with `planner_manage` `approve_week` after the person says yes. The server’s own description names `organic_calendar_approve` for this step; that tool isn’t callable, so use `approve_week`."],"related":["jobs_status","planner_manage","analytics_query"]},{"name":"agent_cancel","listed":false,"docs":"https://docs.trycontinuum.ai/mcp/tools/unlisted#agent_cancel","summary":"Cancel a running Mode A job by jobId. Aborts the in-process AbortController and, for organic jobs, sends a best-effort HTTP cancel to the agent.","mutates":true,"role":"operator","integration":null,"brandScoped":true,"confirmation":"none","completion":"sync","retry":"naturally_idempotent","roleNote":"Operator or higher","rateLimit":null,"inputs":{"jobId":{"type":"string","description":"A job ID an earlier call returned."}},"required":["jobId"],"schema":"https://docs.trycontinuum.ai/mcp/schemas/agent_cancel.json","examples":[{"title":"Cancel a running agent job","arguments":{"jobId":"job_8f2c41d7"}}],"errors":[{"code":"BRAND_NOT_SELECTED","kind":"error","when":"No brand is active. Call `brands_select`."},{"code":"needs_role","kind":"status","when":"The person's role is too low for this call. Needs: Operator or higher. Ask an Admin or Owner."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."}],"related":["agent_ask","jobs_status"]},{"name":"analytics_creative_insights","listed":true,"area":"insights","docs":"https://docs.trycontinuum.ai/mcp/tools/insights#analytics_creative_insights","summary":"Ranks your Meta ad creatives by video retention: hook rate and hold rate.","mutates":false,"role":"viewer","integration":"facebook","connectionNote":"Meta (Facebook).","brandScoped":true,"confirmation":"none","completion":"async_job","retry":"natural_read","roleNote":"Viewer or higher","rateLimit":null,"inputs":{"platform":{"type":"string","values":["meta_ads"],"description":"The network to act on. See the allowed values."},"ad_account_id":{"type":"string","description":"The Meta ad account ID (`act_…`), from `account_map`."},"lookback_days":{"type":"integer","description":"How many days back to read."},"top_n":{"type":"integer","description":"How many top items to return."},"min_impressions":{"type":"integer","description":"Leave out ads with fewer impressions than this."}},"required":["platform"],"schema":"https://docs.trycontinuum.ai/mcp/schemas/analytics_creative_insights.json","examples":[{"title":"Top 10 IG ads","arguments":{"platform":"meta_ads","lookback_days":30,"top_n":10}}],"errors":[{"code":"VALIDATION_ERROR","kind":"error","when":"Only `meta_ads` has creative retention (hook/hold) data."},{"code":"BRAND_NOT_SELECTED","kind":"error","when":"No brand is active. Call `brands_select`."},{"code":"needs_integration","kind":"status","when":"The brand has no facebook connection. Call `integrations_connect`."}],"related":["jobs_status"]},{"name":"analytics_cross_platform_spend","listed":true,"area":"insights","docs":"https://docs.trycontinuum.ai/mcp/tools/insights#analytics_cross_platform_spend","summary":"Spend, conversions, cost per acquisition, and return on ad spend across your connected ad platforms.","mutates":false,"role":"viewer","integration":"facebook","connectionNote":"Meta (Facebook).","brandScoped":true,"confirmation":"none","completion":"async_job","retry":"natural_read","roleNote":"Viewer or higher","rateLimit":null,"inputs":{"platforms":{"type":"array","description":"Which platforms to include."},"ad_account_ids":{"type":"object","description":"The ad account IDs to read, per platform."},"since":{"type":"string","description":"Start of the window, as a date (`YYYY-MM-DD`)."},"until":{"type":"string","description":"End of the window, as a date (`YYYY-MM-DD`)."},"breakdown":{"type":"string","values":["day","week","platform","campaign"],"description":"What to break results down by."}},"required":["platforms","since","until"],"schema":"https://docs.trycontinuum.ai/mcp/schemas/analytics_cross_platform_spend.json","examples":[{"title":"Spend last 30d","arguments":{"platforms":["meta_ads"],"since":"2026-04-01","until":"2026-04-30"}}],"errors":[{"code":"BRAND_NOT_SELECTED","kind":"error","when":"No brand is active. Call `brands_select`."},{"code":"needs_integration","kind":"status","when":"The brand has no facebook connection. Call `integrations_connect`."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."}],"related":["analytics_pacing_diagnostic","analytics_creative_insights","jobs_status"]},{"name":"analytics_pacing_diagnostic","listed":true,"area":"insights","docs":"https://docs.trycontinuum.ai/mcp/tools/insights#analytics_pacing_diagnostic","summary":"Which Meta campaigns are pacing ahead of or behind budget, with a 0–100 health score.","mutates":false,"role":"viewer","integration":"facebook","connectionNote":"Meta (Facebook).","brandScoped":true,"confirmation":"none","completion":"async_job","retry":"natural_read","roleNote":"Viewer or higher","rateLimit":null,"inputs":{"platform":{"type":"string","values":["meta_ads"],"description":"The network to act on. See the allowed values."},"ad_account_id":{"type":"string","description":"The Meta ad account ID (`act_…`), from `account_map`."},"campaign_ids":{"type":"array","description":"The campaign IDs to include."},"as_of":{"type":"string"}},"required":["platform","ad_account_id"],"schema":"https://docs.trycontinuum.ai/mcp/schemas/analytics_pacing_diagnostic.json","examples":[{"title":"Pacing health","arguments":{"platform":"meta_ads","ad_account_id":"act_123"}}],"errors":[{"code":"BRAND_NOT_SELECTED","kind":"error","when":"No brand is active. Call `brands_select`."},{"code":"needs_integration","kind":"status","when":"The brand has no facebook connection. Call `integrations_connect`."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."}],"related":["analytics_cross_platform_spend","jobs_status"]},{"name":"analytics_query","listed":true,"area":"insights","docs":"https://docs.trycontinuum.ai/mcp/tools/insights#analytics_query","summary":"Organic, paid, and website results by platform: accounts, top posts, campaigns, ad sets, and ads.","mutates":false,"role":"viewer","roleByAction":{"instagram":"viewer","facebook":"viewer","tiktok":"viewer","linkedin":"viewer","youtube":"viewer","google_ads":"viewer","meta":"viewer","google_analytics":"viewer"},"integration":null,"connectionNote":"The one for what you act on: Meta (Facebook), Google, LinkedIn, YouTube.","brandScoped":true,"confirmation":"none","completion":"sync","retry":"natural_read","roleNote":"Viewer or higher.","rateLimit":null,"inputs":{"platform":{"type":"string","values":["instagram","facebook","tiktok","linkedin","youtube","google_ads","meta","google_analytics"],"description":"The network to act on. See the allowed values."},"account_id":{"type":"string","description":"Meta ad account id (required; not auto-resolved)."},"scope":{"type":"string","values":["account","top_posts","post","overview","campaign","top_campaigns","top_adsets","top_ads","kpis","list"],"description":"What to read. See the allowed values."},"date_window":{"type":"string","values":["last_7d","last_14d","last_30d","last_90d","last_month"],"description":"A preset time window. See the allowed values."},"metric":{"type":"string","values":["engagement_rate","reach","impressions","views","likes","comments","shares","saves","total_interactions","retention_rate"],"description":"The metric to rank or report by. See the allowed values."},"direction":{"type":"string","values":["top","bottom"],"description":"`top` or `bottom`."},"top_n":{"type":"integer","description":"How many top items to return."},"include":{"type":"array","description":"Extra data to include in the result."},"post_id":{"type":"string","description":"The post's ID on the platform."},"surface":{"type":"string","values":["organic","paid"]},"kpi":{"type":"string","values":["spend","impressions","clicks","ctr","cpc","cpm","conversions","conversions_value","cost_per_conversion","roas"],"description":"The KPI to rank by. See the allowed values."},"include_daily_trend":{"type":"boolean","description":"Add a day-by-day trend."},"since":{"type":"string","description":"Start of the window, as a date (`YYYY-MM-DD`)."},"until":{"type":"string","description":"End of the window, as a date (`YYYY-MM-DD`)."},"campaign_id":{"type":"string","description":"The campaign ID, from `paid_manage` `hierarchy` or `analytics_query`."},"adset_id":{"type":"string","description":"The ad set ID, from `paid_manage` `hierarchy` or `analytics_query`."},"level":{"type":"string","values":["campaign","adset","ad"],"description":"The level to read or act on: campaign, ad set, or ad."},"limit":{"type":"integer","description":"The most items to return."},"cursor":{"type":"string","description":"The pagination cursor from the previous result; omit it for the first page."},"property_id":{"type":"string","description":"GA4 property ID; omit to use the brand's default connected property."},"date_range":{"type":"object","description":"A custom date range."}},"actionKey":"platform","actions":[{"name":"instagram","required":["platform"],"uses":["account_id","scope","date_window","metric","direction","top_n","include","post_id"]},{"name":"facebook","required":["platform"],"uses":["account_id","scope","date_window","metric","direction","top_n","include","post_id"]},{"name":"tiktok","required":["platform"],"uses":["account_id","scope","date_window","metric","direction","top_n","include","post_id"]},{"name":"linkedin","required":["platform"],"uses":["account_id","surface","scope","date_window","metric","kpi","direction","top_n","include","include_daily_trend","since","until","post_id","campaign_id","adset_id"]},{"name":"youtube","required":["platform"],"uses":["account_id","scope","date_window","metric","direction","top_n"]},{"name":"google_ads","required":["platform"],"uses":["account_id","scope","kpi","date_window","since","until","direction","top_n","include_daily_trend","campaign_id","adset_id"]},{"name":"meta","required":["platform"],"uses":["account_id","scope","kpi","date_window","since","until","direction","top_n","include_daily_trend","level","limit","cursor","campaign_id","adset_id"]},{"name":"google_analytics","required":["platform"],"uses":["property_id","date_range"]}],"required":["platform"],"schema":"https://docs.trycontinuum.ai/mcp/schemas/analytics_query.json","examples":[{"title":"Top Instagram posts by engagement, last 30 days","arguments":{"platform":"instagram","scope":"top_posts","metric":"engagement_rate","date_window":"last_30d","top_n":5}},{"title":"Meta ad account overview, last 7 days","arguments":{"platform":"meta","account_id":"act_1234567890","scope":"overview","date_window":"last_7d"}}],"errors":[{"code":"ACCOUNT_FORBIDDEN","kind":"error","when":"That ad or social account isn't assigned to this brand, or the person can't reach it. Pick one from `accounts_list`."},{"code":"PERMISSION_DENIED","kind":"error","when":"The person's role can't do this. Ask an Admin or Owner."},{"code":"UPSTREAM_ERROR","kind":"error","when":"A platform or provider returned an error. `details` carries its message."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."},{"code":"needs_brand","kind":"status","when":"No brand is active. Call `brands_select`."},{"code":"needs_integration","kind":"status","when":"The brand lacks the connection this call needs. Call `integrations_connect` with the `platform` the result names."}],"related":["agent_ask","help_describe"]},{"name":"audience_query","listed":true,"area":"insights","docs":"https://docs.trycontinuum.ai/mcp/tools/insights#audience_query","summary":"Your Meta audiences, ad set targeting, and demographic and placement breakdowns.","mutates":false,"role":"viewer","roleByAction":{"list_audiences":"viewer","targeting":"viewer","breakdown":"viewer","organic_demographics":"viewer"},"integration":null,"brandScoped":true,"confirmation":"none","completion":"sync","retry":"natural_read","roleNote":"Viewer or higher.","rateLimit":null,"inputs":{"action":{"type":"string","values":["list_audiences","targeting","breakdown","organic_demographics"],"description":"The operation to run. Each value is listed under Actions."},"ad_account_id":{"type":"string","description":"The Meta ad account ID (`act_…`), from `account_map`."},"kind":{"type":"string","values":["custom","saved","all"],"description":"The type to filter by. See the allowed values."},"adset_id":{"type":"string","description":"The ad set ID, from `paid_manage` `hierarchy` or `analytics_query`."},"dimension":{"type":"string","values":["age","gender","country","region","publisher_platform","platform_position","impression_device","device_platform"],"description":"What to break results down by. See the allowed values."},"level":{"type":"string","values":["account","campaign","adset","ad"],"description":"The level to read or act on: campaign, ad set, or ad."},"object_id":{"type":"string","description":"The campaign, ad set, or ad ID to break down."},"date_window":{"type":"string","values":["last_7d","last_14d","last_30d","last_90d"],"description":"A preset time window. See the allowed values."},"granularity":{"type":"string","values":["total","daily"],"description":"`total` for the whole window, or `daily`."},"result_action_type":{"type":"string"},"platform":{"type":"string","values":["instagram","facebook","linkedin"],"description":"The network to act on. See the allowed values."},"account_id":{"type":"string","description":"The connected account to act on, from `accounts_list` or `account_map`."}},"actionKey":"action","actions":[{"name":"list_audiences","required":["action","ad_account_id"],"uses":["kind"]},{"name":"targeting","required":["action","ad_account_id","adset_id"],"uses":[]},{"name":"breakdown","required":["action","ad_account_id","dimension"],"uses":["level","object_id","date_window","granularity","result_action_type"]},{"name":"organic_demographics","required":["action","platform"],"uses":["account_id","date_window"]}],"required":["action"],"schema":"https://docs.trycontinuum.ai/mcp/schemas/audience_query.json","examples":[{"title":"List custom audiences","arguments":{"action":"list_audiences","ad_account_id":"act_1234567890","kind":"custom"}},{"title":"Results by age, last 30 days","arguments":{"action":"breakdown","ad_account_id":"act_1234567890","dimension":"age","date_window":"last_30d"}}],"errors":[{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."},{"code":"needs_brand","kind":"status","when":"No brand is active. Call `brands_select`."}],"related":["account_map","help_describe"]},{"name":"brand_context_get","listed":false,"docs":"https://docs.trycontinuum.ai/mcp/tools/unlisted#brand_context_get","summary":"Read the active brand's voice, mission/vision, negative keywords, primary URLs, and taxonomy tags.","mutates":false,"role":"viewer","integration":null,"brandScoped":true,"confirmation":"none","completion":"sync","retry":"natural_read","roleNote":"Viewer or higher","rateLimit":null,"inputs":{},"required":[],"schema":"https://docs.trycontinuum.ai/mcp/schemas/brand_context_get.json","examples":[{"title":"Read brand voice + tags","arguments":{}}],"errors":[{"code":"BRAND_NOT_READY","kind":"error","when":"Brand profile row missing."},{"code":"BRAND_NOT_SELECTED","kind":"error","when":"No brand is active. Call `brands_select`."},{"code":"INTERNAL","kind":"error","when":"Something went wrong on our side. Retry once, then contact support."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."}],"related":["brand_profile_get"]},{"name":"brand_knowledge","listed":true,"area":"account","docs":"https://docs.trycontinuum.ai/mcp/tools/account#brand_knowledge","summary":"Reads and searches your brand book and knowledge base, checks copy against your voice, and adds, updates, or archives source material.","mutates":true,"role":"viewer","roleByAction":{"overview":"viewer","search":"viewer","read":"viewer","validate":"viewer","document_status":"viewer","cross_reference":"viewer","add_text":"operator","add_file":"operator","add_url":"operator","upload_url":"operator","upload_finalize":"operator","update":"operator","archive":"operator","restore":"operator","save_permanent":"operator"},"integration":null,"brandScoped":true,"confirmation":"two_phase_confirm_token","completion":"sync_then_async","retry":"idempotency_key","roleNote":"Viewer or higher to read. Operator or higher for `add_text`, `add_file`, `add_url`, `upload_url`, `upload_finalize`, `update`, `archive`, `restore`, and `save_permanent`.","rateLimit":null,"inputs":{"action":{"type":"string","values":["overview","search","read","validate","document_status","cross_reference","add_text","add_file","add_url","upload_url","upload_finalize","update","archive","restore","save_permanent"],"description":"The operation to run. Each value is listed under Actions."},"query":{"type":"string","description":"What to look for, in plain words."},"sources":{"type":"array","description":"Which knowledge sources to search."},"categories":{"type":"array","description":"Which document categories to search."},"limit":{"type":"integer","description":"The most items to return."},"source":{"type":"string","values":["brand_book","guidelines","onboarding","profile","design_system"],"description":"Which source to read or filter by. See the allowed values."},"design_section":{"type":"string","values":["palette","typography","spacing","radii","shadows","layout","components","iconography","motion","voice","imagery","logo","formats"],"description":"Which design-system section to read."},"format":{"type":"string","values":["json","dtcg"],"description":"The format to make or return. See the allowed values."},"section":{"type":"string","values":["voice","pmf","audience","persona","all"],"description":"Which section to read. See the allowed values."},"purpose":{"type":"string","description":"What the read is for, so the answer fits it."},"full":{"type":"boolean","description":"Return the full content instead of a summary."},"copy":{"type":"string","description":"The copy to check."},"platform":{"type":"string","values":["instagram","facebook","linkedin","tiktok"],"description":"The network to act on. See the allowed values."},"document_id":{"type":"string","description":"A knowledge-base document ID, from `overview` or `search`."},"name":{"type":"string","description":"A display name."},"text":{"type":"string","description":"Plain text content."},"file_name":{"type":"string","description":"The file's name, with its extension."},"mime_type":{"type":"string","description":"The file's MIME type, such as `image/png`."},"file_base64":{"type":"string","description":"The file's bytes, base64-encoded."},"url":{"type":"string","description":"A public https URL."},"upload_path":{"type":"string","description":"The path `upload_url` returned."},"category":{"type":"string","values":["brand_guidelines","design_system","creative_strategy","audience_persona","product_info","campaign_deliverable","misc"],"description":"The category to file it under. See the allowed values."},"retention":{"type":"string","values":["permanent","ephemeral"],"description":"`permanent` keeps it brand-wide; `ephemeral` keeps it for this session."},"expected_updated_at":{"type":"string","description":"The item's `updated_at` from your last read. The write is refused if the item changed since."},"mode":{"type":"string","values":["preview","confirm"],"description":"How the call runs. For writes, `preview` returns a token and `confirm` applies it. See the allowed values."},"confirm_token":{"type":"string","description":"The token a preview returned. Send it back to confirm that exact change."},"operation_id":{"type":"string","description":"A stable ID for this write, so an exact retry returns the same receipt."},"lens_limit":{"type":"integer"}},"actionKey":"action","actions":[{"name":"overview","required":["action"],"uses":[]},{"name":"search","required":["action","query"],"uses":["sources","categories","limit"]},{"name":"read","required":["action","source"],"uses":["full","purpose","section","design_section","format"]},{"name":"validate","required":["action","copy","platform"],"uses":[]},{"name":"document_status","required":["action","document_id"],"uses":[]},{"name":"cross_reference","required":["action"],"uses":["lens_limit"]},{"name":"add_text","required":["action","name","text"],"uses":["category","retention"]},{"name":"add_file","required":["action","file_name","mime_type","file_base64"],"uses":["category","operation_id"]},{"name":"add_url","required":["action","name","url"],"uses":["category","retention"]},{"name":"upload_url","required":["action","file_name","mime_type"],"uses":[]},{"name":"upload_finalize","required":["action","upload_path"],"uses":["name","category","retention"]},{"name":"update","required":["action","document_id","name|category"],"uses":["expected_updated_at"]},{"name":"archive","required":["action","document_id"],"uses":["mode","confirm_token"]},{"name":"restore","required":["action","document_id"],"uses":[]},{"name":"save_permanent","required":["action","document_id"],"uses":[]}],"required":["action"],"confirmationExceptions":{"overview":"none","search":"none","read":"none","validate":"none","document_status":"none","cross_reference":"none"},"schema":"https://docs.trycontinuum.ai/mcp/schemas/brand_knowledge.json","examples":[{"title":"See what the knowledge base holds","arguments":{"action":"overview"}},{"title":"Search the brand book","arguments":{"action":"search","query":"tone of voice for promotions"}},{"title":"Check copy against the brand voice","arguments":{"action":"validate","copy":"Autumn is here. Our new single-origin roast is out now, in a limited batch.","platform":"instagram"}}],"errors":[{"code":"CONFLICT","kind":"error","when":"The item changed or is busy. Read it again, then retry with the current state."},{"code":"INTERNAL","kind":"error","when":"Something went wrong on our side. Retry once, then contact support."},{"code":"NOT_FOUND","kind":"error","when":"The item doesn't exist, or this brand can't see it."},{"code":"UNAUTHENTICATED","kind":"error","when":"The sign-in is missing or expired. Reconnect the assistant."},{"code":"UPSTREAM_ERROR","kind":"error","when":"A platform or provider returned an error. `details` carries its message."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."},{"code":"needs_brand","kind":"status","when":"No brand is active. Call `brands_select`."},{"code":"needs_role","kind":"status","when":"The person's role is too low for this call. Needs: Viewer or higher to read. Operator or higher for `add_text`, `add_file`, `add_url`, `upload_url`, `upload_finalize`, `update`, `archive`, `restore`, and `save_permanent`. Ask an Admin or Owner."},{"code":"CONFIRMATION_REQUIRED","kind":"error","when":"This write needs a preview first. Preview, get a yes, then confirm with the returned token."}],"related":["creative_strategy"]},{"name":"brand_profile_get","listed":false,"docs":"https://docs.trycontinuum.ai/mcp/tools/unlisted#brand_profile_get","summary":"Read the active brand's structured profile sections: voice, pmf (product-market fit), audience, and persona. Use section='all' to retrieve everything or specify a single section. …","mutates":false,"role":"viewer","integration":null,"brandScoped":true,"confirmation":"none","completion":"sync","retry":"natural_read","roleNote":"Viewer or higher","rateLimit":null,"inputs":{"section":{"type":"string","values":["voice","pmf","audience","persona","all"],"description":"Which section to read. See the allowed values."}},"required":[],"schema":"https://docs.trycontinuum.ai/mcp/schemas/brand_profile_get.json","examples":[{"title":"Read the brand voice section","arguments":{"section":"voice"}}],"errors":[{"code":"INTERNAL","kind":"error","when":"Something went wrong on our side. Retry once, then contact support."},{"code":"NOT_FOUND","kind":"error","when":"The item doesn't exist, or this brand can't see it."},{"code":"BRAND_NOT_SELECTED","kind":"error","when":"No brand is active. Call `brands_select`."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."}],"related":["brand_knowledge","brand_context_get"]},{"name":"brand_voice_validate","listed":false,"docs":"https://docs.trycontinuum.ai/mcp/tools/unlisted#brand_voice_validate","summary":"Brand voice rule checker. Validates copy against the brand's banned words (the brand DNA's one list, including brand.md edits), any configured voice_rules (required disclosures, e…","mutates":false,"role":"viewer","integration":null,"brandScoped":true,"confirmation":"none","completion":"sync","retry":"natural_read","roleNote":"Viewer or higher","rateLimit":null,"inputs":{"copy":{"type":"string","description":"The copy to check."},"platform":{"type":"string","values":["instagram","facebook","linkedin","tiktok","youtube","x"],"description":"The network to act on. See the allowed values."}},"actionKey":"platform","actions":[{"name":"instagram","required":["copy","platform"]},{"name":"facebook","required":["copy","platform"]},{"name":"linkedin","required":["copy","platform"]},{"name":"tiktok","required":["copy","platform"]},{"name":"youtube","required":["copy","platform"]},{"name":"x","required":["copy","platform"]}],"sharedInputs":["copy"],"required":["copy","platform"],"schema":"https://docs.trycontinuum.ai/mcp/schemas/brand_voice_validate.json","examples":[{"title":"Check an Instagram caption","arguments":{"copy":"Autumn is here. Our new single-origin roast is out now, in a limited batch.","platform":"instagram"}}],"errors":[{"code":"BRAND_NOT_SELECTED","kind":"error","when":"No brand is active. Call `brands_select`."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."}],"related":["brand_knowledge","content_create"]},{"name":"brands_create","listed":true,"area":"account","docs":"https://docs.trycontinuum.ai/mcp/tools/account#brands_create","summary":"Starts a new brand. You finish setting it up in the Continuum app.","mutates":true,"role":"none","integration":null,"brandScoped":false,"confirmation":"none","completion":"sync","retry":"none","roleNote":"Anyone signed in","rateLimit":null,"inputs":{"brand_name":{"type":"string","description":"The new brand's name."},"website_url":{"type":"string","description":"The brand's website, which Continuum analyzes to build the brand book."}},"required":["brand_name"],"schema":"https://docs.trycontinuum.ai/mcp/schemas/brands_create.json","examples":[{"title":"Start a brand from its website","arguments":{"brand_name":"Acme Coffee","website_url":"https://acmecoffee.example"}}],"errors":[{"code":"INTERNAL","kind":"error","when":"Something went wrong on our side. Retry once, then contact support."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."}],"related":["brands_select","brands_list"]},{"name":"brands_list","listed":true,"area":"account","docs":"https://docs.trycontinuum.ai/mcp/tools/account#brands_list","summary":"Lists the brands you can access.","mutates":false,"role":"none","integration":null,"brandScoped":false,"confirmation":"none","completion":"sync","retry":"natural_read","roleNote":"Anyone signed in","rateLimit":null,"inputs":{},"required":[],"schema":"https://docs.trycontinuum.ai/mcp/schemas/brands_list.json","examples":[{"title":"List brands","arguments":{}}],"errors":[{"code":"INTERNAL","kind":"error","when":"Something went wrong on our side. Retry once, then contact support."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."}],"related":["brands_select","brands_create"]},{"name":"brands_select","listed":true,"area":"account","docs":"https://docs.trycontinuum.ai/mcp/tools/account#brands_select","summary":"Sets the brand the conversation works on, tries to save it as your default for future sessions, and lists its published pipelines. Pass `null` to clear this session only.","mutates":true,"role":"none","integration":null,"brandScoped":false,"confirmation":"none","completion":"sync","retry":"naturally_idempotent","roleNote":"Anyone signed in","rateLimit":null,"inputs":{"brand_id":{"type":"string|null","description":"ID of an accessible brand from brands_list, or null to clear only the current session selection."}},"required":["brand_id"],"schema":"https://docs.trycontinuum.ai/mcp/schemas/brands_select.json","examples":[{"title":"Select brand","arguments":{"brand_id":"00000000-0000-0000-0000-000000000000"}}],"errors":[{"code":"BRAND_FORBIDDEN","kind":"error","when":"User lacks access to the selected brand."},{"code":"SESSION_NOT_INITIALIZED","kind":"error","when":"MCP session not yet established."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."}],"related":["brands_list","integrations_list"]},{"name":"cad_manage","listed":true,"area":"forge","docs":"https://docs.trycontinuum.ai/mcp/tools/forge#cad_manage","summary":"Uploads STL, DXF, or 3MF files, then transforms, renders, validates, or exports them.","mutates":true,"role":"operator","integration":null,"brandScoped":true,"confirmation":"none","completion":"sync_then_async","retry":"idempotency_key","roleNote":"Operator or higher","rateLimit":null,"inputs":{"brandId":{"type":"string"},"root":{"type":"string"},"files":{"type":"array","description":"The files to upload."},"requestId":{"type":"string"},"action":{"type":"string","values":["upload_begin","upload_finalize","apply","render","export","validate","manufacturing_export","benchmark","cancel"],"description":"The operation to run. Each value is listed under Actions."},"assetId":{"type":"string","description":"A Library asset ID an earlier call returned."},"baseRevision":{"type":"string"},"operations":{"type":"array"},"revisionId":{"type":"string","description":"A revision ID an earlier call returned."},"recipe":{"type":"object"},"width":{"type":"integer"},"height":{"type":"integer"},"frames":{"type":"integer"},"fps":{"type":"number"},"format":{"type":"string","values":["stl","dxf","3mf"],"description":"The format to make or return. See the allowed values."},"shellPolicy":{"type":"string","values":["separate_bodies","oriented_cavities"]},"profile":{"type":"object"},"profileId":{"type":"string","values":["offline-fff-pla-0.4-v1"]},"jobId":{"type":"string","description":"A job ID an earlier call returned."}},"actionKey":"action","actions":[{"name":"upload_begin","required":["brandId","root","files","requestId","action"],"uses":[]},{"name":"upload_finalize","required":["brandId","assetId","action"],"uses":[]},{"name":"apply","required":["brandId","assetId","baseRevision","requestId","operations","action"],"uses":[]},{"name":"render","required":["brandId","assetId","revisionId","requestId","recipe","width","height","frames","fps","action"],"uses":[]},{"name":"export","required":["brandId","assetId","revisionId","requestId","format","action"],"uses":[]},{"name":"validate","required":["brandId","assetId","revisionId","requestId","format","action"],"uses":["shellPolicy","profile"]},{"name":"manufacturing_export","required":["brandId","assetId","revisionId","requestId","format","action"],"uses":["shellPolicy","profile"]},{"name":"benchmark","required":["brandId","assetId","revisionId","requestId","profileId","action"],"uses":["shellPolicy","profile"]},{"name":"cancel","required":["action","brandId","jobId"],"uses":[]}],"required":["brandId","action"],"schema":"https://docs.trycontinuum.ai/mcp/schemas/cad_manage.json","examples":[{"title":"Run manufacturing checks on a revision","arguments":{"action":"validate","brandId":"5c8e1a3b-7d2f-4e6a-9b4c-0f1e3d5a7c92","assetId":"b7d3f9a1-4c6e-4a2b-8d5f-6e9c1b3a7d40","revisionId":"c3e5a7b9d1f2a4c6e8b0d2f4a6c8e0b2d4f6a8c0e2b4d6f8a0c2e4b6d8f0a2c4","requestId":"0d3f5b7a-9c1e-4a2b-8f4d-6b8a0c2e4f71","format":"stl"}}],"errors":[{"code":"BRAND_FORBIDDEN","kind":"error","when":"The person can't reach that brand."},{"code":"needs_brand","kind":"status","when":"No brand is active. Call `brands_select`."},{"code":"needs_role","kind":"status","when":"The person's role is too low for this call. Needs: Operator or higher. Ask an Admin or Owner."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."}],"related":["cad_query"]},{"name":"cad_query","listed":true,"area":"forge","docs":"https://docs.trycontinuum.ai/mcp/tools/forge#cad_query","summary":"Reads CAD mesh capabilities, files, revisions, and jobs.","mutates":false,"role":"viewer","integration":null,"brandScoped":true,"confirmation":"none","completion":"sync","retry":"natural_read","roleNote":"Any brand member","rateLimit":null,"inputs":{"action":{"type":"string","values":["capabilities","asset","entities","revision","job","artifact"],"description":"The operation to run. Each value is listed under Actions."},"assetId":{"type":"string","description":"A Library asset ID an earlier call returned."},"revisionId":{"type":"string","description":"A revision ID an earlier call returned."},"jobId":{"type":"string","description":"A job ID an earlier call returned."},"artifact":{"type":"object"},"offset":{"type":"integer","description":"How many items to skip."},"limit":{"type":"integer","description":"The most items to return."}},"actionKey":"action","actions":[{"name":"capabilities","required":["action"]},{"name":"asset","required":["action","assetId"]},{"name":"entities","required":["action","assetId"]},{"name":"revision","required":["action","assetId"]},{"name":"job","required":["action","jobId"]},{"name":"artifact","required":["action","assetId","artifact"]}],"sharedInputs":["assetId","revisionId","jobId","artifact","offset","limit"],"required":["action"],"schema":"https://docs.trycontinuum.ai/mcp/schemas/cad_query.json","examples":[{"title":"Which CAD files and operations are supported","arguments":{"action":"capabilities"}},{"title":"Read a CAD file and its revisions","arguments":{"action":"asset","assetId":"b7d3f9a1-4c6e-4a2b-8d5f-6e9c1b3a7d40"}}],"errors":[{"code":"BRAND_FORBIDDEN","kind":"error","when":"The person can't reach that brand."},{"code":"needs_brand","kind":"status","when":"No brand is active. Call `brands_select`."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."}],"related":["cad_manage"]},{"name":"content_create","listed":true,"area":"organic","docs":"https://docs.trycontinuum.ai/mcp/tools/organic#content_create","summary":"Drafts, approves, and publishes posts, and deletes drafts.","mutates":true,"role":"operator","roleByAction":{"list":"viewer","draft":"operator","extend":"operator","realize":"operator","approve":"operator","publish":"operator","delete":"operator"},"integration":null,"connectionNote":"The connection for the post’s platform.","brandScoped":true,"confirmation":"two_phase_confirm_token","completion":"sync_then_async","retry":"idempotency_key","roleNote":"Viewer or higher for `list`. Operator or higher for every other action.","rateLimit":null,"rateLimitNote":"Publishing 30, approvals 60, and deletions 30 an hour, per brand.","inputs":{"action":{"type":"string","values":["list","draft","extend","realize","approve","publish","delete"],"description":"The operation to run. Each value is listed under Actions."},"prompt":{"type":"string","description":"Instructions in plain words."},"platform":{"type":"string","values":["instagram","facebook","linkedin","tiktok","youtube","x"],"description":"The platform the post is for. Required for action=draft."},"format":{"type":"string","description":"Post type — reel, carousel, post, story, linkedin_post, video, short, static, hyperframe. Stored canonical; aliases (\"Reel\", \"feed_post\") resolve to the closes…"},"scheduledAt":{"type":"string","description":"When to schedule the post, as an ISO 8601 date-time."},"accountId":{"type":"string","description":"The connected account to post from."},"timezone":{"type":"string","description":"An IANA time zone, such as `America/New_York`."},"reference_assets":{"type":"array","description":"Pinned Library images from library_manage. Used as visual references during Organic creative generation."},"unsplash_photos":{"type":"array","description":"Photo ids from unsplash_search, used as visual references during Organic creative generation (hotlinked, never stored)."},"generate":{"type":"boolean","description":"Set to `false` to save your own copy without generating."},"caption":{"type":"string","description":"Already-approved caption to store verbatim. Requires generate=false — a generated draft would overwrite it."},"hashtags":{"type":"object","description":"Already-approved hashtag tiers ({high,medium,low}). Requires generate=false."},"draftId":{"type":"string","description":"A Planner draft ID, from `organic_draft_list` or `planner_manage`."},"preview_revision":{"type":"string"},"regenerate":{"type":"boolean","description":"realize: redo a realized draft's images in place (prompt = art direction); approved/scheduled → draft."},"slides":{"type":"array","description":"With regenerate: 1-based carousel slides to redo."},"updates":{"type":"object","description":"The fields to change on the draft."},"idempotency_key":{"type":"string","description":"A key you choose. Reuse it only to retry the same request without doing it twice."},"operation_id":{"type":"string","description":"A stable ID for this write, so an exact retry returns the same receipt."},"confirm_token":{"type":"string","description":"The token a preview returned. Send it back to confirm that exact change."},"mode":{"type":"string","values":["preview","confirm"],"description":"How the call runs. For writes, `preview` returns a token and `confirm` applies it. See the allowed values."},"publishable_only":{"type":"boolean","description":"Only drafts that are ready to publish."},"listStatus":{"type":"string","values":["draft","placeholder","approved","scheduled","published","failed","all"],"description":"Which drafts to list. See the allowed values."},"limit":{"type":"integer","description":"The most items to return."},"cursor":{"type":"string","description":"The pagination cursor from the previous result; omit it for the first page."}},"actionKey":"action","actions":[{"name":"list","required":["action"],"uses":["publishable_only","listStatus","limit","cursor"]},{"name":"draft","required":["action","platform"],"uses":["prompt","format","scheduledAt","accountId","timezone","reference_assets","unsplash_photos","generate","caption","hashtags","idempotency_key"]},{"name":"extend","required":["action","draftId","updates|prompt"],"uses":["idempotency_key"]},{"name":"realize","required":["action","draftId"],"uses":["preview_revision","regenerate","slides","prompt","reference_assets","unsplash_photos"]},{"name":"approve","required":["action","draftId"],"uses":[]},{"name":"publish","required":["action","draftId","confirm_token"],"uses":["accountId","operation_id"]},{"name":"delete","required":["action","draftId","mode"],"uses":["confirm_token","idempotency_key"]}],"required":["action"],"confirmationExceptions":{"list":"none"},"schema":"https://docs.trycontinuum.ai/mcp/schemas/content_create.json","examples":[{"title":"Draft a post from a prompt","arguments":{"action":"draft","prompt":"a Reel about our summer launch","platform":"instagram"}},{"title":"Rewrite a draft's caption (natural language)","arguments":{"action":"extend","draftId":"00000000-0000-0000-0000-000000000000","prompt":"Rewrite the caption and CTA in Mexican Spanish; keep the concept and a friendly tone."}},{"title":"Structured field change (reschedule a draft)","arguments":{"action":"extend","draftId":"00000000-0000-0000-0000-000000000000","updates":{"scheduled_date":"2026-08-01T15:00:00.000Z"}}},{"title":"Generate the creative — step 1: read the preview waiting for approval","arguments":{"action":"realize","draftId":"00000000-0000-0000-0000-000000000000"}},{"title":"Generate the creative — step 2: approve that exact preview and spend","arguments":{"action":"realize","draftId":"00000000-0000-0000-0000-000000000000","preview_revision":"the preview_revision step 1 returned"}},{"title":"Redo slide 2 of a realized carousel on the same draft (then confirm with approve_with.input)","arguments":{"action":"realize","draftId":"00000000-0000-0000-0000-000000000000","regenerate":true,"slides":[2],"prompt":"warmer, golden-hour light"}}],"errors":[{"code":"VALIDATION_ERROR","kind":"error","when":"action=extend cannot set status to approved/scheduled/published/failed — those are owned by action=approve and action=publish. Only 'draft' and 'placeholder' are settable."},{"code":"BRAND_NOT_READY","kind":"error","when":"Finish brand onboarding before creating content."},{"code":"CONFLICT","kind":"error","when":"The item changed or is busy. Read it again, then retry with the current state."},{"code":"INTERNAL","kind":"error","when":"Something went wrong on our side. Retry once, then contact support."},{"code":"JOB_ENQUEUE_FAILED","kind":"error","when":"The job couldn't start. Retry once, then contact support."},{"code":"NOT_FOUND","kind":"error","when":"The item doesn't exist, or this brand can't see it."},{"code":"UPSTREAM_ERROR","kind":"error","when":"A platform or provider returned an error. `details` carries its message."},{"code":"VOICE_VIOLATION","kind":"error","when":"The copy breaks a brand voice rule, such as a banned word. `details` names the rule; rewrite and try again."},{"code":"needs_brand","kind":"status","when":"No brand is active. Call `brands_select`."},{"code":"needs_role","kind":"status","when":"The person's role is too low for this call. Needs: Viewer or higher for `list`. Operator or higher for every other action. Ask an Admin or Owner."},{"code":"needs_integration","kind":"status","when":"The brand lacks the connection this call needs. Call `integrations_connect` with the `platform` the result names."},{"code":"CONFIRMATION_REQUIRED","kind":"error","when":"This write needs a preview first. Preview, get a yes, then confirm with the returned token."}],"notes":["`approve` returns the `confirm_token` that `publish` needs. Publish only after the person says yes.","`platform` accepts every network the schema knows. Publishing is live on Instagram; Publishing has the status of the others; X and Threads are for planning and drafts only.","`realize` (generating the creative) and `delete` are two-phase. A `realize` preview returns `approve_with`: send `approve_with.input` back as the next `realize` call to confirm exactly what was previewed. `delete` returns a `confirm_token` instead.","`reference_assets` (up to 8 Library images) and `unsplash_photos` (up to 4) steer image generation, on `draft` and `realize` only.","`draft` needs a `prompt` unless you pass `generate: false`; then it saves the `caption` and `hashtags` you pass word for word."],"related":["organic_draft_get","organic_draft_list","agent_ask","planner_manage","library_manage","unsplash_search"]},{"name":"content_reference","listed":true,"area":"organic","docs":"https://docs.trycontinuum.ai/mcp/tools/organic#content_reference","summary":"Remakes a public Instagram post or reel as your brand's own: its structure, never its words.","mutates":true,"role":"operator","integration":null,"brandScoped":true,"confirmation":"two_phase_confirm_token","completion":"async_job","retry":"confirm_token_single_use","roleNote":"Operator or higher","rateLimit":null,"inputs":{"action":{"type":"string","values":["inspect","recreate"],"description":"inspect: a public Instagram post's structure (hook pattern, beats and timing, format, text density, pacing, proof, CTA) and a plan to remake it for the brand. …"},"url":{"type":"string","description":"inspect: the post link. Pass a public Instagram post or reel link: https://www.instagram.com/p/<code>/, /reel/<code>/ or /reels/<code>/."},"plan":{"type":"object","description":"recreate: the plan inspect returned, unchanged (the confirm_token is bound to it)."},"mode":{"type":"string","values":["preview","confirm"],"description":"recreate: 'confirm' runs it."},"confirm_token":{"type":"string","description":"recreate confirm: from the preview."},"max_usd":{"type":"number","description":"recreate confirm: the most it may spend in USD; required when the preview says requires_max_usd. Refused before any spend when the engine’s own cap is higher."},"footage_asset_ids":{"type":"array","description":"recreate confirm of a footage_edit plan: the brand's own Library videos of the brief's beats (upload them with media_upload_and_clip)."}},"actionKey":"action","actions":[{"name":"inspect","required":["action","url"],"uses":[]},{"name":"recreate","required":["action","plan"],"uses":["mode","confirm_token","max_usd","footage_asset_ids"]}],"required":["action"],"schema":"https://docs.trycontinuum.ai/mcp/schemas/content_reference.json","examples":[{"title":"Read a reel and plan our version","arguments":{"action":"inspect","url":"https://www.instagram.com/reel/DegOQG6Tydw/"}}],"errors":[{"code":"JOB_ENQUEUE_FAILED","kind":"error","when":"The job couldn't start. Retry once, then contact support."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."},{"code":"needs_brand","kind":"status","when":"No brand is active. Call `brands_select`."},{"code":"needs_role","kind":"status","when":"The person's role is too low for this call. Needs: Operator or higher. Ask an Admin or Owner."},{"code":"CONFIRMATION_REQUIRED","kind":"error","when":"This write needs a preview first. Preview, get a yes, then confirm with the returned token."}],"related":["jobs_status","video_editor","headless_content"]},{"name":"creative_strategy","listed":true,"area":"insights","docs":"https://docs.trycontinuum.ai/mcp/tools/insights#creative_strategy","summary":"What works for you: opening-line (hook) scoring, win rates, and competitive gaps.","mutates":false,"role":"viewer","roleByAction":{"overview":"viewer","search":"viewer","read":"viewer","refresh":"operator","score_hook":"viewer","competitive_gaps":"viewer","winrates":"viewer","vector_signals":"viewer"},"integration":null,"brandScoped":true,"confirmation":"none","completion":"sync","retry":"natural_read","roleNote":"Viewer or higher to read. Operator or higher for `refresh`.","rateLimit":null,"inputs":{"action":{"type":"string","values":["overview","search","read","refresh","score_hook","competitive_gaps","winrates","vector_signals"],"description":"The operation to run. Each value is listed under Actions."},"query":{"type":"string","description":"What to look for, in plain words."},"kinds":{"type":"array"},"surfaces":{"type":"array"},"limit":{"type":"integer","description":"The most items to return."},"insight_id":{"type":"string"},"hook_text":{"type":"string","description":"The opening line to score."},"mode":{"type":"string","values":["fast","deep"],"description":"How the call runs. For writes, `preview` returns a token and `confirm` applies it. See the allowed values."},"target":{"type":"string","values":["organic","paid"],"description":"Where the call applies. See the allowed values."},"window":{"type":"string","values":["d7","d14","d30"],"description":"The time window. See the allowed values."},"dimension":{"type":"string","values":["asset_type","hook_archetype","angle","angle_id","theme","funnel_stage","visual_style"],"description":"What to break results down by. See the allowed values."},"funnel_stage":{"type":"string","values":["tof","mof","bof","unknown"]},"scope":{"type":"string","values":["brand","adset"],"description":"What to read. See the allowed values."}},"actionKey":"action","actions":[{"name":"overview","required":["action"],"uses":[]},{"name":"search","required":["action","query"],"uses":["kinds","surfaces","limit"]},{"name":"read","required":["action"],"uses":["insight_id"]},{"name":"refresh","required":["action"],"uses":["target"]},{"name":"score_hook","required":["action","hook_text"],"uses":["mode"]},{"name":"competitive_gaps","required":["action"],"uses":[]},{"name":"winrates","required":["action"],"uses":["scope","window","dimension","funnel_stage"]},{"name":"vector_signals","required":["action"],"uses":["window"]}],"required":["action"],"schema":"https://docs.trycontinuum.ai/mcp/schemas/creative_strategy.json","examples":[{"title":"Inventory + leaderboards","arguments":{"action":"overview"}},{"title":"Find winning hooks","arguments":{"action":"search","query":"curiosity hook","kinds":["hook"]}},{"title":"Read one insight","arguments":{"action":"read","insight_id":"hook-problem_agitation"}}],"errors":[{"code":"VALIDATION_ERROR","kind":"error","when":"action=search requires `query`."},{"code":"BRAND_NOT_SELECTED","kind":"error","when":"Call `brands_select` first."},{"code":"needs_brand","kind":"status","when":"No brand is active. Call `brands_select`."},{"code":"needs_role","kind":"status","when":"The person's role is too low for this call. Needs: Viewer or higher to read. Operator or higher for `refresh`. Ask an Admin or Owner."}],"related":["brand_knowledge","analytics_query","content_create","analytics_creative_insights"]},{"name":"forge_manage","listed":true,"area":"forge","docs":"https://docs.trycontinuum.ai/mcp/tools/forge#forge_manage","summary":"Writes versions into a template, previews them, and produces final renders. Full contracts: Forge functions.","mutates":true,"role":"operator","roleByAction":{"set_create":"operator","set_update":"operator","set_fork":"operator","set_delete":"operator","suggest_rows":"operator","apply_suggestions":"operator","source_begin":"operator","source_status":"operator","source_figma":"operator","render_preview":"operator","render_confirm":"operator","scene_fill":"operator","scene_render":"operator","rows_patch":"operator","set_retarget":"operator","template_preview":"operator","template_save":"operator","template_forge":"admin","template_set_default":"admin"},"integration":null,"brandScoped":true,"confirmation":"two_phase_confirm_token","completion":"sync_then_async","retry":"none","roleNote":"Operator or higher. Admin or Owner for `template_forge`, `template_set_default`, and renders with `final: true`.","rateLimit":null,"inputs":{"action":{"type":"string","values":["set_create","set_update","set_fork","set_delete","suggest_rows","apply_suggestions","source_begin","source_status","source_figma","render_preview","render_confirm","scene_fill","scene_render","rows_patch","set_retarget","template_preview","template_save","template_forge","template_set_default"],"description":"The operation to run. Each value is listed under Actions."},"setId":{"type":"string","description":"A Forge render set ID, from `forge_query` `sets`."},"templateKey":{"type":"string","description":"A Forge template key, from `forge_query` `templates`."},"bindingId":{"type":"string","description":"The template binding ID from `forge_query`, needed when a template key exists in two workspaces."},"name":{"type":"string","description":"A display name."},"description":{"type":"string|null","description":"A short description."},"rows":{"type":"array","description":"Render set rows, each with its own values."},"settings":{"type":"object","description":"Delivery defaults for the set."},"expectedRevision":{"type":"integer","description":"The revision number from your last read. The write is refused if it changed since."},"prompt":{"type":"string","description":"Instructions in plain words."},"count":{"type":"integer","description":"How many rows to draft at most."},"autoCount":{"type":"boolean","description":"Let it decide how many rows to draft."},"documentIds":{"type":"array","description":"Knowledge documents to draft from."},"mediaAssetIds":{"type":"array","description":"Library media to draft from."},"upload_intent_id":{"type":"string","description":"The upload ID that `source_begin` or `upload_begin` returned."},"figmaUrl":{"type":"string","description":"A Figma file or frame link."},"figmaNodeIds":{"type":"array","description":"Frame IDs from the file, up to 5."},"varyKeys":{"type":"array"},"seed":{"type":"object"},"parentRowId":{"type":"string","description":"The row that new rows inherit their values from."},"rowIds":{"type":"array","description":"Render set row IDs."},"approvalDestinationIds":{"type":"array"},"slackDestinationId":{"type":"string|null"},"final":{"type":"boolean","description":"`true` renders final, non-proof versions. Admin or Owner only."},"acceptMissingFonts":{"type":"boolean"},"acceptLinkedLineMismatch":{"type":"boolean"},"acceptOffPaletteColor":{"type":"boolean"},"renderer":{"type":"string","values":["experimental"]},"microFallbackPolicy":{"type":"string","values":["fail"]},"confirmationToken":{"type":"string","description":"The token `render_preview` or `scene_fill` returned."},"assetId":{"type":"string","description":"A Library asset ID an earlier call returned."},"versionId":{"type":"string","description":"A Library asset version ID, returned with the asset."},"brief":{"type":"object","description":"A short brief, in plain words, that steers what gets made."},"outputs":{"type":"array"},"templateRevisionId":{"type":"string","description":"A published template revision ID."},"revision":{"type":"integer"},"removeRowIds":{"type":"array","description":"The rows to remove."},"parentRevisionId":{"type":"string"},"edits":{"type":"object"},"compId":{"type":"integer"},"variantId":{"type":"string"},"idempotencyKey":{"type":"string"},"step":{"type":"string","values":["start","decisions","draft","smoke","promote","resume"]},"templateName":{"type":"string"},"decisions":{"type":"any"}},"actionKey":"action","actions":[{"name":"set_create","required":["action","templateKey","name","rows"]},{"name":"set_update","required":["action","setId","expectedRevision"]},{"name":"set_fork","required":["action","setId"]},{"name":"set_delete","required":["action","setId"]},{"name":"suggest_rows","required":["action","setId","prompt"]},{"name":"apply_suggestions","required":["action","setId","rows","expectedRevision"]},{"name":"source_begin","required":["action"]},{"name":"source_status","required":["action","upload_intent_id"]},{"name":"source_figma","required":["action","figmaUrl"]},{"name":"render_preview","required":["action","setId"]},{"name":"render_confirm","required":["action","confirmationToken"]},{"name":"scene_fill","required":["action","assetId","versionId"]},{"name":"scene_render","required":["action","confirmationToken"]},{"name":"rows_patch","required":["action","setId","rows","expectedRevision"]},{"name":"set_retarget","required":["action","setId","expectedRevision","templateRevisionId"]},{"name":"template_preview","required":["action","assetId","parentRevisionId","edits"]},{"name":"template_save","required":["action","name","assetId","parentRevisionId","edits"]},{"name":"template_forge","required":["action","assetId","step","templateName"]},{"name":"template_set_default","required":["action","assetId","variantId"]}],"sharedInputs":["setId","templateKey","bindingId","name","description","rows","settings","expectedRevision","prompt","count","autoCount","documentIds","mediaAssetIds","upload_intent_id","figmaUrl","figmaNodeIds","varyKeys","seed","parentRowId","rowIds","approvalDestinationIds","slackDestinationId","final","acceptMissingFonts","acceptLinkedLineMismatch","acceptOffPaletteColor","renderer","microFallbackPolicy","confirmationToken","assetId","versionId","brief","outputs","templateRevisionId","revision","removeRowIds","parentRevisionId","edits","compId","variantId","idempotencyKey","step","templateName","decisions"],"required":["action"],"confirmationExceptions":{"set_delete":"none"},"schema":"https://docs.trycontinuum.ai/mcp/schemas/forge_manage.json","examples":[{"title":"Open a signed-in mixed-file handoff","arguments":{"action":"source_begin"}},{"title":"Read each uploaded source and its ready ID","arguments":{"action":"source_status","upload_intent_id":"00000000-0000-4000-8000-000000000000"}},{"title":"Draft from extracted files and media without a fixed row count","arguments":{"action":"suggest_rows","setId":"00000000-0000-4000-8000-000000000000","documentIds":["00000000-0000-4000-8000-000000000001"],"mediaAssetIds":["00000000-0000-4000-8000-000000000002"],"autoCount":true,"count":10}},{"title":"Append selected draft rows once","arguments":{"action":"apply_suggestions","setId":"00000000-0000-4000-8000-000000000000","expectedRevision":0,"rows":[{"id":"00000000-0000-4000-8000-000000000003","parentId":null,"label":"Offer","overrides":{"headline":"Today only"}}]}}],"errors":[{"code":"BRAND_FORBIDDEN","kind":"error","when":"The person can't reach that brand."},{"code":"CONFLICT","kind":"error","when":"The item changed or is busy. Read it again, then retry with the current state."},{"code":"NOT_FOUND","kind":"error","when":"The item doesn't exist, or this brand can't see it."},{"code":"PERMISSION_DENIED","kind":"error","when":"The person's role can't do this. Ask an Admin or Owner."},{"code":"UNAUTHENTICATED","kind":"error","when":"The sign-in is missing or expired. Reconnect the assistant."},{"code":"UPSTREAM_ERROR","kind":"error","when":"A platform or provider returned an error. `details` carries its message."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."},{"code":"needs_brand","kind":"status","when":"No brand is active. Call `brands_select`."},{"code":"needs_role","kind":"status","when":"The person's role is too low for this call. Needs: Operator or higher. Admin or Owner for `template_forge`, `template_set_default`, and renders with `final: true`. Ask an Admin or Owner."},{"code":"CONFIRMATION_REQUIRED","kind":"error","when":"This write needs a preview first. Preview, get a yes, then confirm with the returned token."}],"notes":["`render_preview` returns a `confirmationToken` that `render_confirm` redeems. `set_delete` deletes with no preview, so ask first. Per-action contracts: Forge functions."],"related":["forge_query","brand_knowledge","library_manage","media_upload_and_clip","paid_manage"]},{"name":"forge_query","listed":true,"area":"forge","docs":"https://docs.trycontinuum.ai/mcp/tools/forge#forge_query","summary":"Lists Forge templates, sets, and render jobs. Full contracts: Forge functions.","mutates":false,"role":"viewer","roleByAction":{"templates":"viewer","template":"viewer","sets":"viewer","set":"viewer","set_revisions":"viewer","destinations":"viewer","jobs":"viewer","job":"viewer","batch":"viewer","scenes":"viewer","set_diff":"viewer","template_tree":"viewer","template_layers":"viewer","template_revision":"viewer","template_diff":"viewer","template_run":"viewer","sources":"viewer"},"integration":null,"brandScoped":true,"confirmation":"none","completion":"sync","retry":"natural_read","roleNote":"Viewer or higher.","rateLimit":null,"inputs":{"action":{"type":"string","values":["templates","template","sets","set","set_revisions","destinations","jobs","job","batch","scenes","set_diff","template_tree","template_layers","template_revision","template_diff","template_run","sources"],"description":"The operation to run. Each value is listed under Actions."},"templateKey":{"type":"string","description":"A Forge template key, from `forge_query` `templates`."},"bindingId":{"type":"string","description":"The template binding ID from `forge_query`, needed when a template key exists in two workspaces."},"setId":{"type":"string","description":"A Forge render set ID, from `forge_query` `sets`."},"jobId":{"type":"string","description":"A job ID an earlier call returned."},"status":{"type":"string","values":["submitting","queued","rendering","finished","failed"],"description":"The status to filter by or set. See the allowed values."},"limit":{"type":"integer","description":"The most items to return."},"batchId":{"type":"string"},"waitSeconds":{"type":"integer"},"rowIds":{"type":"array","description":"Render set row IDs."},"fromRevision":{"type":"integer"},"toRevision":{"type":"integer","description":"The revision to go back to."},"assetId":{"type":"string","description":"A Library asset ID an earlier call returned."},"revisionId":{"type":"string","description":"A revision ID an earlier call returned."},"toRevisionId":{"type":"string"}},"actionKey":"action","actions":[{"name":"templates","required":["action"]},{"name":"template","required":["action","templateKey"]},{"name":"sets","required":["action"]},{"name":"set","required":["action","setId"]},{"name":"set_revisions","required":["action","setId"]},{"name":"destinations","required":["action"]},{"name":"jobs","required":["action"]},{"name":"job","required":["action","jobId"]},{"name":"batch","required":["action","batchId"]},{"name":"scenes","required":["action"]},{"name":"set_diff","required":["action","setId","fromRevision"]},{"name":"template_tree","required":["action","assetId"]},{"name":"template_layers","required":["action","revisionId"]},{"name":"template_revision","required":["action","revisionId"]},{"name":"template_diff","required":["action","revisionId","toRevisionId"]},{"name":"template_run","required":["action","assetId"]},{"name":"sources","required":["action"]}],"sharedInputs":["templateKey","bindingId","setId","jobId","status","limit","batchId","waitSeconds","rowIds","fromRevision","toRevision","assetId","revisionId","toRevisionId"],"required":["action"],"schema":"https://docs.trycontinuum.ai/mcp/schemas/forge_query.json","examples":[{"title":"Wait on a batch in a background task until done is true","arguments":{"action":"batch","batchId":"00000000-0000-4000-8000-000000000000","waitSeconds":50}},{"title":"What a variation renders differently from its parent row","arguments":{"action":"set_diff","setId":"00000000-0000-4000-8000-000000000000","rowIds":["00000000-0000-4000-8000-000000000001","00000000-0000-4000-8000-000000000002"]}}],"errors":[{"code":"NOT_FOUND","kind":"error","when":"The item doesn't exist, or this brand can't see it."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."},{"code":"needs_brand","kind":"status","when":"No brand is active. Call `brands_select`."}],"notes":["Per-action contracts, recipes, and recovery steps: Forge functions."],"related":["forge_manage","paid_manage"]},{"name":"headless_content","listed":true,"area":"organic","docs":"https://docs.trycontinuum.ai/mcp/tools/organic#headless_content","summary":"Makes vertical reels, stills, and carousels from your brand guide without opening the canvas.","mutates":true,"role":"operator","roleByAction":{"guide":"viewer","inspect":"viewer","create":"operator","create_spec":"operator","create_stills":"operator","act":"operator","style_draft":"operator","recompose":"operator","status":"viewer"},"integration":null,"brandScoped":true,"confirmation":"none","completion":"async_job","retry":"none","roleNote":"Viewer or higher for `guide`, `inspect`, and `status`. Operator or higher for every other action.","rateLimit":null,"inputs":{"action":{"type":"string","values":["guide","inspect","create","create_spec","create_stills","act","style_draft","recompose","status"],"description":"guide: what create accepts (angles, personas, approved people, places and products, concepts, effects, templates, layouts, edits, shortcuts). inspect: the type…"},"portfolio_id":{"type":"string","description":"guide: an Optimizer portfolio, to list its personas and winning angles."},"schema":{"type":"boolean","description":"guide: also return the create_spec, create_stills and style_draft schemas and rules (large)."},"view":{"type":"string","values":["schema","elements","facts","seeds","content","compile","run","poses"],"description":"inspect: elements (named Character/Scene/Product Elements), facts (approved brand facts), seeds (proven seeds), schema (graph payload schemas), content / compi…"},"id":{"type":"string","description":"inspect: the content or run id the view reads."},"revision":{"type":"integer","description":"inspect: the content revision."},"guidance":{"type":"object","description":"create: ids and choices from action=guide; the director writes every hook, line and CTA from the brand's data."},"request_json":{"type":"string","description":"create_spec: the reel request as JSON (delivery.edit makes it a fast cut or a collage). create_stills: the still request as JSON. Their schemas: action=guide w…"},"graph_action":{"type":"string","values":["create_element","revise_element","approve_element","prepare_reference","prepare_character","approve_character","save_content","generate","prepare_start_frame","review","run"],"description":"act: which graph action; its payload schema is inspect view=schema."},"payload_json":{"type":"string","description":"act: the graph action payload as JSON. style_draft: the style draft as JSON."},"shortcuts":{"type":"array","description":"Catalog shortcut slugs without the slash (goldenhour, 35mmfilm, noir) or a brand skill slug, only when the user asked for them: each adds its light, camera or …"},"brandBook":{"type":"boolean","description":"On by default: the brand book's imagery, personality and saved generation defaults direct every shot or slide. The saved logo preference guides inclusion; any …"},"max_usd":{"type":"number","description":"Required on every call that can spend (create, create_spec, create_stills, and act prepare_reference / prepare_character / generate / prepare_start_frame / run…"},"dry_run":{"type":"boolean","description":"create: direct only and return the plans; nothing is generated or spent beyond model tokens."},"run_id":{"type":"string","description":"status: a run id from a create result."},"reel_asset_id":{"type":"string","description":"recompose: the made reel (status asset_id), rendered with motionOverlay=true."},"ops_json":{"type":"string","description":"A JSON array of 1 to 50 HyperFrames motion ops on the reel overlay, in reel seconds, naming its animations (cta, cta-words, card-1, card-1-title, card-1-lines,…"}},"actionKey":"action","actions":[{"name":"guide","required":["action"],"uses":["portfolio_id","schema"]},{"name":"inspect","required":["action","view"],"uses":["id","revision"]},{"name":"create","required":["action","max_usd","guidance"],"uses":["dry_run","shortcuts","brandBook"]},{"name":"create_spec","required":["action","max_usd","request_json"],"uses":["shortcuts","brandBook"]},{"name":"create_stills","required":["action","max_usd","request_json"],"uses":["shortcuts","brandBook"]},{"name":"act","required":["action","graph_action","payload_json"],"uses":["max_usd"]},{"name":"style_draft","required":["action","payload_json"],"uses":[]},{"name":"recompose","required":["action","reel_asset_id","ops_json"],"uses":[]},{"name":"status","required":["action","run_id"],"uses":[]}],"required":["action"],"schema":"https://docs.trycontinuum.ai/mcp/schemas/headless_content.json","examples":[{"title":"What a reel can be built from","arguments":{"action":"guide"}},{"title":"Plan a collage fast-cut reel first, spending nothing","arguments":{"action":"create","guidance":{"reels":1,"stills":0,"language":"en","pacing":"build","layout":"collage"},"max_usd":20,"dry_run":true}},{"title":"The approved Elements","arguments":{"action":"inspect","view":"elements"}}],"errors":[{"code":"over_max_usd","kind":"status","when":"The plan's upper bound is over `max_usd`; nothing was spent. Raise it or ask for less."},{"code":"elements_need_approval","kind":"status","when":"The director drafted a person or place; a person approves it in Continuum before anything is generated."},{"code":"INTERNAL","kind":"error","when":"Something went wrong on our side. Retry once, then contact support."},{"code":"JOB_ENQUEUE_FAILED","kind":"error","when":"The job couldn't start. Retry once, then contact support."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."},{"code":"needs_brand","kind":"status","when":"No brand is active. Call `brands_select`."},{"code":"needs_role","kind":"status","when":"The person's role is too low for this call. Needs: Viewer or higher for `guide`, `inspect`, and `status`. Operator or higher for every other action. Ask an Admin or Owner."}],"related":["jobs_status","list_elements","unsplash_search"]},{"name":"help_describe","listed":true,"area":"account","docs":"https://docs.trycontinuum.ai/mcp/tools/account#help_describe","summary":"Describes any registered tool and its actions: the full input schema, examples, and common errors.","mutates":false,"role":"none","integration":null,"brandScoped":false,"confirmation":"none","completion":"sync","retry":"natural_read","roleNote":"Anyone signed in","rateLimit":null,"inputs":{"tool":{"type":"string"},"action":{"type":"string","description":"The operation to run. Each value is listed under Actions."}},"required":[],"schema":"https://docs.trycontinuum.ai/mcp/schemas/help_describe.json","examples":[{"title":"List every registered tool","arguments":{}},{"title":"Fetch one action of a tool","arguments":{"tool":"paid_manage","action":"create_campaign"}}],"errors":[{"code":"INTERNAL","kind":"error","when":"Something went wrong on our side. Retry once, then contact support."},{"code":"NOT_FOUND","kind":"error","when":"The item doesn't exist, or this brand can't see it."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."}],"related":["brands_list","brands_select","studio_workflow"]},{"name":"insights_get","listed":false,"docs":"https://docs.trycontinuum.ai/mcp/tools/unlisted#insights_get","summary":"Fetch Jaina-generated insights for an account, posts, or campaign with cache-first reads.","mutates":false,"role":"viewer","integration":"instagram","connectionNote":"Instagram.","brandScoped":true,"confirmation":"none","completion":"sync_then_async","retry":"natural_read","roleNote":"Any brand member","rateLimit":null,"inputs":{"account_id":{"type":"string","description":"The connected account to act on, from `accounts_list` or `account_map`."},"scope":{"type":"string","values":["account","posts","campaign"],"description":"What to read. See the allowed values."},"target_ids":{"type":"array"},"period":{"type":"object"},"insight_types":{"type":"array"},"refresh":{"type":"boolean"}},"actionKey":"scope","actions":[{"name":"account","required":["account_id","scope"]},{"name":"posts","required":["account_id","scope","target_ids"]},{"name":"campaign","required":["account_id","scope","target_ids"]}],"sharedInputs":["account_id","target_ids","period","insight_types","refresh"],"required":["account_id","scope"],"schema":"https://docs.trycontinuum.ai/mcp/schemas/insights_get.json","examples":[{"title":"Insights for one campaign","arguments":{"account_id":"5c8e1a3b-7d2f-4e6a-9b4c-0f1e3d5a7c92","scope":"campaign","target_ids":["120200000000000000"]}}],"errors":[{"code":"UPSTREAM_ERROR","kind":"error","when":"Jaina returned a non-2xx response or empty payload."},{"code":"BRAND_NOT_SELECTED","kind":"error","when":"No brand is active. Call `brands_select`."},{"code":"needs_integration","kind":"status","when":"The brand has no instagram connection. Call `integrations_connect`."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."}],"related":["post_audit"]},{"name":"integration_health_check","listed":true,"area":"account","docs":"https://docs.trycontinuum.ai/mcp/tools/account#integration_health_check","summary":"Checks whether a connection is healthy, expired, or disconnected.","mutates":false,"role":"viewer","integration":null,"brandScoped":true,"confirmation":"none","completion":"sync","retry":"natural_read","roleNote":"Viewer or higher","rateLimit":null,"inputs":{},"required":[],"schema":"https://docs.trycontinuum.ai/mcp/schemas/integration_health_check.json","examples":[{"title":"Check connections","arguments":{}}],"errors":[{"code":"BRAND_NOT_SELECTED","kind":"error","when":"No brand is active. Call `brands_select`."},{"code":"INTERNAL","kind":"error","when":"Something went wrong on our side. Retry once, then contact support."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."}],"related":["integrations_connect","integrations_list"]},{"name":"integrations_connect","listed":true,"area":"account","docs":"https://docs.trycontinuum.ai/mcp/tools/account#integrations_connect","summary":"Returns a one-time link to connect a platform. Links work for 10 minutes.","mutates":false,"role":"viewer","integration":null,"brandScoped":true,"confirmation":"none","completion":"sync","retry":"natural_read","roleNote":"Any brand member","rateLimit":{"scope":"user","budget":10,"windowSeconds":3600},"inputs":{"platform":{"type":"string","values":["instagram","facebook","tiktok","linkedin","youtube","x","threads","google"],"description":"The network to act on. See the allowed values."}},"actionKey":"platform","actions":[{"name":"instagram","required":["platform"]},{"name":"facebook","required":["platform"]},{"name":"tiktok","required":["platform"]},{"name":"linkedin","required":["platform"]},{"name":"youtube","required":["platform"]},{"name":"x","required":["platform"]},{"name":"threads","required":["platform"]},{"name":"google","required":["platform"]}],"sharedInputs":[],"required":["platform"],"schema":"https://docs.trycontinuum.ai/mcp/schemas/integrations_connect.json","examples":[{"title":"Connect Instagram","arguments":{"platform":"instagram"}}],"errors":[{"code":"BRAND_FORBIDDEN","kind":"error","when":"User lacks access to active brand."},{"code":"needs_brand","kind":"status","when":"No brand is active. Call `brands_select`."},{"code":"RATE_LIMITED","kind":"error","when":"Wait `details.retry_after_seconds`, then retry."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."}],"related":["integrations_list"]},{"name":"integrations_list","listed":true,"area":"account","docs":"https://docs.trycontinuum.ai/mcp/tools/account#integrations_list","summary":"Lists the brand's connections.","mutates":false,"role":"viewer","integration":null,"brandScoped":true,"confirmation":"none","completion":"sync","retry":"natural_read","roleNote":"Any brand member","rateLimit":null,"inputs":{},"required":[],"schema":"https://docs.trycontinuum.ai/mcp/schemas/integrations_list.json","examples":[{"title":"List linked integrations","arguments":{}}],"errors":[{"code":"INTERNAL","kind":"error","when":"Something went wrong on our side. Retry once, then contact support."},{"code":"needs_brand","kind":"status","when":"No brand is active. Call `brands_select`."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."}],"related":["integrations_connect","accounts_list"]},{"name":"intel_audience_push","listed":false,"docs":"https://docs.trycontinuum.ai/mcp/tools/unlisted#intel_audience_push","summary":"Push a list of people (emails/phones/names, hashed server-side) to a Meta customer-list Custom Audience — new or appended. Two-phase: mode='preview' (default) → confirm_token; mod…","mutates":true,"role":"operator","integration":null,"brandScoped":true,"confirmation":"two_phase_confirm_token","completion":"sync","retry":"confirm_token_single_use","roleNote":"Operator or higher","rateLimit":null,"inputs":{"segment":{"type":"object"},"targets":{"type":"object","description":"The items to act on, each with its own fields."},"mode":{"type":"string","values":["preview","confirm"],"description":"Default 'preview'. 'confirm' needs the preview's confirm_token."},"ad_account_id":{"type":"string","description":"Meta ad account (new audience)."},"audience_id":{"type":"string","description":"Append to this Meta audience instead."},"members":{"type":"array","description":"People to add. Hashed server-side; uploaded in batches of 10,000."},"default_country_code":{"type":"string"},"customer_file_source":{"type":"string","values":["USER_PROVIDED_ONLY","PARTNER_PROVIDED_ONLY","BOTH_USER_AND_PARTNER_PROVIDED"],"description":"Where the list came from (Meta-required). Default USER_PROVIDED_ONLY."},"idempotency_key":{"type":"string","description":"A key you choose. Reuse it only to retry the same request without doing it twice."},"confirm_token":{"type":"string","description":"The token a preview returned. Send it back to confirm that exact change."}},"required":["segment","targets"],"schema":"https://docs.trycontinuum.ai/mcp/schemas/intel_audience_push.json","examples":[{"title":"Push HVL audience","arguments":{"segment":{"name":"HVL","source":"high_ltv"},"targets":{"meta_custom_audiences":true}}}],"errors":[{"code":"VALIDATION_ERROR","kind":"error","when":"Pass members[] (emails/phones); segments built from brand data are not available."},{"code":"NOT_IMPLEMENTED","kind":"error","when":"This path isn't available yet. Don't retry; use the listed tool for the job."},{"code":"BRAND_NOT_SELECTED","kind":"error","when":"No brand is active. Call `brands_select`."},{"code":"needs_role","kind":"status","when":"The person's role is too low for this call. Needs: Operator or higher. Ask an Admin or Owner."},{"code":"CONFIRMATION_REQUIRED","kind":"error","when":"This write needs a preview first. Preview, get a yes, then confirm with the returned token."}],"related":["paid_manage","analytics_cross_platform_spend"]},{"name":"intel_competitor_ad_library","listed":true,"area":"insights","docs":"https://docs.trycontinuum.ai/mcp/tools/insights#intel_competitor_ad_library","summary":"Looks up any advertiser in the Meta Ad Library.","mutates":false,"role":"viewer","integration":null,"brandScoped":true,"confirmation":"none","completion":"sync","retry":"natural_read","roleNote":"Viewer or higher","rateLimit":null,"inputs":{"page_id":{"type":"string"},"search_terms":{"type":"string"},"country":{"type":"string"},"active_status":{"type":"string","values":["ACTIVE","INACTIVE","ALL"]},"limit":{"type":"integer","description":"The most items to return."}},"required":[],"schema":"https://docs.trycontinuum.ai/mcp/schemas/intel_competitor_ad_library.json","examples":[{"title":"A Page's ads","arguments":{"page_id":"189799134443528","country":"MX"}}],"errors":[{"code":"INTEGRATION_DISCONNECTED","kind":"error","when":"The connection lapsed. Reconnect it with `integrations_connect`."},{"code":"UPSTREAM_ERROR","kind":"error","when":"A platform or provider returned an error. `details` carries its message."},{"code":"BRAND_NOT_SELECTED","kind":"error","when":"No brand is active. Call `brands_select`."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."}],"related":["intel_competitor_scan","intel_competitor_ads"]},{"name":"intel_competitor_ads","listed":true,"area":"insights","docs":"https://docs.trycontinuum.ai/mcp/tools/insights#intel_competitor_ads","summary":"Ads from competitors you track, including how long each has run.","mutates":false,"role":"viewer","integration":null,"brandScoped":true,"confirmation":"none","completion":"sync","retry":"natural_read","roleNote":"Viewer or higher","rateLimit":null,"inputs":{"competitorId":{"type":"string","description":"A tracked competitor's ID, from an earlier intel result."},"competitorRef":{"type":"string"},"status":{"type":"string","values":["active","paused"],"description":"The status to filter by or set. See the allowed values."},"q":{"type":"string"},"since":{"type":"string","description":"Start of the window, as a date (`YYYY-MM-DD`)."},"until":{"type":"string","description":"End of the window, as a date (`YYYY-MM-DD`)."},"angleId":{"type":"string"},"hookArchetype":{"type":"string"},"contentFormat":{"type":"string"},"cta":{"type":"string"},"minDaysRunning":{"type":"integer"},"snapshotId":{"type":"string"},"sort":{"type":"string","values":["first_seen_at","last_seen_at"]},"dir":{"type":"string","values":["asc","desc"]},"limit":{"type":"integer","description":"The most items to return."}},"required":[],"schema":"https://docs.trycontinuum.ai/mcp/schemas/intel_competitor_ads.json","examples":[{"title":"Longest-running active competitor ads","arguments":{"status":"active","minDaysRunning":30,"sort":"first_seen_at","dir":"asc","limit":10}}],"errors":[{"code":"BRAND_NOT_SELECTED","kind":"error","when":"No brand is active. Call `brands_select`."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."}],"related":["intel_competitor_ad_library","intel_competitor_moves","intel_competitor_scan","jobs_status"]},{"name":"intel_competitor_moves","listed":true,"area":"insights","docs":"https://docs.trycontinuum.ai/mcp/tools/insights#intel_competitor_moves","summary":"A digest of what your tracked competitors run in paid ads and post organically, by angle, hook, call to action, and format.","mutates":false,"role":"viewer","integration":null,"brandScoped":true,"confirmation":"none","completion":"sync","retry":"natural_read","roleNote":"Viewer or higher","rateLimit":null,"inputs":{"competitorId":{"type":"string","description":"A tracked competitor's ID, from an earlier intel result."},"competitorRef":{"type":"string"},"since":{"type":"string","description":"Start of the window, as a date (`YYYY-MM-DD`)."},"dimensions":{"type":"array"},"source":{"type":"string","values":["all","paid","organic"],"description":"Which source to read or filter by. See the allowed values."},"limit":{"type":"integer","description":"The most items to return."}},"required":[],"schema":"https://docs.trycontinuum.ai/mcp/schemas/intel_competitor_moves.json","examples":[{"title":"What competitors ran in paid and organic since August","arguments":{"source":"all","since":"2026-08-01","limit":20}}],"errors":[{"code":"BRAND_NOT_SELECTED","kind":"error","when":"No brand is active. Call `brands_select`."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."}],"related":["intel_competitor_ads","intel_competitor_organic","intel_competitor_scan"]},{"name":"intel_competitor_organic","listed":true,"area":"insights","docs":"https://docs.trycontinuum.ai/mcp/tools/insights#intel_competitor_organic","summary":"Organic posts from competitors you track.","mutates":false,"role":"viewer","integration":null,"brandScoped":true,"confirmation":"none","completion":"sync","retry":"natural_read","roleNote":"Viewer or higher","rateLimit":null,"inputs":{"competitorId":{"type":"string","description":"A tracked competitor's ID, from an earlier intel result."},"competitorRef":{"type":"string"},"limit":{"type":"integer","description":"The most items to return."}},"required":[],"schema":"https://docs.trycontinuum.ai/mcp/schemas/intel_competitor_organic.json","examples":[{"title":"One competitor's recent organic posts","arguments":{"competitorRef":"Blue Bottle Coffee","limit":10}}],"errors":[{"code":"BRAND_NOT_SELECTED","kind":"error","when":"No brand is active. Call `brands_select`."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."}],"related":["intel_competitor_ads","intel_competitor_moves","jobs_status"]},{"name":"intel_competitor_scan","listed":true,"area":"insights","docs":"https://docs.trycontinuum.ai/mcp/tools/insights#intel_competitor_scan","summary":"Runs a fresh competitor scan, the same as the app's **Scan** button.","mutates":true,"role":"operator","integration":null,"brandScoped":true,"confirmation":"none","completion":"background_refresh","retry":"naturally_idempotent","roleNote":"Operator or higher","rateLimit":null,"inputs":{"competitors":{"type":"array"}},"required":[],"schema":"https://docs.trycontinuum.ai/mcp/schemas/intel_competitor_scan.json","examples":[{"title":"Rescan tracked competitors","arguments":{}},{"title":"Track and scan one","arguments":{"competitors":[{"name":"Smart Fit"}]}}],"errors":[{"code":"CONFLICT","kind":"error","when":"The item changed or is busy. Read it again, then retry with the current state."},{"code":"needs_brand","kind":"status","when":"No brand is active. Call `brands_select`."},{"code":"needs_role","kind":"status","when":"The person's role is too low for this call. Needs: Operator or higher. Ask an Admin or Owner."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."}],"notes":["Answers once the first ads are stored (about 10 seconds) while the scan keeps running. Read results with `intel_competitor_ads` or `intel_competitor_moves`; `stillProcessing` above 0 means read again shortly.","With fewer than 3 tracked competitors, it finds and tracks more itself."],"related":["intel_competitor_ads","intel_competitor_moves"]},{"name":"intel_trend_discovery","listed":true,"area":"insights","docs":"https://docs.trycontinuum.ai/mcp/tools/insights#intel_trend_discovery","summary":"The hashtags people post under on Instagram or TikTok, with post counts and growth, plus trending search keywords on TikTok.","mutates":false,"role":"viewer","integration":null,"brandScoped":true,"confirmation":"none","completion":"sync_then_async","retry":"natural_read","roleNote":"Viewer or higher","rateLimit":{"scope":"brand","budget":10,"windowSeconds":3600},"inputs":{"platform":{"type":"string","values":["instagram","tiktok"],"description":"The network to act on. See the allowed values."},"category":{"type":"string","description":"The category to file it under. See the allowed values."},"niche_keywords":{"type":"array"},"region":{"type":"string"},"as_of":{"type":"string"}},"required":[],"schema":"https://docs.trycontinuum.ai/mcp/schemas/intel_trend_discovery.json","examples":[{"title":"Trending IG","arguments":{"platform":"instagram"}}],"errors":[{"code":"BRAND_NOT_SELECTED","kind":"error","when":"No brand is active. Call `brands_select`."},{"code":"RATE_LIMITED","kind":"error","when":"Wait `details.retry_after_seconds`, then retry."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."}],"related":["intel_competitor_ad_library","content_create","jobs_status","trends_manage"]},{"name":"jaina_ask","listed":false,"docs":"https://docs.trycontinuum.ai/mcp/tools/unlisted#jaina_ask","summary":"Ask Jaina (regular analyst) a performance/paid-analytics question — ROAS, spend, campaign or ad set/ad performance, pacing, attribution, reporting. Use when the question is about …","mutates":true,"role":"operator","integration":null,"brandScoped":true,"confirmation":"none","completion":"async_job","retry":"none","roleNote":"Operator or higher","rateLimit":{"scope":"brand","budget":60,"windowSeconds":3600},"inputs":{"query":{"type":"string","description":"What to look for, in plain words."},"sessionId":{"type":"string","description":"An earlier agent conversation's `sessionId`, to continue it instead of starting over."},"context":{"type":"object"}},"required":["query"],"schema":"https://docs.trycontinuum.ai/mcp/schemas/jaina_ask.json","examples":[{"title":"Ask Jaina directly","arguments":{"query":"Which ad sets spent the most last week without a purchase?"}}],"errors":[{"code":"CTX_MISSING_MODE_A_FIELDS","kind":"error","when":"The call is missing session context. Reconnect the assistant and retry."},{"code":"JOB_ENQUEUE_FAILED","kind":"error","when":"The job couldn't start. Retry once, then contact support."},{"code":"BRAND_NOT_SELECTED","kind":"error","when":"No brand is active. Call `brands_select`."},{"code":"needs_role","kind":"status","when":"The person's role is too low for this call. Needs: Operator or higher. Ask an Admin or Owner."},{"code":"RATE_LIMITED","kind":"error","when":"Wait `details.retry_after_seconds`, then retry."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."}],"related":["agent_ask","jobs_status","organic_ask"]},{"name":"jaina_pro_run","listed":false,"docs":"https://docs.trycontinuum.ai/mcp/tools/unlisted#jaina_pro_run","summary":"Run a Jaina Pro long-form report. Returns immediately with { job_id, poll_with } — poll jobs_status for the report (or consume progress frames).","mutates":true,"role":"operator","integration":"facebook","connectionNote":"Meta (Facebook).","brandScoped":true,"confirmation":"none","completion":"async_job","retry":"none","roleNote":"Operator or higher","rateLimit":{"scope":"brand","budget":5,"windowSeconds":3600},"inputs":{"reportSpec":{"type":"object"}},"required":["reportSpec"],"schema":"https://docs.trycontinuum.ai/mcp/schemas/jaina_pro_run.json","examples":[{"title":"A monthly campaign report","arguments":{"reportSpec":{"period":{"start":"2026-10-01","end":"2026-10-31"},"scopes":["campaign"],"kpis":["spend","roas","cpa"],"format":"mixed"}}}],"errors":[{"code":"CTX_MISSING_MODE_A_FIELDS","kind":"error","when":"The call is missing session context. Reconnect the assistant and retry."},{"code":"JOB_ENQUEUE_FAILED","kind":"error","when":"The job couldn't start. Retry once, then contact support."},{"code":"BRAND_NOT_SELECTED","kind":"error","when":"No brand is active. Call `brands_select`."},{"code":"needs_role","kind":"status","when":"The person's role is too low for this call. Needs: Operator or higher. Ask an Admin or Owner."},{"code":"needs_integration","kind":"status","when":"The brand has no facebook connection. Call `integrations_connect`."},{"code":"RATE_LIMITED","kind":"error","when":"Wait `details.retry_after_seconds`, then retry."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."}],"related":["jobs_status"]},{"name":"jobs_status","listed":true,"area":"account","docs":"https://docs.trycontinuum.ai/mcp/tools/account#jobs_status","summary":"Checks on a long-running job.","mutates":false,"role":"none","integration":null,"brandScoped":false,"confirmation":"none","completion":"sync","retry":"natural_read","roleNote":"Anyone signed in","rateLimit":null,"inputs":{"job_id":{"type":"string","description":"A job ID an earlier call returned."}},"required":["job_id"],"schema":"https://docs.trycontinuum.ai/mcp/schemas/jobs_status.json","examples":[{"title":"Check a job","arguments":{"job_id":"job_abc123"}}],"errors":[{"code":"BRAND_FORBIDDEN","kind":"error","when":"The person can't reach that brand."},{"code":"INTERNAL","kind":"error","when":"Something went wrong on our side. Retry once, then contact support."},{"code":"NOT_FOUND","kind":"error","when":"The item doesn't exist, or this brand can't see it."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."}],"notes":["Takes only `job_id`. In the result, `tool` is the tool you called and `executor` is the one that ran it. For an agent run, `result.status` is `completed` (it wrote a draft or plan) or `needs_followup` (text only). Forge renders report through `forge_query` `batch` or `job` instead."],"related":["post_audit","insights_get","agent_ask","forge_query","organic_ask"]},{"name":"library_manage","listed":true,"area":"library","docs":"https://docs.trycontinuum.ai/mcp/tools/library#library_manage","summary":"Browses the Library, shows where a creative has run, adds comments, sets review status, and uploads media.","mutates":true,"role":"viewer","roleByAction":{"browse":"viewer","asset_detail":"viewer","comment_add":"operator","set_review_status":"operator","import_ad_creative":"operator","upload_inline":"operator","upload_url":"operator","upload_finalize":"operator","upload_begin":"operator","upload_status":"viewer","render_status":"viewer","render_retry":"operator"},"integration":null,"brandScoped":true,"confirmation":"none","completion":"sync","retry":"idempotency_key","roleNote":"Viewer or higher to read. Operator or higher for `comment_add`, `set_review_status`, `import_ad_creative`, `upload_inline`, `upload_url`, `upload_begin`, `upload_finalize`, and `render_retry`.","rateLimit":null,"inputs":{"action":{"type":"string","values":["browse","asset_detail","comment_add","set_review_status","import_ad_creative","upload_inline","upload_url","upload_finalize","upload_begin","upload_status","render_status","render_retry"],"description":"The operation to run. Each value is listed under Actions."},"query":{"type":"string","description":"Optional semantic query; with it browse ranks by meaning (offset is ignored)."},"reviewStatus":{"type":"string","values":["none","draft","in_review","needs_changes","approved"],"description":"Filter by review workflow state, e.g. 'approved' for signed-off creative only."},"kind":{"type":"string","values":["image","video","file","audio"],"description":"The type to filter by. See the allowed values."},"source":{"type":"string","values":["upload","ai_generated","backfill","canvas","inspiration","hyperframe","chat_upload","clip","reel","meta_ad","figma","goal_artifact","forge"],"description":"Which source to read or filter by. See the allowed values."},"tags":{"type":"array","description":"An asset matches only if it carries ALL of these tags."},"limit":{"type":"integer","description":"The most items to return."},"offset":{"type":"integer","description":"How many items to skip."},"assetId":{"type":"string","description":"A Library asset ID an earlier call returned."},"window":{"type":"string","values":["d7","d14","d30"],"description":"Metric window for the creative-DNA figures returned with the asset: 'd7' | 'd14' | 'd30' (default d30)."},"creativeRowId":{"type":"string","description":"paid_media.ad_creatives.id — the SYNCED creative row id (not Meta’s creative id), as returned by the paid creative-intel reads."},"body":{"type":"string"},"annotation":{"type":"object","description":"Pin the comment to the creative: {kind:\"box\",x,y,width,height} (normalized 0..1) on an image, or {kind:\"time\",timeMs,endMs?,box?} on a video. On a video, timeM…"},"parentCommentId":{"type":"string"},"toStatus":{"type":"string","values":["none","draft","in_review","needs_changes","approved"]},"expectedCurrentStatus":{"type":"string","values":["none","draft","in_review","needs_changes","approved"],"description":"Stale-write precondition: the review status you LAST SAW on this asset (from browse or asset_detail). If someone else has moved the asset since, the transition…"},"note":{"type":"string"},"files":{"type":"array","description":"The files to upload."},"uploads":{"type":"array"},"uploaded":{"type":"array"},"max_files":{"type":"integer"},"upload_intent_id":{"type":"string","description":"The upload ID that `source_begin` or `upload_begin` returned."},"render_job_id":{"type":"string"},"operation_id":{"type":"string","description":"Stable identity for this mutation. Retrying with the same operation_id replays the FIRST result instead of acting twice. import_ad_creative derives one from `c…"}},"actionKey":"action","actions":[{"name":"browse","required":["action"],"uses":["query","reviewStatus","kind","source","tags","limit","offset"]},{"name":"asset_detail","required":["action","assetId"],"uses":["window"]},{"name":"comment_add","required":["action","assetId","body"],"uses":["annotation","parentCommentId","operation_id"]},{"name":"set_review_status","required":["action","assetId","toStatus"],"uses":["expectedCurrentStatus","note","operation_id"]},{"name":"import_ad_creative","required":["action","creativeRowId"],"uses":["operation_id"]},{"name":"upload_inline","required":["action","files"],"uses":["operation_id"]},{"name":"upload_url","required":["action","uploads"],"uses":[]},{"name":"upload_finalize","required":["action","uploaded"],"uses":[]},{"name":"upload_begin","required":["action"],"uses":["max_files"]},{"name":"upload_status","required":["action","upload_intent_id"],"uses":[]},{"name":"render_status","required":["action","render_job_id"],"uses":[]},{"name":"render_retry","required":["action","render_job_id"],"uses":[]}],"required":["action"],"schema":"https://docs.trycontinuum.ai/mcp/schemas/library_manage.json","examples":[{"title":"Browse approved creatives only","arguments":{"action":"browse","reviewStatus":"approved","limit":20}},{"title":"Read the feedback on an asset","arguments":{"action":"asset_detail","assetId":"00000000-0000-0000-0000-000000000000"}},{"title":"Which version of this creative is winning, and where is it running (last 7 days)","arguments":{"action":"asset_detail","assetId":"00000000-0000-0000-0000-000000000000","window":"d7"}},{"title":"Import a running Meta ad creative into the Library so it can be reviewed","arguments":{"action":"import_ad_creative","creativeRowId":"00000000-0000-0000-0000-000000000000"}},{"title":"Leave a timestamped comment on a video","arguments":{"action":"comment_add","assetId":"00000000-0000-0000-0000-000000000000","body":"Tighten the hook — cut to the product by second 2.","annotation":{"kind":"time","timeMs":2000}}},{"title":"Approve an asset","arguments":{"action":"set_review_status","assetId":"00000000-0000-0000-0000-000000000000","toStatus":"approved","note":"Cleared for paid usage."}}],"errors":[{"code":"needs_role","kind":"status","when":"`comment_add`, `set_review_status` and `import_ad_creative` are writes: the session needs the operator role (returned as a structured `needs_role` result, not a thrown error)."},{"code":"NOT_FOUND","kind":"error","when":"assetId (or parentCommentId, or creativeRowId) does not resolve to a live asset/comment/synced ad creative in the active brand."},{"code":"VALIDATION_ERROR","kind":"error","when":"Missing per-action fields — `comment_add` needs assetId + body; `set_review_status` needs assetId + toStatus; `import_ad_creative` needs creativeRowId."},{"code":"UPSTREAM_ERROR","kind":"error","when":"`import_ad_creative` could not fetch the creative's media: Meta CDN URLs expire, and the re-read from Graph also failed (`creative_media_unavailable`) — nothing was imported, and no empty asset was created."},{"code":"CONFLICT","kind":"error","when":"The item changed or is busy. Read it again, then retry with the current state."},{"code":"UNAUTHENTICATED","kind":"error","when":"The sign-in is missing or expired. Reconnect the assistant."},{"code":"needs_brand","kind":"status","when":"No brand is active. Call `brands_select`."}],"related":["media_search","content_create","analytics_creative_insights"]},{"name":"list_elements","listed":true,"area":"creative","docs":"https://docs.trycontinuum.ai/mcp/tools/creative#list_elements","summary":"Lists your saved Elements.","mutates":false,"role":"viewer","integration":null,"brandScoped":true,"confirmation":"none","completion":"sync","retry":"natural_read","roleNote":"Viewer or higher","rateLimit":null,"inputs":{"category":{"type":"string","values":["model","character","product","object","material","setting","location","landscape","style","moodboard","palette","animation","effect","general"],"description":"Restrict to one category, e.g. \"product\" or \"character\"."}},"required":[],"schema":"https://docs.trycontinuum.ai/mcp/schemas/list_elements.json","examples":[{"title":"Every Element this brand has saved","arguments":{}},{"title":"Only the products, before wiring an element node","arguments":{"category":"product"}}],"errors":[{"code":"BRAND_NOT_SELECTED","kind":"error","when":"Elements are per-brand. Call `brands_select` first."},{"code":"needs_role","kind":"status","when":"Reading Elements needs the viewer role on the active brand."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."}],"related":["studio_workflow","media_search","library_manage"]},{"name":"mcp_approval_grant","listed":false,"docs":"https://docs.trycontinuum.ai/mcp/tools/unlisted#mcp_approval_grant","summary":"Grant admin approval for a pending confirm token. The token must have requires.role = 'admin'. After granting, the token's approvals array is updated and the originating tool can …","mutates":true,"role":"admin","integration":null,"brandScoped":true,"confirmation":"elicitation_or_confirm_token","completion":"sync","retry":"confirm_token_single_use","roleNote":"Admin or Owner","rateLimit":null,"inputs":{"token":{"type":"string"}},"required":["token"],"schema":"https://docs.trycontinuum.ai/mcp/schemas/mcp_approval_grant.json","examples":[{"title":"An Admin or Owner grants a pending change","arguments":{"token":"tok_9b1e5c2f4a7d3e60"}}],"errors":[{"code":"NOT_FOUND","kind":"error","when":"The item doesn't exist, or this brand can't see it."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."},{"code":"BRAND_NOT_SELECTED","kind":"error","when":"No brand is active. Call `brands_select`."},{"code":"needs_role","kind":"status","when":"The person's role is too low for this call. Needs: Admin or Owner. Ask an Admin or Owner."},{"code":"CONFIRMATION_REQUIRED","kind":"error","when":"This write needs a preview first. Preview, get a yes, then confirm with the returned token."}],"related":["mcp_approvals_list","paid_manage"]},{"name":"mcp_approvals_list","listed":false,"docs":"https://docs.trycontinuum.ai/mcp/tools/unlisted#mcp_approvals_list","summary":"List all pending confirm tokens for the current brand that require admin approval. Returns only tokens where requires.role = 'admin'. Admin-only.","mutates":false,"role":"admin","integration":null,"brandScoped":true,"confirmation":"none","completion":"sync","retry":"natural_read","roleNote":"Admin or Owner","rateLimit":null,"inputs":{},"required":[],"schema":"https://docs.trycontinuum.ai/mcp/schemas/mcp_approvals_list.json","examples":[{"title":"Changes waiting for an Admin or Owner","arguments":{}}],"errors":[{"code":"BRAND_NOT_SELECTED","kind":"error","when":"No brand is active. Call `brands_select`."},{"code":"needs_role","kind":"status","when":"The person's role is too low for this call. Needs: Admin or Owner. Ask an Admin or Owner."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."}],"related":["mcp_approval_grant"]},{"name":"media_capture_url","listed":true,"area":"library","docs":"https://docs.trycontinuum.ai/mcp/tools/library#media_capture_url","summary":"Turns a public web page into a screenshot or a scroll-through video in your Library.","mutates":true,"role":"operator","integration":null,"brandScoped":true,"confirmation":"none","completion":"sync","retry":"naturally_idempotent","roleNote":"Operator or higher","rateLimit":null,"inputs":{"url":{"type":"string","description":"The public https page to capture (product, reviews, pricing, press article, demo)."},"device":{"type":"string","values":["reel","iphone","desktop"],"description":"reel = 1080x1920 (default), iphone = 1179x2556, desktop = 1920x1080."},"outputs":{"type":"array","description":"screenshot = a PNG still; recording = an MP4 scroll-through. Default both."},"full_page":{"type":"boolean","description":"Screenshot the whole page instead of one screen (capped at 16,000 px tall)."},"duration_sec":{"type":"number","description":"Recording length in seconds (2-15, default 8, 30 fps)."},"highlight_selector":{"type":"string","description":"CSS selector of one element to outline; the capture scrolls to it."},"highlight_text":{"type":"string","description":"Visible text to outline instead of a selector (e.g. \"4.9 stars\")."},"locale":{"type":"string","description":"Browser language, e.g. es-CL, so a localized site serves that language. Default en-US."}},"required":["url"],"schema":"https://docs.trycontinuum.ai/mcp/schemas/media_capture_url.json","examples":[{"title":"Reviews page as proof b-roll","arguments":{"url":"https://brand.com/reviews","highlight_text":"4.9"}}],"errors":[{"code":"UNAVAILABLE_HERE","kind":"error","when":"This input can't be used from this server, for example a private or non-https URL."},{"code":"UPSTREAM_ERROR","kind":"error","when":"A platform or provider returned an error. `details` carries its message."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."},{"code":"needs_brand","kind":"status","when":"No brand is active. Call `brands_select`."},{"code":"needs_role","kind":"status","when":"The person's role is too low for this call. Needs: Operator or higher. Ask an Admin or Owner."}],"notes":["Public https pages only: sign-in walls, private networks, and plain http are refused. A capture takes 10 to 40 seconds and returns Library asset ids."],"related":["video_editor","media_search"]},{"name":"media_search","listed":true,"area":"library","docs":"https://docs.trycontinuum.ai/mcp/tools/library#media_search","summary":"Finds media by describing it.","mutates":false,"role":"viewer","integration":null,"brandScoped":true,"confirmation":"none","completion":"sync","retry":"natural_read","roleNote":"Viewer or higher","rateLimit":null,"inputs":{"query":{"type":"string","description":"Natural-language description of the creative media to find."},"tags":{"type":"array","description":"Optional tags; an asset matches only if it carries ALL of them."},"kind":{"type":"string","values":["image","video","file","audio"],"description":"Optional media type filter (image | video)."},"source":{"type":"string","values":["upload","ai_generated","backfill","canvas","inspiration","hyperframe","chat_upload","clip","reel","meta_ad","figma","goal_artifact","forge"],"description":"Optional origin filter (upload, ai_generated, canvas, inspiration, …)."},"reviewStatus":{"type":"string","values":["none","draft","in_review","needs_changes","approved"],"description":"Optional review-workflow filter; pass 'approved' to restrict to assets the brand has signed off on."},"limit":{"type":"integer","description":"The most items to return."},"threshold":{"type":"number"}},"required":["query"],"schema":"https://docs.trycontinuum.ai/mcp/schemas/media_search.json","examples":[{"title":"Find approved product shots","arguments":{"query":"flat lay of the coffee bag on a wooden table","kind":"image","reviewStatus":"approved","limit":10}}],"errors":[{"code":"BRAND_NOT_SELECTED","kind":"error","when":"No brand is active. Call `brands_select`."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."}],"related":["library_manage"]},{"name":"media_upload_and_clip","listed":true,"area":"library","docs":"https://docs.trycontinuum.ai/mcp/tools/library#media_upload_and_clip","summary":"Uploads a video to clip. Clipping finishes in the Continuum app.","mutates":true,"role":"operator","integration":null,"brandScoped":true,"confirmation":"none","completion":"sync","retry":"idempotency_key","roleNote":"Operator or higher","rateLimit":null,"inputs":{"file_name":{"type":"string","description":"The file's name, with its extension."},"mime_type":{"type":"string","values":["video/mp4","video/quicktime","video/webm","video/x-m4v"],"description":"The file's MIME type, such as `image/png`."},"media_base64":{"type":"string"},"upload_token":{"type":"string"},"title":{"type":"string","description":"A display title."},"clip":{"type":"boolean"},"idempotency_key":{"type":"string","description":"A key you choose. Reuse it only to retry the same request without doing it twice."}},"required":[],"schema":"https://docs.trycontinuum.ai/mcp/schemas/media_upload_and_clip.json","examples":[{"title":"Start a signed upload of a long video","arguments":{"file_name":"founder-interview.mp4","mime_type":"video/mp4","title":"Founder interview","clip":true}}],"errors":[{"code":"INTERNAL","kind":"error","when":"Something went wrong on our side. Retry once, then contact support."},{"code":"NOT_FOUND","kind":"error","when":"The item doesn't exist, or this brand can't see it."},{"code":"UPSTREAM_ERROR","kind":"error","when":"A platform or provider returned an error. `details` carries its message."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."},{"code":"needs_brand","kind":"status","when":"No brand is active. Call `brands_select`."},{"code":"needs_role","kind":"status","when":"The person's role is too low for this call. Needs: Operator or higher. Ask an Admin or Owner."}],"related":["forge_manage","video_editor"]},{"name":"optimizer_manage","listed":true,"area":"paid","docs":"https://docs.trycontinuum.ai/mcp/tools/paid#optimizer_manage","summary":"Approves or rejects recommendations and manages portfolios.","mutates":true,"role":"operator","roleByAction":{"create_portfolio":"operator","create_from_suggestion":"operator","enroll_adsets":"operator","convert_cbo":"operator","set_recommendation_status":"operator","set_recommendation_statuses":"operator","set_renewal_task_status":"operator","update_portfolio":"operator","archive_portfolio":"operator","unenroll_adsets":"operator","run_now":"operator"},"integration":null,"connectionNote":"Meta (Facebook) ads.","brandScoped":true,"confirmation":"two_phase_confirm_token","completion":"sync","retry":"none","roleNote":"Operator or higher, on a brand with a Meta connection.","rateLimit":null,"inputs":{"action":{"type":"string","values":["create_portfolio","create_from_suggestion","enroll_adsets","convert_cbo","set_recommendation_status","set_recommendation_statuses","set_renewal_task_status","update_portfolio","archive_portfolio","unenroll_adsets","run_now"],"description":"The operation to run. Each value is listed under Actions."},"payload":{"type":"object","description":"The action's own inputs, as an object."}},"actionKey":"action","actions":[{"name":"create_portfolio","required":["action","payload"],"uses":[]},{"name":"create_from_suggestion","required":["action","payload"],"uses":[]},{"name":"enroll_adsets","required":["action","payload"],"uses":[]},{"name":"convert_cbo","required":["action","payload"],"uses":[]},{"name":"set_recommendation_status","required":["action","payload"],"uses":[]},{"name":"set_recommendation_statuses","required":["action","payload"],"uses":[]},{"name":"set_renewal_task_status","required":["action","payload"],"uses":[]},{"name":"update_portfolio","required":["action","payload"],"uses":[]},{"name":"archive_portfolio","required":["action","payload"],"uses":[]},{"name":"unenroll_adsets","required":["action","payload"],"uses":[]},{"name":"run_now","required":["action","payload"],"uses":[]}],"required":["action","payload"],"schema":"https://docs.trycontinuum.ai/mcp/schemas/optimizer_manage.json","examples":[{"title":"Approve one recommendation (the approval is the yes)","arguments":{"action":"set_recommendation_status","payload":{"portfolio_id":"3f6b2c1e-8a4d-4f7b-9c2e-1d5a7b9e0c43","recommendation_id":"9a1d4e7c-2b6f-4c8a-b3e5-7f0d2a6c9b18","status":"approved"}}}],"errors":[{"code":"BRAND_FORBIDDEN","kind":"error","when":"The person can't reach that brand."},{"code":"CONFIRMATION_REQUIRED","kind":"error","when":"This write needs a preview first. Preview, get a yes, then confirm with the returned token."},{"code":"CONFLICT","kind":"error","when":"The item changed or is busy. Read it again, then retry with the current state."},{"code":"INTERNAL","kind":"error","when":"Something went wrong on our side. Retry once, then contact support."},{"code":"NOT_FOUND","kind":"error","when":"The item doesn't exist, or this brand can't see it."},{"code":"PERMISSION_DENIED","kind":"error","when":"The person's role can't do this. Ask an Admin or Owner."},{"code":"needs_brand","kind":"status","when":"No brand is active. Call `brands_select`."},{"code":"needs_role","kind":"status","when":"The person's role is too low for this call. Needs: Operator or higher, on a brand with a Meta connection. Ask an Admin or Owner."},{"code":"needs_integration","kind":"status","when":"The brand lacks the connection this call needs. Call `integrations_connect` with the `platform` the result names."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."}],"related":["help_describe","mcp_approval_grant","optimizer_query","paid_manage"]},{"name":"optimizer_query","listed":true,"area":"paid","docs":"https://docs.trycontinuum.ai/mcp/tools/paid#optimizer_query","summary":"Portfolios, pending recommendations, performance, and the optimization log.","mutates":false,"role":"viewer","roleByAction":{"portfolios":"viewer","logs":"viewer","suggestions":"viewer","performance":"viewer","cpa_series":"viewer","angle_matrix":"viewer","pending_recs":"viewer","adsets":"viewer","status":"viewer","insight":"viewer","renewal_tasks":"viewer"},"integration":null,"connectionNote":"Meta (Facebook) ads.","brandScoped":true,"confirmation":"none","completion":"sync","retry":"natural_read","roleNote":"Viewer or higher, on a brand with a Meta connection.","rateLimit":null,"inputs":{"action":{"type":"string","values":["portfolios","logs","suggestions","performance","cpa_series","angle_matrix","pending_recs","adsets","status","insight","renewal_tasks"],"description":"The operation to run. Each value is listed under Actions."},"brand_id":{"type":"string"},"ad_account_id":{"type":"string","description":"The Meta ad account ID (`act_…`), from `account_map`."},"level":{"type":"string","values":["adset","campaign"],"description":"The level to read or act on: campaign, ad set, or ad."},"portfolio_id":{"type":"string"},"payload":{"type":"object","description":"The action's own inputs, as an object."},"status":{"type":"string","values":["open","done","dismissed"],"description":"The status to filter by or set. See the allowed values."}},"actionKey":"action","actions":[{"name":"portfolios","required":["action","brand_id"],"uses":[]},{"name":"logs","required":["action","brand_id"],"uses":[]},{"name":"suggestions","required":["action","brand_id"],"uses":["ad_account_id","level"]},{"name":"performance","required":["action","brand_id","portfolio_id"],"uses":[]},{"name":"cpa_series","required":["action","brand_id","portfolio_id"],"uses":[]},{"name":"angle_matrix","required":["action","brand_id","portfolio_id"],"uses":[]},{"name":"pending_recs","required":["action","brand_id","portfolio_id"],"uses":[]},{"name":"adsets","required":["action","brand_id","portfolio_id"],"uses":[]},{"name":"status","required":["action","brand_id","portfolio_id"],"uses":[]},{"name":"insight","required":["action","brand_id","payload"],"uses":[]},{"name":"renewal_tasks","required":["action","brand_id"],"uses":["status"]}],"required":["action","brand_id"],"schema":"https://docs.trycontinuum.ai/mcp/schemas/optimizer_query.json","examples":[{"title":"A portfolio's pending recommendations","arguments":{"action":"pending_recs","brand_id":"5c8e1a3b-7d2f-4e6a-9b4c-0f1e3d5a7c92","portfolio_id":"3f6b2c1e-8a4d-4f7b-9c2e-1d5a7b9e0c43"}}],"errors":[{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."},{"code":"needs_brand","kind":"status","when":"No brand is active. Call `brands_select`."},{"code":"needs_integration","kind":"status","when":"The brand lacks the connection this call needs. Call `integrations_connect` with the `platform` the result names."}],"related":["help_describe","optimizer_manage"]},{"name":"organic_ask","listed":false,"docs":"https://docs.trycontinuum.ai/mcp/tools/unlisted#organic_ask","summary":"Ask the organic social agent a free-form question about social strategy, captions, hashtags, content ideas, or organic post/account performance. Use when the question is about wha…","mutates":true,"role":"operator","integration":null,"brandScoped":true,"confirmation":"none","completion":"async_job","retry":"none","roleNote":"Operator or higher","rateLimit":null,"inputs":{"query":{"type":"string","description":"What to look for, in plain words."},"sessionId":{"type":"string","description":"An earlier agent conversation's `sessionId`, to continue it instead of starting over."}},"required":["query"],"schema":"https://docs.trycontinuum.ai/mcp/schemas/organic_ask.json","examples":[{"title":"Ask the Organic agent directly","arguments":{"query":"Which hooks worked best on our Reels this month?"}}],"errors":[{"code":"CTX_MISSING_MODE_A_FIELDS","kind":"error","when":"The call is missing session context. Reconnect the assistant and retry."},{"code":"JOB_ENQUEUE_FAILED","kind":"error","when":"The job couldn't start. Retry once, then contact support."},{"code":"BRAND_NOT_SELECTED","kind":"error","when":"No brand is active. Call `brands_select`."},{"code":"needs_role","kind":"status","when":"The person's role is too low for this call. Needs: Operator or higher. Ask an Admin or Owner."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."}],"related":["agent_ask","jaina_ask","jobs_status"]},{"name":"organic_draft_get","listed":true,"area":"organic","docs":"https://docs.trycontinuum.ai/mcp/tools/organic#organic_draft_get","summary":"Reads one draft.","mutates":false,"role":"viewer","integration":null,"brandScoped":true,"confirmation":"none","completion":"sync","retry":"natural_read","roleNote":"Viewer or higher","rateLimit":null,"inputs":{"draftId":{"type":"string","description":"A Planner draft ID, from `organic_draft_list` or `planner_manage`."}},"required":["draftId"],"schema":"https://docs.trycontinuum.ai/mcp/schemas/organic_draft_get.json","examples":[{"title":"Read one draft","arguments":{"draftId":"8b2d6f0a-4e7c-4b1d-a3f5-7c9e1b3d5f27"}}],"errors":[{"code":"INTERNAL","kind":"error","when":"Something went wrong on our side. Retry once, then contact support."},{"code":"NOT_FOUND","kind":"error","when":"The item doesn't exist, or this brand can't see it."},{"code":"BRAND_NOT_SELECTED","kind":"error","when":"No brand is active. Call `brands_select`."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."}],"related":["organic_draft_list"]},{"name":"organic_draft_list","listed":true,"area":"organic","docs":"https://docs.trycontinuum.ai/mcp/tools/organic#organic_draft_list","summary":"Lists drafts on the calendar.","mutates":false,"role":"viewer","integration":null,"brandScoped":true,"confirmation":"none","completion":"sync","retry":"natural_read","roleNote":"Viewer or higher","rateLimit":null,"inputs":{"dateRange":{"type":"object"},"status":{"type":"string","values":["draft","placeholder","approved","scheduled","published","failed","all"],"description":"The status to filter by or set. See the allowed values."},"limit":{"type":"integer","description":"The most items to return."},"cursor":{"type":"string","description":"The pagination cursor from the previous result; omit it for the first page."},"publishable_only":{"type":"boolean","description":"Only drafts that are ready to publish."}},"required":[],"schema":"https://docs.trycontinuum.ai/mcp/schemas/organic_draft_list.json","examples":[{"title":"Approved drafts ready to publish","arguments":{"status":"approved","publishable_only":true,"limit":20}}],"errors":[{"code":"INTERNAL","kind":"error","when":"Something went wrong on our side. Retry once, then contact support."},{"code":"BRAND_NOT_SELECTED","kind":"error","when":"No brand is active. Call `brands_select`."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."}],"related":["organic_draft_get"]},{"name":"organic_inbox_list","listed":false,"available":false,"docs":"https://docs.trycontinuum.ai/mcp/tools/unlisted-posts#organic_inbox_list","summary":"List unified inbox items (DMs, comments, mentions) for a connected Instagram account (cache-first, 30s TTL).","mutates":false,"role":"operator","integration":"instagram","connectionNote":"Instagram.","brandScoped":true,"confirmation":"none","completion":"sync","retry":"natural_read","roleNote":"Operator or higher","rateLimit":null,"inputs":{"platform":{"type":"string","values":["instagram","facebook","linkedin","tiktok","youtube","threads","x"],"description":"The network to act on. See the allowed values."},"kinds":{"type":"array"},"since":{"type":"string","description":"Start of the window, as a date (`YYYY-MM-DD`)."},"limit":{"type":"integer","description":"The most items to return."},"account_id":{"type":"string","description":"The connected account to act on, from `accounts_list` or `account_map`."}},"actionKey":"platform","actions":[{"name":"instagram","required":["platform"]},{"name":"facebook","required":["platform"]},{"name":"linkedin","required":["platform"]},{"name":"tiktok","required":["platform"]},{"name":"youtube","required":["platform"]},{"name":"threads","required":["platform"]},{"name":"x","required":["platform"]}],"sharedInputs":["kinds","since","limit","account_id"],"required":["platform"],"schema":"https://docs.trycontinuum.ai/mcp/schemas/organic_inbox_list.json","examples":[{"title":"List unread DMs","arguments":{"platform":"instagram"}}],"errors":[{"code":"NOT_IMPLEMENTED","kind":"error","when":"Inbox sync not yet implemented."},{"code":"INTEGRATION_DISCONNECTED","kind":"error","when":"The connection lapsed. Reconnect it with `integrations_connect`."},{"code":"INTERNAL","kind":"error","when":"Something went wrong on our side. Retry once, then contact support."},{"code":"NOT_FOUND","kind":"error","when":"The item doesn't exist, or this brand can't see it."},{"code":"BRAND_NOT_SELECTED","kind":"error","when":"No brand is active. Call `brands_select`."},{"code":"needs_role","kind":"status","when":"The person's role is too low for this call. Needs: Operator or higher. Ask an Admin or Owner."},{"code":"needs_integration","kind":"status","when":"The brand has no instagram connection. Call `integrations_connect`."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."}],"related":["organic_inbox_reply"]},{"name":"organic_inbox_reply","listed":false,"available":false,"docs":"https://docs.trycontinuum.ai/mcp/tools/unlisted-posts#organic_inbox_reply","summary":"Reply to an inbox item (DM, comment, or mention) on Instagram.","mutates":true,"role":"operator","integration":"instagram","connectionNote":"Instagram.","brandScoped":true,"confirmation":"none","completion":"sync","retry":"none","roleNote":"Operator or higher","rateLimit":null,"inputs":{"inbox_id":{"type":"string"},"message":{"type":"string"},"inbox_type":{"type":"string","values":["dm","comment","mention"]},"account_id":{"type":"string","description":"The connected account to act on, from `accounts_list` or `account_map`."},"idempotency_key":{"type":"string","description":"A key you choose. Reuse it only to retry the same request without doing it twice."}},"required":["inbox_id","message"],"schema":"https://docs.trycontinuum.ai/mcp/schemas/organic_inbox_reply.json","examples":[{"title":"Reply","arguments":{"inbox_id":"msg_1","message":"Hi"}}],"errors":[{"code":"NOT_IMPLEMENTED","kind":"error","when":"Inbox reply not yet implemented."},{"code":"INTEGRATION_DISCONNECTED","kind":"error","when":"The connection lapsed. Reconnect it with `integrations_connect`."},{"code":"INTERNAL","kind":"error","when":"Something went wrong on our side. Retry once, then contact support."},{"code":"NOT_FOUND","kind":"error","when":"The item doesn't exist, or this brand can't see it."},{"code":"BRAND_NOT_SELECTED","kind":"error","when":"No brand is active. Call `brands_select`."},{"code":"needs_role","kind":"status","when":"The person's role is too low for this call. Needs: Operator or higher. Ask an Admin or Owner."},{"code":"needs_integration","kind":"status","when":"The brand has no instagram connection. Call `integrations_connect`."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."}],"related":["organic_inbox_list"]},{"name":"organic_media_list","listed":false,"docs":"https://docs.trycontinuum.ai/mcp/tools/unlisted-posts#organic_media_list","summary":"List recent organic media for a connected account (cache-first, 5-minute TTL).","mutates":false,"role":"viewer","integration":"instagram","connectionNote":"Instagram.","brandScoped":true,"confirmation":"none","completion":"sync","retry":"natural_read","roleNote":"Viewer or higher","rateLimit":null,"inputs":{"platform":{"type":"string","values":["instagram","facebook","linkedin","tiktok","youtube","threads","x"],"description":"The network to act on. See the allowed values."},"account_id":{"type":"string","description":"The connected account to act on, from `accounts_list` or `account_map`."},"since":{"type":"string","description":"Start of the window, as a date (`YYYY-MM-DD`)."},"until":{"type":"string","description":"End of the window, as a date (`YYYY-MM-DD`)."},"media_types":{"type":"array"},"limit":{"type":"integer","description":"The most items to return."},"cursor":{"type":"string","description":"The pagination cursor from the previous result; omit it for the first page."}},"actionKey":"platform","actions":[{"name":"instagram","required":["platform"]},{"name":"facebook","required":["platform"]},{"name":"linkedin","required":["platform"]},{"name":"tiktok","required":["platform"]},{"name":"youtube","required":["platform"]},{"name":"threads","required":["platform"]},{"name":"x","required":["platform"]}],"sharedInputs":["account_id","since","until","media_types","limit","cursor"],"required":["platform"],"schema":"https://docs.trycontinuum.ai/mcp/schemas/organic_media_list.json","examples":[{"title":"Recent IG posts","arguments":{"platform":"instagram","limit":25}}],"errors":[{"code":"INTERNAL","kind":"error","when":"Something went wrong on our side. Retry once, then contact support."},{"code":"NOT_FOUND","kind":"error","when":"The item doesn't exist, or this brand can't see it."},{"code":"BRAND_NOT_SELECTED","kind":"error","when":"No brand is active. Call `brands_select`."},{"code":"needs_integration","kind":"status","when":"The brand has no instagram connection. Call `integrations_connect`."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."}],"related":["analytics_query","content_create"]},{"name":"organic_profile_get","listed":false,"docs":"https://docs.trycontinuum.ai/mcp/tools/unlisted-posts#organic_profile_get","summary":"Fetch the public profile (handle, follower count, picture, bio) for a connected organic account.","mutates":false,"role":"viewer","integration":"instagram","connectionNote":"Instagram.","brandScoped":true,"confirmation":"none","completion":"sync","retry":"natural_read","roleNote":"Viewer or higher","rateLimit":null,"inputs":{"platform":{"type":"string","values":["instagram","facebook","linkedin","tiktok","youtube","threads","x"],"description":"The network to act on. See the allowed values."},"account_id":{"type":"string","description":"The connected account to act on, from `accounts_list` or `account_map`."}},"actionKey":"platform","actions":[{"name":"instagram","required":["platform"]},{"name":"facebook","required":["platform"]},{"name":"linkedin","required":["platform"]},{"name":"tiktok","required":["platform"]},{"name":"youtube","required":["platform"]},{"name":"threads","required":["platform"]},{"name":"x","required":["platform"]}],"sharedInputs":["account_id"],"required":["platform"],"schema":"https://docs.trycontinuum.ai/mcp/schemas/organic_profile_get.json","examples":[{"title":"IG profile","arguments":{"platform":"instagram"}}],"errors":[{"code":"NOT_IMPLEMENTED","kind":"error","when":"Non-Instagram platforms not yet supported."},{"code":"INTERNAL","kind":"error","when":"Something went wrong on our side. Retry once, then contact support."},{"code":"NOT_FOUND","kind":"error","when":"The item doesn't exist, or this brand can't see it."},{"code":"BRAND_NOT_SELECTED","kind":"error","when":"No brand is active. Call `brands_select`."},{"code":"needs_integration","kind":"status","when":"The brand has no instagram connection. Call `integrations_connect`."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."}],"related":["organic_media_list"]},{"name":"organic_workflow_run","listed":false,"docs":"https://docs.trycontinuum.ai/mcp/tools/unlisted-posts#organic_workflow_run","summary":"Plan and schedule a week of organic content end-to-end in one call. mode='plan_week' starts a run; mode='resume' continues past an approval gate (pass the next_step.arguments the …","mutates":true,"role":"operator","integration":"instagram","connectionNote":"Instagram.","brandScoped":true,"confirmation":"approval_token","completion":"async_job","retry":"none","roleNote":"Operator or higher","rateLimit":null,"inputs":{"mode":{"type":"string","values":["plan_week","resume"],"description":"How the call runs. For writes, `preview` returns a token and `confirm` applies it. See the allowed values."},"weekStart":{"type":"string"},"timezone":{"type":"string","description":"An IANA time zone, such as `America/New_York`."},"brief":{"type":"string","description":"A short brief, in plain words, that steers what gets made."},"platformAccountIds":{"type":"object"},"workflow_id":{"type":"string","description":"A saved workflow ID, from `studio_workflow` `list`."},"approval_token":{"type":"string"},"placements":{"type":"array","description":"The placements returned with the proposed plan."},"skip_placements":{"type":"array"}},"actionKey":"mode","actions":[{"name":"plan_week","required":["mode","weekStart","timezone"],"uses":["brief","platformAccountIds"]},{"name":"resume","required":["mode","workflow_id","approval_token"],"uses":["placements","skip_placements"]}],"required":["mode"],"schema":"https://docs.trycontinuum.ai/mcp/schemas/organic_workflow_run.json","examples":[{"title":"Plan next week end to end","arguments":{"mode":"plan_week","weekStart":"2026-11-16","timezone":"America/New_York","brief":"Lead with the autumn roast launch."}}],"errors":[{"code":"AWAITING_APPROVAL","kind":"error","when":"The run paused at a gate (stage '`awaiting_calendar_approval`' or '`awaiting_publish_approval`'). Re-call with mode='resume' and the `next_step.arguments` the gate returned; use `skip_placements` to drop placements."},{"code":"ADMIN_GRANT_REQUIRED","kind":"error","when":"Stage '`admin_grant_required`' lists pending `confirm_tokens`; an admin must run `mcp_approval_grant` before the run can resume."},{"code":"CTX_MISSING_MODE_A_FIELDS","kind":"error","when":"The call is missing session context. Reconnect the assistant and retry."},{"code":"INTERNAL","kind":"error","when":"Something went wrong on our side. Retry once, then contact support."},{"code":"JOB_ENQUEUE_FAILED","kind":"error","when":"The job couldn't start. Retry once, then contact support."},{"code":"UPSTREAM_ERROR","kind":"error","when":"A platform or provider returned an error. `details` carries its message."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."},{"code":"BRAND_NOT_SELECTED","kind":"error","when":"No brand is active. Call `brands_select`."},{"code":"needs_role","kind":"status","when":"The person's role is too low for this call. Needs: Operator or higher. Ask an Admin or Owner."},{"code":"needs_integration","kind":"status","when":"The brand has no instagram connection. Call `integrations_connect`."}],"related":["content_create","mcp_approval_grant","help_describe"]},{"name":"paid_manage","listed":true,"area":"paid","docs":"https://docs.trycontinuum.ai/mcp/tools/paid#paid_manage","summary":"Reads your campaign structure; creates paused campaigns, ad sets, and ads; updates or pauses them; builds audiences and lookalikes; and keeps an audit log of every write.","mutates":true,"role":"operator","roleByAction":{"hierarchy":"viewer","create_campaign":"operator","create_adset":"operator","create_ad":"operator","upload_media":"operator","update_entity":"operator","update_ad_copy":"operator","duplicate":"operator","create_audience":"operator","create_lookalike":"operator","create_customer_list_audience":"operator","delete_audience":"operator","send_conversions":"operator","manage_rules":"operator","google_ads":"operator","batch":"operator","activity":"viewer","guardrails":"admin"},"integration":null,"connectionNote":"The one for what you act on: Meta (Facebook), Google.","brandScoped":true,"confirmation":"two_phase_confirm_token","completion":"sync","retry":"confirm_token_single_use","roleNote":"Viewer or higher for `hierarchy` and `activity`. Operator or higher for writes. Admin or Owner to set `guardrails`. Activating an ad, or raising a budget past the brand's limit, needs an Admin or Owner's approval.","rateLimit":{"scope":"brand","budget":60,"windowSeconds":3600},"inputs":{"action":{"type":"string","values":["hierarchy","create_campaign","create_adset","create_ad","upload_media","update_entity","update_ad_copy","duplicate","create_audience","create_lookalike","create_customer_list_audience","delete_audience","send_conversions","manage_rules","google_ads","batch","activity","guardrails"],"description":"The operation to run. Each value is listed under Actions."},"params":{"type":"object"},"params.platform":{"type":"string","values":["meta_ads"]},"params.ad_account_id":{"type":"string","description":"Meta ad account (with or without act_). Required when creating a new audience."},"params.level":{"type":"string","values":["campaign","adset","ad"]},"params.parent_id":{"type":"string"},"params.limit":{"type":"integer"},"params.cursor":{"type":"string"},"params.include_deleted":{"type":"boolean"},"params.include_archived":{"type":"boolean"},"params.campaign":{"type":"object"},"params.mode":{"type":"string","values":["preview","confirm"],"description":"'preview' summarizes + returns a confirm_token; 'confirm' sends to Meta."},"params.adsets":{"type":"array","description":"Ad sets created PAUSED in this campaign (same fields as create_adset). Under CBO omit their budgets; under ABO each needs one."},"params.idempotency_key":{"type":"string","description":"Caller operation id; an exact retry replays the receipt."},"params.confirm_token":{"type":"string"},"params.campaign_id":{"type":"string"},"params.adset":{"type":"object"},"params.adset_id":{"type":"string"},"params.ad":{"type":"object"},"params.image_url":{"type":"string","description":"Public http(s) URL of an image; downloaded and uploaded to the ad account."},"params.video_url":{"type":"string","description":"Public http(s) URL of a video; Meta fetches it directly (file_url)."},"params.asset_id":{"type":"string","description":"Continuum library asset id (media.assets); its poster is uploaded too for video."},"params.entity_type":{"type":"string","values":["campaign","adset","ad"]},"params.entity_id":{"type":"string"},"params.changes":{"type":"object"},"params.expected":{"type":"object"},"params.ad_id":{"type":"string"},"params.expected_creative_id":{"type":"string"},"params.deep_copy":{"type":"boolean"},"params.overrides":{"type":"object"},"params.name":{"type":"string","description":"New audience name (required when creating)."},"params.subtype":{"type":"string","values":["WEBSITE","ENGAGEMENT","APP"]},"params.pixel_id":{"type":"string"},"params.retention_days":{"type":"integer"},"params.engagement_type":{"type":"string"},"params.origin_audience_id":{"type":"string"},"params.country":{"type":"string"},"params.ratio":{"type":"number"},"params.lookalike_type":{"type":"string","values":["similarity","reach"]},"params.audience_id":{"type":"string","description":"Append to this existing customer-list audience instead of creating one."},"params.description":{"type":"string"},"params.customer_file_source":{"type":"string","values":["USER_PROVIDED_ONLY","PARTNER_PROVIDED_ONLY","BOTH_USER_AND_PARTNER_PROVIDED"],"description":"Where the list came from (Meta-required). Default USER_PROVIDED_ONLY."},"params.default_country_code":{"type":"string","description":"Dialing code added to phones without one, e.g. '52' for Mexico."},"params.members":{"type":"array","description":"People to add. Hashed server-side; uploaded in batches of 10,000."},"params.dataset_id":{"type":"string","description":"Meta pixel / dataset id that receives the events."},"params.events":{"type":"array","description":"Sent in batches of 1,000."},"params.test_event_code":{"type":"string","description":"Events Manager test code: events show in Test Events and do not count."},"params.op":{"type":"string","values":["list","create","delete","update_campaign_budget","set_status","create_campaign","create_ad_group","add_keywords"]},"params.ops":{"type":"array","description":"Executed in order at confirm; the first failure stops the rest."},"params.tool":{"type":"string","description":"Backing tool name prefix to filter, e.g. paid_entity_update. Default: all paid_*"}},"actionKey":"action","actions":[{"name":"hierarchy","required":["action","params","params.platform","params.ad_account_id","params.level"],"uses":["params.parent_id","params.limit","params.cursor","params.include_deleted","params.include_archived"]},{"name":"create_campaign","required":["action","params","params.platform","params.campaign","params.mode","params.ad_account_id"],"uses":["params.adsets","params.idempotency_key","params.confirm_token"]},{"name":"create_adset","required":["action","params","params.mode","params.platform","params.ad_account_id","params.campaign_id","params.adset"],"uses":["params.idempotency_key","params.confirm_token"]},{"name":"create_ad","required":["action","params","params.mode","params.platform","params.ad_account_id","params.adset_id","params.ad"],"uses":["params.idempotency_key","params.confirm_token"]},{"name":"upload_media","required":["action","params","params.mode","params.platform","params.ad_account_id"],"uses":["params.image_url","params.video_url","params.asset_id","params.idempotency_key","params.confirm_token"]},{"name":"update_entity","required":["action","params","params.mode","params.platform","params.entity_type","params.entity_id","params.changes"],"uses":["params.expected","params.idempotency_key","params.confirm_token"]},{"name":"update_ad_copy","required":["action","params","params.mode","params.platform","params.ad_id","params.changes"],"uses":["params.expected_creative_id","params.idempotency_key","params.confirm_token"]},{"name":"duplicate","required":["action","params","params.mode","params.platform","params.entity_type","params.entity_id"],"uses":["params.deep_copy","params.parent_id","params.overrides","params.idempotency_key","params.confirm_token"]},{"name":"create_audience","required":["action","params","params.mode","params.ad_account_id","params.name","params.subtype","params.idempotency_key"],"uses":["params.pixel_id","params.retention_days","params.engagement_type","params.confirm_token"]},{"name":"create_lookalike","required":["action","params","params.mode","params.ad_account_id","params.name","params.origin_audience_id","params.country","params.ratio","params.lookalike_type","params.idempotency_key"],"uses":["params.confirm_token"]},{"name":"create_customer_list_audience","required":["action","params","params.mode","params.platform","params.members"],"uses":["params.ad_account_id","params.audience_id","params.name","params.description","params.customer_file_source","params.default_country_code","params.idempotency_key","params.confirm_token"]},{"name":"delete_audience","required":["action","params","params.mode","params.platform","params.audience_id"],"uses":["params.idempotency_key","params.confirm_token"]},{"name":"send_conversions","required":["action","params","params.mode","params.platform","params.dataset_id","params.events"],"uses":["params.default_country_code","params.test_event_code","params.idempotency_key","params.confirm_token"]},{"name":"manage_rules","required":["action","params","params.op"],"uses":[]},{"name":"google_ads","required":["action","params","params.op"],"uses":[]},{"name":"batch","required":["action","params","params.mode","params.ops"],"uses":["params.confirm_token"]},{"name":"activity","required":["action","params"],"uses":["params.limit","params.tool"]},{"name":"guardrails","required":["action","params"],"uses":[]}],"required":["action","params"],"confirmationExceptions":{"hierarchy":"none","activity":"none"},"schema":"https://docs.trycontinuum.ai/mcp/schemas/paid_manage.json","examples":[{"title":"List campaigns","arguments":{"action":"hierarchy","params":{"platform":"meta_ads","ad_account_id":"act_123","level":"campaign"}}},{"title":"Preview a campaign","arguments":{"action":"create_campaign","params":{"mode":"preview","platform":"meta_ads","ad_account_id":"act_123","campaign":{"name":"Spring","objective":"OUTCOME_TRAFFIC","daily_budget":1000}}}},{"title":"Cut an ad set to ages 18–55","arguments":{"action":"update_entity","params":{"mode":"preview","platform":"meta_ads","entity_type":"adset","entity_id":"120200000000000000","changes":{"targeting":{"age_max":55}}}}},{"title":"Restructure in one confirmation","arguments":{"action":"batch","params":{"mode":"preview","ops":[{"action":"duplicate","params":{"platform":"meta_ads","entity_type":"adset","entity_id":"1202…"}},{"action":"update_entity","params":{"platform":"meta_ads","entity_type":"adset","entity_id":"1201…","changes":{"status":"PAUSED"}}}]}}},{"title":"Audit log","arguments":{"action":"activity","params":{"limit":20}}},{"title":"Confirm the previewed campaign with its token, after the person says yes","arguments":{"action":"create_campaign","params":{"mode":"confirm","platform":"meta_ads","ad_account_id":"act_123","campaign":{"name":"Spring","objective":"OUTCOME_TRAFFIC","daily_budget":1000},"confirm_token":"tok_7c1e9a2b4d6f8031"}}}],"errors":[{"code":"APPROVAL_REQUIRED","kind":"error","when":"Activating, a budget raise over the brand's spend limits (default +30%) or an approval-chain brand: an admin calls `mcp_approval_grant` with the `confirm_token`, then retry mode='confirm'."},{"code":"CONFIRMATION_REQUIRED","kind":"error","when":"Write actions are two-phase: call with params.mode='preview' to get a `confirm_token`, then params.mode='confirm' with that token."},{"code":"VALIDATION_ERROR","kind":"error","when":"params is the chosen action's own input. objective must be valid for the platform (e.g. `OUTCOME_*` for `meta_ads`)."},{"code":"CONFLICT","kind":"error","when":"The item changed or is busy. Read it again, then retry with the current state."},{"code":"INTEGRATION_DISCONNECTED","kind":"error","when":"The connection lapsed. Reconnect it with `integrations_connect`."},{"code":"INTERNAL","kind":"error","when":"Something went wrong on our side. Retry once, then contact support."},{"code":"NOT_FOUND","kind":"error","when":"The item doesn't exist, or this brand can't see it."},{"code":"UPSTREAM_ERROR","kind":"error","when":"A platform or provider returned an error. `details` carries its message."},{"code":"needs_brand","kind":"status","when":"No brand is active. Call `brands_select`."},{"code":"needs_role","kind":"status","when":"The person's role is too low for this call. Needs: Viewer or higher for `hierarchy` and `activity`. Operator or higher for writes. Admin or Owner to set `guardrails`. Activating an ad, or raising a budget past the brand's limit, needs an Admin or Owner's approval. Ask an Admin or Owner."},{"code":"needs_integration","kind":"status","when":"The brand lacks the connection this call needs. Call `integrations_connect` with the `platform` the result names."},{"code":"RATE_LIMITED","kind":"error","when":"Wait `details.retry_after_seconds`, then retry."}],"notes":["Every write is two-phase: `params.mode: \"preview\"` returns a diff and a `confirm_token` that lasts 10 minutes; repeat the call with `params.mode: \"confirm\"` and the token.","Budgets are in minor units of the ad account’s currency: `daily_budget: 1000` is 10.00. Google Ads budgets use micros: `1000000` is 1.00.","`guardrails` reads the brand’s spend caps for any Viewer; setting them (`mode: \"set\"`) needs an Admin or Owner.","Campaigns, ad sets, ads, and copies are created paused. Activating one, raising a budget past the brand's limit (by default, more than 30%), or any write on a brand with an approval chain returns `APPROVAL_REQUIRED` until an Admin or Owner calls `mcp_approval_grant`.","`batch` previews many writes under one token.","Each write receipt includes `undo`: the call that reverses it, or null with the reason it can’t be undone.","`google_ads` runs one Google Ads operation (`update_campaign_budget`, `set_status`, `create_campaign`, `create_ad_group`, or `add_keywords`) with the same preview and confirm steps, and needs the brand’s Google connection. `ENABLED` needs an Admin or Owner.","Boosting organic posts isn’t supported."],"related":["analytics_query","account_map","mcp_approval_grant","mcp_approvals_list","help_describe"]},{"name":"paid_naming_schema_get","listed":true,"area":"paid","docs":"https://docs.trycontinuum.ai/mcp/tools/paid#paid_naming_schema_get","summary":"Your brand's campaign naming convention.","mutates":false,"role":"viewer","integration":null,"brandScoped":true,"confirmation":"none","completion":"sync","retry":"natural_read","roleNote":"Viewer or higher","rateLimit":null,"inputs":{"platform":{"type":"string","values":["meta","google","all"],"description":"The network to act on. See the allowed values."}},"required":[],"schema":"https://docs.trycontinuum.ai/mcp/schemas/paid_naming_schema_get.json","examples":[{"title":"The Meta naming convention","arguments":{"platform":"meta"}}],"errors":[{"code":"INTERNAL","kind":"error","when":"Something went wrong on our side. Retry once, then contact support."},{"code":"BRAND_NOT_SELECTED","kind":"error","when":"No brand is active. Call `brands_select`."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."}],"related":["analytics_creative_insights","analytics_query"]},{"name":"paid_naming_schema_set","listed":false,"docs":"https://docs.trycontinuum.ai/mcp/tools/unlisted#paid_naming_schema_set","summary":"Configure the active brand's ad-naming convention for a platform: a delimiter (e.g. '|') plus an ordered list of field labels (e.g. ['funnel', 'format', 'audience']). Once set, ad…","mutates":true,"role":"operator","integration":null,"brandScoped":true,"confirmation":"none","completion":"sync","retry":"naturally_idempotent","roleNote":"Operator or higher","rateLimit":null,"inputs":{"platform":{"type":"string","values":["meta","google","all"],"description":"The network to act on. See the allowed values."},"delimiter":{"type":"string","description":"Separator between name segments, e.g. '|'."},"fields":{"type":"array","description":"Ordered field labels, e.g. ['funnel', 'format', 'audience']."}},"required":["delimiter","fields"],"schema":"https://docs.trycontinuum.ai/mcp/schemas/paid_naming_schema_set.json","examples":[{"title":"Set a Meta naming convention","arguments":{"platform":"meta","delimiter":"|","fields":["funnel","format","audience"]}}],"errors":[{"code":"INTERNAL","kind":"error","when":"Something went wrong on our side. Retry once, then contact support."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."},{"code":"BRAND_NOT_SELECTED","kind":"error","when":"No brand is active. Call `brands_select`."},{"code":"needs_role","kind":"status","when":"The person's role is too low for this call. Needs: Operator or higher. Ask an Admin or Owner."}],"related":["paid_naming_schema_get","paid_manage"]},{"name":"pipeline_describe","listed":true,"area":"creative","docs":"https://docs.trycontinuum.ai/mcp/tools/creative#pipeline_describe","summary":"Shows what a pipeline needs.","mutates":false,"role":"viewer","integration":null,"brandScoped":true,"confirmation":"none","completion":"sync","retry":"natural_read","roleNote":"Viewer or higher","rateLimit":null,"inputs":{"pipeline_id":{"type":"string"}},"required":["pipeline_id"],"schema":"https://docs.trycontinuum.ai/mcp/schemas/pipeline_describe.json","examples":[{"title":"What a pipeline needs","arguments":{"pipeline_id":"1c4e7a9d-3b5f-4d2a-8e6c-9f0b2d4a6c81"}}],"errors":[{"code":"NOT_FOUND","kind":"error","when":"The item doesn't exist, or this brand can't see it."},{"code":"BRAND_NOT_SELECTED","kind":"error","when":"No brand is active. Call `brands_select`."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."}],"related":["pipeline_invoke","pipeline_search"]},{"name":"pipeline_invoke","listed":true,"area":"creative","docs":"https://docs.trycontinuum.ai/mcp/tools/creative#pipeline_invoke","summary":"Runs a pipeline, up to 10 versions per request.","mutates":true,"role":"operator","integration":null,"brandScoped":true,"confirmation":"none","completion":"sync_then_async","retry":"idempotency_key","roleNote":"Operator or higher, because a run can spend.","rateLimit":null,"rateLimitNote":"Up to 10 runs in one call.","inputs":{"pipeline_id":{"type":"string","description":"pipeline_id returned by pipeline_describe."},"family_id":{"type":"string","description":"identity.family_id returned by pipeline_describe."},"revision":{"type":"integer","description":"identity.revision returned by pipeline_describe."},"contract_hash":{"type":"string","description":"identity.contract_hash returned by pipeline_describe."},"idempotency_key":{"type":"string","description":"Stable caller-generated key. Reuse it only to retry this exact invocation. In a batch, run i is keyed `<idempotency_key>:<i>`."},"text_inputs":{"type":"array"},"asset_inputs":{"type":"array"},"element_inputs":{"type":"array"},"runs":{"type":"array","description":"Up to 10 variations in one call, each with its own input lists. Use instead of the top-level input lists, never together with them."}},"required":["pipeline_id","family_id","revision","contract_hash","idempotency_key"],"schema":"https://docs.trycontinuum.ai/mcp/schemas/pipeline_invoke.json","examples":[{"title":"Run a pipeline twice with different headlines","arguments":{"pipeline_id":"1c4e7a9d-3b5f-4d2a-8e6c-9f0b2d4a6c81","family_id":"6d9b2f4a-8c1e-4f3b-b7d5-2a4c6e8f0b39","revision":3,"contract_hash":"4e9f1c7a2b8d3e6f0a5c9b1d7e2f4a8c6b0d3e5f7a9c1b2d4e6f8a0c2e4b6d81","idempotency_key":"autumn-launch-2026-11-09","runs":[{"text_inputs":[{"input_id":"headline","value":"Autumn roast, out now"}]},{"text_inputs":[{"input_id":"headline","value":"Limited batch: autumn roast"}]}]}}],"errors":[{"code":"INTERNAL","kind":"error","when":"Something went wrong on our side. Retry once, then contact support."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."},{"code":"needs_brand","kind":"status","when":"No brand is active. Call `brands_select`."},{"code":"needs_role","kind":"status","when":"The person's role is too low for this call. Needs: Operator or higher, because a run can spend. Ask an Admin or Owner."}],"notes":["Returns one receipt per run right away, usually `queued`. Read progress with `pipeline_run_status`.","Reusing the same `idempotency_key` for the exact same request is safe. Use a new key for a new request."],"related":["pipeline_describe","pipeline_run_status"]},{"name":"pipeline_run_status","listed":true,"area":"creative","docs":"https://docs.trycontinuum.ai/mcp/tools/creative#pipeline_run_status","summary":"Checks a pipeline run.","mutates":false,"role":"viewer","integration":null,"brandScoped":true,"confirmation":"none","completion":"sync","retry":"natural_read","roleNote":"Viewer or higher","rateLimit":null,"inputs":{"run_ids":{"type":"array","description":"run_id values from the receipts pipeline_invoke returned."}},"required":["run_ids"],"schema":"https://docs.trycontinuum.ai/mcp/schemas/pipeline_run_status.json","examples":[{"title":"Check a run","arguments":{"run_ids":["f4a8c2e6-0b3d-4a7f-9c1e-5b7d9f1a3c62"]}}],"errors":[{"code":"BRAND_NOT_SELECTED","kind":"error","when":"No brand is active. Call `brands_select`."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."}],"related":["pipeline_describe","pipeline_invoke"]},{"name":"pipeline_search","listed":true,"area":"creative","docs":"https://docs.trycontinuum.ai/mcp/tools/creative#pipeline_search","summary":"Finds your team's saved pipelines.","mutates":false,"role":"viewer","integration":null,"brandScoped":true,"confirmation":"none","completion":"sync","retry":"natural_read","roleNote":"Viewer or higher","rateLimit":null,"inputs":{"query":{"type":"string","description":"Optional words matched against pipeline names, descriptions, inputs, outputs, and produces."},"limit":{"type":"integer","description":"Maximum capabilities to return."},"offset":{"type":"integer","description":"Number of matches to skip."}},"required":[],"schema":"https://docs.trycontinuum.ai/mcp/schemas/pipeline_search.json","examples":[{"title":"Find a saved pipeline","arguments":{"query":"product photo to lifestyle","limit":5}}],"errors":[{"code":"INTERNAL","kind":"error","when":"Something went wrong on our side. Retry once, then contact support."},{"code":"BRAND_NOT_SELECTED","kind":"error","when":"No brand is active. Call `brands_select`."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."}],"related":["pipeline_describe","pipeline_invoke"]},{"name":"planner_manage","listed":true,"area":"organic","docs":"https://docs.trycontinuum.ai/mcp/tools/organic#planner_manage","summary":"Reads and proposes a week of posts, approves it, reschedules and copies posts, and attaches media.","mutates":true,"role":"operator","roleByAction":{"get_week":"viewer","propose_week":"operator","proposal_status":"viewer","approve_week":"operator","reschedule":"operator","reschedule_many":"operator","copy":"operator","attach_media":"operator","bulk_transition":"operator","operation_status":"viewer"},"integration":null,"connectionNote":"The one for what you act on: Instagram.","brandScoped":true,"confirmation":"two_phase_confirm_token","completion":"sync_then_async","retry":"confirm_token_single_use","roleNote":"Viewer or higher for `get_week`, `proposal_status`, and `operation_status`. Operator or higher for every other action.","rateLimit":null,"rateLimitNote":"Calendar changes 120 and week plans 20 an hour, per brand.","inputs":{"action":{"type":"string","values":["get_week","propose_week","proposal_status","approve_week","reschedule","reschedule_many","copy","attach_media","bulk_transition","operation_status"],"description":"The operation to run. Each value is listed under Actions."},"week_start":{"type":"string","description":"The Monday that starts the week, as a date (`YYYY-MM-DD`)."},"timezone":{"type":"string","description":"An IANA time zone, such as `America/New_York`."},"platform_account_ids":{"type":"object"},"job_id":{"type":"string","description":"A job ID an earlier call returned."},"plan_id":{"type":"string"},"pending_approval_token":{"type":"string"},"placements":{"type":"array","description":"The placements returned with the proposed plan."},"draft_id":{"type":"string","description":"A Planner draft ID, from `organic_draft_list` or `planner_manage`."},"day":{"type":"string","description":"The day, as a date (`YYYY-MM-DD`)."},"time_of_day":{"type":"string","description":"The time of day, as `HH:MM` in the given time zone."},"expected_updated_at":{"type":"string","description":"The item's `updated_at` from your last read. The write is refused if the item changed since."},"targets":{"type":"array","description":"The items to act on, each with its own fields."},"source_day":{"type":"string"},"draft_ids":{"type":"array"},"assets":{"type":"array"},"replace":{"type":"boolean","description":"Replace what is there instead of adding to it."},"to_status":{"type":"string","values":["draft","approved","scheduled","failed"]},"mode":{"type":"string","values":["preview","confirm"],"description":"How the call runs. For writes, `preview` returns a token and `confirm` applies it. See the allowed values."},"confirm_token":{"type":"string","description":"The token a preview returned. Send it back to confirm that exact change."},"atomicity":{"type":"string","values":["all_or_nothing","best_effort"]},"operation_id":{"type":"string","description":"A stable ID for this write, so an exact retry returns the same receipt."}},"actionKey":"action","actions":[{"name":"get_week","required":["action"],"uses":["week_start","timezone"]},{"name":"propose_week","required":["action"],"uses":["week_start","timezone","platform_account_ids"]},{"name":"proposal_status","required":["action","job_id"],"uses":[]},{"name":"approve_week","required":["action","job_id|plan_id+pending_approval_token+placements"],"uses":["operation_id"]},{"name":"reschedule","required":["action","draft_id","day"],"uses":["time_of_day","expected_updated_at","timezone","atomicity","operation_id"]},{"name":"reschedule_many","required":["action","targets"],"uses":["timezone","atomicity","operation_id"]},{"name":"copy","required":["action","day","draft_ids|source_day"],"uses":["timezone","atomicity","operation_id"]},{"name":"attach_media","required":["action","assets","draft_ids|draft_id"],"uses":["replace","expected_updated_at","atomicity","operation_id"]},{"name":"bulk_transition","required":["action","to_status","draft_ids"],"uses":["mode","confirm_token","expected_updated_at","atomicity","operation_id"]},{"name":"operation_status","required":["action","operation_id"],"uses":[]}],"required":["action"],"confirmationExceptions":{"get_week":"none","proposal_status":"none","operation_status":"none"},"schema":"https://docs.trycontinuum.ai/mcp/schemas/planner_manage.json","examples":[{"title":"Read next week's calendar","arguments":{"action":"get_week","week_start":"2026-11-16","timezone":"America/New_York"}},{"title":"Propose a week of posts","arguments":{"action":"propose_week","week_start":"2026-11-16","timezone":"America/New_York"}},{"title":"Move one post","arguments":{"action":"reschedule","draft_id":"8b2d6f0a-4e7c-4b1d-a3f5-7c9e1b3d5f27","day":"2026-11-19","time_of_day":"09:30"}}],"errors":[{"code":"CONFLICT","kind":"error","when":"The item changed or is busy. Read it again, then retry with the current state."},{"code":"CTX_MISSING_MODE_A_FIELDS","kind":"error","when":"The call is missing session context. Reconnect the assistant and retry."},{"code":"INTERNAL","kind":"error","when":"Something went wrong on our side. Retry once, then contact support."},{"code":"JOB_ENQUEUE_FAILED","kind":"error","when":"The job couldn't start. Retry once, then contact support."},{"code":"JOB_PENDING","kind":"error","when":"The job is still running. Check `jobs_status` later."},{"code":"NOT_FOUND","kind":"error","when":"The item doesn't exist, or this brand can't see it."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."},{"code":"needs_brand","kind":"status","when":"No brand is active. Call `brands_select`."},{"code":"needs_role","kind":"status","when":"The person's role is too low for this call. Needs: Viewer or higher for `get_week`, `proposal_status`, and `operation_status`. Operator or higher for every other action. Ask an Admin or Owner."},{"code":"needs_integration","kind":"status","when":"The brand lacks the connection this call needs. Call `integrations_connect` with the `platform` the result names."},{"code":"CONFIRMATION_REQUIRED","kind":"error","when":"This write needs a preview first. Preview, get a yes, then confirm with the returned token."}],"notes":["Commit a week the Organic agent planned with `approve_week` (its `plan_id`, `pending_approval_token`, and `placements`). Some server descriptions name `organic_calendar_approve` for this step; that tool isn’t callable.","`propose_week` runs as a job. `proposal_status` returns its `plan_id` and a `pending_approval_token` that lasts 24 hours.","`approve_week` commits the whole week in one step and is safe to repeat. The `job_id` from `propose_week` can stand in for `plan_id`, `pending_approval_token`, and `placements`."],"related":["content_create"]},{"name":"post_audit","listed":false,"docs":"https://docs.trycontinuum.ai/mcp/tools/unlisted-posts#post_audit","summary":"Audit a draft or published post for brand voice, hashtags, accessibility, and platform fit.","mutates":false,"role":"viewer","integration":"instagram","connectionNote":"Instagram.","brandScoped":true,"confirmation":"none","completion":"sync_then_async","retry":"natural_read","roleNote":"Any brand member","rateLimit":null,"inputs":{"account_id":{"type":"string","description":"The connected account to act on, from `accounts_list` or `account_map`."},"content":{"type":"object"},"audit_dimensions":{"type":"array"},"force_refresh":{"type":"boolean"},"async":{"type":"boolean"}},"required":["account_id","content"],"schema":"https://docs.trycontinuum.ai/mcp/schemas/post_audit.json","examples":[{"title":"Audit a draft caption before publishing","arguments":{"account_id":"5c8e1a3b-7d2f-4e6a-9b4c-0f1e3d5a7c92","content":{"type":"post","caption":"Autumn is here. Our new single-origin roast is out now.","hashtags":["#coffee","#autumn"]},"audit_dimensions":["brand_voice","hashtag_strategy"]}}],"errors":[{"code":"UPSTREAM_ERROR","kind":"error","when":"Jaina audit endpoint failed."},{"code":"NOT_FOUND","kind":"error","when":"Referenced `post_id` is not in `published_posts`."},{"code":"BRAND_NOT_SELECTED","kind":"error","when":"No brand is active. Call `brands_select`."},{"code":"needs_integration","kind":"status","when":"The brand has no instagram connection. Call `integrations_connect`."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."}],"related":["insights_get","jobs_status"]},{"name":"post_create_instagram","listed":false,"docs":"https://docs.trycontinuum.ai/mcp/tools/unlisted-posts#post_create_instagram","summary":"Publish an Instagram image, carousel, or reel. Call with mode='preview' first to validate and get a confirm_token, then mode='publish' with the token to execute.","mutates":true,"role":"viewer","integration":"instagram","connectionNote":"Instagram.","brandScoped":true,"confirmation":"two_phase_confirm_token","completion":"sync_then_async","retry":"idempotency_key","roleNote":"Any brand member","rateLimit":null,"inputs":{"account_id":{"type":"string","description":"The connected account to act on, from `accounts_list` or `account_map`."},"type":{"type":"string","values":["image","carousel","reel"],"description":"The type of post or item. See the allowed values."},"caption":{"type":"string","description":"The post caption."},"hashtags":{"type":"array"},"media":{"type":"array"},"cover_image_url":{"type":"string"},"schedule_at":{"type":"string","description":"When to publish, as an ISO 8601 date-time."},"location_id":{"type":"string"},"idempotency_key":{"type":"string","description":"A key you choose. Reuse it only to retry the same request without doing it twice."},"mode":{"type":"string","values":["preview","publish"],"description":"How the call runs. For writes, `preview` returns a token and `confirm` applies it. See the allowed values."},"confirm_token":{"type":"string","description":"The token a preview returned. Send it back to confirm that exact change."}},"actionKey":"type","actions":[{"name":"image","required":["account_id","type","caption","media","idempotency_key"]},{"name":"carousel","required":["account_id","type","caption","media","idempotency_key"]},{"name":"reel","required":["account_id","type","caption","media","idempotency_key"]}],"sharedInputs":["account_id","caption","hashtags","media","cover_image_url","schedule_at","location_id","idempotency_key","mode","confirm_token"],"required":["account_id","type","caption","media","idempotency_key"],"schema":"https://docs.trycontinuum.ai/mcp/schemas/post_create_instagram.json","examples":[{"title":"Preview an image post (publish only after a yes)","arguments":{"account_id":"5c8e1a3b-7d2f-4e6a-9b4c-0f1e3d5a7c92","type":"image","caption":"Autumn is here. Our new single-origin roast is out now.","media":[{"type":"image","source_url":"https://cdn.example.com/autumn-roast.jpg"}],"idempotency_key":"autumn-roast-post-2026-11-09","mode":"preview"}}],"errors":[{"code":"VALIDATION_ERROR","kind":"error","when":"Format/media mismatch or invalid `schedule_at`."},{"code":"CONFLICT","kind":"error","when":"Idempotency key already produced a published post."},{"code":"UPSTREAM_ERROR","kind":"error","when":"Instagram Graph API rejected the publish call."},{"code":"MEDIA_INVALID","kind":"error","when":"The file can't be used: wrong type, size, or dimensions. `details` says which."},{"code":"BRAND_NOT_SELECTED","kind":"error","when":"No brand is active. Call `brands_select`."},{"code":"needs_integration","kind":"status","when":"The brand has no instagram connection. Call `integrations_connect`."},{"code":"CONFIRMATION_REQUIRED","kind":"error","when":"This write needs a preview first. Preview, get a yes, then confirm with the returned token."}],"related":["post_manage","post_audit"]},{"name":"post_manage","listed":false,"docs":"https://docs.trycontinuum.ai/mcp/tools/unlisted-posts#post_manage","summary":"Manage an existing post: unschedule, reschedule, edit caption, or delete. Use preview_delete first for published posts to get a confirm_token before deleting.","mutates":true,"role":"viewer","integration":"instagram","connectionNote":"Instagram.","brandScoped":true,"confirmation":"elicitation_or_confirm_token","completion":"sync","retry":"none","roleNote":"Any brand member","rateLimit":null,"inputs":{"account_id":{"type":"string","description":"The connected account to act on, from `accounts_list` or `account_map`."},"post_id":{"type":"string","description":"The post's ID on the platform."},"action":{"type":"string","values":["unschedule","delete","edit_caption","reschedule","preview_delete"],"description":"The operation to run. Each value is listed under Actions."},"caption":{"type":"string","description":"The post caption."},"schedule_at":{"type":"string","description":"When to publish, as an ISO 8601 date-time."},"idempotency_key":{"type":"string","description":"A key you choose. Reuse it only to retry the same request without doing it twice."},"confirm_token":{"type":"string","description":"The token a preview returned. Send it back to confirm that exact change."}},"actionKey":"action","actions":[{"name":"unschedule","required":["account_id","post_id","action"]},{"name":"delete","required":["account_id","post_id","action","idempotency_key"]},{"name":"edit_caption","required":["account_id","post_id","action","caption"]},{"name":"reschedule","required":["account_id","post_id","action","schedule_at","idempotency_key"]},{"name":"preview_delete","required":["account_id","post_id","action"]}],"sharedInputs":["account_id","post_id","caption","schedule_at","idempotency_key","confirm_token"],"required":["account_id","post_id","action"],"schema":"https://docs.trycontinuum.ai/mcp/schemas/post_manage.json","examples":[{"title":"Move a scheduled post","arguments":{"account_id":"5c8e1a3b-7d2f-4e6a-9b4c-0f1e3d5a7c92","post_id":"17895695668004550","action":"reschedule","schedule_at":"2026-11-20T15:00:00Z","idempotency_key":"reschedule-17895695668004550-1120"}}],"errors":[{"code":"CONFLICT","kind":"error","when":"Action not allowed in the current post state."},{"code":"NOT_FOUND","kind":"error","when":"`post_id` does not resolve to a draft or published post."},{"code":"CONFIRMATION_REQUIRED","kind":"error","when":"This write needs a preview first. Preview, get a yes, then confirm with the returned token."},{"code":"INTERNAL","kind":"error","when":"Something went wrong on our side. Retry once, then contact support."},{"code":"PERMISSION_DENIED","kind":"error","when":"The person's role can't do this. Ask an Admin or Owner."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."},{"code":"BRAND_NOT_SELECTED","kind":"error","when":"No brand is active. Call `brands_select`."},{"code":"needs_integration","kind":"status","when":"The brand has no instagram connection. Call `integrations_connect`."}],"related":["post_create_instagram"]},{"name":"studio_deliver","listed":true,"area":"creative","docs":"https://docs.trycontinuum.ai/mcp/tools/creative#studio_deliver","summary":"Previews and sends finished creative to a planned post, an organic publish, or a live ad, and restores a swapped ad.","mutates":true,"role":"operator","roleByAction":{"find_targets":"operator","preview":"operator","attach_to_planner":"operator","publish_organic":"operator","replace_paid_creative":"operator","restore_paid_creative":"operator","status":"operator"},"integration":null,"brandScoped":true,"confirmation":"two_phase_confirm_token","completion":"sync","retry":"idempotency_key","roleNote":"Operator or higher.","rateLimit":null,"inputs":{"action":{"type":"string","values":["find_targets","preview","attach_to_planner","publish_organic","replace_paid_creative","restore_paid_creative","status"],"description":"The operation to run. Each value is listed under Actions."},"target_type":{"type":"string","values":["organic_draft","paid_ad"]},"format":{"type":"string","values":["image","carousel","video"],"description":"The format to make or return. See the allowed values."},"asset_ids":{"type":"array"},"asset_refs":{"type":"array"},"draft_id":{"type":"string","description":"A Planner draft ID, from `organic_draft_list` or `planner_manage`."},"expected_updated_at":{"type":"string","description":"The item's `updated_at` from your last read. The write is refused if the item changed since."},"ad_account_id":{"type":"string","description":"The Meta ad account ID (`act_…`), from `account_map`."},"campaign_id":{"type":"string","description":"The campaign ID, from `paid_manage` `hierarchy` or `analytics_query`."},"adset_id":{"type":"string","description":"The ad set ID, from `paid_manage` `hierarchy` or `analytics_query`."},"ad_id":{"type":"string"},"expected_creative_id":{"type":"string"},"replacement_id":{"type":"string"},"level":{"type":"string","values":["campaign","adset","ad"],"description":"Which rung of the paid tree find_targets lists for target_type='paid_ad': campaign | adset | ad. Optional — omitted means 'campaign'."},"parent_id":{"type":"string"},"platform":{"type":"string","description":"The network to act on. See the allowed values."},"platform_account_id":{"type":"string"},"query":{"type":"string","description":"What to look for, in plain words."},"cursor":{"type":"string","description":"The pagination cursor from the previous result; omit it for the first page."},"limit":{"type":"integer","description":"The most items to return."},"intent":{"type":"string","values":["attach_to_planner","publish_organic","replace_paid_creative","restore_paid_creative"]},"confirm_token":{"type":"string","description":"The token a preview returned. Send it back to confirm that exact change."},"operation_id":{"type":"string","description":"A stable ID for this write, so an exact retry returns the same receipt."},"room_id":{"type":"string","description":"A canvas workspace ID, from `studio_workflow` `workspace_list`."}},"actionKey":"action","actions":[{"name":"find_targets","required":["action"],"uses":["target_type","format","asset_ids","asset_refs","draft_id","expected_updated_at","ad_account_id","campaign_id","adset_id","ad_id","expected_creative_id","replacement_id","level","parent_id","platform","platform_account_id","query","cursor","limit","intent","confirm_token","operation_id","room_id"]},{"name":"preview","required":["action"],"uses":["target_type","format","asset_ids","asset_refs","draft_id","expected_updated_at","ad_account_id","campaign_id","adset_id","ad_id","expected_creative_id","replacement_id","level","parent_id","platform","platform_account_id","query","cursor","limit","intent","confirm_token","operation_id","room_id"]},{"name":"attach_to_planner","required":["action"],"uses":["target_type","format","asset_ids","asset_refs","draft_id","expected_updated_at","ad_account_id","campaign_id","adset_id","ad_id","expected_creative_id","replacement_id","level","parent_id","platform","platform_account_id","query","cursor","limit","intent","confirm_token","operation_id","room_id"]},{"name":"publish_organic","required":["action"],"uses":["target_type","format","asset_ids","asset_refs","draft_id","expected_updated_at","ad_account_id","campaign_id","adset_id","ad_id","expected_creative_id","replacement_id","level","parent_id","platform","platform_account_id","query","cursor","limit","intent","confirm_token","operation_id","room_id"]},{"name":"replace_paid_creative","required":["action"],"uses":["target_type","format","asset_ids","asset_refs","draft_id","expected_updated_at","ad_account_id","campaign_id","adset_id","ad_id","expected_creative_id","replacement_id","level","parent_id","platform","platform_account_id","query","cursor","limit","intent","confirm_token","operation_id","room_id"]},{"name":"restore_paid_creative","required":["action"],"uses":["target_type","format","asset_ids","asset_refs","draft_id","expected_updated_at","ad_account_id","campaign_id","adset_id","ad_id","expected_creative_id","replacement_id","level","parent_id","platform","platform_account_id","query","cursor","limit","intent","confirm_token","operation_id","room_id"]},{"name":"status","required":["action"],"uses":["target_type","format","asset_ids","asset_refs","draft_id","expected_updated_at","ad_account_id","campaign_id","adset_id","ad_id","expected_creative_id","replacement_id","level","parent_id","platform","platform_account_id","query","cursor","limit","intent","confirm_token","operation_id","room_id"]}],"required":["action"],"schema":"https://docs.trycontinuum.ai/mcp/schemas/studio_deliver.json","examples":[{"title":"Find organic drafts to deliver to","arguments":{"action":"find_targets","target_type":"organic_draft","format":"image"}},{"title":"Preview attaching a creative to a Planner draft","arguments":{"action":"preview","intent":"attach_to_planner","draft_id":"00000000-0000-0000-0000-000000000000","expected_updated_at":"2026-07-24T00:00:00.000Z","format":"image","asset_ids":["11111111-1111-4111-8111-111111111111"]}}],"errors":[{"code":"CONFIRMATION_REQUIRED","kind":"error","when":"Writes are two-phase: action=preview returns a `confirm_token`, then the intent action (`attach_to_planner` / `replace_paid_creative` / …) with it."},{"code":"CONFLICT","kind":"error","when":"`draft_changed` / `paid_target_changed` — the destination moved since preview (stale-write refusal). Re-preview to pin the current version."},{"code":"NOT_FOUND","kind":"error","when":"The item doesn't exist, or this brand can't see it."},{"code":"needs_brand","kind":"status","when":"No brand is active. Call `brands_select`."},{"code":"needs_role","kind":"status","when":"The person's role is too low for this call. Needs: Operator or higher. Ask an Admin or Owner."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."}],"notes":["Writes are two-phase and carry an `operation_id`: an exact retry replays the same receipt.","A result marked `indeterminate` isn’t safe to retry blindly. Check the destination first.","`replace_paid_creative` returns a restore handle; `restore_paid_creative` undoes the swap."],"related":["studio_workflow","content_create","paid_manage","help_describe"]},{"name":"studio_workflow","listed":true,"area":"creative","docs":"https://docs.trycontinuum.ai/mcp/tools/creative#studio_workflow","summary":"Builds, edits, runs, saves, and lists canvas workflows.","mutates":true,"role":"operator","roleByAction":{"get":"operator","list":"operator","build":"operator","edit":"operator","run":"operator","run_status":"operator","rename":"operator","delete":"operator","workspace_list":"operator","workspace_create":"operator","workspace_delete":"operator","save":"operator","save_as_copy":"operator"},"integration":null,"brandScoped":true,"confirmation":"two_phase_confirm_token","completion":"sync_then_async","retry":"none","roleNote":"Operator or higher, for every action.","rateLimit":null,"rateLimitNote":"Canvas runs: 10 an hour, per brand.","inputs":{"action":{"type":"string","values":["get","list","build","edit","run","run_status","rename","delete","workspace_list","workspace_create","workspace_delete","save","save_as_copy"],"description":"The operation to run. Each value is listed under Actions."},"target":{"type":"string","values":["library","canvas"],"description":"Where the call applies. See the allowed values."},"mode":{"type":"string","values":["append","replace"],"description":"How the call runs. For writes, `preview` returns a token and `confirm` applies it. See the allowed values."},"workflow_id":{"type":"string","description":"A saved workflow ID, from `studio_workflow` `list`."},"seed_workflow_id":{"type":"string"},"room_id":{"type":"string","description":"A canvas workspace ID, from `studio_workflow` `workspace_list`."},"source_draft_id":{"type":"string","description":"action=build only: an organic Planner draft id. The graph is seeded from that draft and delivered back to it."},"name":{"type":"string","description":"A display name."},"description":{"type":"string","description":"A short description."},"nodes":{"type":"array"},"connections":{"type":"array"},"ops":{"type":"array"},"node_ids":{"type":"array"},"run_request_id":{"type":"string"},"expected_updated_at":{"type":"string","description":"The item's `updated_at` from your last read. The write is refused if the item changed since."},"confirm_token":{"type":"string","description":"The token a preview returned. Send it back to confirm that exact change."}},"actionKey":"action","actions":[{"name":"get","required":["action"],"uses":["workflow_id","room_id","target","name"]},{"name":"list","required":["action"],"uses":[]},{"name":"build","required":["action","nodes|source_draft_id"],"uses":["connections","target","room_id","mode","name","description","confirm_token"]},{"name":"edit","required":["action","ops","target"],"uses":["workflow_id","expected_updated_at","room_id","seed_workflow_id","name","description","confirm_token"]},{"name":"run","required":["action","room_id"],"uses":["workflow_id","node_ids","target"]},{"name":"run_status","required":["action","run_request_id"],"uses":[]},{"name":"rename","required":["action","workflow_id","name"],"uses":["description"]},{"name":"delete","required":["action","workflow_id"],"uses":["confirm_token"]},{"name":"workspace_list","required":["action"],"uses":[]},{"name":"workspace_create","required":["action","name"],"uses":[]},{"name":"workspace_delete","required":["action","room_id"],"uses":["confirm_token"]},{"name":"save","required":["action","workflow_id","expected_updated_at","room_id"],"uses":["name","description"]},{"name":"save_as_copy","required":["action","workflow_id|room_id"],"uses":["name","description"]}],"required":["action"],"schema":"https://docs.trycontinuum.ai/mcp/schemas/studio_workflow.json","examples":[{"title":"Read the current canvas","arguments":{"action":"get"}},{"title":"Build an image workflow onto the canvas","arguments":{"action":"build","target":"canvas","nodes":[{"ref":"prompt","type":"string","data":{"value":"a sneaker on concrete"}},{"ref":"img","type":"nanoGen"}],"connections":[{"from_ref":"prompt","to_ref":"img","role":"prompt"}]}},{"title":"Rename a saved workflow","arguments":{"action":"rename","workflow_id":"wf_123","name":"Summer launch"}}],"errors":[{"code":"VALIDATION_ERROR","kind":"error","when":"action=build requires `nodes`; unknown node types are rejected."},{"code":"CONFIRMATION_REQUIRED","kind":"error","when":"build mode='replace' and edit `remove_node`/disconnect/`detach_media` and action=delete are two-phase — preview returns a `confirm_token`; re-send the same call with it."},{"code":"CONFLICT","kind":"error","when":"The item changed or is busy. Read it again, then retry with the current state."},{"code":"INTERNAL","kind":"error","when":"Something went wrong on our side. Retry once, then contact support."},{"code":"NOT_FOUND","kind":"error","when":"The item doesn't exist, or this brand can't see it."},{"code":"needs_brand","kind":"status","when":"No brand is active. Call `brands_select`."},{"code":"needs_role","kind":"status","when":"The person's role is too low for this call. Needs: Operator or higher, for every action. Ask an Admin or Owner."}],"notes":["Canvas reads and builds work on a workspace (`room_id`). `target: \"library\"` saves a reusable template instead.","`delete` and `workspace_delete` are two-phase. A brand holds at most three workspaces.","To make the creative for a Planner draft, pass `source_draft_id` to `build`.","`run` without a `room_id` returns `needs_workspace`: ask the person to open the canvas in Continuum, then retry."],"related":["studio_deliver","media_search","content_create","help_describe","library_manage","unsplash_search"]},{"name":"trends_manage","listed":true,"area":"insights","docs":"https://docs.trycontinuum.ai/mcp/tools/insights#trends_manage","summary":"Your brand's trends report.","mutates":false,"role":"viewer","integration":null,"brandScoped":true,"confirmation":"none","completion":"background_refresh","retry":"natural_read","roleNote":"Viewer or higher. Operator or higher to force a fresh report with `force_regenerate`.","rateLimit":null,"inputs":{"force_regenerate":{"type":"boolean"},"generationId":{"type":"string"},"windowsDays":{"type":"array"}},"required":[],"schema":"https://docs.trycontinuum.ai/mcp/schemas/trends_manage.json","examples":[{"title":"Read the brand's trends report","arguments":{}}],"errors":[{"code":"NOT_FOUND","kind":"error","when":"The item doesn't exist, or this brand can't see it."},{"code":"UPSTREAM_ERROR","kind":"error","when":"A platform or provider returned an error. `details` carries its message."},{"code":"needs_brand","kind":"status","when":"No brand is active. Call `brands_select`."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."}],"related":["intel_trend_discovery","creative_strategy"]},{"name":"unsplash_search","listed":true,"area":"library","docs":"https://docs.trycontinuum.ai/mcp/tools/library#unsplash_search","summary":"Searches Unsplash stock photos to use as references.","mutates":false,"role":"viewer","integration":null,"brandScoped":true,"confirmation":"none","completion":"sync","retry":"natural_read","roleNote":"Viewer or higher","rateLimit":{"scope":"brand","budget":60,"windowSeconds":3600},"inputs":{"query":{"type":"string","description":"What to look for, in plain words."},"orientation":{"type":"string","values":["landscape","portrait","squarish"]},"page":{"type":"integer"}},"required":["query"],"schema":"https://docs.trycontinuum.ai/mcp/schemas/unsplash_search.json","examples":[{"title":"Find stock photos for a canvas reference","arguments":{"query":"gym interior"}},{"title":"Vertical photos for a story or reel reference","arguments":{"query":"runner at sunrise","orientation":"portrait"}}],"errors":[{"code":"RATE_LIMITED","kind":"error","when":"Unsplash's shared hourly quota or this brand's 60/hour budget is spent — retry later."},{"code":"configured=false","kind":"status","when":"The deployment has no Unsplash key; this is not an empty search."},{"code":"BRAND_NOT_SELECTED","kind":"error","when":"No brand is active. Call `brands_select`."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."}],"notes":["Photos are references, not Library assets: attach one to a canvas with `studio_workflow`, or pass it to `content_create` as `unsplash_photos`.","Credit the photographer and Unsplash whenever you show a photo."],"related":["studio_workflow","content_create","media_search","integrations_list"]},{"name":"video_editor","listed":true,"area":"library","docs":"https://docs.trycontinuum.ai/mcp/tools/library#video_editor","summary":"Edits video in Video Studio: cut silences, cut to the beat, captions, text, music, formats, export, and undo.","mutates":true,"role":"viewer","integration":null,"brandScoped":true,"confirmation":"none","completion":"sync_then_async","retry":"none","roleNote":"Viewer or higher.","rateLimit":null,"inputs":{"action":{"type":"string","values":["list_workflows","save_workflow","list_projects","create_project","get_project","get_transcript","get_beats","get_frame","apply_commands","undo","cut_silence","cut_ranges","beat_cut","collage","set_captions","set_speed","edit_caption_cues","get_composed_frame","set_format","add_text","add_clip","animate_clip","get_motion","keyframe_clip","stagger_clips","retime_motion","add_hyperframes_clip","add_motion_graphic","get_hyperframes_clip_motion","edit_hyperframes_clip_motion","add_transition","apply_effect","draft_cut","draft_cut_status","list_variants","export","export_status","get_pool","generate","generate_status"],"description":"The editor operation. Pass that operation’s own fields alongside it."},"projectId":{"type":"string"},"name":{"type":"string","description":"A display name."},"prompt":{"type":"string","description":"Instructions in plain words."},"limit":{"type":"integer","description":"The most items to return."},"assetIds":{"type":"array"},"title":{"type":"string","description":"A display title."},"preset":{"type":"string"},"full":{"type":"boolean","description":"Return the full content instead of a summary."},"clipId":{"type":"string"},"force":{"type":"boolean"},"timeSec":{"type":"number"},"maxWidth":{"type":"integer"},"expectedRevision":{"type":"integer","description":"The revision number from your last read. The write is refused if it changed since."},"commands":{"type":"array"},"toRevision":{"type":"integer","description":"The revision to go back to."},"minSilenceSec":{"type":"number"},"paddingSec":{"type":"number"},"thresholdDb":{"type":"number"},"ranges":{"type":"array"},"ripple":{"type":"boolean"},"mode":{"type":"string","values":["cut_on_beat","switch_shots","jump_cuts"],"description":"How the call runs. For writes, `preview` returns a token and `confirm` applies it. See the allowed values."},"everyNBeats":{"type":"number","description":"Beats per shot: 0.5 = every half beat, 0.25 = every quarter beat, 1 = every beat. For quick splices or doka doka doka use 0.5."},"clipIds":{"type":"array"},"audioClipId":{"type":"string"},"range":{"type":"object"},"layout":{"type":"string","values":["stack","side_by_side","grid"]},"atSec":{"type":"number"},"durationSec":{"type":"number"},"style":{"type":"string|object"},"highlight":{"type":"string","values":["none","word","karaoke"]},"maxWordsPerLine":{"type":"integer"},"position":{"type":"string","values":["bottom","middle","top"]},"highlightColor":{"type":"string"},"rate":{"type":"number"},"cues":{"type":"array"},"fit":{"type":"string","values":["cover","contain"]},"kind":{"type":"string","description":"The type to filter by. See the allowed values."},"template":{"type":"string","values":["hook_title","lower_third","kinetic_words","cta_end_card","listicle_number","quote","stat_callout","subtitle_bar"]},"text":{"type":"string","description":"Plain text content."},"secondaryText":{"type":"string"},"startSec":{"type":"number"},"animationIn":{"type":"string","values":["none","fade","pop","scale-in","float-in","slide-up","slide-down","slide-left","slide-right","typewriter","word-pop","bounce","blur-in","zoom-out","wipe"]},"animationOut":{"type":"string","values":["none","fade","pop","scale-in","float-in","slide-up","slide-down","slide-left","slide-right","typewriter","word-pop","bounce","blur-in","zoom-out","wipe"]},"assetId":{"type":"string","description":"A Library asset ID an earlier call returned."},"versionId":{"type":"string","description":"A Library asset version ID, returned with the asset."},"trackId":{"type":"string"},"newTrack":{"type":"boolean"},"sourceInSec":{"type":"number"},"property":{"type":"string","values":["transform.position","transform.scaleX","transform.scaleY","transform.rotationDeg","transform.rotateXDeg","transform.rotateYDeg","transform.opacity","audio.volume","audio.pan","effect.parameter","text.tracking","text.fontSize"]},"parameterName":{"type":"string"},"effectInstanceId":{"type":"string","description":"effect.parameter only: which of the clip effects; default the first with it"},"keys":{"type":"array"},"replace":{"type":"boolean","description":"Replace what is there instead of adding to it."},"eachSec":{"type":"number"},"from":{"type":"string","values":["start","end","center"]},"shiftSec":{"type":"number"},"ease":{"type":"string","values":["hold","spring","linear","easeIn","easeOut","easeInOut","easeInBack","easeOutBack","easeInOutBack","gentle","quick","bouncy","slow"]},"bezier":{"type":"array","description":"A custom ease as [x1, y1, x2, y2] (x1, x2 in 0..1), instead of ease"},"revisionId":{"type":"string","description":"A revision ID an earlier call returned."},"recipe":{"type":"string","values":["glass_graph","particle_push","dot_matrix","word_lock","screen_push","over_shoulder"],"description":"glass_graph: a liquid glass card that refracts the footage under it while a line graph climbs to a figure (label, value, unit, points). particle_push: particle…"},"color":{"type":"string"},"label":{"type":"string","description":"glass_graph: the metric, 1–3 words (\"Retention\")"},"value":{"type":"number","description":"glass_graph: the figure the graph climbs to"},"unit":{"type":"string","description":"glass_graph: \"%\", \"$\", \"k\", \"x\" or empty"},"points":{"type":"array","description":"glass_graph: the line, 2–12 values in order; omit for a steady climb"},"steps":{"type":"array","description":"particle_push: 1–3 step labels of one or two words"},"words":{"type":"array","description":"dot_matrix: 1–6 words, shown one after another"},"keyword":{"type":"string","description":"word_lock: the one word locked in the centre"},"lines":{"type":"array","description":"word_lock: 3–10 sentences, each containing the keyword"},"cards":{"type":"array","description":"over_shoulder: the start card (over the left shoulder) then the end card, each { label, big, small } — \"BEFORE\" | \"$3,200\" | \"per month\""},"lightSpeed":{"type":"boolean","description":"over_shoulder: the start card's big text flies into the end card at light speed"},"faceX":{"type":"number","description":"over_shoulder: the middle of the face across the frame, 0–1, read from get_frame"},"faceWidth":{"type":"number","description":"over_shoulder: the head's width ear to ear as a share of the frame width"},"eyeY":{"type":"number","description":"over_shoulder: the eyes' height in the frame, 0 = top"},"opsJson":{"type":"string","description":"A JSON array of 1 to 50 HyperFrames motion ops in composition seconds: add_animation, stagger, retime, ease, set_keyframes, upsert_keyframe, remove_keyframes, …"},"fromClipId":{"type":"string"},"toClipId":{"type":"string"},"all":{"type":"boolean"},"type":{"type":"string","values":["cut","crossfade","dip_to_black","dip_to_white","wipe","slide","zoom","blur"],"description":"The type of post or item. See the allowed values."},"effect":{"type":"string","values":["bw","vintage","vivid","cool","warm","noir","dream","blur","tint","vignette","film_grain","dust","light_leaks","chromatic_aberration","vhs","pixelate","corner_radius","chroma_key"]},"strength":{"type":"number"},"remove":{"type":"boolean"},"brief":{"type":"string","description":"A short brief, in plain words, that steers what gets made."},"targetDurationSec":{"type":"number"},"variants":{"type":"integer"},"captions":{"type":"boolean"},"sourceAssetIds":{"type":"array","description":"Omit to use enabled timeline videos. An explicit list is exclusive: selected timeline videos keep their pinned versions; new Library videos use their head vers…"},"music":{"type":"boolean"},"musicPrompt":{"type":"string"},"hookTitle":{"type":"boolean"},"broll":{"type":"boolean"},"brandCaptions":{"type":"boolean"},"jobId":{"type":"string","description":"A job ID an earlier call returned."},"captionMode":{"type":"string","values":["burn_in","none"]},"quickStart":{"type":"string","values":["create_image","restyle_image","edit_image","storyboard_to_video","keyframes_to_video","rotate_360","music_bed","voiceover","headless_concept"]},"refs":{"type":"array"},"place":{"type":"object"},"voice":{"type":"string"},"concept":{"type":"string","values":["offer-direct","problem-solution","street-interview","street-price-guess","reply-to-comment","car-storytime","expectation-vs-reality","pov","unpopular-opinion","busy-day-routine","tour","lookbook"]},"duck":{"type":"boolean"}},"required":["action"],"schema":"https://docs.trycontinuum.ai/mcp/schemas/video_editor.json","examples":[{"title":"List Video Studio projects","arguments":{"action":"list_projects"}},{"title":"Cut silences from a project","arguments":{"action":"cut_silence","projectId":"b7d3f9a1-4c6e-4a2b-8d5f-6e9c1b3a7d40","minSilenceSec":0.6}}],"errors":[{"code":"CONFLICT","kind":"error","when":"The item changed or is busy. Read it again, then retry with the current state."},{"code":"VALIDATION_ERROR","kind":"error","when":"An input is missing or wrong, or it changed since the preview. `details` names the field."},{"code":"needs_brand","kind":"status","when":"No brand is active. Call `brands_select`."}],"notes":["Every timeline edit names the project's current `revision` and returns the new one. `undo` restores the previous revision.","`export` starts a render job that saves an MP4 to the Library. Poll `export_status` for its link."],"related":["media_upload_and_clip"]}]}
