AI 에이전트를 위한 문서

SendHQ MCP 서버

엄격한 타입을 갖춘 59개 도구로 AI 에이전트가 SendHQ 워크스페이스 하나를 안전하게 완전히 제어하도록 하세요. 이메일 발송과 수신, 도메인 검증, 템플릿 게시, 전달성 조사가 모두 가능합니다. 에이전트를 먼저 염두에 두고 작성했으며, 사람도 환영합니다.

59개 도구stdio 전송, 명령어 하나키 관리 도구 0개
설치 및 연결(Claude Code)
curl -fsSL https://downloads.sendhq.cc/install.sh | sh
claude mcp add sendhq --env SENDHQ_API_KEY=re_your_key -- sendhq mcp

이 서버는 무엇인가요

SendHQ MCP 서버를 사용하면 AI 에이전트가 Model Context Protocol을 통해 SendHQ 워크스페이스 하나를 운영할 수 있습니다. 이메일 발송(단건, 일괄, 템플릿, 답장, 첨부 파일, 멱등 재시도), 발신 및 수신 메일(제목, 본문, 첨부 파일 이름)과 전송 이벤트 조회 및 검색, 자동 분류 규칙을 갖춘 라벨로 메일 정리, 초안과 비공개 첨부 파일 관리, 호스팅 템플릿 작성과 게시, 도메인과 DNS 추가 및 검증, 수신 설정과 수신 주소 구성, 전달성, 반송, 스팸 신고, 발송 제외 조사, 계정 사용량, 결제 상태, 분석, API 키 메타데이터 조회를 지원합니다.

sendhq CLI 바이너리에 내장된 로컬 stdio 서버입니다. MCP 클라이언트가 sendhq mcp를 자식 프로세스로 실행하고 stdin/stdout으로 JSON-RPC를 주고받습니다. 모든 도구 호출은 워크스페이스 API 키로 인증된 https://sendhq.cc/api/v1의 SendHQ REST API에 대한 문서화된 요청 하나로 변환되므로, MCP 서버는 그 키가 가진 권한만큼만, 그 이상은 갖지 않습니다.

  • 8개 그룹의 59개 도구가 하나의 카탈로그에서 생성되며, 이 카탈로그는 tools.json으로도 공개됩니다.
  • 엄격한 JSON 스키마: 알 수 없는 인수, 잘못된 타입, 누락된 필수 필드는 SendHQ에 도달하기 전에 로컬에서 거부됩니다.
  • 안정적인 code, HTTP status, explanation, 구체적인 remedy, 재시도가 도움이 되는지 여부를 담은 구조화된 오류를 반환합니다.
  • 실제 이메일을 발송하거나 데이터를 삭제하는 모든 도구는 설명의 첫머리에서 이를 밝히며 MCP 안전 어노테이션을 포함합니다.
  • --read-only 모드는 발송 및 변경 도구를 모두 숨깁니다.
  • 아무것도 로그로 남기지 않습니다. stdout에는 프로토콜 메시지만 흐르며, API 키와 메시지 내용은 어떤 로그에도 기록되지 않습니다.
문서용 MCP 엔드포인트가 아닙니다.SendHQ는 https://sendhq.cc/api/mcp에서 읽기 전용의 작은 문서용 MCP 엔드포인트도 호스팅합니다(요금 및 문서 조회 전용이며 계정에는 접근하지 않습니다). 이 페이지의 서버는 계정 범위의 전체 기능 서버이며, 로컬에서 실행하거나 아래의 호스팅 커넥터로 사용할 수 있습니다.

Claude와 ChatGPT에서 SendHQ 사용하기

설치가 필요 없습니다. SendHQ는 이 서버를 같은 도구가 포함된 호스팅 커넥터로도 https://mcp.sendhq.cc/mcp에서 운영합니다. 키를 붙여 넣는 대신 SendHQ 계정으로 로그인합니다.

Claude

  1. Settings → Connectors를 열어 디렉터리에서 SendHQ를 찾거나, Add custom connector를 선택하고 https://mcp.sendhq.cc/mcp를 붙여 넣으세요.
  2. Connect를 클릭하고 SendHQ에 로그인한 뒤 접근 권한을 검토하고 Allow를 클릭하세요.
  3. Claude에게 받은편지함을 확인하거나, 검증된 도메인으로 이메일을 보내거나, 반송 원인을 설명해 달라고 요청해 보세요.

ChatGPT

  1. Open Settings → Security and login and turn on Developer mode.
  2. Go to chatgpt.com/plugins, click Create MCP app, name it SendHQ and enter https://mcp.sendhq.cc/mcp.
  3. Sign in to SendHQ and click Allow, then pick SendHQ from the tools menu in a new chat.

Muse by Meta

In Muse, open Connectors and search for SendHQ. Click Connect, sign in to SendHQ and click Allow.

승인 및 연결 해제

  • The request_feature tool sends a feature request to the SendHQ team with your account details, so we can follow up by email.
  • 실제 이메일을 발송하거나 데이터를 삭제하는 도구에는 그렇다고 표시되어 있습니다. 어시스턴트가 먼저 물어볼지 여부는 어시스턴트에서 도구별로 설정합니다. Claude에서는 Settings → Connectors → SendHQ에서 해당 도구에 Needs approval을 선택하세요.
  • 커넥터는 어시스턴트 이름을 딴 별도의 API 키(예: “Claude (AI connector)”)를 받습니다. API Keys에서 이 키를 삭제하면 즉시 연결이 해제됩니다.
  • API 키를 만들거나 폐기할 수 없으며 결제도 변경할 수 없습니다. 첨부 파일은 base64로 보내고 반환되며, 로컬 파일에는 접근하지 않습니다.
  • 미결제 워크스페이스(연동 체험판)는 계정 이메일 또는 AWS SES 시뮬레이터 주소로만 전송할 수 있습니다.

문의: postmaster@sendhq.cc. 개인정보 처리: sendhq.cc/privacy.

설치

sendhq 바이너리를 설치하세요(x86-64와 arm64의 Linux, macOS, Windows 지원). 설치 프로그램은 릴리스 체크섬을 검증하고 기본적으로 바이너리를 ~/.local/bin에 넣습니다.

macOS 및 Linux
curl -fsSL https://downloads.sendhq.cc/install.sh | sh
Windows PowerShell
irm https://downloads.sendhq.cc/install.ps1 | iex
설치 확인
sendhq version
SENDHQ_API_KEY=re_your_key sendhq doctor

대시보드 https://sendhq.cc/app#/keys에서 API 키를 만드세요. MCP 서버는 키를 만들 수 없습니다. 서버를 실행하는 명령어는 다음 하나뿐입니다.

stdio 서버 실행
SENDHQ_API_KEY=re_your_key sendhq mcp

보통은 직접 실행할 일이 없으며 MCP 클라이언트가 실행합니다. 터미널에서 실행하면 stdin에서 JSON-RPC를 기다립니다.

클라이언트 설정

Claude Code

claude mcp add
claude mcp add sendhq --env SENDHQ_API_KEY=re_your_key -- sendhq mcp

# read-only variant
claude mcp add sendhq-readonly --env SENDHQ_API_KEY=re_your_key -- sendhq mcp --read-only

모든 프로젝트에서 사용하려면 --scope user를, 프로젝트의 .mcp.json에 기록하려면 --scope project를 추가하세요. 공유 .mcp.json에서는 키를 커밋하지 말고 환경 변수에서 참조하세요. Claude Code는 .mcp.json의 ${VAR}를 확장합니다.

.mcp.json
{
  "mcpServers": {
    "sendhq": {
      "command": "sendhq",
      "args": [
        "mcp"
      ],
      "env": {
        "SENDHQ_API_KEY": "${SENDHQ_API_KEY}"
      }
    }
  }
}

OpenAI Codex

~/.codex/config.toml
[mcp_servers.sendhq]
command = "sendhq"
args = ["mcp"]
env = { SENDHQ_API_KEY = "re_your_key" }

또는 명령줄에서: codex mcp add sendhq --env SENDHQ_API_KEY=re_your_key -- sendhq mcp.

Claude Desktop

claude_desktop_config.json(macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\)을 편집하고 앱을 다시 시작하세요. 데스크톱 앱은 셸의 PATH를 상속하지 않으므로 바이너리의 절대 경로(which sendhq)를 사용하세요.

claude_desktop_config.json
{
  "mcpServers": {
    "sendhq": {
      "command": "/Users/you/.local/bin/sendhq",
      "args": [
        "mcp"
      ],
      "env": {
        "SENDHQ_API_KEY": "re_your_key"
      }
    }
  }
}

그 밖의 MCP 클라이언트

명령어 sendhq, 인수 ["mcp"](선택적으로 "--read-only"), 아래의 환경 변수로 stdio 서버를 구성하세요. 이 서버는 MCP 프로토콜 버전 2024-11-05, 2025-03-26, 2025-06-18, 2025-11-25를 지원하며 initialize, ping, tools/list, tools/call을 구현합니다. 도구 결과에는 JSON 텍스트 블록과 structuredContent가 함께 들어 있습니다.

원시 stdio 스모크 테스트(sendhq mcp로 파이프)
{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"probe","version":"1"}}}
{"jsonrpc":"2.0","method":"notifications/initialized"}
{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"get_service_health","arguments":{}}}

계정 범위 서버에는 호스팅 HTTP 전송이 없습니다. 쓰기가 가능한 원격 MCP 엔드포인트에는 사용자별 OAuth가 필요한데 SendHQ는 이를 제공하지 않습니다. 로컬 바이너리는 키를 이미 보유한 머신에만 둡니다.

환경 변수와 플래그

변수 또는 플래그필수의미
SENDHQ_API_KEY예워크스페이스 API 키(re_…)입니다. get_service_health를 제외한 모든 도구에 필요합니다. 키가 없어도 서버는 시작되며, 모든 호출은 해결 방법을 설명하는 구조화된 auth_error를 반환합니다.
SENDHQ_API_BASE_URL아니요API 기본 URL입니다. 기본값은 https://sendhq.cc/api/v1입니다. 로컬 또는 스테이징 배포에만 사용하세요. SENDHQ_BASE_URL은 이전 별칭으로 허용됩니다.
SENDHQ_MCP_READ_ONLY아니요1, true, yes는 --read-only와 똑같이 동작합니다.
--read-only아니요이메일을 발송하지 않고 상태도 바꾸지 않는 도구만 노출합니다. 숨겨진 도구는 이름으로 호출해도 거부됩니다.
SENDHQ_PROFILE / --profile아니요SENDHQ_API_KEY 대신 sendhq auth login으로 OS 키링에 저장한 키를 사용합니다. 둘 다 있으면 환경 변수가 우선합니다.

키는 설정된 기본 URL로 Authorization: Bearer 헤더로만 전송됩니다. 출력, 로그, 오류 메시지, 도구 결과에는 절대 포함되지 않습니다.

에이전트를 위한 안전 모델

  • 실제 이메일을 발송합니다. send_email, send_batch, send_template_test는 실제 사람에게 메일을 전달하며 전송 크레딧을 소모합니다. 이 도구들의 설명은 SENDS REAL EMAIL로 시작합니다. 사용자가 해당 메시지를 보내라고 명시적으로 요청하고, 수신자, 발신자, 콘텐츠를 확인한 경우에만 호출하세요.
  • 파괴적입니다. delete_email, delete_draft, delete_attachment, delete_domain, delete_inbox, remove_suppression은 destructiveHint: true로 표시되며 설명은 DESTRUCTIVE로 시작합니다. 먼저 사용자에게 확인하세요. remove_suppression은 안전 차단을 약화시키므로, 사람이 해당 주소가 다시 정상 작동한다고 확인한 경우에만 적절합니다.
  • 상태를 변경합니다. 초안, 템플릿, 도메인, 수신함의 생성 또는 업데이트, 템플릿 게시, 검증 시작은 워크스페이스를 변경하지만 메일을 발송하지는 않습니다.
  • 읽기 전용입니다. 그 외 모든 도구는 readOnlyHint: true이며 자유롭게 호출해도 안전합니다.
  • 이 서버는 DNS를 절대 변경하지 않습니다. add_domain은 사람이 게시할 레코드를 반환하고, get_domain_connect_link는 사람이 직접 열어 DNS 제공업체에서 승인해야 하는 동의 URL을 반환합니다.
  • 이 서버는 결제를 절대 변경하지 않습니다. get_account는 요금제, 사용량, 구독 상태만 읽습니다.
  • 미결제 워크스페이스(연동 체험판)는 계정 소유자의 이메일(get_account → user.email) 또는 success@simulator.amazonses.com 같은 AWS SES 시뮬레이터 주소로만 전송할 수 있으며, 첨부 파일은 보낼 수 없습니다.
  • 접수는 전달이 아닙니다. 발송에 성공하면 ID가 반환됩니다. 전달, 반송, 스팸 신고 증거는 나중에 list_email_events에 나타납니다. 받은편지함에 도달했다거나 사람이 메시지를 읽었다고 절대 단정하지 마세요.
  • 423 일시 중지를 우회하려고 다른 From 주소로 바꾸지 말고, 수신 거부하거나 스팸 신고한 수신자를 다시 추가하지 마세요.

