Pidgeon
официальныйПочтовые ящики для ИИ-агентов: собственные адреса, переписки, отправка писем, ответы и входящая почта.
Что можно делать с Pidgeon MCP?
- Чтение входящих — Просматривайте адреса, цепочки и сообщения или ищите текст сообщений во всех адресах, к которым у ключа есть доступ.
- Отправка и ответы — Отправляйте письма с адреса, от имени которого ключ может отправлять, отвечайте на сообщения или пересылайте их вместе с вложениями.
- Ожидание писем с подтверждением — Дождитесь получения сообщения и получите извлечённые коды подтверждения и ссылки для подтверждения.
- Подготовка черновиков на согласование — Создавайте черновики для проверки человеком, а затем проверяйте, одобрена ли отложенная отправка, отклонена или срок её действия истёк.
- Чтение вложений — Извлекайте текст из вложений в форматах CSV, log, JSON, календарных файлов, PDF,
.docxили.xlsx. - Управление календарём — Просматривайте расписание адреса, создавайте события и обновляйте их, а также принимайте или отклоняйте приглашения на встречи, полученные по почте.
Размещённый MCP-сервер
npx add-mcp 'https://pidgeon.ai/api/mcp'Устанавливается в Claude Code, Codex, Cursor и другие
Документация
Агент может напрямую работать с почтовым ящиком Pidgeon: читать письма, отвечать на них и создавать адреса. Pidgeon поддерживает Model Context Protocol через тот же API, который описан в этой документации, — это всего лишь адаптер протокола.
Подключиться можно двумя способами, но сервер один и тот же. Для размещённого сервера ничего устанавливать не нужно; пакет запускает его на вашем компьютере.
Размещённый сервер — это URL
claude mcp add --transport http pidgeon https://pidgeon.ai/api/mcp
Первый вызов возвращает 401, после чего клиент перенаправляет вас в Pidgeon для входа. Вы выбираете, что ему разрешено делать: читать, читать и отправлять или иметь полный доступ, — и к чему он может обращаться: к одному адресу или ко всем адресам, если вы владелец аккаунта. Этот выбор определяет API-ключ, а клиент получает токен для него. Ключ появится в разделе Developers → API keys → Connected apps; если нажать там Disconnect, доступ будет отозван при следующем вызове клиента.
Пользовательские коннекторы Claude, ChatGPT, Grok, Cursor, Codex и VS Code используют один и тот же URL и одинаковый способ входа. Каждый запрос обрабатывается отдельно: сервер не хранит сессии, потому что ему нечего сохранять в своём состоянии.
Если агент должен работать без человека, который мог бы войти в систему, передайте ему ключ:
claude mcp add --transport http pidgeon https://pidgeon.ai/api/mcp \
--header "Authorization: Bearer $PIDGEON_API_KEY"
Подойдёт и x-api-key. Пошаговые инструкции для Cursor, Codex (он читает TOML, а не JSON) и VS Code; Windsurf и Gemini CLI используют тот же URL и заголовок.
В Grok
В Grok откройте Connectors → Custom, вставьте https://pidgeon.ai/api/mcp и войдите на экране подтверждения; ключ не нужен (пошаговая инструкция). Muse от Meta на рассмотрении у Meta.
В Cursor
Добавьте Pidgeon в Cursor через его страницу в cursor.directory, где указаны размещённый сервер и навык.
Или добавьте сервер вручную в ~/.cursor/mcp.json (или в .cursor/mcp.json для одного проекта). Ему нужен только URL; при первом вызове Cursor предложит войти:
{
"mcpServers": {
"pidgeon": {
"url": "https://pidgeon.ai/api/mcp"
}
}
}
Если агент должен работать без человека, который мог бы войти в систему, добавьте "headers": { "Authorization": "Bearer ${env:PIDGEON_API_KEY}" } рядом с URL, и Cursor подставит значение из вашей среды.
Codex, VS Code и Gemini CLI
Для Codex, VS Code и Gemini CLI одна команда добавляет сервер в собственный файл клиента:
npx -y @pidgeon-ai/mcp init --client codex # ~/.codex/config.toml
npx -y @pidgeon-ai/mcp init --client vscode # .vscode/mcp.json
npx -y @pidgeon-ai/mcp init --client gemini # .gemini/settings.json
Если ключ не задан, команда записывает только URL, и клиент предложит войти. Если задан PIDGEON_API_KEY, команда сначала проверяет ключ, а затем настраивает клиента так, чтобы он считывал ключ из этой переменной (Codex, Gemini CLI) или запрашивал его один раз (VS Code), поэтому ключ не попадёт в файл. Команда дополняет существующее содержимое, включая комментарии, копирует изменяемый файл в <file>.bak, при повторном запуске ничего не делает и заменяет другую запись pidgeon только при наличии --force. Для выбора другого файла укажите --scope user или --scope project; --print не записывает ничего.
Или установите пакет
PIDGEON_API_KEY=pgn_live_… npx -y @pidgeon-ai/mcp init
Команда проверяет ключ через API, прежде чем что-либо записывать, и сообщает, к каким адресам он даёт доступ. На этот вопрос нельзя ответить одним блоком JSON; без такой проверки модель может незаметно получить ошибку, которую вы не увидите. Затем команда записывает .mcp.json в текущий каталог и выводит записанное содержимое. Она никогда не заменяет уже существующую запись: для этого служит --force, а --print показывает конфигурацию, ничего не записывая. Это пригодится, если клиент хранит свою конфигурацию в другом месте.
Ключ берётся из переменной среды, а не записывается в файл, поэтому конфигурацию можно добавить в репозиторий, не раскрывая учётные данные:
{
"mcpServers": {
"pidgeon": {
"command": "npx",
"args": ["-y", "@pidgeon-ai/mcp"],
"env": { "PIDGEON_API_KEY": "${PIDGEON_API_KEY}" }
}
}
}
Claude Desktop и любой другой MCP-клиент используют тот же блок. Чтобы запустить сервер напрямую — это в основном полезно, чтобы посмотреть, как он запускается:
PIDGEON_API_KEY=pgn_live_… npx -y @pidgeon-ai/mcp
PIDGEON_BASE_URL указывает на сервер, отличный от production; это нужно только в том случае, если вы запускаете Pidgeon самостоятельно.
Ключ — это весь механизм контроля доступа
Так модель получает API-ключ — созданный вами или выданный при входе. Пакет не определяет, к чему можно обращаться: всё решают ограничения самого ключа и адреса, к которым ему предоставлен доступ, на стороне сервера, как и для любого другого клиента. Здесь нет второго набора правил, в котором можно ошибиться.
Поэтому выдавайте агенту ключ с минимально необходимыми правами. Ключ, созданный в read, никогда не сможет отправлять письма, сколько бы почтовых ящиков ему ни предоставили, — см. раздел Аутентификация, где объясняется, к чему даёт доступ ключ и как его ограничить. Агенту, который только сортирует письма, нужен ключ только для чтения. Тогда вопрос о том, не отправит ли он что-нибудь неловкое, не будет зависеть от промпта.
Доступ ключа — это снимок адресов, к которым ему предоставили доступ, поэтому адрес, созданный после выпуска ключа, в него не входит.
Что он предоставляет
Все 42 инструмента, считанные из собственного списка сервера, чтобы эта страница не отставала от него:
| Инструмент | Назначение | Endpoint |
|---|---|---|
list_addresses | Адреса, к которым может обращаться эта учётная запись. | GET /identities |
create_address | Создать адрес для агента. | POST /identities |
get_address | Один адрес по id. | GET /identities/{id} |
list_threads | Переписки в одном адресе, начиная с самых новых. | GET /threads |
get_thread | Одна переписка по id. | GET /threads/{id} |
list_messages | Сообщения одной переписки, начиная с самых старых, — текст, который нужно прочитать перед ответом. | GET /messages |
search_messages | Полнотекстовый поиск по всем адресам, доступным этой учётной записи, с сортировкой по релевантности. | GET /messages/search |
send_message | Отправить письмо с адреса, с которого этой учётной записи разрешено отправлять. | POST /messages |
get_message | Одно сообщение по id: его текст, сохранённые заголовки и результаты проверки записей домена отправителя — authentication.spf\, .dkim\, .dmarc\, где null означает, что результат не сообщён, а не что проверка не пройдена. | GET /messages/{id} |
await_message | Ожидает поступления сообщения на адрес — например, после отправки формы регистрации — и возвращает его вместе с extracted.codes\ и extracted.links\: сначала наиболее вероятные коды подтверждения и ссылки для подтверждения. | GET /messages/await |
reply_to_message | Получатели, тема и цепочка переписки берутся из сообщения, на которое отвечают, поэтому вам нужно передать только текст. | POST /messages/{id}/reply |
forward_message | Переслать сообщение с вложениями тому, кому оно не было адресовано, с адреса, на который оно поступило. | POST /messages/{id}/forward |
create_draft | Создать сообщение, не отправляя его, чтобы человек мог прочитать и отправить его сам. Используйте этот инструмент, если вас просят подготовить ответы для согласования. | POST /drafts |
get_draft_approval | Узнать статус отложенной отправки по её draft\_id\: pending\ — пока человек не одобрит или не отклонит её в панели управления; затем approved\ (письмо отправлено, а message\_id\ — это сообщение), rejected\ или expired\, если за 24 часа никто не принял решение. | GET /drafts/{id}/approval |
list_drafts | Все черновики одного адреса, начиная с самых новых, с получателями и текстом, чтобы можно было вернуться к черновику и закончить его. | GET /drafts |
get_draft | Один черновик по id: отправитель, получатели, тема, текст и вложения. | GET /drafts/{id} |
update_draft | Изменить переданные поля, оставив остальные без изменений; null\ очищает тему или текст. | PATCH /drafts/{id} |
delete_draft | Удалить черновик и отменить запланированную отправку, если она была назначена. | DELETE /drafts/{id} |
read_attachment | Текст одного вложения: CSV-файл, журнал, JSON, файл календаря, PDF, документ Word .docx\ или таблица Excel .xlsx\. | GET /attachments/{id}/text |
update_thread | Кто отвечает за переписку и на каком она этапе. | PATCH /threads/{id} |
update_message | Пометить сообщение звёздочкой или переместить его в archive\, spam\ или trash\. | PATCH /messages/{id} |
list_send_rules | Списки разрешённых и заблокированных отправителей одного адреса и связанная с ними политика отправки. | GET /identities/{id}/send-rules |
list_receive_rules | Правила обработки входящих сообщений для одного адреса: отклонить, пометить как спам, переместить в корзину, архивировать или оставить во входящих — для отправителя или домена, — и его receive\_policy\. | GET /identities/{id}/receive-rules |
list_folders | Все папки одного адреса и количество сообщений в них. | GET /mailboxes |
list_folder | Одна папка одного адреса, начиная с самых новых; одна переписка в строке. Если list\_threads\ показывает, какие переписки существуют, то этот инструмент показывает, где они хранятся и как выглядят в списке. | GET /mailboxes/{folder} |
list_changes | Все изменения в одном почтовом ящике с момента sync\_cursor\, включая новые сообщения, чтобы долго работающему агенту не приходилось перечитывать папку в поисках одного нового письма. | GET /mailboxes/changes |
list_events | Все события по всем адресам, доступным этой учётной записи: получение, отправка и доставка писем, возвраты и перемещения. | GET /events |
list_labels | Метки принадлежат адресу, а не рабочей области, поэтому одинаковое имя на трёх адресах означает три разные метки с тремя разными id. | GET /labels |
create_label | Метка одного адреса. | POST /labels |
apply_label | Метка должна принадлежать тому же адресу, что и переписка. Инструмент list\_labels\ для этого адреса вернёт нужный id. | POST /threads/{id}/labels |
remove_label | Удалить одну метку из одной переписки. | DELETE /threads/{id}/labels |
list_pods | Pod — это контейнер для одного из ваших клиентов: в нём хранятся адреса и домены, а **письма, отправленные из него, формируют собственную репутацию отправителя**, поэтому один клиент не может навредить доставляемости писем другого. | GET /pods |
create_pod | Контейнер для одного из ваших клиентов с собственной репутацией отправителя. | POST /pods |
get_metrics | Отправленные, доставленные, возвращённые, отклонённые и полученные письма, жалобы и спам за период days\ — данные подсчитываются по журналу событий, поэтому учитываются и результаты, сообщённые провайдером позже. | GET /metrics |
get_calendar | Календарь одного адреса по его id\: часовой пояс по умолчанию и количество событий. | GET /identities/{id}/calendar |
update_calendar | Часовой пояс, назначаемый событию, созданному без указания часового пояса; например, имя IANA Europe/Lisbon\. | PATCH /identities/{id}/calendar |
get_agenda | События в календаре адреса между after\ и before\ (дата и время в формате ISO 8601), в порядке начала; каждая дата повторяющегося события указана отдельно. | GET /identities/{id}/calendar/agenda |
get_calendar_event | Одно событие по eventId\ в календаре адреса id\: время, описание, место, повторение и ответы участников. | GET /identities/{id}/calendar/events/{eventId} |
create_calendar_event | Добавить событие в календарь адреса id\. | POST /identities/{id}/calendar/events |
update_calendar_event | Изменить событие календаря: переданные поля обновляются, остальные остаются без изменений. | PATCH /identities/{id}/calendar/events/{eventId} |
delete_calendar_event | Удалить событие из календаря адреса id\. | DELETE /identities/{id}/calendar/events/{eventId} |
respond_to_invitation | Ответить на приглашение на встречу, полученное по почте, используя id\ сообщения: accepted\, declined\ или tentative\, с необязательным comment\. | POST /messages/{id}/invitation/respond |
Каждый инструмент соответствует указанному рядом endpoint из справочника и возвращает те же отказы. Если ключу запрещено использовать инструмент, он завершится так же, как API, и вернёт то же сообщение.
Поиск охватывает все адреса, доступные ключу, если не указать конкретный адрес. В каждом результате указано, на каком адресе он найден.
Чем он не является
Это не среда выполнения агента, и он ничего не решает. Pidgeon не определяет, какую модель вы запускаете и к каким выводам ей разрешено приходить, — такую же позицию в отношении остального продукта занимает раздел Переписки и передача. Если агент зашёл в тупик, передача переписки человеку — это статус переписки, а не функция этого пакета.