Pidgeon

officiel

Boîtes de réception e-mail pour agents IA : leurs propres adresses, fils de discussion, envois, réponses et courriers entrants.

Que pouvez-vous faire avec Pidgeon MCP ?

  • Lire une boîte de réception — Lister les adresses, les fils de discussion et les messages, ou rechercher du texte dans les messages sur toutes les adresses auxquelles la clé peut accéder.
  • Envoyer et répondre — Envoyer depuis une adresse au nom de laquelle la clé peut envoyer, répondre à un message ou le transférer avec ses pièces jointes.
  • Attendre un e-mail de vérification — Attendre l’arrivée d’un message et récupérer les codes de vérification extraits ainsi que les liens de confirmation.
  • Préparer un brouillon pour approbation — Créer des brouillons à faire examiner par une personne, puis vérifier si un envoi suspendu a été approuvé, rejeté ou a expiré.
  • Lire les pièces jointes — Extraire le texte d’une pièce jointe CSV, log, JSON, fichier de calendrier, PDF, .docx ou .xlsx.
  • Gérer le calendrier — Consulter l’agenda d’une adresse, créer ou modifier des événements, et accepter ou refuser les invitations à des réunions reçues par e-mail.

Serveur MCP hébergé

npx add-mcp 'https://pidgeon.ai/api/mcp'

S’installe dans Claude Code, Codex, Cursor et plus

Documentation

Un agent peut gérer directement une boîte de réception Pidgeon : la lire, y répondre, y créer des adresses. Pidgeon parle le Model Context Protocol via la même API que celle décrite dans cette documentation — un adaptateur de protocole, rien de plus.

Il existe deux façons de s’y connecter, et elles utilisent le même serveur. La version hébergée ne nécessite aucune installation ; le package l’exécute sur votre machine.

Hébergé, sous forme d’URL

claude mcp add --transport http pidgeon https://pidgeon.ai/api/mcp

Le premier appel répond 401, et le client vous redirige vers Pidgeon pour vous connecter. Vous choisissez ce qu’il peut faire — lire, lire et envoyer, ou accès complet — et ce à quoi il peut accéder : une seule adresse, ou toutes les adresses si vous possédez le compte. Ce choix devient une clé API, et le client conserve un jeton associé. Elle apparaît sous Developers → API keys → Connected apps, et la déconnexion à cet endroit prend effet au prochain appel du client.

Les connecteurs personnalisés de Claude, ChatGPT, Grok, Cursor, Codex et VS Code utilisent la même URL et la même méthode de connexion. Chaque requête reçoit une réponse indépendante : le serveur ne conserve aucune session, car il n’a pas d’état propre à maintenir.

Pour un agent sans personne pour se connecter, envoyez plutôt une clé :

claude mcp add --transport http pidgeon https://pidgeon.ai/api/mcp \
--header "Authorization: Bearer $PIDGEON_API_KEY"

x-api-key fonctionne aussi. Instructions détaillées pour Cursor, Codex (qui lit du TOML, pas du JSON) et VS Code ; Windsurf et Gemini CLI utilisent la même URL et le même en-tête.

Dans Grok

Dans Grok, accédez à Connectors → Custom, collez https://pidgeon.ai/api/mcp, puis connectez-vous sur l’écran de consentement ; aucune clé n’est nécessaire (instructions détaillées). Muse de Meta est en cours d’examen par Meta.

Dans Cursor

Ajouter Pidgeon à Cursor depuis sa fiche sur cursor.directory, qui fournit le serveur hébergé et la compétence.

Vous pouvez aussi ajouter le serveur manuellement, dans ~/.cursor/mcp.json (ou .cursor/mcp.json pour un seul projet). L’URL suffit ; Cursor vous connecte lors du premier appel :

{
"mcpServers": {
  "pidgeon": {
    "url": "https://pidgeon.ai/api/mcp"
  }
}
}

