x-reader is a free, open source data extraction & web scraping project written in Python and released under MIT. It has 988 GitHub stars, 97 forks and 3 open issues, and was last pushed 6 days ago. On this registry it ranks #120 of 149 tracked projects in Data Extraction & Web Scraping, with 5 head-to-head comparisons available. It gained 25 stars over the last 30 tracked days.

What is x-reader?

x-reader is an MIT-licensed Python 3.10+ tool and MCP server that gives AI agents and developers one way to fetch, transcribe, and digest content from more than ten platforms — articles, videos, podcasts, and tweets — returning structured output instead of raw page markup.

What it is

x-reader is a universal content reader built in Python and distributed under the MIT licence. It lives in the Model Context Protocol ecosystem, where it exposes content reading as MCP tools for AI agents, and it also ships as a command-line tool, an importable Python library, and a set of Claude Code skills. The pipeline is uniform: any URL goes through platform detection, then fetching, then emission into one unified schema. Text sources are handled in the Python layer, with Jina Reader covering generic pages and dedicated API paths for Bilibili, RSS, and Telegram, while YouTube subtitles come through yt-dlp and full audio transcription comes through Whisper.

The concrete problem it solves is fragmentation across per-platform fetching code. Rather than wiring Jina Reader for articles, yt-dlp for subtitles, and a Whisper call for podcasts separately, a caller submits a URL and receives structured content back. It also solves the access problem on gated platforms: WeChat and Xiaohongshu pages that resist scraping can be reached through a Playwright browser fallback after a one-time login, and login-required X content can use a saved local browser session.

Key capabilities

  • Single-command fetching for one or many URLs, for example x-reader https://mp.weixin.qq.com/s/abc123 or x-reader https://url1.com https://url2.com, with automatic platform detection and unified output.
  • Command-line subcommands for platform sessions and inbox review: x-reader login xhs, x-reader login twitter, and x-reader list.
  • MCP server layer started with python mcp_server.py, targeting FastMCP 1.x, installed through the mcp extra.
  • Claude Code skills in skills/video for full Whisper transcripts of YouTube, Bilibili, and podcast audio, and skills/analyzer for structured analysis reports.
  • A five-step public-first chain for X and Twitter: X oEmbed, FxTwitter, Jina Reader for Articles and long-form pages, generic Jina Reader for profiles, and Playwright with a saved session for gated content.
  • Transcription and subtitle extraction through yt-dlp subtitles and Whisper, with the Whisper path requiring GROQ_API_KEY from Groq.
  • Cookie privacy control: local X cookies stay local by default, and Jina only receives the saved session when X_READER_ALLOW_EXTERNAL_SESSION_COOKIES=1 is set.

Who uses it and how

  • AI agent builders who need reading capability exposed as MCP tools rather than hand-written retrieval code per site.
  • Claude Code users who send a YouTube, Bilibili, or podcast link and let the video skill auto-trigger a full transcript plus summary.
  • Developers running batch fetches, passing several URLs in one invocation when collecting articles or threads.
  • Privacy-conscious users reading gated X Articles, who run x-reader login twitter and leave external session cookies disabled.
  • Teams reading anti-scraping platforms such as Xiaohongshu and WeChat, where the browser extra plus a one-time login is the supported route.

Getting started

Install from GitHub with pip install git+https://github.com/runesleo/x-reader.git, optionally using the telegram, browser, or all extras and running playwright install chromium for browser fallback. The MCP server and Claude Code skills require cloning the repository first, followed by pip install -e ".[mcp]" and python mcp_server.py.

How it compares

The facts name no competing tool or paid product that x-reader replaces, so there is nothing to contrast on licence, hosting, data ownership, or cost model. It stands alone in this registry on that evidence.

When to use it — and when not to

