Skip to main content
The research surface: the social accounts you track, and their posts ranked by outlier score. 6 tools. Every tool below is exposed by the hosted MCP server at https://mcp.contenthero.ai and by the @contenthero/mcp npm package. A write tool changes your account; a read tool does not.

list_tracked_accounts

read List the social accounts this ContentHero account tracks. TWO KINDS, in one list: accountType ‘inspiration’ is the creators and competitors they watch for research, ‘brand’ is their OWN profiles (distinct from list_brand_kits, which are the brand identity documents). Every row reports its own accountType, so omit the filter to see both. Call get_tracked_account for one account’s performance, or list_content for the posts. Pass brandKitId to scope to the accounts linked to a specific brand kit.
`inspiration` \| `brand`
Narrow to one kind. Omitted, both come back.
string
Scope to the accounts linked to this brand kit (from get_brand_kit).
string
The previous page’s cursor.
integer
How many to return.

get_tracked_account

read Get one tracked account with how its content actually performs: post count, total and average views/likes/comments, average engagement and outlier score, plus its top posts by outlier score and its most recent ones. Works for either kind of account: use it on one of the owner’s OWN accounts to ground decisions in their real numbers, or on a creator they watch to study what works for that creator.
string
required
The account id from list_tracked_accounts.

update_tracked_account

write Move a tracked account within its list (its kind’s: the creators they watch, or their own profiles), after or before another of the same kind, or to an end. Returns the account with its performance, as get_tracked_account does. Requires the inspiration:write scope.
string
required
The account id from list_tracked_accounts.
string
Place it immediately after this item of the same list.
string
Place it immediately before this item of the same list.
`top` \| `bottom`
Place it at an end of the list instead of beside an item. Name neighbors or a position, not both.

list_content

read The core research read: social posts this account tracks, ranked by OUTLIER SCORE (how far a post overperformed its own creator’s baseline, so a small account’s hit still surfaces), or by relevance when you pass search. SPANS BOTH the creators they watch and their OWN posts by default; set scope to narrow, and every row carries isOwn either way. This is how you answer both “what is working for the people I watch” and “how did my own posts do” without picking a subsystem first. Filter by platform, content type, a published window (publicationDate like ‘week’ or ‘month’, or exact publishedAfter/publishedBefore), and ranges over score, views, duration and follower count. Call get_content for one post in full, including its transcript.
string[]
Limit to these tracked account ids (from list_tracked_accounts).
boolean
Only the one-off posts the owner saved by url.
string
Scope to the accounts linked to this brand kit.
string
Filter by content type, e.g. ‘video’, ‘short’, ‘reel’.
string
The previous page’s cursor.
number
Maximum duration in seconds.
number
Minimum duration in seconds.
boolean
Only content the account has favorited.
integer
How many to return.
`asc` \| `desc`
The sort direction.
number
Only content at or below this outlier score.
number
Only content at or above this outlier score.
`youtube` \| `instagram`
Filter to one platform.
`week` \| `month` \| `3months` \| `6months` \| `year` \| `2years`
Published within this window. Use publishedAfter for an exact date instead.
string
ISO timestamp. Wins over publicationDate.
string
ISO timestamp.
`all` \| `inspiration` \| `brand`
‘inspiration’ = creators they watch, ‘brand’ = their own accounts, ‘all’ = both (default).
string
Finds posts by meaning and by keyword across title, creator, description and transcript, ranked by relevance. Returns only the posts judged relevant, so an empty result means nothing matched.
`relevance` \| `outlierScore` \| `publishedAt` \| `viewCount` \| `engagementRate`
The field to sort by.
number
Maximum follower count of the post’s account.
number
Minimum follower count of the post’s account.
number
Only content at or below this view count.
number
Only content at or above this view count.

get_content

read Get one tracked post in full: engagement stats, outlier score, hashtags, keywords, mentions and audio info. Works for a creator’s post and for the owner’s own. THE TRANSCRIPT IS OPT-IN because a long video is a large document: pass transcript=‘text’ for the whole thing, or transcript=‘segments’ for timed slices, and then narrow with startMs/endMs or transcriptSearch to pull only the part that matters. The transcript reports a status: ‘complete’, ‘not_applicable’ (there is nothing to transcribe), ‘failed’ (it will be retried), ‘processing’, or ‘absent’ (never attempted), so an empty result is never ambiguous. THE BREAK IT DOWN ANALYSIS IS OPT-IN THE SAME WAY: availability (status + section names) is always reported; pass analysis=‘full’ for every section, or analysisSections for only the ones the task needs. SCENES ARE OPT-IN THE SAME WAY: availability is always reported; pass scenes=‘map’ for each scene’s time range, what happens in it and what is said, or scenes=‘frames’ to also see a frame of each scene. startMs/endMs narrow either. Scenes exist once analyze_content has run with kind scenes. transcriptSegments is excluded from ‘full’ because the transcript params above are the one transcript path.
string
required
The content id from list_content, get_tracked_account, or a get_card inspiration asset.
`none` \| `full`
How much of the post’s Break It Down analysis to include. Default ‘none’ (availability + section names still report).
string[]
Only these analysis sections. The names differ by format, so take them from the availability line.
number
Window end, ms from the start of the media. Narrows transcript segments and scenes.
`none` \| `map` \| `frames`
How much of the post’s scene map to include. Default ‘none’ (availability still reports). ‘frames’ adds an image of each scene, as many as fit this result; the rest are listed as links.
number
Window start, ms from the start of the media. Narrows transcript segments and scenes.
`none` \| `text` \| `segments`
How much transcript to include. Default ‘none’.
string
Return only the segments containing this phrase. Implies segments.

analyze_content

write Analyze a tracked post, as one of two kinds. breakdown (default) runs Break It Down: why it works, from the hook and structure to visuals, audio, the call to action, and steps to recreate it. scenes prepares the post to be seen: a map of every scene with what happens and what is said in it, and a frame of each, which get_content then returns. Viewing an existing result is free; creating one spends credits, so pass getCost to see the price first. If it returns pending, call it again for the result.
string
required
The content id from list_content, get_tracked_account, or a get_card inspiration asset.
boolean
Return the credit cost instead of analyzing (nothing runs, nothing is charged). 0 when the result already exists.
`breakdown` \| `scenes`
breakdown (default): the Break It Down analysis. scenes: the scene map and a frame of each scene, priced per minute of video.