Connecteur MCP

Prosperian expose un serveur MCP (Model Context Protocol) : un client compatible — claude.ai, Claude Code — s'y branche et pilote la plateforme en langage naturel.

Il vous faut un compte Prosperian, et le rôle administrateur dans l'organisation que vous voulez brancher. Le connecteur ne crée pas de compte : il donne accès au vôtre. Se connecter.

L'URL à coller

https://app.prosperian.co/api/mcp

Sur claude.ai : Réglages → Connecteurs → Ajouter un connecteur personnalisé, puis cette URL. Laissez les champs « Client ID » et « Client Secret » vides : le serveur enregistre votre client automatiquement (RFC 7591), il n'y a rien à copier.

Ce qui se passe quand vous vous branchez

La première étape est invisible — le client et le serveur négocient seuls. Les trois suivantes vous demandent quelque chose, et ce sont les seules où ça peut coincer.

  1. Le client appelle https://app.prosperian.co/api/mcp, reçoit un 401, suit le pointeur qu'il porte et lit les métadonnées de découverte (https://app.prosperian.co/.well-known/…). Il s'enregistre comme client public.
  2. Il vous envoie sur l'écran de consentement. Si vous n'êtes pas connecté, on vous demande d'abord de vous connecter — c'est le point où l'on croit le plus souvent que « ça ne marche pas ».
  3. Vous choisissez l'organisation à brancher. Elle est figée à cet instant : le jeton la portera jusqu'à sa révocation, même si vous changez d'organisation active ensuite.
  4. Vous approuvez. Le client échange son code contre un jeton, avec PKCE S256.

Le consentement est réservé aux administrateurs de l'organisation. Un connecteur remet à un tiers un accès durable qui se renouvelle seul : c'est autre chose qu'une clé qu'on copie et qu'on garde.

Si le client répond « Couldn't reach the MCP server », c'est presque toujours l'URL : elle doit être exactement celle ci-dessus, sans barre oblique finale ajoutée.

Portée du jeton

Le jeton ne vaut que pour ce serveur MCP : il est frappé pour cette URL précise et refusé ailleurs. Il porte le périmètre d'une clé API, sur l'organisation choisie à l'écran de consentement.

Les actions qui attendent votre validation

4 outils ne s'exécutent pas au premier appel. Ils déposent une demande de validation, et le client doit les rappeler une seconde fois une fois que vous avez approuvé :

  • attach_prospects — Rattache une liste de prospects à une séquence pour qu’ils y entrent.
  • start_sequence — Active une séquence pour qu’elle commence à envoyer. La mise en pause, elle, s’applique IMMÉDIATEMENT — arrêter des envois n’attend pas. Seule l’ACTIVATION attend votre validation : une séquence annoncée comme lancée peut n’être qu’en attente.
  • enrich_contact — Retrouve l’email et/ou le téléphone d’un contact à partir de son nom et de son entreprise. Consomme des crédits (email ≈ 1, téléphone ≈ 10).
  • enrich_list — Enrichit tous les prospects d’une liste existante. Rend des compteurs de LANCEMENT (les résultats asynchrones arrivent ensuite, le bilan final se lit dans l’écran de la liste, ou par l’API REST `GET /api/enrichment/list-coverage` — aucun outil MCP ne le rend). Consomme des crédits par prospect résolu (email ≈ 1, téléphone ≈ 10).

L'approbation se donne dans Prosperian, sous Agent → À valider — pas dans la conversation.

Ces garde-fous ne couvrent pas que les crédits : certains de ces outils n'en dépensent aucun mais envoient des emails à de vrais prospects.

Les 18 outils