A self-hoster must supply Python 3.10+ and its own GROQ_API_KEY for Whisper transcription, and must install Playwright Chromium if browser fallback is needed; there is no hosted service and no container image, so the operating burden stays with the user. The MCP server and the Claude Code skills are not part of the pip install and require a repository clone, and the MCP server currently targets FastMCP 1.x rather than the newer line. Anyone wanting a turnkey managed extraction service, or transcription without an external Groq key, should look elsewhere.

project readme (upstream, from github) — read inline

x-reader

Python 3.10+ License: MIT

Universal content reader — fetch, transcribe, and digest content from any platform.

Give it a URL (article, video, podcast, tweet), get back structured content. Works as CLI, Python library, MCP server, or Claude Code skills.

简体中文: README.zh.md / README.zh-CN.md

What It Does

Any URL → Platform Detection → Fetch Content → Unified Output
              ↓                      ↓
         auto-detect           text: Jina Reader
         7+ platforms          video: yt-dlp subtitles
                               audio: Whisper transcription
                               API: Bilibili / RSS / Telegram

The Python layer handles text fetching and YouTube subtitle extraction. The Claude Code skills (optional) add full Whisper transcription for video/podcast and AI-powered content analysis.

Three Layers

x-reader is composable. Use the layers you need:

Layer What Format Install
Python CLI/Library Basic content fetching + unified schema See Install Required
Claude Code Skills Video transcription + AI analysis Copy skills/ to your Claude Code skills directory Optional
MCP Server Expose reading as MCP tools python mcp_server.py Optional

Layer 1: Python CLI

# Fetch any URL
x-reader https://mp.weixin.qq.com/s/abc123

# Fetch a tweet
x-reader https://x.com/elonmusk/status/123456

# Fetch multiple URLs
x-reader https://url1.com https://url2.com

# Login to a platform (one-time, for browser fallback)
x-reader login xhs

# View inbox
x-reader list

Layer 2: Claude Code Skills

Requires cloning the repo (not included in pip install).

For video/podcast transcription and content analysis:

skills/
├── video/       # YouTube/Bilibili/podcast → full transcript via Whisper
└── analyzer/    # Any content → structured analysis report

Install:

export CLAUDE_SKILLS_DIR="/path/to/claude-code-skills"
mkdir -p "$CLAUDE_SKILLS_DIR"
cp -r skills/video "$CLAUDE_SKILLS_DIR/video"
cp -r skills/analyzer "$CLAUDE_SKILLS_DIR/analyzer"

Then in Claude Code, just send a YouTube/Bilibili/podcast link — the video skill auto-triggers and produces a full transcript + summary.

Layer 3: MCP Server

Requires cloning the repo (mcp_server.py is not included in pip install).

git clone https://github.com/runesleo/x-reader.git
cd x-reader
pip install -e ".[mcp]"
python mcp_server.py

