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_podsPod — это контейнер для одного из ваших клиентов: в нём хранятся адреса и домены, а **письма, отправленные из него, формируют собственную репутацию отправителя**, поэтому один клиент не может навредить доставляемости писем другого.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 не определяет, какую модель вы запускаете и к каким выводам ей разрешено приходить, — такую же позицию в отношении остального продукта занимает раздел Переписки и передача. Если агент зашёл в тупик, передача переписки человеку — это статус переписки, а не функция этого пакета.