Skip to main content
Glama
luleigreat

issue-collector

by luleigreat

send_issue_email MCP

Отправляет контактный email и описание проблемы, оставленные пользователем при переводе на оператора, через SMTP на фиксированный служебный почтовый ящик.

Агент видит только один инструмент: send_issue_email(email, question).

Какие три почтовых ящика здесь участвуют

Роль

Источник

Назначение

Отправитель From

SENDER_EMAIL / SMTP_USERNAME из .env

Аккаунт, который реально отправляет письмо через SMTP

Получатель To

TARGET_EMAIL из .env

Ваш фиксированный служебный ящик для приёма проблем

Почта пользователя

Параметр инструмента email

Записывается в тему и тело письма, а также задаётся как Reply-To, чтобы оператор мог ответить пользователю напрямую

.env — это инфраструктура, настраивается один раз. email / question меняются в каждом диалоге и передаются агентом из переменных диалога (например, $邮箱, $问题).

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

У корпоративных / учебных аккаунтов Google администратор может отключить SMTP — в таком случае подключиться не получится.

MCP-транспорт (удалённый клиент)

智齿 отправляет POST / на корневой путь указанного вами URL, поэтому для удалённого режима по умолчанию используется следующее:

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

Переменная

Описание

MCP_TRANSPORT

streamable-http: удалённый режим (智齿); stdio: локальный агент запускает процесс; 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

При успехе будет выведено: 成功:问题已发送至服务邮箱 ...

Первый аргумент скрипта — это имитируемый контактный email пользователя, а не отправитель. Рекомендуется заменить его на свой реальный адрес для теста, чтобы письмо с 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>/

Например, в локальной сети: http://192.168.x.x:8765/

Если 智齿 — облачный SaaS, до внутреннего IP он не достучится. Потребуется публичный IP, домен или туннель; URL также указывается с корневым путём, без суффиксов.

После сохранения переподключитесь. В логах сервиса должно быть POST / HTTP/1.1" 200, а не 404.

Локальная самопроверка

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"}}}'

При нормальной работе возвращается JSON с "jsonrpc":"2.0" и "serverInfo":{"name":"issue-collector"...}.

Запуск MCP (локальный stdio)

После установки MCP_TRANSPORT=stdio в .env локальный клиент (например, 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: контактный email пользователя

  • question: проблема/запрос

  • Возвращает строку, начинающуюся с 成功: или 错误:, по которой агент выбирает ветку

Тема письма: [问题收集] 来自用户 {email} ({时间})
В теле — email пользователя, время отправки и описание проблемы; Reply-To — email пользователя.

После успешного send_message результат MCP возвращается сразу, а QUIT/закрытие соединения SMTP выполняется в фоновом потоке, чтобы закрытие 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

Использован пароль от аккаунта или не включена двухэтапная проверка

Используйте пароль приложения

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