The MCP server currently targets FastMCP 1.x. The mcp and all extras pin mcp \*XHS requires a one-time login: x-reader login xhs` (saves session for Playwright fallback)

X Articles and login-required X pages can use a saved local browser session: x-reader login twitter

YouTube Whisper transcription requires GROQ_API_KEY — get a free key from Groq

X / Twitter Reading Path

x-reader uses a lightweight public-first chain for X:

  1. X oEmbed for fast public tweet text.
  2. FxTwitter for structured public tweet fallback.
  3. Jina Reader for public Articles and long-form pages.
  4. Generic Jina Reader for profiles and non-status X pages.
  5. Playwright with saved session for login-required content.

For Articles or gated pages, run:

x-reader login twitter
x-reader "https://x.com/user/status/123"

By default, local X cookies stay local. If you explicitly want to let Jina use your saved X session for gated Articles, set:

export X_READER_ALLOW_EXTERNAL_SESSION_COOKIES=1

Install

# From GitHub (recommended)
pip install git+https://github.com/runesleo/x-reader.git

# With Telegram support
pip install "x-reader[telegram] @ git+https://github.com/runesleo/x-reader.git"

# With browser fallback (Playwright — for XHS/WeChat anti-scraping)
pip install "x-reader[browser] @ git+https://github.com/runesleo/x-reader.git"
playwright install chromium

# With all optional dependencies
pip install "x-reader[all] @ git+https://github.com/runesleo/x-reader.git"
playwright install chromium

Or clone and install locally:

git clone https://github.com/runesleo/x-reader.git
cd x-reader
pip install -e ".[all]"
playwright install chromium

Dependencies for video/audio (optional)

# macOS
brew install yt-dlp ffmpeg

# Linux
pip install yt-dlp
apt install ffmpeg

For Whisper transcription, get a free API key from Groq and set:

export GROQ_API_KEY=your_key_here

Use as Library

import asyncio
from x_reader.reader import UniversalReader

async def main():
    reader = UniversalReader()
    content = await reader.read("https://mp.weixin.qq.com/s/abc123")
    print(content.title)
    print(content.content[:200])

asyncio.run(main())

Configuration

Copy .env.example to .env:

cp .env.example .env
Variable Required Description
TG_API_ID Telegram only From https://my.telegram.org
TG_API_HASH Telegram only From https://my.telegram.org
GROQ_API_KEY Whisper only From https://console.groq.com/keys (free)
INBOX_FILE No Path to inbox JSON (default: ./unified_inbox.json)
OUTPUT_DIR No Directory for Markdown output (default: disabled)
OBSIDIAN_VAULT No Path to Obsidian vault (writes to 01-收集箱/x-reader-inbox.md)

Architecture

x-reader/
├── x_reader/              # Python package
│   ├── cli.py             # CLI entry point
│   ├── reader.py          # URL dispatcher (UniversalReader)
│   ├── schema.py          # Unified data model (UnifiedContent + Inbox)
│   ├── login.py           # Browser login manager (saves sessions)
│   ├── fetchers/
│   │   ├── jina.py        # Jina Reader (universal fallback)
│   │   ├── browser.py     # Playwright headless (anti-scraping fallback)
│   │   ├── bilibili.py    # Bilibili API
│   │   ├── youtube.py     # yt-dlp subtitle extraction
│   │   ├── rss.py         # feedparser
│   │   ├── telegram.py    # Telethon
│   │   ├── twitter.py     # oEmbed → FxTwitter → Article/Jina → Playwright
│   │   ├── wechat.py      # Jina → Playwright fallback
│   │   └── xhs.py         # Jina → Playwright + session fallback
│   └── utils/
│       └── storage.py     # JSON + Markdown dual output
├── skills/                # Claude Code skills
│   ├── video/             # Video/podcast → transcript + summary
│   └── analyzer/          # Content → structured analysis
├── mcp_server.py          # MCP server entry point
└── pyproject.toml

How the Layers Work Together

User sends URL
    │
    ├─ Text content (article, tweet, WeChat)
    │   └─ Python fetcher → UnifiedContent → inbox
    │
    ├─ Video (YouTube, Bilibili, X video)
    │   ├─ Python fetcher → metadata (title, description)
    │   └─ Video skill → full transcript via subtitles/Whisper
    │
    ├─ Podcast (小宇宙, Apple Podcasts)
    │   └─ Video skill → full transcript via Whisper
    │
    └─ Analysis requested
        └─ Analyzer skill → structured report + action items

Star History

Star History Chart

Author

Leo (@runes_leo) — AI × Crypto independent builder. Trading on Polymarket, building data and trading systems with Claude Code and Codex.

leolabs.me — writing · community · open-source tools · indie projects · all platforms.

X Subscription — paid content weekly, or just buy me a coffee 😁

Learn in public, Build in public.

License

MIT

Frequently asked questions

Is x-reader free to use?

x-reader is open source under the MIT licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does x-reader do?

Universal content reader MCP Server for 10+ platforms

What is x-reader written in?

x-reader is primarily written in Python. Its source is publicly available at https://github.com/runesleo/x-reader, and it has 988 GitHub stars.