Agent-Reach는 AI 에이전트(Claude Code, Cursor, Windsurf 등)에게 인터넷 접근 능력을 부여하는 오픈소스 CLI 도구입니다. 트위터·유튜브·레딧·GitHub·빌리빌리·샤오홍슈 등 15개 이상의 플랫폼을 API 키 없이(또는 최소 설정으로) 검색하고 읽을 수 있게 해줍니다. 핵심 철학은 "글루 레이어(Glue Layer)" — 자체 구현 없이 이미 검증된 오픈소스 도구들(yt-dlp, bird CLI, gh CLI)을 조합해줍니다.
지금까지 Claude Code 같은 AI 에이전트는 코드와 파일은 잘 다루지만, 인터넷은 "볼 수 없었습니다." Agent-Reach는 AI 에이전트에게 실제 인터넷 창문을 열어주는 안테나를 설치합니다.
중요한 것은 Agent-Reach 자신이 YouTube나 Twitter를 직접 구현하지 않는다는 점입니다. 대신 이미 186k 스타를 받은 yt-dlp 같은 검증된 도구들을 설치·설정해주고, 에이전트가 그 도구들을 직접 호출하게 합니다.
Claude Code, Cursor 등으로 코딩하는 개발자가 폭증했지만, AI 에이전트가 실제 인터넷 콘텐츠에 접근하려면 플랫폼마다 별도 API 키를 발급받고, 각기 다른 SDK를 설치하고, 인증 로직을 직접 짜야 합니다. 중국 플랫폼(샤오홍슈, 빌리빌리 등)은 서구 도구로는 거의 접근이 불가능합니다.
⚠️ PyPI의 agent-reach는 이 프로젝트가 아닙니다. README가 "不要从 PyPI 安装同名包,它不是本项目"(PyPI 동명 패키지를 설치하지 말 것, 이 프로젝트가 아님)라고 못 박고 있습니다. 정식 경로는 깃허브 아카이브를 pipx로 넣는 것입니다 — pipx install https://github.com/Panniantong/agent-reach/archive/main.zip. 이후 agent-reach doctor로 각 채널 상태를 진단하고, Tier 0(제로 설정) 채널부터 즉시 쓸 수 있습니다. 중국 플랫폼까지 커버하는 드문 무료 오픈소스 도구입니다.
| 비교 항목 | Agent-Reach | 일반 웹 스크래핑 | 플랫폼별 API 직접 |
|---|---|---|---|
| 설정 난이도 | 원커맨드 설치 | 플랫폼별 개별 설정 | API 키 발급/관리 필요 |
| 비용 | 무료 (대부분) | 도구마다 다름 | API 과금 가능 |
| 플랫폼 수 | 15+ | 범용이지만 제한적 | 1개씩 개별 연동 |
| AI 에이전트 통합 | 네이티브 지원 | 추가 작업 필요 | 추가 작업 필요 |
| 중국 플랫폼 | 샤오홍슈·빌리빌리 (더우인은 2026-06 제거) | 어렵거나 불가 | 사실상 불가 |
| GitHub 스타 | ⭐ 73.8k (08-22) | 도구마다 다름 | N/A |
| 기술 | 역할 | 비고 |
|---|---|---|
| Python 3.10+ | 메인 언어 | 타입힌트 적극 활용 |
| argparse | CLI 인터페이스 | 10+ 서브커맨드 |
| Rich | 터미널 출력 포맷팅 | 컬러·테이블·프로그레스 |
| loguru | 로깅 | 구조화된 로그 |
| PyYAML | 설정 파일 관리 | ~/.agent-reach/config.yaml |
| python-dotenv | 환경변수 관리 | .env 파일 지원 |
| Hatchling | 빌드 시스템 | pyproject.toml 기반 |
| Ruff | 린팅 + 포맷팅 | 100자 라인 제한 |
| MyPy | 정적 타입 체크 | 개별 warn 옵션 조합 (strict=true 아님) |
| requests | HTTP 클라이언트 | 핵심 런타임 의존성 |
| yt-dlp[default] | 동영상·자막 추출 | 패키지에 동봉됨 |
| 도구 | GitHub 스타 | 담당 플랫폼 | 설치 방식 |
|---|---|---|---|
| Jina Reader | 11.9k | 모든 웹페이지 | curl 기반 (설치 불필요) |
| yt-dlp | 186k | YouTube | pip |
| bili-cli | — | Bilibili | pip |
| twitter-cli | — | Twitter/X | npm |
| bird CLI | — | Twitter/X (레거시) | npm |
| GitHub CLI (gh) | — | GitHub | 시스템 패키지 |
| feedparser | 2.4k | RSS/Atom 피드 | pip |
| xiaohongshu-mcp | 15.4k | 샤오홍슈 | Docker + MCP |
| Exa AI | — | 시맨틱 검색 | MCP via mcporter |
from abc import ABC, abstractmethod
from typing import Tuple, List
class Channel(ABC):
name: str = ""
description: str = ""
backends: List[str] = [] # 순서 있는 후보 목록 — [0]이 우선 백엔드
tier: int = 0 # 0=무설정, 1=무료 키·쿠키 필요, 2=고급 설정
active_backend: Optional[str] = None # check()가 실측해 채우는 실제 사용 백엔드
@abstractmethod
def can_handle(self, url: str) -> bool:
"""이 채널이 해당 URL을 처리할 수 있는지 판단"""
...
def ordered_backends(self, config=None) -> List[str]:
"""<채널>_backend 설정값으로 우선순위를 재정렬"""
...
def check(self, config=None) -> Tuple[str, str]:
"""가용성 확인. 상태는 ok / warn / off / error 4종이며
서브클래스는 실측 후 active_backend 를 채워야 한다"""
...
※ 위 정의는 2026-08-22 시점 agent_reach/channels/base.py(71줄) 기준입니다.
백엔드 폴백 순서를 다루는 ordered_backends()와 실제 사용 백엔드를 기록하는
active_backend는 v1.5.0 전후로 추가됐습니다.
can_handle()은 abstract(반드시 구현) — URL 기반 라우팅으로 어떤 채널이 어떤 URL을 담당하는지 자동 판별합니다. check()는 기본 구현 제공(오버라이드 가능) — 템플릿 메서드 패턴으로 채널별 커스텀 가용성 확인이 가능합니다.| Tier | 의미 | 예시 채널 |
|---|---|---|
| 0 | 설치 즉시 사용 (제로 설정) | Jina Reader, YouTube, RSS, GitHub, V2EX, Exa 검색 |
| 1 | 무료 API 키, 쿠키 또는 로그인 필요 | Twitter(쿠키), Reddit, 샤오홍슈, 빌리빌리, 雪球(xueqiu) |
| 2 | 프록시 또는 고급 설정 필요 | LinkedIn(브라우저 자동화) |
| 파일 | 줄 수(추정) | 핵심 역할 |
|---|---|---|
| cli.py | ~2,350 | 전체 CLI의 두뇌. 설치·설정·진단 모든 것 |
| core.py | ~30 | 의외로 작음. doctor 모듈에 위임만 함 |
| doctor.py | ~100 | 15+ 채널 상태를 Rich 포맷으로 보고 |
| config.py | ~200 | YAML 설정 읽기/쓰기, 보안(600 퍼미션) |
| base.py | ~71 | ABC 패턴의 Channel 클래스 정의 |
argparse로 10개 이상의 서브커맨드를 구조화하는 방법을 배울 수 있습니다. setup, install, configure, doctor, uninstall, check-update 등 풍부한 서브커맨드 패턴은 CLI 도구 개발의 모범 사례입니다.
추상 베이스 클래스(ABC)로 채널 인터페이스를 정의하고, 구체 구현을 자유롭게 추가하는 플러그인 시스템을 배울 수 있습니다. 새 플랫폼을 지원하려면 Channel을 상속하고 can_handle()만 구현하면 됩니다.
시스템 헬스체크를 구조화하는 방법입니다. brew doctor, flutter doctor와 같은 패턴으로, 모든 채널의 상태를 한 번에 점검하고 티어별로 그룹핑하여 Rich 컬러 보고서를 생성합니다.
API 키 없이 쿠키로 플랫폼에 접근하는 방법을 배울 수 있습니다. 다만 트위터·샤오홍슈는 현재 브라우저 쿠키 자동 추출이 꺼져 있습니다 — Cookie-Editor 확장으로 손수 내보낸 뒤 agent-reach configure <플랫폼>-cookies로 등록하는 게 기본 흐름이고, browser_cookie3는 선택 의존성으로만 남았습니다. 저장 시 파일 퍼미션 600을 거는 부분은 그대로입니다.
샤오홍슈, 샤오위저우, LinkedIn 같은 플랫폼을 MCP 서비스로 연동하는 방법을 배울 수 있습니다. AI 에이전트-도구 통신 표준인 MCP가 실제 어떻게 쓰이는지 구체적 사례를 통해 이해할 수 있습니다.
"프레임워크를 만들지 않는" 접근법 — 업스트림 도구가 업데이트되면 자동으로 최신 기능을 사용할 수 있고, 디버깅 시 Agent-Reach 코드 없이 업스트림 문서만 참고하면 됩니다. 벤더 락인이 없는 설계 철학입니다.
| 요구사항 | 최소 | 권장 |
|---|---|---|
| OS | macOS / Linux / Windows(PowerShell) | macOS · Linux |
| Python | 3.10+ | 3.11+ |
| Node.js | 18+ | 20+ (mcporter 등 MCP 연동용) |
| Docker | — | Docker Desktop (MCP 서비스용) |
| 메모리 | 2GB | 4GB (Whisper 음성변환 시) |
| 디스크 | 500MB | 2GB (yt-dlp 캐시 포함) |
| 네트워크 | 필수 | 프록시 지원 (해외 플랫폼용) |
| 기능 | 필요 사항 | 비용 |
|---|---|---|
| 트위터 접근 | 트위터 계정 + 브라우저 쿠키 | 무료 |
| 레딧 접근 | Reddit 계정 + 쿠키 또는 로그인 | 무료 |
| 샤오홍슈 | 쿠키 (Docker는 선택) | 무료 |
| MCP 서버 + 브라우저 자동화 | 무료 | |
| 시맨틱 검색 | Exa AI 계정 | 무료 티어 |
# 1. 설치 (PyPI 동명 패키지는 다른 프로젝트다 — 깃허브 아카이브를 쓴다)
pipx install https://github.com/Panniantong/agent-reach/archive/main.zip
# 2. 진단 실행
agent-reach doctor
# 3. Tier 0 기능 테스트 (설치 없이 즉시)
curl https://r.jina.ai/https://github.com
목표: CLI 도구의 설치-진단 워크플로우 이해
# channels/hackernews.py
from .base import Channel
class HackerNewsChannel(Channel):
name = "hackernews"
description = "Hacker News 글 읽기"
backends = ["requests"]
tier = 0
def can_handle(self, url: str) -> bool:
return "news.ycombinator.com" in url
def check(self, config=None):
try:
import requests
r = requests.get(
"https://hacker-news.firebaseio.com/v0/topstories.json",
timeout=5
)
return ("ok", f"Top {len(r.json())} stories")
except Exception as e:
return ("error", str(e))
목표: ABC 패턴으로 플러그인 시스템 확장하기
Agent-Reach의 doctor 시스템을 참고하여, 자신의 개발 환경을 진단하는 도구를 만들어봅니다.
checks = [
("Python", "python3 --version"),
("Node.js", "node --version"),
("Docker", "docker --version"),
("Git", "git --version"),
("gh CLI", "gh --version"),
]
# 각 커맨드 실행 → ok/warn/error 분류 → Rich 테이블로 출력
목표: 시스템 명령 실행·Rich 포맷팅·구조화된 보고서 생성
Agent-Reach의 MCP 통합을 참고하여, 자신만의 MCP 서비스를 만들어봅니다. mcp[cli]를 설치하고, 간단한 MCP 서버(예: RSS 피드 읽기)를 작성한 뒤 Claude Code에서 연결 테스트를 합니다.
목표: MCP 프로토콜 이해, AI 에이전트-도구 통합
browser_cookie3를 사용하여 브라우저 쿠키를 자동 추출하고 안전하게 저장하는 시스템을 구축합니다. 쿠키 갱신·만료 감지 로직과 파일 퍼미션 600 보안 저장까지 구현합니다.
목표: 브라우저 자동화, 보안 설계, 인증 관리
| 주차 | 주제 | 핵심 학습 내용 |
|---|---|---|
| 1주차 | Python CLI 마스터 | argparse 심화 / Rich 라이브러리 / Click vs argparse vs Typer 비교 / PyYAML 설정 관리 |
| 2주차 | 플러거블 아키텍처 | ABC·Protocol·인터페이스 / 팩토리+레지스트리 패턴 / 의존성 주입 기초 |
| 3주차 | 웹 스크래핑 & API | Jina Reader 동작 원리 / yt-dlp 심화 / 쿠키·세션 인증 / 프록시 라우팅 |
| 4주차 | MCP & AI 에이전트 통합 | MCP 프로토콜 스펙 / Claude Code + MCP 연동 / Docker MCP 서비스 배포 / CLAUDE.md 작성법 |
| 키워드 | 설명 |
|---|---|
| 글루 레이어 | 여러 도구를 연결만 해주고 자체 로직은 최소화하는 아키텍처 패턴. Agent-Reach의 핵심 철학 |
| MCP | Model Context Protocol. Anthropic 주도 AI 에이전트-도구 통신 프로토콜. JSON-RPC 기반 |
| Channel | Agent-Reach에서 하나의 플랫폼(Twitter, YouTube 등)을 추상화한 단위. ABC로 정의 |
| Tier | 채널의 설정 복잡도 등급. 0(제로 설정) → 1(API 키/쿠키) → 2(프록시/고급 설정) |
| bird CLI | 트위터/X 접근용 커맨드라인 도구. 현재는 레거시(3순위) 백엔드 — 기본은 twitter-cli, 그 다음 OpenCLI, bird CLI 순 |
| Jina Reader | URL 앞에 r.jina.ai/를 붙이면 해당 웹페이지를 마크다운으로 변환해주는 무료 서비스 |
| yt-dlp | youtube-dl의 포크. 1,800+ 플랫폼에서 동영상/자막을 다운로드하는 도구 (⭐ 186k) |
| feedparser | RSS/Atom 피드를 파싱하는 서드파티 Python 라이브러리 (pip install feedparser) |
| Exa AI | 시맨틱(의미 기반) 웹 검색 엔진. 키워드가 아니라 의미로 검색 |
| OpenCLI | 로그인된 크롬 세션을 그대로 빌려 쓰는 중간 계층. 트위터·레딧·페북·인스타의 폴백 백엔드 |
| browser_cookie3 | Python에서 Chrome/Firefox 쿠키를 프로그래밍 방식으로 추출하는 라이브러리 |
| Rich | Python 터미널 출력을 아름답게 포맷팅하는 라이브러리. 테이블·컬러·프로그레스바 |
| loguru | Python logging 모듈 대체 간편 로깅 라이브러리. from loguru import logger 한 줄로 시작 |
| doctor 패턴 | 시스템 전체 상태를 진단·보고하는 CLI 명령어 패턴. brew doctor, flutter doctor와 같은 패턴 |
| Hatchling | 현대적인 Python 빌드 시스템. pyproject.toml 기반 |
| Ruff | Rust로 작성된 초고속 Python 린터+포맷터. Black + isort + Flake8을 하나로 |