Skip to main content
Glama
luleigreat

issue-collector

by luleigreat

send_issue_email MCP

사용자가 상담원 연결(수동 전환) 시 남긴 연락 이메일과 문제 설명을 SMTP를 통해 고정 서비스 메일함으로 발송합니다.

Agent는 send_issue_email(email, question)이라는 도구 하나만 볼 수 있습니다.

세 개의 이메일은 각각 무엇인가

역할

출처

용도

발신자 From

.env의 SENDER_EMAIL / SMTP_USERNAME

SMTP에 로그인하여 실제로 발송하는 계정

수신자 To

.env의 TARGET_EMAIL

문제를 수신하는 고정 서비스 메일함

사용자 이메일

도구 파라미터 email

제목·본문에 기록하고 Reply-To로 설정하여 상담원이 사용자에게 바로 답변할 수 있도록 함

.env는 인프라로, 한 번만 배포하면 됩니다. email / question은 대화마다 다르며, Agent가 대화 변수(예: $邮箱, $问题)에서 전달합니다.

Related MCP server: MCP Sendmail Server

환경 요구 사항

  • Python 3.10+

  • 사용할 SMTP에 접근 가능해야 함(로컬에서 Gmail 직결 시 465/587 아웃바운드 필요)

설치

cd send_issue_email_mcp
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env

아래 안내에 따라 .env를 작성하되, .env를 저장소에 커밋하지 마세요.

.env 구성

필수: 수신 및 SMTP

TARGET_EMAIL=issues@example.com

SMTP_HOST=smtp.gmail.com
SMTP_PORT=465
SMTP_USERNAME=your_account@gmail.com
SMTP_PASSWORD=xxxx xxxx xxxx xxxx
SMTP_USE_SSL=true

SENDER_EMAIL=your_account@gmail.com
SENDER_NAME=问题收集机器人

변수

설명

TARGET_EMAIL

문제 수신 메일함, 필수

SMTP_HOST / SMTP_PORT

SMTP 서버

SMTP_USERNAME / SMTP_PASSWORD

로그인 자격 증명. Gmail은 앱 전용 비밀번호를 사용해야 하며, 로그인 비밀번호가 아님

SMTP_USE_SSL

true = SSL(465), false = STARTTLS(587)

SENDER_EMAIL

발신자, 기본값은 SMTP_USERNAME과 동일

SENDER_NAME

발신자 표시 이름

Gmail의 두 가지 동등한 조합:

방식

SMTP_PORT

SMTP_USE_SSL

SSL(권장)

465

true

STARTTLS

587

false

Workspace / 학교 Google 계정은 관리자가 SMTP를 차단했을 수 있으며, 그 경우 연동할 수 없습니다.

MCP 전송(원격 클라이언트)

지취(智齿)는 사용자가 입력한 URL 루트 경로에 POST /를 보내므로, 원격 기본값은 다음과 같습니다:

MCP_TRANSPORT=streamable-http
MCP_HOST=0.0.0.0
MCP_PORT=8765
MCP_PATH=/

변수

설명

MCP_TRANSPORT

streamable-http: 원격(지취), stdio: 로컬 Agent가 프로세스 실행, sse: 구버전 GET /sse(지취는 현재 이 방식이 아님)

MCP_HOST

수신 주소, 원격은 0.0.0.0 입력

MCP_PORT

수신 포트. 로컬 8000은 다른 프로젝트가 자주 사용하므로 8765 사용 가능

MCP_PATH

HTTP 엔드포인트 경로. 지취는 반드시 /여야 함

.env를 수정한 후, 터미널에 이미 동일한 이름의 변수가 export되어 있다면 load_dotenv()는 덮어쓰지 않습니다. 새 터미널을 열거나, 먼저 unset MCP_TRANSPORT TARGET_EMAIL을 실행한 후 시작하세요.

먼저 발신 검증(MCP 시작 없이)

source .venv/bin/activate
python test_email.py

성공 시 출력: 成功:问题已发送至服务邮箱 ...

스크립트의 첫 번째 인자는 시뮬레이션용 사용자 연락 이메일이며, 발신자가 아닙니다. example.com이 수신 측에서 스팸함으로 차단되지 않도록, 테스트 시 자신의 실제 이메일로 변경하는 것을 권장합니다.

SMTP 성공은 우체국이 메일을 수신했음을 의미할 뿐입니다. 대상이 기업 Feishu 등 메일함인 경우, 발신함의 '보낸 메일', 반송 여부, 상대방 스팸함/격리함을 추가로 확인하세요.

MCP 시작(지취 / 원격)

source .venv/bin/activate
python server.py

로그에 다음과 유사한 내용이 나타나야 합니다:

transport 'streamable-http' (stateless) on http://0.0.0.0:8765/

