Claude Code·Codex 구독으로 돌리는 자동 세일즈 에이전트
좋아요 · 후기 쓰기
이 글의 목차 · 29개 항목
Harvey
Claude Code 또는 Codex 구독에서 실행되는 자율형 영업 에이전트.
Harvey는 판매할 만한 가치를 지닌 회사를 찾아내고, 각 회사에 대한 구체적인 정보를 하나씩 학습한 뒤, 그것을 언급한 콜드 이메일을 작성해 보내고, 답장을 읽고, 대화를 미팅으로 이어가도록 작업합니다. 이 에이전트는 당신의 머신에서, 독립적으로, 루프를 돌며 실행됩니다.
특이한 점은 모델 API 청구가 없다는 것입니다. Harvey는 Claude Code를 통해 당신의 Claude Pro 또는 Max 구독을 사용하거나, Codex를 통해 당신의 ChatGPT 구독을 사용합니다. 모델 호출은 별도의 API 키나 토큰당 API 과금 없이, 이미 지불 중인 요금제에서 처리됩니다. 기본값은 Claude이며, Codex는 macOS와 Linux에서 선택적 제공자입니다.
$ harvey run
============================================================
Harvey is online. Always Be Closing.
============================================================
Checking pipeline state...
Decision: handle_replies (2 new replies)
handler → Elena Park, Harbor Dental Studio interested, answer drafted
handler → Priya Nair, Highline Roofing objection, answer drafted
Decision: write_campaign (3 new prospects with no drafts)
writer → 2-email sequence: Phoenix HVAC hiring a dispatcher
outbox → 5 emails waiting for your approval
Cycle complete. Sleeping for 15 minutes.그리고 localhost:5555에서 유지되는 대시보드입니다. 순서는 다음과 같습니다. Today 화면, 잠재 고객이 계약서를 요청해서 Harvey가 사람에게 돌려보낸 대화, 발신함에서 초안 답장을 승인하는 화면, 신호를 확인하는 화면, 확인된 신호로 코호트를 만드는 화면, 연락처 검색 화면, 그리고 다크 모드의 동일한 화면입니다:

