Yahoo Mail MCP Server
Yahoo Mail MCP Server
Yahoo Mail의 완전한 이메일 관리를 IMAP을 통해 제공하는 Model Context Protocol(MCP) 서버입니다. 이 서버는 로컬 stdio 전송(Claude Desktop용)과 HTTP/SSE 전송(Claude.ai를 통한 원격 접속용)을 모두 지원합니다.
기능
안전한 OAuth 2.0 인증: PKCE가 포함된 OAuth 2.0 인가 코드 흐름으로 원격 MCP 서버를 보호합니다
UID 기반 작업: 이메일 삭제 시에도 변하지 않는 영구 IMAP UID를 사용합니다(v3.0.0+)
전체 메일 관리: 일괄 처리 지원이 포함된 완전한 이메일 작업
11가지 강력한 도구:
list_emails: 확장 메타데이터(크기, 플래그, 첨부파일)와 페이지네이션을 포함한 최근 이메일 목록read_email: 이메일 전체 내용 읽기(일괄 지원)search_emails: 필터(날짜 범위, 발신자, 안 읽음 상태)를 사용한 고급 검색list_folders: 사용 가능한 모든 IMAP 폴더를 발견delete_emails: 이메일을 휴지통으로 이동(소프트 삭제, 복구 가능)archive_emails: 장기 보관을 위해 이메일을 보관mark_as_read: 이메일을 읽음으로 표시mark_as_unread: 이메일을 안 읽음으로 표시flag_emails: 이메일을 중요/별표로 표시unflag_emails: 이메일의 플래그(중요 표시)를 제거move_emails: 이메일을 다른 폴더로 이동
Enrich:기 : 모든 이메일에는 UID, 크기(size), 플래그(flag), hasAttachments 및 폴더 정보가 포함됩니다.
고급 검색: 날짜, 발신자, 안 읽음 상테 필터 등과 함께 및 모든 폴더에서 검색 가능
두 전송 모속: 모든 관리 조작은 동시에 여러 이메일을 처리할 수 있으며 성공/실패를 정확하게 추적합니다
두 가지 전송 모드:
stdio: 로컬 Claude Desktop 통합용sse: HTTP/Server-Sent Events를 통한 원격 접속용(Render.com에 필수)
크로스플랫폼: Windows 및 Linux 개발 환경에서 모두 사용 가능
Docker 지원: Docker 및 Docker Compose를 사용한 컨테이너 배포
클라우드 지원 대비: OAuth 보안을 갖춘 Render.com에 쉽게 배포할 수 있습니다
Related MCP server: yahoo-mail-mcp
사전 준비
로컬 개발
Node.js: 18.0.0 이상
Yahoo 메일 계정: 앱 비밀번호를 사용할 수 있는 계정
Git: 버전 관리 도구
Docker 개발/배포
Docker: 최신 버전
Docker Compose: 최신 버전 (Windows/Mac으 Docker Desktop에 함된)
Render.com 배포용
GitHub 계정: 저장소 호스팅 용도
Render.com: https://your-host에서 미정 부하 이용 가능
신속한 시작
1. 저장소 준Clone and Setup
# Clone the repository
git clone <your-repo-url>
cd yahoo-mail-mcp-server
# Copy environment template
cp .env.example .env2. Yahoo 메일 비밀번호 가져오기
"앱 비밀번호 생성(Generate app password)"을 클릭하거나, "앱 비밀번호 관리(Manage app passwords)"를 클릭
"기타 앱(Other App)"➡을 선택하고 "MCP Server""를 입
생성된 16자리 비밀번호를 복사한다
4. 환경 구성
.env 파일에 자격 증명을 입력하세요:
YAHOO_EMAIL=your.email@yahoo.com
YAHOO_APP_PASSWORD=your16charpassword
TRANSPORT_MODE=stdio # or 'sse' for HTTP mode
PORT=3000종속성 설치
Windows (PowerShell):
npm installLinux/macOS (Bash):
npm install로컬 실행
stdio 모드[긴 시 mode for Claude Desktop]:
npm run start:stdioSSE 모드[:]
npm run start:sseDevelopment 모드(자동 리로드):
npm run devDocker 사용
Docker로 빌드 및 실 실행
클라이언트:
# Build the image
npm run docker:build
# Run the container
npm run docker:run
# Or use Docker Compose (recommended)
npm run docker:compose:up
# View logs
npm run docker:compose:logs
# Stop containers
npm run docker:compose:down클라이언트:
# Build the image
npm run docker:build
# Run the container
npm run docker:run
# Or use Docker Compose (recommended)
npm run docker:compose:up
# View logs
npm run docker:compose:logs
# Stop containers
npm run docker:compose:downDocker 명령어로 실행
Windows (PowerShell):
# Build
docker build -t yahoo-mail-mcp .
# Run
docker run -p 3000:3000 `
-e YAHOO_EMAIL=your.email@yahoo.com `
-e YAHOO_APP_PASSWORD=yourpassword `
-e TRANSPORT_MODE=sse `
yahoo-mail-mcp
# Or with Docker Compose
docker-compose up -dLinux/macOS (Bash):
# Build
docker build -t yahoo-mail-mcp .
# Run
docker run -p 3000:3000 \
-e YAHOO_EMAIL=your.email@yahoo.com \
-e YAHOO_APP_PASSWORD=yourpassword \
-e TRANSPORT_MODE=sse \
yahoo-mail-mcp
# Or with Docker Compose
docker-compose up -d서버 테스트
Health 엔드포인트 테스트
Windows (PowerShell):
# Using npm script
npm run test:health
# Using curl (if installed)
curl http://localhost:3000/health
# Using PowerShell
Invoke-WebRequest -Uri http://localhost:3000/health | Select-Object -Expand ContentLinux/macOS (Bash):
# Using npm script
npm run test:health
# Using curl
curl http://localhost:3000/healthSSE 엔드포인트 테스트
Windows (PowerShell):
# Using npm script
npm run test:sse
# Using curl
curl http://localhost:3000/mcp/sse
# Using PowerShell
Invoke-WebRequest -Uri http://localhost:3000/mcp/sseLinux/macOS (Bash):
# Using npm script
npm run test:sse
# Using curl
curl http://localhost:3000/mcp/sseRender.com에 배포
단계1: 저장소 준비
Windows (PowerShell):
# Initialize git (if not already done)
git init
# Add all files
git add .
# Commit
git commit -m "Initial commit: Yahoo Mail MCP Server"
# Create GitHub repository at https://github.com/new
# Then push to GitHub
git remote add origin https://github.com/yourusername/yahoo-mail-mcp-server.git
git branch -M main
git push -u origin mainLinux/macOS (Bash):
# Initialize git (if not already done)
git init
# Add all files
git add .
# Commit
git commit -m "Initial commit: Yahoo Mail MCP Server"
# Create GitHub repository at https://github.com/new
# Then push to GitHub
git remote add origin https://github.com/yourusername/yahoo-mail-mcp-server.git
git branch -M main
git push -u origin main단계2: Render에 배포
Render.com에 가입/로그인
https://render.com으로 이동
"무효로 시직(Get Started for Free)" 또는 "로그인" 클릭
GitHub 저장소 연결
오른쪽 위 여에 "New +" 버튼을 클릭
"Web Service"를 선택
"Connect GitHub"을 눌러 Render에게 인증을 허가하고
yahoo-mail-mcp-server저장소를 선택
서비스 구성
Name:
yahoo-mail-mcp-server(또는 다른 선호하는 이름)Runtime: Docker
Region: 가청 가까운 지역을 선택하세요 (Oregon, Frr..- German, Singur, Ohio)
Branch:
mainPlan: Free (또는 프로덕션에는 Starter 권장)
환경 변수 설속
"환경" 섹션에서 "환경 변수 추개(Add Environment Variable)"를 클릭하고 다음을 추가하세요:
키
값
생성 방법
NODE_ENVproduction-
TRANSPORT_MODEsse-
YAHOO_EMAILyour.email@yaho.com사용자의 Yahoo 메일 이메일
YAHOO_APP_PASSWORDyour16charpassword"Yahoo 메일 앱passWord 보기" 섹션을 참조하세요
OAUTH_CLIENT_ID32-char-hex-string를 실행:
openssl rand -hex 16OAUTH_CLIENT_SECRET64-char-hex-string실행:
openssl rand -hex 32주요 사항:
YAHOO_EMAIL,YAHOO_APP_PASSWORD,OAUTH_CLIENT_ID,OAUTH_CLIENT_SECRET을 "Secret" 비밀 값으로 표시하세요PORT는 Render가 자동으로 설정하므로, 직접 추가하지 마세요OAuth 자격 증명을 저장해두세요 - Claude Desktop 설정 시 필요합니다
배포
"Create Web Service"를 클릭
Render가 당신의 Docker 컨테이너를 자동으로 빌드 및 배포합니다.
배포가 완료될 때까지 기다리세요 (최초 빌드는 5~10분 소요)
서비스 URL 획득
데포이 완왼되면,
https://yahoo-mail-mcp-server.onrender.com같은 형태의 URL이 제공됩니다확인:
https://yahoo-mail-mcp-server.onrender.com/health에 접속해 테스트하세요
3단계: Claude Desktop에 연결
Note: 원격 MCP 서버를 이용하려면 Claude Pro, Max, Team 또는 Enterprise 플랜이 필요합니다.
Claude Desktop 열기
컴퓨터에서 Claude Desktop 앱을 실행합니다.
MCP 커넥터 추가
사용자 아이콘 또는 메뉴를 클릭
"Settings" 선택
"Connectors" 섹션으로 이동
"Add Custom Connector"을 클릭합니다
커넥터 구성
Name:
Yahoo MailURL:
https://your-service-name.onrender.com/mcp/sse
예를 들면:
https://yahoo-mail-mcp-server.onrender.com/mcp/sseOAuth 인증 설정
"Advanced Settings(고급 설정)" ⚙️ 클릭
4단계에서 발급된 OAuth 자격 증명을 입력하세요:
OAuth Client ID:
OAUTH_CLIENT_ID환경 변수의 값OAuth Client Secret:
OAUTH_CLIENT_SECRET환경 변수의 값
저장 및 테스트
"Add" 또는 "Save"을 클릭
Claude Desktop이 OAuth 2.0을 사용하여 인증합니다
성공적으로 완료되면 커넥터가 활성 상태로 표시됩니다
이제 대화에서 Yahoo Mail의 도구를 사용할 수 있습니다.
4단계: Claude.ai에서 MCP 서버 사용
연결에 성공하면 대화에서 다음의 도구를 사용할 수 있습니다:
Can you list my recent emails?
Can you read email number 5?
Can you search for emails from john@example.com?문제 해결
일반적인 문제
1. "Authentication failed(인증 실패)" 오류
해결 방법: 앱 전용 비밀번호를 확인하세요
사용 중인 것이 일반 Yahoo 비밀번호가 아니라 앱 전용 비밀번호인지 확인
https://login.yahoo.com/account/security에서 새 앱 전용 비밀번호를 생성
마침표 및 오타가
.env파일이나 Render 환경 변수에 없는지 확인
2. Windows에서 Docker 빌드가 실패하는 경우
해결 방법: Docker Desktop 설정 확인
Docker Desktop이 실행 중인지 확인
WSL2 기반 엔진 사용 여부 확인 (Settings > General > Use SWH2 based enngine)
파일 공유가 설정되어 있는지 확인 (Settings > Resources > File Sharing)
3. 포트 3000 이미 사용 중
해결 방법: 포트 번호를 변경하세요
Windows (PowerShell):
$env:PORT=3001; npm run start:sseLinux/macOS (Bash):
PORT=3001 npm run start:sse또는 .env 편집:
PORT=30014. Render 배포 실패
해결 방법: 로그를 확인하세요
Render 대시보드로 이동
서비스(Service) 선택
"Logs" 탭 클릭
오류 메시지가 있는지 확인
일반적인 상황:
필수 환경 변수가 설정되지 않았을 경우
Dockerfile 경로가 정확하지 않은 경우
빌드 시간 초과 (설정에서 빌드 시간 초과 설정을 늘리세요)
5. SSE 연결 끊김
해결 방법: 무료 요금제의 제한 사항
일반 등급 서비스는 활동이 15분 없을 때 절전 모드로 전환됩니다.
일시정지 후의 첫 번째 요청은 응답 시간에 30~60초 걸릴 수 있습니다.
항상 유지가 필요하다면 Starter 플랜($7/월)으로 업그레이드하세요.
6. IMAP 연결 시간 초과
해결 방법: Yahoo Mail IMAP 설정 확인
Yahoo Mail 설정에서 IMAP이 활성화되어 있는지 확인
Yahoo Mail > 설정 > 더 많은 설정 > 사서함으로 이동
방화벽이 포트 993을 차단하고 있지 않은지 확인
Windows에서 발생하는 문제
줄 바꿈 문제
줄 바꿈 문제와 관련된 오류가 표시된다면:
PowerShell:
# Configure git to handle line endings correctly
git config --global core.autocrlf input
# Re-clone the repository
git clone <your-repo-url>npm 스크립트 오류가 나는 경우
크로스플랫폼 스크립트가 실행되지 않을 때:
PowerShell:
# Install cross-env globally
npm install -g cross-env
# Or run scripts directly
node server.jsLinux 전용 문제
Docker 관련 권한 오류
Bash:
# Add user to docker group
sudo usermod -aG docker $USER
# Logout and login again, or run:
newgrp docker
# Test
docker ps환경 변수 참조
변수 | 필수 | 기본값 | 설명 |
| Yes | - | 자신의 Yahoo 메일 주소 |
| Yes | - | Yahoo가 요구하는 16자리 앱 전용 비밀번호 |
| Yes (Remote) | - | MCP 서비 인증용 OAuth 2.0 클라인트 ID ( |
| Yes (Remote) | - | MCP 서비 인증용 OAuth 2.0 클라인트 시크리트 ( |
| No |
| TRANSPORT_MODE 및 전송 모드 ( |
| No |
| SSE 모드 포트 (Render가 자동으로 설정) |
| No |
| 실행 환경 ( |
Note: OAUTH_CLIENT_ID와 OAUTH_CLIENT_SECRET는 원격 배포(Render.com)에서만 필요합니다. 로컬 stdio 모든에서 OAuth는 필수가 아닙니다.
사용 가능한 npm 스크립트
Script | Description | Cross-Plat form |
| stdio 모드로 시작 | ✅ |
| stdio 모드로 시작 | ✅ |
| SSE 모드로 시작 | ✅ |
| Auto-리로드 개발 모드 | ✅ |
| Docker Image 빌드 | ✅ |
| Docker Container 실행 | ✅ |
| Docker Compose 시작 | ✅ |
| Docker Compose 정지 | ✅ |
| Docker Compose 로그 보기 | ✅ |
| Health 엔드포인트 테스트 | ✅ |
| SSE 엔드포인트 테스트 | ✅ |
Project Structure
yahoo-mail-mcp-server/
├── server.js # Main server code
├── package.json # Node.js dependencies and scripts
├── Dockerfile # Docker build configuration
├── docker-compose.yml # Docker Compose configuration
├── render.yaml # Render.com deployment config
├── .env.example # Environment variable template
├── .env # Your local environment variables (gitignored)
├── .dockerignore # Files to exclude from Docker build
├── .gitignore # Files to exclude from git
├── .gitattributes # Git line ending configuration
└── README.md # This fileSecurity Best Practices
OAuth 2.0 보호 (원격 배포)
모든 MCP 요청에 대해 서버가 OAuth 2.0 인증을 요구합니다
PKCE(코드 교환 증명 키, Proof Key for Code Exchange)가 포함된 인증 코드 흐름을 사용합니다
올바른 자격 증명을 가진 클라이언트만 이메일에 접근할 수 있습니다
강력한 임의 자격 증명 생성:
openssl rand -hex 16및openssl rand -hex 32자격 증명을 Render 대시보드에 안전하게 저장합니다("Secret"으로 표시)
자격 증명을 커밋하지 마세요
.env파일은 gitignore 처리됩니다항상
.env.example을 템플릿으로 사용하세요민감한 값은 Render 대시보드에서 설정하세요
OAuth 자격 증명을 공개적으로 공유하지 마세요
앱별 비밀번호를 사용하세요
기본 Yahoo 비밀번호는 절대 사용하지 마세요
각 서비스마다 새 비밀번호를 생성하세요
사용하지 않는 비밀번호는 정기적으로 해지하세요
앱 비밀번호는 기본 비밀번호를 변경하지 않고도 해지할 수 있습니다
이메일 관리 작업
모든 수정 작업은 되돌릴 수 있습니다(소프트 삭제, 영구 삭제 아님)
삭제된 이메일은 휴지통 폴더로 이동합니다(무료 계정은 7일 이내 복구 가능)
보관, 깃발, 읽음 상태 변경은 데이터를 손상시키지 않습니다
이동 작업은 이메일 내용과 메타데이터를 보존합니다
발신 작업 없음 - 서버는 사용자를 대신하여 이메일을 보낼 수 없습니다
프로덕션 환경에서 HTTPS 사용
Render.com은 무료 SSL 인증서를 제공합니다
모든 트래픽은 암호화됩니다(TLS/SSL)
IMAP 연결은 TLS를 사용합니다
OAuth 토큰은 안전하게 전송됩니다
개발 워크플로우
변경 사항 만들기
Windows (PowerShell):
# 1. Make your changes to server.js
# 2. Test locally
npm run dev
# 3. Test with Docker
npm run docker:compose:up
# 4. Commit and push
git add .
git commit -m "Description of changes"
git push origin main
# 5. Render automatically deploys the changesLinux/MacOS (Bash):
# 1. Make your changes to server.js
# 2. Test locally
npm run dev
# 3. Test with Docker
npm run docker:compose:up
# 4. Commit and push
git add .
git commit -m "Description of changes"
git push origin main
# 5. Render automatically deploys the changes로그 보기
로컬 개발:
# The server logs to stderr
npm run start:sseDocker:
npm run docker:compose:logsRender.com:
서비스 대시보드로 이동합니다
"Logs" 탭을 클릭합니다
실시간 로그가 여기에 표시됩니다
API 엔드포인트
SSE 모드로 실행 중일 때, 서버는 다음 엔드포인트를 노출합니다:
엔드포인트 | 메서드 | 설명 |
| GET | API 정보 및 사용 가능한 도구 |
| GET | 상태 확인(상태, 버전, 타임스탬프 반환) |
| GET | MCP를 위한 Server-Sent Events 엔드포인트(OAuth 토큰 필요) |
| POST | MCP 통신용 메시지 엔드포인트(OAuth 토큰 필요) |
| GET | OAuth 2.0 서버 메타데이터(RFC 8414) |
| GET | OpenID Connect 검색 엔드포인트 |
| GET | OAuth 2.0 인증 엔드포인트 |
| POST | OAuth 2.0 토큰 엔드포인트 |
상태 확인 응답 예시
{
"status": "ok",
"service": "yahoo-mail-mcp",
"version": "1.0.0",
"timestamp": "2025-01-11T12:34:56.789Z"
}주요 변경 사항 및 마이그레이션 가이드
⚠️ v3.0.0 주요 변경 사항
버전 3.0.0은 UID 기반 작업을 도입하여 이메일과 상호작용하는 방식을 근본적으로 변경합니다. 이는 기존 코드를 업데이트해야 하는 주요 변경 사항입니다.
무엇이 변경되었나요
1. 매개변수 이름 변경: sequenceNumbers → uids
이제 모든 이메일 관리 도구는 sequenceNumbers(임시 위치) 대신 uids(영구 식별자)를 사용합니다.
// ❌ v2.x (OLD - sequence numbers)
read_email({ sequenceNumbers: [1, 2, 3] })
delete_emails({ sequenceNumbers: [5] })
// ✅ v3.0.0 (NEW - UIDs)
read_email({ uids: [510867, 510866, 510862] })
delete_emails({ uids: [510867] })2. 응답 형식: 일반 텍스트 → JSON
이제 모든 도구는 일반 텍스트 대신 구조화된 JSON을 반환합니다.
// ❌ v2.x response
"Email 1 of 10..."
// ✅ v3.0.0 response
{
"emails": [...],
"totalCount": 10,
"returned": 10
}3. 새로운 필수 워크플로우
이제 작업을 수행하기 전에 반드시 list_emails 또는 search_emails에서 UID를 가져와야 합니다.
// Step 1: Get UIDs
const result = list_emails({ count: 10 });
// Returns: { emails: [{ uid: 510867, ... }, { uid: 510866, ... }] }
// Step 2: Use UIDs for operations
const uidsToDelete = [510867, 510866];
delete_emails({ uids: uidsToDelete });UID가 더 좋은 이유
시퀀스 번호 (v2.x):
❌ 이메일이 삭제되면 변경됩니다
❌ 위치 기반(이메일 #1, #2, #3)
❌ 작업 사이에 유효하지 않게 될 수 있습니다
❌ 혼란과 오류를 유발합니다
UID (v3.0.0):
✅ IMAP 서버가 할당하는 영구 식별자
✅ 다른 이메일이 삭제되어도 절대 변경되지 않습니다
✅ 이메일이 영구 삭제될 때까지 항상 유효합니다
✅ 일괄 작업에 안정적입니다
마이그레이션 체크리스트
모든 도구 호출에서
sequenceNumbers대신uids매개변수를 사용하도록 업데이트코드가 먼저
list_emails또는search_emails에서 UID를 가져오도록 업데이트일반 텍스트가 아닌 JSON 응답을 처리하도록 코드 업데이트
일괄 작업이 모든 UID를 처리하는지 테스트(v3.0.0에서 심각한 일괄 작업 버그 수정)
새로운 기능 검토: 페이지네이션, 강화된 메타데이터, 고급 검색, 폴더 지원
v3.0.0의 새로운 기능
강화된 메타데이터: 모든 이메일에
uid,size,flags,hasAttachments포함페이지네이션:
list_emails에서offset및limit매개변수 지원고급 검색:
search_emails는 날짜 범위, 보낸 사람 필터, 읽지 않은 메일만 지원폴더 지원: 모든 도구에서
folder매개변수 지원(기본값: INBX)list_folders: 사용 가능한 IMAP 폴더를 확인하는 새 도구
정확한 일괄 작업: 첫 번째 UID만 처리되던 심각한 버그 수정
향상된 오류 처리: 더 나은 타임아웃 및 연결 오류 메시지
MCP 도구
list_emails
최근 이메일을 강화된 메타데이터(UID, 크래매*데이터) 및 페이지네이션 지원과 함께 나열합니다.
매개변수:
count(선택): 가져올 이메일 수 (기본값: 10, 최대: 50)folder(선택): 리스트할 폴더 (기본값: 'INBOX'). 사용 가능한 폴더를 보러려면list_folders를 사용하세요offset(선택): 페이지네이션을 위해 건너 일 메일 수 (기본값:0)
응답: 각 이메일의 강화된 메타데이터를 포험하는 emails 배열이 담긴 JSON:
uid: 영구 IMAP UID (모든 작업에서 이 강을 시용)sequenceNumber: 폴더 내 위치 (참고용으로만 사용, 동작에 미사용)from: 발신자 주소subject: 이메일 제목date: RFC 2822 형식 날짜size: 이메일 용량 (바이트)flags: IMAP 플래그 배열 (예:['\\Seen'],['\\Flaged'])hasAtachments: 이메일 첨부 드존 유무를 나타는 불리언 값
예시:
// List 20 most recent emails
list_emails({ count: 20 })
// List emails with pagination (skip first 10)
list_emails({ count: 10, offset: 10 })
// List emails from Sent folder
list_emails({ count: 15, folder: "Sent" })read_email
UID을 사용하여 이메일의 전체 내영을 읽습니다 (배치 읽기 지원).
매개변수:
uids(필수): 읽을 UID 배열 (list_emails또는search_emails에서 UID 가져오기)folder(선택): 이메일이 포함된 폴더 (기본값: 'INBOX')
응답: 본문 내용이 포함된 강화된 이메일 데이터가 담긴 JSON
예시:
// Read a single email
read_email({ uids: [510867] })
// Read multiple emails
read_email({ uids: [510867, 510866, 510862] })
// Read email from Sent folder
read_email({ uids: [510867], folder: "Sent" })search_emails
날짜 범위, 보낸 사람, 읽지 않은 상태 필터를 지원하는 고급 검색.
매개변수:
query(선택): 제목 또는 보낸 사람 검색어 (날짜만 검색할 경우 비워 둘 수 있음)count(선택): 반환할 결과 수 (기본값: 10, 최대: 50)dateFrom(선택): 이 날짜부터 이메일 필터링 (ISO 8601 또는 RFC 2822 형식)dateTo(선택): 이 날짜까지의 이메일 필터링 (ISO 8601 또는 RFC 2822 형식)sender(선택): 특정 보낸 사람 이메일 주소 또는 이름으로 필터링unreadOnly(선택): 읽젝 않은 이메일만 확인 (기본값: false)folder(선택): 검색할 폴더 (기본값: 'INBOX')
응답: emails 배열, totalMatches, returned, query, filters, folder를 포함하는 JSON
예시:
// Basic search
search_emails({ query: "invoice", count: 15 })
// Search unread emails only
search_emails({ query: "meeting", unreadOnly: true })
// Search by date range
search_emails({ dateFrom: "2025-01-01", dateTo: "2025-01-31" })
// Search by sender
search_emails({ sender: "boss@company.com" })
// Combined filters
search_emails({
query: "report",
sender: "team@company.com",
dateFrom: "2025-01-15",
unreadOnly: true
})list_folders
Yahoo Mail 계정에서 사용 가능한 모든 IMAP 폴더를 확인합니다.
매개변수: 없음
응답: name, path, delimiter, children를 포함하는 폴더 객체 배열이 담긴 JSON
예시:
// List all folders
list_folders()
// Example response:
// {
// "folders": [
// { "name": "INBOX", "path": "INBOX" },
// { "name": "Sent", "path": "Sent" },
// { "name": "Trash", "path": "Trash" },
// { "name": "Archive", "path": "Archive" }
// ]
// }delete_emails
UID를 사용하여 이메일을 휴지통 폴더로 이동합니다(소프트 삭제 - 이메일 복구 가능음).
ave:
uids(필수): 삭제한 UID 그룹 (list_emails또는search_emails서 UID 가져오기)folder(선택): 원본 폴더 (기본값: 'INBOX')
응답: 처리된 이메일 수와 함께 성공/실패 메시지
예시:
// Delete a single email
delete_emails({ uids: [510867] })
// Delete multiple emails
delete_emails({ uids: [510867, 510866, 510862, 510856] })
// Delete from Sent folder
delete_emails({ uids: [510867], folder: "Sent" })archive_emails
장기 보안을 위애 UID를 사용하여 이메일을 아카이브 폴더로 이종합니다.
매`변수:
uids(필수): 보관할 UID 배열folder(선택): 원본 폴더 (기본값: 'INBOX')
답: 처리된 이메일 수와 함께 성공/실패 메시지
예시:
// Archive a single email
archive_emails({ uids: [510867] })
// Archive multiple emails
archive_emails({ uids: [510867, 510866, 510862, 510851] })mmark_as_read
Seen 플래그를 추가하여 UID로 이메일을 읽음 처리합니다.
매개변수:
uids(필수): 읽음으로 표시할 UID 배열folder(선택): 이메일이 포함된 폴더 (기본값: 'INBOX')
응답: 처리된 이메일 수와 함께 성공/실패 메시지
예시:
// Mark a single email as read
mark_as_read({ uids: [510867] })
// Mark multiple emails as read
mark_as_read({ uids: [510867, 510866, 510862, 510851, 510865] })mark_as_unread
Seen 플래그를 제거하여 UID로 이메일을 읽지 않음으로 표시합니다.
매개변수:
uids(필수): 읽지 않음으로 표시할 UID 배열folder(선택): 이메일이 포함된 폴더 (기본값: 'INBOX')
응답: 처리된 이메일 수와 함께 성공/실패 메시지
예시:
// Mark a single email as unread
mark_as_unread({ uids: [510867] })
// Mark multiple emails as unread
mark_as_unread({ uids: [510869, 510867, 510866] })flag_emails
Flagged 플래그를 추가하여 UID로 이메일을 중요/별표로 표시합니다.
매개변수:
uids(필수): 플래그할 UID 배열folder(선택): 이메일이 포함된 폴더 (기본값: 'INBOX')
응답: 처리된 이메일 수와 함께 성공/실패 메시지
예시:
// Flag a single email
flag_emails({ uids: [510867] })
// Flag multiple emails
flag_emails({ uids: [510851, 510865, 510864] })unflag_emails
Flagged 플래그를 제거하여 UID로 이메일에서 플래그/별표를 제거합니다.
매개변수:
uids(필수): 플래그를 제거할 UID 배열folder(선택): 이메일이 포함된 폴더 (기본값: 'INBOX')
응답: 처리된 이메일 수와 함께 성공/실패 메시지
예시:
// Unflag a single email
unflag_emails({ uids: [510867] })
// Unflag multiple emails
unflag_emails({ uids: [510867, 510866, 510862] })move_emails
UID를 사용하여 이메일을 지정된 폴더로 이동합니다.
매개변수:
uids(필수): 이동할 UID 배열folderName(필수): 대상 폴더 이름 (예: "Work", "Personal", "Archive")sourceFolder(선택): 원본 폴더 (기본값: 'INBOX')
응답: 처리된 이메일 수와 함께 성공/실패 메시지
예시:
// Move a single email to Work folder
move_emails({ uids: [510867], folderName: "Work" })
// Move multiple emails to Personal folder
move_emails({ uids: [510867, 510866, 510862], folderName: "Personal" })
// Move from Sent to Archive
move_emails({ uids: [510867], folderName: "Archive", sourceFolder: "Sent" })성능 고려 사항
Render.com 무료 티어
비활성 후 절전: 요청이 15분 없으면 서비스가 절전됩니다
깨어나는 시간: 첫 요청은 30-60초가 걸립니다
월간 시간: 월 750시간(중간 정도 사용에 충분)
업그레이드: $7/월 (Starter 플랜, 항상 켜짐)
IMAP 성능
연결 풀링: 각 요청에 새 IMAP 연결이 생성됩니다
타임아웃:연결 및 인증에 30초
속도 제한: Yahoo는 과도한 요청을 제한할 수 있습니다
권장사항: 가능하면 클라이언트 측에서 결과 캐시
교차 플랫폼 호환성
이 프로젝트는 다음 환경에서 완벽하게 작동하도록 설계되었습니다:
Windows 10/11 PowerShell 또는 Command Prompt
Linux (Ubuntu, Debian, Fedora 등)
macOS (Intel 및 Apple Silicon)
Docker Desktop (Windows, Mac, Linux)
WSL2 (Windows Subsystem for Linux)
줄 바꿈
.gitattributes는 저장소에서 LF 줄 바꿈을 보장합니다Windows (CRLF) 및 Linux (LF)에서 올바르게 작동합니다
Docker는 컨테이너 내부에서 LF를 사용합니다
경로 처리
코에서 모드 경는 슬래시 (/)를 사합니다
path.join()이플랫폿 호안성를 위한해 사됩니다Windos 백슬래시와 Unix 슬래시 모두 지원 합니다
기기여
저앙소를 포크합ㅁ\
특feature: 키:
git checkout -b feature-name변 경 사항\
Hydra Windows와 Linux에서 테(수 있을 경우)\n5. Commit:
git comm -am "Add feature"Push:
git push origin feature-namePull Request를 만든다
라이런스
MIT 라이런스 - 상세 내용은 LICENSE 파일을 참조하세요
지원
Issues: 버그는 https://github.com/yourusername/yahoo-mail-mcp-server/issues에 보고하세요
Discussions: GitHub Discussions에 질문올 시작
MCP 문서: https://modelcontextprotocol.io
변경 이력
v3.0.0 (2025-01-18) - UID.exeCL
BREAKING CHANGEES:
** 모든 도구가 이제
sequenceNumbers대신uids매개변수를 사용합니다.응답 형식이일 텍스트에서 구조화된 JSON으로 변경됨습니다.
UID는 이메일이 삭제되더라도 변경되지 않는 영구 식별자입니다.
New Features:
강화된 메타데이터: 모든 이메일에
uid,size,flags,hasAttachments가 포함됩니다페이지네이션 지원:
list_emails가offset및limit매개변수를 지원합니다고급 검색 필터:
dateFrom,dateTo,sender,unreadOnly매개변수폴더 지원: 모든 도구가
folder매개변수를 지원합니다(기본값: INBOX)새 도구: 사용 가능한 IMAP 폴더를 탐색하는
list_folders향상된 오류 처리: Render 스핀다운 감지를 포함한 타임아웃 및 연결 오류 메시지 개선
버그 수정:
중대한 버그 수정: 배치 작업에서 첫 번째 UID만 처리되던 오류를 수정했습니다.
모든 배치 작업이 이제 배열의 모든 UID를 정확하게 처리합니다.
성공/실패 메시지가 이제 처리된 이메일의 정확한 개수를 보고합니다.
마이그레이션 가이드:
모든 도구 호출에서
sequenceNumbers를uids로 교체하세요.UID는
list_emails또는search_emails응답에서 가져오세요.일반 텍스트 대신 JSON 응답을 처리하도록 코드를 업데이트하세요.
자세한 내용은 위 "Breaking Changes & Migration Guide"의 섹션을 참조하세요.
v2.0.1 (2025-01-17)
수정: 모든 이메일 작업에 대한 입력 검증 강화
잘못된 시퀀스 번호로 인한 IMAP 오류를 방지하는 공용 검증 헬퍼 추가
디버깅이 쉽도록 오류 메시지 개선
v2.0.0 (2025-01-16)
Breaking Change:
read_email은 이제sequenceNumber(단일 숫자) 대신sequenceNumbers(배열)를 사용합니다.배치 작업을 지원하는 전체 이메일 관리 기능이 추가되었습니다.
새 도구 7개: delete_emails, archive_emails, mark_as_read, mark_as_unread, flag_emails, unflag_emails, move_emails
모든 수정 작업이 배치 처리를 지원합니다.
되돌릴 수 있는 작업(소프트 삭제, 영구 삭제 없음)으로 보안이 강화되었습니다.
v1.0.0 (2025-01-11)
최초 릴리스
stdio 및 SSE 전송 지원
Docker 및 Docker Compose 지원
Render.com 배포 구성
크로스 플랫폼 호환(Windows/Linux)
핵심 도구 3종: list_emails, read_email, search_emails
감사의 말
@modelcontextprotocol/sdk로 제작되었습니다
IMAP 접속에 imap을 사용합니다
이메일 파싱에 mailparser를 사용합니다
Render.com에 배포됩니다
FAQ
Q: Gmail이나 다른 이메일 제공업체에서도 사용할 수 있나요?
A: 현재 이 서버는 Yahoo Mail용으로 구성되어 있습니다. 다른 제공업체를 지원하려면 server.js의 IMAP 구성(166~179줄)을 수정해야 합니다.
Q: 제 이메일 계정에 사용해도 안전한가요?
A: 네! 이 서버는 계정의 기본 비밀번호가 아닌 앱별 비밀번호를 사용하며, 모든 수정 작업은 되돌릴 수 있습니다. 삭제 작업은 이메일을 휴지통으로 옮기며(복구 가능), 서버는 이메일을 영구 삭제하거나 사용자를 대신해 이메일을 보내지 않습니다.
Q: Render에서 실행하는 비용은 얼마인가요?
A: 무료 요금제로 월 750시간을 제공하며, 보통 사용량에는 충분합니다. 항상 가동되는 서비스가 필요하면 스타터(Starter) 요금제가 월 $7입니다.
Q: 다른 클라우드 플랫폼에서도 실행할 수 있나요?
A: 네! Docker 구성을 지원하는 모든 플랫폼에서 사용할 수 있습니다(AWS ECS, Google Cloud Run, Azure Container Instances, Heroku, Fly.io 등).
Q: 컴퓨터를 계속 실행하고 있어야 하나요?
A: 아니요! Render.com(또는 다른 클라우드 플랫폼)에 배포하면 서버는 클라우드에서 독립적으로 실행됩니다.
Q: 배포 후 서버를 어떻게 업데이트하나요?
A: GitHub에 변경 사항을 푸시하기만 하면 됩니다. Render가 푸시를 자동으로 감지하여 서비스를 다시 배포합니다.
Q: 여러 사용자가 배포된 서버를 같이 사용할 수 있나요?
A: 서버는 단일 Yahoo Mail 계정(환경 변수에 설정된 계정)에 연결됩니다. 각 사용자는 자신의 이메일 계정을 위해 별도로 배포해야 합니다.
Q: 앱별 비밀번호를 잊으면 어떻게 하나요?
A: https://login.yahoo.com/account/security/app-passwords에서 새 비밀번호를 생성한 뒤 Render 환경 변수(Settings > Environment)에서 업데이트하면 됩니다.
다음 단계
배포에 성공한 뒤:
✅ 헬스 엔드포인트를 확인합니다
✅ Claude.ai에 연결합니다
✅ 이메일 목록을 확인해 봅니다
✅ 이메일 몇 개를 읽어 봅니다
✅ 받은 편지함을 검색해 봅니다
🎉 Yahoo Mail MCP 서버를 즐겨 보세요!
즐거운 코딩 되세요! 질문이나 문제가 있으시면 GitHub에 이슈를 남겨 주세요.
Available Tools
11 toolsarchive_emailsC
Move emails to Archive folder using UIDs for long-term storage. UIDs are permanent identifiers.
| Name | Required | Description | Default |
|---|---|---|---|
| uids | Yes | Array of UIDs to archive | |
| folder | No | Source folder (default: INBOX) | INBOX |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It states the action (moving to Archive) but does not mention side effects (e.g., does it remove from INBOX? does it change read status?), required permissions, reversibility, or any limitations. The note about UIDs being permanent is useful but minimal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with the core action front-loaded. The second sentence adds a useful clarification about UIDs. No wasted words, though the description could have used the space to differentiate from move_emails or add usage guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema and no annotations, the description is incomplete. It omits critical context such as whether the operation is reversible, what happens to the emails in the source folder, potential failure modes, or any prerequisites. It also fails to clarify how it differs from move_emails, which is a sibling that likely has similar behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents both parameters with descriptions (uids: 'Array of UIDs to archive'; folder: 'Source folder'). The description adds no additional parameter semantics beyond the UID permanence note, which is not strictly tied to parameter usage. Given 100% schema coverage, baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (move/archive), resource (emails), and destination (Archive folder). It also explains UIDs are permanent identifiers, which adds specificity. However, it does not explicitly differentiate from the sibling move_emails, leaving slight ambiguity about the distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives like move_emails or delete_emails. The phrase 'for long-term storage' implies a purpose but does not state conditions or exclusions. The agent is left to infer usage without direct direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_emailsA
Move emails to Trash folder using UIDs (soft delete, recoverable). UIDs are permanent identifiers.
| Name | Required | Description | Default |
|---|---|---|---|
| uids | Yes | Array of UIDs to delete | |
| folder | No | Source folder (default: INBOX) | INBOX |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses the core behavior (move to Trash, recoverable) but does not detail side effects, permissions, or what happens to related metadata. Basic transparency is present, but it could go deeper.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with zero fluff. The action and key attributes are front-loaded, making it easy to scan and understand.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool with no output schema and no annotations, the description covers what it does, how it works, and one critical behavioral note (recoverability). It doesn't mention the folder parameter, but the schema already covers that, so nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value by explaining 'UIDs are permanent identifiers', giving context beyond the schema's property description. This helps an agent understand the data format and stability of UIDs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Move emails to Trash folder'), the method (UIDs), and the key distinction from a hard delete ('soft delete, recoverable'). It clearly identifies the resource and operation, distinguishing it from siblings like move_emails or archive_emails.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool via 'soft delete, recoverable', but it does not explicitly name alternatives or specify conditions when this tool is preferred over siblings like archive_emails or move_emails. Usage is inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flag_emailsB
Flag emails as important/starred using UIDs. UIDs are permanent identifiers.
| Name | Required | Description | Default |
|---|---|---|---|
| uids | Yes | Array of UIDs to flag | |
| folder | No | Folder containing emails (default: INBOX) | INBOX |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It only states that UIDs are permanent; it does not disclose that flagging mutates email state, whether the flag is reversible, what failures look like, or what the response contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short, front-loaded sentences with no filler. The first sentence states the action and the target; the second efficiently clarifies the permanence of UIDs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The schema fully covers the two parameters, so the main gaps are output behavior and failure semantics, which must be inferred for this mutating tool with no annotations. The low parameter count and simple action keep this gap moderate rather than severe.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% — both uids and folder already carry descriptions in the schema, so the baseline is 3. The description adds a small value-add by explaining UIDs are permanent and stable, but adds nothing about the folder parameter beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb+resource pair: 'Flag emails as important/starred using UIDs.' The 'important/starred' semantics implicitly distinguish it from siblings like mark_as_read, though the distinction is not made explicit by naming any sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use or when-not-to-use guidance is given, and no alternatives are named. The note 'UIDs are permanent identifiers' hints that UIDs are preferred over transient message numbers, which is a mild usage hint but leaves scenario selection to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_emailsA
List recent emails from a Yahoo Mail folder. Returns UIDs (permanent identifiers) and enriched metadata including size, flags, and attachment status.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | Number of emails to retrieve (default: 10, max: 50) | |
| folder | No | Folder to list emails from (default: INBOX). Use list_folders to see available folders. | INBOX |
| offset | No | Number of emails to skip (for pagination, default: 0) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of behavioral disclosure. It states what is returned (UIDs and metadata) and implies a read-only 'list' operation, but does not explicitly confirm no side effects, auth requirements, or rate limits. It also does not clarify how 'recent' is determined, which is a behavioral gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no fluff. It front-loads the action and resource, then adds return details, with every phrase conveying necessary information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a simple list operation with no output schema or annotations, the description gives a solid overview of purpose and return contents. However, it omits an explicit read-only assurance and does not enumerate all metadata fields, which an agent might need for parsing without an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All three parameters (count, folder, offset) are fully documented in the schema with descriptions, defaults, and max, so the schema provides high coverage. The description adds minimal parameter meaning beyond 'recent,' which hints at recency ordering but does not elaborate on how count interacts with the list.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'List recent emails from a Yahoo Mail folder.' It specifies the resource (emails) and scope (folder), and names the return type (UIDs, metadata). This distinguishes it from siblings like read_email, search_emails, and list_folders.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides implied usage but no explicit when-to-use or alternative routing. The only cross-reference is in the folder parameter schema ('Use list_folders to see available folders'), not the main description. Agents must infer that listing is the appropriate tool for browsing a folder rather than searching or reading.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_foldersA
List all available IMAP folders/mailboxes in your Yahoo Mail account
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the action (list folders) but does not explicitly note that it is read-only or side-effect-free, nor does it mention any authentication or pagination details. The action implies safety, but absence of explicit disclosure leaves some room for doubt.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, grammatically complete sentence states the purpose without redundancy or filler. Every word earns its place, and the key information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (no parameters, no output schema, no annotations), the description is largely complete for an agent to invoke it correctly. It tells the agent what the tool lists and the account scope. A minor gap is the lack of any mention of the return structure (e.g., folder names vs. full paths), but this is not critical for a low-complexity tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so schema coverage is effectively 100%. The description needs to add nothing about parameters; the baseline for no parameters is 4, and the description does not detract from it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'List' and names the exact resource 'all available IMAP folders/mailboxes' within the scope 'Yahoo Mail account'. It is immediately clear what the tool does and distinct from sibling tools like list_emails or search_emails.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no explicit guidance on when to use this tool versus alternatives. While it is self-evident that this is for folders and not emails, there is no mention of exclusions or conditions, leaving the agent to infer its place among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mark_as_readB
Mark emails as read using UIDs. UIDs are permanent identifiers.
| Name | Required | Description | Default |
|---|---|---|---|
| uids | Yes | Array of UIDs to mark as read | |
| folder | No | Folder containing emails (default: INBOX) | INBOX |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states the mutation effect but does not mention idempotency, permanence of the read state, potential side effects, permissions, or response behavior. The 'UIDs are permanent identifiers' note adds some context but does not cover operational behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no filler. The primary action is front-loaded and the follow-up sentence provides meaningful context about UIDs. Every word contributes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, single-purpose mutation tool with no output schema, the description provides the essential context: the action, the resource, and the mechanism. It could be improved by noting reversibility (mark_as_unread exists) or the idempotent nature, but the low complexity means the current description is largely sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds semantic value by clarifying that UIDs are permanent identifiers, which helps agents understand that these are stable identifiers rather than transient session IDs. This goes beyond the bare schema descriptions of 'array of UIDs to mark as read' and 'folder containing emails'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Mark emails as read') and the resource (emails), with the mechanism ('using UIDs') and a useful clarification that UIDs are permanent identifiers. While it differentiates from mark_as_unread through the word 'read', it does not explicitly call out sibling distinctions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given about when to use this tool versus alternatives such as mark_as_unread, flag_emails, or delete_emails. The mention that UIDs are permanent identifiers implies why UIDs should be used, but there is no explicit context or exclusionary guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mark_as_unreadC
Mark emails as unread using UIDs. UIDs are permanent identifiers.
| Name | Required | Description | Default |
|---|---|---|---|
| uids | Yes | Array of UIDs to mark as unread | |
| folder | No | Folder containing emails (default: INBOX) | INBOX |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It only states the basic action and that UIDs are permanent; it does not mention side effects, mutability, permissions, failure behavior, or what happens to the email state beyond marking it unread.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the main action, followed by a relevant clarification about UIDs. It contains no filler, though it could include a bit more useful context without becoming bloated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter tool, the description plus schema is minimally adequate for invoking the tool. However, with no annotations and no output schema, it lacks information about expected return values, error conditions, or behavioral consequences, leaving noticeable gaps for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds a small amount of semantic value by noting that UIDs are permanent identifiers, which helps agents understand their stability, but it does not elaborate beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Mark emails as unread') and the resource (emails), with a specific method (using UIDs). It is not a tautology and is distinguishable from most siblings by the 'unread' intent, though it does not explicitly differentiate itself from the closely related mark_as_read.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use this tool versus alternatives like mark_as_read or read_email. It provides no use-case context, prerequisites, or exclusions, so an agent must infer when this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_emailsA
Move emails to a specified folder using UIDs. UIDs are permanent identifiers. Use list_folders to see available folders.
| Name | Required | Description | Default |
|---|---|---|---|
| uids | Yes | Array of UIDs to move | |
| folderName | Yes | Name of the destination folder (e.g., "Work", "Personal"). Use list_folders to see available folders. | |
| sourceFolder | No | Source folder containing the emails (default: INBOX) | INBOX |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the responsibility. It adds useful context that UIDs are permanent identifiers, which clarifies how to refer to emails. However, it does not disclose potential side effects such as whether the emails are removed from the source, what happens if the destination folder is invalid, or whether the operation is reversible. Some context is given, but a destructive mutation warrants more disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. The core action is front-loaded, and the additional information (UID permanence and list_folders reference) is relevant and concise. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is a mutating operation without an output schema and no annotations. The description covers the action, prerequisites, and the permanence of UIDs, but it does not mention what response the agent can expect, error conditions, or any impact on source folders. For a straightforward move operation, this is adequate but not rich; a bit more detail (e.g., success indication) would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so each parameter is already documented. The description adds value by explaining that UIDs are permanent and referencing list_folders for folder names, which supplements the schema. However, it does not add deeper semantics beyond what the schema already states, so it aligns with the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise action ('Move emails to a specified folder'), a specific resource (emails by UIDs), and implies the target folder. It clearly differentiates from sibling tools like delete, archive, or mark_as_read by focusing on moving to a folder, and the mention of UIDs adds specificity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a prerequisite by pointing to list_folders for available folders, which aids usage, but it does not explicitly guide when to prefer this tool over alternatives like archive_emails or delete_emails. The usage is implied rather than explicitly contrasted with siblings, so it earns a middle score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_emailA
Read email content using UIDs (permanent identifiers). UIDs don't change when emails are deleted. Get UIDs from list_emails or search_emails.
| Name | Required | Description | Default |
|---|---|---|---|
| uids | Yes | Array of UIDs to read. UIDs are permanent identifiers from list_emails. | |
| folder | No | Folder containing the emails (default: INBOX) | INBOX |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states the tool reads email content, which implies no modification, but it does not explicitly confirm that it is non-destructive or mention any side effects (e.g., marking as read). It also does not describe behavior for invalid UIDs, missing folders, or rate limits. The description provides a useful fact about UID persistence but does not cover the tool's operational behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is exactly two sentences with no wasted words. It front-loads the core purpose ('Read email content using UIDs') and then adds a practical note about UID persistence and sourcing. This is concise and well-organized, earning a high score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter tool with no output schema, the description covers the essential usage: it explains the input (UIDs), the source of that input, and the purpose. However, it does not mention error handling (e.g., invalid UIDs, non-existent folder) or the structure of returned content. Given the lack of annotations and output schema, a bit more detail about expected outcomes or failure modes would improve completeness, but the core usage is adequately covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters, giving a baseline of 3. The description adds value by explaining what UIDs are (permanent identifiers) and how to obtain them, which clarifies the semantic meaning beyond the schema's basic 'Array of UIDs' description. However, it does not add details on format (e.g., integer range, array length constraints) or edge cases, so it meets the baseline without exceeding it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reads email content using UIDs and differentiates from siblings by mentioning that UIDs are permanent and obtained from list_emails or search_emails. It specifies the resource (email content) and the action (read), which distinguishes it from listing, searching, or mutating tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a direct usage hint ('Get UIDs from list_emails or search_emails') which establishes the source of the required input. It implies the tool is for reading full content rather than listing metadata, but it does not explicitly state when to avoid using it or compare with alternative tools beyond the UID sourcing. The context is clear enough for an agent to infer the intended use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_emailsA
Search emails using UIDs with advanced filters. Returns UIDs which are permanent identifiers that don't change when emails are deleted. Get UIDs from results for subsequent operations.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | Number of results to return (default: 10, max: 50) | |
| query | No | Search term for subject or sender (can be empty for date-only searches) | |
| dateTo | No | Filter emails up to this date (ISO 8601 or RFC 2822 format) | |
| folder | No | Folder to search in (default: INBOX). Use list_folders to see available folders. | INBOX |
| sender | No | Filter by specific sender email address or name | |
| dateFrom | No | Filter emails from this date onwards (ISO 8601 or RFC 2822 format) | |
| unreadOnly | No | Only return unread emails (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the burden. It adds useful non-obvious behavior: UIDs are permanent and do not change when emails are deleted, which helps agents trust them for future calls. It does not explicitly state read-only status, though 'Search' implies it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, all contributing value: the purpose is front-loaded, the UID permanence note is meaningful, and the chaining guidance is actionable. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description adequately explains the return value (UIDs) and how to use it. It covers the important chaining behavior and leaves parameter specifics to the highly detailed schema, making it sufficiently complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with detailed parameter descriptions, so the baseline is 3. The description adds no parameter-level meaning beyond the generic 'advanced filters' phrase, which does not enhance the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches emails with advanced filters and returns UIDs, which are stable identifiers. It distinguishes itself via the focus on UIDs for downstream operations, but does not explicitly contrast with sibling tools like list_emails, and the phrase 'using UIDs' is slightly awkward.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description tells agents to use this tool when they need UIDs for subsequent operations, providing a clear context. It does not explicitly state when to prefer list_emails or exclude alternatives, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unflag_emailsB
Remove flag/star from emails using UIDs. UIDs are permanent identifiers.
| Name | Required | Description | Default |
|---|---|---|---|
| uids | Yes | Array of UIDs to unflag | |
| folder | No | Folder containing emails (default: INBOX) | INBOX |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the action and notes that UIDs are permanent, but does not disclose what happens on invalid UIDs, whether the operation is reversible (unflagging can be undone by flag_emails), or any side effects. For a mutation tool with zero annotation coverage, this is a significant gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the action. The second sentence about UIDs being permanent is relevant and concise. No wasted words; the definition is efficiently structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple, but without annotations, an agent needs to know error behavior or return values. The description does not cover what happens if UIDs are invalid, whether it confirms the action, or if any preconditions exist (e.g., folder must exist). Given no output schema and no annotations, this is incomplete for a complete usage scenario, but acceptable for a basic mutation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already describes both parameters (uids array and folder with default). The description adds minimal extra: it clarifies that UIDs are permanent identifiers, which is useful context for why UIDs are used but not specific to parameter handling. The baseline of 3 is appropriate since the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear action ('Remove flag/star from emails') and the resource, with the mechanism (UIDs). It does not explicitly differentiate from sibling tools like flag_emails, but the opposite verb makes the distinction obvious. A 5 would require naming the sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage: when you have UIDs and want to unflag emails. It mentions UIDs are permanent, which hints at when they are available. However, it does not give explicit guidance about when not to use this tool or mention alternatives like flag_emails. The guidance is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
11 tool updates
v3.0.0- First observed
archive_emails - First observed
delete_emails - First observed
flag_emails - First observed
list_emails - First observed
list_folders - First observed
mark_as_read - First observed
mark_as_unread - First observed
move_emails - First observed
read_email - First observed
search_emails - First observed
unflag_emails
TDQS
Scored across 11 tools
Most tools map to a single distinct action: read, delete, archive, flag, move, etc. The only mild overlap is between list_emails and search_emails, but their descriptions distinguish recent folder listing from filtered search.
All tool names follow a clear snake_case verb_noun pattern, such as list_emails, delete_emails, and move_emails. Paired operations like mark_as_read/mark_as_unread and flag_emails/unflag_emails reinforce the predictable naming scheme.
Eleven tools is a well-scoped set for an email management server. Each tool covers a necessary common operation without bloating the surface with redundant aliases or overly granular actions.
The set thoroughly covers reading, searching, deleting, archiving, moving, and flagging emails, but it omits sending/composing email entirely, which is a core Yahoo Mail workflow. It also lacks folder creation or renaming, leaving obvious lifecycle gaps.
Maintenance
Related MCP Connectors
Connect any mailbox to Claude, ChatGPT & AI: read, send, reply, schedule & search emails.
Your mailboxes in ChatGPT and Claude: Gmail, iCloud, Fastmail, any IMAP. Passwords stay yours.
Read and search FranklyMail email and prepare drafts, replies, and forwards for human approval.
Email for AI agents: read, search and send from your Gmail, Outlook, Yahoo, iCloud or IMAP inbox.
Related MCP Servers
- FlicenseNot gradedqualityBmaintenanceEnables Claude to read, search, draft, send, flag, and move email across multiple IMAP/SMTP mailboxes while keeping credentials local.-
- AlicenseNot gradedqualityCmaintenanceEnables controlling Yahoo Mail from Claude in plain English — read, search, organize, delete, and send emails, with a two-phase confirmation step to prevent accidental destructive actions.MIT
- AlicenseNot gradedqualityBmaintenanceEnables Claude to read, search, organize, and clean up Yahoo Mail emails over IMAP without Yahoo API keys.4MIT
- AlicenseBqualityCmaintenanceEnables Claude Desktop or Claude Code to access a Yahoo Mail account over IMAP/SMTP, supporting listing, searching, reading, and sending emails through natural language.4MIT