Aller au contenu principal

Guide Cursor + Claude Code

Laissez votre agent de code
brancher e-mail, SMS et WhatsApp.

Connectez le serveur MCP Unlimited Messaging à Cursor, Claude Code ou Windsurf, collez un prompt, et l'agent écrit un module notify, envoie un vrai test depuis vos propres comptes et vérifie qu'il est arrivé.

Pressé ? Résumez cet article avec une IA

La réponse courte

Comment Cursor et Claude Code ajoutent-ils e-mail, SMS et WhatsApp à une app ?

Donnez deux choses à l'agent : le serveur MCP Unlimited Messaging à l'adresse https://mcp.unlimitedmessaging.app, pour qu'il voie vos comptes et envoie un message de test, et une clé d'API dans votre .env, que le code qu'il écrit lit pour appeler POST /message. Une requête envoie alors e-mail, WhatsApp et SMS depuis vos propres comptes, sur un plan gratuit.

Les agents de code savent écrire un appel fetch, mais pas deviner s'il a fonctionné. La connexion MCP comble ce manque : pendant qu'il code, l'agent peut lister les boîtes mail, numéros WhatsApp et téléphones Android que vous avez connectés, envoyer un test après votre accord et lire le statut de livraison, le tout via OAuth, sans clé collée dans le chat.

Dans l'app elle-même, le code utilise l'API REST ou les SDK TypeScript et Python avec une clé d'API tirée de l'environnement. Unlimited Messaging envoie depuis des comptes que vous possédez déjà : l'e-mail depuis votre boîte Gmail ou de domaine en IMAP/SMTP, WhatsApp depuis votre numéro lié comme WhatsApp Web, les SMS depuis la SIM de votre téléphone Android. Le plan gratuit ne facture rien par message ; les messages se terminent par une courte ligne "Sent with UnlimitedMessaging.app".

Cela fonctionne de la même façon dans Cursor, Claude Code et Windsurf, et dans tout client MCP qui gère les serveurs distants avec OAuth. Aucun d'eux n'a de partenariat officiel avec Unlimited Messaging : ils parlent le protocole ouvert MCP, et cela suffit.

Le serveur MCP en détail : guide MCP. Dans les apps Claude : configuration de Claude. Client typé pour votre code : le SDK TypeScript.

Illustration : un assistant IA relié au chat, au mail, à l'agenda et aux contacts, avec le titre « Votre agent de code branche les messages ».

Pourquoi ne pas tout coder

Pourquoi laisser un agent coder SMTP, Twilio et Meta à la main prend du temps ?

L'agent écrit l'intégration en une minute. Puis le vrai travail commence : comptes, vérifications, règles des plateformes et échecs silencieux qu'il ne voit pas.

  1. E-mail : l'extrait SMTP casse en production

    Les agents adorent nodemailer, mais Vercel bloque le SMTP sortant sur le port 25 et les Edge Functions Supabase refusent les ports 25 et 587. Passer à une API d'e-mail implique un domaine vérifié et des enregistrements DNS avant que quiconque d'autre que vous reçoive un e-mail.

  2. SMS : un numéro, un enregistrement, des frais au segment

    Twilio facture 0,0083 $ par segment aux États-Unis plus des frais d'opérateur, sur un numéro que vous louez. Envoyer vers des numéros américains depuis un numéro long classique exige aussi l'enregistrement A2P 10DLC, avec 4,50 $ de frais de marque et une vérification.

  3. WhatsApp : templates et file d'examen

    L'API Cloud de Meta exige un template approuvé pour tout message hors de la fenêtre de service client de 24 heures, avec un examen qui prend jusqu'à 24 heures et un prix par message template. Les nouveaux comptes démarrent à 250 destinataires uniques par 24 heures.

  4. L'agent ne peut pas vérifier son travail

    Sans accès au côté fournisseur, l'agent crie victoire dès que le code compile. Trois fournisseurs, c'est aussi trois clés dans .env, trois formats d'erreur et trois gestionnaires de webhook à relire.

Deux portes d'entrée

MCP ou API : qu'utilise l'agent, et quand ?

Le serveur MCP sert à l'agent pendant qu'il code. La clé d'API sert à votre app une fois en production. La plupart des projets utilisent les deux.

MCP ou API : qu'utilise l'agent, et quand ?
Fournisseurs codés à la mainSMTP, Twilio, MetaMCP Unlimited MessagingDans l'agent de codeAPI Unlimited MessagingDans le code de votre app
Qui envoieVotre app, via trois fournisseursL'agent, après votre accordVotre app, via un seul endpoint
AuthentificationTrois jeux d'identifiantsOAuth dans le navigateur, aucune clé dans les fichiersUne clé d'API tirée de l'environnement
CanauxUn fournisseur par canalE-mail, WhatsApp et SMSE-mail, WhatsApp et SMS en une requête
Peut vérifier la livraisonSeulement dans le tableau de bord de chaque fournisseurOui, list-messages avec les statutsOui, GET /message et webhooks sur les plans payants
Coût pour testerEssais, puis au messagePlan gratuitPlan gratuit, ligne en pied de message