데모 데이터는 가공된 것입니다: 지붕공사업체, 치과 진료소, HVAC 업체를 대상으로 온라인 예약을 판매하는 "Bookwell"이며, .test 도메인을 사용합니다.
목차
- 구독 방식이 중요한 이유
- Harvey가 실제로 하는 일
- 빠른 시작
- 무엇을 찾을지 당신이 확인합니다
- 잠재 고객 발굴 파이프라인
- 스킬 라이브러리
- 서브 에이전트
- 당신의 승인 없이는 아무것도 전송되지 않습니다
- 대시보드
- 데이터 저장 방식
- 설정
- 대신 ChatGPT 플랜 사용하기(Codex)
- 법적 사항과 전달 가능성
- 문제 해결
- 프로젝트 구조
- 철학
- 로드맵
구독 방식이 중요한 이유
다른 모든 자율형 영업 에이전트는 토큰당 요금을 청구합니다. 그들이 그런 비용을 받는 이유는 이것이 전부입니다. 하루 종일 루프를 돌며 생각하는 에이전트는, 결국 하루 종일 루프를 돌며 API 크레딧을 소모하는 에이전트이기 때문입니다. 공급업체들은 더 짧은 프롬프트, 더 싼 모델, 더 적은 반복 횟수로 이런 문제를 해결합니다.
Harvey는 당신이 선택한 제공자에 대해 구독 기반 CLI를 사용합니다. Claude Code용 claude, 또는 Codex용으로 분리된 codex app-server입니다. 둘 다 모델 도구가 비활성화된 상태로 텍스트를 반환합니다. Harvey는 잠재 고객 발굴과 메일 작업을 자체적으로 처리합니다.
Claude 호출은 당신 자신의 Claude Code 설정과는 무관하게 실행됩니다. CLAUDE.md(당신의 것, 프로젝트의 것, 또는 상위 폴더의 것)도 없고, hooks, skills, plugins, MCP 서버나 설정 파일도 없으며, 도구도 없고, 비어 있는 임시 폴더에서 실행되며, Claude transcript에 아무것도 저장되지 않습니다. 당신의 로그인 상태(구독 또는 claude setup-token)와 관리자 관리 정책은 여전히 적용됩니다. 이 기능은 --safe-mode를 지원하는 Claude CLI가 필요하며, 더 오래된 버전에서는 Harvey가 비격리 상태로 프롬프트를 보내는 대신 멈추고 claude update를 실행하라고 안내합니다. 자격 증명이나 네트워크 없이, 설치된 CLI를 오프라인으로 확인하려면: HARVEY_CLAUDE_CLI_TESTS=1 pytest tests/test_claude_cli_isolation.py.
선택한 구독은 사용량 한도 내에서 모델 호출을 포함합니다. 덕분에 Harvey는 별도의 모델 API 청구 없이도 개인화와 응답 처리를 위해 스킬 라이브러리를 사용할 수 있습니다.
비용은 다음과 같습니다:
| Claude Pro/Max 또는 Codex 액세스가 있는 ChatGPT 요금제 | 기존 구독 |
|---|---|
| 비즈니스 찾기 | 기본 소스에서는 \$0, 또는 가장 저렴한 유료 소스에서는 1,000개당 약 ~\$0.37 |
| 웹사이트 읽기 | \$0 — 각각 HTTP 요청 3번, 모델 호출 없음 |
| 작성 및 전송 | 구독료 + 메일함(~\$7/mo Google Workspace) |
| 잠재 고객 발굴 도구 | 없음. Apollo도, ZoomInfo도, Clearbit도, Clay도 없음. |
비교하자면 Harvey가 대체하는 도구들은 월 \$250–500부터 시작합니다. 그리고 이 도구들이 가장 약한 지점은 바로 Harvey가 가장 강한 영역인, 5~50명 규모의 소규모 지역 비즈니스입니다. 이 구간에서는 단일 공급자 기준 연락처 커버리지가 약 30%에서 한계에 이르고, 초소형 비즈니스는 아예 빠져 있는 경우가 많습니다.
Harvey는 자체적으로도 예산을 관리합니다. 활성 공급자의 구독 할당량을 읽고, 사용자의 Claude 또는 Codex 작업을 위한 여유를 남기도록 호출을 제한합니다. 어느 공급자든 max_daily_claude_percent: 80로 설정하세요. 설정 이름은 Codex 지원보다 먼저 만들어졌습니다. 할당량을 읽을 수 없으면 Harvey는 이를 사용할 수 없음으로 보고하고, 일일 호출 예산으로 대체합니다.
Harvey는 사용자의 로그인으로 로컬에서 실행됩니다. 선택한 공급자의 약관과 사용 한도를 확인하세요.
Harvey가 실제로 하는 일
Harvey는 하트비트를 돕니다. 깨어나서, 예산을 확인하고, 가장 해야 할 일을 결정한 뒤, 실행하고, 기록하고, 다시 잠듭니다. 기본값은 15분마다입니다.
┌──────────────────────────────────────┐
↓ │
Wake → Quiet hours? → Budget OK? → Decide → Act → Log → Sleep
│ │
(sleep) (sleep)무엇을 할지는 모델에게 물어보지 않고 결정론적으로 정합니다. 그렇게 하면 네 가지 수치로도 유도할 수 있는 일에 호출 하나를 낭비하게 되기 때문입니다.
handle replies > send campaigns > write campaigns > prospect > idle (analyze)프로파일링과 아웃박스 비우기는 어차피 아무 비용이 들지 않고 정해진 일정에 따라 수행해야 하므로, 매 사이클마다 항상 함께 진행됩니다.
빠른 시작
사전 요구 사항
- Python 3.11+ —
python3 --version으로 확인하세요. macOS에는 3.9가 기본으로 포함되어 있습니다. 만약 그렇다면 먼저brew install python@3.13을 실행하세요. - 활성화된 Claude Pro 또는 Max 구독과, CLI에 로그인된 상태(
claude login) — 또는 선택적으로 ChatGPT 요금제와 Codex CLI (아래 참조) - 발신에 사용할 메일함 — Gmail/Workspace를 권장하며, 전용 보조 도메인을 사용하는 것이 좋습니다. Microsoft 365도 가능합니다(설정)
가장 쉬운 방법: Claude가 직접 설정하게 하기
git clone https://github.com/ethanplusai/harvey.git
cd harvey
claude그다음 "set up Harvey for me"라고 말하세요. 이 저장소에는 CLAUDE.md가 포함되어 있어 Claude Code를 설정 마법사로 바꿔 줍니다. 현재 상태를 확인하고, 부족한 것을 설치하고, 필요한 정보를 물어보고, 당신의 제품에 맞게 Harvey를 학습시킵니다.
또는 직접 설정하기
# 1. Install — note python3.13, not python3. On macOS bare `python3` is the
# system 3.9, and a venv built from it can't run Harvey.
python3.13 -m venv .venv && source .venv/bin/activate && pip install -e .
# 2. Configure — every variable is documented inline with where to get it
cp .env.example .env && $EDITOR .env
# 3. Learn your product from your website (writes harvey.local.yaml; re-running
# it updates the product, targeting and company and keeps your other settings)
harvey train https://your-company.com
# 4. Choose what makes a good prospect (see below — this one matters)
harvey signals --confirm free
# 5. Find businesses. Free source, no account needed.
harvey discover
# 6. Watch it work
harvey dashboard # prints a private link to http://127.0.0.1:5555
harvey run사용자가 확인하는 대상
이 부분이 Harvey를 블랙박스와 다르게 만드는 요소이며, 의도적으로 건너뛸 수 없게 되어 있습니다.
Harvey는 비즈니스에 대한 23개 신호를 수집하는 방법을 알고 있습니다. 하지만 사용자가 허용하기 전까지는 어떤 신호도 수집하지 않습니다. 첫 실행 시에는 카탈로그를 제안하며, 대시보드 또는 터미널에서 각 항목을 확인, 건너뛰기, 거부할 수 있습니다:
harvey signals # review the catalog
harvey signals --confirm free # everything that costs nothing (21 of them)
harvey signals --confirm SERP_RANK # a paid one, opted into explicitly각 신호에는 쉬운 설명, 비용, 그리고 이미 해당 신호를 보유한 회사 수가 표시됩니다.
| 신호 | 의미 |
|---|
| 발견 | SERP_RANK | 자기 핵심 검색어에서의 순위입니다. 11~30위가 가장 좋은 구간입니다. 충분히 보이지만, 아직 부족한 상태이기 때문입니다. |
|---|---|---|
NO_WEBSITE | 등록 정보와 전화번호는 있지만 사이트는 없습니다. 웹사이트를 판매한다면, 존재하는 것 중 가장 강한 의도 신호입니다. | |
UNCLAIMED_LISTING | 아무도 Google Business Profile을 소유권 주장하지 않았습니다. | |
REVIEW_RATING / REVIEW_COUNT | 좋지만 보이지 않거나, 보이지만 고전하고 있습니다. | |
| 프로필 | INCUMBENT_AGENCY | 현재 계정을 맡고 있는 곳이며, 자체 푸터에 크레딧이 표시됩니다. 모든 탐지 결과는 하나의 전체 영업 대상 목록으로 타깃팅할 수 있는 명단을 만들어 냅니다. |
RUNNING_GOOGLE_ADS / RUNNING_META_ADS | 그들은 지금 이 순간 고객 확보에 돈을 쓰고 있습니다. 무료로 얻을 수 있는 가장 강력한 예산 신호입니다. | |
NO_ONLINE_BOOKING | 리드를 전화로만 받아야 하므로, 영업시간 외 수요는 놓치게 됩니다. | |
NO_SCHEMA_MARKUP | 이메일에서 직접 언급할 수 있는, 구체적이고 확인 가능한 SEO 공백입니다. | |
BLOG_STALE | 콘텐츠 마케팅을 시작했다가 중단했습니다. | |
SITE_PAGE_COUNT, TECH_STACK, BLOCKS_AI_CRAWLERS, HIRING_ROLE | 규모, 플랫폼, AI 검색 가시성, 그리고 채용 중인 직무입니다. | |
| 사람 | CONTACT_FOUND, DECISION_MAKER_TITLE, LIKELY_OWNER, REGISTRY_VERIFIED | 누가 결정권자인지, 그리고 그들이 실제 소유자인지입니다. |
| 연락처 | EMAIL_PATTERN, EMAIL_STATUS, CONTACT_FORM_URL | 실제로 연락이 가능한지 여부입니다. |
그런 다음 코호트는 목록이 아니라 쿼리입니다
신호를 확인하면 대시보드의 코호트 빌더가 이를 타깃 집합으로 바꿉니다. 좋은 잠재고객이 반드시 가져야 하는 것과 제외 조건을 선택하면, 일치하는 항목 수를 실시간으로 집계합니다:
Has a marketing agency AND running Google Ads AND NOT already has online booking
→ 23 companies그렇게 해서 이유가 분명한 캠페인이 됩니다. 목록에 있는 23개 항목이 각각 왜 들어갔는지 정확히 알 수 있고, Harvey가 작성한 이메일도 그 사실을 반영합니다.
잠재고객 발굴 파이프라인
4단계로 구성됩니다. 각 단계는 독립적으로 실행되고, 안전하게 재실행할 수 있으며, 비용을 명시합니다.
1. DISCOVER — 누가 존재하는가
비용이 발생하는 유일한 단계이므로, 항상 먼저 추정만 하고, 사용자가 실행을 누르기 전까지는 아무 작업도 하지 않습니다.
harvey discover --providers # the menu, with real prices
harvey discover --estimate # projected spend, then exits
harvey discover # go| 출처 | 비용 | 무료 티어 | 적합한 용도 |
|---|
| OpenStreetMap (기본값) | 무료 | 무제한, 계정 불필요 | 비용을 내기 전에 전체 파이프라인을 먼저 시험해 보려는 경우입니다. 매장 없는 사업체에 대한 커버리지는 얇습니다. OSM은 건물을 지도에 올리므로, 전체 업종은 거의 나타나지 않습니다(미국 전체에서 지붕공사업자는 2,000명 미만, 배관공은 2,300명 미만). Harvey는 이를 조용히 부족하게 제공하지 않고 UI에서 그렇게 명시합니다. |
|---|---|---|---|
| DataForSEO Business Listings | \$0.372 / 1,000 | \$1 크레딧 | 지역 서비스업, 병원, 계약업체. 전화번호, 도메인, 평점, 등록 확인 상태 — 그리고 아예 웹사이트가 없는 업체도 필터링할 수 있습니다. |
| DataForSEO SERP | \$0.0018 / 검색 | \$1 크레딧 + 무료 샌드박스 | 구매 신호로서의 순위. |
| Serper | ~\$0.30–1.00 / 1,000 | 2,500 무료, 카드 불필요 | 가장 쉽게 시도해 볼 수 있는 유료 옵션입니다. |
스타트업에 판매하시나요? Harvey에는 YC 스타트업용 스킬이 기본 내장되어 있으며, 다음 세 부분으로 구성됩니다:
- 검색:
harvey discover --preset yc --provider serper또는 Discover 탭의 Look for: YC startups를 사용하면, 기업의 자체 웹사이트에 Y Combinator 지원 사실이 표시된 회사를 업종별로 검색합니다. - 신호:
YC_BACKED(Signals 탭)를 켜면 해당 회사에 태그를 붙이고, 사이트에 배치 정보가 있을 경우 배치도 함께 표시합니다(W24, S23). 홈페이지와 About 페이지에서 회사의 자체 YC 페이지에 대한 참조나 회사가 직접 그렇게 말하는 문구("we went through Y Combinator", "YC W24")를 읽어내며, "trusted by YC-backed startups" 같은 고객 문구는 보지 않습니다. 많은 YC 회사가 자기 사이트에 이를 전혀 언급하지 않기 때문에, 실제로 언급하는 회사들만 찾아냅니다. YC 프리셋 검색 결과도 yes로 간주됩니다. - 작성: 해당 잠재고객에 대해 작성기와 응답 처리기가 창업자에게 쓰는 데 맞춘 플레이북인
skills/selling_to_startups.md를 사용합니다.
Harvey는 ycombinator.com 자체를 읽지 않습니다. 해당 약관은 이를 스크래핑하거나 창업자의 연락처 정보를 수집하는 것을 금지하기 때문입니다. 모든 정보는 회사 자체 사이트와 검색 제공업체에서 가져옵니다.
도시는 스스로 지오코딩됩니다(한 번 조회하면 영구 캐시). 디렉터리, 집계 사이트, 기관은 차단 목록이 아니라 패턴으로 필터링됩니다. en.wikipedia.org와 biz.yelp.com은 아예 포함되지 않습니다.
깊이 20~30이면 충분하지, 100은 아닙니다. Google은 2025년 9월에 한 페이지당 100개 결과 표시를 제거했으므로, 이제 깊이 100은 대부분의 곳에서 사실상 10페이지 분량으로 청구됩니다. 30위 아래는 어차피 대부분 디렉터리입니다.
2. PROFILE — 그들이 누구인지
무료. 비즈니스당 HTTP 요청 3회. 브라우저도, 모델 호출도 없습니다. 이 단계는 전체 시스템에서 노력 대비 가치가 가장 높은 단계입니다. 이메일을 구체적으로 만들어 주는 사실들을 생성하기 때문입니다.
Scout, Profile, 그리고 로컬 학습 크롤러의 웹사이트 요청은 공개 HTTP(S) 목적지로만 제한됩니다. 모든 DNS 응답과 리디렉션을 검사하며, 로컬·사설·링크 로컬·메타데이터 주소는 거부합니다. 연결은 검증된 IP를 사용하되 웹사이트의 TLS 아이덴티티는 유지합니다. 이 웹사이트 클라이언트들은 환경 프록시를 무시하므로, 프록시 라우팅으로 이 경계를 우회할 수 없습니다.
홈페이지, robots.txt, sitemap.xml, 그리고 존재한다면 팀 페이지와 채용 페이지 — 그다음 이미 확보한 HTML에서 정규식으로 추출합니다. 그러면 기존 에이전시, 광고 픽셀, 누락된 스키마, 방치된 블로그, 채용 공고, 이름이 적힌 사람들을 찾아냅니다.
에이전시 탐지는 가장 효과가 누적되는 항목입니다. 거의 모든 에이전시는 푸터에 자신을 표기하며, Harvey는 문구에 점수를 매깁니다. "Powered by" / "Website by" → 신뢰도 0.9; 설명만 있는 링크 → 0.75; 라벨 없는 링크 → 0.35이며 기록하지 않음. 이메일에 잘못된 기존 담당사를 적는 것은 아무 말도 하지 않는 것보다 더 나쁩니다.
3. ENRICH — 누가 결정하는가
먼저 공개 등록부를 봅니다. 팀 페이지의 이름과 직함을 우선 사용하고, 존재한다면 공신력 있는 등록부로 확인합니다. 이는 동시에 자체 파싱 오류도 걸러냅니다. 아무것도 일치하지 않는 "사람"은 대개 사람이 아니었기 때문입니다.
회사의 사이트에 아무도 이름이 없고 Harvey가 아직 그곳에 연락처가 없는 경우 — 소규모 업종에서 흔합니다 — 회사가 자체 홈페이지나 문의 페이지에 적어 둔 일반 주소로 되돌아갑니다(항상 owner@, office@, info@, hello@ 같은 일반 사서함만 사용하며, 개인 주소는 절대 사용하지 않음). 추측으로 만들지 않고 다른 주소와 마찬가지로 검증하며, 그렇게 얻은 이메일은 특정 이름이 아니라 회사 팀 전체에 인사합니다.
4. VERIFY — 연결 가능한가
Harvey는 각 회사의 주소 패턴을 학습하고, 이름 변형을 무작정 시도하지 않고 후보 하나를 검증합니다. 원시 SMTP 프로빙은 노트북에서 현실적이지 않습니다. 아웃바운드 25번 포트는 보통 막혀 있고, Google Workspace와 Microsoft 365는 알 수 없는 IP에서 오는 요청을 전부 받아줍니다.
모든 주소에는 verified / risky(catch-all) / guess / invalid가 정직하게 표시됩니다. 전달 가능한 주소에만 실제로 발송합니다. 추측은 절대 성공으로 간주하지 않습니다.
Harvey는 실제로 보내지 않더라도 실행할 가치가 있습니다.
harvey export는 찾은 모든 내용을 sequencer-ready CSV로 내보냅니다.
스킬 라이브러리
Harvey의 영업 지식은 skills/에 수정 가능한 일반 Markdown으로 들어 있습니다. 파인튜닝도, 벡터 스토어도, 검색 단계도 없습니다. 에이전트가 실행되기 전에 필요한 스킬이 그대로 프롬프트에 이어 붙습니다. 파일 하나를 바꾸면 다음 heartbeat의 동작이 달라집니다. 재시작도, 코드 변경도 필요 없습니다.
이것이 Harvey를 조정하는 핵심 방법입니다. 이메일이 너무 공격적이면 email_frameworks.md를 수정하세요. 특정 이의 제기를 잘못 다룬다면 objection_handling.md를 수정하고, 실제로 할 답변을 추가하세요.
포함 내용
email_frameworks.md — 301줄로, 저장소에서 가장 중요한 파일입니다. 유일하게 중요한 규칙으로 시작합니다. 실제 사람이 실제 이메일을 보내는 것처럼 쓰라. AI 티를 드러내는 표현에 대한 강력한 금지 목록을 담고 있습니다(“I hope this finds you well”, “I wanted to reach out”, “circling back” 금지). 그 아래의 모든 스타일 규칙을 덮어쓰는 컴플라이언스 규칙, 길이와 발송 간격에 대한 2026년 회신율 데이터와 링크 추적이 왜 불리한지에 대한 설명, 그리고 AIDA, PAS, BAB, QVC, 3Ps의 다섯 가지 프레임워크와 각 프레임워크가 언제 적합한지에 대한 선택 규칙이 들어 있습니다.
signal_playbook.md — 신호를 이메일 첫 문장으로 바꾸는 방법. 회사에 여러 신호가 있을 때 어떤 신호가 우선인지. 스캔을 돌렸다는 느낌 없이 관찰한 것을 어떻게 언급할지.
objection_handling.md — LAARC 루프(듣기 → 인정하기 → 평가하기 → 응답하기 → 확인하기)와 함께, 예산·권한·필요성·시기라는 네 가지 이의 제기 유형 각각에 대한 실제 응답 예시를 다룹니다. 전반적인 관점은 이렇습니다. 이의 제기를 “극복”하는 것이 아니라, 실제 우려가 무엇인지 알아내는 것입니다.
lead_qualification.md — 첫 번째 선별에는 BANT, 우선순위 지정에는 1–10점의 ICP 스코어링, 복잡한 경우에는 MEDDIC를 사용합니다. 명시적인 탈락 기준도 포함되어 있으며, 이는 자격 요건보다 더 중요합니다.
sales_methodology.md — 운영 철학입니다. ABC 루프, 대화가 각 단계에서 어떻게 흘러가야 하는지, 톤 보정, 그리고 Harvey가 넘지 않는 윤리적 경계가 담겨 있습니다.
offer_strategy.md — 참여 수준별 오퍼 계층과 이를 지배하는 규칙입니다. 절대 오퍼로 시작하지 말 것, 절대 차가운 이메일에서 피치하지 말 것. 첫 접촉의 목적은 대화를 시작하는 것입니다. 오퍼는 진정한 관심이 확인된 뒤에만 나갑니다.
prospecting_tactics.md — 검색 연산자, 회사 웹사이트에서의 정보 수집, 트리거 이벤트, 추천 경로. 데이터베이스 비용을 지불하지 않고 사람을 찾는 방법입니다.
account_navigation.md — 회사와 연락처, 멀티스레딩 규칙, 회사에 여러 개의 문이 있을 때 어느 문부터 두드려야 하는지에 관한 내용입니다.
linkedin_outreach.md — 연결 시퀀스와 속도 제한, 그리고 반드시 먼저 열어야 하는 위험 관련 섹션입니다. LinkedIn 자동화는 ToS를 위반하며, 가짜 신원을 절대 사용하지 말아야 하고, 누군가 이것이 자동화된 것인지 묻는다면 즉시 그렇다고 말해야 합니다.
당신의 제품을 위해 harvey train <url>로 생성됨:
product_knowledge.md— 무엇을 판매하는지, 이점, 가격, 사용 사례, 해결하는 고통, 구매 유발 요인competitive_intel.md— 경쟁사별 배틀 카드, 차별화 포인트, 마이그레이션 경로
(이 둘은 gitignore 처리되어 있습니다. 포지셔닝과 가격이 실수로 공개 저장소에 들어가면 안 되기 때문입니다.)
어떤 에이전트가 무엇을 맡는가
harvey/brain.py에서 정의됩니다 — 이 맵을 편집하면 변경할 수 있습니다.
| 기술 | Scout | Writer | Handler | Sender |
|---|
prospecting_tactics | ● | ● | |||
|---|---|---|---|---|---|
lead_qualification | ● | ||||
account_navigation | ● | ||||
signal_playbook | ● | ● | |||
email_frameworks | ● | ● | |||
sales_methodology | ● | ● | |||
offer_strategy | ● | ● | |||
objection_handling | ● | ||||
linkedin_outreach | ● | ||||
product_knowledge | ● | ● | ● | ● | ● |
competitive_intel | ● | ● |
스킬을 추가하려면: 파일을 작성하고, harvey/brain.py의 skill_map에 그 이름을 추가하면 됩니다. 그게 전부입니다.
서브 에이전트들
Harvey는 하나의 에이전트처럼 느껴집니다. 하지만 그 아래에는 각각 다른 스킬이 로드된 다섯 개가 있습니다.
| 에이전트 | 하는 일 |
|---|
| Scout | Python은 검색과 이메일 확인을 담당하고, 선택된 모델은 실제로 판단이 필요한 부분에서만 사용합니다. 이렇게 해야 토큰 비용이 합리적인 수준으로 유지됩니다. |
|---|---|
| Writer | 3개의 이메일 시퀀스를 생성합니다. 이메일 1은 75단어 미만, 이메일 2는 75단어 미만, 이메일 3은 40단어 미만입니다. AI 같은 표현은 엄격히 금지합니다. |
| Sender | 각 잠재 고객별로 merge 변수를 렌더링하고, 각 이메일을 발송 예정함에 발송 시간과 함께 넣습니다. 승인된 기한 도래 항목을 사람처럼 자연스러운 간격으로 처리하며, 일일 한도와 답장 시 중단을 강제합니다. |
| Handler | 답장을 폴링하고, 중복을 제거하며, 의도를 분류하고, 대화 단계를 진행시키고, 같은 승인 절차를 통해 응답을 대기열에 넣습니다. 반송을 감지하면 주소를 무효로 표시하고, 해당 잠재 고객의 대기 중인 발송을 취소하며, 반송률 임계값을 넘으면 전역 중지 스위치를 작동시킵니다. |
| Analyst | 유휴 주기에 실행됩니다. 파이프라인 통계, 캠페인 성과, 의도 분포, 실제로 무엇이 효과가 있는지. |
대화 단계: initial_outreach → engaged → qualifying → presenting → negotiating → closing → closed_won / closed_lost
당신 없이는 아무것도 발송되지 않습니다
기본적으로 모든 발신 이메일은 당신의 승인을 기다립니다. Harvey는 당신이 다른 설정을 하지 않는 한 코파일럿입니다.
대시보드의 Outbox는 의사결정 데스크입니다. 이메일 하나가 패널을 차지하고, 나머지는 레일에 대기하며, 당신은 A로 승인, R로 거절, J/K로 이동하면서 큐를 처리합니다. 이런 형태는 의도적입니다. 쌓인 초안들이 벽처럼 보이면 한 번에 전부 승인하는 반사적 행동을 유도하기 쉬운데, 바로 그런 검토를 막기 위해 승인 계층이 존재하기 때문입니다.
harvey outbox # review from the terminal
harvey outbox --approve-all
harvey sending pause # kill switch, stops everything mid-flight
harvey retry-writes # retry prospects the Writer gave up on after 3 unusable drafts무엇이든 발송되기 전에, 결정론적 사전 발송 게이트가 — 모델은 개입하지 않으며 — 다음을 거부합니다: 렌더링되지 않은 머지 태그, 금지 문구, 길이 제한을 초과한 이메일, 링크가 너무 많은 경우, HTML 본문, 발송 불가능한 주소, 그리고 수신자와 데이터베이스 레코드 간의 불일치.
선택적으로, 같은 단계에서 첫 번째 발송 전에 각 새 주소로의 콜드 이메일이 허용되는지 Precleared에 확인할 수도 있습니다. 법적 사항 및 전달성을 보세요.
승인 또는 자동 운행
Harvey에는 두 가지 발송 모드가 있습니다. 대시보드는 Outbox 상단에 현재 모드를 보여주며, Settings → Sending에서 두 모드를 설명하고 전환할 수 있습니다.
| 승인 (기본값) | 자동 조종 |
|---|
| 첫 이메일, 후속 메일, 답장 | 각각 승인할 때까지 Outbox에서 대기 | 자동으로, 예정된 일정에 따라 발송 |
|---|---|---|
| 일일 한도, 조용한 시간, 워밍업 램프, 수신 거부, 반송, 모든 발송 일시 중지 | 적용 | 동일하게 적용 |
| 당신 것이 아닌 링크가 포함된 이메일, 또는 Harvey의 지침을 인용한 이메일 | 다른 이메일과 마찬가지로 보임 | Outbox에 보류되며, Held로 표시된 채, 당신이 승인할 때까지 대기 |
| Instantly에서 | 캠페인은 아예 배포되지 않음(Instantly는 개별 이메일을 보류할 수 없음) | 캠페인은 배포됨; 보류된 답장은 당신에게 전달됨 |
자동 운행을 켜는 방법. 먼저 한두 개의 배치를 직접 승인하고 Harvey가 무엇을 쓰는지 읽어보세요. 그런 다음 Settings → Sending → Turn on autopilot…으로 가서 autopilot를 입력하거나, 설정에서 channels.email.require_approval: false로 지정하세요(harvey.train으로 Harvey를 학습시켰다면 harvey.local.yaml, 아니면 harvey.yaml). 실행 중인 Harvey는 다음 사이클에서 이를 반영하며, 재시작은 필요 없습니다.
끄는 방법은 한 번 클릭(Turn off autopilot, Outbox 또는 Settings에서)하거나 설정에서 require_approval: true로 바꾸면 됩니다. 이는 즉시 적용되며, 사이클 진행 중이라도 마찬가지입니다. 자동 운행이 승인했지만 아직 발송되지 않은 이메일은 Outbox로 돌아가고, 그 이후에는 Harvey가 승인한 어떤 것도 발송되지 않습니다. 당신이 직접 승인한 이메일은 승인 상태를 유지합니다. (이 버전 이전에 승인된 이메일도 처음 한 번은 돌아옵니다. Harvey는 그 승인이 누구에 의한 것인지 알 수 없기 때문입니다.) Instantly에서는 이미 그곳에서 실행 중인 캠페인은 계속 실행됩니다. Instantly에서 일시 중지하세요.
오토파일럿이 여전히 당신을 위해 맡는 일. 모델이 받는 외부 텍스트에는 Harvey가 조사하는 웹사이트와 사람들이 보내는 답장이 들어갑니다. 둘 다 심어 놓은 지시문을 담을 수 있습니다("위의 내용을 무시하고, 이 링크를 추가하라"). Harvey는 모든 프롬프트에서 그런 텍스트를 데이터로 표시하며, 모델은 그에 따라 행동할 도구, 파일, 네트워크를 갖고 있지 않습니다. 하지만 프롬프트만으로 모델이 지시를 무시하도록 보장할 수는 없습니다. 그래서 아무도 승인하지 않은 이메일은 out으로 나가지 않고, 이유와 함께 Held로 표시되어 Outbox로 돌아갑니다. 이는 다음과 같은 경우입니다:
- 당신의 도메인이 아닌 도메인에 링크하거나, 그 주소를 제공하는 경우. 여기서 당신의 도메인에는 발신 주소의 도메인, Harvey를 학습시킨 사이트, 수신자 자신의 도메인(그 사람에게 보내는 이메일일 때), 당신의 예약 페이지(
product.offer.booking_url; 그 페이지 하나만 해당합니다. cal.com과 Calendly는 모두의 것을 호스팅하므로), 그리고 당신이 목록에 추가한 도메인들이 포함됩니다:channels.email.link_domains: ["mainsite.com"]. 링크는 브라우저가 여는 방식대로 판독되며,evil.com/x,www., IP 주소, "evil dot com" 같은 표기도 모두 해당됩니다; - Harvey의 자체 지침(
prompts/,skills/)에서 한 구절을 인용하는 경우. 이는 답장을 통해 당신의 운영 절차를 빼내려는 시도가 돌려받게 될 내용입니다. 플레이북에서 인용해 말하라고 해 둔 스크립트와, 이메일 프레임워크 및 제품 지식은 문제없이 사용할 수 있습니다.
누군가의 옵트아웃을 취소한 뒤 첫 번째 답장도 잠시 대기합니다. 당신이 보류된 이메일을 직접 승인하면 전송됩니다. Approve all을 누르면 보류된 이메일은 제외되므로, 각각은 보내지기 전에 읽힙니다. Instantly는 즉시 전송하므로, 보류될 답장은 대신 에스컬레이션으로 당신에게 전달됩니다(전송 전 게이트도 함께 실행됩니다). 보류될 캠페인 템플릿은 배포되지 않으며, 필드가 보류될 리드도 업로드되지 않습니다.
레거시 Instantly: 로컬 Outbox에서는 개별 Instantly 전송을 승인할 수 없습니다. 승인 기능을 켜면 Harvey는 캠페인 배포(활성화 재시도 포함)를 보류하고 답장을 사람에게 라우팅합니다. 승인 대기열에는 Gmail, Microsoft 365, 또는 SMTP를 선택하세요. 오토파일럿을 끈다고 해서 Instantly에서 이미 실행 중인 캠페인이 일시정지되지는 않습니다. 그런 캠페인은 Instantly에서 직접 일시정지하세요.
대시보드
harvey dashboard # prints the link to open, e.g. http://127.0.0.1:5555/#token=…열기. 대시보드는 메일 설정을 바꾸고, Outbox를 승인하고, Harvey를 시작할 수 있으므로, 단지 당신의 기기뿐 아니라 당신에게만 잠겨 있습니다. 처음 시작할 때 data/dashboard-token에 무작위 토큰을 생성하며(오직 당신만 읽을 수 있음), 그 토큰을 # 뒤에 붙인 링크를 출력합니다. 그 링크를 열면 페이지는 그 토큰을 해당 브라우저 탭에만 보관하고 주소창에서 제거합니다. 새 탭을 열거나 링크 없이 연 탭에서는 잠금 화면이 표시됩니다. 그곳에 토큰을 붙여넣거나, harvey dashboard --url을 실행해 링크를 다시 출력하세요. 모든 API 요청에는 Authorization: Bearer 헤더로 토큰이 필요합니다 — 스크립트와 curl도 포함됩니다 — 그리고 토큰은 쿠키나 쿼리 문자열에서는 절대 허용되지 않습니다. data/dashboard-token을 삭제하고 대시보드를 다시 시작하면 토큰이 교체됩니다.
이것은 이 기기에서만 수신합니다. --host는 루프백 주소만 허용하며(127.0.0.1, ::1, localhost), 요청은 Host 헤더에 그중 하나를 지정해야 합니다. 이로 인해 127.0.0.1을 가리키는 DNS 이름이 접근하는 것도 막힙니다. 브라우저에서 여는 다른 웹사이트가 보낸 요청은 거부됩니다. 다른 컴퓨터에서 사용하려면 노출하지 말고 터널링하세요: ssh -L 5555:127.0.0.1:5555 your-machine, 그런 다음 출력된 링크를 로컬에서 여세요. 토큰은 다른 사용자와 다른 웹사이트로부터는 보호하지만, 이미 당신의 사용자 계정으로 실행 중인 프로그램까지 막지는 못합니다. 그런 프로그램은 .env나 데이터베이스를 읽을 수 있는 것처럼 토큰 파일도 읽을 수 있습니다.
Windows: 토큰 파일은 그것이 들어 있는 폴더의 권한으로 보호됩니다(일반적으로 사용자 프로필이 이를 당신으로만 제한합니다). Harvey는 그곳에 POSIX 파일 모드를 적용하지 않습니다.
harvey/web/에서 제공되는 순수 HTML, CSS, JavaScript입니다. 빌드 단계도, 프레임워크도, 번들러도 없습니다 — app.css를 수정하고 새로고침하세요. 글꼴은 함께 포함되어 있어, 네트워크가 꺼져 있어도 올바르게 렌더링됩니다.

