For the complete documentation index, see llms.txt. This page is also available as markdown.
MCP tool reference
Every tool the Convia MCP server exposes, with exact parameters, limits, return shapes, side effects, errors and the instructions it sends clients.
On this page
- Protocol and conventions
- Paging
- Server instructions
- Errors
- Plan-gated tools
- Read: workspace context
- get_brand_context
- list_social_platforms
- get_schedule_settings
- get_text_snippets
- list_content_conversations
- Read: episodes, clips and transcripts
- list_episodes
- list_episode_guests
- list_clips
- get_transcript
- search_content
- get_derived
- Read: posts, ideas, scripts and campaigns
- list_posts
- get_post
- list_scheduled_posts
- list_ideas
- get_idea
- list_scripts
- get_script
- list_campaigns
- get_campaign_plan
- Create
- create_post
- create_campaign_from_plan
- create_idea
- create_script
- create_episode
- Update
- update_post
- update_idea
- update_script
- update_campaign_plan
- Lifecycle: take posts back
- unschedule_posts
- archive_posts
- delete_posts
- Prompts and templates
- list_prompt_templates
- get_prompt_template
- upsert_prompt_template
- Analytics
- get_post_analytics
- get_web_analytics
- get_search_queries
- Related
The Convia Pro MCP server exposes 38 tools that read and write one workspace's content. Each entry gives exact parameters, limits, returns and side effects. To connect first, see Connect an AI assistant (MCP).
Protocol and conventions
The Convia MCP server speaks Streamable HTTP, statelessly: each request is an HTTP POST of a JSON-RPC 2.0 message to your MCP URL, and each response is application/json. There is no session id and no event stream.
| Item | Value |
|---|---|
| Methods | initialize, ping, tools/list, tools/call. Notifications get 202 with an empty body |
| Capabilities | tools only |
| Server info | name: convia-mcp, version: 1.0.0 |
| Protocol versions | 2025-11-25, 2025-06-18, 2025-03-26, 2024-11-05. initialize echoes yours if supported, otherwise answers 2025-11-25 |
MCP-Protocol-Version header |
Optional. Any other value returns HTTP 400 unsupported_protocol_version |
| Batching | A JSON array of messages is answered with an array |
| Rate limit | 60 requests per minute per credential (per IP with no credential). Over it: HTTP 429, Retry-After: 60, {"error":"rate_limited"} |
A successful tools/call returns one text item holding the result as JSON. Rules for every tool:
- One workspace. Every call acts on the workspace in the URL. An id from another workspace is treated as unknown.
- Nothing publishes. No tool publishes, schedules a post to go out, approves, or queues for approval. New posts are drafts.
- Ids are UUIDs from earlier tool results. Never invent one.
- Post dates.
scheduled_datetakes a bareYYYY-MM-DD(preferred), which resolves to the workspace's default posting time for that platform and weekday, or ISO 8601 with an explicit offset such as2026-11-03T14:30:00Z. No offset is rejected. A time more than 15 minutes past is refused. - Trashed posts, episodes and clips are left out of lists and searches.
- No AI credits. MCP runs no AI generation inside Convia and spends no AI credits.
Paging
list_posts, list_clips, list_ideas and list_scripts return total_count, returned, offset, limit, has_more and next_offset. Pass next_offset as offset until has_more is false. Maximum offset: 10,000. list_episodes, list_scheduled_posts and list_campaigns take only limit and return count (total matching) and returned.
Server instructions
The initialize result returns these instructions under instructions. They apply to every tool.
Convia is the durable memory for this workspace's content. Read from it before authoring
anything, and write finished work back to it, so that work survives the session it was made in.
The standard order for authoring is: get_brand_context for voice and audience,
get_prompt_template for the format, get_text_snippets for the workspace's own standard blocks,
search_content on type transcript to verify any claim, then list_scheduled_posts and
get_schedule_settings before choosing a date. Author the copy yourself, then write it back with
create_post or create_campaign_from_plan.
Nothing written through this server is published. Posts are created as drafts, and a draft on
the calendar still needs a human to schedule it.
Anything you can create here you can also read back and revise: list_ideas and get_idea for the
backlog, get_post for a post's body, get_script for a script's, and the matching update_ tools
to change them. Prefer revising what exists to creating a near-duplicate beside it.
To take something back, use the verb for what you mean rather than editing around it.
unschedule_posts takes posts off the calendar and returns them to draft; archive_posts puts
them aside; delete_posts moves them to the trash, where a person can still restore them. Note
that update_post does NOT unschedule: editing a scheduled post deliberately leaves it
scheduled, so that fixing a typo never silently pulls a post from the calendar. Each of these
takes up to 25 posts and a short reason, and reports per post what it did and what it refused.
When something is ambiguous, ask the user before writing. A wrong draft in the workspace costs
more to find and fix than a question costs to ask.
Errors
A failed tool call returns a JSON-RPC result with isError: true and text {"error": "<code>", "message": "<explanation>"}.
| Code | Meaning |
|---|---|
validation_error |
Missing, malformed or out-of-range argument, or a broken rule (past date, outside a campaign window, unknown platform option) |
not_found |
No such id in this workspace |
unknown_platform |
Platform not accepted by this tool |
feature_disabled |
The plan lacks the capability this tool needs |
post_immutable |
update_post on a published or approved post |
platform_account_mismatch |
platform and social_account_id disagree |
ambiguous_campaign |
A campaign name matched several campaigns; candidates are listed |
default_template_immutable, platform_prompts_immutable, retired_content_type |
Disallowed template writes. See Prompts and templates |
db_error, internal_error |
Convia could not complete the request. Retry later |
JSON-RPC errors: -32700 parse error, -32600 invalid request, -32601 method not found, -32602 unknown tool. Connection errors (HTTP 400, 401, 403, 405, 429) come before any tool runs; see MCP access, permissions & audit.
Plan-gated tools
Every tool needs MCP Connections on the workspace's plan. Six also need a second capability, checked per call, or they return feature_disabled.
| Tool | Also requires |
|---|---|
get_post_analytics, get_web_analytics, get_search_queries |
Advanced Analytics |
create_campaign_from_plan, get_campaign_plan, update_campaign_plan |
Magic Campaign |
See Plans & billing for what each plan includes.
Read: workspace context
get_brand_context
Returns the workspace's Brand Brain: voice, point of view, topic space, goals, ideal customer profile, content rules and the host's voice profile. Read it before writing copy or revising a template.
| Parameter | Type | Required | Description |
|---|---|---|---|
speaking_host_id |
string | No | Write in a specific host's voice. Omit for the workspace's default host. An id that does not match a host returns not_found |
Returns has_brand_context, brand_context (the prose block Convia's own generators use), structured fields (persona_type, brand, host, workspace), and a note if nothing is set up.
list_social_platforms
Lists the connected social accounts. Call it to get a social_account_id for create_post.
| Parameter | Type | Required | Description |
|---|---|---|---|
include_inactive |
boolean | No | Include inactive accounts. Default false |
Returns platforms (up to 100: id, platform, display_name, profile_image_url, account_type, needs_reauth, is_active) and count.
get_schedule_settings
Returns how the workspace publishes, so dates match its real schedule. Call it before choosing any date.
| Parameter | Type | Required | Description |
|---|---|---|---|
platform |
string | No | Limit defaults to one publishable platform, such as linkedin |
Returns timezone, day_window (start, end), platform_defaults (platform, day_of_week, day_name, time_of_day as HH:MM), unconfigured (connected platforms with no default), connected_platforms and fallback_note. With no default, a time falls back to the platform's best-practice hours, then the start of the posting window, which is advisory.
get_text_snippets
Returns the workspace's reusable text blocks, such as a standard outro. Reproduce them exactly.
| Parameter | Type | Required | Description |
|---|---|---|---|
name |
string | No | Return only the snippet with this exact name, case-insensitive. Omit to list all |
Returns snippets (up to 200: id, name, content), count, and a note when there are none.
list_content_conversations
Lists AI co-editing conversations with their messages, for finding recurring themes.
| Parameter | Type | Required | Description |
|---|---|---|---|
content_type |
string | No | script, article or post |
limit |
number | No | 1 to 100, default 20 |
messages_per_conversation |
number | No | 0 to 200, default 50, most recent kept |
Returns conversations (id, content_id, content_type, dates, messages with role and content, truncated) and count.
Read: episodes, clips and transcripts
list_episodes
Lists episodes, most recently published first, with what exists for each. Do not use status to judge whether an episode is real: read has_transcript, has_media and clip_count.
| Parameter | Type | Required | Description |
|---|---|---|---|
status |
string | No | Filter by status, for example draft or published |
limit |
number | No | 1 to 200, default 50 |
Returns episodes (title fields, guest_names, episode_number, season_number, status, description, dates, duration_seconds, has_media, has_transcript, is_diarized, transcript_word_count, speaker_mapping_confirmed, clip_count), count and returned. No transcript text.
list_episode_guests
Returns who appeared on which episode, with job title and company. Use it to check that a post names the right person.
| Parameter | Type | Required | Description |
|---|---|---|---|
episode_ids |
string[] | No | Up to 50 episode ids. Omit for the 25 most recent episodes |
Returns episodes (episode_id, title, episode_number, published_date, guests with id, name, title, company, and legacy_guest_name) and returned. Guests who asked for their data to be removed are never returned; no confirmed guest means an empty list.
list_clips
Lists clips with their episode and how often each was used. Keyword and metadata matching, not semantic.
| Parameter | Type | Required | Description |
|---|---|---|---|
episode_id |
string | No | Only this episode's clips |
query |
string | No | Case-insensitive match on title, description and tags |
limit |
number | No | 1 to 100, default 50 |
offset |
number | No | Rows to skip. Default 0 |
max_times_used |
number | No | Only clips used at most this many times. 0 means never used |
not_used_since |
string | No | YYYY-MM-DD. No post since that date (never-used clips included) |
sort |
string | No | newest (default) or least_used |
platform |
string | No | Measure use on one platform, such as linkedin; usage filters and sort follow it |
Returns clips (id, title, description, tags, duration_seconds, episode_id, episode_name, has_transcript, text_provenance, times_used, last_used_at, start_seconds, end_seconds, plus utilization_platform, times_used_on_platform and last_used_on_platform_at with platform) and the paging envelope, with warnings if a very large workspace hits a cap. text_provenance (generated, imported, unknown) marks clip text as a summary, never speech.
get_transcript
Returns what was said in an episode, with speakers and timestamps. Read it before quoting anyone.
| Parameter | Type | Required | Description |
|---|---|---|---|
episode_id |
string | Yes | Episode id from list_episodes |
clip_id |
string | No | Limit to one clip's span. The clip must belong to the episode |
start_seconds, end_seconds |
number | No | Window, episode-relative |
speaker |
string | No | One speaker, by resolved name or raw label such as Speaker 2 |
max_segments |
number | No | 1 to 1,500, default 400 |
Returns episode_id, episode_title, duration_seconds, offset_basis (episode or clip), source (asr, pasted, or null with no transcript), diarized, speaker_mapping_confirmed, speakers, segments (speaker_label, speaker_name, start_seconds, end_seconds, text), count, returned, truncated, next_start_seconds and note. To continue, pass next_start_seconds as start_seconds. A null speaker_name means the voice is unconfirmed: do not name that speaker. With offset_basis: clip, offsets count from the start of the clip.
search_content
Keyword search across episodes, clips, posts and transcripts. Search transcript to verify a claim before writing it as fact.
| Parameter | Type | Required | Description |
|---|---|---|---|
query |
string | Yes | Literal words to find. Not semantic |
types |
string[] | No | Any of episode, clip, post, transcript. Default all four |
episode_id |
string | No | Limit transcript and clip hits to one episode |
limit |
number | No | 1 to 100 per type, default 30 |
Returns episodes, clips and posts (each with match_context), transcript_segments (episode_id, episode_title, speaker_label, speaker_name, start_seconds, text, match_context), transcript_episodes_scanned, transcript_scan_capped and note. Transcript search opens at most 25 episodes per call; transcript_scan_capped: true means more may match. An empty result means these exact words were not found, not that nothing similar was said.
get_derived
Shows what was already made from an episode, clip or idea, so you do not rebuild it.
| Parameter | Type | Required | Description |
|---|---|---|---|
episode_id, clip_id, idea_id |
string | Exactly one | The source |
limit |
number | No | 1 to 100 per list, default 50 |
Returns source, clips, posts (id, title, platform, status, scheduled_date, published_url, campaign_id, campaign_name), campaigns and counts. For an idea it also returns scripts, clips is always empty and posts omit campaign_name.
Read: posts, ideas, scripts and campaigns
list_posts
Finds posts, newest first. Metadata only: use get_post for the body.
| Parameter | Type | Required | Description |
|---|---|---|---|
body_contains |
string | No | Case-insensitive text in the body, title or description, max 120. Matches include an excerpt |
parent_webcast_id |
string | No | Only posts derived from this episode |
platform |
string[] | No | One or more of youtube, linkedin, linkedin_pro, twitter, instagram, instagram_facebook, tiktok, facebook, blog, newsletter, web, bluesky, threads, other |
status |
string[] | No | One or more of draft, pending_approval, approved, in_review, scheduled, published, archived, failed, processing |
created_after, created_before |
string | No | ISO datetime |
scheduled_after, scheduled_before |
string | No | ISO datetime |
limit |
number | No | 1 to 200, default 50 |
offset |
number | No | Rows to skip. Default 0 |
Returns posts (id, title, platform, post_type, status, dates, parent_webcast_id, campaign_id, and excerpt when searching), count (page length) and the paging envelope. A few legacy imported posts do not match body_contains.
get_post
Reads one post in full.
| Parameter | Type | Required | Description |
|---|---|---|---|
post_id |
string | Yes | Post id |
Returns id, title (internal label), published_title (null means title is published), content, subtitle, seo_title, meta_description, platform, post_type, article_type, status, dates, published_url, social_account_id, parent_webcast_id, video_clip_id, campaign_id, media_ids, tags, meta_keywords and url.
list_scheduled_posts
Lists posts on the calendar in a date window, any status, earliest first. Check it before picking dates.
| Parameter | Type | Required | Description |
|---|---|---|---|
start_date |
string | Yes | ISO 8601 with an explicit offset. Inclusive |
end_date |
string | Yes | ISO 8601 with an explicit offset. Inclusive |
platform |
string | No | One publishable platform (same list as get_schedule_settings) |
limit |
number | No | 1 to 200, default 100 |
Returns posts (id, title, platform, status, scheduled_date, campaign_id), count, returned and known_statuses.
list_ideas
Lists the idea backlog, newest first. Read it before proposing ideas.
| Parameter | Type | Required | Description |
|---|---|---|---|
status |
string | No | new, researching, ready, draft, in_progress, completed or archived |
tags |
string[] | No | Ideas carrying any of these tags |
query |
string | No | Case-insensitive match on title, description or notes |
limit |
number | No | 1 to 200, default 50 |
offset |
number | No | 0 to 10,000 |
Returns ideas (id, title, description, notes_preview (first 280 characters), notes_truncated, status, priority, tags, category, derived_count, dates) and the paging envelope.
get_idea
Reads one idea in full, with everything derived from it.
| Parameter | Type | Required | Description |
|---|---|---|---|
idea_id |
string | Yes | Idea id |
Returns the idea's fields including full notes and source_type, plus derived (each with type, id, title, status), derived_count, derived_by_type and url.
list_scripts
Lists scripts, newest first, with a char_count instead of the body.
| Parameter | Type | Required | Description |
|---|---|---|---|
status |
string | No | draft, in_review, approved, in_production, recorded, editing, published or archived |
script_type |
string | No | podcast, video, short or presentation |
source_idea_id, linked_webcast_id |
string | No | Only scripts from this idea, or linked to this episode |
query |
string | No | Case-insensitive match on title or description |
limit |
number | No | 1 to 200, default 50 |
offset |
number | No | 0 to 10,000 |
Returns scripts (metadata, char_count, word_count, estimated_duration_seconds, tags, dates) and the paging envelope.
get_script
Reads one script in full, including the body.
| Parameter | Type | Required | Description |
|---|---|---|---|
script_id |
string | Yes | Script id |
Returns the script's fields including content, notes, generated_from and url.
list_campaigns
Lists campaigns, newest first, with beat and gap counts. The full plan is not returned.
| Parameter | Type | Required | Description |
|---|---|---|---|
status |
string | No | draft, active, paused, stopped, completed or archived |
campaign_type |
string | No | idea, trend, seasonal, guest or promote_episode |
parent_webcast_id |
string | No | Only campaigns for this episode |
limit |
number | No | 1 to 100, default 25 |
Returns campaigns (id, name, description, campaign_type, status, dates, platforms, keywords, parent_webcast_id, has_plan, beat_count, gap_count, origin (mcp or in_product)), count and returned. Plans still being drafted in the campaign builder are not listed.
get_campaign_plan
Reads one campaign's narrative plan. Requires Magic Campaign.
| Parameter | Type | Required | Description |
|---|---|---|---|
campaign_id |
string | Yes | Campaign id |
Returns campaign_id, name, campaign_status, has_plan, plan (the spine and each platform's beats, each with a beat_uid, its move, format, schedule offset, fulfillment status, any gap, and whether it is pinned), beat_count, gap_count, pinned_count and post_count. A campaign without a narrative plan returns has_plan: false and a detail message.
Create
create_post
Creates one draft post. Read get_brand_context first and verify figures and quotes with search_content. For a coordinated set of posts, use create_campaign_from_plan.
| Parameter | Type | Required | Description |
|---|---|---|---|
content |
string | Yes | Post body. Max 50,000 characters |
social_account_id |
string | One of two | Connected account from list_social_platforms. Preferred; sets the platform |
platform |
string | One of two | twitter, linkedin, linkedin_pro, instagram, instagram_facebook, facebook, youtube, tiktok, threads or bluesky |
title |
string | No | Internal label shown only in Convia. Default Generated - plus the first 50 characters of content |
published_title |
string | No | Public video title on youtube and facebook only. If omitted, title is published |
post_type |
string | No | social (default), article, promotion, newsletter or short |
article_type |
string | No | long_form or newsletter |
scheduled_date |
string | No | Bare YYYY-MM-DD (preferred) or ISO 8601 with offset. Must not have passed |
platform_options |
object | No | Per-platform publish settings, below |
source_clip_id |
string | No | Clip from list_clips; links the post to the clip's episode. An unknown id is an error |
media_ids |
string[] | No | Media already in the workspace. Unknown ids are rejected. No uploads |
source_idea_id |
string | No | The idea this derives from. Records lineage for get_idea and get_derived |
subtitle |
string | No | Article standfirst, max 200. Stays on the draft; not sent to platforms |
seo_title, meta_description |
string | No | Article SEO fields, max 60 and 500 |
tags |
string[] | No | Internal tags, not hashtags. Junk and date tags are removed, near-duplicates merged |
platform_options accepts only these keys. Unknown keys and wrong types return validation_error naming the allowed keys.
| Platform | Keys you can set |
|---|---|
instagram, instagram_facebook |
media_format (reel or story), share_to_feed (boolean), trial_reel (boolean) |
youtube |
category_id (string), playlist_ids (string[]), tags (string[]), default_audio_language (string) |
| All other platforms | None |
TikTok privacy and branded-content settings, YouTube Made for Kids, privacy status and publish time, and Instagram collaborator and paid-partnership labels are set by a person in the composer, never through MCP.
Returns id, title, status (always draft), and when relevant tags, source_clip (id, episode_id, times_used), source_idea_id, scheduled_date, schedule_source (explicit for a time you supplied), warnings and url. Side effect: a draft. With a scheduled_date it sits on the calendar but does not publish until a person schedules it.
create_campaign_from_plan
Creates a multi-platform campaign, its narrative spine and every post, in one call. Requires Magic Campaign. One idea per campaign; read get_brand_context and list_scheduled_posts first.
| Parameter | Type | Required | Description |
|---|---|---|---|
name |
string | Yes | Campaign name, max 200 |
description |
string | No | The campaign's core argument, max 4,000 |
keywords |
string[] | No | Max 25. Use 3 to 8 durable topic terms |
start_date, end_date |
string | Yes | YYYY-MM-DD or ISO 8601 with offset. Window of 90 days or less, in workspace-local days |
parent_webcast_id |
string | No | Episode the campaign derives from |
spine |
object | Yes | through_line (the one argument, max 1,000) and authority_objective (what authority it earns, max 1,000). Both required |
posts |
object[] | Yes | 1 to 40 posts. Fields below |
Each item in posts:
| Field | Type | Required | Description |
|---|---|---|---|
platform |
string | Yes | One publishable platform (same list as create_post) |
content |
string | Yes | Post copy, max 50,000. Use "" for a beat held with needed_asset |
scheduled_date |
string | Yes | Bare date (preferred) or ISO 8601 with offset. Must fall inside the window and not have passed |
title, published_title |
string | No | Internal label and public title (YouTube, Facebook), max 500 each |
content_type |
string | No | teaser, clip, full (default), article or announcement |
move |
string | No | The narrative move this beat makes, max 500 |
source_clip_id |
string | No | Clip from list_clips. An unknown id is discarded and the beat is held as a gap |
needed_asset |
string | No | Describe an asset you cannot supply, max 500. The post is held as a flagged draft |
gap_type |
string | No | type-1 (Convia can generate it), type-2 (a different cut of an existing clip, default), type-3 (needs new recording) |
asset_instructions |
string | No | Full brief for the missing asset, max 4,000. Added as a comment on the post |
tags, hashtags |
string[] | No | Max 20 each |
Limits per call: 40 posts, 8 platforms, a 90-day window, 500,000 characters of content. A date outside the window is rejected with its index, never moved. Bare dates on the same platform and day get different times.
Returns campaign (id, name, status: draft, url), posts_created, scheduling (timezone, day_window, sources), gaps_held, gaps_flagged, gaps (beat_id, platform, needed_asset, gap_type) and warnings (such as a platform with no connected account).
Side effects: a draft campaign and dated draft posts on the calendar. Nothing schedules, publishes or enters the approval queue until a person activates the campaign. Held beats are flagged with their brief as a comment, with one notification. If the posts fail to save, the campaign is rolled back.
create_idea
Creates an idea. Put the reasoning (angle, audience, raw material, overlap) in notes, and check list_ideas for near-duplicates first.
| Parameter | Type | Required | Description |
|---|---|---|---|
title |
string | Yes | Idea title |
description, notes |
string | No | notes holds the reasoning a later session should read |
priority |
string | No | low, medium or high |
tags |
string[] | No | Normalized on write |
Returns id, title, status (new) and tags.
create_script
Creates a script, optionally linked to an idea or episode.
| Parameter | Type | Required | Description |
|---|---|---|---|
title |
string | Yes | Script title |
description |
string | No | Short description |
content |
string | No | Script body, max 200,000 characters |
script_type |
string | No | podcast, video, short or presentation |
source_idea_id, linked_webcast_id |
string | No | Idea to derive from; episode to link |
Returns id, title, word_count and url.
create_episode
Creates an episode record. Recording and media are added later in the app.
| Parameter | Type | Required | Description |
|---|---|---|---|
title |
string | Yes | Episode title |
webcast_name, description |
string | No | Internal show or episode name; description |
status |
string | No | draft (default), scheduled or published |
Returns id, youtube_title (your title) and status.
Update
update_post
Revises a post. Only the fields you supply change. Read the post with get_post first if you mean to edit rather than rewrite.
| Parameter | Type | Required | Description |
|---|---|---|---|
post_id |
string | Yes | Post id |
content |
string | No | Replaces the whole body. Max 50,000 |
title, published_title |
string | No | Internal label and public title, max 500 each. published_title: "" clears it so title is published |
subtitle, seo_title, meta_description |
string | No | Max 200, 60 and 500 |
article_type |
string | No | long_form or newsletter |
post_type |
string | No | social, article, promotion, newsletter or short |
scheduled_date |
string | No | Bare date or ISO 8601 with offset. Must not have passed. A bare date needs the post to have a platform |
platform |
string | No | Publishable platform. Cannot differ from the linked account's platform |
social_account_id |
string | No | Moves the post to this account; the platform follows |
platform_options |
object | No | Same keys as create_post. Merged into stored options: keys you omit are kept |
Rules: published and approved posts return post_immutable. A pending_approval post returns to draft (approval_reset: true) so the edit is reviewed. A scheduled post stays scheduled: update_post never unschedules. Titles are cleaned of markdown, quotes and labels such as Title:. At least one field must change. tags, media_ids and source_clip_id cannot be changed.
Returns id, title, status, platform, scheduled_date, approval_reset, updated_fields, and as relevant schedule_source, warnings, url.
update_idea
Revises an idea. Omitted fields are left alone; an explicit null clears a field. There is no delete: set status to archived.
| Parameter | Type | Required | Description |
|---|---|---|---|
idea_id |
string | Yes | Idea id |
title, description, notes |
string | No | New values |
priority |
string | No | low, medium or high |
status |
string | No | Any idea status listed under list_ideas |
tags |
string[] | No | Replaces the tags. Normalized on write |
Returns id, title, status, priority, tags and updated_fields.
update_script
Revises a script. Supplying content replaces the whole body.
| Parameter | Type | Required | Description |
|---|---|---|---|
script_id |
string | Yes | Script id |
title, description, notes |
string | No | New values |
content |
string | No | Replaces the body. Max 200,000 |
script_type |
string | No | podcast, video, short or presentation |
status |
string | No | Any script status listed under list_scripts |
linked_webcast_id |
string | No | Episode to link |
Returns id, title, status, word_count and updated_fields.
update_campaign_plan
Amends a campaign plan before any posts exist. Requires Magic Campaign. Generates no copy and publishes nothing.
| Parameter | Type | Required | Description |
|---|---|---|---|
campaign_id |
string | Yes | Campaign id |
beats |
object[] | No | Up to 50 beats, matched on beat_uid (required, from get_campaign_plan). Each may set move (max 500), format (max 80), schedule_offset_days and pinned |
remove_beat_uids |
string[] | No | Up to 50 beats to remove |
A campaign that has posts is refused, including every campaign made with create_campaign_from_plan: edit its posts instead. An edited beat is pinned (kept by a re-plan) unless you pass pinned: false. Returns campaign_id, beats_updated, beats_removed, beat_count, gap_count and pinned_count.
Lifecycle: take posts back
unschedule_posts, archive_posts and delete_posts share one contract. Each post is handled on its own, so one refusal does not block the rest.
| Parameter | Type | Required | Description |
|---|---|---|---|
post_ids |
string[] | Yes | 1 to 25 post ids. Duplicates are merged |
reason |
string | Yes | Why, max 500. The first 200 characters go to the MCP audit log, not the post |
Returns updated (id, title, status, deleted, previous_scheduled_date), unchanged and refused (each with id and reason; an unknown id is refused), and a count for each. A post already in the target state is unchanged, not a failure.
| Tool | Acts on posts that are | Result |
|---|---|---|
unschedule_posts |
draft, pending_approval, in_review, failed, scheduled |
Status draft, scheduled date cleared (returned as previous_scheduled_date) |
archive_posts |
draft, pending_approval, in_review, failed, scheduled |
Status archived, scheduled date cleared |
delete_posts |
draft, pending_approval, in_review, failed, archived |
Moved to Trash, where a person can restore it. Purged after 30 days |
All three refuse published posts (retract those on the platform), approved posts (a person signed off) and posts being published right now. delete_posts also refuses scheduled posts: call unschedule_posts first, then delete_posts. A post already in Trash is refused by the other two.
unschedule_posts
Takes posts off the calendar and back to draft, keeping the copy: "stop this going out, decide later". Uses the shared contract above.
archive_posts
Puts aside work that is real but not going ahead, keeping it on record. Uses the shared contract above.
delete_posts
Moves to Trash what should never have been created, such as a bad batch or a duplicate run. Uses the shared contract above.
Prompts and templates
Convia has two template surfaces. Content templates drive long-form generators (article, script, conversation_outline, webcast_description, chapter_markers, webcast_promotion) and can hold named alternatives, one of which is the live default; thumbnail_style holds saved thumbnail styles with no default. Platform templates are one prompt per social platform. Retired thumbnail types (thumbnail_background, thumbnail_text_overlay, thumbnail_photo_composition, thumbnail_refinement) return retired_content_type.
list_prompt_templates
Lists templates, metadata only.
| Parameter | Type | Required | Description |
|---|---|---|---|
surface |
string | No | content or platform. Omit for both |
content_type, platform |
string | No | Limit to one content type (such as article) or platform (such as linkedin) |
limit |
number | No | 1 to 200, default 100 |
Returns templates (id, surface, content_type or platform, post_type, name, is_default, resolves_as (default or available), char_count, updated_at, and has_best_practices for platform templates), count and note.
get_prompt_template
Returns one template's full text and the {placeholder} variables it uses.
| Parameter | Type | Required | Description |
|---|---|---|---|
template_id |
string | One of two | A template id from list_prompt_templates |
surface |
string | One of two | content or platform, to get the live template |
content_type or platform |
string | With surface |
Such as article or linkedin |
post_type |
string | No | Variant, such as host or guest for webcast_promotion |
Returns template (prompt_template, or system_prompt and best_practices for platform, plus variables_used) and would_fall_back_to: null when the workspace has its own, otherwise master (Convia's platform-wide template) or inline_default (the built-in default). A warning appears if two content templates are marked default.
upsert_prompt_template
Saves a content template as a non-default alternative. Generation is unchanged until a manager makes it the default in Brand Brain → AI Prompts.
| Parameter | Type | Required | Description |
|---|---|---|---|
content_type |
string | Yes | For example article or script |
name |
string | Yes | Short name shown in the template list |
prompt_template |
string | Yes | Full template text, max 50,000 characters |
post_type |
string | No | Variant, such as host or guest |
template_id |
string | No | Update an existing non-default template instead of creating one |
surface |
string | No | Only content is writable |
Returns id, surface, content_type, post_type, name, is_default: false, promoted: false, variables_used, url and message. Editing the live default returns default_template_immutable; writing a platform template returns platform_prompts_immutable (edit those in Brand Brain → Social Platform Prompts).
Analytics
get_post_analytics
Returns the latest analytics for one post. Requires Advanced Analytics.
| Parameter | Type | Required | Description |
|---|---|---|---|
post_id |
string | Yes | Post id |
Returns post_id, platform, analytics (metrics: all-time views, impressions, reach, reactions, comments, shares, saves, engagements, null if the platform does not report one; engagement_rate; window_28d for YouTube), performance (pace against the account's usual post of that platform and format at the same age: below, within or above; null until scored), reach (YouTube thumbnail impressions and click-through rate) and raw snapshot (prefer analytics.metrics). analytics is null until something is recorded.
get_web_analytics
Returns sessions and key events that Convia-tagged links sent to the workspace's own site, from its Google Analytics 4 property. Requires Advanced Analytics. See Website analytics.
| Parameter | Type | Required | Description |
|---|---|---|---|
start_date, end_date |
string | No | YYYY-MM-DD, inclusive. Default end today (UTC), start 27 days before end |
group_by |
string | No | platform (default), campaign or post |
campaign |
string | No | Campaign id or exact name (case-insensitive). Near misses and shared names are refused with candidates |
include_untagged |
boolean | No | Add the top 20 untagged traffic sources. Default false |
Returns has_ga4, latest_data_date, range (cut off at the last collected day), requested_range, key_events_configured, totals (sessions, engaged_sessions, key_events), site_total_sessions, share_of_site_sessions (0 to 1), rows (at most 100), untagged and note. A null metric means not collected, never zero.
get_search_queries
Returns the searches that bring people to the workspace's own site, from Google Search Console and Bing. Requires Advanced Analytics.
| Parameter | Type | Required | Description |
|---|---|---|---|
start_date, end_date |
string | No | YYYY-MM-DD. Default end today (UTC), start 27 days before end |
branded |
string | No | all (default), only or exclude |
position_min, position_max |
number | No | Average position bounds. 1 is the top result |
provider |
string | No | all (default), google or bing |
sort |
string | No | clicks (default) or impressions |
limit |
number | No | 1 to 500, default 50 |
Returns has_search, latest_data_date (google, bing), range, filters, rows (provider, query, page (null on Bing), clicks, impressions, position, is_branded), returned and note.
Related
- Connect an AI assistant (MCP): get your MCP URL and connect.
- Agent workflows: these tools as step-by-step recipes.
- MCP access, permissions & audit: connection errors, roles and the audit log.
- Glossary: Convia terms used in tool results.