← 블로그로 돌아가기
#Exa#검색API#AI에이전트#MCP#RAG#1인개발

Exa Search 실전 가이드: AI 에이전트에 실시간 웹 검색 붙이기

·17분 읽기
TL;DR
  • Exa는 LLM을 위해 처음부터 다시 만든 시맨틱 웹 검색 API다. 키워드가 아니라 의미 기반으로 검색하고, 클린 텍스트를 바로 돌려준다
  • MCP 서버가 오픈소스로 무료 제공되어 Claude Code, Cursor에 바로 연동할 수 있다
  • FRAMES 벤치마크 54.4%로 Perplexity, Brave를 앞서고, Exa Instant는 180ms 이하 응답을 낸다
  • 블로그 리서치 자동화, 경쟁사 모니터링, RAG 파이프라인 구축에 바로 쓸 수 있다

AI 에이전트를 만들어봤다면 한 번은 막힌다.

훈련 데이터 컷오프. 지난주에 나온 뉴스는 모른다. 지금 경쟁사가 뭘 내놨는지 모른다. 실시간 시세, 최신 라이브러리 버전, 어제 올라온 블로그 포스트 — 전부 모른다.

에이전트한테 "요즘 시장 어때?"라고 물으면 2024년 기준으로 답한다.

반쪽짜리 에이전트다.

해결책은 간단하다. 에이전트한테 인터넷 검색을 붙이면 된다. 그런데 여기서 선택이 갈린다. 구글 검색 API를 쓸 것인가, Exa를 쓸 것인가.

결론부터 말하면: LLM 기반 앱을 만든다면 Exa다.

Exa — AI 앱을 위한 웹 검색 인프라
LLM을 위해 처음부터 다시 만든 시맨틱 웹 검색 API.

Exa Search가 뭔가

Exa는 AI 애플리케이션을 위해 처음부터 새로 만든 웹 검색 API다.

기존 검색 엔진은 사람이 브라우저에서 쓰는 것을 기준으로 설계됐다. 결과를 HTML로 돌려주고, 광고가 섞이고, 스크래핑하려면 파싱해야 한다. LLM 컨텍스트에 넣기엔 노이즈가 너무 많다.

Exa는 다르다. 쿼리를 자연어로 받아 시맨틱하게 이해하고, 클린한 텍스트 콘텐츠를 바로 돌려준다. LLM이 바로 읽을 수 있는 형태로.

Notion, Cursor, AWS, Databricks, HubSpot, Lovable, Monday.com이 쓰고 있다. 개인 프로젝트에서 엔터프라이즈까지 스펙트럼이 넓다.

Exa는 검색 엔진이 아니라 AI 앱을 위한 웹 검색 인프라다.

왜 구글 검색 API가 아니라 Exa인가

구글 API 키워드 검색 vs Exa 시맨틱 검색 비교
키워드 매칭이 아니라 의미를 이해하는 검색. LLM에 최적화된 결과를 돌려줍니다.

시맨틱 검색

구글 API는 키워드 매칭이다. "1인 개발자 SaaS 툴"이라고 치면 저 세 단어가 들어간 페이지를 찾는다.

Exa는 의미를 이해한다. "혼자 운영하는 개발자가 구독 결제를 받을 수 있는 서비스"처럼 자연어로 쿼리해도 의도를 파악해서 관련 결과를 돌려준다. 프롬프트를 그대로 쿼리로 넘겨도 동작한다.

LLM에 최적화된 콘텐츠

구글 API 응답에는 제목, URL, 스니펫 정도만 들어있다. 실제 내용을 가져오려면 URL을 다시 크롤링해야 한다.

Exa의 Contents API는 URL을 넘기면 파싱된 클린 텍스트를 바로 돌려준다. HTML 파싱 코드 따로 짤 필요 없다.

벤치마크 성능

FRAMES(사실 확인 RAG 평가): 54.4% — 업계 1위 Tip-of-Tongue(애매한 기억 검색): 54.2% Seal0(일반 웹 검색): 36%

Perplexity와 Brave를 모두 앞선다. 특히 RAG 파이프라인에서 차이가 크게 난다.

속도

Exa Instant는 180ms 이하 응답. 에이전트 루프 안에서 검색을 반복적으로 호출해도 병목이 되지 않는다.


핵심 기능 5가지