API 키는 범위 밖입니다

설계상 API 키를 만들거나, 수정하거나, 교체하거나, 폐기하거나, 삭제하는 도구는 없습니다. 에이전트가 자격 증명을 발급하거나 파기해서는 안 되기 때문입니다. list_api_keys는 이름, 비밀이 아닌 접두사, 마지막 사용 시각만 반환합니다. 키 관리는 로그인한 사람이 대시보드에서 수행합니다.

워크플로

1. 첫 발송

  1. get_service_health로 API에 연결할 수 있는지 확인합니다(키 없이도 동작).
  2. get_account로 요금제(access.tier), 남은 할당량, user.email을 확인합니다. 체험판에서는 그 이메일이 유일하게 허용되는 실제 수신자입니다.
  3. list_sending_identities로 사용할 수 있는 From 주소를 조회합니다. 목록이 비어 있으면 먼저 도메인 워크플로를 진행하세요.
  4. 발신자, 수신자, 제목, 본문을 사용자에게 확인한 뒤 idempotency_key와 함께 send_email을 호출합니다.
  5. 반환된 id로 list_email_events를 호출하면 제공업체가 보고하는 즉시(보통 몇 초에서 몇 분 이내) delivery, bounce, complaint, reject가 표시됩니다.
첫 발송
{
  "name": "send_email",
  "arguments": {
    "from": "Acme <hello@example.com>",
    "to": [
      "owner@example.com"
    ],
    "subject": "SendHQ is connected",
    "text": "It works.",
    "idempotency_key": "first-send-2026-09-26"
  }
}

2. 도메인 검증 전 과정

  1. name: "example.com"으로 add_domain을 호출합니다. 결과에는 DNS 레코드(DKIM CNAME, SES 검증, SPF, 권장 DMARC)가 포함됩니다.
  2. domain_id로 get_dns_provider를 호출하면 권한 있는 DNS 제공업체를 감지하고 해당 제공업체에서 각 레코드에 입력할 정확한 상대 호스트를 반환합니다.
  3. providers.domainConnect.available이 true이면 get_domain_connect_link가 동의 URL을 반환합니다. 이를 사람에게 전달하세요. 사람이 제공업체에서 승인하기 전까지는 아무것도 바뀌지 않습니다. 그렇지 않으면 게시할 레코드를 사람에게 알려 주세요. SPF 레코드를 두 번째로 게시하지 말고 기존 v=spf1 값에 include:amazonses.com을 병합하세요.
  4. verify_domain은 DNS와 SES를 다시 확인합니다. 상태는 pending, checking, propagating을 거쳐 verified가 됩니다. verify_domain 또는 get_domain을 30~60초마다 폴링하세요. DNS는 몇 분에서 몇 시간이 걸릴 수 있습니다.
  5. status가 verified가 되면 도메인의 주소가 list_sending_identities에 나타납니다.

3. 반송, 스팸 신고, 발송 제외

  1. list_blocked_recipients는 차단된 모든 주소를 사유(bounce, complaint, unsubscribe)와 요약 건수와 함께 반환합니다.
  2. list_suppressions는 하드 바운스 및 스팸 신고로 인한 발송 제외 항목을 반환하고, deliverability_stats는 최근 30일의 전달률, 반송률, 스팸 신고율을 제공하며, list_sender_reputation은 속도가 제한되었거나 일시 중지된 From 주소를 보여 줍니다.
  3. 발송 제외된 수신자가 포함된 발송은 422 recipient_suppressed로 실패합니다. 그 수신자를 제거하고 다시 발송하세요.
  4. 사람이 반송된 메일함이 이제 정상 작동한다고 확인한 경우에만 remove_suppression을 호출하세요. 스팸 신고로 인한 발송 제외는 영구적입니다(409 complaint_suppression_locked).

4. 수신 이메일 받기

  1. 도메인(inbound.example.com 같은 서브도메인인 경우가 많음)이 검증되어 있어야 합니다.
  2. setup_inbound가 수신을 프로비저닝하고 MX 레코드 하나를 반환합니다. 사람이 이를 게시합니다.
  3. status가 ready가 될 때까지 verify_inbound를 호출합니다.
  4. domain_id와 local_part(예: support)로 create_inbox를 호출하면 support@inbound.example.com이 만들어집니다.
  5. direction: "in"과 unread: true(선택적으로 inbox_id)로 list_emails를 폴링합니다. 메시지는 get_email로, 대화는 get_thread로, 첨부 파일은 download_attachment로 읽고, 처리를 마치면 mark_email(read: true)로 표시합니다.
  6. send_email과 reply_to_email_id로 같은 스레드에서 답장합니다. SendHQ가 In-Reply-To, References, 스레드를 설정합니다.

5. 웹훅과 이벤트 알림

SendHQ는 현재 고객이 직접 설정할 수 있는 웹훅을 제공하지 않으므로 웹훅 도구가 없습니다. 제공업체 알림은 SendHQ 내부에서 처리되어 읽기 도구로 노출됩니다. 대신 폴링하세요. 메시지 하나의 결과에는 list_email_events, 최근 변경에는 status(예: bounced) 또는 after를 지정한 list_emails, 새 수신 메일에는 direction: "in"과 unread: true를 지정한 list_emails, 새 발송 제외에는 list_blocked_recipients를 사용합니다. 질문당 약 1분에 한 번을 넘지 않게 폴링하세요.

6. 전달 실패 진단

  1. 메시지 찾기: direction: "out"과 to 또는 query를 지정한 list_emails를 사용하거나, ID를 알면 get_email을 사용합니다. status: failed는 SendHQ 또는 제공업체가 제출 단계에서 거부했다는 뜻이며, 이메일의 오류가 이유를 설명합니다.
  2. list_email_events: bounce(제공업체 진단과 함께 영구적 또는 일시적), complaint, reject, delivery. 아직 이벤트가 없다면 제공업체가 보고하지 않은 것이므로 기다렸다가 다시 확인하세요.
  3. 발송 호출 자체가 실패했다면 오류 code를 확인하세요. sender_domain_unverified → 도메인 검증을 마치세요. recipient_suppressed → 그 주소가 이전에 하드 바운스되었거나 스팸 신고했습니다. sender_paused → list_sender_reputation을 확인하고 목록 출처를 고치세요. trial_recipient_restricted → 체험판 제한입니다. quota_exhausted → get_account 사용량을 확인하세요.
  4. get_domain으로 DKIM, SPF, DMARC가 여전히 게시되어 있는지 확인하고, deliverability_stats로 문제가 메시지 하나의 문제인지 추세인지 확인합니다.
  5. 증거가 보여 주는 내용을 그대로 보고하세요. delivery 이벤트는 수신자의 서버가 메시지를 받아들였다는 뜻이지, 받은편지함에 도달했거나 읽혔다는 뜻이 아닙니다.

7. 작업 버킷 운영하기(라벨)

  1. name(예: Agent/Orders)과 skip_inbox: true로 create_label을 호출합니다. 그러면 라벨이 버킷이 됩니다. 이 라벨이 붙는 수신 메일은 보관 처리되어 라벨에만 표시되고 사람의 받은편지함에는 나타나지 않습니다.
  2. send_email(또는 send_batch)에 labels: ["Agent/Orders"]를 지정해 작업 메일을 발송합니다. 그 대화에 대한 답장은 라벨을 자동으로 상속하고 받은편지함을 건너뜁니다.
  3. 내 대화 밖에서 시작되는 메일에는 분류 규칙을 추가합니다. inbox_id(orders@… 같은 전용 주소), from, to, subject를 지정해 create_label_rule을 호출하세요. 이미 받은 메일도 분류하려면 apply_to_existing: true를 전달합니다.
  4. 버킷 처리: label: "Agent/Orders", direction: "in", unread: true로 list_emails를 호출하고, get_email 또는 get_thread로 읽고, send_email과 reply_to_email_id로 답장하며, 처리를 마치면 mark_email read: true로 표시합니다.
  5. 엉뚱한 메시지는 label_email(add / remove)로 버킷에 넣거나 뺍니다. 수신 메시지에 버킷 라벨을 추가하면 그 메시지도 보관 처리됩니다.
  6. 선택적으로 set_inbox_forwarding은 수신 주소가 받는 모든 메일의 사본을 다른 메일함으로 보냅니다(대상은 먼저 이메일로 확인해야 합니다).
버킷으로 발송
{
  "name": "send_email",
  "arguments": {
    "from": "Orders <orders@example.com>",
    "to": [
      "customer@example.net"
    ],
    "subject": "Order 1042: confirm delivery window",
    "text": "Reply with a time that works.",
    "labels": [
      "Agent/Orders"
    ],
    "idempotency_key": "order-1042-window"
  }
}

8. 첨부 파일과 템플릿

유료 플랜에서는 send_email attachments로 파일을 최대 10개까지 첨부할 수 있습니다(각각 content_base64 또는 로컬 file_path가 필요하며 filename의 기본값은 파일의 basename입니다). 호스팅 템플릿의 경우 create_template → update_template_draft → 샘플 데이터로 미리 보는 render_template → 실제 테스트 메일 한 통을 보내는 send_template_test → publish_template 순서로 진행한 다음, template: {key, data}와 정확히 한 명의 to 수신자로 send_email 또는 send_batch를 호출해 발송합니다.

결과, 페이지네이션, 오류

호출에 성공하면 API의 JSON 객체가 structuredContent와 JSON 텍스트 블록으로 반환됩니다. 모든 list_* 도구는 limit(1–200, 기본값 50)과 offset을 받으며 pagination 객체를 추가합니다. has_more가 true인 동안 offset: pagination.next_offset으로 계속 호출하세요.

페이지네이션된 결과
{
  "data": [
    "…"
  ],
  "count": 50,
  "pagination": {
    "offset": 0,
    "limit": 50,
    "returned": 50,
    "total": 180,
    "has_more": true,
    "next_offset": 50
  }
}

호출에 실패하면 구조화된 오류와 함께 isError: true가 반환됩니다. 무작정 재시도하지 말고 remedy를 따르세요. retryable이 true일 때만 재시도하세요.

구조화된 도구 오류
{
  "error": {
    "code": "trial_recipient_restricted",
    "status": 402,
    "message": "The integration trial can deliver only to your account email or an AWS SES simulator address",
    "retryable": false,
    "explanation": "This workspace is on the unpaid integration trial. Trial sends can be delivered only to the account owner's email address or an AWS SES simulator address.",
    "remedy": "Send to the account email (get_account -> user.email) or a simulator address such as success@simulator.amazonses.com to test. To email anyone else, the account owner must activate a paid plan in the dashboard (Profile & Billing). Do not retry the same recipients."
  }
}

선택 오류 필드: request_id(지원 문의 시 인용), retry_after_seconds, problems(invalid_arguments에 대한 스키마 위반 목록), idempotent_replayed(멱등성 항목 참조).

멱등성

