The agent calls yt-dlp, twitter-cli, rdt-cli, gh, and feedparser directly. Agent-Reach never touches the request. It is the installer and the diagnostic layer. Nothing more and nothing less.
SnackOnAI Engineering | Senior AI Systems Researcher | Technical Deep Dive | July 09, 2026
The standard AI agent connectivity problem has three layers. The first: many platforms return 403 to server IPs (Reddit), require paid API access (Twitter), or require login sessions that CLI tools cannot create (XiaoHongShu). The second: when the access problem is solved, raw HTML from a page fetch is nearly unreadable by an LLM without preprocessing. The third: even when you find working tools for each platform, configuring them individually across a new Claude Code or Cursor installation requires an hour of setup that has to be repeated for every new environment.
Agent-Reach's answer to all three layers is the same: you should not be solving this yourself. This is solved infrastructure. You paste one URL to your agent and the agent installs everything.
帮我安装 Agent Reach:https://raw.githubusercontent.com/Panniantong/agent-reach/main/docs/install.md
The agent fetches the install document, installs agent-reach via pip, installs system dependencies (Node.js, gh CLI, mcporter, twitter-cli, rdt-cli), configures Exa search via MCP, detects whether you are on a local machine or server, and registers a SKILL.md in your agent's skills directory so the agent knows what it can now do. One instruction, no back-and-forth.
Scope: Agent-Reach's scaffolding design philosophy, all sixteen supported platforms and their upstream tool choices, the install and diagnostic workflow, the security model (credential storage, ban risk, safe mode), and the pluggable channel architecture. Not covered: the full Chinese-language ecosystem context (Bilibili, XiaoHongShu, WeChat Official Accounts, Weibo, V2EX, Xueqiu, Xiaoyuzhou) in depth beyond brief mention.
What It Actually Does
Agent-Reach's core job is two things: install a coherent set of upstream internet tools for your AI coding assistant, and register the SKILL.md that tells the agent which tool to reach for which task. After installation, agent-reach doctor tells you the status of every channel: what works, what needs configuration, and how to fix what is broken.
The sixteen supported platforms:
Platform | Out-of-box | Needs config | Upstream tool |
|---|---|---|---|
Web | Read any page | — | Jina Reader (free) |
YouTube | Subtitle extraction + search | — | yt-dlp (154k stars) |
RSS/Atom | Any feed | — | feedparser |
Global search | — | Auto: Exa via mcporter | Exa (free, no key) |
GitHub | Public repos + search | Private: agent-guided login | gh CLI (official) |
Twitter/X | Read single tweets | Search/timeline: Cookie auth | twitter-cli (2.1k stars) |
Search + posts + comments | Cookie: | rdt-cli | |
Bilibili | Subtitle + search (local) | Server: proxy (~$1/mo) | yt-dlp + bili-cli |
XiaoHongShu | — | Cookie auth | xhs-cli (1.5k stars) |
Douyin | — | Parse + no-watermark download | douyin-mcp-server |
Public pages | Profile/jobs: linkedin-mcp | linkedin-scraper-mcp | |
WeChat Official Accounts | Search + full Markdown | — | Exa + Camoufox (optional) |
Hot search, content, users | — | (built-in) | |
V2EX | Hot posts, threads, details | — | (built-in) |
Xueqiu (Chinese finance) | Stock quotes, hot posts | Some features: Cookie | (built-in) |
Xiaoyuzhou Podcast | — | Audio → text: Whisper | Whisper transcription |
The key design choice: Agent-Reach's channel files (channels/web.py, channels/twitter.py, etc.) only implement a check() method that detects whether the upstream tool is available for agent-reach doctor. The actual data retrieval is done entirely by the upstream tools directly. Agent-Reach is not a wrapper. It is a configuration and diagnostic system.
The Architecture, Unpacked