두 개를 동시에 실행하지 마세요. 그렇지 않으면 address already in use가 발생합니다. 재시작이 필요하면 이전 프로세스를 먼저 중지한 후 시작하세요.

지취에 입력하는 URL

전송 유형은 Streamable HTTP / HTTP를 선택하세요(SSE 선택 금지).

URL에 /sse나 /mcp를 붙이지 말고, 이 머신에 도달할 수 있는 루트 주소를 입력하세요:

http://<这台机器的可达地址>:<MCP_PORT>/

예: LAN: http://192.168.x.x:8765/

지취가 클라우드 SaaS라면 내부 IP에 접근할 수 없습니다. 공인 IP, 도메인 또는 터널이 필요하며, URL 역시 루트 경로로 하고 접미사를 붙이지 마세요.

저장 후 다시 연결하세요. 서비스 로그는 404가 아닌 POST / HTTP/1.1" 200이어야 합니다.

로컬 자체 점검

curl -sS -X POST http://127.0.0.1:8765/ \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"check","version":"0.0.1"}}}'

정상이면 "jsonrpc":"2.0"과 "serverInfo":{"name":"issue-collector"...}가 포함된 JSON이 반환됩니다.

MCP 시작(로컬 stdio)

.env에서 MCP_TRANSPORT=stdio로 설정한 후, Cursor 등 로컬 클라이언트가 명령으로 실행합니다. 예:

{
  "mcpServers": {
    "issue-collector": {
      "command": "/绝对路径/send_issue_email_mcp/.venv/bin/python",
      "args": ["/绝对路径/send_issue_email_mcp/server.py"]
    }
  }
}

stdio 모드에서는 일반 로그를 stdout으로 출력하지 마세요.

도구 규약

send_issue_email(email: str, question: str) -> str

  • email: 사용자 연락 이메일

  • question: 문제/요청 사항

  • 成功: 또는 错误:로 시작하는 문자열을 반환하며, Agent가 분기 처리에 사용

메일 제목: [问题收集] 来自用户 {email} ({时间})
본문에는 사용자 이메일, 제출 시간, 문제 설명이 포함되며, Reply-To는 사용자 이메일로 설정됩니다.

send_message 성공 후 즉시 MCP 결과를 반환하고, SMTP QUIT/연결 종료는 백그라운드 스레드에서 수행하여 SSL 종료로 인해 지취 타임아웃이 지연되지 않도록 합니다.

로그

실행 로그는 프로젝트 아래 log/에 날짜별로 하나의 파일로 기록되며, 당일 여러 번 시작하면 추가됩니다:

log/2026-08-19.log

HTTP 요청 시작/종료, 도구 호출, SMTP 연결/로그인/발송 소요 시간, 백그라운드 종료 결과가 포함됩니다. SMTP 비밀번호는 포함되지 않습니다.

문제 해결

현상

원인

처리

지취 '서비스 응답 형식 이상'; 로그 POST / 404

클라이언트가 루트 경로에 POST를 보내는데 서비스가 /sse에 있거나 해당 전송이 시작되지 않음

MCP_TRANSPORT=streamable-http, MCP_PATH=/, URL에 /sse를 붙이지 않음

[Errno 48] address already in use

포트가 이전 MCP 인스턴스에 점유됨

이전 프로세스를 중지한 후 시작, 두 개를 동시에 실행하지 않음

로그 POST /sse 404

URL에 /sse가 추가로 작성됨

루트 경로 /로 변경

스크립트가 여전히 이전 TARGET_EMAIL로 발송

터미널에 이전 환경 변수가 있어 load_dotenv()가 덮어쓰지 않음

unset TARGET_EMAIL 또는 새 터미널 열기

SMTP 성공인데 수신함에 없음

스팸함/격리함에 들어갔거나 수신 계정을 잘못 확인

발신함 보낸 메일, 반송, 상대방 스팸함 확인

Gmail 535 / Password not accepted

로그인 비밀번호를 사용했거나 2단계 인증을 켜지 않음

앱 전용 비밀번호로 변경

load_dotenv()는 server.py 시작 시 한 번 실행됩니다. .env만 수정하고 프로세스를 재시작하지 않으면 실행 중인 서비스는 새 값을 읽지 못합니다.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Enables sending emails via SMTP with template management, supporting multiple SMTP configurations, template creation with variable substitution, and bulk email sending with rate limiting.
    6
    227 npm
    24
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables sending emails via SMTP with support for HTML content, attachments, bulk sending, and template-based emails. Features session management and full MCP Streamable HTTP transport compliance.
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables sending emails through SMTP using nodemailer, allowing AI assistants to send plain text and HTML emails with configurable SMTP credentials.
    25 npm
    2
    ISC