send_email과 send_batch는 idempotency_key(최대 200자)를 받으며 Idempotency-Key 헤더로 전송됩니다. 논리적 메시지 하나당 고정된 키 하나를 생성하세요(예: invoice-4812-receipt).

  • 재시도할 때는 같은 키와 동일한 요청 본문을 모두 재사용해야 합니다. 같은 키에 무엇이든(수신자, 제목, 본문, 헤더, 템플릿 데이터, 인수 값까지) 변경이 있으면 409 idempotency_conflict가 반환됩니다.
  • 같은 키, 같은 본문, 원래 요청이 끝난 경우: SendHQ는 다시 발송하지 않고 저장된 결과를 반환합니다. 타임아웃이나 network_error 이후 안전하게 재시도하는 방법이 이것입니다.
  • 원래 요청이 아직 실행 중일 때 같은 키: 409 idempotency_in_progress이며 잠시 기다린 후 재시도할 수 있습니다.
  • 새로운 논리적 메시지에는 새 키가 필요합니다.
  • 저장된 실패도 다시 재생됩니다. 첫 시도가 실패했다면 같은 키로 재시도할 때 idempotent_replayed: true와 retryable: false가 붙은 같은 실패가 반환됩니다. list_emails(direction: out)로 아무것도 발송되지 않았는지 확인하고, 원인을 고친 뒤 새 키로 발송하세요.
  • 서버는 POST를 스스로 재시도하지 않습니다. 읽기 전용 GET 호출만 자동으로 재시도됩니다(네트워크 오류, 429, 5xx에서 최대 3회).
  • 인라인 attachments가 있는 send_email은 여러 요청을 실행하므로 idempotency_key를 받을 수 없습니다. 재시도해도 안전한 첨부 파일 발송은 create_draft → upload_attachment → draft_id와 idempotency_key를 지정한 send_email 순서로 진행하세요.
재시도해도 안전한 발송(타임아웃 시 그대로 반복)
{
  "name": "send_email",
  "arguments": {
    "from": "Acme <billing@example.com>",
    "to": [
      "owner@example.com"
    ],
    "subject": "Receipt #4812",
    "text": "Thanks for your payment.",
    "idempotency_key": "receipt-4812"
  }
}

속도 제한과 할당량

SendHQ는 API의 초당 요청 수 제한을 고정 값으로 공개하지 않습니다. 에이전트가 실제로 마주치는 제한은 사용량 한도이며 429로 반환됩니다.

  • 요금제별 월간 수신자 전달 수. To, Cc, Bcc 주소 각각이 전달 1건으로 집계됩니다. get_account → usage.recipientDeliveries와 usage.emailQuotaMonth를 비교해 확인하세요.
  • 정확한 From 주소별 일일 수신자 수는 해당 발신자의 평판 상태에 따라 정해집니다(list_sender_reputation → dailyLimit, 유료 요금제의 기본값은 2,000).
  • 연동 체험판: 총 100명의 수신자, 계정 이메일 또는 SES 시뮬레이터 주소로만 가능합니다.
  • 첨부 파일: 메시지당 최대 10개 파일과 10 MB, 유료 요금제에서는 월 10 GB의 수신자 가중 첨부 파일 전송량.
  • 요청당: To + Cc + Bcc 최대 100개 주소, send_batch는 최대 100개 메시지.
  • 평판 차단기: 최근 7일 롤링 기간 동안 반송 또는 스팸 신고가 임계값을 넘으면 From 주소 하나의 발송 속도를 제한하거나 일시 중지합니다(423 sender_paused). 비율이 낮아지면 자동으로 복구됩니다.

quota_exhausted는 기간이 초기화되거나 요금제가 바뀌기 전까지 재시도할 수 없습니다. rate_limited는 retry_after_seconds 이후 재시도할 수 있으며, 발송은 같은 idempotency_key와 동일한 본문으로 재시도하세요.

오류 카탈로그

code는 안정적이므로 message가 아니라 이 값으로 분기하세요.

codeHTTP재시도 여부의미와 대응 방법
invalid_arguments—아니요인수가 도구의 JSON 스키마 검증에 로컬에서 실패했습니다. SendHQ에는 아무것도 도달하지 않았습니다. problems에 나열된 필드를 수정하세요.
auth_error401아니요API 키가 없거나, 폐기되었거나, 잘못되었습니다. 서버 프로세스에 SENDHQ_API_KEY를 설정하세요. 키는 사람이 대시보드에서 만듭니다.
trial_recipient_restricted402아니요연동 체험판은 계정 이메일 또는 SES 시뮬레이터 주소로만 전송할 수 있습니다. 그 주소로 보내거나, 소유자가 유료 요금제를 활성화하세요.
payment_required402아니요이 기능에는 유료 요금제가 필요합니다(예: 첨부 파일). 해당 기능 없이 발송하거나 업그레이드하세요.
sender_domain_not_owned403아니요From 도메인이 이 워크스페이스에 없습니다. list_sending_identities 또는 add_domain을 사용하세요.
sender_domain_unverified403아니요From 도메인이 아직 검증되지 않았습니다. get_domain을 호출하고, 누락된 레코드를 게시한 뒤 verify_domain을 호출하세요.
domain_limit_reached403아니요요금제의 도메인 한도에 도달했습니다. 사용하지 않는 도메인을 (승인을 받아) 제거하거나 업그레이드하세요.
marketing_not_enabled403아니요이 도메인 또는 요금제에서는 marketing 클래스가 활성화되어 있지 않습니다. 메시지가 실제로 트랜잭션 성격일 때만 transactional을 사용하세요.
forbidden403아니요정책상 허용되지 않는 작업입니다. 요청을 수정하세요.
not_found404아니요ID가 이 워크스페이스에 없습니다. 리소스 목록을 조회해 올바른 ID를 찾고, 보관된 템플릿은 먼저 복원하세요.
idempotency_conflict409아니요키를 다른 본문으로 재사용했습니다. 원래 요청을 그대로 다시 보내거나, 새 메시지에는 새 키를 사용하세요.
idempotency_in_progress409예원래 요청이 아직 실행 중입니다. 기다렸다가 같은 키와 본문으로 재시도하세요.
revision_conflict409아니요템플릿 초안을 읽은 뒤 변경되었습니다. get_template을 호출하고, 병합한 뒤 다시 저장하세요.
complaint_suppression_locked409아니요수신자가 스팸으로 신고했습니다. 다시는 이메일을 보내지 마세요.
inbound_not_ready409아니요수신 준비가 되지 않았습니다. setup_inbound, MX 게시, verify_inbound 순서로 진행하세요.
conflict409아니요리소스가 이미 존재하거나 잘못된 상태입니다. 읽어 보고 조정하세요.
attachments_too_large413아니요파일이 10개를 넘거나 10 MB를 넘습니다. 첨부 파일을 제거하거나 줄이세요.
recipient_suppressed422아니요수신자가 이전에 하드 바운스되었거나 스팸으로 신고했습니다. 그 수신자를 제거하세요. list_blocked_recipients를 참고하세요.
recipient_unsubscribed422아니요수신자가 마케팅 메일 수신을 거부했습니다. 그 수신자를 영구적으로 제거하세요.
validation_failed422아니요콘텐츠가 거부되었습니다(예: 변수 계약을 위반하는 템플릿 데이터). 입력을 수정하세요.
sender_paused423아니요이 From 주소는 7일 반송/스팸 신고 차단기에 의해 일시 중지되었습니다. 발송을 중단하고, 목록을 고친 뒤 자동 복구를 기다리세요.
quota_exhausted429아니요월간, 발신자별 일일, 첨부 파일 또는 체험판 한도에 도달했습니다. get_account를 확인하고 초기화를 기다리거나 업그레이드하세요.
rate_limited429예속도를 늦추고 retry_after_seconds만큼 기다리세요. 발송은 같은 키, 같은 본문으로 재시도하세요.
server_error5xx예SendHQ 또는 제공업체의 일시적인 장애입니다. 백오프 후 재시도하세요. 발송은 같은 키와 본문으로 재시도합니다. idempotent_replayed가 true이면 아무것도 발송되지 않았음을 확인한 후 새 키를 사용하세요.
network_error—예요청 또는 응답이 유실되었습니다. 재시도하세요. 발송은 같은 idempotency_key를 쓰면 안전합니다.
invalid_request400아니요형식이 잘못된 요청입니다. message를 읽고 수정하세요.
tool_error—아니요MCP 서버 내부의 로컬 실패입니다(예: 읽을 수 없는 file_path). message를 읽어 보세요.

도구 레퍼런스

모든 도구의 안전 등급, 호출하는 REST 엔드포인트, 매개변수, 반환 형태, tools/call params 객체 예시를 나열합니다. 매개변수는 정확히 이대로여야 하며, 서버는 나열되지 않은 항목을 모두 거부합니다.

이메일 및 스레드: send_email, send_batch, list_emails, get_email, mark_email, delete_email, list_email_events, get_thread
라벨 및 자동 분류 규칙: list_labels, get_label, create_label, update_label, delete_label, create_label_rule, delete_label_rule, label_email
초안, 첨부 파일, 발신 ID: list_sending_identities, create_draft, list_drafts, get_draft, update_draft, delete_draft, upload_attachment, download_attachment, delete_attachment
호스팅 템플릿: list_templates, create_template, get_template, update_template_draft, create_template_draft, render_template, send_template_test, publish_template, archive_template, restore_template
도메인 및 DNS: list_domains, get_domain, add_domain, verify_domain, delete_domain, get_dns_provider, get_domain_connect_link
수신 이메일: setup_inbound, verify_inbound, list_inboxes, get_inbox, create_inbox, update_inbox, set_inbox_forwarding, delete_inbox
전달성, 반송, 발송 제외: deliverability_stats, list_sender_reputation, list_suppressions, remove_suppression, list_blocked_recipients
계정, 사용량, 분석, 키: get_account, get_analytics, list_api_keys, get_service_health

이메일 및 스레드

실제 이메일 발송send_email
POST /emails

이메일 한 통 발송

SENDS REAL EMAIL(실제 이메일이 발송됩니다). 검증된 도메인에서 메시지 하나를 발송합니다. 원본 html/text, 게시된 호스팅 템플릿, 기존 스레드에 대한 답장, 첨부 파일이 있는 메시지가 모두 가능합니다. 재시도 시 두 번 발송되지 않도록 idempotency_key를 전달하세요. 재시도할 때는 같은 키와 동일한 요청을 재사용해야 하며, 그렇지 않으면 SendHQ가 409를 반환합니다. attachments는 초안을 만들고, 각 파일을 업로드하고, 그 초안으로 발송하는 편의 기능이며 idempotency_key 또는 draft_id와 함께 쓸 수 없습니다(재시도해도 안전한 첨부 파일 발송에는 create_draft + upload_attachment + draft_id를 지정한 send_email을 사용하세요). 미결제 워크스페이스(연동 체험판)는 계정 이메일 또는 AWS SES 시뮬레이터 주소로만 전송할 수 있으며 첨부 파일은 보낼 수 없습니다.

다음 중 하나 이상을 지정하세요: html, text, template.