The critical design point: Agent-Reach's channel files only implement check(). They exist to tell agent-reach doctor whether each upstream tool is available. When your agent wants to read a YouTube video, it calls yt-dlp directly. It does not call any Agent-Reach function. This is the scaffolding-not-framework principle in its purest form: the installer knows about everything, the runtime layer touches nothing.
The Code, Annotated
Snippet One: Channel Architecture and the check() Pattern
# Agent-Reach: channel architecture showing the scaffolding design
# Source: Panniantong/Agent-Reach channels/ (MIT)
# Design intent: channel files are diagnostic ONLY, not runtime wrappers
# channels/twitter.py
# ← THIS is all a channel file does: detect if the upstream tool is available
# ← At runtime, the agent calls "twitter-cli" directly from its shell
# ← Agent-Reach never proxies or wraps the actual API call
import subprocess
import shutil
from dataclasses import dataclass
@dataclass
class ChannelStatus:
available: bool
version: str = ""
authenticated: bool = False
message: str = ""
fix_command: str = ""
def check() -> ChannelStatus:
"""
Check if twitter-cli is available and authenticated.
Called ONLY by `agent-reach doctor`.
NOT called during any actual Twitter read or search operation.
← This is the scaffolding principle: Agent-Reach knows the state,
but the agent uses the tool directly without going through this file.
"""
# Step 1: Is the CLI installed?
if not shutil.which("twitter"):
return ChannelStatus(
available=False,
message="twitter-cli not installed",
fix_command="pipx install twitter-cli",
)
# Step 2: Get version
try:
result = subprocess.run(
["twitter", "--version"], capture_output=True, text=True, timeout=5
)
version = result.stdout.strip()
except Exception:
version = "unknown"
# Step 3: Is it authenticated? (can it access twitter?)
try:
test_result = subprocess.run(
["twitter", "search", "python", "--limit", "1"],
capture_output=True, text=True, timeout=10
)
authenticated = test_result.returncode == 0
except Exception:
authenticated = False
if not authenticated:
return ChannelStatus(
available=True,
version=version,
authenticated=False,
message="twitter-cli installed but not authenticated",
fix_command="twitter login # requires browser login to x.com",
)
return ChannelStatus(
available=True,
version=version,
authenticated=True,
message="twitter-cli ready: search/read/timeline/threads available",
)
# ─────────────────────────────────────────────────────────────────────────────
# CONTRAST: what this would look like if Agent-Reach were a framework (wrong):
#
# def search_twitter(query: str, limit: int = 10) -> list[dict]:
# """❌ WRONG: Agent-Reach should NOT wrap the upstream tool"""
# result = subprocess.run(["twitter", "search", query, "--limit", str(limit)])
# return parse_output(result.stdout)
#
# This would make Agent-Reach a dependency. If twitter-cli changes its output
# format, all your agent code breaks at the Agent-Reach layer, not at the CLI.
# The scaffolding design avoids this entirely: agent reads SKILL.md, calls
# twitter-cli directly, handles the output itself. Agent-Reach is not in the path.
The absence of a search_twitter() function in the channel file is intentional. Every implementation decision about how to call the tool, how to parse the output, and how to handle errors lives in the SKILL.md that the agent reads at install time. The agent adapts. Agent-Reach does not need to.
Snippet Two: SKILL.md Registration and Doctor Output
# Agent-Reach: SKILL.md registration and doctor workflow
# Source: Panniantong/Agent-Reach agent_reach/ (MIT)
# Design intent: agent learns once (from SKILL.md), then knows forever
import subprocess
import json
from pathlib import Path
# ─── SKILL.md REGISTRATION ────────────────────────────────────────────────────
# At install time, Agent-Reach writes a SKILL.md to the agent's skills directory.
# This is the ONE piece of Agent-Reach that runs at agent-startup time.
# After this, the agent consults SKILL.md independently, without Agent-Reach.
SKILL_CONTENT = """
# Agent-Reach Internet Skills
## Web Page Reading
Tool: Jina Reader (no API key needed)
Command: curl https://r.jina.ai/{URL}
Use when: agent needs to read any web page as clean Markdown
Example: curl https://r.jina.ai/https://example.com
## YouTube Video Transcripts
Tool: yt-dlp
Command: yt-dlp --write-sub --skip-download --sub-format vtt "{URL}"
Use when: agent needs to know what a video says
Also: yt-dlp --dump-json "{URL}" for metadata without transcript
## Twitter/X Search and Reading
Tool: twitter-cli (requires Cookie auth)
Commands:
twitter search "query" # search recent tweets
twitter tweet https://x.com/... # read specific tweet
twitter user @username # user timeline
Use when: agent needs real-time Twitter content or opinion data
## Reddit Research
Tool: rdt-cli (requires Cookie auth via rdt login)
Commands:
rdt search "query" # search Reddit
rdt read POST_ID # read post + comments
rdt subreddit programming --hot # subreddit feed
Use when: agent needs community opinions, bug reports, discussions
## GitHub Operations
Tool: gh CLI (authenticated)
Commands:
gh repo view owner/repo # repo overview
gh search repos "LLM framework" # repo search
gh issue list --repo owner/repo # issues
Use when: agent needs to understand a codebase, find tools, check issues
## Global Web Search
Tool: Exa via mcporter (AI semantic search, free, no key)
Command: mcporter call 'exa.search(query: "your query")'
Use when: agent needs to find current information from the web
## RSS/Atom Feeds
Tool: feedparser (Python)
Command: python -c "import feedparser; d = feedparser.parse('FEED_URL'); print([e.title for e in d.entries[:5]])"
Use when: agent needs to monitor news or blog updates
## agent-reach doctor
Run: agent-reach doctor
Shows: status of every channel, what's working, what needs setup
"""
def register_skill(agent_tool: str = "claude-code") -> Path:
"""
Write SKILL.md to the agent's skills directory.
After this, the agent reads SKILL.md independently at each session start.
Agent-Reach is not involved in any subsequent tool calls.
"""
skill_paths = {
"claude-code": Path.home() / ".claude" / "skills" / "agent-reach.md",
"cursor": Path.home() / ".cursor" / "rules" / "agent-reach.md",
"codex": Path.home() / ".codex" / "instructions" / "agent-reach.md",
"windsurf": Path.home() / ".codeium" / "windsurf" / "memories" / "agent-reach.md",
}
skill_path = skill_paths.get(agent_tool)
if skill_path:
skill_path.parent.mkdir(parents=True, exist_ok=True)
skill_path.write_text(SKILL_CONTENT)
print(f"✅ SKILL.md registered at {skill_path}")
return skill_path
# ─── agent-reach doctor OUTPUT ────────────────────────────────────────────────
def doctor():
"""
Check all channels. Print status. Tell user what to fix.
The ONLY runtime diagnostic function in Agent-Reach.
"""
from . import channels # auto-discovers all channel/*.py files
print("\n🔍 Agent-Reach Doctor\n" + "="*40)
all_statuses = {}
for channel_name, channel_module in channels.items():
try:
status = channel_module.check()
icon = "✅" if status.available and status.authenticated else \
"⚠️ " if status.available else "❌"
print(f"{icon} {channel_name:20s} {status.message}")
if not status.authenticated and status.fix_command:
print(f" → Fix: {status.fix_command}")
all_statuses[channel_name] = status
except Exception as e:
print(f"❌ {channel_name:20s} Error checking: {e}")
# Summary
available = sum(1 for s in all_statuses.values() if s.available)
authenticated = sum(1 for s in all_statuses.values() if s.authenticated)
print(f"\n📊 {available}/{len(all_statuses)} channels available, "
f"{authenticated}/{len(all_statuses)} fully authenticated")
return all_statuses
# ─── REAL doctor OUTPUT EXAMPLE ──────────────────────────────────────────────
# $ agent-reach doctor
#
# 🔍 Agent-Reach Doctor
# ========================================
# ✅ web Jina Reader available (no auth needed)
# ✅ youtube yt-dlp v2026.03.14 installed, 1800+ sites supported
# ✅ github gh v2.67.0 authenticated as @myusername
# ✅ search Exa connected via mcporter (free, semantic)
# ✅ rss feedparser 6.0.11 installed
# ⚠️ twitter twitter-cli installed, not authenticated
# → Fix: twitter login (ensure browser is logged in to x.com)
# ⚠️ reddit rdt-cli installed, not authenticated
# → Fix: rdt login (auto-extracts cookie from browser)
# ❌ xiaohongshu xhs-cli not installed
# → Fix: pipx install xiaohongshu-cli
# ❌ xiaoyuzhou Whisper transcription not configured
# → Fix: tell agent "帮我配小宇宙播客"
#
# 📊 5/16 channels available, 3/16 fully authenticated
The doctor() function is the entire Agent-Reach runtime surface. There is no wrapper, no proxy, no middleware. Every tool call your agent makes after installation goes directly to the upstream CLI. This is what makes Agent-Reach safe to audit: the running surface is one diagnostic command and one SKILL.md file.
It In Action: Full Internet Research Session
Task: Research current community sentiment about a new Python package on multiple platforms.
What the agent can do after Agent-Reach installation:
Step 1: Check what the package maintainer says
# Agent reads SKILL.md → knows to use gh CLI for GitHub
gh repo view newpackage/library
gh issue list --repo newpackage/library --label "bug" --limit 20
gh search code "newpackage" --extension ".py" --limit 10
Step 2: Get real-time Twitter sentiment
# Agent reads SKILL.md → knows to use twitter-cli
twitter search "newpackage library python" --limit 50 --sort "top"
twitter search "newpackage python" --since 2026-06-01
# Returns actual tweets with engagement metrics, not API-gated data
Step 3: Reddit deep research
# Agent reads SKILL.md → knows to use rdt-cli
rdt search "newpackage python" --sort relevance
rdt read r/Python_12345 # read full post + all comments
# Gets: full thread text, nested comments, upvote counts
# No 403, because rdt-cli uses Cookie auth
Step 4: YouTube tutorials and opinions
# Agent reads SKILL.md → knows to use yt-dlp
yt-dlp --dump-json "https://youtube.com/results?search_query=newpackage+python+tutorial"
yt-dlp --write-sub --skip-download "https://youtube.com/watch?v=specific_video"
# Gets: transcript of any tutorial video, search results metadata
Step 5: Web documentation and blog posts
# Agent reads SKILL.md → knows to use Jina Reader
curl https://r.jina.ai/https://newpackage.readthedocs.io
curl https://r.jina.ai/https://specific-blog-post.com/review
# Returns: clean Markdown, no HTML tags, LLM-ready
Step 6: Semantic search for anything missed
# Agent reads SKILL.md → knows to use Exa via mcporter
mcporter call 'exa.search(query: "newpackage python library comparison 2026", num_results: 10)'
# AI semantic search: finds relevant recent content across the web
Result: A comprehensive research brief covering the developer community's actual response to the package, drawn from six independent source types, assembled in a single agent session, with zero API fees and zero manual configuration per platform.
Why This Design Works, and What It Trades Away
The scaffolding-not-framework principle produces a codebase that is trivially auditable from a security perspective. The runtime surface of Agent-Reach is agent-reach doctor and the SKILL.md registration at install time. There is no data passing through Agent-Reach at runtime. This means: a security review of Agent-Reach is a review of one diagnostic function and one install script. The actual data from Twitter, Reddit, YouTube, and XiaoHongShu passes through the upstream tools (twitter-cli, rdt-cli, yt-dlp, xhs-cli) directly to the agent. Auditing those tools is the security reviewer's task; auditing Agent-Reach is an hour of reading.
The pluggable channel architecture is the correct design for a tool that wraps 16 third-party platforms, each of which changes its access patterns regularly. When Reddit changed its authentication requirements in 2024, the reddit.py channel file needed to be updated to point to rdt-cli instead of the prior approach. The upstream tool changed; Agent-Reach's channel file updated. No existing agent code that was already calling rdt-cli needed to change, because Agent-Reach was not in the call path.
The SKILL.md approach is what makes the tool platform-agnostic. Claude Code, Cursor, OpenClaw, Codex, and Windsurf all have different agent context file formats and different skill directory locations. Agent-Reach's register_skill() writes to the correct location for each. After that, each agent reads the same SKILL.md content and knows the same set of tool capabilities, expressed in the natural language the agent understands rather than structured API calls.
What Agent-Reach trades away:
Cookie-based authentication is the most significant operational risk. Platforms that require Cookie auth for full access (Twitter/X, XiaoHongShu, Reddit) run the risk of account detection and ban. The README is explicit about this: use dedicated throwaway accounts, not your primary account. Cookie-equivalent authentication (using a browser session token as an API key) has a higher ban rate on platforms with sophisticated bot detection (Twitter especially) than properly registered API clients. Agent-Reach's free access to Twitter search comes with this risk baked in.
The tool is heavily China-platform-oriented. Bilibili, XiaoHongShu (Red), Douyin (TikTok's Chinese counterpart), WeChat Official Accounts, Weibo, V2EX, Xueqiu, and Xiaoyuzhou Podcast are eight of sixteen supported platforms. International-first teams may find four or five of the installed tools immediately useful; the rest add install overhead without immediate value. The --division style selective install would help here, though Agent-Reach does not yet have a platform filter equivalent.
Technical Moats
The upstream tool selection for zero-cost Twitter and Reddit access. twitter-cli (Cookie auth, 2.1k stars) and rdt-cli (Cookie auth from browser session, 304 stars) are the specific tools that make zero-API-fee Twitter and Reddit research viable. Both use Cookie-based authentication extracted from an already-logged-in browser session rather than requiring API key registration. Finding, validating, and maintaining these tools as upstream platforms change their bot detection is ongoing maintenance work that Agent-Reach absorbs so individual teams do not have to. The v1.4.0 release ("上游大迁移") reflects exactly this: a full upstream tool migration for stability, described as the primary release concern.
The SKILL.md + doctor feedback loop. The installation registers the SKILL.md, which teaches the agent what tools are available. The doctor command shows which tools are actually working. The combination is a feedback loop: agent tries to call a tool, tool is not working (maybe Cookie expired), agent surfaces the issue, user runs agent-reach doctor, sees the specific failure, runs the fix command. This loop is more useful than an error message from a failed wrapper function because it surfaces the solution alongside the diagnosis.
yt-dlp as the YouTube + Bilibili + 1800-site universal substrate. yt-dlp's support for 1800+ sites means Agent-Reach's video intelligence capability extends far beyond YouTube. The same tool that extracts YouTube subtitles extracts Bilibili subtitles, Vimeo captions, TED talk transcripts, and hundreds of other video platforms. A single tool, already installed, covers an enormous range of video intelligence use cases at zero API cost.
Insights
Insight One: Agent-Reach's "pure vibe coding" self-description is charming but potentially undersells the architectural clarity of the scaffolding-not-framework decision. The choice to make channel files diagnostic-only, to never proxy upstream tool calls, and to register knowledge via SKILL.md rather than a proprietary skill system, is a principled design. Teams building their own agent infrastructure tooling should study this: the fastest way to make your tool untrustworthy is to put it in the data path of every agent API call. Agent-Reach is trusted precisely because it is not in the data path. The one-time install is the only critical path operation.
Insight Two: The sixteen platforms Agent-Reach supports reveal a demographic reality about AI agent adoption that Western-focused coverage misses. Eight of the sixteen platforms are Chinese: Bilibili, XiaoHongShu, Douyin, WeChat Official Accounts, Weibo, V2EX, Xueqiu, and Xiaoyuzhou. The Chinese developer community is building agent infrastructure for a different internet that includes platforms with zero API access for non-Chinese companies. The tools Agent-Reach wraps for these platforms (xhs-cli, bili-cli, douyin-mcp-server) are community-maintained solutions to access problems that Western API-first companies have not solved because the commercial incentive is different. Agent-Reach represents a concrete case where open-source agent infrastructure from the Chinese developer community is ahead of the Western tooling ecosystem for these specific platforms.
Surprising Takeaway
Agent-Reach ships with its own llms.txt file in the repository root. llms.txt is the emerging standard (championed by Answer.ai and adopted by many developer tool projects) for telling AI language models how to use a repository: what the project does, what the key files are, what the agent should call to accomplish common tasks. Agent-Reach, a tool that helps AI agents use the internet, has optimized itself to be discoverable and usable by AI agents via the very standard it helps other sites implement. The project README explicitly tells agents "if you're an AI reading this, here's the fastest path to being useful." The agent connectivity tool is optimized for agent connectivity. This is not a contradiction or a recursive joke. It is the most consistent possible implementation of what the tool believes: that AI agents need structured, machine-readable instructions to use tools correctly, including the tools that help them use other tools.
TL;DR For Engineers
Agent-Reach (Panniantong/Agent-Reach, MIT, 20.3k stars, v1.4.0): scaffolding tool that installs internet access infrastructure for AI coding assistants. One-sentence install: paste install URL to your agent. Supports 16 platforms across web, video, social, and search. Compatible with Claude Code, Cursor, OpenClaw, Codex, Windsurf, and any agent that can run shell commands.
Architecture: channel files implement
check()foragent-reach doctoronly. All actual data retrieval done by upstream tools directly (yt-dlp, twitter-cli, rdt-cli, xhs-cli, gh CLI, Jina Reader, feedparser, Exa). Agent-Reach is never in the runtime data path.Free access model: Twitter via Cookie auth (twitter-cli), Reddit via Cookie auth (rdt-cli), YouTube via yt-dlp, GitHub via gh CLI, web via Jina Reader, search via Exa. No API fees. Cookie auth platforms carry account ban risk; use throwaway accounts.
Security model: credentials stored in
~/.agent-reach/config.yamlat chmod 600.--safemode: list needed packages without installing.--dry-run: preview all actions.uninstall: removes credentials, skill files, and MCP config.Heavy China-platform focus: 8 of 16 platforms are Chinese (Bilibili, XiaoHongShu, Douyin, WeChat, Weibo, V2EX, Xueqiu, Xiaoyuzhou). International-first teams benefit primarily from the 8 Western platforms.
The Tool That Installs Tools Is the Tool
Agent-Reach's core insight is that the hardest part of giving AI agents internet access is not any one platform integration. It is the accumulated overhead of configuring sixteen different tools, each with its own authentication, each with its own CLI interface, each with its own breaking changes as platforms evolve. Agent-Reach absorbs that overhead and surfaces it as a maintained, tested, versioned package with a diagnostic command that tells you what is working and what is not.
The scaffolding-not-framework choice means Agent-Reach ages better than a wrapper framework would. When yt-dlp releases a new version, Agent-Reach users benefit automatically. When Reddit changes its Cookie format and rdt-cli updates to handle it, Agent-Reach users get the fix by updating rdt-cli. The upstream tool ecosystem absorbs the platform maintenance. Agent-Reach absorbs the configuration overhead. The agent does the work.
References
Agent-Reach GitHub Repository, Panniantong, MIT
twitter-cli, 2.1k stars — Cookie-auth Twitter access
rdt-cli, 304 stars — Cookie-auth Reddit access
yt-dlp, 154k stars — Universal video downloader + transcript extraction
Jina Reader, 9.8k stars — LLM-ready web page extraction
Agent-Reach (Panniantong/Agent-Reach, MIT, 20.3k stars, v1.4.0) is a scaffolding tool (explicitly not a framework) that gives AI coding assistants internet access by installing and configuring sixteen upstream platform tools in a single one-sentence agent instruction. The core architectural decision: channel files implement only a check() method for the agent-reach doctor diagnostic command; all actual platform access is done by upstream tools directly (yt-dlp for video, twitter-cli for Twitter, rdt-cli for Reddit, xhs-cli for XiaoHongShu, gh CLI for GitHub, Jina Reader for web pages, Exa for semantic search). After installation, a SKILL.md registered in the agent's skills directory teaches the agent which tool to use for which task, and Agent-Reach never appears in the runtime data path again. The tool supports 16 platforms across web, video, social, search, and Chinese-ecosystem sources, with zero API fees via Cookie-based authentication for paid-API platforms (with documented account ban risk requiring throwaway accounts). Security model: credentials stored at chmod 600 locally, --safe mode for audit-before-install, full uninstall with agent-reach uninstall.
Sponsored Ad
If you enjoy practical AI insights, check out SnackOnAI and support the newsletter by subscribing, sharing, and exploring our sponsored ad — it helps us keep building and delivering value 🚀
How owning AI deployment expands your career
Across product, ops, and CX teams, a new kind of role is taking shape: the person responsible for making AI actually work, day to day.
On July 16, three people living this shift join a live roundtable: Simone Santiago Broad (Yoco), Yelva Espinoza (Zumba Fitness), and Fin's Dave Lynch. You'll hear what the job really looks like across industries, how they carved out these roles, the skills they'd hire for, and the challenges they're tackling now. Bring your questions, since the best moments happen live.
Register for the roundtable to save your spot.