OutilCe qu'il fait
find_leadsTrouve des prospects B2B à partir d’une description en langage naturel (« fondateurs fintech à Londres ») et crée la liste correspondante. Les noms de sociétés écrits dans la description ne filtrent pas les résultats : pour une liste de sociétés précises, passer par l’agent de l’application. Par défaut, la recherche est immédiate et gratuite. Avec `source: "database"`, elle devient PAYANTE : `max_credits` est obligatoire, `dry_run: true` rend l’estimation sans rien dépenser, et un nouvel essai avec la même `idempotency_key` ne facture jamais deux fois. Elle ne livre jamais un prospect déjà présent dans une liste non archivée de l’organisation, ni un prospect de la liste noire : ils ne sont pas facturés, et `exclusions` les compte. Quand la vérification des postes est activée pour l’organisation, une personne dont le poste est hors de la cible demandée n’est pas livrée non plus (`exclusions.hors_cible`, présent seulement s’il compte quelqu’un).
create_campaignCrée une séquence sortante et ses étapes. Rien n’est envoyé à ce stade : la séquence est créée à l’arrêt.
attach_prospectsRattache une liste de prospects à une séquence pour qu’ils y entrent. (validation requise)
start_sequenceActive une séquence pour qu’elle commence à envoyer. La mise en pause, elle, s’applique IMMÉDIATEMENT — arrêter des envois n’attend pas. (validation requise)
enrich_contactRetrouve l’email et/ou le téléphone d’un contact à partir de son nom et de son entreprise. Consomme des crédits (email ≈ 1, téléphone ≈ 10). (validation requise)
enrich_listEnrichit tous les prospects d’une liste existante. Rend des compteurs de LANCEMENT (les résultats asynchrones arrivent ensuite, le bilan final se lit dans l’écran de la liste, ou par l’API REST `GET /api/enrichment/list-coverage` — aucun outil MCP ne le rend). Consomme des crédits par prospect résolu (email ≈ 1, téléphone ≈ 10). (validation requise)
import_prospectsImporte des prospects que vous avez déjà — un CSV que vous avez lu, un export de base, un tableur — dans une liste neuve ou existante. Ne consomme aucun crédit et ne contacte personne : c’est une écriture, pas un envoi.
get_prospectRelit une fiche prospect : nom, poste, e-mail, téléphone, LinkedIn, statut d’enrichissement par canal, et les listes auxquelles elle appartient. Accepte l’identifiant du prospect ou celui de l’item de liste rendu par l’enrichissement.
list_prospect_listsListe vos listes de prospects avec leur nom. C’est ce qui permet de retrouver l’identifiant d’une liste que vous connaissez par son nom — le rattachement et l’enrichissement en demandent un.
get_list_duplicatesCompte les contacts d’une liste de prospects déjà présents dans une campagne de l’organisation (brouillon, active, en pause ou archivée) et nomme ces campagnes. Même lecture que le bouton « Exporter les contacts en double » de l’application : le chiffre est celui du fichier. La liste se désigne par son identifiant ou par son nom exact. Lecture seule, sans crédit.
request_creditsDemande à un administrateur d’autoriser une dépense de crédits, quand un outil payant a été refusé parce que l’organisation valide les dépenses de ses membres (`approbation_credits_requise`). On y reprend le site, la fonction et le coût estimé que porte le refus. Avec le type « recharge », signale aux administrateurs que le solde partagé est épuisé. Ne dépense rien et ne relance rien : une fois la demande acceptée, rappelez l’outil payant.
get_credit_requestsRelit vos dernières demandes de crédits, leur statut et la réponse de l’administrateur, ainsi que l’autorisation de dépense qu’il vous reste. Lecture seule, sans crédit.
get_campaign_statsMesures d’une campagne : entonnoir et paliers d’engagement. Lecture en direct.
list_campaignsListe les campagnes de l’organisation pour en retrouver les identifiants. Rend le statut de commande (brouillon / active / en pause / archivée) ET l’état de charge — ce qu’il reste à faire au moteur —, qui n’affirme jamais un succès. Les compteurs affichés sont approchés.
get_org_statsVue d’ensemble de l’organisation : crédits restants, prospects, listes, campagnes et rendez-vous obtenus.
get_activity_reportRapport d’activité par commercial, séquence ou liste sur une période : tâches, rendez-vous, appels, emails, réponses e-mail reçues, issues d’appel et activité LinkedIn (invitations, messages, réponses). Les deux compteurs de réponses sont ENTRANTS : ne les additionnez pas aux volumes envoyés. Ces compteurs-là ne dépendent pas de l’état de la collecte (les invitations comptent des étapes effectuées, donc un majorant). Ce sont les invités et les invités actuellement connectés qui portent leur explication — un compte non connecté ou une collecte non vérifiable se disent, ils ne se rendent pas en 0.
get_objectionsRépartition des objections par catégorie et par canal, à partir des réponses reçues et des issues d’appel. ⚠️ RUPTURE DE SÉRIE AU 2026-09-10 : la catégorie « repondeur » a été fusionnée dans « nrp » (3 745 enregistrements basculés). Les périodes qui traversent cette date ne sont PAS comparables sur ces deux catégories — un saut sur « nrp » ou un zéro sur « repondeur » y est un artefact de la fusion, jamais un changement de comportement des prospects. Ne jamais présenter une telle variation comme une tendance.
get_response_heatmapMeilleurs moments de contact par canal et par créneau. Email et LinkedIn rendent un taux de réponse, le téléphone un taux de décroché — le champ `metric` dit lequel, et les deux ne se comparent pas entre eux.