매개변수타입필수설명
fromstring예발신자입니다. 예: Acme <hello@example.com>. 도메인은 이 워크스페이스에서 검증되어 있어야 합니다(list_sending_identities 참조). (최대 998자)
tostring[]예수신자입니다. 각 항목은 주소이며 표시 이름을 붙일 수 있습니다. To+cc+bcc는 합쳐서 최대 100개이며, 모든 대상은 전송 크레딧을 1개씩 소모합니다. (1–100개 항목)
ccstring[]아니요참조(Cc) 수신자. (0–100개 항목)
bccstring[]아니요숨은 참조(Bcc) 수신자. (0–100개 항목)
subjectstring아니요제목입니다. 템플릿을 보낼 때는 생략하세요. (최대 998자)
textstring아니요일반 텍스트 본문. text, html 또는 template 중 하나를 지정하세요.
htmlstring아니요HTML 본문. SendHQ가 이를 정제하며 text를 생략하면 텍스트를 생성합니다.
reply_tostring아니요Reply-To 주소.
headersobject아니요안전한 추가 사용자 정의 헤더(문자열 값). 예: {"X-Entity-Ref-ID": "123"}. From/To/Message-ID 같은 라우팅 헤더는 SendHQ가 제어합니다.
message_classstring아니요transactional(기본값) 또는 marketing입니다. marketing에는 마케팅이 활성화된 요금제 또는 도메인이 필요하며 수신 거부 처리가 추가됩니다. (다음 중 하나: transactional, marketing)
reply_to_email_idstring아니요기존 대화 안에서 답장합니다. 답장하려는 메시지의 em_… ID입니다. SendHQ가 In-Reply-To/References와 스레드를 설정합니다.
thread_idstring아니요메시지를 분류할 명시적 스레드 ID.
draft_idstring아니요저장된 초안의 첨부 파일을 이 메시지와 함께 보냅니다(dr_…). 발송에 성공하면 초안이 삭제됩니다.
templateobject아니요원본 html/text 대신 게시된 호스팅 템플릿을 발송합니다. to 수신자가 정확히 한 명이어야 하며 cc/bcc는 없어야 합니다. 제목은 템플릿이 제공합니다. id, key 중 하나 이상을 지정하세요.
template.idstring아니요템플릿 ID(tmpl_…). id 또는 key를 지정하세요.
template.keystring아니요account-welcome 같은 템플릿 키. id 또는 key를 지정하세요.
template.version_idstring아니요선택 사항인 게시 릴리스 ID(tmplv_…). 기본값은 현재 게시된 릴리스입니다.
template.dataobject아니요템플릿에 정의된 타입 변수의 값.
labelsstring[]아니요이 메시지를 분류할 라벨 이름 또는 lbl_… ID. 알 수 없는 이름은 새로 생성됩니다. 대화의 답장은 라벨을 상속하며, 버킷 라벨(skip_inbox)은 그 답장이 받은편지함에 들어오지 않게 합니다. 최대 10개. (0–10개 항목)
idempotency_keystring아니요Idempotency-Key 헤더(최대 200자). 이 요청을 그대로 재시도할 때만 재사용하세요. (최대 200자)
attachmentsobject[]아니요첨부할 파일(최대 10개 파일, 총 10 MB). 각 파일에는 content_base64(와 filename) 또는 로컬 file_path가 필요합니다. (0–10개 항목) 다음 중 하나 이상을 지정하세요: content_base64, file_path.
attachments[].filenamestring아니요수신자에게 표시되는 파일 이름. content_base64와 함께 쓸 때는 필수이며, 기본값은 file_path의 basename입니다. (최대 255자)
attachments[].content_typestring아니요MIME 타입. 예: application/pdf. 기본값은 application/octet-stream입니다.
attachments[].content_base64string아니요표준 base64 파일 내용.
attachments[].file_pathstring아니요MCP 서버 프로세스가 읽을 수 있는 로컬 파일의 절대 경로.
반환값{id: em_…, providerMessageId, threadId, templateId, templateVersionId, isTest}. Acceptance is not delivery: follow up with list_email_events.
tools/call params 예시
{
  "name": "send_email",
  "arguments": {
    "from": "Acme <hello@example.com>",
    "to": [
      "owner@example.com"
    ],
    "subject": "Your export is ready",
    "text": "Download it from your dashboard.",
    "idempotency_key": "export-ready-42"
  }
}
실제 이메일 발송send_batch
POST /emails/batch

개별화된 이메일 일괄 발송

SENDS REAL EMAIL(실제 이메일이 발송됩니다). 독립적인 메시지 1~100개를 한 요청으로 발송합니다(수신자별 템플릿 개인화에 사용). 각 항목은 send_email과 같은 형태입니다(attachments/idempotency_key 제외). 항목은 각각 성공하거나 실패합니다. HTTP 207은 부분 성공을 뜻하므로 각 data[i].ok와 data[i].error를 확인하세요. idempotency_key 하나가 일괄 발송 본문 전체를 포괄합니다.

매개변수타입필수설명
emailsobject[]예발송할 메시지. (1–100개 항목) 다음 중 하나 이상을 지정하세요: html, text, template.
idempotency_keystring아니요일괄 발송 전체에 대한 Idempotency-Key(최대 200자). (최대 200자)
반환값{data: [{index, ok, id?, error?: {message, status}}], count, successful, failed}.
tools/call params 예시
{
  "name": "send_batch",
  "arguments": {
    "emails": [
      {
        "from": "Acme <hello@example.com>",
        "to": [
          "owner@example.com"
        ],
        "template": {
          "key": "account-welcome",
          "data": {
            "first_name": "Asha"
          }
        }
      }
    ],
    "idempotency_key": "welcome-batch-2026-09-26"
  }
}
읽기 전용list_emails
GET /emails

이메일 목록 조회 및 검색

발신(direction: out) 및 수신(direction: in) 이메일을 필터를 적용해 최신순으로 나열합니다. 수신 메일은 분류되어 있습니다. 사람의 받은편지함은 direction: in, archived: false, category: primary로 읽고, 우선순위 분류는 important: true로 하며, 스팸은 category: spam 또는 include_spam: true가 아니면 숨겨집니다. 페이지네이션: 결과에 pagination {offset, limit, returned, total?, has_more, next_offset}이 포함됩니다.

매개변수타입필수설명
directionstring아니요수신은 in, 발신은 out. (다음 중 하나: in, out)
statusstring아니요상태 필터. 예: queued, sent, delivered, bounced, complained, failed.
domainstring아니요이 도메인 또는 쉼표로 구분한 도메인 목록(하나라도 일치)의 메시지만.
inbox_idstring아니요이 수신함(inb_…)이 받은 메시지만.
labelstring아니요이 라벨이 붙은 메시지만: 라벨 ID lbl_… 또는 정확한 이름, 또는 쉼표로 구분한 목록(하나라도 일치). 폴더를 보려면 list_labels를 사용하세요.
archivedboolean아니요false = 받은편지함 보기(보관되지 않은 수신 메일), true = 보관된 메일만. 생략하면 모든 메일.
categorystring아니요primary(사람), updates(뉴스레터, 대량 메일, 자동 메일), spam 또는 쉼표로 구분한 목록. 스팸은 요청하지 않으면 숨겨집니다.
importantboolean아니요true = 중요로 표시된 메시지만(내가 시작한 대화에 대한 답장과 중요로 지정한 발신자).
include_spamboolean아니요결과에 스팸을 포함합니다(모든 폴더에 걸친 검색용).
fromstring아니요발신자 주소가 이 값을 포함합니다.
tostring아니요수신자 주소가 이 값을 포함합니다.
unreadboolean아니요true = 읽지 않은 메일만, false = 읽은 메일만.
afterstring아니요ISO-8601 타임스탬프. 그 이후에 생성된 메시지만. (date-time)
beforestring아니요ISO-8601 타임스탬프. 그 이전에 생성된 메시지만. (date-time)
querystring아니요제목, 본문, 발신자/수신자 주소, 첨부 파일 이름에 대한 자유 텍스트 검색. (최대 200자)
limitinteger아니요페이지 크기. 기본값은 50입니다. (기본값 50; 1–200)
offsetinteger아니요건너뛸 레코드 수. 이전 페이지의 pagination.next_offset을 사용하세요. (기본값 0; 0–…)
반환값{data: [email summaries], count, pagination}.
어노테이션readOnlyHint idempotentHint
tools/call params 예시
{
  "name": "list_emails",
  "arguments": {
    "direction": "in",
    "unread": true,
    "limit": 25
  }
}
읽기 전용get_email
GET /emails/:email_id

이메일 한 통 조회

헤더, html/text 본문, 상태, 스레드 메타데이터, 첨부 파일 메타데이터가 포함된 메시지 하나를 조회합니다(바이트 다운로드는 download_attachment 사용).

매개변수타입필수설명
email_idstring예이메일 ID(em_로 시작). 목록 또는 생성 도구가 반환한 값. (최대 128자)
반환값Email object: {id, direction, status, from, to, cc, bcc, subject, html, text, threadId, messageId, providerMessageId, readAt, createdAt, attachments: [{id, filename, contentType, sizeBytes, available}]}.
어노테이션readOnlyHint idempotentHint
tools/call params 예시
{
  "name": "get_email",
  "arguments": {
    "email_id": "em_123"
  }
}
상태 변경mark_email
PATCH /emails/:email_id

읽음, 보관, 스팸, 중요 표시

메시지 하나를 업데이트합니다. read, archived, category(primary, updates, spam, 수신 메일 전용), important를 지정할 수 있습니다. 스팸으로 신고하거나 중요로 표시하면 SendHQ가 이후 메일에 대해 해당 발신자를 학습합니다. 이 메시지만 변경하려면 learn: false를 전달하세요. 필드를 하나 이상 지정해야 합니다.

매개변수타입필수설명
email_idstring예이메일 ID(em_로 시작). 목록 또는 생성 도구가 반환한 값. (최대 128자)
readboolean아니요true = 읽음, false = 읽지 않음.
archivedboolean아니요true = 보관(받은편지함 건너뜀), false = 받은편지함으로 되돌림.
categorystring아니요수신 메시지를 primary, updates 또는 spam으로 이동합니다. (다음 중 하나: primary, updates, spam)
importantboolean아니요메시지를 중요로 표시하거나 표시를 해제합니다.
learnboolean아니요false = 이 판단을 발신자에 대해 기억하지 않습니다(기본값 true).
반환값The updated email object.
어노테이션idempotentHint
tools/call params 예시
{
  "name": "mark_email",
  "arguments": {
    "email_id": "em_123",
    "read": true
  }
}
파괴적 작업delete_email
DELETE /emails/:email_id

이메일 삭제

DESTRUCTIVE(파괴적 작업): 보관 중인 메시지와 저장된 첨부 파일을 SendHQ에서 영구적으로 삭제합니다. 이미 전달된 메시지를 회수하지는 않습니다.

매개변수타입필수설명
email_idstring예이메일 ID(em_로 시작). 목록 또는 생성 도구가 반환한 값. (최대 128자)
반환값{ok: true}.
어노테이션destructiveHint idempotentHint
tools/call params 예시
{
  "name": "delete_email",
  "arguments": {
    "email_id": "em_123"
  }
}
읽기 전용list_email_events
GET /emails/:email_id/events

이메일의 전송 이벤트 목록 조회

발송된 메시지 하나에 대한 제공업체 이벤트: delivery, bounce, complaint, reject, open, click. 메시지가 전달되었는지, 또는 실패한 이유가 무엇인지에 대한 근거입니다. 페이지네이션: 결과에 pagination {offset, limit, returned, total?, has_more, next_offset}이 포함됩니다.

매개변수타입필수설명
email_idstring예이메일 ID(em_로 시작). 목록 또는 생성 도구가 반환한 값. (최대 128자)
limitinteger아니요페이지 크기. 기본값은 50입니다. (기본값 50; 1–200)
offsetinteger아니요건너뛸 레코드 수. 이전 페이지의 pagination.next_offset을 사용하세요. (기본값 0; 0–…)
반환값{data: [{event_type, recipient, reason, created_at, …}], count, pagination}.
어노테이션readOnlyHint idempotentHint
tools/call params 예시
{
  "name": "list_email_events",
  "arguments": {
    "email_id": "em_123"
  }
}
읽기 전용get_thread
GET /threads/:thread_id

대화 조회

대화의 모든 메시지(발신 및 수신)를 시간순으로, 각각 첨부 파일 메타데이터와 함께 조회합니다.

매개변수타입필수설명
thread_idstring예스레드 ID(보통 첫 메시지의 em_… ID이며, 아무 이메일의 threadId를 참조). (최대 128자)
반환값{id, subject, data: [emails]}.
어노테이션readOnlyHint idempotentHint
tools/call params 예시
{
  "name": "get_thread",
  "arguments": {
    "thread_id": "em_123"
  }
}

라벨 및 자동 분류 규칙

읽기 전용list_labels
GET /labels

라벨 목록 조회

워크스페이스의 라벨(폴더)을 전체 및 읽지 않은 메시지 수, 자동 분류 규칙과 함께 나열합니다. 페이지네이션: 결과에 pagination {offset, limit, returned, total?, has_more, next_offset}이 포함됩니다.

매개변수타입필수설명
limitinteger아니요페이지 크기. 기본값은 50입니다. (기본값 50; 1–200)
offsetinteger아니요건너뛸 레코드 수. 이전 페이지의 pagination.next_offset을 사용하세요. (기본값 0; 0–…)
반환값{data: [{id, name, color, totalCount, unreadCount, rules: [...]}], count, pagination}.
어노테이션readOnlyHint idempotentHint
tools/call params 예시
{
  "name": "list_labels",
  "arguments": {}
}
읽기 전용get_label
GET /labels/:label_id

라벨 조회

메시지 수와 자동 분류 규칙이 포함된 라벨 하나를 조회합니다.

매개변수타입필수설명
label_idstring예라벨 ID(lbl_로 시작) 또는 정확한 라벨 이름. (최대 128자)
반환값Label object.
어노테이션readOnlyHint idempotentHint
tools/call params 예시
{
  "name": "get_label",
  "arguments": {
    "label_id": "Billing"
  }
}
상태 변경create_label
POST /labels

라벨 생성

폴더 형태의 라벨을 생성합니다. skip_inbox: true를 설정하면 에이전트가 소유하는 버킷이 됩니다. labels: [name]으로 발송하면 답장이 해당 라벨로 분류되고 받은편지함에는 들어오지 않습니다. 선택 사항인 자동 분류 규칙은 새로 발송하거나 수신한 메일을 분류합니다(규칙의 모든 조건이 일치해야 함). 보관 중인 메일도 분류하려면 apply_to_existing을 설정하세요.

