
AI 에이전트에게 브라우저 제어를 맡겨본 적이 있는가. 스크린샷을 찍어서 보내면 토큰이 순식간에 증발하고, DOM을 그대로 긁어오면 불필요한 정보까지 잔뜩 들어온다. PinchTab은 이 문제를 해결한다.
12MB Go 바이너리 하나로 HTTP API를 통해 Chrome을 제어하며, 페이지당 약 800 토큰으로 필요한 정보만 추출할 수 있다. 스크린샷 기반 접근 대비 5-13배 저렴하다.
1. 왜 PinchTab인가
기존 방식의 문제
AI 에이전트가 웹을 이용할 때:
- 스크린샷 방식 - 이미지 토큰 비용이 비싸다. 한 페이지에 10,000+ 토큰 소모
- HTML 파싱 - 불필요한 태그, 스크립트, 스타일까지 전부 들어온다
- Playwright/Puppeteer - 무겁고, 에이전트가 사용하기에 복잡하다
- Selenium - 느리고, 설정이 번거롭다
PinchTab의 접근
pinchtab nav https://example.com
pinchtab snap -i -c
pinchtab text
- 텍스트 추출: 페이지당 ~800 토큰
- 안정적 참조: 좌표 대신 요소 ID로 상호작용
- HTTP API: 어떤 언어/도구에서든 호출 가능
- 자체 포함: 12MB 바이너리, 외부 의존성 없음
2. 핵심 기능
2.1 토큰 효율적 텍스트 추출
PinchTab의 가장 큰 장점은 토큰 효율성이다.
| 방식 | 토큰 소모 (페이지당) |
|---|---|
| 스크린샷 | 10,000+ |
| HTML 그대로 | 5,000-15,000 |
| PinchTab text | ~800 |
pinchtab nav https://news.example.com/article
pinchtab text
핵심 콘텐츠만 깔끔하게 추출된다. 광고, 네비게이션, 푸터는 제외.
2.2 안정적 요소 참조 시스템
좌표 기반 클릭은 깨지기 쉽다. 레이아웃이 바뀌면 끝이다. PinchTab은 접근성 트리 기반 참조를 사용한다.
pinchtab snap -i
출력 예시:
[e5] 버튼 - "로그인"
[e6] 입력필드 - "이메일"
[e7] 입력필드 - "비밀번호"
[e8] 링크 - "비밀번호 찾기"
이 참조로 상호작용:
pinchtab fill e6 "user@example.com"
pinchtab fill e7 "mypassword"
pinchtab click e5
2.3 멀티 인스턴스
여러 Chrome 프로세스를 격리된 프로파일로 병렬 실행할 수 있다.
# 인스턴스 생성
curl -s -X POST http://localhost:9867/instances/launch \
-H "Content-Type: application/json" \
-d '{"name":"work","mode":"headless"}'
# 각 인스턴스는 독립적인 상태 유지
curl http://localhost:9867/instances
용도:
- 여러 계정 동시 관리
- 병렬 스크래핑
- 테스트 환경 격리
2.4 스텔스 모드
봇 탐지를 우회하는 스텔스 인젝션을 지원한다. 주요 기능:
- WebDriver 플래그 숨김
- 자동화 탐지 회피
- 인간처럼 보이는 브라우저 핑거프린트
2.5 프로파일 지속성
로그인 상태를 유지할 수 있다.
# 프로파일 지정하여 인스턴스 시작
curl -s -X POST http://localhost:9867/instances/start \
-H "Content-Type: application/json" \
-d '{"profileId":"alice","mode":"headless"}'
한 번 로그인하면 쿠키, 로컬 스토리지, 세션이 저장된다. 다음 실행 시 로그인 불필요.
3. 설치 및 시작
Docker (권장)
docker run -d -p 9867:9867 pinchtab/pinchtab
macOS / Linux
curl -fsSL https://pinchtab.com/install.sh | bash
npm
npm install -g pinchtab
시작하기
# 서버 시작
pinchtab
# 다른 터미널에서 제어
pinchtab nav https://pinchtab.com
pinchtab snap -i -c
pinchtab text
4. CLI 명령어
기본 명령어
| 명령 | 설명 |
|---|---|
pinchtab | 서버 시작 |
pinchtab nav <URL> | URL로 이동 |
pinchtab snap | 스냅샷 가져오기 |
pinchtab snap -i | 인터랙티브 요소만 |
pinchtab snap -c | 컴팩트 형식 |
pinchtab click <ref> | 요소 클릭 |
pinchtab fill <ref> <text> | 폼 채우기 |
pinchtab type <ref> <text> | 텍스트 입력 |
pinchtab press <key> | 키 입력 |
pinchtab text | 텍스트 추출 |
pinchtab ss | 스크린샷 |
pinchtab tabs | 탭 목록 |
pinchtab eval <js> | JavaScript 실행 |
스냅샷 필터
pinchtab snap --filter interactive # 클릭 가능한 요소만
pinchtab snap --filter visible # 화면에 보이는 요소만
pinchtab snap --filter all # 모든 요소
5. HTTP API
인스턴스 관리
# 인스턴스 생성
INST=$(curl -s -X POST http://localhost:9867/instances/launch \
-H "Content-Type: application/json" \
-d '{"name":"work","mode":"headless"}' | jq -r '.id')
# 탭 열기
TAB=$(curl -s -X POST http://localhost:9867/instances/$INST/tabs/open \
-H "Content-Type: application/json" \
-d '{"url":"https://pinchtab.com"}' | jq -r '.tabId')
# 스냅샷
curl "http://localhost:9867/tabs/$TAB/snapshot?filter=interactive"
# 클릭
curl -X POST "http://localhost:9867/tabs/$TAB/action" \
-H "Content-Type: application/json" \
-d '{"kind":"click","ref":"e5"}'
주요 엔드포인트
| 엔드포인트 | 설명 |
|---|---|
POST /instances/launch | 인스턴스 생성 |
GET /instances | 인스턴스 목록 |
POST /instances/:id/tabs/open | 탭 열기 |
GET /tabs/:id/snapshot | 스냅샷 |
POST /tabs/:id/action | 액션 실행 |
GET /tabs/:id/text | 텍스트 추출 |
6. 아키텍처
구성 요소
- Server: 메인 프로세스. 프로파일, 인스턴스, 라우팅, 대시보드 관리
- Instance: 실행 중인 Chrome 프로세스
- Profile: 브라우저 상태 (쿠키, 히스토리, 로컬 스토리지)
- Tab: 웹페이지
- Bridge: 단일 인스턴스 런타임 (서버가 자동 관리)
런타임 모드
pinchtab # 서버 모드 (대부분 이것만 필요)
pinchtab server # 서버 모드 (명시적)
pinchtab bridge # 브리지 모드 (고급 사용)
보안 기본값
PinchTab은 로컬 퍼스트 보안을 기본으로 한다:
server.bind = 127.0.0.1(로컬만 접근)- 민감한 엔드포인트는 기본 비활성화
- Attach 모드 기본 비활성화
- IDPI (Indirect Data Prompt Injection) 방어 기본 활성화
7. 실제 사용 시나리오
웹 스크래핑
pinchtab nav https://news.example.com
pinchtab snap -i
pinchtab text > article.txt
로그인 자동화
pinchtab nav https://example.com/login
pinchtab snap -i
pinchtab fill e6 "user@example.com"
pinchtab fill e7 "password123"
pinchtab click e8
병렬 처리
# docker-compose.yml
services:
pinchtab-1:
image: pinchtab/pinchtab
ports:
- "9867:9867"
environment:
- BRIDGE_HEADLESS=true
pinchtab-2:
image: pinchtab/pinchtab
ports:
- "9868:9867"
environment:
- BRIDGE_HEADLESS=true
8. 다른 도구와의 비교
| 기능 | PinchTab | Playwright | Selenium | Puppeteer |
|---|---|---|---|---|
| 토큰 효율성 | 높음 | 중간 | 낮음 | 중간 |
| 바이너리 크기 | 12MB | ~100MB+ | ~50MB+ | ~100MB+ |
| 스텔스 모드 | 지원 | 미지원 | 미지원 | 미지원 |
| 멀티 인스턴스 | 지원 | 지원 | 지원 | 제한적 |
| HTTP API | 기본 | 래퍼 필요 | 래퍼 필요 | 래퍼 필요 |
| 프로파일 지속성 | 기본 | 수동 설정 | 수동 설정 | 수동 설정 |
| ARM64 지원 | 최적화 | 지원 | 지원 | 지원 |
9. 언제 사용해야 하나
추천 상황
- AI 에이전트가 브라우저 제어 필요 - 토큰 효율성이 중요
- 동적 콘텐츠 스크래핑 - SPA, JavaScript 렌더링 페이지
- 로그인 상태 유지 - 세션 지속성 필요
- 병렬 브라우저 작업 - 여러 계정/작업 동시 처리
- 봇 탐지 우회 - 스텔스 모드 필요
비추천 상황
- 단순 정적 페이지 -
web_fetch나 Jina Reader가 더 간단 - 복잡한 테스트 자동화 - Playwright가 더 강력한 테스트 기능 제공
- 크로스 브라우저 테스트 - Chrome/Chromium만 지원
10. SMCP 플러그인
PinchTab은 SMCP (Model Context Protocol) 플러그인을 제공한다. AI 에이전트가 MCP를 통해 PinchTab을 제어할 수 있다.
# 플러그인 설정
export PINCHTAB_MCP_ENDPOINT=http://localhost:9867
15개 도구 노출:
pinchtab__navigatepinchtab__snapshotpinchtab__action- …
자세한 내용: plugins/README.md
마치며: 브라우저 자동화의 새로운 표준
PinchTab은 **“AI 에이전트를 위한 브라우저”**라는 명확한 목표를 가지고 설계되었다.
핵심 가치
- 토큰 효율성 - 800 토큰/페이지로 비용 절감
- 단순성 - 12MB 바이너리,
pinchtab하나로 시작 - 안정성 - 접근성 기반 참조, 좌표 불필요
- 확장성 - 멀티 인스턴스, 프로파일 격리
- 보안 - 로컬 퍼스트, IDPI 방어
빠른 시작
docker run -d -p 9867:9867 pinchtab/pinchtab
curl http://localhost:9867/health
AI 에이전트를 개발 중이라면, PinchTab을 시도해보라. 브라우저 제어가 한결 수월해질 것이다.
🔗 관련 정보
- GitHub: https://github.com/pinchtab/pinchtab
- 공식 문서: https://pinchtab.com/docs
- Docker Hub: https://hub.docker.com/r/pinchtab/pinchtab
- 설치 스크립트: https://pinchtab.com/install.sh