Skip to main content
Glama
wildsurfer

your-mail-mcp

your-mail-mcp

당신의 메일에는 이미 답이 들어 있습니다. 예약 번호, 탑승 게이트 코드, 인보이스, 보증 기간, 사람들이 문서로 약속한 내용까지. 이 서버는 당신의 AI 어시스턴트가 그 답을 찾을 수 있게 해줍니다.

이런 것들을 물어보세요:

  • "6월 페리 예약 번호를 찾아줘."

  • "지난여름 호텔이 보낸 와이파이 비밀번호가 뭐였지?"

  • "회계사가 VAT에 대해 뭐라고 답했고, 언제였지?"

  • "지붕 공사와 관련해 나와 시공사 사이에 오간 모든 내용을 시간순으로 모아서, 누가 무엇을 약속했는지 요약해줘."

  • "오늘 아침에 모든 계정에 도착한 것 중 실제로 내가 처리해야 할 것은 뭐지?"

이런 용도로 사용하세요:

  • 질문을 이해하는 검색. 전체 이력에 대한 전문(full-text) 검색, 모든 계정을 하나의 인덱스로 통합, 검색 문법이 아닌 당신이 생각하는 방식으로 질문할 수 있습니다.

  • 스마트폰에서 하는 트리아지. 밤사이 도착한 메일을 아침에 요약해주고, 스팸은 이미 걸러진 상태로 어디서든 확인할 수 있습니다.

  • 다른 작업의 맥락으로서의 메일. 클라이언트의 요구사항을 스레드에서 꺼내 코딩이나 문서 작업 세션에 붙여넣는 대신 직접 가져올 수 있습니다.

  • 계속 실행해둘 수 있는 에이전트. 이 서버는 읽기만 가능합니다. 악성 메일이 어시스턴트에 도달해도 읽히는 것 외에는 아무 일도 일어나지 않습니다. 보내기, 삭제, 이동 기능이 아예 없기 때문입니다. 따라서 예약된 다이제스트와 상시 실행 에이전트를 안심하고 돌릴 수 있습니다.

설정은 파일 두 개와 docker compose up -d로 끝납니다 — 실행하기를 참조하세요.

자체 호스팅 MCP 서버로, MCP 클라이언트(Claude 또는 streamable HTTP MCP와 OAuth를 지원하는 다른 클라이언트)에게 메일에 대한 읽기 접근 권한을 제공합니다. 하나 이상의 IMAP 계정을 mbsync로 로컬 maildir에 미러링하고, notmuch로 인덱싱한 뒤, 그 인덱스에서 도구 호출에 응답합니다.

your-mail-mcp의 작동 방식: 메일이 IMAP 제공자에서 로컬 미러로 가져와지고, notmuch으로 인덱싱되며, OAuth 게이트를 통해 MCP 클라이언트에 제공됩니다. 제공자로 돌아가는 쓰기 경로는 없습니다.

그림에서 메일은 항상 왼쪽에서 오른쪽으로만 이동합니다. 서버가 제공자 쪽으로 되돌아가는 유일한 화살표는 시작 시 한 번 실행되는 IMAP LIST로, 해당 서버가 스팸/휴지통 폴더를 어떻게 부르는지 확인하기 위한 것입니다. 메일박스를 선택하거나 메시지를 가져오는 일은 절대 없습니다. 다이어그램 소스는 docs/diagrams/how-it-works.html입니다.

할 수 없는 것

읽기 전용 속성은 아키텍처에 내장되어 있습니다.

미러는 풀 전용입니다. 모든 계정에 대해 생성되는 mbsync 설정에는 Sync Pull, Create Near, Remove None, Expunge None이 포함되어 있습니다 — 이 설정에는 서버로 변경을 밀어넣거나, 메시지를 삭제하거나, 삭제를 확정(expunge)하는 기능이 전혀 없습니다.

Go 코드에서 유일한 IMAP 작업은 LIST이며, 계정당 시작 시 한 번 실행되어 각 계정의 스팸/휴지통 폴더를 찾습니다( 제공자별 참고문제 해결 참고). 이 연결은 로그인하고, 메일박스를 나열하고, 로그아웃합니다. 메일박스를 선택하거나 메시지를 가져오는 일은 절대 없습니다.

보내기, 삭제, 이동, 태그 기능은 없습니다. 첨부 파일은 showthread에 나열되며 attachment 도구로 읽기 전용으로 제공됩니다. 한 번에 하나의 파트씩, 최대 5MB로 제한됩니다. 더 큰 파트는 GET /attachment/{id}/{part}에서 원본 그대로 제공되며, 베어러 토큰 또는 도구가 초과 크기 파트를 거부할 때 반환하는 단기 서명 링크로 인증됩니다. 이 프로세스에서 어떤 계정에 대한 쓰기 권한도 없습니다.