매개변수타입필수설명
namestring예라벨 이름. 예: Billing 또는 Clients/Acme. 워크스페이스 안에서 고유해야 합니다(대소문자 구분 없음). (최대 64자)
colorstring아니요#1a73e8 같은 16진수 색상. 선택 사항.
skip_inboxboolean아니요버킷 모드: 이 라벨이 붙는 수신 메일(규칙, 이 라벨로 발송한 대화에 대한 답장, 수동 추가 중 어느 경우든)은 보관 처리되어 받은편지함이 아닌 라벨에만 표시됩니다.
rulesobject[]아니요선택 사항인 자동 분류 규칙(최대 20개). 각 규칙에는 inbox_id, from, to, subject 중 하나 이상이 필요합니다. (0–20개 항목)
rules[].directionstring아니요in(수신) 또는 out(발신) 메일만. 생략하면 둘 다. (다음 중 하나: in, out)
rules[].inbox_idstring아니요이 수신함(inb_…)이 받은 메일만. 수신 주소마다 별도의 폴더로 분류합니다.
rules[].fromstring아니요발신자가 이 텍스트를 포함합니다(대소문자 구분 없음). 예: @stripe.com. (최대 200자)
rules[].tostring아니요To/Cc가 이 텍스트를 포함합니다(대소문자 구분 없음). (최대 200자)
rules[].subjectstring아니요제목이 이 텍스트를 포함합니다(대소문자 구분 없음). (최대 200자)
rules[].skip_inboxboolean아니요일치하는 수신 메일을 보관 처리해 받은편지함이 아닌 라벨 폴더에만 표시합니다.
apply_to_existingboolean아니요규칙과 일치하는, 이미 보관 중인 메일도 분류합니다.
반환값The created label with rules.
tools/call params 예시
{
  "name": "create_label",
  "arguments": {
    "name": "Agent/Orders",
    "skip_inbox": true,
    "rules": [
      {
        "from": "@stripe.com"
      }
    ]
  }
}
상태 변경update_label
PATCH /labels/:label_id

라벨 이름 변경, 색상 변경, 버킷 전환

라벨 이름을 바꾸거나, 색상을 변경하거나, 버킷 모드(skip_inbox)를 전환합니다. 버킷 모드를 켜면 이미 라벨에 있는 수신 메일도 보관 처리됩니다.

매개변수타입필수설명
label_idstring예라벨 ID(lbl_로 시작) 또는 정확한 라벨 이름. (최대 128자)
namestring아니요새 이름. (최대 64자)
colorstring아니요새 16진수 색상.
skip_inboxboolean아니요버킷 모드: 이 라벨이 붙는 수신 메일(규칙, 이 라벨로 발송한 대화에 대한 답장, 수동 추가 중 어느 경우든)은 보관 처리되어 받은편지함이 아닌 라벨에만 표시됩니다.
반환값Updated label.
어노테이션idempotentHint
tools/call params 예시
{
  "name": "update_label",
  "arguments": {
    "label_id": "lbl_123",
    "name": "Finance/Billing"
  }
}
파괴적 작업delete_label
DELETE /labels/:label_id

라벨 삭제

DESTRUCTIVE(파괴적 작업): 라벨과 그 규칙을 삭제합니다. 이메일 자체는 유지되며 이 라벨만 사라집니다.

매개변수타입필수설명
label_idstring예라벨 ID(lbl_로 시작) 또는 정확한 라벨 이름. (최대 128자)
반환값{ok: true}.
어노테이션destructiveHint idempotentHint
tools/call params 예시
{
  "name": "delete_label",
  "arguments": {
    "label_id": "lbl_123"
  }
}
상태 변경create_label_rule
POST /labels/:label_id/rules

자동 분류 규칙 추가

라벨에 규칙을 추가해 조건에 맞는 새 메일이 자동으로 분류되게 합니다. 설정한 모든 조건이 일치해야 합니다. 수신 주소마다 별도 폴더를 만들려면 inbox_id를 사용하고, 받은편지함에 들어오지 않게 하려면 skip_inbox를 추가하세요.

매개변수타입필수설명
label_idstring예라벨 ID(lbl_로 시작) 또는 정확한 라벨 이름. (최대 128자)
directionstring아니요in(수신) 또는 out(발신) 메일만. 생략하면 둘 다. (다음 중 하나: in, out)
inbox_idstring아니요이 수신함(inb_…)이 받은 메일만. 수신 주소마다 별도의 폴더로 분류합니다.
fromstring아니요발신자가 이 텍스트를 포함합니다(대소문자 구분 없음). 예: @stripe.com. (최대 200자)
tostring아니요To/Cc가 이 텍스트를 포함합니다(대소문자 구분 없음). (최대 200자)
subjectstring아니요제목이 이 텍스트를 포함합니다(대소문자 구분 없음). (최대 200자)
skip_inboxboolean아니요일치하는 수신 메일을 보관 처리해 받은편지함이 아닌 라벨 폴더에만 표시합니다.
apply_to_existingboolean아니요조건에 일치하는, 이미 보관 중인 메일도 분류합니다.
반환값{id: lrule_…, labelId, direction, inboxId, from, to, subject, skipInbox}.
tools/call params 예시
{
  "name": "create_label_rule",
  "arguments": {
    "label_id": "Billing",
    "inbox_id": "inb_123",
    "skip_inbox": true
  }
}
파괴적 작업delete_label_rule
DELETE /labels/:label_id/rules/:rule_id

자동 분류 규칙 삭제

DESTRUCTIVE(파괴적 작업): 자동 분류 규칙 하나를 제거합니다. 이미 분류된 메일은 라벨이 유지됩니다.

매개변수타입필수설명
label_idstring예라벨 ID(lbl_로 시작) 또는 정확한 라벨 이름. (최대 128자)
rule_idstring예규칙 ID(lrule_로 시작). get_label에서 가져옵니다. (최대 128자)
반환값{ok: true}.
어노테이션destructiveHint idempotentHint
tools/call params 예시
{
  "name": "delete_label_rule",
  "arguments": {
    "label_id": "lbl_123",
    "rule_id": "lrule_123"
  }
}
상태 변경label_email
POST /emails/:email_id/labels

이메일에 라벨 추가 또는 제거

메시지를 폴더 사이에서 이동합니다. 이름 또는 lbl_… ID로 라벨을 추가하거나 제거하세요. add의 알 수 없는 이름은 create가 false가 아닌 한 새로 생성됩니다.

매개변수타입필수설명
email_idstring예이메일 ID(em_로 시작). 목록 또는 생성 도구가 반환한 값. (최대 128자)
addstring[]아니요추가할 라벨. (0–10개 항목)
removestring[]아니요제거할 라벨. (0–10개 항목)
createboolean아니요add의 알 수 없는 라벨을 생성합니다(기본값 true).
반환값The updated email with labels.
어노테이션idempotentHint
tools/call params 예시
{
  "name": "label_email",
  "arguments": {
    "email_id": "em_123",
    "add": [
      "Billing"
    ],
    "remove": [
      "Support"
    ]
  }
}

초안, 첨부 파일, 발신 ID

읽기 전용list_sending_identities
GET /sending-identities

검증된 발신 ID 목록 조회

이 워크스페이스가 지금 발신할 수 있는 주소와 도메인(검증된 도메인, 기본 From, 활성 수신함 주소)입니다. 유효한 from을 고르려면 send_email 전에 호출하세요.

매개변수 없음.

반환값{domains: [verified domain names], addresses: [sender addresses], localParts: [...]}.
어노테이션readOnlyHint idempotentHint
tools/call params 예시
{
  "name": "list_sending_identities",
  "arguments": {}
}
상태 변경create_draft
POST /drafts

초안 생성

작성기 초안을 생성합니다. 초안에는 첨부 파일이 들어갑니다. 초안을 만들고, upload_attachment를 호출한 뒤, draft_id와 함께 send_email을 호출하세요. 아무것도 발송하지 않습니다.

매개변수타입필수설명
fromstring아니요검증된 도메인의 발신 주소(초안 작성 중에는 비워 둘 수 있음).
tostring[]아니요수신자. (0–100개 항목)
ccstring[]아니요참조(Cc) 수신자. (0–100개 항목)
bccstring[]아니요숨은 참조(Bcc) 수신자. (0–100개 항목)
subjectstring아니요제목. (최대 998자)
htmlstring아니요HTML 본문.
textstring아니요일반 텍스트 본문.
reply_to_email_idstring아니요이 초안이 답장하는 이메일 ID.
thread_idstring아니요이 초안이 속한 스레드 ID.
반환값Draft object {id: dr_…, from, to, cc, bcc, subject, html, text, attachments: []}.
tools/call params 예시
{
  "name": "create_draft",
  "arguments": {
    "from": "hello@example.com",
    "to": [
      "owner@example.com"
    ],
    "subject": "Invoice"
  }
}
읽기 전용list_drafts
GET /drafts

초안 목록 조회

작성기 초안을 최근 업데이트순으로 나열합니다. 페이지네이션: 결과에 pagination {offset, limit, returned, total?, has_more, next_offset}이 포함됩니다.

매개변수타입필수설명
limitinteger아니요페이지 크기. 기본값은 50입니다. (기본값 50; 1–200)
offsetinteger아니요건너뛸 레코드 수. 이전 페이지의 pagination.next_offset을 사용하세요. (기본값 0; 0–…)
반환값{data: [drafts], count, pagination}.
어노테이션readOnlyHint idempotentHint
tools/call params 예시
{
  "name": "list_drafts",
  "arguments": {}
}
읽기 전용get_draft
GET /drafts/:draft_id

초안 조회

첨부 파일 메타데이터가 포함된 초안 하나를 조회합니다.

매개변수타입필수설명
draft_idstring예초안 ID(dr_로 시작). 목록 또는 생성 도구가 반환한 값. (최대 128자)
반환값Draft object with attachments.
어노테이션readOnlyHint idempotentHint
tools/call params 예시
{
  "name": "get_draft",
  "arguments": {
    "draft_id": "dr_123"
  }
}
상태 변경update_draft
PUT /drafts/:draft_id

초안 내용 교체

초안의 내용과 수신자를 교체합니다. 전체 교체이므로 생략한 필드는 지워집니다. 먼저 get_draft를 읽고 유지하려는 모든 필드를 함께 보내세요. 첨부 파일은 영향을 받지 않습니다.

매개변수타입필수설명
draft_idstring예초안 ID(dr_로 시작). 목록 또는 생성 도구가 반환한 값. (최대 128자)
fromstring아니요검증된 도메인의 발신 주소(초안 작성 중에는 비워 둘 수 있음).
tostring[]아니요수신자. (0–100개 항목)
ccstring[]아니요참조(Cc) 수신자. (0–100개 항목)
bccstring[]아니요숨은 참조(Bcc) 수신자. (0–100개 항목)
subjectstring아니요제목. (최대 998자)
htmlstring아니요HTML 본문.
textstring아니요일반 텍스트 본문.
reply_to_email_idstring아니요이 초안이 답장하는 이메일 ID.
thread_idstring아니요이 초안이 속한 스레드 ID.
반환값Updated draft object.
어노테이션idempotentHint
tools/call params 예시
{
  "name": "update_draft",
  "arguments": {
    "draft_id": "dr_123",
    "from": "hello@example.com",
    "to": [
      "owner@example.com"
    ],
    "subject": "Invoice (updated)",
    "text": "Attached."
  }
}
파괴적 작업delete_draft
DELETE /drafts/:draft_id

초안 폐기

DESTRUCTIVE(파괴적 작업): 초안을 폐기하고 저장된 첨부 파일을 영구 삭제합니다.

매개변수타입필수설명
draft_idstring예초안 ID(dr_로 시작). 목록 또는 생성 도구가 반환한 값. (최대 128자)
반환값{ok: true}.
어노테이션destructiveHint idempotentHint
tools/call params 예시
{
  "name": "delete_draft",
  "arguments": {
    "draft_id": "dr_123"
  }
}
상태 변경upload_attachment
POST /drafts/:draft_id/attachments

초안에 첨부 파일 업로드

초안에 파일 하나를 업로드합니다(메시지당 최대 10개 파일, 총 10 MB). content_base64 또는 로컬 file_path를 지정하세요. 첨부 파일은 발송 시점에 유료 요금제가 필요합니다.