Frais des fournisseurs relevés sur les pages de Twilio et de Meta le 9 novembre 2026.

Étape par étape

De zéro à une intégration testée en cinq étapes

  1. 01

    Connectez le serveur MCP

    Claude Code : lancez la commande claude mcp add d'une ligne ci-dessous. Cursor : ajoutez le bloc à .cursor/mcp.json. Windsurf : ajoutez-le à mcp_config.json avec serverUrl.

  2. 02

    Connectez-vous via OAuth

    Au premier appel d'outil, votre navigateur ouvre la connexion Unlimited Messaging. Pas encore de compte ? Il est créé sur le plan gratuit, sans carte bancaire. Dans Claude Code, /mcp lance la connexion.

  3. 03

    Connectez vos canaux

    Demandez à l'agent de connecter votre boîte mail ou votre WhatsApp (il affiche le QR code), et installez l'app Android sur un téléphone avec une SIM pour les SMS.

  4. 04

    Créez une clé d'API pour l'app

    Dans la section API du tableau de bord, créez une clé et placez-la vous-même dans .env sous le nom UM_API_KEY. L'agent n'a besoin que du nom de la variable.

  5. 05

    Collez le prompt

    L'agent écrit le module, le branche sur votre déclencheur, puis vous envoie un test via MCP et confirme le statut.

Copier, coller

Quel prompt coller dans Cursor ou Claude Code ?

Collez ceci dans le chat de l'agent, en mode Agent. Cela fonctionne dans Cursor, Claude Code et Windsurf. Indiquez l'événement qui doit déclencher le message.

Prompt pour Cursor, Claude Code ou WindsurfPrompt
Ajoute Unlimited Messaging à ce projet pour qu'il puisse envoyer des e-mails, des WhatsApp et des SMS (docs : https://docs.unlimitedmessaging.app).

1. Crée un module côté serveur, src/lib/notify.ts (ou notify.py), qui appelle POST https://api.unlimitedmessaging.app/message avec "Authorization: Bearer ${UM_API_KEY}" et le corps { "to": { "phone": "<E.164>", "email": "<email>" }, "subject": "...", "text": "...", "channels": [{ "channel": "EMAIL" }, { "channel": "WHATSAPP" }, { "channel": "SMS" }] }. Lève une erreur sur une réponse non 2xx, avec le corps dans le message.
2. Lis UM_API_KEY dans l'environnement. Ajoute-la à .env.example avec une valeur vide, vérifie que .env est dans .gitignore, et ne lis, n'affiche ni n'écris jamais en dur la vraie clé.
3. Appelle notify() lors de <ton événement : inscription, nouvelle commande, paiement échoué...>, uniquement depuis du code serveur.
4. Utilise les outils MCP unlimited-messaging : list-accounts pour voir quels canaux j'ai connectés (retire les autres de l'appel), puis, après m'avoir demandé, send-message vers mes propres coordonnées pour un test, et list-messages pour confirmer son statut.
L'étape 4 est l'apport de MCP : l'agent vérifie vos canaux connectés et contrôle une vraie livraison au lieu de supposer que le code marche.
MCPClaude Code / Cursor / Windsurf
# Claude Code
claude mcp add --transport http unlimited-messaging https://mcp.unlimitedmessaging.app

# Cursor: ~/.cursor/mcp.json or .cursor/mcp.json
{ "mcpServers": { "unlimited-messaging": { "url": "https://mcp.unlimitedmessaging.app" } } }

# Windsurf: mcp_config.json
{ "mcpServers": { "unlimited-messaging": { "serverUrl": "https://mcp.unlimitedmessaging.app" } } }
Connecter le serveur hébergé dans chaque outil. Les trois se connectent en OAuth au premier usage : aucune clé ne va dans ces fichiers.
notify.tsTypeScript
// src/lib/notify.ts (server-side only)
type Channel = 'EMAIL' | 'WHATSAPP' | 'SMS';