Exa Search API — FRAMES, Tip-of-Tongue, Seal0 벤치마크에서 Perplexity, Brave 대비 1위
정확도와 속도 모두에서 경쟁사를 앞서는 Exa의 5가지 핵심 기능을 살펴봅니다.

1. Search API — 자연어 웹 검색

from exa_py import Exa

exa = Exa("your-api-key")

results = exa.search(
    "1인 개발자가 SaaS 첫 매출 만든 방법",
    num_results=5,
    use_autoprompt=True  # 쿼리 자동 최적화
)

for r in results.results:
    print(r.title, r.url)

use_autoprompt=True를 켜면 Exa가 쿼리를 내부적으로 최적화해서 더 관련성 높은 결과를 가져온다.

2. Contents API — URL에서 클린 텍스트 추출

# 검색과 콘텐츠 추출을 한 번에
results = exa.search_and_contents(
    "Stripe 결제 연동 튜토리얼",
    num_results=3,
    text=True,          # 전체 텍스트 포함
    highlights=True     # 핵심 구절 추출
)

for r in results.results:
    print(r.text[:500])  # 클린 텍스트 바로 사용 가능

별도 URL 크롤러 없이 검색과 본문 추출을 한 번에 처리한다.

3. Answer API — 질문에 답변 + 출처

answer = exa.answer(
    "한국에서 개인이 SaaS 결제를 받으려면 사업자 등록이 필요한가?"
)

print(answer.answer)
for source in answer.sources:
    print(f"출처: {source.url}")

RAG를 직접 구현하지 않아도 질문-답변+출처 플로우를 바로 쓸 수 있다.

4. Websets — 구조화된 데이터 수집

대량의 구조화된 웹 데이터가 필요할 때 쓴다. "한국 SaaS 스타트업 목록"처럼 넓은 범위의 데이터를 스프레드시트처럼 수집할 수 있다.

경쟁사 리스트 자동 수집, 잠재 고객 리스트 빌딩, 시장 조사에 적합하다.

5. Find Similar — 유사 페이지 탐색

# 특정 URL과 유사한 페이지 찾기
similar = exa.find_similar(
    "https://notion.so",
    num_results=5
)

레퍼런스 페이지를 주면 비슷한 성격의 사이트를 찾아준다. 경쟁사 탐색, 유사 콘텐츠 발굴에 유용하다.


MCP 서버로 바로 쓰기 (Claude Code, Cursor)

Claude Code/Cursor에서 MCP Server를 통해 Exa API를 사용하는 아키텍처
MCP 서버 설정 하나로 Claude Code와 Cursor에서 바로 웹 검색을 쓸 수 있습니다.

MCP를 통해 바로 쓸 수 있는 방법이 있다. Exa MCP 서버는 오픈소스로 무료 제공된다.

Claude Code 설정

~/.claude.json (또는 프로젝트의 .claude/settings.json)에 추가:

{
  "mcpServers": {
    "exa": {
      "command": "npx",
      "args": ["-y", "exa-mcp-server"],
      "env": {
        "EXA_API_KEY": "your-api-key"
      }
    }
  }
}

또는 원격 MCP 서버를 직접 사용:

{
  "mcpServers": {
    "exa": {
      "url": "https://mcp.exa.ai/mcp",
      "headers": {
        "x-api-key": "your-api-key"
      }
    }
  }
}

원격 URL 방식은 npx 없이 바로 연결되어 설정이 더 간단하다. API 키는 동일하게 필요하다.

Cursor 설정

~/.cursor/mcp.json:

{
  "mcpServers": {
    "exa": {
      "command": "npx",
      "args": ["-y", "exa-mcp-server"],
      "env": {
        "EXA_API_KEY": "your-api-key"
      }
    }
  }
}

사용 가능한 MCP 도구

설정 후 Claude Code / Cursor에서 바로 사용 가능한 도구들:

도구용도
web_search_exa자연어 웹 검색
company_research_exa회사/제품 리서치
people_search_exa인물 검색
crawling_exa특정 URL 크롤링 + 파싱
get_code_context_exaGitHub 코드 컨텍스트 검색
💡TIP

Claude Code에서 "Exa로 [주제] 검색해줘"라고 하면 MCP 도구를 자동으로 호출한다. 에이전트가 검색 → 분석 → 정리를 연속으로 처리하는 워크플로우가 된다.

실제 사용 예시

경쟁사 분석: "Exa로 한국 SaaS 결제 솔루션 경쟁사 5개 찾고 각 제품의 가격 정책 정리해줘"

