Model Context Protocol
Your agent reads what already worked
One endpoint, and whatever writes for you can search the corpus, filter by outlier multiple, pull real opening lines and take a post apart. Searching and reading need no account, because the library is public on the website and gating it here would buy nothing.
Endpoint
https://stealcontent.com/api/mcp
Streamable HTTP, JSON-RPC, stateless. Most clients want the command above rather than this, but a client we have not heard of only ever needs the URL.
- Claude
- Cursor
- OpenAI
- VS Code
- Windsurf
- Gemini CLI
- Raw JSON
- 0
- posts indexed
- 0
- people watched
- 1
- corpora live
- 0
- beat their author's own average
Install it
One row per client, each with the config key that client actually uses and the file it goes in. Copy the row, not the row above it: Windsurf calls the field serverUrl and Gemini calls it httpUrl, which is the kind of thing a hand-copied snippet gets wrong.
claude mcp add stealcontent --scope user --transport http https://stealcontent.com/api/mcp
https://stealcontent.com/api/mcp
{
"mcpServers": {
"stealcontent": { "url": "https://stealcontent.com/api/mcp" }
}
}codex mcp add stealcontent --transport http https://stealcontent.com/api/mcp
{
"servers": {
"stealcontent": { "type": "http", "url": "https://stealcontent.com/api/mcp" }
}
}{
"mcpServers": {
"stealcontent": { "serverUrl": "https://stealcontent.com/api/mcp" }
}
}{
"mcpServers": {
"stealcontent": { "httpUrl": "https://stealcontent.com/api/mcp" }
}
}{
"mcpServers": {
"stealcontent": { "url": "https://stealcontent.com/api/mcp" }
}
}Or hand the whole thing to your agent
One sentence, in any agent with a text box. It fetches the skill, installs the server into its own config and learns when to reach for which tool, which is a thing an agent already knows how to do and a person should not have to.
Read https://stealcontent.com/skill and install it
Auth
No API key is needed to search or read. A key ADDS tools rather than unlocking these: playbooks, brand voice, the file library, the writer and the sales side all need to know whose, so they cannot be anonymous.
A key also raises the rate limit from 60 tool calls an hour to 600.
Send it as Authorization: Bearer <key>. Some clients cannot set that header at all, and those may send it on x-stealcontent-key instead.
Make a keyTools
Every tool a caller with no key gets, straight from the registry the server serves, so this list cannot describe a tool that was renamed last month. The descriptions are written for the model rather than for you, which is why they read the way they do.
search_postsSearch postsKeyword search over the indexed corpus of social posts that already worked. Every hit comes back with its engagement AND its outlier multiple (reach against that author's own median; 2x or more means it outperformed its baseline). Rank by 'outlier' to find the proven winners worth deconstructing, not by raw reactions, which only finds people with big followings. Filter by dataset to stay inside one vertical. Use get_post for the full text of one hit, and semantic_search_posts when the question is about a topic rather than a word.
Arguments query, dataset, author, platform (linkedin | x | youtube | tiktok | instagram | threads | substack), min_outlier, since_days, format (text | image | carousel | video | poll | document | repost), hook_pattern (contrarian | story | number | question | listicle | confession | announcement | how-to | callout), topic, sort (outlier | engagement | recent), limit
semantic_search_postsSearch posts by meaningMEANING-based search over the corpus using embeddings, not substring matching. This is the right tool whenever somebody describes a TOPIC or an angle ('I am writing about pricing for solo founders') rather than naming a word: it finds posts that argue the same thing in different words, which keyword search cannot. Set min_outlier to 2 to see only posts that beat their own author's baseline. Returns nothing if embeddings are not configured on this deployment, in which case fall back to search_posts.
Arguments query, dataset, min_outlier, author, since_days, limit
find_hooksFind hooks that workedThe opening lines that actually worked on a topic. Runs a meaning search restricted to outliers and returns each post's FIRST LINE alongside its multiple and its engagement. Use this before you ever propose a hook: a hook you invented is a guess, and a hook from a post that did 5x its author's baseline is evidence. Always quote the multiple next to any hook you repeat.
Arguments topic, dataset, min_outlier, limit
get_postGet one postOne post in full: its complete text, its author, its engagement, its outlier multiple and the baseline that multiple was taken against, plus whatever the describe pass wrote about it (the named hook, the structure, the claim it makes, why it worked). Call this before deconstructing anything; a snippet from a search result is not the post.
Arguments id
similar_postsPosts like this oneThe posts nearest in meaning to one you already have, by embedding distance. Use it to turn a single example into a pattern: one post doing something is an anecdote, six unrelated accounts doing it is an argument. Posts from the same dataset are preferred, and reshares are excluded so a repost of the same post cannot take a slot.
Arguments id, dataset, limit
top_postsTop postsThe best-performing posts in a corpus over a window, ranked by the outlier multiple. This is the 'what is working right now in this vertical' question. A window of 7 or 30 days is the useful one: an all-time list is dominated by whatever has been indexed longest.
Arguments dataset, since_days, min_outlier, format (text | image | carousel | video | poll | document | repost), limit
list_datasetsList datasetsThe vertical corpora available: slug, name, what each one is for, and how many posts and accounts are in it. A dataset is the dimension the whole library turns on, so start here when you do not know which corpus a question belongs to. Every other corpus tool takes one of these slugs.
Arguments include_unbuilt
dataset_statsDataset statsHow deep one corpus actually is, and what shape it has: how many posts and accounts, how many of those posts outperformed, the date range, which accounts contribute the most outliers, and how the named hook patterns are distributed with the average multiple of each. Read this before claiming the library does or does not cover something, and use the hook distribution as evidence rather than as decoration.
Arguments dataset
get_profileGet a profileOne indexed account in full: who they are, their follower count, their BASELINE (the median every one of their multiples is measured against), how many of their posts we hold, how many of those outperformed, their biggest outliers and their most recent posts. Read this before advising anybody to write 'like' somebody: what lands for an account with a baseline of 40 is not what lands for one with a baseline of 4,000.
Arguments handle, platform (linkedin | x | youtube | tiktok | instagram | threads | substack), limit
search_profilesSearch profilesFind indexed accounts by name, handle or headline. Use it when somebody names a person loosely, before calling get_profile with the exact handle. Results carry how many posts we hold for each and how many of those outperformed, which is the honest measure of whether we can say anything about them at all.
Arguments query, dataset, limit
compare_profilesCompare profilesTwo or more indexed accounts side by side: followers, baseline, how many posts we hold, how many outperformed, their outlier rate, and their single best post. The comparison that matters is the outlier RATE, not the follower count: an account with 4,000 followers and a one-in-three hit rate is a better thing to copy than one with 400,000 and a one-in-fifty.
Arguments handles, dataset
list_boardsList boardsThe swipe files this account can read: their own boards plus any public ones. A board is the unit an agent gets handed, and every board carries a BRIEF saying why those posts are together. Read the brief before the posts: it is the argument, and the posts are the evidence for it.
Arguments limit
get_boardGet a boardOne board in full: its brief, and every post on it with the note explaining why that post is there, its engagement and its outlier multiple. This is the tool for 'write me something in the shape of my cold-open board'. Follow the brief; the per-post notes tell you what the person saw in each one, which is usually more precise than anything you would infer from the text.
Arguments slug, limit
Paid tools
Listed for everybody and refused at call time with a price. They are here rather than hidden because an agent that never learns the export and the mirrored artefacts exist can never tell you they do, at the one moment you are already looking at a post you want.
export_datasetExport a dataset as JSONLHand back a whole vertical corpus as JSONL, one post per line, with its text, its author, its engagement, its outlier multiple and its teardown. This is the tool for fine-tuning, for a local index, or for handing an agent a thousand posts at once instead of searching a dozen at a time. PAID: it needs a Pro key ($20 a month, https://stealcontent.com/pricing). Searching and reading the same corpus is open to everybody and needs no key, so reach for search_posts and top_posts unless the caller genuinely wants the file.
Arguments dataset, min_outlier, limit
get_post_mediaGet a post's mediaThe mirrored artefact behind a post: the video file, the carousel images, the PDF, with dimensions and duration. The post's TEXT, its metrics, its outlier multiple and its teardown are public and free through get_post; this is the file. PAID: a free account gets 10 a calendar month, Pro is uncapped ($20 a month, https://stealcontent.com/pricing). The allowance is shared with the website, so it is the same ten either way.
Arguments post_id
Datasets
Every tool that takes a dataset takes one of these slugs. A corpus is a subject, so pick the one you are actually in: a library of great SEO posts is worth nothing to somebody selling ecommerce email.
See the whole shelfWhat to know before you rely on it
- 60 tool calls an hour anonymously, 600 with a key. A refusal comes back as a sentence inside a tool result rather than as a protocol error, so relay it instead of retrying.
- Posts are indexed, not live. The metrics are from the last refresh.
- The teardown, the hook name and the topics are model-generated. The multiple is arithmetic over a median, and it is the number to lean on when the two disagree.
- Every tool that returns a post returns its outlier multiple beside its reactions. A null multiple means nobody has scored it, which is a different claim from 1x.
Prefer plain HTTP?
The same corpus is a REST API, with the same rule about keys: reading is open, and a key buys volume. Six languages of copy-paste examples per endpoint.
Read the API reference