export async function notify(
  to: { phone?: string; email?: string },
  text: string,
  channels: Channel[],
  subject?: string,
) {
  const res = await fetch('https://api.unlimitedmessaging.app/message', {
    method: 'POST',
    headers: {
      Authorization: `Bearer ${process.env.UM_API_KEY}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      to, text, subject,
      channels: channels.map((channel) => ({ channel })),
    }),
  });
  if (!res.ok) throw new Error(`notify failed: ${res.status} ${await res.text()}`);
  return res.json(); // one message per channel, sharing a dispatchId
}
Le type de module que l'agent doit écrire : côté serveur, une requête, la clé tirée de l'environnement, les erreurs remontées.

Sécurité

Comment garder la clé d'API loin de l'agent et du dépôt ?

La clé a sa place dans .env, lue par du code serveur. Chaque outil offre un moyen de tenir l'agent à l'écart de ce fichier.

  1. MCP n'a besoin d'aucune clé

    La connexion de l'agent passe par OAuth : les jetons sont stockés par le client et révocables, dans Claude Code depuis le menu /mcp. Rien de secret ne va dans .cursor/mcp.json ou .mcp.json, ces fichiers peuvent donc être commités.

  2. Claude Code : interdire la lecture de .env

    La documentation des paramètres d'Anthropic montre des règles de permission comme Read(./.env) et Read(./.env.*) dans deny. Ajoutez-les à .claude/settings.json et Claude Code ne peut plus ouvrir le fichier.

  3. Cursor : .cursorignore, avec ses limites

    Les fichiers listés dans .cursorignore sont bloqués pour Agent, Tab, Inline Edit et les mentions @. La documentation de Cursor prévient que le terminal et les outils MCP utilisés par l'agent ne sont pas couverts : ne comptez pas uniquement dessus.

  4. Code serveur uniquement

    Ne préfixez jamais la clé par NEXT_PUBLIC_ ou VITE_, et n'importez jamais le module notify depuis des composants client. Vérifiez ce point dans le diff de l'agent avant de commiter.

  5. Gardez la confirmation active

    send-message envoie de vrais messages depuis vos comptes. Le serveur demande aux assistants de confirmer chaque envoi, et votre éditeur peut demander avant chaque appel d'outil : n'approuvez pas celui-ci automatiquement.

Réponses

Comment votre app reçoit-elle les réponses ?

Les réponses arrivent toujours dans la boîte de réception Unlimited Messaging, et l'agent peut les lire via list-messages pendant le développement. Pour que votre app y réagisse en production, il faut des webhooks, inclus dans les plans payants : Moyen à 19 €/mois et Max à 29 €/mois.

Demandez à l'agent une route de webhook, enregistrez son URL publique sur la page Webhooks du tableau de bord, et abonnez-vous à message.received (un message entrant) et message.status (envoyé, délivré, lu, échec). Rangez le secret whsec_ sous le nom UM_WEBHOOK_SECRET dans .env.

Les livraisons sont signées selon la spécification Standard Webhooks, avec un HMAC-SHA256 du corps brut dans l'en-tête webhook-signature. Répondez 2xx en moins de 10 secondes et traitez ensuite. Les relances durent un peu plus de 3 jours : dédupliquez sur eventId.

message.receivedJSON
{
  "type": "message.received",
  "eventId": "whd_...",
  "occurredAt": "2026-11-09T10:00:01.000Z",
  "data": {
    "channel": "WHATSAPP",
    "message": {
      "text": "Yes, see you Monday!"
    }
  }
}
Un événement message.received, raccourci. data.message contient l'expéditeur et le texte, plus le sujet et les pièces jointes pour un e-mail.
verify-webhook.tsTypeScript
import { createHmac } from 'node:crypto';
import { Buffer } from 'node:buffer';

// Standard Webhooks signature check, before trusting the body.
export function isValid(rawBody: string, h: Headers, secret: string) {
  const id = h.get('webhook-id');
  const ts = h.get('webhook-timestamp');
  const sig = h.get('webhook-signature') ?? '';
  if (!id || !ts || Math.abs(Date.now() / 1000 - Number(ts)) > 300) return false;
  const key = Buffer.from(secret.replace(/^whsec_/, ''), 'base64');
  const expected = createHmac('sha256', key)
    .update(`${id}.${ts}.${rawBody}`)
    .digest('base64');
  return sig.split(' ').some((s) => s === `v1,${expected}`);
}
La vérification de signature à demander. Lisez d'abord le corps brut, vérifiez, et seulement ensuite parsez le JSON.

Limites

Quelles sont les limites, honnêtement ?

Unlimited Messaging envoie depuis des comptes personnels, à un rythme humain : idéal pour les notifications et les conversations, inadapté aux envois de masse.

  1. WhatsApp est non officiel

    Votre numéro est lié comme un appareil, à la manière de WhatsApp Web, en dehors de la plateforme Business de Meta. Les messages non sollicités font bannir les numéros. Pour du WhatsApp officiel à grande échelle, utilisez l'API Cloud de Meta.

  2. L'e-mail suit votre boîte

    Un compte Gmail personnel envoie jusqu'à 500 e-mails par jour. Les newsletters et les gros volumes relèvent d'un service d'e-mailing.

  3. Les SMS au rythme d'Android

    Android demande une confirmation au-delà de 30 SMS en 30 minutes, l'app espace donc les messages. Les SMS sont décomptés de votre forfait opérateur, et le téléphone qui envoie doit être un Android.

  4. Les compromis du plan gratuit

    Sur Gratuit, les messages se terminent par "Sent with UnlimitedMessaging.app". Les médias, les messages vocaux et les webhooks demandent Moyen ou Max, qui retirent aussi ce pied de message.

FAQ

Questions sur l'envoi de messages avec les agents de code

Ilian, ingénieur logiciel senior

Écrit par

· Senior Software Engineer

Ingénieur logiciel senior, il fonde et dirige plusieurs sociétés tech. Il conçoit des produits autour des API de messagerie, de l’automatisation et de l’intégration de l’IA, et partage ici ce qu’il apprend en construisant.

Voir le profil LinkedInMis à jour le

Donnez à votre agent une boîte mail, un numéro et un téléphone.

Créez un compte gratuit, connectez le serveur MCP dans votre éditeur, et collez le prompt.