x-reader logo

x-reader

Community
runesleo

Universal content reader MCP Server for 10+ platforms

Publisherrunesleo
Repositoryx-reader
LanguagePython
Forks
94
Stars
962
Available tools
0
Transport typestdio
Categories
LicenseMIT
Links
  • Connect tools to AI workflows

    x-reader exposes MCP capabilities that can be used by compatible AI clients and agents.

  • 0 available tools

    Browse the callable actions below, including names and descriptions when provided by the server.

  • Ready-to-copy setup

    Use the installation snippets to configure this server in your preferred MCP client.

  • Open source signals

    962 stars and 94 forks from the linked repository.

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:

LayerWhatFormatInstall
Python CLI/LibraryBasic content fetching + unified schemaSee InstallRequired
Claude Code SkillsVideo transcription + AI analysisCopy skills/ to your Claude Code skills directoryOptional
MCP ServerExpose reading as MCP toolspython mcp_server.pyOptional

Layer 1: Python CLI

bash
# 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:

bash
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).

bash
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<2; moving to MCP 2.x requires a server migration rather than removing the version cap.

Tools exposed:

  • read_url(url) — fetch any URL
  • read_batch(urls) — fetch multiple URLs concurrently
  • list_inbox() — view previously fetched content
  • detect_platform(url) — identify platform from URL

Claude Code config (~/.claude/claude_desktop_config.json):

json
{
    "mcpServers": {
        "x-reader": {
            "command": "python",
            "args": ["/path/to/x-reader/mcp_server.py"]
        }
    }
}

Supported Platforms

PlatformText FetchVideo/Audio Transcript
YouTube✅ Jina✅ yt-dlp subtitles → Groq Whisper fallback
Bilibili (B站)✅ API✅ via Claude Code skill
X / Twitter✅ oEmbed → FxTwitter → Article/Jina → Playwright—
WeChat (微信公众号)✅ Jina → Playwright—
Xiaohongshu (小红书)✅ Jina → Playwright*—
Telegram✅ Telethon—
RSS✅ feedparser—
小宇宙 (Xiaoyuzhou)—✅ via Claude Code skill
Apple Podcasts—✅ via Claude Code skill
Any web page✅ Jina fallback—

*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:

bash
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:

bash
export X_READER_ALLOW_EXTERNAL_SESSION_COOKIES=1

Install

bash
# 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:

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

Dependencies for video/audio (optional)

bash
# 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:

bash
export GROQ_API_KEY=your_key_here

Use as Library

python
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:

bash
cp .env.example .env
VariableRequiredDescription
TG_API_IDTelegram onlyFrom https://my.telegram.org
TG_API_HASHTelegram onlyFrom https://my.telegram.org
GROQ_API_KEYWhisper onlyFrom https://console.groq.com/keys (free)
INBOX_FILENoPath to inbox JSON (default: ./unified_inbox.json)
OUTPUT_DIRNoDirectory for Markdown output (default: disabled)
OBSIDIAN_VAULTNoPath 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

Installation

TypingMind
{
  "mcpServers": {
    "x-reader": {
      "command": "python",
      "args": [
        "-m",
        "x_reader.mcp_server"
      ]
    }
  }
}

Use x-reader MCP with multiple AI models

TypingMind connects MCP tools at the workspace level, so once x-reader is connected, you can use it with different AI models in TypingMind instead of setting it up separately for each model. This MCP runs locally through the TypingMind MCP connector on your device.

Setup guide to use the local connector

Use this when the MCP server needs access to local files, apps, or private resources on your computer.

1

Open the MCP settings

In TypingMind, go to Settings, Advanced Settings, then Model Context Protocol and choose Setup Connector.

  1. Open TypingMind in your browser.
  2. Click the Settings icon.
  3. Go to Advanced Settings.
  4. Open the Model Context Protocol section.
  5. Click Setup Connector and choose This Device.
TypingMind MCP connector setup screen with This Device selected
2

Run the connector command

Choose This Device, copy the command from TypingMind, and run it in Terminal. Keep the process running while you use MCP.

  1. Copy the setup command shown by TypingMind.
  2. Open Terminal on macOS or Windows Terminal on Windows.
  3. Paste and run the command.
  4. Approve the package install if Terminal asks you to proceed.
  5. Keep the Terminal window running while using MCP tools.
3

Add x-reader as a server

When the connector status is Ready, click Edit Servers and paste the MCP server configuration.

  1. Wait until the connector status shows Ready.
  2. Click Edit Servers.
  3. Paste the x-reader MCP server configuration.
  4. Save the server list.
  5. Refresh if you want to confirm the connector is still ready.
TypingMind MCP settings showing active server and Edit Servers button
{
  "mcpServers": {
    "x-reader": {
      "command": "npx",
      "args": [
        "-y",
        "<mcp-server-package>"
      ]
    }
  }
}
4

Use it across models

Save the server list, open Plugins, enable the x-reader MCP tools, then select any supported AI model in TypingMind and use the tools in chat or assign them to an AI agent.

  1. Open the Plugins page in TypingMind.
  2. Enable the x-reader MCP tools.
  3. Start a chat and choose the AI model you want to use.
  4. Use the MCP tools in chat or assign them to an AI agent.
  5. Switch to another AI model whenever needed without reconnecting MCP.
TypingMind chat using enabled MCP tools with a selected AI model
Can you use x-reader to help me with this task?
x-reader
Sure. I read it.
Here is what I found using x-reader.

Frequently asked questions

What is the x-reader MCP server used for?

x-reader is an MCP server that lets compatible AI clients connect to external tools and context. In TypingMind, you can add this MCP server once and make its tools available in your AI workspace.

Can I use x-reader MCP with multiple AI models in TypingMind?

Yes. TypingMind connects MCP tools at the workspace level, so you can use x-reader with different AI models such as Claude, ChatGPT, Gemini, or other models you have configured in TypingMind without setting up the MCP server separately for each model.

Why use x-reader MCP with TypingMind?

TypingMind is one of the best frontends for LLM chat because it brings multiple AI models, prompts, plugins, AI agents, API keys, and MCP tools into one workspace. With x-reader connected, you can use its MCP tools across your preferred models while keeping your chat workflow organized in TypingMind.

How do I connect x-reader MCP to TypingMind?

x-reader runs through the TypingMind local MCP connector. This is best when the MCP server needs access to local files, desktop apps, command-line tools, or private resources on your computer.

What tools does x-reader MCP provide in TypingMind?

x-reader exposes MCP capabilities that can be enabled from the TypingMind Plugins page and used in chat or assigned to AI agents.

Do I need to share my API keys with TypingMind to use x-reader MCP?

No. TypingMind is local-first and lets you keep your model providers, API keys, prompts, and MCP configuration under your control. If x-reader requires authentication, add the required headers, OAuth settings, or local configuration for that MCP server when you create the connection.

Related MCP Servers

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