Pour un agent sans personne pour se connecter, ajoutez "headers": { "Authorization": "Bearer ${env:PIDGEON_API_KEY}" } à côté de l’URL, et Cursor le récupérera depuis votre environnement.

Codex, VS Code et Gemini CLI

Pour Codex, VS Code et Gemini CLI, une seule commande écrit le serveur dans le fichier propre au client :

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

Si aucune clé n’est définie, la commande écrit uniquement l’URL, et le client vous connecte. Si PIDGEON_API_KEY est défini, elle vérifie d’abord la clé, puis demande au client de la lire depuis cette variable (Codex, Gemini CLI) ou de la demander une seule fois (VS Code), afin que la clé ne soit jamais enregistrée dans le fichier. Elle ajoute le contenu à l’existant, commentaires compris, copie tout fichier modifié vers <file>.bak, ne fait rien lors d’une deuxième exécution et ne remplace une entrée pidgeon différente qu’avec --force. --scope user ou --scope project sélectionne l’autre fichier ; --print n’écrit rien.

Ou installé, sous forme de package

PIDGEON_API_KEY=pgn_live_… npx -y @pidgeon-ai/mcp init

Cette commande vérifie la clé auprès de l’API avant d’écrire quoi que ce soit, et vous indique les adresses auxquelles elle donne accès — la seule question à laquelle un bloc de JSON ne peut pas répondre, et celle qui, autrement, se manifeste lorsqu’un modèle reçoit discrètement une erreur que vous ne voyez jamais. Elle écrit ensuite .mcp.json dans le répertoire courant et affiche ce qu’elle a écrit. Elle ne remplace jamais une entrée existante : --force s’en charge, et --print affiche la configuration sans rien écrire, ce qui est utile si votre client conserve la sienne ailleurs.

La clé est référencée depuis l’environnement au lieu d’être écrite dans le fichier ; la configuration peut donc être validée dans le dépôt sans que l’identifiant y soit exposé :

{
"mcpServers": {
  "pidgeon": {
    "command": "npx",
    "args": ["-y", "@pidgeon-ai/mcp"],
    "env": { "PIDGEON_API_KEY": "${PIDGEON_API_KEY}" }
  }
}
}

Claude Desktop, ou tout autre client MCP, utilise le même bloc. Pour exécuter directement le serveur, ce qui est surtout utile pour observer son démarrage :

PIDGEON_API_KEY=pgn_live_… npx -y @pidgeon-ai/mcp

PIDGEON_BASE_URL le dirige vers un environnement autre que la production, ce qui n’est utile que si vous exécutez Pidgeon vous-même.

La clé constitue l’intégralité du contrôle d’accès

Cela transmet une clé API à un modèle — une clé que vous avez créée ou que vous lui avez accordée en vous connectant. Rien dans le package ne décide de ce qui est accessible : les limites propres à la clé et les adresses auxquelles elle donne accès déterminent tout, côté serveur, exactement comme pour n’importe quel autre appelant. Il n’existe pas ici de deuxième ensemble de règles susceptible d’être mal configuré.

Donnez-lui donc la clé la plus limitée dont l’agent a besoin. Une clé créée à read ne peut jamais envoyer de messages, même si elle dispose d’un accès très large à une boîte de réception — consultez Authentification pour comprendre la portée d’une clé et savoir comment la restreindre. Un agent chargé uniquement du tri doit disposer d’une clé qui ne permet que la lecture ; ainsi, la question de savoir s’il pourrait envoyer quelque chose d’embarrassant ne dépend pas de l’invite.

La portée d’une clé est un instantané des adresses auxquelles elle a accès ; une adresse créée après la clé n’y figure donc pas.

Ce qu’il expose

Les 42 outils, lus depuis la liste du serveur lui-même afin que cette page ne puisse pas être en retard sur lui :