다음 중 하나 이상을 지정하세요: content_base64, file_path.

매개변수타입필수설명
draft_idstring예초안 ID(dr_로 시작). 목록 또는 생성 도구가 반환한 값. (최대 128자)
filenamestring아니요수신자에게 표시되는 파일 이름. 기본값은 file_path의 basename입니다. (최대 255자)
content_typestring아니요MIME 타입. 예: application/pdf. 기본값은 application/octet-stream입니다.
content_base64string아니요표준 base64 파일 내용.
file_pathstring아니요MCP 서버 프로세스가 읽을 수 있는 로컬 파일의 절대 경로.
반환값{id: att_…, filename, contentType, sizeBytes, available}.
tools/call params 예시
{
  "name": "upload_attachment",
  "arguments": {
    "draft_id": "dr_123",
    "filename": "invoice.pdf",
    "content_type": "application/pdf",
    "file_path": "/tmp/invoice.pdf"
  }
}
읽기 전용download_attachment
GET /attachments/:attachment_id

첨부 파일 다운로드

비공개 첨부 파일(발신, 수신 또는 초안)을 다운로드합니다. base64 내용을 반환하거나, save_to_path가 설정되면 파일로 씁니다(overwrite가 true가 아니면 덮어쓰기를 거부).

매개변수타입필수설명
attachment_idstring예첨부 파일 ID(att_로 시작). 목록 또는 생성 도구가 반환한 값. (최대 128자)
save_to_pathstring아니요base64를 반환하는 대신 파일을 쓸 로컬 절대 경로(선택 사항).
overwriteboolean아니요save_to_path에 있는 기존 파일을 교체하도록 허용합니다. 기본값은 false입니다.
반환값{attachment_id, filename, content_type, size_bytes, content_base64} or {attachment_id, filename, content_type, size_bytes, saved_to}.
어노테이션readOnlyHint idempotentHint
tools/call params 예시
{
  "name": "download_attachment",
  "arguments": {
    "attachment_id": "att_123",
    "save_to_path": "/tmp/invoice.pdf"
  }
}
파괴적 작업delete_attachment
DELETE /attachments/:attachment_id

첨부 파일 삭제

DESTRUCTIVE(파괴적 작업): 저장된 첨부 파일을 영구 삭제합니다(예: 발송 전에 초안에서 파일 제거).

매개변수타입필수설명
attachment_idstring예첨부 파일 ID(att_로 시작). 목록 또는 생성 도구가 반환한 값. (최대 128자)
반환값{ok: true}.
어노테이션destructiveHint idempotentHint
tools/call params 예시
{
  "name": "delete_attachment",
  "arguments": {
    "attachment_id": "att_123"
  }
}

호스팅 템플릿

읽기 전용list_templates
GET /templates

호스팅 템플릿 목록 조회

게시 상태와 사용 현황이 포함된 호스팅 이메일 템플릿을 나열합니다. 페이지네이션: 결과에 pagination {offset, limit, returned, total?, has_more, next_offset}이 포함됩니다.

매개변수타입필수설명
lifecyclestring아니요active(기본값), archived, all. (다음 중 하나: active, archived, all)
querystring아니요이름 또는 키로 검색. (최대 120자)
limitinteger아니요페이지 크기. 기본값은 50입니다. (기본값 50; 1–200)
offsetinteger아니요건너뛸 레코드 수. 이전 페이지의 pagination.next_offset을 사용하세요. (기본값 0; 0–…)
반환값{data: [templates], count, pagination}.
어노테이션readOnlyHint idempotentHint
tools/call params 예시
{
  "name": "list_templates",
  "arguments": {
    "lifecycle": "active"
  }
}
상태 변경create_template
POST /templates

호스팅 템플릿 생성

편집 가능한 초안이 있는 템플릿을 생성하며, 선택적으로 스타터(welcome, reset, receipt, blank)에서 시작할 수 있습니다. 키로 발송하기 전에 게시하세요.

매개변수타입필수설명
namestring예사람이 읽는 이름. (최대 120자)
keystring아니요고정된 발송 키: 소문자, 숫자, 하이픈이며 영문자로 시작합니다(2–64자). 생략하면 이름에서 만들어집니다.
starterstring아니요스타터 콘텐츠. (다음 중 하나: blank, welcome, reset, receipt)
반환값{template, draft, activeVersion, versions, usage}.
tools/call params 예시
{
  "name": "create_template",
  "arguments": {
    "name": "Account welcome",
    "key": "account-welcome",
    "starter": "welcome"
  }
}
읽기 전용get_template
GET /templates/:template_id

템플릿 조회

템플릿의 현재 초안(revision 포함), 활성 게시 릴리스, 릴리스 이력, 사용 현황을 조회합니다. ID 또는 키를 받습니다.

매개변수타입필수설명
template_idstring예템플릿 ID(tmpl_…) 또는 키. (최대 128자)
반환값{template, draft: {id, revision, subjectTemplate, htmlTemplate, textTemplate, variables, sampleData, …} | null, activeVersion, versions, usage}.
어노테이션readOnlyHint idempotentHint
tools/call params 예시
{
  "name": "get_template",
  "arguments": {
    "template_id": "account-welcome"
  }
}
상태 변경update_template_draft
PUT /templates/:template_id/draft

템플릿 초안 저장

낙관적 동시성으로 템플릿의 편집 가능한 초안을 저장합니다. get_template에서 가져온 현재 revision을 전달하세요(409는 다른 사람이 먼저 저장했다는 뜻이므로 다시 읽고 재시도). 초안 내용의 전체 교체이므로 생략한 필드는 지워집니다. 유지하려는 모든 필드를 함께 보내세요. {{variable}} 자리 표시자를 사용하세요.

매개변수타입필수설명
template_idstring예템플릿 ID 또는 키. (최대 128자)
revisioninteger예get_template에서 가져온 현재 초안 리비전. (1–…)
namestring아니요템플릿 이름. (최대 120자)
subject_templatestring아니요자리 표시자가 포함된 제목. (최대 998자)
preheader_templatestring아니요미리 보기 텍스트. (최대 240자)
html_templatestring아니요자리 표시자가 포함된 HTML 본문.
text_templatestring아니요자리 표시자가 포함된 일반 텍스트 본문.
fromstring아니요이 템플릿으로 발송할 때의 기본 발신자.
reply_tostring아니요기본 Reply-To.
variablesobject[]아니요타입이 지정된 변수 계약. 각 항목: {key(소문자/밑줄), label, type: text|number|url|boolean, required(기본값 true), fallback, description}.
variables[].keystring예
variables[].labelstring아니요
variables[].typestring아니요(다음 중 하나: text, number, url, boolean)
variables[].requiredboolean아니요
variables[].fallbackany아니요
variables[].descriptionstring아니요
sample_dataobject아니요미리 보기와 테스트에 사용하는 샘플 값.
반환값{template, draft: {revision: next}, validation: {valid, findings}}.
tools/call params 예시
{
  "name": "update_template_draft",
  "arguments": {
    "template_id": "account-welcome",
    "revision": 3,
    "name": "Account welcome",
    "subject_template": "Welcome, {{first_name}}",
    "text_template": "Hi {{first_name}}",
    "variables": [
      {
        "key": "first_name",
        "type": "text",
        "required": true
      }
    ],
    "sample_data": {
      "first_name": "Asha"
    }
  }
}
상태 변경create_template_draft
POST /templates/:template_id/draft

게시된 릴리스에서 새 초안 시작

현재 게시된 릴리스를 복사해 편집 가능한 새 초안을 생성합니다(이미 초안이 있거나 게시된 것이 없으면 409).

매개변수타입필수설명
template_idstring예템플릿 ID 또는 키. (최대 128자)
반환값{draft}.
tools/call params 예시
{
  "name": "create_template_draft",
  "arguments": {
    "template_id": "account-welcome"
  }
}
읽기 전용render_template
POST /templates/:template_id/render

템플릿 미리 보기 렌더링

초안, 게시된 릴리스 또는 특정 버전을 주어진 데이터로 렌더링해 서버의 실제 출력(subject, html, text)을 확인합니다. 발송하지 않습니다. 데이터가 변수 계약을 위반하면 findings와 함께 422를 반환합니다.

매개변수타입필수설명
template_idstring예템플릿 ID 또는 키. (최대 128자)
version_idstring아니요선택 사항인 버전 ID. 기본값은 초안이며, 없으면 게시된 릴리스입니다.
dataobject아니요변수 값. 기본값은 해당 버전의 샘플 데이터입니다.
반환값{subject, html, text, preheader, versionId, versionNumber, isDraft, findings}.
어노테이션readOnlyHint idempotentHint
tools/call params 예시
{
  "name": "render_template",
  "arguments": {
    "template_id": "account-welcome",
    "data": {
      "first_name": "Asha"
    }
  }
}
실제 이메일 발송send_template_test
POST /templates/:template_id/test

템플릿 테스트 이메일 발송

SENDS REAL EMAIL(실제 이메일이 발송됩니다). 초안(또는 지정한 버전)의 [Test] 접두사가 붙은 스냅샷을 지정한 수신자에게 발송합니다. 사용량에 포함되며, 체험판 워크스페이스는 계정 이메일 또는 SES 시뮬레이터 주소로만 보낼 수 있습니다.

매개변수타입필수설명
template_idstring예템플릿 ID 또는 키. (최대 128자)
tostring[]예테스트 수신자. (1–100개 항목)
fromstring아니요검증된 도메인의 발신자. 기본값은 템플릿의 From입니다.
version_idstring아니요선택 사항인 버전 ID.
dataobject아니요변수 값. 기본값은 샘플 데이터입니다.
반환값{id: em_…, providerMessageId, threadId, isTest: true}.
tools/call params 예시
{
  "name": "send_template_test",
  "arguments": {
    "template_id": "account-welcome",
    "to": [
      "owner@example.com"
    ]
  }
}
상태 변경publish_template
POST /templates/:template_id/publish

템플릿 릴리스 게시

현재 초안을 template.key를 사용하는 send_email이 쓰게 될 변경 불가능한 릴리스로 게시합니다. 유효성 검사 오류가 있으면 422 findings로 실패하고, 이미 프로덕션에서 사용 중인 템플릿의 라이브 변수 계약을 깨뜨리는 경우 409로 실패합니다.

매개변수타입필수설명
template_idstring예템플릿 ID 또는 키. (최대 128자)
반환값{template, published}.
tools/call params 예시
{
  "name": "publish_template",
  "arguments": {
    "template_id": "account-welcome"
  }
}
상태 변경archive_template
POST /templates/:template_id/archive

템플릿 보관 처리

이 템플릿을 사용하는 새 발송을 중단합니다(이력은 유지되며 restore_template으로 되돌릴 수 있음). 이 키로 발송하는 모든 연동은 404로 실패하기 시작합니다.

매개변수타입필수설명
template_idstring예템플릿 ID 또는 키. (최대 128자)
반환값{template}.
어노테이션idempotentHint
tools/call params 예시
{
  "name": "archive_template",
  "arguments": {
    "template_id": "account-welcome"
  }
}
상태 변경restore_template
POST /templates/:template_id/restore

보관된 템플릿 복원

보관된 템플릿을 다시 활성화합니다.

매개변수타입필수설명
template_idstring예템플릿 ID 또는 키. (최대 128자)
반환값{template}.
어노테이션idempotentHint
tools/call params 예시
{
  "name": "restore_template",
  "arguments": {
    "template_id": "account-welcome"
  }
}

도메인과 DNS

읽기 전용list_domains
GET /domains

도메인 목록 조회

집계된 setup_status(verified | checking | pending), 레코드별 DNS 상태, 수신 상태와 함께 발신 도메인을 나열합니다. 느릴 수 있습니다. 검증되지 않은 도메인은 실시간으로 다시 확인합니다. 페이지네이션: 결과에 pagination {offset, limit, returned, total?, has_more, next_offset}이 포함됩니다.

매개변수타입필수설명
limitinteger아니요페이지 크기. 기본값은 50입니다. (기본값 50; 1–200)
offsetinteger아니요건너뛸 레코드 수. 이전 페이지의 pagination.next_offset을 사용하세요. (기본값 0; 0–…)
반환값{data: [레코드가 포함된 도메인], count, pagination}.
어노테이션readOnlyHint idempotentHint
tools/call params 예시
{
  "name": "list_domains",
  "arguments": {}
}
읽기 전용get_domain
GET /domains/:domain_id

