
ChromeDevTools/chrome-devtools-mcp53k
Universal content reader MCP Server for 10+ platforms
Give your agent a URL. Make it prove what it actually read.
x-reader is a source-first Agent Skill + CLI for X/Twitter, articles, video, podcasts, WeChat, Xiaohongshu, Telegram, RSS, and the open web.
It does one thing differently: a search snippet is not the source, a tweet caption is not the attached video, and a video description is not a transcript. If a material source layer was not actually retrieved, x-reader says so.
简体中文: README.zh-CN.md
npx skills add runesleo/x-reader --skill x-reader
Then give your agent a URL and ask it to read the original source. For example:
Read the original source. If it contains attached video/audio that matters to the answer, consume that too. Tell me what you actually read and what is still missing.
The canonical skill uses an explicit evidence contract:
PASS original source + all material media needed for the answer were read
PARTIAL some material layer is still missing
FAIL the original source could not be fetched reliably
UNKNOWN retrieved material is too ambiguous to verify
The source-fetch hardening has a live, reproducible delta against public v0.3.0:
https://example.com: v0.3.0 hit Jina HTTP 401 and failed; v0.3.1 safely falls back to direct_html_pinned and returns READ.media_status=present, so post text can be READ while unconsumed attached media stays PARTIAL.
Watch the 12-second MP4 proof · v0.3.1 release notes
A public X benchmark was run end-to-end after the Agent Skill merged to main:
Source:
https://x.com/dontbesilent/status/2103875422522077377
Post text PASS fetched from the original status via oEmbed
Attached video PASS public MP4 resolved and downloaded
Video duration ~178.3 seconds
Spoken content PASS native zh subtitle track retrieved and read
Broken URL FAIL non-zero exit + machine-readable JSON error
The public owner/repo install path was also verified from a fresh directory:
npx skills add runesleo/x-reader --skill x-reader
# Repository cloned
# Found 3 skills
# Selected 1 skill: x-reader
# Installation complete
See First-success receipt for the dated verification details.
Agents can often find something about a URL while still missing the source the user asked about.
x-reader makes these distinctions explicit:
| What the agent has | What it may claim |
|---|---|
| Search result / preview card | Discovery only — not source evidence |
| X post text | Claims in the post text only |
| X post text + unconsumed attached video | Post may pass; video stays PARTIAL |
| Video page title / description | Metadata only — not spoken content |
| Subtitle / transcript | Spoken-content evidence |
| Login wall / deleted page / empty payload | FAIL or PARTIAL, never invented completion |
| Source | Base read path | Media / gated completion |
|---|---|---|
| X / Twitter | oEmbed → FxTwitter → Article/Jina → Playwright | Agent Skill can inspect attached media with local media tools |
| Web / articles | Jina Reader | Browser fallback where supported |
| YouTube | yt-dlp metadata/subtitles | Groq Whisper fallback when configured |
| Bilibili | Bilibili API | Subtitle/audio transcription workflow |
| Jina → Playwright | Saved browser session when needed | |
| Xiaohongshu | Jina → Playwright | One-time local login may be required |
| Telegram | Telethon | Telegram credentials required |
| RSS | feedparser | — |
| Xiaoyuzhou / Apple Podcasts | Media discovery | Transcript required for spoken-content claims |
Platform behavior changes over time. x-reader's contract is to expose the gap rather than overclaim coverage.
Install directly from GitHub:
pip install "x-reader @ git+https://github.com/runesleo/x-reader.git"
Read a URL:
x-reader https://x.com/elonmusk/status/123456
Get the complete machine-readable payload:
x-reader https://x.com/elonmusk/status/123456 --json
Multiple URLs:
x-reader https://url1.com https://url2.com --json
Browser fallback:
pip install "x-reader[browser] @ git+https://github.com/runesleo/x-reader.git"
playwright install chromium
x-reader login twitter
x-reader login xhs
By default, local cookies stay local. External cookie forwarding is opt-in only.
skills/
├── x-reader/ # canonical source-first URL reader
├── video/ # video/podcast transcription workflow
└── analyzer/ # evidence-grounded content analysis
List them without installing:
npx skills add runesleo/x-reader --list
For most users, install only the canonical x-reader skill.
Clone and install the MCP extra:
git clone https://github.com/runesleo/x-reader.git
cd x-reader
pip install -e ".[mcp]"
Run directly from a clone:
python mcp_server.py
Or launch the packaged MCP entrypoint straight from GitHub with uvx:
uvx --with "mcp[cli]>=1.0,<2" \
--from git+https://github.com/runesleo/x-reader.git \
x-reader-mcp
The x-reader-mcp console entrypoint is packaged inside x_reader; the root mcp_server.py remains as a backward-compatible source-checkout shim.
Tools exposed:
read_url(url)read_batch(urls)list_inbox()detect_platform(url)For Claude Code, add the server with the CLI instead of editing a Claude Desktop config:
claude mcp add x-reader -- python /absolute/path/to/x-reader/mcp_server.py
Use --scope user if you want the server available beyond the current project.
The MCP server currently targets FastMCP 1.x; the mcp and all extras intentionally pin mcp<2.
For local media extraction:
# macOS
brew install yt-dlp ffmpeg
# Linux
pip install yt-dlp
sudo apt install ffmpeg
For Whisper transcription, set a Groq API key:
export GROQ_API_KEY=your_key_here
The default transcription model is whisper-large-v3-turbo.
import asyncio
from x_reader.reader import UniversalReader
async def main():
reader = UniversalReader()
content = await reader.read("https://example.com")
print(content.title)
print(content.content[:200])
asyncio.run(main())
Copy .env.example to .env.
| Variable | Required | Description |
|---|---|---|
TG_API_ID | Telegram only | Telegram API ID |
TG_API_HASH | Telegram only | Telegram API hash |
GROQ_API_KEY | Whisper only | Groq transcription API |
INBOX_FILE | No | Inbox JSON path |
OUTPUT_DIR | No | Optional Markdown output directory |
OBSIDIAN_VAULT | No | Optional Obsidian vault path |
User gives URL
│
├─ text source
│ └─ platform fetcher → UnifiedContent → CLI JSON / inbox
│
├─ video / audio matters
│ └─ subtitle first → transcription fallback → evidence receipt
│
└─ analysis requested
└─ analyze only after source coverage is known
Core package:
x_reader/
├── cli.py
├── reader.py
├── schema.py
├── login.py
├── fetchers/
│ ├── twitter.py
│ ├── youtube.py
│ ├── bilibili.py
│ ├── wechat.py
│ ├── xhs.py
│ ├── telegram.py
│ ├── rss.py
│ ├── jina.py
│ └── browser.py
└── utils/
Leo (@runes_leo) — AI × Crypto independent builder.
leolabs.me — writing · community · open-source tools · indie projects.
Learn in public. Build in public.
MIT

ChromeDevTools/chrome-devtools-mcp53k
Evil0ctal/Douyin_TikTok_Download_API21k🚀 抖音、TikTok 数据采集与无水印视频下载 API,自托管,支持 MCP 调用与 Docker 一键部署。| Self-hosted TikTok & Douyin scraper and no-watermark video downloader — async REST API, MCP server, CLI and web console for posts, profiles, comments and playlists. Self-healing identity pool, PostgreSQL archive, one docker compose up.
Browser automation

budtmo/docker-android16kAndroid in docker solution with noVNC supported, video recording, mcp server and AI-agent
Browser automation

apify/apify-mcp-server10kExtract data from any website with thousands of scrapers, crawlers, and automations on Apify Store ⚡
Browser automation

firecrawl/firecrawl-mcp-server7.6k🔥 Official Firecrawl MCP Server - Adds powerful web scraping and search to Cursor, Claude and any other LLM clients.
Browser automation

AgentDeskAI/browser-tools-mcp7.3kMonitor browser logs directly from Cursor and other MCP compatible IDEs.
Browser automation