# MCP Server Examples: 5 Real Calls, Real JSON (https://www.socialcrawl.dev/blog/mcp-server-examples)
> 5 real MCP server examples, run against SocialCrawl's live production API: exact curl calls, real JSON responses, and one Reddit bug the output actually caught.
This post is 13 real MCP server examples, run against SocialCrawl's own server, showing exactly what comes back: Instagram data a browser can't render without a login, one identical schema across three platforms that share nothing upstream, and a single call that fans out across 12 sources.
Every call used `socialcrawl-mcp` v1.8.0, specifically the request its `socialcrawl_request` tool makes on an agent's behalf. On 2026-07-19, we ran them with curl against the live production API, using the exact request shape that tool sends, not from inside a live Claude Desktop or Claude Code session. That distinction matters: what follows is what the tool would have returned, not a recording of an agent driving it.
If you need the MCP fundamentals first (what MCP is, the four transports, the handshake), that's already covered in [Fetch MCP Server: What It Does + Where It Fails](/blog/fetch-mcp-server-guide). This post assumes you know that and starts from what SocialCrawl's server actually does.
## What can an agent actually do with the SocialCrawl MCP server?
`socialcrawl-mcp` doesn't expose SocialCrawl's 357 registry endpoints as 357 separate tools. It exposes seven: `socialcrawl_list_platforms`, `socialcrawl_list_endpoints`, `socialcrawl_check_balance`, `socialcrawl_monitors`, `socialcrawl_web`, `socialcrawl_get_docs`, and the workhorse, `socialcrawl_request`, which calls whichever of those 357 endpoints an agent actually needs.
Three of the seven cost nothing and need no API key: `socialcrawl_list_platforms`, `socialcrawl_list_endpoints`, and `socialcrawl_get_docs`. An agent can browse the entire platform and endpoint catalog, and read pricing, before it spends a single credit.
Most of the MCP investment happening at the platform level right now is going somewhere else entirely. Ad Age reported in June 2026 that ad-focused MCP servers from Google, Meta, TikTok, and Amazon are consolidating campaign management into a single AI assistant ([source](https://adage.com/technology/ai/aa-big-tech-ads-mcp-servers-could-change-how-advertisers-manage-campaigns/)). None of that touches general-purpose engagement or content data. No first-party surface we found lets an agent ask a single official MCP server "what's this creator's engagement rate" across TikTok, Instagram, and YouTube at once.
(For what it's worth, nobody agrees on how many MCP servers exist in total. Estimates range from roughly 5,500 to over 17,000 depending on which registry is counted ([one estimate](https://mcpmanager.ai/blog/mcp-adoption-statistics/), [another](https://zuplo.com/mcp-report)), which says more about how fragmented server discovery still is than about any precise total.)
## Can an MCP server reach data a fetch server can't render?
Instagram doesn't serve follower counts, verification status, or bio text to a logged-out request. Hit `instagram.com/nasa` with a plain fetch and you get a login wall or a stripped, mostly empty server-rendered shell. A generic fetch-based MCP server stops right there. That's the walled-garden problem in miniature: the moment a network needs a login to render anything useful, a scrape-only tool has nothing left to parse.
```bash
curl -H "x-api-key: $SOCIALCRAWL_API_KEY" \
"https://www.socialcrawl.dev/v1/instagram/profile?handle=nasa"
```
The real response, trimmed:
| Field | Value |
|---|---|
| `data.author.display_name` | NASA |
| `data.author.verified` | true |
| `data.author.followers` | 104,312,596 |
| `data.computed.engagement_rate` | 0.001887 (about 0.19%) |
| `data.computed.language` | en |
| `credits_used` | 1 |
Two of those fields don't exist anywhere in Instagram's own markup: `computed.engagement_rate` and `computed.language`. SocialCrawl derives both server-side from the raw profile and post data, so the agent gets a ready-to-use number instead of raw counts it would otherwise have to turn into a ratio itself. That's the difference between social media API access through an authenticated first-party integration and a public scrape: one hands back a number, the other hands back a login page.
This is the exact gap [Fetch MCP Server: What It Does + Where It Fails](/blog/fetch-mcp-server-guide) leaves open on purpose. Fetch handles the open web, and Instagram's profile pages are not the open web. This is what handles the rest.
## What does one schema look like across TikTok, Reddit, and Bluesky?
TikTok, Reddit, and Bluesky share no infrastructure, no auth model, and no data format upstream. TikTok returns bytes shaped like TikTok's internal API, Reddit returns Reddit's own JSON, and Bluesky speaks the AT Protocol. Every one of the five calls below comes back through the same `author` / `post` / `computed` shape regardless.
| Platform | Endpoint | Key field | Value |
|---|---|---|---|
| TikTok | `tiktok/profile?handle=nasa` | `author.followers` | 694 |
| TikTok | `tiktok/profile/videos?handle=charlidamelio` | `post.engagement.likes` / `.views` | 463,783 / 2,579,469 |
| Reddit | `reddit/subreddit?subreddit=nasa` | `post.engagement.likes` | 102 |
| Bluesky | `bluesky/profile?handle=espn.com` | `author.followers` | 282,976 |
| Bluesky | `bluesky/user/posts?handle=espn.com` | `post.engagement.{likes,comments,shares}` | 120 / 9 / 32 |
Every row uses the identical field paths: `author.followers`, `post.engagement.likes`, `post.flags.deleted`, `computed.engagement_rate`. Write one parser against that shape and it works on all three platforms, and on the other platforms in the registry that share the same archetypes.
The `engagement_rate` column is worth a second look. It's 0.183202 on the charlidamelio video, but a flat 0 on the `@nasa` profile pull, and that's not a computation bug. `computed.engagement_rate` is derived from real numerator and denominator fields, and when there's nothing to divide, it reports the honest answer instead of guessing. Reddit's and Bluesky's `engagement_rate` come back `null` for a related reason: neither platform exposes a view count upstream, so there's no ratio to compute at all. Null, not zero, not a made-up estimate.
One more thing worth flagging, because it happened while pulling this data rather than being staged for the post: the `@nasa` handle on TikTok resolved to a real account, just not NASA's. It's a 694-follower, unverified account that happens to hold the handle. The schema doesn't know or care whether a handle belongs to the account you'd assume; it reports `author.verified` and `author.followers` and leaves the judgment call to you. Treat handle resolution as a lookup, not an identity check, and check those two fields before trusting what came back.
## Can one call replace twelve separate API integrations?
```bash
curl -H "x-api-key: $SOCIALCRAWL_API_KEY" \
"https://www.socialcrawl.dev/v1/search/everywhere?query=openai%20agent%20builder&lookback_days=14"
```
`credits_used: 20`, flat, for whatever comes back. That's not a small charge for a single search call, and it's priced for the work it's actually doing, not tucked into a pricing footnote.
The work: one query fanned out to 12 sources at once, tiktok, tiktok-hashtag, youtube, youtube-hashtag, instagram, pinterest, github, hackernews, tavily, perplexity, polymarket, and rumble, and came back as 40 ranked items, already deduped and clustered. One item in the results, a YouTube video about OpenAI's Agent Builder, showed up independently on Hacker News, Tavily, YouTube, and Perplexity, each with its own rank, folded into a single `native_ranks` object on one result.
Building that yourself means standing up 12 separate integrations (or SDKs, or scrapers), keeping all 12 alive as each source's API drifts under you, and then writing your own fusion, reranking, and dedupe logic to turn 12 disagreeing result sets into one ranked answer. For an agent whose job is answering "what's the internet saying about X right now," `search/everywhere` is that whole pipeline behind one call.
## What happens when you paste a random social URL into it?
```bash
curl -H "x-api-key: $SOCIALCRAWL_API_KEY" \
"https://www.socialcrawl.dev/v1/prism/lookup?url="
```
Ran it twice, with two URLs from two different platforms, no platform argument either time.
| Input URL | Resolved to | Archetype | Credits billed |
|---|---|---|---|
| TikTok video URL | `tiktok/post` | Post | 1 |
| Reddit thread URL | `reddit/post/comments` | CommentList | 5 |
Notice the credits column isn't the same number twice. `prism/lookup` isn't a flat-fee convenience wrapper charging its own price on top of whatever it finds. It bills exactly what the endpoint it resolved to would cost on its own, 1 credit for a TikTok post, 5 for a Reddit comment thread, and it reports which endpoint and archetype it picked in `data.resolved` so you can see the decision it made rather than trust it blindly.
That matters for an agent, or a person pasting a link into a chat, who doesn't know or care what platform a URL belongs to. It never has to branch on "is this TikTok or Reddit." It pastes the URL and reads `data.resolved` to find out what it got.
## Does the composite layer expand nested reply threads for you?
```bash
curl -H "x-api-key: $SOCIALCRAWL_API_KEY" \
"https://www.socialcrawl.dev/v1/prism/comments?url=&sort=top&max=20"
```
`credits_used: 3`. The interesting part of the response is the `legs[]` array, a transparency log of exactly what happened server-side to build the answer:
| Leg | Endpoint | Status | Credits |
|---|---|---|---|
| 1 | `tiktok/post/comments` | 200 | 1 |
| 2 | `tiktok/video/comment/replies` | 200 | 1 |
| 3 | `tiktok/video/comment/replies` | 200 | 1 |
One call fetched the top 20 comments. Two more calls automatically expanded the two top comments that reported `replies > 0`, and the response folded all three legs into one nested thread, sorted by like count. Doing that by hand means calling comments once, checking which top comments have a non-zero `replies` count, looping a second endpoint once per comment that has replies, then splicing the results back together yourself. `prism/comments` runs that loop server-side and hands back the finished shape.
Now the part that has to be in this post and not quietly cut for space: the identical composite call, run against a Reddit thread instead of a TikTok video, came back with `comments: []` and `total_fetched: 0`, even though its one `legs[]` entry reported `status: 200` and a credit spent. Nothing errored. The response just folded zero comments into the top-level array. Calling the raw `reddit/post/comments` endpoint directly against the exact same URL, immediately afterward, returned the one real comment that thread actually has.
That was a real bug on the Reddit leg of this composite, observed on 2026-07-19 during the capture run for this post, not a hypothetical written in for balance. The root cause: on Reddit, a top-level comment's `parent_id` points at the post itself rather than being null, and the composite's nesting step misread every top-level comment as a reply and filed the whole thread under a parent that was never going to be returned. It was fixed the same day, the same composite call now returns the thread's comments with replies attached, and the fix shipped with a billing rule that a page whose rows can't be read is a reported leg error, never a silently billed empty success. The honest selling point here isn't that the composite layer never breaks. It's that `legs[]` reports a real per-call `status` and `credits_used`, which is what let this get caught by reading the response instead of silently trusting the top-level `comments` count.
## How do you start calling the SocialCrawl MCP server?
Start with the free tool. `socialcrawl_list_platforms` needs no API key and costs nothing, so it's the fastest way to confirm a client is actually talking to the server before spending a credit on anything else.
Two ways to run the server itself, both real, both live today:
- **stdio**, for Claude Desktop, Cursor, or VS Code: run `npx socialcrawl-mcp` and point the client's MCP config at it.
- **Hosted Streamable HTTP**, for Claude Code or a cloud agent: point the client at `https://mcp.socialcrawl.dev/mcp` directly, no local process to manage.
Once the server's connected, [get an API key](/signup) (new accounts start with free credits) and pass it however the client injects headers or environment variables. From there, every one of these MCP server examples is one `socialcrawl_request` call away.
One honest limitation, stated plainly because it's easy to assume otherwise: claude.ai's web connector currently reaches only the three anonymous tools, `socialcrawl_list_platforms`, `socialcrawl_list_endpoints`, and `socialcrawl_get_docs`. OAuth 2.1 support for the keyed tools, including `socialcrawl_request` itself, hasn't shipped yet. If the full, keyed surface is what you need today, use Claude Code or a stdio client, not the web connector.
Why go through MCP instead of calling [the SocialCrawl API](/docs) directly? Mostly tool discovery and schema validation. An agent connected to the MCP server can list what's callable and what arguments each call expects without you hand-writing a client for it. Calling the REST API yourself works exactly the same underneath, you're just writing that client by hand instead.
That also answers the "should I build my own MCP server" question before it comes up. `socialcrawl_request` already wraps every endpoint in [the current platform list](/platforms), so most builders don't need a custom MCP server on top of SocialCrawl at all. If you want one anyway, for a narrower internal tool surface, the same REST API underneath is exactly what you'd wrap.
## Frequently asked questions
### Why use an MCP server instead of calling the SocialCrawl API directly?
Mostly tool discovery and schema validation. An MCP client can list available tools and their expected arguments without you writing a hand-rolled HTTP client. The underlying REST API and credit costs are identical either way, MCP just saves the client-writing step.
### Which social platforms can an agent reach through the SocialCrawl MCP server?
Any platform in the registry, through `socialcrawl_request`. This post demonstrated Instagram, TikTok, Reddit, and Bluesky specifically, but the free `socialcrawl_list_platforms` tool returns the full, current list, no API key needed to check it, and it's the more reliable source than any number written down here.
### How do I set up the SocialCrawl MCP server in Claude Code or Cursor?
For stdio clients, Claude Desktop, Cursor, or VS Code, run `npx socialcrawl-mcp` and point the client's MCP configuration at it. For Claude Code or a cloud agent, point the client at the hosted Streamable HTTP endpoint, `https://mcp.socialcrawl.dev/mcp`, directly, no local process required.
### Can I use the SocialCrawl MCP server from claude.ai's web connector today?
Only partially. The web connector currently reaches the three anonymous tools, `socialcrawl_list_platforms`, `socialcrawl_list_endpoints`, and `socialcrawl_get_docs`. OAuth 2.1 support for the keyed tools, including `socialcrawl_request`, hasn't shipped yet, so calls that spend credits don't work there today. Use Claude Code or a stdio client for full access.
### Can I build my own MCP server on top of SocialCrawl's endpoints?
Yes. The same REST API and credit model that `socialcrawl_request` uses underneath is fully callable directly, so wrapping it in your own, narrower MCP server is straightforward if `socialcrawl-mcp`'s general-purpose tool set isn't the right shape for your use case.