# STEALCONTENT MCP

Social posts that already worked, from your agent.

0 indexed posts from 0 accounts on LinkedIn and X, cut into 1 vertical corpora. 0 of them beat their own author's median by 2x or more, which is the only measure here that means anything: raw engagement finds accounts with big followings, the multiple finds posts that WORKED.

## Install

**Claude Code** (In any terminal)

    claude mcp add stealcontent --scope user --transport http https://stealcontent.com/api/mcp

**Claude Desktop** (Settings, Connectors, Add custom connector)

    https://stealcontent.com/api/mcp

**Cursor** (~/.cursor/mcp.json)

    {
      "mcpServers": {
        "stealcontent": { "url": "https://stealcontent.com/api/mcp" }
      }
    }

**Codex** (In 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 JSON** (Any client that takes an MCP config block)

    {
      "mcpServers": {
        "stealcontent": { "url": "https://stealcontent.com/api/mcp" }
      }
    }

Or hand the whole thing to your agent in one sentence:

    Read https://stealcontent.com/skill and install it

## Auth

No API key is needed to search or read. That is deliberate: the corpus is public on the website, and gating it here would buy nothing while cutting this server out of anonymous discovery.

A key from https://stealcontent.com/account, sent as `Authorization: Bearer <key>`, does two things. It ADDS tools rather than unlocking these: playbooks, brand voice, the file library, the writer and the sales side, all of which need to know whose. And it raises the rate limit from 60 tool calls an hour to 600.

Some clients cannot set `Authorization`. Those may send the key on `x-stealcontent-key` instead.

## Tools

### search_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_posts

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_hooks

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_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_posts

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_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_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_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_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_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_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_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_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`

## Paid tools

Listed for everybody, refused at call time with a price. They are here rather than hidden because an agent that never learns the export and the artefacts exist can never tell the person they do.

### export_dataset

Hand 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_media

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

- `seo`: SEO, 0 posts

## When to use which

- Words in a post: `search_posts`.
- A topic or an angle described in a sentence: `semantic_search_posts`. It matches meaning, so it finds posts that argue the same thing in different words.
- An opening line: `find_hooks`. It returns real first lines from posts that outperformed, with the multiple beside each. Never invent one.
- One post in full, before deconstructing it: `get_post`. A search snippet is not the post.
- Turning one example into a pattern: `similar_posts`. One post doing something is an anecdote, six unrelated accounts doing it is an argument.
- What is working in a vertical right now: `top_posts` with a 7 or 30 day window.
- Whether the corpus can answer at all: `dataset_stats`. Read it before claiming the library does or does not cover something.
- Somebody's baseline: `get_profile`. Two people side by side: `compare_profiles`, which ranks on outlier RATE rather than followers.

## Limits

- 60 tool calls an hour anonymously, 600 with a key. A refusal comes back as a tool result with a sentence in it, not as a protocol error, so relay it rather than retrying.
- Posts are indexed, not live. Metrics are from the last refresh.
- The teardown, the hook name and the topics are model-generated. The multiple is arithmetic and is the number to lean on when the two disagree.
- Every tool that returns a post returns `outlier` beside `reactions`. A null multiple means unscored, which is a different claim from 1x.