10개의 도구, 모두 읽기 전용입니다:

도구

기능

search

메일 검색. 스레드 요약을 JSON으로 반환합니다.

ids

쿼리와 일치하는 메시지 ID를 반환합니다.

files

쿼리와 일치하는 maildir 파일 경로를 반환합니다.

count

쿼리와 일치하는 메시지 수를 셉니다.

show

메시지 하나를 표시합니다: 헤더와 디코딩된 본문을 JSON으로.

thread

메시지가 포함된 전체 스레드를 표시합니다. 기본적으로 스팸/휴지통 답장은 제외하며, include_excluded를 설정하면 포함합니다.

text

메시지 하나의 일반 텍스트 본문을 반환하며, HTML을 변환합니다.

folders

계정, 폴더, 인덱스 태그, 각 계정의 마지막 동기화 및 마지막 오류를 나열합니다.

refresh

지금 INBOX를 동기화하고 도착한 메시지 수를 보고합니다.

attachment

show의 파트 번호로 메시지의 첨부 파일 또는 MIME 파트 하나를 가져옵니다. 이미지와 바이너리는 타입이 지정된 콘텐츠로, 텍스트는 마크된 블록으로 제공됩니다. 5MB가 넘는 파트는 서명된 다운로드 링크로 대신 제공됩니다.

search, ids, files, count는 notmuch 쿼리(from:, to:, subject:, tag:, folder:, date:2026-01-01..2026-06-30, and/or/not으로 조합)를 받고, 선택적으로 account로 계정을 한정할 수 있으며, include_excluded로 스팸/휴지통을 포함할 수 있습니다.

Related MCP server: notmuchproxy

실행하기

이 서버를 실행하는 세 가지 방법이 있습니다. 차이는 단 하나: 서버에 접근할 수 있는 사람입니다. 사례 1부터 시작하고 필요할 때만 단계를 올리세요. 어떤 것도 기본값 이상으로 보안이 강화되어 있지 않습니다 — 그건 보안 강화에서 다루며, 의도적으로 분리되어 있어 먼저 작동을 확인할 수 있습니다.

실행 위치

접근 가능한 사람

메일 저장 위치

1

당신의 기기

그 기기에서만

당신의 기기

2

당신의 기기

당신, 어디서든

당신의 기기

3

VPS

당신, 어디서든

임대한 디스크

서버는 ghcr.io/wildsurfer/your-mail-mcp 컨테이너 이미지로 제공되며, CI가 amd64와 arm64용으로 빌드하고 게시합니다. 컴파일할 것이 없으며, 모든 사례는 빈 디렉터리에 파일 두 개를 두는 것으로 시작합니다:

mkdir your-mail && cd your-mail
curl -fsSLO https://raw.githubusercontent.com/wildsurfer/your-mail-mcp/main/compose.yaml
curl -fsSL https://raw.githubusercontent.com/wildsurfer/your-mail-mcp/main/accounts.example.json -o accounts.json

accounts.json을 당신의 계정으로 편집하고(계정 파일 참고), 그 파일이 참조하는 비밀값을 compose.yaml 옆의 .env 파일에 넣으세요:

# .env
OAUTH_PASSPHRASE=pick-a-long-one-you-can-type-on-a-smartphone
WORK_PASS=your-gmail-app-password
PERSONAL_PASS=your-icloud-app-specific-password

OAUTH_PASSPHRASE는 사례 2와 3에서 인터넷과 당신의 메일 사이에 있는 유일한 자격 증명입니다. 그에 걸맞게 취급하세요.

이 두 파일에는 당신의 메일 비밀번호가 들어 있습니다. 이 디렉터리를 버전 관리에 넣거나 기기를 벗어나는 백업에 포함시킬 경우, 그에 맞게 취급하세요.


사례 1 — 당신의 기기에서, 당신의 기기에서만

서버는 루프백에 바인딩됩니다. 당신의 기기 밖에서는 아무도 접근할 수 없으므로 TLS를 설정하거나 호스트 이름을 소유할 필요가 없습니다. CLI 도구는 사용할 수 있습니다. 스마트폰은 사용할 수 없습니다.

.env에 한 줄을 추가하세요:

PUBLIC_URL=http://127.0.0.1:8080

그 다음 시작하세요:

docker compose up -d
docker compose logs -f          # watch the first sync