콘텐츠 리서치: "Exa로 indie hacker가 첫 100명 유저 모은 사례 찾아서 공통 패턴 뽑아줘"

기술 조사: "Exa로 Next.js 15 App Router 성능 최적화 최신 글 찾아줘"


API로 직접 개발하기

설치

# Python
pip install exa-py

# JavaScript/TypeScript
npm install exa-js
# or
bun add exa-js

JavaScript/TypeScript 예시

import Exa from "exa-js";

const exa = new Exa(process.env.EXA_API_KEY);

// 검색 + 콘텐츠 한 번에
const results = await exa.searchAndContents(
  "solopreneur SaaS revenue milestone",
  {
    numResults: 5,
    text: { maxCharacters: 2000 },
    highlights: { numSentences: 3 },
    startPublishedDate: "2025-01-01", // 최신 글만
  }
);

for (const result of results.results) {
  console.log(result.title);
  console.log(result.highlights); // 핵심 구절
  console.log(result.text);       // 전체 텍스트
}

Anthropic Tool Calling과 연동

import Anthropic from "@anthropic-ai/sdk";
import Exa from "exa-js";

const anthropic = new Anthropic();
const exa = new Exa(process.env.EXA_API_KEY);

// Claude에게 Exa 검색 도구 제공
const tools = [
  {
    name: "search_web",
    description: "최신 웹 정보를 검색합니다",
    input_schema: {
      type: "object" as const,
      properties: {
        query: { type: "string", description: "검색 쿼리" },
        num_results: { type: "number", description: "결과 수 (기본 5)" },
      },
      required: ["query"],
    },
  },
];

async function agentWithSearch(userMessage: string) {
  let messages = [{ role: "user" as const, content: userMessage }];

  while (true) {
    const response = await anthropic.messages.create({
      model: "claude-opus-4-6",
      max_tokens: 4096,
      tools,
      messages,
    });

    if (response.stop_reason === "end_turn") {
      return response.content;
    }

    // 도구 호출 처리
    const toolUses = response.content.filter((c) => c.type === "tool_use");
    const toolResults = [];

    for (const toolUse of toolUses) {
      if (toolUse.type !== "tool_use") continue;
      const { query, num_results = 5 } = toolUse.input as {
        query: string;
        num_results?: number;
      };

      const searchResults = await exa.searchAndContents(query, {
        numResults: num_results,
        text: { maxCharacters: 1500 },
      });

      toolResults.push({
        type: "tool_result" as const,
        tool_use_id: toolUse.id,
        content: JSON.stringify(
          searchResults.results.map((r) => ({
            title: r.title,
            url: r.url,
            text: r.text,
          }))
        ),
      });
    }

    messages = [
      ...messages,
      { role: "assistant", content: response.content },
      { role: "user", content: toolResults },
    ];
  }
}

// 사용
const result = await agentWithSearch(
  "요즘 1인 개발자들이 첫 매출 만드는 방법 중에 가장 효과적인 전략이 뭐야?"
);

이 패턴으로 Claude가 답변에 최신 웹 정보가 필요하다고 판단하면 자동으로 Exa 검색을 호출한다.

💡TIP

Vercel AI SDK, LangChain, LlamaIndex와도 공식 통합을 지원한다. 기존 스택에 그대로 붙이면 된다.


가격 — 무료로 어디까지 가능한가

플랜가격내용
Free$0사용량 기반 과금, 소량 무료 크레딧
Websets Starter$49/월구조화 데이터 수집 소규모
Websets Pro$449/월대규모 데이터 파이프라인
Enterprise문의커스텀

Search API, Contents API, Answer API는 사용량 기반이다. 사이드 프로젝트 수준에서는 무료 크레딧으로 충분히 테스트할 수 있다.

MCP 서버는 무료고 오픈소스다. Claude Code나 Cursor에서 리서치 보조 도구로만 쓴다면 비용이 거의 없다.

💡TIP

먼저 MCP 서버로 일주일 써보고 실제로 유용한지 확인한 다음 API 키를 만드는 순서를 권장한다.


실전 활용 시나리오 — 1인 개발자

Exa API로 AI 에이전트에 실시간 웹 검색을 추가한 실전 활용 사례
블로그 리서치 자동화, 경쟁사 모니터링, RAG 파이프라인까지 — 1인 개발자가 바로 쓸 수 있는 패턴입니다.

1. 블로그 글 리서치 자동화