도메인 설정 세부 정보 조회

게시할 정확한 DNS 레코드(type, name, value), 공개 리졸버 두 곳에서 확인한 각 레코드의 실시간 상태, 해결 방법이 담긴 dns_issues, 수신 상태와 함께 도메인 하나를 조회합니다.

매개변수타입필수설명
domain_idstring예도메인 ID(dom_으로 시작). 목록 또는 생성 도구가 반환한 값. (최대 128자)
반환값{id, name, status, setup_status, dns_propagating, records: [{type, name, value, verified, dns_state}], dns_issues: [{code, message, …}], inbound_domain, inbound_status}.
어노테이션readOnlyHint idempotentHint
tools/call params 예시
{
  "name": "get_domain",
  "arguments": {
    "domain_id": "dom_123"
  }
}
상태 변경add_domain
POST /domains

발신 도메인 추가

발송에 사용할 직접 관리하는 도메인을 등록합니다. 소유자가 게시해야 하는 DNS 레코드(SES Easy DKIM CNAME)를 반환합니다. DNS 자체는 변경하지 않습니다. 요금제의 도메인 한도에 포함됩니다.

매개변수타입필수설명
namestring예example.com 또는 mail.example.com 같은 순수 도메인 이름. (최대 253자)
default_fromstring아니요이 도메인의 기본 발신 주소(선택 사항).
반환값{id: dom_…, name, status: pending, records: [...], ses: {configured}}.
tools/call params 예시
{
  "name": "add_domain",
  "arguments": {
    "name": "example.com"
  }
}
상태 변경verify_domain
POST /domains/:domain_id/verify

도메인 검증

실시간 SES/DNS 검증 확인을 지금 실행합니다. 반복해도 안전하며, DNS 변경 후에는 30~60초마다 폴링하세요(전파에는 몇 분에서 몇 시간이 걸릴 수 있음). 상태가 verified가 되면 발송할 수 있습니다.

매개변수타입필수설명
domain_idstring예도메인 ID(dom_으로 시작). 목록 또는 생성 도구가 반환한 값. (최대 128자)
반환값{domain, checks: {ses, dkim, dkim_status}, status: verified|pending}.
어노테이션idempotentHint
tools/call params 예시
{
  "name": "verify_domain",
  "arguments": {
    "domain_id": "dom_123"
  }
}
파괴적 작업delete_domain
DELETE /domains/:domain_id

도메인 삭제

DESTRUCTIVE(파괴적 작업): 수신 라우트를 포함해 도메인을 워크스페이스에서 제거합니다. 이후 이 도메인에서의 발송은 즉시 실패합니다. DNS 제공업체에 있는 DNS 레코드는 삭제하지 않습니다.

매개변수타입필수설명
domain_idstring예도메인 ID(dom_으로 시작). 목록 또는 생성 도구가 반환한 값. (최대 128자)
반환값{ok: true}.
어노테이션destructiveHint idempotentHint
tools/call params 예시
{
  "name": "delete_domain",
  "arguments": {
    "domain_id": "dom_123"
  }
}
읽기 전용get_dns_provider
GET /dns/provider

DNS 제공업체와 레코드 호스트 감지

도메인의 권한 있는 DNS 제공업체를 감지하고, 각 레코드에 대해 해당 제공업체에 입력할 상대 호스트, 권장 DMARC 레코드, 수신 MX 안내, 원클릭 설정(Domain Connect) 사용 가능 여부를 반환합니다.

매개변수타입필수설명
domain_idstring예도메인 ID(dom_으로 시작). 목록 또는 생성 도구가 반환한 값. (최대 128자)
반환값{detectionStatus, detected, zone, nameservers, recordHosts: {recordId: host}, inbound, recommendations, authentication, providers: {domainConnect: {available, providerName}}}.
어노테이션readOnlyHint idempotentHint
tools/call params 예시
{
  "name": "get_dns_provider",
  "arguments": {
    "domain_id": "dom_123"
  }
}

수신 이메일

상태 변경setup_inbound
POST /domains/:domain_id/inbound/setup

도메인의 수신 활성화

검증된 도메인에 SES 수신을 프로비저닝합니다. 충돌하는 MX가 없으면 루트 도메인을 사용하고, 그렇지 않으면 inbound.<domain>을 사용합니다. 소유자가 게시해야 하는 MX 레코드를 반환하며 DNS를 편집하지는 않습니다.

매개변수타입필수설명
domain_idstring예도메인 ID(dom_으로 시작). 목록 또는 생성 도구가 반환한 값. (최대 128자)
반환값{domain: 수신 도메인, status: dns_pending|ready, record: {type: MX, name, value}}.
어노테이션idempotentHint
tools/call params 예시
{
  "name": "setup_inbound",
  "arguments": {
    "domain_id": "dom_123"
  }
}
상태 변경verify_inbound
POST /domains/:domain_id/inbound/verify

수신 MX 검증

수신 MX 레코드를 다시 확인합니다. 공개 리졸버 두 곳 모두에서 레코드가 보이면 상태가 ready가 됩니다.

매개변수타입필수설명
domain_idstring예도메인 ID(dom_으로 시작). 목록 또는 생성 도구가 반환한 값. (최대 128자)
반환값{domain, status: ready|dns_pending|propagating|checking, record}.
어노테이션idempotentHint
tools/call params 예시
{
  "name": "verify_inbound",
  "arguments": {
    "domain_id": "dom_123"
  }
}
읽기 전용list_inboxes
GET /inboxes

수신 주소 목록 조회

수신 주소를 나열하며, 도메인 하나로 한정할 수도 있습니다. 페이지네이션: 결과에 pagination {offset, limit, returned, total?, has_more, next_offset}이 포함됩니다.

매개변수타입필수설명
domain_idstring아니요선택 사항인 도메인 ID 필터.
limitinteger아니요페이지 크기. 기본값은 50입니다. (기본값 50; 1–200)
offsetinteger아니요건너뛸 레코드 수. 이전 페이지의 pagination.next_offset을 사용하세요. (기본값 0; 0–…)
반환값{data: [{id, address, name, status, domainId}], count, pagination}.
어노테이션readOnlyHint idempotentHint
tools/call params 예시
{
  "name": "list_inboxes",
  "arguments": {
    "domain_id": "dom_123"
  }
}
읽기 전용get_inbox
GET /inboxes/:inbox_id

수신함 조회

수신 주소 하나를 조회합니다.

매개변수타입필수설명
inbox_idstring예수신함 ID(inb_로 시작). 목록 또는 생성 도구가 반환한 값. (최대 128자)
반환값수신함 객체.
어노테이션readOnlyHint idempotentHint
tools/call params 예시
{
  "name": "get_inbox",
  "arguments": {
    "inbox_id": "inb_123"
  }
}
상태 변경create_inbox
POST /inboxes

수신 주소 생성

수신 상태가 ready인 도메인에 support@<receiving domain> 같은 주소를 생성합니다(먼저 setup_inbound와 verify_inbound를 실행하세요). 수신한 메일은 direction in으로 list_emails에 나타납니다.

매개변수타입필수설명
domain_idstring예도메인 ID(dom_으로 시작). 목록 또는 생성 도구가 반환한 값. (최대 128자)
local_partstring예@ 앞부분. 예: support. (최대 64자)
namestring아니요선택 사항인 표시 이름.
반환값{id: inb_…, address, name, status: active}.
tools/call params 예시
{
  "name": "create_inbox",
  "arguments": {
    "domain_id": "dom_123",
    "local_part": "support",
    "name": "Support"
  }
}
상태 변경update_inbox
PATCH /inboxes/:inbox_id

수신함 이름 변경, 활성화 또는 비활성화

수신함 이름을 바꾸거나 상태를 active / disabled로 설정합니다.

매개변수타입필수설명
inbox_idstring예수신함 ID(inb_로 시작). 목록 또는 생성 도구가 반환한 값. (최대 128자)
namestring아니요새 표시 이름.
statusstring아니요새 상태. (다음 중 하나: active, disabled)
반환값업데이트된 수신함.
어노테이션idempotentHint
tools/call params 예시
{
  "name": "update_inbox",
  "arguments": {
    "inbox_id": "inb_123",
    "status": "disabled"
  }
}
실제 이메일 발송set_inbox_forwarding
PUT /inboxes/:inbox_id/forwarding

수신함을 다른 주소로 전달

SENDS REAL EMAIL(실제 이메일이 발송됩니다) - 계정 소유자가 아닌 다른 사람에게 전달하도록 설정하는 경우: 수신함이 받은 메일을 전달할 곳을 설정합니다. 소유자 본인의 주소는 즉시 활성화되고, 그 밖의 주소에는 확인 이메일이 발송되며 그곳에서 누군가 확인할 때까지 전달 상태는 pending으로 유지됩니다. 전달을 끄려면 forward_to: null을 전달하세요. 전달된 사본은 수신함 주소에서 발송되며 원래 발신자가 Reply-To로 지정됩니다.

매개변수타입필수설명
inbox_idstring예수신함 ID(inb_로 시작). 목록 또는 생성 도구가 반환한 값. (최대 128자)
forward_tostring,null예전달 대상 이메일 주소. 전달을 끄려면 null. (최대 254자)
반환값forwardTo와 forwardStatus(off, pending, active)가 포함된 수신함.
어노테이션idempotentHint
tools/call params 예시
{
  "name": "set_inbox_forwarding",
  "arguments": {
    "inbox_id": "inb_123",
    "forward_to": "team@example.net"
  }
}
파괴적 작업delete_inbox
DELETE /inboxes/:inbox_id

수신함 삭제

DESTRUCTIVE(파괴적 작업): 수신 주소를 삭제합니다. 이미 받은 메일은 보관되며, 이 주소로 오는 새 메일은 더 이상 그 수신함으로 분류되지 않습니다.

매개변수타입필수설명
inbox_idstring예수신함 ID(inb_로 시작). 목록 또는 생성 도구가 반환한 값. (최대 128자)
반환값{ok: true}.
어노테이션destructiveHint idempotentHint
tools/call params 예시
{
  "name": "delete_inbox",
  "arguments": {
    "inbox_id": "inb_123"
  }
}

전달성, 반송, 발송 제외

읽기 전용deliverability_stats
GET /deliverability/stats

최근 30일 전송 통계 조회

워크스페이스 전체의 최근 30일 합계: sent, delivery, bounce, complaint, reject, open, click, deliveryRate(%).

매개변수 없음.

반환값{window: 30d, sent, delivery, bounce, complaint, reject, open, click, deliveryRate}.
어노테이션readOnlyHint idempotentHint
tools/call params 예시
{
  "name": "deliverability_stats",
  "arguments": {}
}
읽기 전용list_sender_reputation
GET /deliverability/reputation

발신자 평판 목록 조회

정확한 From 주소별 평판 상태: active, throttled(일일 한도 하향), paused(발송 시 423 반환), 그리고 사유와 일일 한도. 발송이 423 또는 429로 실패할 때 확인하세요. 페이지네이션: 결과에 pagination {offset, limit, returned, total?, has_more, next_offset}이 포함됩니다.

매개변수타입필수설명
limitinteger아니요페이지 크기. 기본값은 50입니다. (기본값 50; 1–200)
offsetinteger아니요건너뛸 레코드 수. 이전 페이지의 pagination.next_offset을 사용하세요. (기본값 0; 0–…)
반환값{data: [{sender, status, dailyLimit, reason, cleanSince, warnedAt, pausedAt, evaluatedAt}], count, pagination}.
어노테이션readOnlyHint idempotentHint
tools/call params 예시
{
  "name": "list_sender_reputation",
  "arguments": {}
}
읽기 전용list_suppressions
GET /suppressions

발송 제외 목록 조회

워크스페이스 발송 제외 목록: 영구 반송 또는 스팸 신고 이후 차단된 수신자. 이들에게 보내는 발송은 422로 실패합니다. 페이지네이션: 결과에 pagination {offset, limit, returned, total?, has_more, next_offset}이 포함됩니다.

매개변수타입필수설명
limitinteger아니요페이지 크기. 기본값은 50입니다. (기본값 50; 1–200)
offsetinteger아니요건너뛸 레코드 수. 이전 페이지의 pagination.next_offset을 사용하세요. (기본값 0; 0–…)
반환값{data: [{email, reason, detail, created_at}], count, pagination}.
어노테이션readOnlyHint idempotentHint
tools/call params 예시
{
  "name": "list_suppressions",
  "arguments": {}
}
파괴적 작업remove_suppression
DELETE /suppressions/:email