사이드바는 당신이 무엇을 하고 있는지에 따라 묶여 있습니다: Work(당신이 필요한 일), Pipeline(Harvey가 만들고 있는 것), System(실행 상태). 탭 옆의 숫자는 그곳에 기다리는 항목이 있음을 뜻합니다.
Work
- Today — 14일 추세가 포함된 네 가지 핵심 수치(발견한 연락처, 보낸 이메일, 대화, 사용자의 응답 대기), 그다음에는 결정이 필요한 모든 항목, 단계별 연락처, 수집기 실행과 현재 파이프라인이 하는 일. 설정은 완료될 때까지 여기에 표시되고, 끝나면 사라집니다.
- Outbox — 결정 대기실. 각 이메일은 Harvey가 작성할 때 알고 있던 정보와 나란히 표시됩니다: 회사, 주소를 찾고 검증한 방법, 그리고 이메일이 활용하는 신호들. 이동은
J/K, 승인A, 편집E, 거부R. - Conversations — 모든 답장은 그 답장이 이어진 이메일들의 맥락 안에 표시됩니다. Harvey가 넘긴 스레드(계약 요청, 안전한 답변이 없어 넘긴 답장)가 먼저 나오며, Hand back to Harvey, Close, Reopen이 있습니다.
Pipeline
- Signals — 확인 게이트이자 코호트 생성기
- Discover — 가격이 나란히 보이는 제공자 메뉴, 추정치, 그다음 실행; 그리고 아직 살펴보지 않은 채 발견만 된 회사들의 사이트 읽기
- Companies / Contacts — 발견된 모든 항목, 검색 가능, CSV 내보내기 포함
- Campaigns — Harvey가 작성한 각 시퀀스, 대상, 그리고 작성자를 위한 캠페인별 피드백
System
- Activity, Usage, Controls, Settings, Help. Usage에는 Claude 또는 Codex 할당량 게이지와 에이전트별 토큰 수가 표시되며, 달러 금액은 표시하지 않습니다. 구독형이며 토큰당 과금되지 않으므로, 비용을 보여주는 것은 임의로 만들어내는 셈이기 때문입니다.
| 발신함 | 대화 |
|---|
색상은 의미를 위해 유지됩니다. 크롬은 중립적이며, 단 하나의 파란색이 사용자가 조치할 수 있는 항목을 표시합니다. 상태(사용자 응답 대기, 완료, 실패, 실행 중)는 모든 탭에서 같은 작은 색상 집합을 사용하므로, "사용자 응답 대기"는 어디에 나타나든 항상 같은 모습으로 보입니다. 수치는 표 형식으로 맞춰져 있어 열이 정렬되고 숫자가 바뀌어도 레이아웃이 흔들리지 않습니다.
외관에는 세 가지 상태가 있습니다: auto는 OS를 따르며 기본값이고, 사이드바 하단의 버튼에서 라이트 또는 다크를 선택할 수 있습니다. 다크 모드는 동일한 레이아웃에 다른 색상 토큰을 사용합니다.
데이터가 저장되는 방식
SQLite는 data/harvey.db에 있습니다. 스키마를 관통하는 한 가지 원칙이 있습니다.
모든 사실은 열이 아니라 행이다.
companies.has_agency가 아닙니다. companies.rank도 아닙니다. observations의 한 행입니다:
observations(company_id, prospect_id, collector, signal_code,
value_num, value_text, confidence, evidence_url, observed_at, run_id)여기서 네 가지가 따라 나오며, 이들은 모두 열만으로는 얻을 수 없습니다.
- 새 신호에는 마이그레이션이 필요 없습니다. 수집기가 코드를 만들어내면 그대로 작동합니다.
- 이력은 공짜입니다. 같은 신호를 분기별로 관측하면 그것이 곧 시계열입니다 — 그리고 "지난 분기에 에이전시를 포기했다"는 정적 사실보다 훨씬 더 좋은 트리거입니다.
- 확신도와 출처가 사실과 함께 이동합니다. 덮어쓰기 때 사라지지 않습니다. "우리는 그들의 에이전시가 X라고 생각하고, 확신도는 0.9이며, 여기 URL이 있습니다."
- 코호트는 쿼리입니다. 집합 교집합은 애플리케이션 코드에서 제한된 가져오기를 돌리는 대신 SQL에서 일어납니다.
용어는 관리됩니다: 데이터베이스 트리거가 signal_codes 테이블에 없는 signal_code를 거부하므로, 오타가 조용히 쓰레기 신호를 만들어내는 대신 크게 실패합니다.
다른 테이블: companies, prospects, campaigns, conversations, outbox, actions, runs, usage_events, email_patterns, settings, feedback.
설정
두 개의 파일이며, 둘 다 일반 텍스트입니다.
.env — 자격 증명. 각 변수에는 어디서 가져오는지까지 인라인으로 문서화되어 있습니다. 필수인 것은 메일 제공자 하나뿐이고, 나머지는 모두 선택 사항입니다.
harvey.yaml — Harvey가 누구인지, 누구에게 판매하는지:
persona: { name, company, role, email, tone }
product: { name, description, pricing, key_benefits, objection_responses, offer }
icp: { industries, titles, company_size, geography, hiring_signals, geo_coordinates }
channels:
email: { provider: gmail | microsoft | smtp | instantly, max_daily_sends, require_approval,
send_to_risky, max_bounce_rate }
usage: { max_daily_claude_percent, heartbeat_interval_minutes, quiet_hours }
brain: { provider: claude | codex, model, reasoning_effort } # optional; claude by default
writer: { humanizer } # optional; true adds one editing pass per batch using ~/.claude/skills/humanizer/SKILL.mdmax_daily_claude_percent는 brain.provider가 사용하는 구독을 제한합니다(이 이름은 Codex 지원보다 먼저 생겼습니다).
harvey.local.yaml이 존재하면 그것이 우선합니다. 이 파일은 gitignore되어 있으므로, 포크는 실제 제품 설정을 포함할 수 있고 추적되는 harvey.yaml은 템플릿으로 남습니다 — 누구도 실수로 자신의 포지셔닝과 가격을 공개하지 않습니다.
명령어
harvey run # the heartbeat loop
harvey dashboard # web UI at 127.0.0.1:5555 (--url: print the unlock link)
harvey signals # review/confirm what to prospect against
harvey discover # find businesses; --providers / --estimate
harvey profile # read discovered companies' sites (free)
harvey train <url> # learn a product from its website (--provider codex --model gpt-5.5)
harvey status # pipeline summary
harvey usage # active provider's quota + per-agent tokens
harvey outbox # review queued email
harvey export # deliverable prospects → CSV
harvey sending pause|resume # kill switch
harvey warmup [domain] # is the sending domain ready? (SPF/DKIM/DMARC, age, blocklists)
harvey retry-writes # retry prospects the Writer gave up on
harvey gmail auth # one-time Gmail OAuth
harvey microsoft auth|test # one-time Microsoft 365 sign-in (docs/microsoft365.md)Prospect CSV 내보내기에서는 옵트아웃된 연락처가 제외되며, --status 또는 --email-status 필터를 사용할 때도 마찬가지입니다. harvey export --all은 검사용 원시 데이터 내보내기로, 필터링되지 않으며 옵트아웃 및 검증되지 않은 연락처를 포함하고, 아웃리치 목록으로 가져와서는 안 됩니다. 대시보드의 prospect CSV 다운로드도 같은 정책을 따르며, ?all=true가 원시 내보내기를 선택합니다.
ChatGPT 플랜 대신 사용하기 (Codex)
Claude가 기본이며 변경할 필요가 없습니다. ChatGPT 플랜(Plus, Pro, Business, …)을 쓰고 싶다면 Harvey는 대신 Codex CLI를 통해 생각할 수 있습니다 — 역시 구독형이며, 토큰당 API 과금은 없습니다.
npm install -g @openai/codex@0.159.3 # the Codex version Harvey has verified (see Requirements)
codex login # choose "Sign in with ChatGPT" — API-key logins are refused그다음에는 harvey setup에서 codex를 선택하거나(gpt-5.5를 제안합니다), harvey train <url> --provider codex --model gpt-5.5를 실행하거나, 또는 설정에 다음을 추가하세요:
brain:
provider: codex
model: gpt-5.5 # or an available Luna, Sol, or Terra model ID
reasoning_effort: "" # optional: minimal | low | medium | high | xhigh알아둘 점:
- 둘 중 하나입니다. Harvey는 사용자가 설정한 제공자만 정확히 사용합니다. Codex가 실패하면, 명확한 로그 메시지와 함께 호출도 실패하며, Claude나 API 키로 절대 대체하지 않습니다. Codex 전용 머신에는 Claude를 설치할 필요가 없습니다.
- Codex 설정은 건드리지 않습니다. 각 호출은 개인용 임시 home과 비어 있는 작업공간에서 일회성
codex프로세스를 실행하므로,~/.codex/config.toml, MCP 서버, 플러그인, 훅, 스킬,AGENTS.md, 메모리는 절대 로드되지 않으며 Harvey의 모델 선택이 사용자의 Codex 기본값을 바꾸지도 않습니다. - 도구는 없고, 모든 프롬프트 전에 검증합니다. 프롬프트에는 신뢰할 수 없는 텍스트(잠재 고객의 답장, 스크래핑한 페이지)가 들어 있으므로, 모델은 실행할 수 있는 것이 아무것도 없어야 합니다. Harvey는 도구를 제공하는 Codex 기능, 웹 검색, 서브 에이전트, 훅, 스킬, 프로젝트 지시문을 모두 비활성화하고, 실행 환경 없이 스레드를 시작한 뒤, 아무것도 보내기 전에 Codex 자체의 보고서(적용된 설정, 계정 유형, 스레드 설정, MCP 상태, 훅)를 확인합니다. 확인할 수 없는 항목이 있으면 호출은 중단됩니다. 턴 도중 도구 호출 시도, 승인 요청, 비텍스트 항목이 있으면 런타임이 종료됩니다. 추가 보호를 위해 읽기 전용 샌드박스도 설정됩니다.
- 로그인은 OpenAI로만 전달됩니다. 로그인을 런타임에 넣기 전에, Harvey는 로그인 없이 Codex를 먼저 시작하고 요청이 내장된 OpenAI 제공자와 기본 ChatGPT 엔드포인트로만 향하는지 확인합니다.
/etc/codex/config.toml이나 관리형 설정 같은 Codex 구성 계층에 있는 어떤 커스텀 제공자, 내장 제공자의 재정의, base URL, 텔레메트리 exporter, 기타 엔드포인트도 호출을 그 자리에서 중단시킵니다. - 로그인 처리. Harvey는 Codex의 파일 자격 증명 저장소(
~/.codex/auth.json, 또는$CODEX_HOME/auth.json, 권한600)를 지원합니다. OS 키링을 설정해 둔 경우를 제외하면 이것이 기본입니다. 키링 저장은 지원하지 않습니다. 매 호출마다 Harvey는 그 파일을 읽어(읽기 전용이며, 절대 쓰거나 옮기지 않음) 비공개 복사본을 런타임에 제공하되 refresh token은 제외하고, 호출 후 삭제합니다. 따라서 Codex가 사용자의 실제 로그인을 변경하거나 갱신할 수 없습니다. 로그인이 만료되었거나 Codex의 정기 갱신 시점(약 8일 후)에 도달한 경우, Codex 호출은 "Your Codex login has expired or is due for renewal"로 중단됩니다. 직접 Codex를 한 번 사용하면(로그인이 자동 갱신됩니다) 또는codex login을 실행하면 되고, Harvey는 다음 호출에서 갱신된 로그인을 가져옵니다. Harvey가 대신 갱신해 주지는 않습니다. - 모델.
brain.model은 계정 카탈로그에 있는 정확한 모델 ID로 설정하세요. 여기에는gpt-5.6-luna,gpt-6.1-sol,gpt-5.6-terra같은 Luna, Sol, Terra 모델이 포함됩니다.gpt-5.5는 계정 카탈로그에 존재할 때 계속 지원되며, 설정 권장값입니다. Harvey는 도구 모드로 직접 선택하고 실험적 도구를 제거하면서, 모델 기능은 유지하는 개인용 카탈로그 복사본을 만듭니다. Harvey의 잠금 상태에서는 모델이 어떤 도구도 받지 않습니다.model을 비워 두면, 이 구성을 사용할 수 있는 목록 중 우선순위가 가장 높은 모델이 선택됩니다. 숨겨진 모델은 명시적 ID가 필요합니다. 명시적 모델은 정확히 사용되며, 그렇지 않으면 호출이 실패합니다. 알 수 없는 모델 ID와 인식되지 않는 도구 모드는 거부됩니다. 사용 가능 여부는 ChatGPT 계정에 따라 다릅니다. - 할당량. 예산 게이트와 대시보드는 Codex에서 읽어 온 ChatGPT 플랜의 실제 rate-limit 창을 읽고, 사용자의 모델에 적용되는 limit bucket에 대해
usage.max_daily_claude_percent와 비교합니다. Codex가 사용이 차단되었다고 보고하거나, 호출이 플랜의 사용 한도 때문에 실패하면 Harvey는 플랜이 가득 찼다고 간주하며(창이 보고되지 않아도 마찬가지), Codex 호출을 한 시간 동안 중지합니다. 한도를 읽을 수 없으면 대시보드와harvey usage는 "Quota unavailable"이라고 표시하고, 예산은 Harvey 자체의 일일 호출 횟수로 대체됩니다. 사용량은 제공자별로 기록됩니다. Codex 호출은 토큰은 기록되지만 금전 비용은 기록되지 않는데, 플랜이 토큰 기준 과금이 아니기 때문입니다. - Codex를 사용할 수 없으면 Harvey는 추측하지 않고 멈춥니다. 각 하트비트 전에 Harvey는 프롬프트를 제외한 호출에 필요한 모든 것을 확인합니다. 즉, Codex CLI 버전, 격리 상태, 로그인(만료 또는 갱신 필요 여부), ChatGPT 계정, 그리고 설정한 모델이 도구 없이 실행될 수 있는지 여부입니다. 프롬프트는 전송되지 않으므로, 빠른 계정 확인 외에는 플랜이 전혀 사용되지 않습니다. 문제가 있으면 전체 사이클이 건너뛰어집니다. 답장은 읽거나 처리 완료로 표시되지 않고, 어떤 초안도 작성되거나 전송되지 않습니다. 로그 줄,
harvey status, 대시보드의 Actions 카드에는 "Codex paused"와 그 이유가 표시됩니다. 사이클 진행 중 Codex가 작동을 멈추면(예: 플랜이 사용 한도에 도달), 처리 중이던 답장은 깨끗한 재시도를 위해 정확히 그 상태로 남고, 승격되거나 중간 기록되거나 손실되지 않으며, 그 사이클은 아무것도 보내지 않습니다. 원인을 수정하면(대개codex login), Harvey는 다음 하트비트에서 재개됩니다. 갱신된 로그인이나 재설치된 CLI는 즉시 감지되고, 사용 한도 일시 중지는 한 시간 후 종료되며, 다른 수정 사항은 30분 이내에 반영됩니다.harvey status --check는 필요할 때 같은 검사를 실행하며 실패하면 0이 아닌 값으로 종료됩니다. 짧은 실패(크래시나 타임아웃)는 한 사이클만 건너뜁니다. Harvey는 Claude나 API 키로 절대 대체하지 않습니다. - 요구 사항. macOS 또는 Linux, 정확히 Codex CLI 0.159.3, 그리고 해당 npm 패키지를 위한 Node.js가 필요합니다. Windows는 Codex에서 지원되지 않습니다: Harvey는 사용자의 로그인을 읽기 전에 그 환경을 거부하며, Windows에서는 Claude 제공자를 사용하세요. Harvey는 매 호출 전에 Codex 버전을 확인하고, 더 최신 버전이라도 다른 모든 버전을 거부합니다. 다른 Codex는 Harvey의 잠금 장치가 모르는 도구를 추가할 수 있기 때문입니다. 새 버전 지원은 Harvey 업데이트와 함께 제공됩니다. 실제 ChatGPT 계정으로의 실사용은 macOS와 ARM64 Linux에서 검증되었습니다. 오프라인 테스트 스위트는 CPU 에뮬레이션 하의 x86-64 Linux에서도 통과했으며, CI는 Linux와 macOS를 커버합니다. Docker 이미지에는 Claude CLI만 포함되므로 Docker에서는 Codex가 지원되지 않습니다. 설치된 CLI에 대해 자격 증명이나 네트워크 없이 오프라인에서 잠금 상태를 재검증하려면
HARVEY_CODEX_CLI_TESTS=1 pytest tests/test_codex_cli_surface.py를 사용하세요. - 오버헤드. 각 호출은 CLI 버전을 확인하고, 사용자의 로그인 없이 한 번 Codex를 시작해 구성을 검증한 뒤, 모델 카탈로그를 읽고, 그다음 프롬프트를 실행하기 위해 다시 시작합니다. 각 하트비트 검사도 프롬프트 없이 같은 작업을 수행합니다. 그 결과 호출당 몇 초의 추가 시간이 들며, 하나의 Brain에 대한 Codex 호출은 한 번에 하나씩만 실행됩니다.
법적 사항 및 전달 가능성
Harvey는 아웃리치를 자동화하지만, 발신자는 당신입니다. 콜드 이메일은 올바르게 하면 대부분의 지역에서 합법이지만, 잘못하면 매우 큰 비용이 듭니다. CAN-SPAM 위반 벌금은 이메일 1통당 53,088달러까지 올라갑니다. Harvey는 기본값을 규정 준수에 맞게 제공합니다. 그대로 두세요.
CAN-SPAM(미국). 제목은 사실이어야 하고 보낸 사람 주소도 정확해야 합니다. Harvey의 카피라이팅 규칙은 가짜 "re:" 스레드와 사칭을 금지합니다. 작동하는 수신 거부 기능도 빠르게 반영해야 합니다. 모든 콜드 이메일 끝에는 수신 거부 문구(compliance.opt_out_line, 기본값 관심 없으신가요? "no thanks"라고 답장하시면 다시는 이메일을 보내지 않겠습니다.)가 붙으며, Harvey는 사람이 답장에서 어디에 그 문구를 적었든 수신 거부 의사로 즉시 그리고 영구적으로 처리합니다(단독으로 온 "STOP"이나 "No thanks"도 포함). 이후 Harvey가 하는 어떤 일도 그 사람을 수신 거부됨 상태에서 다시 빼내지 못합니다. 그 뒤에 그 사람에게서 또 메시지가 와도 읽기 위해 보관할 뿐 답장은 보내지 않으며, 민원은 여전히 당신에게 전달됩니다. 누군가가 왜 수신 거부되었는지(작동한 규칙, 사용된 문구, 해당 메시지)를 보려면 Contacts의 해당 행에서 Why? 를 클릭하세요. 실수였다면 거기서 Undo opt-out을 누르면 replied 상태로 표시됩니다. Harvey는 스스로 아무것도 보내지 않고, 다음 답장에는 당신의 승인을 위한 초안이 생성됩니다. 푸터에 넣을 실제 우편 주소는 첫 번째 캠페인을 시작하기 전에 harvey.yaml의 compliance.postal_address에 설정하세요. Harvey는 보낼 때 모든 콜드 이메일 아래에 이 두 줄을 추가하고(답장에는 추가하지 않음), Outbox의 각 초안 아래에도 표시하며, 주소가 설정될 때까지 harvey run, harvey status, Outbox 탭에서 경고를 띄웁니다. Harvey가 그 사람을 위해 쓴 내용(이메일, 캠페인 템플릿, 사용한 모든 푸터)을 답장에서 반복한 텍스트는 그 사람의 말이 아니라 인용문으로 따로 처리되므로, Harvey의 푸터를 인용하는 것은 수신 거부가 아닙니다. 모델은 인용된 이메일을 제외한 상태로도 답장을 읽습니다. 수신 거부 문구는 Harvey가 인식할 수 있는 답장 형태를 요구해야 하며(Reply "no thanks", Reply STOP, 또한 "unsubscribe", "remove me", "opt out") 링크나 이메일 주소를 포함할 수 없습니다.
GDPR / PECR(EU 및 영국). B2B 콜드 이메일은 정당한 이익이라는 방어 논리가 성립해야 합니다. 즉, 제안이 그 사람의 역할과 실제로 관련이 있어야 하고, 데이터 출처를 알고 있어야 하며, 거부는 아주 쉽게 할 수 있어야 합니다. 특정 개인이 왜 관심을 가질지 설명할 수 없다면 Harvey는 그 사람에게 이메일을 보내면 안 됩니다. 그리고 Harvey의 적격성 규칙도 그렇게 말합니다.
수신자별 점검(선택 사항). 이 규칙들은 각 수신자에 대한 사실에 따라 달라집니다. 영국의 개인사업자는 유한회사가 아닐 때 동의가 필요하고, 독일은 업무용 이메일에도 사전 동의를 요구하며, 캐나다의 CASL은 주소가 공개되었는지에 따라 달라집니다. compliance.precleared.enabled: true로 설정하면 Harvey는 첫 콜드 이메일을 보내기 전에 각 새 수신자에 대해 Precleared에게 확인합니다. ok_to_email 이외의 결과가 나오면 해당 이메일은 보류되며, 해당 규칙과 다음 단계가 Outbox에 표시되고, 서명된 receipt id가 모든 전송과 함께 기록됩니다. 주소당 한 번만 확인하며 30일 동안 캐시됩니다(발신 국가, 주소 출처, 제품 설명, 잠재고객 국가가 바뀌면 새 확인이 실행됩니다). 답장은 확인하지 않습니다. 기본 제공 제공자(Gmail, SMTP)만 지원합니다. Precleared는 주소, 발신 국가, 주소 출처, 제품 설명, 그리고 설정되어 있다면 잠재고객 국가를 바탕으로 각 수신자의 국가를 판단합니다. 잠재고객이 모두 한 국가에 있다면 prospect_country도 설정하세요(예: US). 이 값은 위 항목들로 국가를 판단할 수 없을 때만 사용합니다. Precleared는 수신자의 주소, 발신자 국가, 주소 출처, 제품 설명, 그리고 설정된 경우 잠재고객 국가를 전달받습니다. 키가 없으면 하루 10회까지 확인할 수 있고, 무료 키(PRECLEARED_API_KEY)가 있으면 25회까지 가능합니다. 이 설정은 harvey.yaml에 넣거나, Harvey를 학습시켰다면 harvey.local.yaml에 넣으세요. 이 파일이 우선 적용됩니다.
봇 고지. 일부 관할권에서는 자동화 사실을 고지해야 합니다. Harvey는 누군가 자신이 AI와 대화 중인지 묻는다면 언제나 진실하게 답하도록 지시되어 있습니다. 다른 식으로 설정하지 마세요.
LinkedIn. 브라우저 자동화는 LinkedIn의 이용약관을 위반하며 계정이 제한될 수 있습니다. 기본적으로 꺼져 있습니다. 켜려면 잃어도 되는 계정을 사용하세요.
LinkedIn을 사용하려면 channels.linkedin.enabled: true와 구성된 인증 정보가 모두 필요합니다. 제품을 학습시킨다고 해서 자동으로 활성화되지는 않으며, 설정 마법사에서 사용자가 명시적으로 선택해야 합니다.
전달 가능성 — 예열하지 않으면 망가집니다. 메인 도메인에서 콜드 이메일을 보내거나 첫날부터 대량 발송하면 영구적으로 스팸함에 들어가게 됩니다.
- 전용 발신 도메인(
getacme.com,acme.com이 아님)을 구입합니다. - 그 도메인에 SPF, DKIM 및 DMARC를 설정합니다. 이 셋이 모두 없으면 Gmail이 메일을 정크 처리합니다.
harvey warmup은 이를 확인하고, 도메인 나이, 블록리스트, 워밍업 진행 상황, 반송률도 함께 점검한 뒤 READY / NOT READY로 끝납니다. 이 명령은 공개 DNS와 Harvey의 자체 기록만 읽습니다. - 실제 발송량을 늘리기 전에 2~4주 동안 워밍업합니다.
- 천천히 늘립니다 — 인박스당 하루 10~20건에서 시작해, 하루 약 5건씩 추가합니다. 기본값
max_daily_sends: 50은 목표가 아니라 상한선입니다.channels.email.warmup.start_date를 설정하면 Harvey가 이를 자동으로 처리합니다(Gmail, Microsoft, SMTP; Instantly는 자체 워밍업을 사용):min_days동안은 차가운 이메일을 보내지 않고, 그다음부터는 하루에daily_increase만큼 올라가는 차가운 이메일 상한을 적용합니다. 답장은 항상 발송됩니다. - 반송률을 주시합니다. 약 3%를 넘으면 중단하고 목록 품질을 수정하세요. Harvey는 설정한 임계값을 넘으면 자체 킬 스위치를 작동시킵니다.
이 내용은 법률 자문이 아닙니다. 대량 발송을 하거나 규제 산업에 발송하나요? 변호사와 상의하세요.
문제 해결
command not found: harvey — 먼저 source .venv/bin/activate를 실행하세요.
설치 후 ModuleNotFoundError: No module named 'harvey' (macOS) — Python 3.13은 macOS 숨김 플래그가 붙은 .pth 파일을 조용히 무시하며, 일부 Mac은 그 플래그를 .venv까지 전파합니다. harvey install을 다시 실행하세요(자동으로 수정합니다). 또는: ln -s "$(pwd)/harvey" .venv/lib/python3.13/site-packages/harvey
externally-managed-environment — 시스템 Python이 아니라 venv를 사용하세요.
설치 직후 SyntaxError 또는 이상한 ImportError가 발생함 (macOS) — 현재 venv가 Python 3.9입니다. python3 -m venv는 /usr/bin/python3에서 생성되는데, macOS는 이를 3.9로 유지합니다. .venv/bin/python -V로 확인한 뒤, 다음과 같이 다시 만드세요: rm -rf .venv && python3.13 -m venv .venv && source .venv/bin/activate && pip install -e .
…(구글 시트 셀 한계로 여기까지만 저장했습니다)
출처
- 원문: https://github.com/ethanplusai/harvey (2026-10-24 · github.com)
자료 표지 보기


