STEALCONTENT

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 CodeIn any terminal
claude mcp add stealcontent --scope user --transport http https://stealcontent.com/api/mcp
Claude DesktopSettings, Connectors, Add custom connector
https://stealcontent.com/api/mcp
Cursor~/.cursor/mcp.json
{
  "mcpServers": {
    "stealcontent": { "url": "https://stealcontent.com/api/mcp" }
  }
}
CodexIn any terminal
codex mcp add stealcontent --transport http https://stealcontent.com/api/mcp
VS Code.vscode/mcp.json
{
  "servers": {
    "stealcontent": { "type": "http", "url": "https://stealcontent.com/api/mcp" }
  }
}
Windsurf~/.codeium/windsurf/mcp_config.json
{
  "mcpServers": {
    "stealcontent": { "serverUrl": "https://stealcontent.com/api/mcp" }
  }
}
Gemini CLI~/.gemini/settings.json
{
  "mcpServers": {
    "stealcontent": { "httpUrl": "https://stealcontent.com/api/mcp" }
  }
}
Raw JSONAny client that takes an MCP config block
{
  "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 key

Tools

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 posts

    Keyword 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 meaning

    MEANING-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 worked

    The 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 post

    One 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 one

    The 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 posts

    The 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 datasets

    The 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 stats

    How 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 profile

    One 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 profiles

    Find 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 profiles

    Two 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 boards

    The 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 board

    One 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

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 shelf

What 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
STEALCONTENT agent
this chat $0