반송 발송 제외 삭제

DESTRUCTIVE(파괴적 작업, 안전 차단을 약화시킴): 해당 주소로 다시 메일을 보낼 수 있도록 반송 발송 제외를 삭제합니다. 사람이 그 주소가 이제 유효하다고 확인한 경우에만 수행하세요. 스팸 신고로 인한 발송 제외는 삭제할 수 없습니다(409).

매개변수타입필수설명
emailstring예발송 제외된 수신자 주소. (최대 320자)
반환값{ok: true}.
어노테이션destructiveHint idempotentHint
tools/call params 예시
{
  "name": "remove_suppression",
  "arguments": {
    "email": "fixed-mailbox@example.net"
  }
}
읽기 전용list_blocked_recipients
GET /blocked-recipients

차단된 수신자 목록 조회

SendHQ가 거부하는 모든 수신자: 반송, 스팸 신고, 도메인 단위 마케팅 수신 거부이며 유형별 요약이 포함됩니다. 최신 500건까지 읽습니다. 페이지네이션: 결과에 pagination {offset, limit, returned, total?, has_more, next_offset}이 포함됩니다.

매개변수타입필수설명
limitinteger아니요페이지 크기. 기본값은 50입니다. (기본값 50; 1–200)
offsetinteger아니요건너뛸 레코드 수. 이전 페이지의 pagination.next_offset을 사용하세요. (기본값 0; 0–…)
반환값{data: [{email, domain, kind: bounce|complaint|unsubscribe, reason, detail, source, status, created_at}], count, summary: {total, bounce, complaint, unsubscribe}, pagination}.
어노테이션readOnlyHint idempotentHint
tools/call params 예시
{
  "name": "list_blocked_recipients",
  "arguments": {}
}

계정, 사용량, 분석, 키

읽기 전용get_account
GET /account

계정, 사용량, 결제 정보 조회

계정 소유자 이메일, 요금제/액세스 등급, 현재 기간의 수신자 전달 수(사용량 대비 할당량), 도메인 사용량 대비 한도, 첨부 파일 전송량, 평판 요약, 구독 상태, 공개된 요금제, 워크스페이스 수. 남은 할당량이나 체험판이 전달할 수 있는 대상(계정 이메일)을 확인할 때 사용하세요.

매개변수 없음.

반환값{user: {email, …}, usage: {domainsUsed, domainLimit, recipientDeliveries, emailQuotaMonth, attachmentBytes, attachmentByteLimit, periodKey}, access: {tier, planCode}, reputation, infrastructure, billing: {status, subscriptions, …}, plans, workspace: {mailer, stats}}.
어노테이션readOnlyHint idempotentHint
tools/call params 예시
{
  "name": "get_account",
  "arguments": {}
}
읽기 전용get_analytics
GET /analytics

발송 분석 조회

최근 7일, 30일 또는 90일의 대시보드 분석: 발송/수신/전달/반송/차단/열람/클릭/스팸 신고 합계, 일별 타임라인, 상위 발신 도메인, 상위 제목.

매개변수타입필수설명
daysinteger아니요일 단위 기간: 7, 30(기본값) 또는 90. (다음 중 하나: 7, 30, 90)
반환값{window, days, metrics, timeline: [{day, sent, received}], domains, topContent}.
어노테이션readOnlyHint idempotentHint
tools/call params 예시
{
  "name": "get_analytics",
  "arguments": {
    "days": 30
  }
}
읽기 전용list_api_keys
GET /keys

API 키 메타데이터 목록 조회

API 키 이름, 비밀이 아닌 접두사, 마지막 사용 시각을 나열합니다. 읽기 전용입니다. 이 MCP 서버는 키를 만들거나 교체하거나 폐기할 수 없으며, 이는 사람이 대시보드에서 수행합니다. 페이지네이션: 결과에 pagination {offset, limit, returned, total?, has_more, next_offset}이 포함됩니다.

매개변수타입필수설명
limitinteger아니요페이지 크기. 기본값은 50입니다. (기본값 50; 1–200)
offsetinteger아니요건너뛸 레코드 수. 이전 페이지의 pagination.next_offset을 사용하세요. (기본값 0; 0–…)
반환값{data: [{id, name, prefix, lastUsedAt, createdAt}], count, pagination}.
어노테이션readOnlyHint idempotentHint
tools/call params 예시
{
  "name": "list_api_keys",
  "arguments": {}
}
읽기 전용get_service_health
GET /health

SendHQ 서비스 상태 확인

SendHQ API가 작동 중인지, 어떤 메일 제공업체가 활성화되어 있는지 확인합니다. 유효한 API 키가 필요하지 않습니다.

매개변수 없음.

반환값{ok, service, mailer}.
어노테이션readOnlyHint idempotentHint
tools/call params 예시
{
  "name": "get_service_health",
  "arguments": {}
}

API 지원 범위 목록

공개 API의 모든 작업과 이를 지원하는 도구입니다. 대시보드에서 사용자가 할 수 있고 API가 있는 모든 작업은 지원됩니다. 아래의 제외 항목은 의도적인 것입니다.

엔드포인트도구비고
POST /emailssend_email이메일 한 통 발송
POST /emails/batchsend_batch개별화된 메시지를 최대 100건까지 발송
GET /emailslist_emails발신 및 수신 이메일 목록 조회
GET /emails/:idget_email이메일과 첨부 파일 조회
PATCH /emails/:idmark_email읽음, 보관, 스팸, 카테고리, 중요도 업데이트
POST /emails/:id/labelslabel_email이메일에 라벨 추가 또는 제거
DELETE /emails/:iddelete_email보관 중인 이메일 삭제
GET /emails/:id/eventslist_email_events이메일의 전송 이벤트 목록 조회
GET /threads/:idget_thread대화를 시간순으로 조회
GET /labelslist_labels메시지 수와 분류 규칙이 포함된 라벨 목록 조회
POST /labelscreate_label라벨 생성(자동 분류 규칙 선택 지정 가능)
GET /labels/:idget_labelID 또는 이름으로 라벨 조회
PATCH /labels/:idupdate_label라벨 이름 변경, 색상 변경 또는 버킷으로 전환
DELETE /labels/:iddelete_label이메일은 삭제하지 않고 라벨만 삭제
POST /labels/:id/rulescreate_label_rule라벨에 자동 분류 규칙 추가
DELETE /labels/:id/rules/:rule_iddelete_label_rule자동 분류 규칙 삭제
POST /draftscreate_draft작성 화면 초안 생성
GET /draftslist_drafts작성 화면 초안 목록 조회
GET /drafts/:idget_draft초안과 첨부 파일 조회
PUT /drafts/:idupdate_draft초안 내용 교체
DELETE /drafts/:iddelete_draft초안 폐기
POST /drafts/:id/attachmentsupload_attachment초안에 첨부 파일 업로드
GET /attachments/:iddownload_attachment비공개 첨부 파일 다운로드
DELETE /attachments/:iddelete_attachment비공개 첨부 파일 삭제
GET /sending-identitieslist_sending_identities검증된 발신 ID 목록 조회
GET /templateslist_templates호스팅 템플릿 목록 조회
POST /templatescreate_template호스팅 템플릿 생성
GET /templates/:idget_template초안, 릴리스, 사용 현황 조회
PUT /templates/:id/draftupdate_template_draft템플릿 초안 자동 저장
POST /templates/:id/draftcreate_template_draft게시된 릴리스에서 새 초안 생성
POST /templates/:id/renderrender_template서버가 실제로 출력하는 결과 렌더링
POST /templates/:id/testsend_template_test테스트 스냅샷 발송
POST /templates/:id/publishpublish_template변경 불가능한 템플릿 릴리스 게시
POST /templates/:id/archivearchive_template템플릿 보관 처리
POST /templates/:id/restorerestore_template보관된 템플릿 복원
POST /domainsadd_domain발신 도메인 추가
GET /domainslist_domains도메인과 캐시된 DNS 상태 조회
GET /domains/:idget_domain도메인 설정 세부 정보 조회
POST /domains/:id/verifyverify_domainSES 및 DNS 검증 새로 고침
POST /domains/:id/inbound/setupsetup_inboundSES 수신 프로비저닝
POST /domains/:id/inbound/verifyverify_inbound수신 MX 라우팅 검증
DELETE /domains/:iddelete_domain도메인 삭제
GET /dns/providerget_dns_provider권한 있는 DNS 제공업체와 상대 레코드 호스트 감지
GET /dns/domain-connect/connectget_domain_connect_link원클릭 DNS 설정을 위한 Domain Connect 동의 링크 생성
POST /inboxescreate_inbox수신 주소 생성
GET /inboxeslist_inboxes수신 주소 목록 조회
GET /inboxes/:idget_inbox수신 주소 조회
PATCH /inboxes/:idupdate_inbox수신함 이름 변경, 활성화 또는 비활성화
PUT /inboxes/:id/forwardingset_inbox_forwarding수신함이 받은 메일을 다른 주소로 전달
DELETE /inboxes/:iddelete_inbox메시지는 보관한 채 수신함 삭제
GET /deliverability/statsdeliverability_stats최근 30일 전송 통계 조회
GET /deliverability/reputationlist_sender_reputation정확한 발신 ID별 평판 상태 조회
GET /suppressionslist_suppressions워크스페이스의 발송 제외 목록 조회
DELETE /suppressions/:emailremove_suppression해제 가능한 반송 발송 제외 항목 삭제
GET /blocked-recipientslist_blocked_recipients반송, 스팸 신고, 수신 거부 목록 조회
GET /accountget_accountAPI 키로 계정, 사용량, 결제 상태, 워크스페이스 수 조회
GET /analyticsget_analytics7일, 30일 또는 90일 기간의 대시보드 발송 분석 조회
GET /profileget_accountGET /account의 세션 전용 대응 항목입니다. MCP 서버는 API 키 경로를 읽습니다.
POST /billing/checkout노출되지 않음결제 변경은 설계상 세션 전용이며 대시보드에서 계정 소유자가 직접 수행해야 합니다. 결제 상태는 get_account로 읽을 수 있습니다.
POST /billing/cancel노출되지 않음결제 변경은 설계상 세션 전용이며 대시보드에서 계정 소유자가 직접 수행해야 합니다. 결제 상태는 get_account로 읽을 수 있습니다.
POST /keys노출되지 않음의도적으로 제외됨: 에이전트가 자격 증명을 발급하거나 파기해서는 안 됩니다. 키는 사람이 대시보드에서 관리합니다.
GET /keyslist_api_keysAPI 키 메타데이터 목록 조회
DELETE /keys/:id노출되지 않음의도적으로 제외됨: 에이전트가 자격 증명을 발급하거나 파기해서는 안 됩니다. 키는 사람이 대시보드에서 관리합니다.

의도적으로 제공하지 않는 기능

기능엔드포인트사유
API 키 생성, 교체, 폐기 또는 삭제POST /keys, DELETE /keys/:id의도적으로 제외됨: 에이전트가 자격 증명을 발급하거나 파기해서는 안 됩니다. 키는 사람이 대시보드에서 관리합니다.
결제 시작 또는 구독 취소POST /billing/checkout, POST /billing/cancel결제 변경은 설계상 세션 전용이며 대시보드에서 계정 소유자가 직접 수행해야 합니다. 결제 상태는 get_account로 읽을 수 있습니다.
Cloudflare 원클릭 DNS(OAuth)GET /api/dns/cloudflare/connect대화형 브라우저 세션과 Cloudflare OAuth 동의가 필요합니다. 대신 get_domain 레코드, get_dns_provider 호스트 또는 get_domain_connect_link를 사용하세요.
가입, 로그인, 로그아웃, Google 계정 연결/api/auth/*사람의 브라우저 인증입니다. MCP 서버는 API 키로 인증합니다.
지원 문의 양식POST /api/contact사람을 위한 공개 마케팅 사이트 양식이며 워크스페이스 작업이 아닙니다.

기계가 읽을 수 있는 카탈로그: /docs/mcp/tools.json(스키마, 어노테이션, 엔드포인트 매핑, 제외 항목). 이 페이지의 Markdown 버전: /docs/mcp.md. CLI가 설치되어 있으면 sendhq commands --format json이 같은 카탈로그를 출력합니다.