read-post-mcp
Reads public Bluesky posts from bsky.app profile post links, returning text, author, date, engagement counts, links, photos, video, alt text, link previews, and quoted posts via Bluesky's public API.
Reads public Facebook posts, videos, photos, and share links, returning text, author, date, comments, shares, and photos via Facebook's embedded-post plugin.
Reads public Instagram posts, reels, and IGTV links, returning caption, author, date, comment count, photos, video, alt text, and audio credit via the post's embed page.
Reads public Mastodon posts from any server, returning text, content warnings, date, likes, boosts, replies, links, photos, video, alt text, link previews, quoted posts, and polls via the server's public API.
Reads public Pinterest pins, returning description, creator, saves, image, and board via Pinterest's widget API.
Reads public Reddit posts from subreddit comment and redd.it links, returning title, body, flair, author, date, score, comment count, link, images, galleries, and video via the Arctic Shift archive checked against Reddit's oEmbed.
Reads public Threads posts from threads.com or threads.net links, returning text, links, date, likes, replies, reposts, and shares via the post's embed page.
Reads public Tumblr posts from blog post links, returning text, tags, date, notes, and images via Tumblr's public read API.
Reads public Vimeo videos, returning title, description, author, upload day, length, and thumbnail via Vimeo's oEmbed API.
Reads public YouTube videos, Shorts, and live links, returning title, description, channel, date, views, length, thumbnail, category, and tags via the public watch page.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@read-post-mcpwhat does this post say? https://x.com/vercel/status/1683920951807971329"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
read-post-mcp
Give your AI agent a link to a social media post, and it gets back what the post says: the text, who posted it, when, the counts, the links, the photos, and frames from the video.
No logins, no API keys, no accounts.
Why
Agents reach the web as logged-out visitors, and most social sites show logged-out visitors a login wall. Ask an agent to read a tweet or an Instagram reel and it usually comes back with "I can't access this."
But every one of these sites wants its posts shown on other websites, so each one keeps a public door open for embedding: the "embed this post" widget, an oEmbed endpoint, or a public API. Those doors don't need a login.
read-post-mcp walks through those doors and nothing else. It never logs in, never uses cookies, and never pretends to be a browser. If a site won't show a post publicly, the tool says so and stops.
Related MCP server: social-data-mcp
What it looks like
The agent calls one tool:
read_post({ url: "https://x.com/vercel/status/1683920951807971329" })and gets back:
{
"site": "x.com",
"url": "https://x.com/vercel/status/1683920951807971329",
"author": { "name": "Vercel", "handle": "vercel" },
"date": "2023-07-25T19:23:35.000Z",
"text": "Introducing `react-tweet`:\n\n◆ 35x less client-side JavaScript than the Twitter <iframe>\n◆ React Server Components for built-in data fetching\n◆ Works with Next.js, Vite, CRA, and more\n\nhttps://vercel.com/blog/introducing-react-tweet",
"stats": { "likes": 1702, "replies": 67 },
"links": ["https://vercel.com/blog/introducing-react-tweet"],
"photos": [],
"videos": [],
"card": {
"url": "https://vercel.com/blog/introducing-react-tweet",
"title": "Introducing React Tweet",
"description": "Embed tweets into your React application without sacrificing performance."
}
}Photos come back as real images the agent can look at, not just links. For videos, pass frames: true and the agent gets 10 evenly spaced frames, so it can read on-screen text and code and follow what happens.
Supported sites
Site | Links it understands | What you get | Where it reads from |
X / Twitter |
| text, author, date, likes, replies, links, photos, video, alt text, link preview, quoted post | X's embed widget data |
| caption, author, date, comment count, photos, video, alt text, audio credit | the post's embed page | |
Threads |
| text, links, date, likes, replies, reposts, shares | the post's embed page |
| text, author, date, comments, shares, photos | Facebook's embedded-post plugin | |
| text, author, date, reactions, comments, links, photo | the post's embed page | |
Bluesky |
| text, date, likes, reposts, replies, quotes, links, photos, video, alt text, link preview, quoted post | Bluesky's public API |
Mastodon |
| text, content warning, date, likes, boosts, replies, links, photos, video, alt text, link preview, quoted post, poll | that server's public API |
YouTube |
| title, description, channel, date, views, length, thumbnail, category, tags | the public watch page |
Vimeo |
| title, description, author, upload day, length, thumbnail | Vimeo's oEmbed API |
Tumblr |
| text, tags, date, notes, images | Tumblr's public read API |
| description, creator, saves, image, board | Pinterest's widget API | |
| title, body, flair, author, date, score, comment count, link, images, galleries, video | the Arctic Shift archive, checked against Reddit (see below) |
About Reddit. Reddit blocks its own data (JSON, RSS, embeds) without a login. So the post is read from Arctic Shift, a public research archive of Reddit, and returned only if Reddit's own oEmbed still shows the post publicly. A post its author deleted stays deleted here. Scores and comment counts are snapshots from when the archive saved the post, and the result's note says so.
Install
You need Node.js 18 or newer (tested on 22). For video frames you also need ffmpeg; everything else works without it.
git clone https://github.com/sandeep231004/read-post-mcp.gitcd read-post-mcp && npm install && npm run buildThen point your agent at dist/index.js.
Claude Code:
claude mcp add read-post -- node /absolute/path/to/read-post-mcp/dist/index.jsOther MCP clients (Claude Desktop, Cursor, and others) take the same server in their JSON config:
{
"mcpServers": {
"read-post": {
"command": "node",
"args": ["/absolute/path/to/read-post-mcp/dist/index.js"]
}
}
}It has been tested with Claude Code. Start a new session after adding it so the tool shows up.
The tool
read_post
Input | Type | What it does |
| string | Link to the post |
| boolean, optional | Also return 10 frames from each video as images. Needs ffmpeg. YouTube and Vimeo lock their video files, so there are no frames there. |
The answer comes back as:
A text block with the post as JSON (fields below).
The post's photos, as images.
For each video: its thumbnail, or with
frames: true, 10 frames each labelled with its time ("Video frame at 2.8s").The quoted post's photos, if it quotes a post that has any.
If the post can't be read publicly, the tool returns an error such as "Instagram post ABC isn't publicly available (removed, private, or age-restricted). read-post-mcp only reads public posts and never logs in." A link from a site it doesn't support yet gets an error listing the sites it does.
Post fields
Field | Always there | What it holds |
| yes | The site, e.g. |
| yes | Clean link to the post |
| yes |
|
| when the site gives one | ISO 8601 in UTC. Vimeo gives the day only, because its time has no timezone. |
| yes | The post's text, with the site's short links expanded |
| yes | Counts the site shows publicly, e.g. |
| yes | Every link in the post, including ones written in the text |
| yes | Image URLs (also sent as images) |
| yes |
|
| no | The author's descriptions of the attached photos and videos |
| no | The link preview: |
| no | Who the post replies to (X) |
| no | The quoted post, with the same fields |
| no | Extra details (audio credit, board, tags, poll) and caveats (where the data came from) |
What it can't do
TikTok isn't supported yet. It couldn't be tested from the network this was built on.
Comments and replies aren't read on any site, only the post itself.
YouTube captions exist, but YouTube serves them empty without a login token, so you get the title and description, not the spoken words.
No video frames for YouTube or Vimeo, whose video files are locked. You get the thumbnail.
No audio transcripts for any video, only frames.
Likes on Facebook and Instagram are left out, because their embeds show numbers that don't match the real count.
Not tested with real examples yet: Threads posts with photos or video, Pinterest video pins, and Instagram carousels. The code handles them, but expect rough edges.
These doors can move. Bluesky, Mastodon, and the oEmbed endpoints are official. The embed pages and widget data are public but undocumented, so a site can change them without notice. When one breaks, it's usually a small fix in that site's file.
Ground rules
Public posts only. No logins, cookies, accounts, or API keys.
If a site shows a login wall, the tool reports it and stops. It doesn't try to get around it.
No browser impersonation: requests go out as plain Node.js requests.
It runs on your machine, so each person's traffic comes from their own computer, at their own pace.
Each post is fetched once per session and then remembered, so asking again doesn't hit the site again.
Development
npm run checkThis builds the project and runs src/check.ts: link-matching checks, plus a live read of a real public post on every site. It needs the internet, and a failure can also mean a test post was deleted or changed.
Layout:
src/index.tsis the MCP server: theread_posttool, the list of sites, images, and video frames.src/post.tsis thePostshape every site returns, plus small shared helpers.src/sites/has one file per site. Each file answers two questions: "is this link mine, and what's the post id?" and "given the id, what does the post say?"
Adding a site:
Find the site's public door: an oEmbed endpoint, an embed page, or a public API that answers without a login.
Add
src/sites/<site>.tsexporting a matcher (url → id) and a reader (id → Post). ThrownotPublic(...)when the post isn't public.Add it to the
SITESlist insrc/index.ts. Keep Mastodon last, because it matches any server's links.Add a link check and a live read to
src/check.ts, then test it through the MCP server with real posts.
License
MIT
Available Tools
1 toolread_postA
Read a public social media post from its link: text, author, date, stats, links, photos (as images) and video. Uses the site's public embed data and never logs in, so private or protected posts can't be read. Supported: x.com / twitter.com, instagram.com, threads.com, facebook.com, linkedin.com, bsky.app, youtube.com, vimeo.com, tumblr.com, pinterest.com, reddit.com, Mastodon servers.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Link to the post | |
| frames | No | Also return 10 frames from each video as images (needs ffmpeg; YouTube and Vimeo lock their video files, so no frames there) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses the access model (public embed data, no login), the resulting failure mode (private/protected posts unreadable), the dependency requirement (ffmpeg for frames), and platform-specific limits (YouTube/Vimeo video files locked). This is more than an agent would infer from structured fields alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action and payload before the access caveat and the platform list. The enumeration is dense but each element (returned fields, platforms) earns its place by telling the agent what to expect.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description must describe return values — and it lists them explicitly. With no annotations and only two simple parameters, the description covers everything an agent needs: what is read, what is returned, what will fail, and which sites are supported.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented in the schema, including the ffmpeg and platform caveats for 'frames'. The description adds no syntax or format detail beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Starts with a specific verb+resource ('Read a public social media post from its link') and immediately enumerates the returned payload (text, author, date, stats, links, photos, video). The scope qualifier 'public' and the platform list make the tool's boundary unambiguous even without siblings to differentiate from.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit exclusion: private or protected posts cannot be read because the tool relies on public embed data and never logs in. It does not frame alternatives, but there are no sibling tools, so the only missing piece would be guidance on unsupported URLs beyond the platform list, which is partly covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v0.1.0- First observed
read_post
TDQS
Scored across 1 tool
There is only one tool, so there is no possibility of misselection or overlap with a sibling tool. Its purpose is stated unambiguously in both name and description.
The single tool uses a clear snake_case verb_noun name (read_post) that matches the server name and the operation it performs. There are no competing conventions to conflict with.
A one-tool surface is thin by the general rubric, but the server's stated scope is exactly one operation (fetch and parse a post from a URL), so nothing extra is padding. It sits at the borderline rather than being mismatched.
For a read-only fetch-a-post domain, the tool covers the full expected payload: text, author, date, stats, links, media, and video, with explicit limits (no private posts) and a broad platform list. No batch/multi-URL variant or structured error/fallback operation, but the core lifecycle is complete.
Maintenance
Related MCP Connectors
Your AI's eyes and ears on social media: read any TikTok, Instagram, YouTube or X post by link
Live social media data for AI agents: X, LinkedIn, Instagram, TikTok, YouTube, Reddit, Facebook.
Search and read public data from X/Twitter, Reddit, YouTube, Instagram, TikTok, Facebook, Threads, Bluesky, Trustpilot, Amazon, Google Maps, news, forums and the web. 90+ read-only tools plus ready-made research playbooks (lead finding, brand monitoring, review mining). Hosted: connect with an API key; 50 free requests per endpoint each month.
Schedule and publish social posts across 9 platforms (Instagram, LinkedIn, X, TikTok, Facebook, Threads, Pinterest, Bluesky, Mastodon) straight from Claude, ChatGPT, Cursor, or any MCP client. Create, edit, and reschedule posts, upload media, and pull account and post analytics, follower demographics, and best-time windows. 20 tools, free on every plan.
Related MCP Servers
- AlicenseAqualityDmaintenanceProvides AI agents with unified access to 21 social media platforms and 105 endpoints for retrieving profiles, posts, comments, search results, trending content, and analytics without per-platform authentication.4132 npmMIT
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to retrieve X/Twitter profiles and tweets, YouTube video and channel data, and TikTok profile and video stats on a pay-per-result basis without requiring login or platform API keys.12 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables agents to read one public X/Twitter post from a status URL without cookies, returning post text, quoted content, links, and media URLs as untrusted data.MIT
- AlicenseAqualityBmaintenanceEnables AI agents to read data from Instagram, TikTok, YouTube, App Store, GitHub, Hacker News, Bluesky, Twitch, and Linktree through the ScrapingIsNotACrime public API.345 npmMIT