Comp AI CRM 소개
영업 조직에서 고객 관리 시스템의 데이터가 낡는 이유는 대개 하나입니다. 담당자가 바뀐 직함, 새 이메일 주소, 회사가 옮긴 도메인을 손으로 입력해야 하고, 그 일은 항상 다른 급한 일보다 뒤로 밀립니다. 최근의 AI 기능들은 이 문제를 화면 옆에 채팅창을 붙이는 방식으로 다뤘습니다. 물어보면 답은 하지만, 무엇이 사실인지 찾아내고 그것을 기록으로 남기는 작업은 그대로 사람 몫으로 남습니다.
Comp AI CRM 은 그 관계를 뒤집은 오픈소스 프로젝트입니다. 저자의 표현을 그대로 옮기면 "에이전트는 CRM 의 기능이 아니고, CRM 이 에이전트가 메모를 남기는 곳" 입니다. 조사 에이전트는 별도 배포로 자기 일정과 자기 작업 큐를 가지고 돌아가면서 다음에 무엇을 볼지 스스로 정하고, 후속 확인 일정을 스스로 잡고, 조사 예산을 쓰다가 예산이 끝나면 멈춥니다. 요청과 응답으로 움직이지 않기 때문에 브라우저를 닫아도 계속 진행됩니다.
이 설계에서 API 는 판단을 하지 않습니다. NestJS 는 무슨 일이 일어났다 는 사실만 큐에 한 줄로 적고, 에이전트가 그 줄을 임대해 의미를 해석합니다. 저장소는 Nest 서비스가 직접 데이터 보강 API 를 호출하는 코드를 버그로 취급한다고 못박고, 그 규칙이 생긴 계기였던 장애를 docs/api.md에 적어 두었습니다. 이 글에서는 기존 CRM 과 갈라지는 지점, 조사 에이전트의 구성, 추측을 기록에 남기지 않는 방법, 기술 스택과 설치 방법을 정리합니다.
Comp AI CRM이 기존 CRM과 갈라지는 지점
저자는 도입부에서 세 가지 형태를 대비합니다. 대부분의 CRM 은 데이터베이스 앞에 입력 폼을 놓은 것이고, AI 를 붙인 제품들은 그 폼 옆에 채팅창을 하나 더 놓은 것이며, 두 경우 모두 "무엇이 사실인지 알아내고 적어 두는" 실제 작업은 사람에게 남습니다. Comp AI CRM 은 그 작업을 에이전트의 상시 업무로 옮기고, 사람은 애매한 건을 판정하는 자리에 섭니다.
| 구분 | 폼 중심 CRM | 채팅창을 붙인 CRM | Comp AI CRM |
|---|---|---|---|
| 데이터 입력 주체 | 사람 | 사람 (필요 시 질문) | 에이전트 |
| 실행 방식 | 사용자 요청에 반응 | 사용자 요청에 반응 | 자기 일정과 작업 큐 |
| 사람의 역할 | 전부 입력 | 전부 입력 | 약한 증거 판정 |
| 브라우저를 닫으면 | 멈춤 | 멈춤 | 계속 진행 |
표의 왼쪽 두 열은 저자가 대비 대상으로 제시한 특성이고, 오른쪽 열은 저장소 문서에서 확인할 수 있는 동작입니다. 화면 자체는 익숙한 CRM 의 모습을 유지합니다. 목록의 필터와 정렬, 페이지 상태가 모두 URL 에 들어 있어 주소를 복사하면 같은 화면이 재현되고, 연락처 목록의 대부분은 타이핑이 아니라 메일함 동기화로 만들어진 것이라고 밝히고 있습니다.
Comp AI CRM의 조사 에이전트 구성
apps/agent 은 독립 배포이며 Vercel 의 파일시스템 우선 에이전트 프레임워크인 eve 위에 올라가 있습니다. 도구가 파일 하나, 스킬이 마크다운 파일 하나, 일정이 파일 하나이고, 재배포를 넘어 살아남는 세션과 멈춘 지점부터 재개되는 작업은 런타임이 담당합니다. 구성은 다음과 같습니다.
| 구성 요소 | 내용 |
|---|---|
| 도구 18개 | read_crm_history, search_crm, identify_contact, research_person, enrich_company, record_fact, schedule_recheck 등 |
| 스킬 4개 | evidence.md, identity-matching.md, data-boundaries.md, writing-a-brief.md — 에이전트가 읽는 산문이며 코드처럼 버전 관리 |
| 일정 1개 | dispatch.ts. 아무 판단도 하지 않고, 기한이 된 행을 임대해 행마다 세션을 하나 시작 |
| 샌드박스 | bash, grep, glob 과 /workspace, 그리고 모든 외부 통신 차단 |
작업 큐는 lib/tasks.ts 에 있습니다. claimDue 가 FOR UPDATE SKIP LOCKED 로 행을 임대하므로 디스패처가 둘이어도 서로 겹치지 않는 일을 집어가고, 도중에 죽은 실행은 임대가 만료되면서 행을 놓아 줍니다. 저자는 "몇 분마다 가장 오래된 연락처 열 건" 같은 규칙은 크론 표현식이 아니라 작업의 dueAt 에 들어가야 한다고 정리합니다. 에이전트가 어떤 사람을 다시 보기로 하면 schedule_recheck 를 호출하면서 이유를 함께 남기고, 그 이유는 담당자에게 그대로 보입니다. 14일 뒤에 돌아오겠다는 말에 이유를 붙이지 못하면 그것은 이유가 아니라 기본값이라는 설명이 붙어 있습니다.
외부 데이터 소스는 전부 선택 사항이고, 하나도 없는 상태로 돌아가도록 설계되었습니다. API 키가 없어도 read_crm_history 가 내 메일 스레드와 회의 기록, 서명란을 읽습니다. 어떤 데이터 업체도 상대방 본인 주소에서 온 답장을 팔지는 못하므로 이것이 가장 좋은 증거라는 것이 저자의 주장입니다. 에이전트는 세션을 시작할 때 이 설치본에 어떤 키가 있는지 통보받고 시작 시점에 목록을 출력합니다. 실패한 호출로 빈칸을 하나씩 발견하는 대신 가진 것에 맞춰 계획을 세우게 하는 장치입니다.
[agent] on LinkedIn (RAPIDAPI_KEY)
[agent] off Web research (PERPLEXITY_API_KEY)
[agent] off Company brand data (Settings → General)
샌드박스는 네트워크도 데이터베이스도 없이 켜집니다. 셸을 주는 목적은 도구 호출을 넘어 조사 파일을 쌓아 두고 이번 달 프로필과 지난달 프로필을 비교하고 스레드에서 서명란을 찾는 작업이며, web_fetch 는 앱 런타임에서 web_search 는 모델 제공자 쪽에서 돌기 때문에 외부 통신 차단이 기능을 깎지 않습니다. 여기서 사라지는 것은 고객 메일 본문이 셸 명령을 통해 밖으로 나갈 수 있는 경로입니다. 같은 규칙의 나머지 절반은 부재로 표현됩니다. 샌드박스에는 DATABASE_URL 을 절대 주지 않습니다. 자격증명과 외부 통신을 함께 가진 셸은 내부 도구에서도 유출 형태를 띠지만, 둘 다 없는 셸은 텍스트 처리기일 뿐입니다.
연락처와 회사, 거래마다 Agent 탭이 있어 진행 단계와 버린 후보, 버린 이유를 볼 수 있고 두 사람 중 누구인지 판단하지 못할 때는 그 자리에서 질문을 받습니다. 대화는 새로 고쳐도 유지되며, 어떤 레코드에 대한 대화인지는 메시지 앞에 붙는 텍스트가 아니라 서명된 토큰으로 전달됩니다. 이 탭을 켜려면 두 프로세스에 AGENT_BRIDGE_SECRET 을 같은 값으로 넣어야 하고, 없으면 탭이 설정되지 않았다고 알리는 동안에도 에이전트는 자기 일정대로 계속 돕니다.
Comp AI CRM이 추측을 기록에 남기지 않는 방법
에이전트가 스스로 조사한다는 설계에서 가장 위험한 것은 그럴듯한 오류입니다. 이 프로젝트가 내세우는 규칙은 사람에 관한 것은 아무것도 짐작하지 않는다는 것이고, 구현은 도구 인터페이스 수준에서 이를 강제합니다. 어떤 도구도 확신도(confidence score)를 인자로 받지 않습니다. 자기 확신을 점수로 매겨 보라고 하면 모델은 점수를 매기고, 자신이 유용해 보이는 방향으로 틀린다는 이유입니다.
대신 도구는 자신이 관측한 것을 보고합니다. crm.signature-block, github.account-identity 처럼 어디에서 무엇을 봤는지가 이름에 남고, 원장이 그 증거에 값을 매깁니다. 강한 증거는 레코드에 기록되고 약한 증거는 사람이 판정할 제안으로 남습니다. 고객에 대해 자신 있게 틀린 사실은 빈칸보다 나쁘다는 판단이 근거인데, 빈칸은 비어 있음이 보이지만 틀린 값은 누구도 틀렸다는 것을 알 수 없기 때문입니다. 에이전트 동작의 전체 설명은 docs/agent.md에 정리되어 있습니다.
회사의 로고와 색, 산업, 도메인 뒤의 실제 이름을 채우는 브랜드 데이터는 Context 를 사용합니다. 이 키만은 환경 변수가 아니라 데이터베이스 행에 저장되고 온보딩 과정에서 입력받으며 Settings → General 에서 바꿉니다. 자체 호스팅 운영자가 환경 변수를 바꾸려고 재배포할 수는 없다는 이유입니다.
Comp AI CRM의 기술 스택
Bun 위에서 도는 Turborepo 모노레포이며 Vercel 배포를 기준으로 작성되어 있습니다.
| 영역 | 구성 |
|---|---|
| 에이전트 | eve — 지속 세션, 도구, 스킬, 일정, 샌드박스 |
| 모델 접근 | Vercel AI Gateway. 제공자 SDK 없이 호출하며 Vercel 의 OIDC 를 쓰면 관리할 키가 없음 |
| 샌드박스 | 운영은 Vercel Sandbox, 로컬은 Docker 또는 microsandbox |
| 프런트엔드 | Next.js App Router, shadcn/ui, URL 상태 관리는 nuqs |
| API | NestJS 와 nestjs-trpc — HTTP, 인증, tRPC, Google 동기화 |
| 데이터 | Prisma, Postgres(Neon), 선택적 Redis(Upstash) |
| 인증 | Better Auth, Google 전용, 허용 목록 하나 |
| 파일 | Vercel Blob — 프로필 사진을 복제해 원본이 사라져도 남게 함 |
앱은 tRPC 로 API 와 통신하고 라우터 타입은 NestJS 라우터에서 생성되므로, Prisma 행에서 화면의 표 한 칸까지 타입이 이어집니다. 저장소는 코드베이스가 지키는 규칙 세 가지도 적어 두었습니다. 판단은 API 에 두지 않고(신원 매칭기가 두 벌로 갈라진 뒤 한쪽이 지구상의 모든 고용주를 일치시킨 사건이 근거입니다), UI 는 packages/ui 만을 원천으로 삼으며, 조직(organization) 개념은 두지 않습니다. 항상 같은 값이 들어가는 organizationId 는 컬럼과 인덱스와 권한 검사를 늘리면서 아무것도 주지 않는다는 설명입니다.
Comp AI CRM은 누구에게 유용한가
에이전트를 제품의 중심에 두는 구조를 코드로 읽고 싶은 사람에게 특히 유용합니다. 큐 임대와 재개, 확신도를 받지 않는 도구 설계, 자격증명 없는 샌드박스처럼 판단의 근거가 문서와 주석에 남아 있어 자율 에이전트를 운영에 넣을 때 참고할 수 있습니다. 반대로 여러 고객사를 한 인스턴스에서 관리하려는 목적이라면 맞지 않습니다. 단일 테넌트가 의도된 설계이고 조직 구분이 없어서, 로그인한 사람은 모든 데이터를 볼 수 있습니다.
권한 모델이 단순하다는 점도 미리 알고 시작해야 합니다. 로그인은 Google 전용이고 인가는 ALLOWED_SIGN_IN 환경 변수 하나로 끝나며, 값이 비어 있으면 아무도 로그인할 수 없는 방향으로 실패합니다. 저장소도 실제 고객 데이터를 넣기 전에 SECURITY.md를 먼저 읽으라고 안내하고 있습니다. 2026년 7월 말에 공개된 신규 저장소라는 점도 함께 감안할 부분입니다.
Comp AI CRM 설치 및 실행 방법
Bun 과 Docker 가 필요합니다.
git clone https://github.com/trycompai/crm.git && cd crm
cp .env.example .env
bun install
docker compose up -d # Postgres on :5432
bun run db:deploy # 마이그레이션 적용
bun run db:seed # 선택: 살펴볼 만한 예시 파이프라인
bun run dev
앱은 3000번, API 는 3001번 포트에서 뜹니다. .env 에서 채워야 하는 값은 네 개뿐이고 나머지는 모두 선택 사항입니다.
| 변수 | 넣을 값 |
|---|---|
BETTER_AUTH_SECRET |
openssl rand -base64 32 결과 |
ALLOWED_SIGN_IN |
회사 도메인(acme.com) 또는 개별 주소(you@gmail.com) |
GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRET |
Google OAuth 클라이언트. 둘 다 넣거나 둘 다 비우기 |
DATABASE_URL 은 docker compose 로 띄운 Postgres 와 이미 맞춰져 있어 그대로 두면 됩니다. Google 클라이언트는 같은 자격증명으로 Gmail 과 캘린더를 읽으므로 메일함 동기화를 쓸 계획이면 필요하고, 자체 인증 제공자를 쓰는 설치본은 두 값을 비운 채로 Google 버튼과 메일 동기화 없이 운영할 수 있습니다. 에이전트의 조사 범위를 넓히는 PERPLEXITY_API_KEY(웹 검색), RAPIDAPI_KEY(링크드인 프로필), 담당자 대화용 AGENT_BRIDGE_SECRET, 동기화 경로를 보호하는 CRON_SECRET 은 필요할 때 추가합니다.
배포는 Next.js 앱과 NestJS API, 에이전트 세 개의 배포와 Postgres 하나로 구성됩니다. 세 배포가 반드시 일치해야 하는 값은 DATABASE_URL 과 BETTER_AUTH_SECRET 입니다. API 가 세션 쿠키를 발급하고 앱이 검증하기 때문에, 값이 어긋나면 에러가 아니라 리다이렉트 루프로 나타납니다.
Comp AI CRM의 라이선스
Comp AI CRM 은 MIT 라이선스로 공개되어 있어 개인 및 상업적 목적으로 자유롭게 사용할 수 있습니다.
Comp AI CRM 공식 홈페이지
Comp AI CRM 조사 에이전트 문서
Comp AI CRM 프로젝트 GitHub 저장소
더 읽어보기
-
DeerFlow: 웹 브라우징, 검색 엔진, MCP 등을 통합한 멀티 에이전트 리서치 어시스턴트 (feat. ByteDance)
-
Sakana AI의 첫 상용 제품, 최대 8시간 자율 추론으로 전략 리서치를 수행하는 Sakana Marlin 출시
이 글은 GPT 모델로 정리한 초안을 바탕으로 한 것으로, 원문의 내용 또는 의도와 다르게 정리된 내용이 있을 수 있습니다. 관심있는 내용이시라면 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 댓글로 알려주시기를 부탁드립니다. ![]()
이 도구를 직접 설치해 사용해보셨다면, 파이토치 한국 사용자 모임
회원들을 위해 경험이나 팁을 댓글로 남겨주세요! ![]()




