Scopes et autorisations par rôle
Le connecteur fonctionne avec les scopesdidit:management et didit:verification. Un troisième scope, didit:staff, est annoncé mais ne concerne que les comptes du personnel Didit. Ces deux limites sont appliquées à chaque appel : le token contient les scopes que vous avez approuvés, et dans ce périmètre, votre rôle dans la console détermine ce que vous pouvez faire. L’accès effectif correspond à l’intersection des deux. Si vous n’approuvez que didit:verification, la surface de gestion reste fermée, même pour un OWNER.
Chaque outil correspond à une autorisation du backend (read:sessions, write:workflows, delete:lists, etc. ; la référence des outils indique l’autorisation de chaque outil). Le serveur vérifie cette autorisation en amont, à partir des autorisations de l’organisation renvoyées par l’introspection du token, selon la valeur de MCP_PERMISSION_MODE :
Le MCP ne va jamais au-delà de votre rôle. Un
403 sur un outil signifie que votre rôle ne dispose pas de cette autorisation, et non que la connexion entière a échoué.
Résolution inter-applications et organisation
L’API de gestion de Didit est délimitée par application (/organization/{org}/application/{app}/…). Le MCP résout le périmètre à votre place :
- Une seule organisation et une seule application → résolues automatiquement. Vous n’avez jamais à transmettre d’identifiants.
- Plusieurs applications → les outils inter-applications (
didit_session_search,didit_transaction_search,didit_case_search,didit_vendor_user_search,didit_vendor_business_search,didit_workflow_search,didit_analytics) agrègent toutes les applications en un seul appel. Chaque ligne porte sonorganization_id/application_id. - Les outils de liste par application (
didit_session_list,didit_transaction_list,didit_case_list,didit_vendor_user_list,didit_vendor_business_list,didit_workflow_list) couvrent automatiquement toutes les applications si vous n’en précisez aucune. Une demande simple comme « liste mes sessions » fonctionne donc même avec de nombreuses applications. Transmettezorganization_id+application_idpour limiter la requête à une seule application.
didit_context_get pour afficher en un seul appel toutes vos organisations et applications, avec leurs identifiants. Il indique aussi le mode de chaque application (live ou sandbox). Ne déduisez jamais l’environnement à partir du nom d’une application. didit_session_create accepte un sandbox_scenario sur les applications sandbox, pour des tests non facturés.
Contenu du catalogue hébergé
Le connecteur hébergé vous donne accès à 169 outils. Il liste aussi 17 outils Investigator, qui ne fonctionnent qu’une fois Investigator activé pour votre organisation. Deux autres outils,didit_org_top_up (paiement Stripe) et didit_org_reveal_application_api_key (secret brut), sont masqués dans le tools/list de tout appelant authentifié par OAuth. Les cinq outils de configuration de compte (didit_account_*) sont exclus des serveurs distants et refusent de s’exécuter sur ceux-ci, car un connecteur distant ne doit jamais recevoir d’identifiants en tant qu’arguments d’outil. Un serveur stdio local les conserve tous, soit 193 au total.
Chaque outil listé porte des annotations MCP (readOnlyHint, destructiveHint, openWorldHint, un title) et un outputSchema. Il porte aussi un libellé _meta["anthropic/toolGroup"] qui nomme son domaine (Sessions, Workflows et Questionnaires, Transactions (AML), etc.). Des clients comme Claude s’appuient sur les annotations pour répartir les outils du connecteur en groupes en lecture seule, en écriture et destructifs.
Branches conditionnelles
Les workflows simples sont une liste linéaire de fonctionnalités. Pour la logique conditionnelle (refuser selon un statut, orienter selon un champ extrait, conditionner une étape à une correspondance, ajouter une demande de Document AI), le MCP s’appuie sur le graphe de nœuds de Didit (la même structure que le constructeur visuel de la console). Un graphe est{ start_node, nodes } ; chaque nœud est une feature, une branch, un status (final), une action ou un webhook. Les règles de branche acceptent des opérateurs, dont fuzzy_match (champs de type chaîne, avec un seuil de similarité score de 0 à 100), sur des champs extraits comme kyc.extra_fields.profession. Un nœud de fonctionnalité DOCUMENT_AI demande des documents, par exemple un justificatif de fonds.
Modifier un workflow existant (recommandé)
Les workflows réels comportent des configurations de fonctionnalités volumineuses : une liste d’autorisation OCRdocuments_allowed peut dépasser 150 KB, sans compter les listes POA et les listes de pays associés aux numéros de téléphone. Évitez donc de lire l’intégralité du graphe puis de le renvoyer. Modifiez-le plutôt avec de petites opérations :
1
Localiser et inspecter
didit_workflow_search { workflow_id } retrouve le workflow dans toutes vos applications. didit_workflow_get_graph renvoie la structure, les grandes configurations étant résumées (la réponse ne déborde jamais ; passez include_config: true pour obtenir les valeurs brutes). didit_workflow_get_field_definitions liste les champs utilisables dans les branches ainsi que les opérateurs valides.2
Modifier avec des opérations
didit_workflow_edit_graph prend quelques petites opérations : set_next, set_node, set_branches, merge_node_config. Le MCP récupère le graphe complet côté serveur, applique les opérations, valide le résultat, crée automatiquement un brouillon et l’enregistre. Vos listes d’autorisation sont conservées octet pour octet et ne transitent jamais par la requête. Si la validation échoue, la réponse renvoie applied: false (rien n’est enregistré).3
Relire et publier
Le workflow reste un brouillon pouvant être examiné tant que vous ne le
publish pas (dans la console ou via didit_workflow_publish). La version active n’est jamais modifiée.next du nœud OCR vers une nouvelle branche, puis ajouter la branche, un nœud Declined final et une étape DOCUMENT_AI (dont le next renvoie à l’étape suivante d’origine). Les 10 autres nœuds, ainsi que leurs listes d’autorisation, restent inchangés.
« Après la vérification d’identité, si elle a été refusée, refuser ; si la profession ≈ « Software Engineer » (≥80%), demander un justificatif de fonds ; puis continuer. » → un seul nœudbranch:kyc.status == Declined→ un nœud de statutDeclined;kyc.extra_fields.professionfuzzy_match« Software Engineer » score 80 → un nœudDOCUMENT_AIde justificatif de fonds → et un chemin sinon qui revient dans le pipeline.
Une branche doit toujours avoir un chemin sinon explicite. La règle par défaut (le chemin emprunté lorsqu’aucune condition ne correspond) doit être une branche avec
rules vide, par exemple { "id": "else", "rules": [], "goto": "<liveness>" }, et non le simple next du nœud de branche. Le MCP (et le backend) convertit automatiquement le next d’un nœud de branche en branche sinon, afin qu’une branche ne s’affiche jamais comme une arête ambiguë sans sinon visible.didit_workflow_validate_graph, puis didit_workflow_set_graph (graphe complet). Vous pouvez aussi laisser didit_workflow_build_graph assembler un graphe complet à partir d’une spécification de fonctionnalités simple, sans l’enregistrer. Même un simple didit_workflow_create est enregistré sous forme de ce même graphe de nœuds : le MCP assemble votre liste features en nœuds de fonctionnalité enchaînés, se terminant par un statut de décision automatique, afin que les fonctionnalités s’exécutent réellement (il publie par défaut ; passez status: "draft" pour le laisser non publié). Voir Créer un workflow → branches et workflows basés sur des nœuds pour la structure JSON complète.
Branches sur la raison d’omission du NFC avec le MCP
Pour un nouveau graphe, demandez :« Créez un workflow brouillon avec la vérification d’identité suivie du NFC. SiL’agent doit appelernfc.skip_reasonvautDEVICE_WITHOUT_NFCouDOCUMENT_WITHOUT_CHIP, envoyez la session en cours d’examen ; sinon, approuvez-la. Conservez une branche sinon explicite et validez le graphe avant de l’enregistrer. »
didit_workflow_get_field_definitions, didit_workflow_validate_graph, puis didit_workflow_set_graph. Pour un workflow existant, demandez :
« Modifiez le workflowL’agent doit appeler26d33c04…: après son nœud NFC, redirigez chacune des sept valeurs connues denfc.skip_reasonvers « En cours d’examen », et conservez le chemin NFC réussi existant comme sinon explicite. Enregistrez un brouillon ; ne le publiez pas. »
didit_workflow_search, didit_workflow_get_graph, didit_workflow_get_field_definitions, puis didit_workflow_edit_graph. L’outil de modification applique de petites opérations côté serveur : il conserve donc les nœuds sans rapport et les grandes listes d’autorisation. Voir Brancher selon la raison pour laquelle le NFC n’a pas été exécuté pour les sept valeurs, les règles equals et in, le comportement en cas de valeur nulle et un graphe complet ordonné.
Configurations des fonctionnalités et listes d’autorisation
Leconfig d’un nœud de fonctionnalité restreint ce qu’il accepte. didit_workflow_get_feature_config_schema renvoie chaque clé acceptée par chaque fonctionnalité, avec ses types et ses valeurs par défaut. Les deux outils de catalogue (didit_workflow_get_id_verification_methods_catalog et didit_workflow_get_kyb_registry_catalog) répondent aux questions pilotées par le serveur dont dépend une configuration. La liste d’autorisation OCR canonique suit l’ordre pays → document → objet : { "<ISO3>": { "<CODE>": { "enabled": 1 } } } (par exemple { "ESP": { "P": { "enabled": 1 } } }). Le MCP normalise des formats plus simples avant la validation, de sorte que vous n’avez pas à écrire cette structure à la main :
poa_languages_allowed de PROOF_OF_ADDRESS repose sur le même principe : transmettez un tableau de langues (["es"]) ou une table de correspondance ({ "es": 1 }). Ces simplifications s’appliquent partout où vous fournissez au MCP une configuration de fonctionnalité : les fonctionnalités de didit_workflow_create, ainsi que les config des nœuds dans set_graph, edit_graph et validate_graph.
Forme de la réponse (contrat V3)
Chaque outil renvoie le JSON brut de l’endpoint REST sous-jacent. Deux points à connaître :- Les outils synchrones (workflows, facturation,
verify_*autonomes, gestion des listes) renvoient leur résultat final directement. Exploitez-le dans le même tour. - La création de session est asynchrone :
didit_session_createrenvoie uneurlque l’utilisateur doit compléter ; la décision arrive par webhook ou viadidit_session_get_decision.
node_id par entrée (id_verifications[], liveness_checks[], face_matches[], aml_screenings[], poa_verifications[], phone_verifications[], email_verifications[], database_validations[], reviews[], ainsi que, pour le KYB, registry_checks[], document_verifications[], key_people_checks[]). Voir Modèles de données et Statuts de vérification.
Gestion des webhooks
Faites en sorte qu’un webhook transmette la décision finale à votre backend, plutôt que d’interroger l’agent en continu :- L’agent appelle
didit_webhook_createune seule fois avec unlabel, votreurlHTTPS publique,webhook_version: "v3"etsubscribed_events(généralement["status.updated", "data.updated"]). La réponse masque le secret de signature, de même quedidit_webhook_getetdidit_webhook_list. Copiez-le depuis Webhooks dans la console et stockez-le dansDIDIT_WEBHOOK_SECRET. - Votre backend vérifie l’en-tête canonique X-Signature-V2 à chaque livraison :
shortenFloats→sortKeys→JSON.stringify(unicode non échappé) → HMAC-SHA256 →timingSafeEqual. Rejetez la requête siabs(now − X-Timestamp) > 300secondes. - Dédupliquez sur
event_id. Renvoyez un2xxdans un délai de 5 secondes ; déportez les traitements lourds vers une file d’attente. - Didit relance l’envoi en cas de
5xxou404, jusqu’à 2 fois (environ 1 min, puis environ 4 min), puis abandonne la livraison. Rejouez les envois échoués depuis l’onglet Livraisons de la console.
Transport et endpoints
L’endpoint est compatible avec deux générations de clients. Les clients qui fixent une version de protocole 2026-07-28 ou ultérieure dans chaque message ignorent la poignée de main
initialize et peuvent appeler server/discover. Tous les clients antérieurs (Claude Code, Cursor, clients basés sur un SDK) utilisent la poignée de main Streamable HTTP standard, sans modification. Le CORS est ouvert : les clients basés sur le navigateur (le connecteur web de Claude, MCP Inspector) peuvent atteindre /mcp et les documents de découverte depuis une autre origine. La limite de taille du corps JSON est de 25 Mo, suffisante pour une entrée de fichier en base64 de 15 Mo.
Dépannage
L'agent appelle un outil et obtient une erreur 403 ou missing_scope
L'agent appelle un outil et obtient une erreur 403 ou missing_scope
Votre rôle dans cette organisation ne dispose pas de l’autorisation requise par l’outil (par exemple, un
READER qui tente une écriture) ; l’erreur missing_scope la nomme. Si tous les outils échouent, reconnectez-vous ou relancez Log in with Didit. (Le MCP n’accepte que Bearer/OAuth : un x-api-key est rejeté par tous les outils, donc une clé API ne résoudra pas une erreur 403.)Une écriture ou une suppression n'a pas été exécutée
Une écriture ou une suppression n'a pas été exécutée
Les outils destructifs exigent une confirmation dans votre client. Approuvez l’appel, ou vérifiez que l’invite de confirmation de l’outil n’est pas refusée automatiquement.
didit_session_delete, didit_session_batch_delete et didit_org_reveal_application_api_key nécessitent en plus confirm: true dans les arguments de l’outil ; sans cela, l’appel est rejeté avant toute exécution.« organization_id is required » ou aucun résultat
« organization_id is required » ou aucun résultat
Vous avez probablement plusieurs applications. Utilisez un outil
*_search (qui couvre tout) ou exécutez didit_context_get et passez le organization_id / application_id souhaité.Les outils n'apparaissent pas dans le client
Les outils n'apparaissent pas dans le client
Vérifiez que le serveur est connecté (la plupart des clients affichent un point d’état) et que vous avez terminé Log in with Didit. Redémarrez l’hôte MCP après avoir modifié sa configuration.
didit_org_top_up et didit_org_reveal_application_api_key ne sont jamais listés sur le connecteur hébergé.Un téléversement de fichier est rejeté
Un téléversement de fichier est rejeté
Sur l’endpoint hébergé, envoyez le fichier au format
*_base64 (base64 brut ou URL data:) ; *_path ne fonctionne que sur un serveur stdio local. Les fichiers sont limités à 15 Mo et doivent être des PNG, JPG, WebP, GIF, BMP, ICO ou PDF selon leur contenu, et pas seulement selon leur extension.Sécurité
Le MCP agit avec vos autorisations réelles et peut modifier des ressources de production. Gardez « examiner les appels d’outils avant leur exécution » activé dans votre client, en particulier pour les outils d’écriture et destructifs. Le MCP lui-même ne stocke aucun secret dans votre configuration (il utilise Se connecter avec Didit), masque les clés API et les secrets de signature des webhooks dans la sortie des outils, exclut du catalogue hébergé les outils de recharge et outils liés aux clés brutes, et n’accepte jamais les identifiants de compte comme arguments d’outil sur un serveur distant. Chaque appel d’outil est inscrit dans le journal d’audit du serveur avec l’appelant, l’outil et le verdict d’autorisation.Injection de prompt
Les outils Didit renvoient ce que vos utilisateurs ont saisi ou téléversé, comme des noms, le texte de documents et les réponses aux questionnaires. La personne vérifiée contrôle ce texte : elle peut donc écrire des instructions destinées à votre agent dans un nom ou un document, et le serveur renvoie ces champs tels qu’ils ont été saisis. Un agent ne peut pas distinguer de manière fiable ce texte de vos propres instructions. Traitez donc chaque résultat d’outil comme une donnée :- Gardez l’approbation des outils activée pour les outils d’écriture et destructifs, et lisez ce que l’agent s’apprête à faire avant de l’approuver.
- Connectez-vous en tant que membre dont le rôle correspond à la tâche. Un agent qui ne fait que consulter des sessions peut utiliser un membre
READER, et le backend refuse ses écritures quoi que tente l’agent. - Testez d’abord un nouvel agent ou un nouveau prompt sur une application sandbox.
- N’approuvez ni ne refusez jamais une vérification parce qu’un texte présent dans cette vérification le demande. Fiez-vous à la décision, à ses avertissements et à votre propre examen.
Données personnelles
Les résultats d’outils peuvent contenir des données personnelles, comme des noms, des dates de naissance, des numéros de document et des liens vers des images, et votre client MCP les transmet au modèle qu’il utilise. Avant de connecter une application de production, vérifiez que votre contrat avec votre fournisseur d’IA couvre ces données, ou travaillez sur une application sandbox.Auto-hébergement
Le serveur hébergé est construit à partir de github.com/didit-protocol/mcp (MIT). Clonez-le et lancez-le avec Docker ou Node ; il s’authentifie toujours en tant qu’utilisateur Didit (il n’existe pas de mode clé API), quel que soit le transport. Les étapes d’installation se trouvent dans Installation → auto-hébergement.Variables d’environnement
.env.example dans le dépôt est un modèle à copier, et ARCHITECTURE.md explique la séparation entre serveur de ressources et serveur d’autorisation. Au démarrage, le serveur HTTP récupère le document de découverte du serveur d’autorisation et utilise les URL configurées si celui-ci est injoignable.
Référence des outils
Chaque outil, regroupé par domaine.
Exemples
Prompts et conversations de bout en bout.