첫 동기화는 maildir을 채우며 큰 메일박스에서는 시간이 걸립니다. 의도적으로 가능한 것보다 느리게, 한 번에 하나의 IMAP 명령으로 실행됩니다. 제공자가 속도 제한을 걸기 때문입니다. 별도의 초기화 단계는 없습니다.

Claude Code

claude mcp add --transport http your-mail http://127.0.0.1:8080/mcp

그 다음 Claude Code에서 /mcp를 실행하고 your-mail을 선택한 후 인증하세요. 브라우저가 동의 페이지를 열며, 여기서 요구하는 것은 하나입니다: 당신의 OAUTH_PASSPHRASE. 이 작업을 완료하기 전까지 claude mcp listNeeds authentication을 표시합니다.

Codex

codex mcp add your-mail --url http://127.0.0.1:8080/mcp
codex mcp login your-mail

codex mcp list는 인증 상태를 표시합니다. 로그인에 성공한 후에도 세션에 도구가 나타나지 않는다면, 이는 OAuth 자격 증명을 얻은 후 사용하지 않는 알려진 Codex 버그입니다(openai/codex#20009). 수정될 때까지 아래 브리지를 사용하세요.

mcp-remote가 OAuth 흐름을 직접 수행하고 서버를 stdio로 다시 노출합니다. 모든 MCP 클라이언트가 지원하는 방식입니다:

# ~/.codex/config.toml
[mcp_servers.your-mail]
command = "npx"
args = ["-y", "mcp-remote", "http://127.0.0.1:8080/mcp"]

첫 실행 시 동일한 동의 페이지가 열리고 토큰을 캐시합니다.


사례 2 — 당신의 기기에서, 어디서든 접근 가능

동일한 서버에 공개 HTTPS 주소를 제공하는 무언가를 더한 것입니다. 메일은 당신의 기기에 남아 있고, 홈 네트워크에서 아무것도 수신하지 않습니다. 터널이 외부로 연결을 걸기 때문입니다. 스마트폰과 데스크톱 앱에 필요합니다: 커스텀 커넥터는 공급업체의 서버가 가져오기 때문에 사설 주소에 접근할 수 없습니다.

Tailscale 사용 (도메인 불필요)

macOS와 Linux에서 동일한 명령 하나로, 도메인을 소유하지 않고도 HTTPS 호스트 이름을 얻을 수 있습니다.

tailscale funnel --bg 8080

--bg는 재부팅 후에도 계속 실행되게 합니다. 공개 URL을 출력하며, https://your-machine.your-tailnet.ts.net 형태입니다. 이 호스트 이름을 사용하세요:

# .env
PUBLIC_URL=https://your-machine.your-tailnet.ts.net
docker compose up -d

Funnel은 HTTPS 인증서와 tailnet에 Funnel 노드 속성이 활성화되어 있어야 합니다. CLI가 처음에 정책 라인을 추가하도록 제안하며, 나머지는 관리 콘솔에서 처리합니다. tailscale funnel status는 노출된 항목을 보여주고, tailscale funnel --https=443 off는 해제합니다.

Cloudflare 사용 (도메인을 소유하고 있고 Cloudflare에 등록된 경우)

.ts.net이 아닌 당신의 도메인에 호스트 이름을 원한다면 이 방법을 사용하세요. 아래의 mail.example.com당신의 도메인이며, 이미 Cloudflare 계정에 추가되어 있어야 합니다 — Cloudflare는 명명된 터널에 호스트 이름을 제공하지 않습니다.

cloudflared tunnel login
cloudflared tunnel create your-mail

create는 터널의 UUID와 방금 작성한 자격 증명 파일을 출력합니다:

Tunnel credentials written to /Users/you/.cloudflared/f9e2…-… .json
Created tunnel your-mail with id f9e2…-…

아래에서 정확한 경로를 사용하세요. cloudflared tunnel list는 잃어버린 경우 UUID를 다시 출력합니다. 호스트 이름을 라우팅한 다음 ~/.cloudflared/config.yml을 작성하세요:

cloudflared tunnel route dns your-mail mail.example.com
tunnel: your-mail
credentials-file: /Users/you/.cloudflared/f9e2….json   # the path create printed
url: http://localhost:8080
cloudflared tunnel run your-mail

계속 실행하려면: Linux에서는 sudo cloudflared service install. macOS에서는 Homebrew로 설치하고 brew services start cloudflared를 사용하세요. sudo 설치 경로는 루트 사용자의 홈에서 인증서를 찾기 때문에 cloudflared tunnel login이 당신의 홈에 쓴 인증서를 찾지 못합니다.

그 다음 .envPUBLIC_URL=https://mail.example.com을 설정하고 docker compose up -d를 실행하세요.

어느 쪽이든

PUBLIC_URL은 클라이언트에 입력하는 것과 정확히 일치해야 합니다. 서버는 OAuth 메타데이터의 resourcePUBLIC_URL + /mcp를 게시하며, 불일치가 커넥터가 추가를 거부하는 가장 흔한 원인입니다.

스마트폰에서 시작하기 전에 알아야 할 것: Claude와 ChatGPT 모두 스마트폰 앱에서 커넥터를 추가할 수 없습니다. 웹(또는 Claude 데스크톱 앱)에서 한 번 추가하면 스마트폰에 나타납니다. 스마트폰에서 직접 설정을 시도하면 시간을 낭비하게 됩니다.

Claude — 웹 또는 데스크톱에서 추가한 후 스마트폰에서 사용

  1. claude.ai 또는 Claude Desktop에서 설정 → 커넥터로 이동하고, 커넥터 옆의 + 또는 사용자 지정 커넥터 추가를 클릭하세요.

  2. 이름과 URL <PUBLIC_URL>/mcp를 입력하세요. 고급 OAuth 필드는 비워두세요: 이 서버는 클라이언트를 동적으로 등록합니다.

  3. Claude가 동의 페이지를 엽니다. 당신의 OAUTH_PASSPHRASE를 입력하세요.

  4. 스마트폰에서 Claude 앱을 엽니다. 커넥터는 이미 있으며, 도구는 채팅에서 사용할 수 있습니다. 컴포저의 도구 또는 커넥터 메뉴에서 대화에 켜세요.

ChatGPT — 웹에서 추가한 후 스마트폰에서 사용

커스텀 MCP 커넥터는 개발자 모드 뒤에 있으며, Pro, Plus, Business, Enterprise 또는 Education 계정이 필요하고 웹에서만 사용할 수 있습니다.

  1. 웹의 ChatGPT에서 설정 → 보안 및 로그인을 열고 개발자 모드를 켭니다. Business 및 Enterprise 워크스페이스에서는 관리자가 먼저 허용해야 할 수 있습니다.

  2. 원격 MCP 서버용 커넥터를 추가하고 URL을 <PUBLIC_URL>/mcp로 지정하며 인증은 OAuth를 사용합니다. ChatGPT는 동적 클라이언트 등록을 지원하므로 붙여넣을 것이 없습니다.

  3. OAUTH_PASSPHRASE로 동의 페이지를 승인합니다.

  4. 스마트폰에서 ChatGPT를 열고 채팅에서 커넥터를 활성화합니다.

이 메뉴들은 이동할 수 있습니다. 위의 이름이 표시되는 것과 일치하지 않으면 설정에서 개발자 모드를 찾은 다음 URL로 커넥터를 추가하는 곳을 찾으십시오.

ChatGPT는 모바일에서 일부 MCP 쓰기 작업을 비활성화합니다. 이 서버에는 쓰기 작업이 전혀 없으므로 여기에는 영향이 없습니다.

Claude Code

claude mcp add --transport http your-mail https://your-host/mcp

Codex

codex mcp add your-mail --url https://your-host/mcp
codex mcp login your-mail

사례 3 — VPS에서, 어디서든 접근 가능

머신이 켜져 있는지 여부와 관계없이 미러를 계속 유지하려면 이 옵션을 선택하십시오. 한 달에 몇 달러가 들고 실제 트레이드오프가 하나 있습니다: 메일의 전체 평문 복사본이 임대 디스크로 이동하며, 앱 비밀번호도 같은 환경에 있습니다. 선택하기 전에 보안을 읽으십시오.

설치는 사례 1에 터널을 더한 것으로, 다른 사람의 컴퓨터에서 실행됩니다. 열어야 할 포트도, 구성할 DNS도, 관리할 인증서도 없습니다.

새 Debian 또는 Ubuntu 박스에서:

# 1. Docker
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER && newgrp docker

# 2. The two files, and your accounts
mkdir your-mail && cd your-mail
curl -fsSLO https://raw.githubusercontent.com/wildsurfer/your-mail-mcp/main/compose.yaml
curl -fsSL https://raw.githubusercontent.com/wildsurfer/your-mail-mcp/main/accounts.example.json -o accounts.json
$EDITOR accounts.json             # your accounts
$EDITOR .env                      # OAUTH_PASSPHRASE and the account passwords

# 3. A public address, exactly as in case 2
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
tailscale funnel --bg 8080        # prints your https://….ts.net hostname

# 4. Put that hostname in .env, then start
echo "PUBLIC_URL=https://your-machine.your-tailnet.ts.net" >> .env
docker compose up -d
docker compose logs -f

PUBLIC_URL은 3단계에서 호스트 이름을 출력한 후에야 알 수 있으므로 마지막에 옵니다.

클라이언트 연결은 사례 2와 동일합니다.

compose.yamlrestart: unless-stopped는 재부팅 후 컨테이너를 다시 가져옵니다. folders 도구로 확인할 수 있으며, 각 계정의 마지막 동기화와 마지막 오류를 보고하거나 docker compose logs --tail=50로 확인할 수 있습니다.

이제 강화를 읽으러 가십시오. 비밀번호로 SSH 접속이 가능하고 메일 사본을 보관하는 VPS는 이 서버를 전혀 실행하지 않는 것보다 더 나쁩니다.


강화

이 중 어느 것도 서버가 작동하는 데 필요하지 않으며, 그래서 설치 단계에 포함되지 않았습니다. 얻을 수 있는 이점의 크기 순으로 정렬되어 있습니다. 사례 1은 이 중 어떤 것도 필요하지 않습니다.

진짜 긴 암호문을 선택하십시오. OAUTH_PASSPHRASE가 문 전체입니다. 잘못된 추측은 공격자에게 1초가 걸리며, 추측은 직렬화되어 병렬로 실행해도 도움이 되지 않지만, 그 어느 것도 짧은 암호문을 구해주지는 않습니다. 스마트폰에서도 입력할 수 있는 긴 암호문을 사용하십시오.

SSH를 잠그십시오 (사례 3). 비밀번호 로그인이 가능한 임대 박스에 메일 사본이 있으면 이 문서에서 최악의 조합입니다. 루트로, 다른 무엇보다 먼저:

adduser mail && usermod -aG sudo mail
rsync --archive --chown=mail:mail ~/.ssh /home/mail
sed -i 's/^#\?PermitRootLogin.*/PermitRootLogin no/; s/^#\?PasswordAuthentication.*/PasswordAuthentication no/' /etc/ssh/sshd_config
systemctl restart ssh

그런 다음 루트가 아닌 mail로 설치를 수행하십시오.

사용하지 않는 포트를 닫으십시오 (사례 3). 터널을 사용하면 인바운드 포트가 전혀 필요하지 않으므로:

sudo ufw allow OpenSSH && sudo ufw --force enable

커넥터에 도달할 수 있는 대상을 제한하십시오. 서버와 통신하는 유일한 것이 Claude 앱의 커스텀 커넥터라면, 해당 트래픽은 Anthropic의 게시된 이그레스 범위인 160.79.104.0/21에서 도착하며 터널이나 방화벽에서 다른 모든 것을 거부할 수 있습니다. 노트북에서 Claude Code나 Codex도 사용한다면 이 작업을 수행하지 마십시오. 해당 도구는 현재 위치한 곳 어디에서나 연결되기 때문입니다.

볼륨을 백업하거나 재동기화를 수락하십시오. compose.yaml은 maildir과 인덱스를 명명된 볼륨에 보관합니다. 그 안의 어떤 것도 고유하지 않습니다 — 모두 여전히 메일 서버에 있습니다 — 하지만 대용량 사서함을 다시 다운로드하는 데는 시간이 걸리고 제한을 거는 제공업체를 귀찮게 합니다.

암호문이 보호하지 않는 것을 아십시오. 암호문은 MCP 표면을 게이트합니다. 저장 데이터를 암호화하지는 않습니다. 보안을 참조하십시오.

소유한 도메인에서 직접 TLS를 종료하려면 A 레코드를 박스에 지정하고 Caddy를 앞에 두십시오. compose.override.yaml을 추가하십시오:

services:
  caddy:
    image: caddy:2
    restart: unless-stopped
    ports: ["80:80", "443:443"]
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - caddy_data:/data
volumes:
  caddy_data:
# Caddyfile
mail.example.com {
    reverse_proxy your-mail-mcp:8080
}

두 포트를 모두 여십시오 — 80은 선택 사항이 아닙니다. Caddy가 인증서 챌린지와 HTTPS 리디렉션에 사용합니다:

sudo ufw allow 80/tcp && sudo ufw allow 443/tcp

Caddy가 인증서를 직접 획득하고 갱신합니다. PUBLIC_URL을 호스트 이름으로 설정하고 docker compose up -d를 실행하십시오.

계정 파일

/config/accounts.json에 읽기 전용으로 마운트됩니다 (compose.yaml 참조). JSON이며 encoding/json으로 파싱되고, 파싱 전에 프로세스 환경에 대해 확장되므로 문자열 값의 ${VAR}는 해당 이름의 환경 변수로 대체됩니다. 이것이 비밀이 파일에 남지 않는 방법입니다:

{
  "accounts": [
    {
      "name": "work",
      "host": "imap.gmail.com",
      "user": "you@example.com",
      "password": "${WORK_PASS}"
    }
  ]
}

계정별 키:

기본값

참고

name

필수. 공백, 따옴표, 슬래시(앞 또는 뒤) 없음. 계정의 최상위 maildir 디렉터리와 도구 호출의 account 인수가 됩니다.

host

필수. IMAP 서버 호스트 이름.

port

993 (imaps) 또는 143 (그 외)

user

필수. 제공업체 참고 참조: iCloud는 전체 이메일 주소가 아닌 짧은 이름을 원합니다.

password

필수. ${VAR}는 환경에서 확장됩니다. 리터럴 비밀번호도 작동하지만 권장되지 않습니다.

tls

imaps

imaps, starttls 또는 none.

patterns

["*"]

mbsync 폴더 패턴 — 미러링할 폴더.

exclude_folders

자동으로 발견됨

기본적으로 검색에서 제외할 폴더 이름 (SPECIAL-USE 발견 참조). 이 값을 설정하면 해당 계정의 발견을 완전히 재정의합니다.

계정 이름은 고유해야 합니다. 계정이 하나 이상 필요하며, 빈 accounts 배열은 시작 오류입니다.

환경 변수

변수

필수

기본값

의미

CONFIG

계정 파일 경로.

MAILDIR

Maildir 루트; 각 계정은 하위 디렉터리를 받습니다.

INDEX

notmuch/Xapian 인덱스 디렉터리.

PUBLIC_URL

클라이언트가 사용할 정확한 방식의 서버 외부 URL (끝의 슬래시는 있다면 제거됨). OAuth 메타데이터에 사용되며 클라이언트에 입력하는 것과 일치해야 합니다.

OAUTH_PASSPHRASE

동의 화면을 게이트하는 단일 암호문.

SYNC_INTERVAL

아니요

5m

전체 동기화 주기, Go duration (5m, 1h).

SYNC_TIMEOUT

아니요

1h

mbsync 실행 한 번의 계정별 마감, Go duration. 대규모 첫 미러가 이 시간에 도달했을 때 아직 실행 중이면 잘릴 수 있습니다 — 수만 개의 메시지가 있는 사서함은 기본값을 훨씬 넘을 수 있습니다.

LISTEN_ADDR

아니요

:8080

HTTP 서버가 바인딩하는 주소.

INIT_MIRROR

아니요

설정 안 됨

마운트 지점이 아닌 빈 디렉터리로 동기화하려면 1로 설정. /mail이 볼륨인 compose에서는 필요하지 않습니다.

CONFIG, MAILDIR, INDEX는 필수이며, 이들이 없으면 프로세스가 시작을 거부합니다. PUBLIC_URLOAUTH_PASSPHRASE는 OAuth 계층에 필수이며, 이들이 없어도 프로세스가 시작에 실패합니다.

컨테이너 이미지는 이미 이 중 네 개를 설정합니다 (Dockerfile): MAILDIR=/mail, INDEX=/index, CONFIG=/config/accounts.json, LISTEN_ADDR=:8080. compose.yaml은 이 중 어떤 것도 재정의하지 않습니다. compose.yaml의 해당 볼륨 마운트나 구성 마운트도 함께 변경하지 않는 한 그대로 두십시오 — 마운트를 함께 옮기지 않는 재정의는 서버가 빈 경로나 누락된 경로를 가리키게 만듭니다.

Docker 없이

Linux 및 macOS용 릴리스 바이너리 (amd64 및 arm64)는 릴리스 페이지에 체크섬과 함께 있습니다. 바이너리는 mbsync, notmuch, w3m을 외부 명령으로 호출하므로 먼저 설치하십시오 — macOS에서는 brew install isync notmuch w3m, Debian 및 Ubuntu에서는 apt install isync notmuch w3m. isync 1.4.4 이상이 작동합니다.

그런 다음 컨테이너와 동일한 구성으로, 원하는 경로를 사용합니다. 컨테이너의 볼륨은 마운트 지점으로 시작하며, 빈 maildir 가드가 이를 진짜 첫 실행으로 읽습니다. 직접 만든 일반 디렉터리는 같은 가드에게 누락된 볼륨과 똑같이 보이므로, 여기서 정말 첫 실행이 맞다고 말하려면 INIT_MIRROR=1이 필요합니다:

mkdir -p mail index
CONFIG=./accounts.json MAILDIR=./mail INDEX=./index INIT_MIRROR=1 \
PUBLIC_URL=http://127.0.0.1:8080 OAUTH_PASSPHRASE=... \
WORK_PASS=... ./your-mail-mcp

Windows는 지원되지 않습니다: maildir 처리는 Unix 파일 시스템 의미론에 의존하며, 호출할 mbsync도 없습니다.

직접 빌드하기

CI가 모든 이미지를 빌드, 테스트, 게시하므로 아무도 할 필요가 없습니다 — 하지만 원한다면 한 명령입니다: 컨테이너는 docker build -t your-mail-mcp ., 바이너리는 go build (Go 1.27, 테스트를 위해 위의 세 도구가 PATH에 있어야 함).

제공업체 참고

iCloud 참고 사항은 이 서버보다 앞선 실제 iCloud 미러의 장기 운영에서 나온 것입니다. Gmail 및 Dovecot 참고 사항은 제공업체 문서와 프로젝트 연구에서 나온 것이며, 아직 모두 이 서버를 통해 재검증되지는 않았습니다.

  • iCloud (imap.mail.me.com): IMAP user는 짧은 이름입니다 — @icloud.com 앞부분 — 전체 이메일 주소가 아닙니다. iCloud는 동시 IMAP 연결을 제한합니다; 이것이 생성된 mbsync 구성이 모든 계정에 대해 PipelineDepth 1을 고정하는 이유이며, 이 값은 변경할 수 없습니다.

  • Gmail (imap.gmail.com): 앱 비밀번호(App Password)가 필요하며, 이를 위해서는 계정에 2단계 인증이 먼저 활성화되어 있어야 합니다 — Gmail은 IMAP을 통한 계정 비밀번호 직접 입력을 허용하지 않습니다. Gmail은 또한 본질적으로 모든 것을 [Gmail]/All Mail에 사본으로 보관하므로, 대부분의 메시지가 해당 폴더와 All Mail 양쪽에 존재하기 때문에 Gmail 계정의 미러는 폴더 목록이 나타내는 크기의 약 두 배입니다. 대규모 Gmail 계정의 첫 미러는 몇 시간이 걸리며, Google은 또한 일일 IMAP 다운로드 할당량(하루 약 2.5GB)을 적용하므로 수 기가바이트 규모의 사서함은 첫 미러가 며칠에 걸쳐 진행됩니다. 이는 정상입니다: 서버는 자체 일정에 따라 재시도를 계속하고 mbsync는 중단된 지점에서 이어서 진행합니다. 첫 미러의 경우 SYNC_TIMEOUT8h 정도로 설정하여 기본값인 1시간 제한으로 긴 실행이 중단되지 않도록 하십시오.

  • Dovecot 서버(많은 자체 호스팅 및 소규모 제공업체)는 일반적으로 폴더 이름 앞에 INBOX.를 붙입니다(예: INBOX.Sent). folders에 예상치 못한 폴더 이름이 표시된다면, 대개 이것이 원인입니다.

보안

계정 비밀번호는 프로세스 환경(accounts.json${VAR} 또는 리터럴 값)을 통해 제공됩니다. 시작 시 서버는 이를 컨테이너 내부 디스크의 생성된 mbsync 구성 파일에 파일 모드 0600으로 기록합니다. 해당 파일은 암호화되지 않습니다. 컨테이너의 환경 또는 해당 파일을 읽을 수 있는 모든 것은 비밀번호를 평문으로 읽을 수 있습니다.

저장 데이터 보호 — 디스크 암호화, 컨테이너에 exec할 수 있는 사람 제한, 호스트 접근 — 는 운영자의 책임입니다. 이 서버는 저장 시 자격 증명을 암호화한다고 주장하지 않으며, 암호화를 시도하지도 않습니다.

OAuth 패스프레이즈는 일정 시간 내에 검사되며 단일 공유 비밀번호로 전체 서버를 제어합니다; 이는 사용자별 자격 증명 시스템이 아닙니다. OAUTH_PASSPHRASE와 메일 계정 비밀번호를 동일한 수준으로 주의하여 취급하십시오.

search의 스레드 요약에는 일치하는 스레드의 모든 메시지에 대한 표시 이름이 포함되며, 이는 발신자가 제어합니다. 기본적으로 제외된 폴더(스팸, 휴지통)의 메시지는 본문이 표시되지 않더라도 이 방식으로 공격자가 선택한 이름을 앞에 노출시킬 수 있습니다 — search는 제외된 메시지의 본문을 가져오거나 표시하지 않습니다. threadshow는 읽기 경로이므로 이 문제의 영향을 받지 않습니다: thread는 기본적으로 스팸/휴지통의 답장을 제외하며(위 도구 표 참조), show는 이미 ID를 알고 있는 단일 메시지를 읽습니다. search의 이 표시 이름 누출은 이번 릴리스에서 수정되지 않았습니다.

문제 해결

"maildir ... is an empty plain directory, not a mount point: refusing to sync" — 서버는 maildir이 마운트된 파일시스템인지 확인합니다. 마운트된 볼륨이 우연히 비어 있는 경우는 첫 실행이며 별도의 동의 없이 동기화됩니다. 이것이 compose에 추가 단계가 필요 없는 이유입니다. 비어 있는 일반 디렉터리는 모호합니다: 새 maildir은 볼륨이 마운트된 적 없는 경로와 정확히 동일하게 보이며, 두 번째 경우에 동기화하면 마운트를 수정하는 순간 사라지는 디렉터리에 모든 계정이 다시 다운로드됩니다. MAILDIR이 가리키는 위치에 스토리지를 마운트하거나, 정말로 이 파일시스템의 일반 디렉터리로 사용하려면 INIT_MIRROR=1을 설정하십시오.

"maildir ...: no such file or directory" — 경로가 전혀 존재하지 않습니다. compose를 사용하는 경우 볼륨 또는 바인드 마운트가 compose.yaml에 누락된 것입니다; 바이너리를 직접 실행하는 경우 MAILDIR이 잘못된 것입니다.

folders 도구로 계정별 동기화 상태를 확인하십시오. 구성된 모든 계정, 마지막 성공적인 동기화 시간, 오류가 있는 경우 마지막 오류, 폴더 및 인덱스의 태그를 나열합니다. 잘못된 비밀번호 또는 만료된 앱별 비밀번호가 있는 단일 계정이 다른 계정을 중단시키지는 않습니다 — 동기화 실패는 계정별로 격리됩니다 — 하지만 여기에 last error 줄로 표시되며, 조용히 넘어가지 않습니다.

스팸/휴지통 제외, 두 가지 다른 실패 형태:

  • 컨테이너 로그의 "special-use discovery: account NAME: ..." 는 해당 계정의 시작 시 연결, 로그인 또는 LIST가 완전히 실패했음을 의미합니다. 이 실패 시 일치시킬 폴더 이름이 없으므로 해당 계정은 아무것도 제외되지 않습니다 — 내장 영어 이름 목록으로도 제외되지 않습니다 — 연결 문제가 해결되거나 exclude_folders가 수동으로 설정될 때까지입니다.

  • 오류 줄은 없지만 folders에 여전히 제외된 항목이 표시되지 않는 경우LIST가 성공했음을 의미합니다 — 서버가 \Junk/\Trash 속성(RFC 6154 SPECIAL-USE 지원)을 광고하지 않을 뿐이며 그리고 폴더 이름이 내장 영어 목록(junk, spam, trash, deleted messages, deleted items, bulk mail)과 일치하지 않는 경우입니다. 이는 지역화된 사서함의 경우입니다 — 예를 들어 독일어 또는 프랑스어 사서함 — 해결 방법은 동일합니다: exclude_folders를 수동으로 설정하십시오.

accounts.jsonexclude_folders, 예: "exclude_folders": ["Papierkorb"]는 모든 경우에 SPECIAL-USE 및 내장 목록보다 우선합니다.

A
license - permissive license
Not graded
quality - not tested
A
maintenance

Maintenance

Maintainers
Response time
Release cycle
1Releases (12mo)
Commit activity

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    Local MCP server for multi-account IMAP/SMTP email (iCloud + Gmail via app-specific passwords). Never marks mail read. Cross-folder search, idempotent sends, TLS verified.
    8
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables LLMs to search and read email from a notmuch archive, providing tools for searching threads, retrieving messages, and listing tags through an MCP endpoint.
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Local IMAP/SMTP MCP server that lets Claude read, search, draft, send, flag, and move mail across multiple IMAP mailboxes. Credentials stay on your machine.
  • F
    license
    Not graded
    quality
    B
    maintenance
    A private, single-user MCP server that unifies Gmail, Microsoft 365/Outlook, and IMAP mailboxes for LLMs to search and read emails live, without storing or caching mailbox contents.

View all related MCP servers

Related MCP Connectors

  • Search your AI chat history (ChatGPT, Claude, Codex) from any MCP client. Remote, private, read-only

  • Read, search, send, organize, draft and schedule email across your inboxes from any MCP client.

  • Agent-native MCP server over the public saagarpatel.dev corpus. Read-only, stateless.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/wildsurfer/your-mail-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server