글 하나 쓰기 전에 레퍼런스 수집하는 데 시간이 많이 든다. 이걸 자동화할 수 있다.

def research_topic(topic: str) -> str:
    # 최근 3개월 내 관련 글 수집
    results = exa.search_and_contents(
        topic,
        num_results=10,
        text=True,
        highlights=True,
        start_published_date="2025-12-01",
    )

    # 핵심 구절만 모아서 정리
    digest = []
    for r in results.results:
        digest.append(f"## {r.title}\n출처: {r.url}\n{' '.join(r.highlights or [])}")

    return "\n\n".join(digest)

# 사용
research = research_topic("AI 에이전트 프로덕션 배포 실패 사례")
# → Claude에게 넘겨서 블로그 초안 작성

2. 경쟁사 모니터링

import schedule
from datetime import datetime, timedelta

def weekly_competitor_monitor():
    competitors = ["notion.so", "coda.io", "obsidian.md"]
    week_ago = (datetime.now() - timedelta(days=7)).strftime("%Y-%m-%d")

    for competitor in competitors:
        # 지난 주 경쟁사 관련 최신 글 수집
        results = exa.find_similar(
            f"https://{competitor}",
            num_results=5,
            start_published_date=week_ago,
        )
        print(f"\n[{competitor}] 최근 동향:")
        for r in results.results:
            print(f"  - {r.title}: {r.url}")

schedule.every().monday.at("09:00").do(weekly_competitor_monitor)

크론으로 돌려두면 매주 월요일 아침에 경쟁사 동향 리포트가 나온다.

3. AI 에이전트에 실시간 검색 붙이기

앞서 보여준 Anthropic Tool Calling 패턴이 핵심이다. 에이전트가 답하기 전에 자동으로 최신 정보를 확인한다.

  • 고객 지원 봇: "최신 버전 릴리즈 노트 확인" 자동화
  • 마켓 리서치 에이전트: 실시간 시장 동향 수집
  • 콘텐츠 생성 에이전트: 최신 레퍼런스 기반 글쓰기

4. RAG 파이프라인 구축

def rag_with_exa(question: str) -> str:
    # 1. Exa로 관련 문서 검색
    search_results = exa.search_and_contents(
        question,
        num_results=5,
        text=True,
        text_contents_options={"max_characters": 2000},
    )

    # 2. 컨텍스트 구성
    context = "\n\n".join([
        f"출처: {r.url}\n{r.text}"
        for r in search_results.results
    ])

    # 3. Claude에게 컨텍스트 기반 답변 요청
    response = anthropic.messages.create(
        model="claude-opus-4-6",
        max_tokens=1024,
        messages=[{
            "role": "user",
            "content": f"다음 출처를 바탕으로 질문에 답하세요.\n\n{context}\n\n질문: {question}"
        }]
    )

    return response.content[0].text

벡터 DB 없이도 실시간 RAG가 된다. FRAMES 벤치마크 1위라는 게 이 용도에서 의미가 크다.


마무리: 왜 1인 개발자의 AI 스택에 필수인가

AI 에이전트가 강력해질수록 병목은 코드가 아니라 데이터가 된다.

에이전트가 코드를 짜고, 분석하고, 결정을 내린다. 그런데 판단 근거가 2024년 데이터라면? 실시간 시장 상황을 모른다면?

Exa는 그 병목을 푼다. 에이전트가 웹을 읽을 수 있게 만든다. 최신 정보를 기반으로 판단하게 만든다.

1인 개발자 입장에서 보면:

  • 리서치 시간 단축: 레퍼런스 수집, 경쟁사 조사, 시장 동향 파악이 자동화된다
  • 에이전트 품질 향상: 실시간 정보 기반으로 답변이 달라진다
  • RAG 파이프라인 간소화: 벡터 DB 없이도 검색 증강 생성이 된다

MCP 서버로 시작하면 오늘 당장 써볼 수 있다. Claude Code에서 경쟁사 리서치를 시켜보고, Cursor에서 최신 라이브러리 사용법을 물어봐라. 차이가 바로 보인다.

AI 스택에서 검색은 선택이 아니라 기반이다. 에이전트한테 인터넷 눈을 달아줘야 진짜 에이전트가 된다.

참고자료

도구를 알았으면 이제 만들 차례

AI 코파운더와 함께 30일 안에 아이디어를 검증하고 첫 유저를 만나보세요.

무료로 시작하기