Codex · Serveur MCP
Serveur MCP Codex : messagerie et email dans votre produit
Trois lignes de config.toml connectent le serveur MCP Unipile. Codex intègre ensuite des fonctionnalités LinkedIn, WhatsApp et email dans votre produit.
Essai gratuit de 7 jours, sans carte bancaire.
Codex · crm-app
Unipile MCP connecté
Ajoute la recherche de personnes LinkedIn à mon CRM.
Endpoint de lecturePOST /v2/{account_id}/linkedin/searchschéma chargé
Ajout de la route de recherche et de la liste de résultats. Chaque ligne conserve l'ID fournisseur du profil.
Décrivez la prochaine fonctionnalité…
Le besoin
Ce que vous cherchez à faire
Ajouter une connexion LinkedIn, WhatsApp, email ou agenda à votre produit, c'est lire une référence API, choisir les bons endpoints, brancher Hosted Auth et ses callbacks, puis conserver les bons ID de la recherche jusqu'au message. Avec le serveur MCP Unipile dans Codex, l'agent fait cette lecture pour vous et écrit le code dans votre stack, depuis la CLI, l'extension IDE ou l'app desktop.
Connecter le serveur MCP Unipile à CodexUnipile MCP connecté
Sélectionnez les canaux à connecter
developer.unipile.com/mcpConnecter tous les canaux9 canaux
↑↓naviguer espacesélectionner ↵connecterune URL, un en-tête
Sans le serveur
Onglets, suppositions, code de liaison
Codex devine les noms d'endpoints et les payloads à partir de ses données d'entraînement, et se trompe d'ID.
Vous collez dans le chat les schémas de la référence, un endpoint à la fois.
Le premier vrai appel a lieu en production, après la revue de code.
Avec le serveur MCP Unipile
Le résultat dans votre application
Une route de connexion et un bouton dans Settings : chaque utilisateur relie son propre compte via Hosted Auth.
Un récepteur de webhooks et une inbox qui affiche les messages et les emails dès leur arrivée.
Chaque requête déjà exécutée une fois sur votre application Development avant que vous relisiez le diff.
config.toml, CLI et IDE
Ajouter le serveur MCP Unipile à Codex
Le serveur est distant : une URL en HTTP streamable et un en-tête. Pas de npx, pas de processus local. Une seule entrée dans config.toml est lue par Codex CLI, l'extension IDE Codex et l'app desktop ChatGPT : vous la configurez une fois.
Codex CLI installé (npm i -g @openai/codex) ou l'extension IDE Codex, connecté.
Une application Development dans le dashboard Unipile, avec un Scope et une clé Account API scopée.
Au moins un compte de test connecté à ce Scope via Hosted Auth, pour que l'agent puisse exécuter de vraies requêtes.
codex mcp add, puis l'en-têteenregistre l'URL dans ~/.codex/config.toml
Configuration globale~/.codex/config.toml
Configuration de projet.codex/config.toml (projet de confiance)
Clé issue d'une variable d'environnementenv_http_headers
?
Pourquoi deux étapes en CLI ?codex mcp add accepte --url et une variable de jeton bearer, mais aucun flag d'en-tête personnalisé. Le serveur Unipile s'authentifie avec X-API-KEY : la commande enregistre donc l'URL, et l'en-tête va dans config.toml, à la main ou avec env_http_headers.
# 1. Enregistrer le serveur MCP Unipile hébergé (config globale)
codex mcp add unipile --url "https://developer.unipile.com/mcp?branch=v2.0"
# Added global MCP server 'unipile'.
# 2. Ajouter l'en-tête X-API-KEY à l'entrée dans ~/.codex/config.toml
[mcp_servers.unipile]
url = "https://developer.unipile.com/mcp?branch=v2.0"
http_headers = { "X-API-KEY" = "your-scoped-api-key" }
# 3. Vérifier
codex mcp get unipile
[mcp_servers.unipile]
url = "https://developer.unipile.com/mcp?branch=v2.0"
http_headers = { "X-API-KEY" = "your-scoped-api-key" }
[mcp_servers.unipile]
url = "https://developer.unipile.com/mcp?branch=v2.0"
http_headers = { "X-API-KEY" = "your-scoped-api-key" }
# Lu uniquement dans un projet de confiance. Gardez la clé hors de git : préférez env_http_headers.
[mcp_servers.unipile]
url = "https://developer.unipile.com/mcp?branch=v2.0"
env_http_headers = { "X-API-KEY" = "UNIPILE_API_KEY" }
# export UNIPILE_API_KEY=your-scoped-api-key avant de lancer codex
Enregistrez le fichier et redémarrez Codex. codex mcp list affiche unipile comme activé, et /mcp dans une session liste le serveur. Vérifié sur codex-cli 0.154.0.
Le rôle de chaque ligne, vérifié sur codex-cli 0.154.0
codex mcp add unipileCrée la table [mcp_servers.unipile] dans le config.toml global. Le nom est libre ; gardez-le court, il devient le préfixe des outils.--url "https://developer.unipile.com/mcp?branch=v2.0"Transport HTTP streamable. Mettez l'URL entre guillemets : le point d'interrogation est un caractère glob dans zsh.http_headers = { "X-API-KEY" = "…" }En-tête statique envoyé à chaque requête. Utilisez votre clé Account API scopée, jamais une clé Service ou Account globale.env_http_headers = { "X-API-KEY" = "UNIPILE_API_KEY" }Même en-tête, valeur lue dans l'environnement au lancement. La bonne forme pour un config.toml de projet versionné dans git.startup_timeout_sec = 30Facultatif. La valeur par défaut est 10 s ; augmentez-la si le premier handshake expire sur un réseau lent.enabled = falseFacultatif. Désactive le serveur sans supprimer l'entrée, pratique pour passer d'une clé Development à une clé Production.La partie propre à Codex
Gardez votre clé API hors de config.toml
http_headers écrit la clé en clair dans un fichier qui finit dans les sauvegardes et, pour une config de projet, dans git. Codex offre trois façons d'envoyer l'en-tête X-API-KEY ; choisissez celle qui correspond à l'emplacement du fichier.
1http_headers, valeur statiqueLa forme de la documentation Unipile. Convient pour une config user sur votre propre machine, jamais pour un fichier partagé dans un dépôt.http_headers = { "X-API-KEY" = "your-scoped-api-key" }
2env_http_headers, lu au lancementAssocie le nom de l'en-tête au nom d'une variable d'environnement. Le fichier ne contient aucun secret, chaque développeur exporte sa propre clé scopée. La bonne forme pour un config.toml de projet.env_http_headers = { "X-API-KEY" = "UNIPILE_API_KEY" }
export UNIPILE_API_KEY=your-scoped-api-key
3http_headers_helper, depuis une commandeUne commande locale qui imprime les en-têtes en JSON, pour les équipes qui récupèrent leurs clés dans un coffre-fort. Et n'oubliez pas CODEX_HOME : il déplace tout le répertoire de configuration, donc un serveur enregistré dans un terminal peut manquer dans un autre.http_headers_helper = "./scripts/unipile-headers.sh"
Vérifier
Vérifier la connexion
Trois vérifications : dans la CLI, dans une session, puis avec un prompt qui ne lit que la spécification. Aucune ne touche à un compte connecté.
1Dans Codex CLIlist affiche une ligne par serveur avec son URL et son état. get montre le transport, les en-têtes et la commande de suppression.codex mcp list
codex mcp get unipile
2Dans une sessionDans la TUI Codex, l'extension IDE (menu engrenage, MCP servers) et l'app desktop ChatGPT (Settings, MCP servers), la même entrée apparaît : une config, trois interfaces./mcp
# Status enabled, Auth Unsupported est normal : le serveur utilise un en-tête, pas OAuth
3Dans un chat, sans toucher à un comptePosez une question qui ne lit que la spécification de l'API. Si l'agent répond avec de vraies routes et de vrais paramètres, le serveur est branché.Avec le MCP Unipile, liste les endpoints de recherche de personnes LinkedIn et leurs paramètres obligatoires.
Des prompts, pas du code de liaison
Donnez le prompt à votre agent
Trois tâches d'intégration, chacune avec le prompt exact à coller dans Codex, les endpoints Unipile que l'agent lit et exécute, et ce qui arrive dans votre projet. Les chemins sont complets, sur l'URL de base de l'API
https://api.unipile.com, avec votre clé scopée dans l'en-tête X-API-KEY .Ajoute la recherche de personnes LinkedIn à mon CRM, puis permets à l'utilisateur d'ouvrir le profil sélectionné et de démarrer une conversation depuis celui-ci.
Rechercher des endpoints"linkedin search people profile"3 résultats
Exécuter la requêtePOST /v2/{account_id}/linkedin/search10 résultats
Ajout de
GET /api/linkedin/search (mots-clés, curseur de pagination) et GET /api/linkedin/profiles/:identifier. La liste de résultats conserve l'ID fournisseur renvoyé par la recherche, la route profil le réutilise, et le bouton « Message » le transmet à la création du chat. Les deux exécutés sur l'application Development.Un seul identifiant, du résultat de recherche à la conversation
Le plus dur dans une fonctionnalité LinkedIn, ce ne sont pas les appels, c'est de garder le même identifiant de la ligne de recherche au profil, puis au message. Codex lit les trois contrats via le serveur, voit quel champ porte cet identifiant dans chaque réponse et écrit les routes sans rien deviner.
Endpoints utilisés par l'agent
POST/v2/{account_id}/linkedin/searchGET/v2/{account_id}/users/{identifier}POST/v2/{account_id}/chats
Erreur fréquente : Rechercher avec un compte et envoyer le message avec un autre. Le profil et le chat doivent être ouverts sur le même
Créer une intégration LinkedIn
account_id que celui qui a lancé la recherche.Génère un client typé Node.js et Python pour les routes chats et emails d'Unipile que nous utilisons, à partir des schémas de l'API, avec des retries sur 429.
Endpoint de lectureGET /v2/{account_id}/emailsschéma chargé
Exécuter la requêteGET /v2/{account_id}/chats200 OK
Écriture de
unipile-client.ts et unipile_client.py à partir des schémas de requête et de réponse : méthodes typées de liste et d'envoi pour les chats et les emails, helper de pagination par curseur, backoff exponentiel sur 429 avec l'en-tête Retry-After. Les deux clients ont exécuté les appels de liste sur l'application Development.Des clients typés à partir des vrais schémas, pas de mémoire
Codex ne devine pas les payloads. Il lit le corps de requête et le schéma de réponse de chaque route via le serveur, génère les types et exécute un appel par méthode sur votre application Development avant que vous relisiez le diff. Les SDK officiels Node.js et Python restent la référence ; le client généré est le vôtre, à garder léger.
Endpoints utilisés par l'agent
GET/v2/{account_id}/chatsPOST/v2/{account_id}/chats/{chat_id}/messages/sendGET/v2/{account_id}/emailsPOST/v2/{account_id}/emails/send
Erreur fréquente : Relancer un envoi après un timeout sans contrôle d'idempotence. Un message peut partir une fois ; relancez les appels de lecture, pas les écritures.
Voir les SDK officiels
Prends en charge plusieurs comptes connectés pour chaque utilisateur de mon SaaS : ils peuvent relier plusieurs comptes LinkedIn et email et choisir celui qui envoie.
Endpoint de lectureGET /v2/accountsschéma chargé
Exécuter la requêteGET /v2/accounts3 comptes
Ajout d'une table
accounts indexée par utilisateur et account_id, d'un sélecteur dans l'éditeur de message, et de POST /api/messages qui envoie depuis le compte sélectionné. Les états de reconnexion renvoyés par la route des comptes s'affichent sous forme de badge. Vérifié avec trois comptes sur l'application Development.Un utilisateur, plusieurs comptes, un Scope par workspace
Chaque compte que vos utilisateurs connectent via Hosted Auth reçoit son propre
account_id. L'agent conçoit le mapping entre vos utilisateurs et ces ID, lit la route d'état des comptes pour afficher les états de reconnexion et de checkpoint, et envoie chaque message depuis le compte choisi par l'utilisateur.Endpoints utilisés par l'agent
GET/v2/accountsGET/v2/accounts/{account_id}POST/v2/auth/linkPOST/v2/{account_id}/chats
Erreur fréquente : Stocker l'ID du compte sur le workspace au lieu de l'utilisateur. Les comptes appartiennent à la personne qui les a connectés ; le workspace ne fait que regrouper Scopes et clés.
Implémenter Hosted Auth avec un agent
Du développement à la production
Testez d'abord sur une application Development
Le dashboard Unipile sépare une application Development d'une application Production. Donnez à Codex une clé scopée de l'application Development, avec un ou deux comptes de test connectés via Hosted Auth. L'agent exécute de vraies requêtes sur ces comptes, pour le compte de l'utilisateur authentifié qui les a reliés, dans les limites de chaque fournisseur, et rien ne touche aux comptes de vos utilisateurs avant la mise en production. Gardez
default_tools_approval_mode sur prompt pendant le développement si vous voulez confirmer chaque écriture.Validez le flux de connexion de bout en bout : lien d'authentification créé côté serveur, ID du compte stocké sur l'utilisateur.
Validez une lecture et une écriture par fonctionnalité : lister les chats, envoyer un message sur le compte de test.
Validez une livraison de webhook et un état de reconnexion ou de checkpoint avant de passer la clé en Production.
crm-app · DevelopmentUtilisé par Codex
Scopedev-tests · 2 comptes
Clé
clé Account API scopéeComptesCompte de test LinkedIn, boîte mail de test Gmail
Webhooks1 endpoint · événements de message
crm-app · ProductionIntacte
Scopeune par workspace
Clé
clés scopées, uniquement dans votre backendComptesles comptes de vos utilisateurs, via Hosted Auth
Dépannage
Erreurs fréquentes et leur signification
Ce que vous voyez quand une entrée MCP Codex est incorrecte, et la correction de chaque cas. La plupart tiennent au fichier, au TOML, au niveau de confiance ou à la clé.
Le serveur n'apparaît pas après modification de config.toml
codex mcp list n'affiche rien, ou l'entrée manque dans une session.
CorrectionRedémarrez le client : le fichier est lu au démarrage. Vérifiez ensuite CODEX_HOME : il déplace tout le répertoire de configuration, donc un serveur enregistré dans un terminal peut être invisible dans un autre. Lancez codex mcp list dans le shell depuis lequel vous lancez Codex.
La configuration du projet est ignorée
.codex/config.toml est à la racine du dépôt, et Codex utilise quand même l'entrée globale, ou aucune.
CorrectionCodex charge la couche projet uniquement pour un projet de confiance. Marquez-le avec trust_level = "trusted" sous [projects."/path/to/repo"] dans la config user, ou déplacez l'entrée vers ~/.codex/config.toml.
TOML invalide
L'analyse du fichier échoue et tous les serveurs disparaissent d'un coup.
CorrectionUne table nommée [mcp_servers.unipile] exactement, des guillemets autour de "X-API-KEY" dans la table d'en-têtes, et une table, pas une chaîne, pour http_headers. Une accolade fermante oubliée fait tomber tout le fichier.
401 Unauthorized sur les requêtes
Le serveur est listé et lit la spécification, mais l'exécution d'une requête échoue.
CorrectionL'en-tête manque, la variable nommée dans env_http_headers n'est pas exportée dans le shell qui a lancé Codex, ou la clé est une clé Service ou Account globale au lieu d'une clé Account API scopée de votre application Development.
Les paramètres indiquent que le serveur est indisponible
L'extension IDE ou l'app desktop signale le serveur, alors que les actions s'exécutent.
CorrectionCe contrôle cherche des ressources, et le serveur Unipile expose des actions, pas des ressources. Confirmez avec /mcp dans une session et en exécutant un appel de lecture. Rien à changer de votre côté.
Timed out
Le démarrage ou un appel dépasse la limite.
CorrectionLes valeurs par défaut sont startup_timeout_sec = 10 et tool_timeout_sec = 60. Le serveur est distant, il n'y a aucun processus à démarrer : vérifiez l'URL (?branch=v2.0 compris), le réseau et un éventuel proxy d'entreprise avant d'augmenter les timeouts.
6000+
Les entreprises qui innovent avec Unipile
Des entreprises leaders nous font confiance
1 API
Toutes les plateformes centralisées en une API
2 jours
Intégration très rapide
30%
Réduction des efforts et des ressources de maintenance
Sécurité et conformité
Une protection de niveau entreprise pour vos données et workflows En savoir plus sur notre sécurité
SOC 2 Type II
Certifié
Contrôles de sécurité vérifiés de manière indépendante garantissant la protection des données et l'intégrité opérationnelle.
GDPR
Conforme à la loi
Conformité totale avec les réglementations européennes en matière de protection des données pour le respect de la vie privée des utilisateurs.
99.9%
Temps de disponibilité de la plateforme au cours des 24 derniers mois
24/7
Support mondial avec API performante
FAQ serveur MCP Codex
Les questions réellement posées : config.toml au lieu de mcp.json, son emplacement, codex mcp add, la clé hors du fichier, les trois interfaces, que vérifier quand rien n'apparaît, les timeouts et les clés.
Non. Codex stocke sa configuration MCP dans
~/.codex/config.toml, en TOML, une table par serveur nommée [mcp_servers.<name>]. Il n'y a pas de mcp.json dans Codex, et le fichier n'est pas créé à l'installation : vous le créez, ou codex mcp add le crée pour vous. Un projet de confiance peut aussi avoir un .codex/config.toml à sa racine.~/.codex/config.toml pour la configuration user, .codex/config.toml à la racine du dépôt pour la configuration de projet. La variable d'environnement CODEX_HOME déplace tout le répertoire de configuration : quand un serveur apparaît dans un terminal et pas dans un autre, vérifiez-la en premier. Codex CLI, l'extension IDE et l'app desktop lisent le même fichier.En partie.
codex mcp add unipile --url "https://developer.unipile.com/mcp?branch=v2.0" écrit la table d'un serveur HTTP streamable, et --bearer-token-env-var couvre les serveurs qui acceptent un jeton Bearer. Le serveur Unipile s'authentifie avec un en-tête X-API-KEY , que la commande ne sait pas définir : vous ajoutez donc http_headers ou env_http_headers à l'entrée qu'elle a créée. Vérifié sur codex-cli 0.154.0.Utilisez
env_http_headers = { "X-API-KEY" = "UNIPILE_API_KEY" } : il associe le nom de l'en-tête au nom d'une variable d'environnement plutôt qu'à une valeur. Le fichier peut ainsi être commité sans secret, et chaque développeur exporte sa propre clé Account API scopée. http_headers sert aux valeurs statiques, et http_headers_helper permet à une commande locale de produire les en-têtes en JSON.Oui. Les trois interfaces d'un même hôte Codex lisent la même configuration : un serveur ajouté une fois est disponible partout. Dans l'app desktop et dans l'extension, vous pouvez aussi l'ajouter depuis Settings, MCP servers, Add server, en choisissant Streamable HTTP. Redémarrez le client après avoir enregistré le fichier.
Quatre causes, dans l'ordre : le client n'a pas été redémarré ; le fichier se trouve sous un autre
CODEX_HOME que votre shell actuel ; la table est dans un .codex/config.toml de projet et le projet n'est pas marqué trust_level = "trusted", auquel cas Codex ignore entièrement la couche projet ; ou le TOML est invalide. Lancez codex mcp list, puis /mcp dans une session.startup_timeout_sec remplace le timeout de démarrage par défaut de 10 secondes et tool_timeout_sec le timeout par outil par défaut de 60 secondes, tous deux sous la table du serveur. Le serveur Unipile est distant, en HTTP, sans processus local à démarrer : un timeout de démarrage pointe donc presque toujours vers l'URL, le réseau ou un proxy d'entreprise, pas vers le serveur.Le serveur répond sans clé quand l'agent se contente de lire la spécification de l'API. Pour exécuter de vraies requêtes, créez un Scope dans votre application Development, rattachez-y les comptes de test et générez une clé Account API scopée pour ce Scope. Ne donnez jamais à un client MCP une clé Service ou une clé Account globale.