OutilFonctionPoint de terminaison
list_addressesLes adresses auxquelles cet identifiant peut accéder.GET /identities
create_addressCréer une adresse qu’un agent pourra utiliser.POST /identities
get_addressUne adresse, par identifiant.GET /identities/{id}
list_threadsLes conversations d’une adresse, de la plus récente à la plus ancienne.GET /threads
get_threadUne conversation, par identifiant.GET /threads/{id}
list_messagesLes messages d’une conversation, du plus ancien au plus récent — le texte à lire avant de répondre.GET /messages
search_messagesRecherche en texte intégral dans toutes les adresses accessibles à cet identifiant, classée par pertinence.GET /messages/search
send_messageEnvoyer un message depuis une adresse pour laquelle cet identifiant dispose du droit d’envoi.POST /messages
get_messageUn message, par identifiant, avec son corps, les en-têtes conservés et les preuves fournies par les enregistrements du domaine expéditeur — authentication.spf\, .dkim\, .dmarc\, où null signifie que l’information n’a pas été signalée, et non qu’elle a échoué.GET /messages/{id}
await_messageAttend l’arrivée d’un message à une adresse — par exemple après l’envoi d’un formulaire d’inscription — puis le renvoie avec extracted.codes\ et extracted.links\ : les codes de vérification et les liens de confirmation apparaissent probablement en premier.GET /messages/await
reply_to_messageLes destinataires, l’objet et le fil de discussion sont extraits du message auquel vous répondez ; vous n’avez donc qu’à fournir le texte.POST /messages/{id}/reply
forward_messageTransférer un message à une personne à qui il n’était pas adressé, avec ses pièces jointes, depuis l’adresse qui l’a reçu.POST /messages/{id}/forward
create_draftRédiger un message sans l’envoyer, pour qu’une personne le lise et l’envoie — à utiliser lorsqu’on vous demande de préparer des réponses pour approbation.POST /drafts
get_draft_approvalÉtat d’un envoi en attente, selon son draft\_id\ : pending\ jusqu’à ce qu’une personne l’approuve ou le rejette dans le tableau de bord, puis approved\ (il a été envoyé, et message\_id\ est le message), rejected\, ou expired\ après 24 heures sans décision.GET /drafts/{id}/approval
list_draftsTous les brouillons d’une adresse, du plus récent au plus ancien, avec leurs destinataires et leur corps — pour pouvoir reprendre un brouillon et le terminer.GET /drafts
get_draftUn brouillon par identifiant : son expéditeur, ses destinataires, son objet, son texte et ses pièces jointes.GET /drafts/{id}
update_draftModifie les champs transmis et laisse les autres inchangés ; null\ efface l’objet ou le texte.PATCH /drafts/{id}
delete_draftSupprime un brouillon et annule son envoi s’il était programmé.DELETE /drafts/{id}
read_attachmentLe texte d’une pièce jointe — un CSV, un journal, du JSON, un fichier de calendrier ou un PDF, un document Word .docx\ ou un fichier Excel .xlsx\.GET /attachments/{id}/text
update_threadQui est responsable d’une conversation et où elle en est.PATCH /threads/{id}
update_messageAjouter une étoile à un message ou le déplacer vers archive\, spam\ ou trash\.PATCH /messages/{id}
list_send_rulesLa liste d’autorisation et de blocage d’une adresse, ainsi que la politique d’envoi qui lui est associée.GET /identities/{id}/send-rules
list_receive_rulesLes règles qui déterminent ce qui arrive à une adresse — rejet, spam, corbeille, archivage ou boîte de réception, par expéditeur ou par domaine — et son receive\_policy\.GET /identities/{id}/receive-rules
list_foldersTous les dossiers d’une adresse avec leur nombre d’éléments.GET /mailboxes
list_folderUn dossier d’une adresse, du plus récent au plus ancien, avec une conversation par ligne — là où list\_threads\ indique quelles conversations existent, celui-ci indique où elles sont classées et à quoi elles ressemblent dans une liste.GET /mailboxes/{folder}
list_changesTout ce qui a changé dans une boîte de réception depuis un sync\_cursor\, y compris les nouveaux messages, afin qu’un agent de longue durée n’ait pas à relire un dossier pour trouver un seul nouveau message.GET /mailboxes/changes
list_eventsTous les événements de toutes les adresses accessibles à cet identifiant — messages reçus, envoyés, distribués, rejetés ou classés.GET /events
list_labelsLes libellés appartiennent à une adresse, et non à l’espace de travail ; un même nom sur trois adresses correspond donc à trois libellés avec trois identifiants.GET /labels
create_labelUn libellé sur une adresse.POST /labels
apply_labelLe libellé doit appartenir à la même adresse que la conversation — list\_labels\ pour cette adresse vous donne le bon identifiant.POST /threads/{id}/labels
remove_labelSupprime un libellé d’une conversation.DELETE /threads/{id}/labels
list_podsUn pod est un conteneur pour l’un de vos propres clients : il regroupe des adresses et des domaines, et **les messages envoyés depuis celui-ci bénéficient de leur propre réputation d’expéditeur**, afin qu’un client ne puisse pas nuire à la délivrabilité d’un autre.GET /pods
create_podUn conteneur pour l’un de vos clients, avec sa propre réputation d’expéditeur.POST /pods
get_metricsMessages envoyés, distribués, rejetés, refusés, signalés comme indésirables, reçus et classés comme spam sur une période de days\ — comptabilisés à partir du journal des événements, ce qui inclut les résultats signalés ultérieurement par le fournisseur.GET /metrics
get_calendarLe calendrier d’une adresse, selon le id\ de l’adresse : son fuseau horaire par défaut et le nombre d’événements qu’il contient.GET /identities/{id}/calendar
update_calendarLe fuseau horaire attribué à un événement créé sans fuseau horaire, sous la forme d’un nom IANA tel que Europe/Lisbon\.PATCH /identities/{id}/calendar
get_agendaLe contenu du calendrier d’une adresse entre after\ et before\ (dates-heures ISO 8601), dans l’ordre de début, avec chaque occurrence d’un événement récurrent affichée séparément.GET /identities/{id}/calendar/agenda
get_calendar_eventUn événement par eventId\ dans le calendrier de l’adresse id\ : ses horaires, sa description, son lieu, sa récurrence et ses participants avec leurs réponses.GET /identities/{id}/calendar/events/{eventId}
create_calendar_eventAjoute un événement au calendrier de l’adresse id\.POST /identities/{id}/calendar/events
update_calendar_eventModifie un événement du calendrier : les champs transmis, en laissant les autres inchangés.PATCH /identities/{id}/calendar/events/{eventId}
delete_calendar_eventSupprime un événement du calendrier de l’adresse id\.DELETE /identities/{id}/calendar/events/{eventId}
respond_to_invitationRépond à une invitation à une réunion reçue par e-mail, à partir du id\ du message : accepted\, declined\ ou tentative\, avec un comment\ facultatif.POST /messages/{id}/invitation/respond

Chacun correspond au point de terminaison indiqué à côté dans la référence, avec les mêmes refus. Un outil interdit par la clé échoue comme l’API, avec la phrase que l’API aurait utilisée.

La recherche couvre toutes les adresses accessibles à la clé, sauf si vous en indiquez une ; chaque résultat précise l’adresse dans laquelle il a été trouvé.

Ce que ce n’est pas

Ce n’est pas un environnement d’exécution d’agent, et il ne prend aucune décision. Pidgeon n’a pas d’avis sur le modèle que vous exécutez ni sur ce qu’il est autorisé à conclure — c’est la même position que celle adoptée par Threads and hand-off pour le reste du produit. Si l’agent est bloqué, transmettre la conversation à une personne relève du statut du fil de discussion, et non d’une fonctionnalité de ce package.