NornWeave 소개: AI 에이전트에게 자체 이메일 인박스 제공

발행: (2026년 2월 5일 오전 06:20 GMT+9)
9 분 소요
원문: Dev.to

Source: Dev.to

내가 계속 마주친 문제

AI 에이전트에게 이메일을 읽고 보낼 수 있는 능력을 부여하려고 할 때마다 같은 벽에 부딪혔습니다. 표준 이메일 API는 트랜잭션 전송을 위해 설계되었습니다—환영 이메일을 보내고, 영수증을 전송하고, 끝. 설계상 상태를 유지하지 않습니다.

하지만 에이전트는 컨텍스트가 필요합니다. 다음을 알아야 합니다:

  • “고객이 세 번째 전 메시지에서 뭐라고 했나요?”
  • “이것이 새로운 대화인가, 아니면 진행 중인 스레드의 일부인가?”
  • “HTML 잡동사니와 서명 블록을 제외한 실제 내용은 무엇인가?”

같은 스레딩 로직, 같은 HTML‑to‑text 변환, 같은 웹훅 핸들러를 반복해서 작성하고 있었습니다. 그래서 NornWeave를 만들어 한 번에 해결하고 같은 문제에 직면한 모든 사람과 공유했습니다.

NornWeave란?

NornWeave는 AI 에이전트를 위해 특별히 제작된 오픈‑소스, 자체‑호스팅 Inbox‑as‑a‑Service API입니다. 원시 이메일 위에 두 개의 레이어를 추가합니다:

LayerDescription
Stateful Layer가상 인박스, 대화 스레드, 전체 메시지 히스토리
Intelligent LayerHTML → Markdown 파싱, 자동 스레딩, 의미 검색

에이전트는 복잡한 웹훅과 HTML 파싱에 얽매이지 않고 깔끔한 REST API 또는 MCP(Model Context Protocol)를 통해 이메일을 소비합니다.

하이라이트

📬 에이전트를 위한 가상 인박스

각 에이전트마다 고유한 이메일 주소가 할당됩니다. 필요에 따라 원하는 만큼 생성하세요:

curl -X POST http://localhost:8000/v1/inboxes \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name": "Support Agent", "email_username": "support"}'

이제 하나의 인박스를 공유하고 제목줄로 필터링할 필요가 없습니다. 각 에이전트가 자신의 대화를 소유합니다.

🧵 자동 스레딩

NornWeave는 이메일 헤더(In-Reply-To, References, Message-ID)를 사용해 관련 메시지를 자동으로 스레드로 묶습니다. 스레드를 가져오면 LLM 친화적인 형식으로 제공됩니다:

{
  "id": "th_123",
  "subject": "Re: Pricing Question",
  "messages": [
    { "role": "user", "author": "bob@gmail.com", "content": "How much is it?", "timestamp": "..." },
    { "role": "assistant", "author": "agent@myco.com", "content": "$20/mo", "timestamp": "..." }
  ]
}

이제 “이메일 체인을 파싱하고 누가 뭐라고 했는지 파악한다”는 작업이 필요 없습니다. 이미 처리되어 있습니다.

🧹 깔끔한 콘텐츠, 불필요한 내용 제거

수신된 HTML 이메일은 깔끔한 Markdown으로 변환됩니다. 서명, 면책조항, 인용된 답장 블록 등이 제거되어 에이전트가 실제 메시지만 볼 수 있습니다.

🔌 MCP 통합

NornWeave는 Claude, Cursor 및 기타 MCP 호환 클라이언트와 직접 연결되는 MCP 서버를 제공합니다.

도구기능 설명
create_inbox새 이메일 주소 프로비저닝
send_email이메일 전송 (Markdown → HTML 자동 변환)
search_email관련 메시지 검색
wait_for_reply답장이 도착할 때까지 블록 (실험적)

MCP 클라이언트에 다음과 같이 설정합니다:

{
  "mcpServers": {
    "nornweave": {
      "command": "nornweave-mcp",
      "args": ["--api-url", "http://localhost:8000"]
    }
  }
}

이제 에이전트가 “내 인박스를 확인해줘”라고 말하면 실제로 수행됩니다.

📧 사용 중인 이메일 제공업체와 호환

제공업체발송수신
Mailgun
AWS SES
SendGrid
Resend

웹훅 URL만 설정하면 NornWeave가 나머지를 처리합니다.

아키텍처 (조금의 노르스 신화)

모듈이름목적
저장 레이어Urdr (The Well)PostgreSQL/SQLite 어댑터
수집 엔진Verdandi (The Loom)웹훅 처리, HTML → Markdown 변환, 스레드화
아웃바운드 레이어Skuld (The Prophecy)이메일 전송, 속도 제한
API 게이트웨이YggdrasilFastAPI 라우트, 모든 것을 연결
MCP 리소스Huginn (Thought Raven)AI 에이전트를 위한 읽기 작업
MCP 도구Muninn (Memory Raven)AI 에이전트를 위한 쓰기 작업

원시 이메일 스트림은 우물에서 나오는 물처럼 들어옵니다. 직조기는 이를 일관된 스레드로 엮어냅니다. 여러분의 에이전트는 깨끗하고 구조화된 소스로부터 마십니다.

시작하기

# Clone the repo
git clone https://github.com/DataCovey/nornweave.git
cd nornweave

# Copy environment config
cp .env.example .env

# Start with Docker
docker compose up -d

# Run migrations
docker compose exec api alembic upgrade head

또는 uv를 사용한 로컬 개발을 선호한다면:

make install-dev
make migrate
make dev

전체 문서는 여기에서 확인할 수 있습니다.

What’s Next?

나는 지금 공개적으로 이 프로젝트를 진행하고 있기 때문에 로드맵이 공개돼 있어. 내가 생각하고 있는 내용은 다음과 같아:

  • 더 나은 첨부 파일 처리 – PDF와 문서를 텍스트로 추출해 에이전트가 활용하도록
  • 예약 전송 – “내일 오전 9시에 답장”
  • 에이전트 핸드오프 패턴 – 봇에서 사람으로 원활하게 에스컬레이션
  • 다양한 벡터 검색 옵션 – pgvector를 넘어서는 옵션

하지만 솔직히 말해서, 당신이 필요로 하는 것이 무엇인지 듣고 싶어. 이메일을 다루는 에이전트를 만들고 있다면 가장 어려운 부분은 뭐야? 무엇이 당신의 작업을 더 쉽게 만들 수 있을까? 프로젝트 형태를 잡는 데 자유롭게 의견을 주세요.

NornWeave는 Apache 2.0 라이선스를 따르며, 저장소는 .

GitHub 저장소

공개적으로 빌드하는 건 조금 무섭지만 동시에 흥미롭기도 해. 나는 한동안 이 작업에 몰두했었고, 이제 비슷한 문제를 해결하는 다른 사람들에게도 공감될 수 있는지 확인할 수 있게 되었어.

AI 에이전트에게 이메일을 통한 커뮤니케이션 능력을 부여한다면, NornWeave가 내가 겪었던 여러 골칫거리를 덜어주길 바라. 아직 당신의 필요에 딱 맞지 않다면—왜 그런지 알려줘. 나는 귀 기울이고 있어.

읽어줘서 고마워. 즐거운 위빙 되세요. 🧶

Back to Blog

관련 글

더 보기 »

AI가 당신에게 뺨을 때릴 때

AI가 당신을 뺨 때릴 때: Adama에서 Claude가 생성한 코드 디버깅 AI에게 복잡한 기능을 “vibe‑code”하게 맡겨본 적이 있나요? 그 결과 미묘한 버그를 디버깅하느라 몇 시간을 보내게 됩니다.