Comment les chiffres sont ventilés par liste

Un prospect peut appartenir à plusieurs listes. Les rapports le comptent une seule fois : chaque événement est attribué à la liste dans laquelle le prospect se trouvait à la date de cet événement. Il était dans plusieurs ce jour-là ? C'est son ajout le plus récent qui l'emporte, et à date d'ajout égale la liste au plus petit identifiant tranche. Tombent dans un seau « sans liste » les événements dont le prospect n'appartenait à aucune liste ce jour-là, et ceux dont le prospect n'a pas pu être identifié : les deux cas y sont indiscernables.

Ce que ça change pour vous. Les totaux par liste peuvent être plus bas qu'avant pour les prospects partagés entre deux listes : ils ne sont plus comptés dans chacune. En échange, la somme des listes égale maintenant le total, ce qui n'était pas le cas.

Et vos rapports passés ne bougent plus. Comme l'attribution est figée à la date de l'événement, importer une liste aujourd'hui ne réécrit pas un rapport de juin. Une exception, et une seule : un événement dont la date est absente ou illisible n'a pas de borne à laquelle se figer. Toutes les appartenances du prospect redeviennent alors éligibles, y compris postérieures, et cette ligne-là peut donc bouger après un import.

Vérifier sans nous croire sur parole. La répartition des objections porte un bloc de contrôle : la règle appliquée en toutes lettres, puis quatre nombres — la somme des ventilations, le nombre d'événements retenus, le nombre d'événements sans liste, et le nombre de prospects que la règle a dû arbitrer. Les deux premiers doivent être égaux : c'est exactement ce que veut dire « partition », et c'est ce qui n'était pas vrai avant. Attention à l'unité : ces trois-là comptent des événements, le dernier compte des prospects — un prospect arbitré sur dix objections y compte une fois. Ce dernier vaut toujours zéro quand vous filtrez déjà sur une liste, puisqu'il n'y a alors rien à arbitrer. Le rapport d'activité applique la même règle mais ne sert pas encore ce bloc.

Lire un zéro LinkedIn

Le rapport d'activité sert trois compteurs LinkedIn — invitations, messages, réponses. Ceux-là ne dépendent pas de l'état de la collecte : ils sont lus dans la table des interactions, un zéro y est un vrai zéro, et rien ne doit vous conduire à les masquer. Une réserve à part, qui ne vient pas de la couverture : linkedinInvitationSteps compte des étapes d'invitation effectuées, pas des invitations délivrées — le fournisseur écrit une interaction même si le prospect était déjà relation de 1er degré ou avait déjà une invitation en attente. C'est donc un majorant.

Ce qui a besoin d'être qualifié, c'est l'autre paire : linkedin.invites et linkedin.connectes, qui se déduisent du cache de relations. C'est linkedin.couverture.etat qui dit si on peut les lire : mesuree signifie que la collecte est prouvée ; non_connecte qu'aucun compte LinkedIn sain n'est branché ; inconnue que la collecte n'a pas pu être vérifiée. Dans les deux derniers cas, affichez le libellé à la place de ces deux nombres — jamais 0, qui affirmerait une absence que personne n'a mesurée.

Deux pièges d'unité. linkedin.invites compte des personnes distinctes quand linkedinInvitationSteps compte des événements : sur une organisation réelle, 668 contre 942. Et linkedin.connectes dit combien de ces personnes sont relations de 1er degré maintenant — c'est une photo, pas un taux d'acceptation : aucune date d'acceptation n'existe, donc le rapport n'est pas comparable d'une période à l'autre.

Enfin, linkedin.exclut nomme ce qui n'entre pas dans ces compteurs. Les campagnes de commentaires et les veilles d'intent, notamment, n'écrivent aucune interaction : un client qui les fait tourner verra des zéros ici sans que rien ne soit en panne.

Retirer un connecteur

Paramètres → API et développeurs → Connecteurs MCP liste ce qui est branché : quel client, par qui, quand, et son dernier appel. Révoquer coupe l'accès immédiatement ; vos clés API ne sont pas affectées.

Claude Code

Le connecteur OAuth marche aussi en ligne de commande :

claude mcp add --transport http prosperian https://app.prosperian.co/api/mcp
Connecteur MCP — Documentation Prosperian