For the complete documentation index, see llms.txt. This page is also available as markdown.
Agent workflows
Step-by-step tool sequences an AI agent can follow in Convia, from drafting an on-brand post to building a campaign, revising drafts and taking posts back.
On this page
These recipes show how an AI agent connected to Convia Pro through MCP should combine tools to get a task right the first time. Each step names the tool, the arguments that matter, and why it comes in that order. Every recipe follows the instructions the Convia MCP server sends on connection: read before you write, write drafts only, revise rather than duplicate, and ask the user when something is ambiguous.
For every parameter and return field, see the MCP tool reference.
Rules every recipe follows
- Read context first. Copy written without
get_brand_contextwill not match the workspace's voice. - Verify before stating. A figure, quote or claim that
search_contentcannot find in a transcript is unverified. Do not write it as fact, and never quote clip titles or descriptions as speech. - Use ids from results. Never invent a post, clip, idea or account id.
- Prefer bare dates. Pass
scheduled_dateasYYYY-MM-DDso Convia applies the workspace's own posting time. - Drafts only. Nothing you write is published. A dated draft sits on the calendar until a person schedules it, and a campaign stays a draft until a person activates it.
- Ask when unsure. A wrong draft costs the user more to find and fix than a question costs to ask.
Draft a post in the brand's voice
Use this recipe for one post on one platform.
get_brand_contextwith no arguments. This returns the voice, audience and content rules. Ifhas_brand_contextisfalse, tell the user their Brand Brain is not set up and ask whether to continue.get_prompt_templatewith{"surface": "platform", "platform": "linkedin"}(or the target platform). This shows how the workspace frames copy for that platform. Iftemplateisnull, Convia's default applies.get_text_snippets. If the post needs a standard line, such as a call to action or outro, use the snippet text exactly as stored.search_contentwith{"query": "<distinctive words>", "types": ["transcript"]}for every figure or quote you plan to use. Use the literal words, not a paraphrase. Read the surrounding passage withget_transcript(episode_id, plusstart_secondsnear the hit). Ifspeaker_nameisnull, do not name the speaker.list_episode_guestswith{"episode_ids": ["<episode id>"]}, to spell the guest's name, job title and company correctly.list_social_platformsto get thesocial_account_idfor the target account.get_schedule_settings, thenlist_scheduled_postsfor the weeks you are considering (start_dateandend_dateare ISO 8601 with an offset, such as2026-10-19T00:00:00Z), so the new post does not land on a busy day.- Write the copy yourself.
create_post:
{
"content": "<your copy>",
"social_account_id": "<id from list_social_platforms>",
"scheduled_date": "2026-10-20",
"source_idea_id": "<idea id, if the post came from an idea>",
"tags": ["pricing", "founder-led sales"]
}
- Report back the
url, the resolvedscheduled_dateand anywarnings, and remind the user the post is a draft they still need to schedule.
Put one clip out on a given day
Use this when the user wants a clip posted without building a campaign.
list_clipswith{"platform": "linkedin", "max_times_used": 0, "sort": "least_used"}to find clips never posted to that platform. Addepisode_idto stay within one episode, ornot_used_sinceto resurface older material.get_transcriptwith the clip'sepisode_idandclip_idto read what is said in it. Checkoffset_basisbefore citing a timestamp.get_brand_context, then write the caption.get_schedule_settingsandlist_scheduled_poststo pick the day.create_postwithsource_clip_id,social_account_idand a barescheduled_date. Supplysource_clip_idonly when you are confident the clip matches: an unknown id is an error, not a text-only post.- Read
source_clip.times_usedin the response to confirm the clip is now counted as used.
Turn an episode into a campaign
Use create_campaign_from_plan for a coordinated set of posts around one argument. Do not call create_post repeatedly to build a campaign. This tool needs Magic Campaign on the workspace's plan; see Magic Campaign.
list_episodesto find the episode. Checkhas_transcriptandclip_count, notstatus.get_derivedwith{"episode_id": "<id>"}. If posts or a campaign already exist for this episode, show the user and ask before adding another.get_brand_context.get_transcriptfor the episode. For a long episode, page withnext_start_seconds. Identify the one argument the campaign will make and the quotes that support it.list_episode_guestswith the episode's id inepisode_ids, to name the guest correctly.list_clipswith{"episode_id": "<id>", "sort": "least_used"}to find clips for clip-backed posts.get_schedule_settingsandlist_scheduled_postsfor the campaign window.- Write the spine (
through_lineandauthority_objective) and every post. Keep to one idea per campaign: for a month covering several arguments, make one call per argument with dates that do not overlap. create_campaign_from_planwithparent_webcast_id, bare dates inside a window of 90 days or less, and at most 40 posts on at most 8 platforms. For a post that needs an asset you cannot supply, leavecontentas""if you have no copy, setneeded_assetto describe it, and addasset_instructionswith the full brief.- Read the response. Tell the user how many posts were created, list each entry in
gaps(those posts are flagged with your brief), and pass on every warning, such as a platform with no connected account. Remind them to review the campaign and activate it in Campaigns.
A source_clip_id that does not match a clip is discarded and that post is held as a gap, with a warning. That is the safe outcome, not an error.
Revise a draft instead of duplicating it
When the user asks to change something that already exists, find it and update it.
- Find the post. Use
list_postswithbody_containsfor a phrase in the caption, orparent_webcast_idfor an episode's posts, andstatussuch as["draft", "pending_approval", "scheduled"].get_derivedalso lists posts made from an episode, clip or idea. get_postto read the full body.update_postreplaces the whole body, so start from what is there.update_postwithpost_idand only the fields that change.- Read the response:
approval_reset: truemeans the post was waiting for approval and is back in draft, so the edit is reviewed. Tell the user.post_immutablemeans the post is published or approved. Tell the user to change it in the app.- A scheduled post stays scheduled after an edit. If the user wanted it off the calendar, use
unschedule_posts.
Ideas and scripts work the same way: list_ideas then get_idea then update_idea, or list_scripts then get_script then update_script. An idea is never deleted: set its status to archived.
Take posts back
Pick the tool by what the user means. Editing the text is not a way to stop a post.
| The user means | Tool |
|---|---|
| "Stop this going out, I'll decide later" | unschedule_posts: back to draft, scheduled date cleared |
| "We're not doing this, but keep a record" | archive_posts: archived, scheduled date cleared |
| "This should never have been made" | delete_posts: moved to Trash, restorable by a person. Unschedule first if it is scheduled |
| "Fix a typo" | update_post: the post stays scheduled |
- Find the posts with
list_posts(for examplestatus: ["scheduled"]withbody_containsorparent_webcast_id) orlist_scheduled_postsfor a date window. - Show the user the list and confirm before changing anything.
- Call the tool with up to 25
post_idsand a shortreason, such as "wrong guest named in the caption". The reason goes to the workspace's MCP audit log. For more than 25 posts, split into several calls. - To delete scheduled posts, call
unschedule_postsfirst, thendelete_postswith the same ids. - Read
updated,unchangedandrefused.unchangedmeans the post was already in that state. For each refused post, pass on the reason: a published post must be taken down on the platform itself, and an approved post must be handled in the app.
unschedule_posts returns each post's previous_scheduled_date, so you can restore the date later with update_post. The post then stays a draft on the calendar until a person schedules it.
Choose what to make next from analytics
These tools need Advanced Analytics on the plan. A null metric means not collected yet, never zero.
list_postswith{"status": ["published"]}, optionally filtered byplatform.get_post_analyticsfor the posts you want to compare. Look atperformance.pacefor posts banded above the account's usual, andanalytics.engagement_rate.get_web_analyticswith{"group_by": "post"}(or"campaign") to see which posts sent people to the workspace's own website.get_search_querieswith{"position_min": 8, "position_max": 20, "sort": "impressions"}for searches where the site is close to page one, or{"branded": "only"}to track how often people search for the brand by name.search_contenton the winning topics to find source material, andlist_clipswithnot_used_sinceto find clips worth resurfacing.list_ideaswithqueryto check the backlog for the same idea, thencreate_ideawith the evidence innotes: the numbers, the source episode and the angle.
See Analytics and Website analytics for what each figure means.
Grow the idea backlog
list_ideaswithqueryfor the topic, andget_ideaon close matches. The user may already have had the thought.create_ideafor genuinely new ideas. Put the angle, the audience, the raw material (episode, timestamp, clip) and any overlap with existing ideas innotes, so a later session can act on it without redoing the thinking.- When an idea has been used or dropped,
update_ideawith{"status": "archived"}.
See Ideas & scripts.
Manage prompt templates
An agent can read every prompt template and stage a new version, but it cannot change what Convia generates with. A person makes a staged version live.
list_prompt_templatesto see what exists.resolves_as: "default"marks the live template for each content type.get_prompt_templatewithtemplate_id, or with{"surface": "content", "content_type": "article"}for the live one. Notevariables_used: keep every{placeholder}in your revision.get_brand_context, so the template does not repeat rules Convia already supplies. Some generators add less brand context than others, so keep essential voice guidance in the template.upsert_prompt_templatewithcontent_type, a clearnameand the fullprompt_template. Addtemplate_idonly to revise an alternative you staged earlier; the live default cannot be edited.- Tell the user the version is saved but not live, and that a manager can make it the default in Brand Brain → AI Prompts.
Per-platform social prompts are read-only through MCP. If one needs changing, give the user the proposed text to paste into Brand Brain → Social Platform Prompts. See How AI uses your brand.
Related
- MCP tool reference: exact parameters, limits and errors for every tool.
- Connect an AI assistant (MCP): set up the connection these recipes use.
- MCP access, permissions & audit: what an agent is allowed to do, and the Activity log.
- Campaigns: what happens to a draft campaign after the agent hands it over.