Skip to main content
Glama
sandeep231004

read-post-mcp

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

x.com/<user>/status/<id>, twitter.com/...

text, author, date, likes, replies, links, photos, video, alt text, link preview, quoted post

X's embed widget data

Instagram

/p/<code>, /reel/<code>, /reels/<code>, /tv/<code>

caption, author, date, comment count, photos, video, alt text, audio credit

the post's embed page

Threads

threads.com/@<user>/post/<code> (.net too)

text, links, date, likes, replies, reposts, shares

the post's embed page

Facebook

/<page>/posts/<id>, /videos/, permalink.php, /photo, /share/

text, author, date, comments, shares, photos

Facebook's embedded-post plugin

LinkedIn

/posts/...-activity-<id>-..., /feed/update/urn:li:...

text, author, date, reactions, comments, links, photo

the post's embed page

Bluesky

bsky.app/profile/<handle>/post/<id>

text, date, likes, reposts, replies, quotes, links, photos, video, alt text, link preview, quoted post

Bluesky's public API

Mastodon

<any server>/@<user>/<id>

text, content warning, date, likes, boosts, replies, links, photos, video, alt text, link preview, quoted post, poll

that server's public API

YouTube

watch?v=, youtu.be/, /shorts/, /live/

title, description, channel, date, views, length, thumbnail, category, tags

the public watch page

Vimeo

vimeo.com/<id>, player.vimeo.com/video/<id>

title, description, author, upload day, length, thumbnail

Vimeo's oEmbed API

Tumblr

<blog>.tumblr.com/post/<id>, tumblr.com/<blog>/<id>

text, tags, date, notes, images

Tumblr's public read API

Pinterest

pinterest.<any country>/pin/<id>

description, creator, saves, image, board

Pinterest's widget API

Reddit

/r/<sub>/comments/<id>, redd.it/<id>

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.git
cd read-post-mcp && npm install && npm run build

Then point your agent at dist/index.js.

Claude Code:

claude mcp add read-post -- node /absolute/path/to/read-post-mcp/dist/index.js

Other 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

url

string

Link to the post

frames

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:

  1. A text block with the post as JSON (fields below).

  2. The post's photos, as images.

  3. For each video: its thumbnail, or with frames: true, 10 frames each labelled with its time ("Video frame at 2.8s").

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

site

yes

The site, e.g. x.com, or the Mastodon server

url

yes

Clean link to the post

author

yes

name and handle

date

when the site gives one

ISO 8601 in UTC. Vimeo gives the day only, because its time has no timezone.

text

yes

The post's text, with the site's short links expanded

stats

yes

Counts the site shows publicly, e.g. likes, replies, views

links

yes

Every link in the post, including ones written in the text

photos

yes

Image URLs (also sent as images)

videos

yes

url, poster, and durationMs when known

alts

no

The author's descriptions of the attached photos and videos

card

no

The link preview: url, title, description

replyingTo

no

Who the post replies to (X)

quoted

no

The quoted post, with the same fields

note

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 check

This 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.ts is the MCP server: the read_post tool, the list of sites, images, and video frames.

  • src/post.ts is the Post shape 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:

  1. Find the site's public door: an oEmbed endpoint, an embed page, or a public API that answers without a login.

  2. Add src/sites/<site>.ts exporting a matcher (url → id) and a reader (id → Post). Throw notPublic(...) when the post isn't public.

  3. Add it to the SITES list in src/index.ts. Keep Mastodon last, because it matches any server's links.

  4. 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 tool
read_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesLink to the post
framesNoAlso return 10 frames from each video as images (needs ffmpeg; YouTube and Vimeo lock their video files, so no frames there)

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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. 1 tool updatev0.1.0
    • First observedread_post

TDQS

A4.4/5.0

Scored across 1 tool

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count3/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

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

  • A
    license
    A
    quality
    D
    maintenance
    Provides 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.
    4
    132 npm
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables 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 npm
    MIT