Documentation intégrateur
Serveur MCP : brancher Revoir sur votre assistant
Dernière mise à jour : 14 août 2026
Revoir expose un serveur MCP. Une fois branché, votre assistant peut aller lire vos enregistrements lui-même : plus de copier-coller de transcription dans la fenêtre de conversation, plus d'export à télécharger pour poser une question.
Vous demandez « qu'est-ce qu'on a décidé sur la tarification le mois dernier ». L'assistant cherche dans vos réunions, trouve les passages, et vous répond en citant le moment exact. Vous n'avez rien préparé.
MCP (Model Context Protocol) est le protocole standard qui permet à un assistant de parler à un outil externe. Le serveur de Revoir parle sa variante Streamable HTTP, sans état : chaque appel est indépendant, il n'y a pas de session à ouvrir ni à fermer.
L'adresse
https://api.revoir.agenceelan.ca/api/mcp
Une seule adresse, en POST. Un GET ou un DELETE répond 405 : il n'y a ni flux à écouter ni session à terminer, c'est voulu.
1. S'authentifier
Le serveur accepte deux formes de jeton Bearer sur la même adresse. Vous n'avez pas à choisir en fonction du serveur, mais en fonction de votre client.
Clé d'API
Un jeton qui commence par revoir_live_. C'est le chemin des clients qui savent porter un en-tête statique : Claude Code, n8n, vos scripts. Vous créez la clé dans Revoir, sous Réglages, onglet Clés API, et vous la collez dans la configuration de votre client.
OAuth 2.1
C'est le chemin de Claude Desktop, et de tout client qui gère l'autorisation lui-même. Vous ne créez rien à la main. Le client découvre le serveur, s'enregistre tout seul (enregistrement dynamique de client), ouvre votre navigateur sur un écran de consentement, et repart avec un jeton une fois que vous avez autorisé.
Les métadonnées de découverte sont publiées à la racine du domaine de l'API, /.well-known/oauth-protected-resource (RFC 9728) et /.well-known/oauth-authorization-server (RFC 8414). Votre client va les chercher tout seul ; vous n'avez jamais à taper ces adresses.
Un jeton OAuth expire. Quand c'est le cas, le serveur répond 401 et votre client relance le flux. Une clé d'API, elle, n'expire pas : elle se révoque.
2. Brancher Claude Desktop
Aucune ligne de commande, aucune clé à créer. Les réglages suivent l'ordre du dialogue de Claude.
- Ouvrez Réglages, puis Connecteurs, puis Ajouter un connecteur personnalisé. Nom au choix (par exemple Revoir), adresse :
https://api.revoir.agenceelan.ca/api/mcp. - Authentification : Se connecter maintenant. Claude le marque
Détecté. Revoir n'a aucun outil utilisable sans compte, donc Se connecter en cas de besoin n'apporte rien et Aucune connexion ne marchera pas : c'est pour une clé d'API, voir Claude Code plus bas. - Client OAuth : S'enregistrer automatiquement, aussi marqué
Détecté. Ne choisissez pas Utiliser l'identité publiée de Claude: Revoir ne l'annonce pas, l'autorisation échouerait. Utiliser votre propre client OAuth n'est pas nécessaire. - En-têtes de requête: n'en ajoutez aucun. C'est le jeton OAuth qui vous identifie.
- Avancée, Transport :
HTTP streamable, déjà choisi. - Ajouter. Le navigateur s'ouvre : connexion à Revoir si nécessaire, puis l'écran de consentement. L'écran revient à chaque autorisation, même pour un client déjà approuvé : c'est voulu.
- De retour dans Claude, la fiche du connecteur liste Autorisations des outils, les six outils ci-dessous, chacun sur
Nécessite une approbationpar défaut :Titre affiché dans Claude Nom de l'outil Lister les enregistrements list_recordings Rechercher dans les enregistrements search_recordings Récupérer le document d'un enregistrement get_recording_document Récupérer l'image d'un segment get_segment_frame Récupérer la transcription en direct get_live_transcript Rechercher dans la transcription en direct search_live_transcript Les six outils sont en lecture seule : passer un outil en approbation automatique (l'icône coche) ne lui donne donc aucun pouvoir d'écriture, laisser l'approbation sert seulement à voir chaque appel passer.
- Dépannage : moins de six outils listés, cliquez sur Déconnecter, puis rebranchez ; une erreur à la place de l'écran de consentement, écrivez à l'adresse de contact au bas de cette page.
3. Brancher Claude Code
Une commande, avec une clé d'API créée au préalable dans Réglages, onglet Clés API :
claude mcp add --transport http revoir https://api.revoir.agenceelan.ca/api/mcp \ --header "Authorization: Bearer revoir_live_VOTRE_CLE"
La configuration est enregistrée par Claude Code ; les appels suivants portent l'en-tête automatiquement.
Pour vérifier que le branchement répond, sans passer par un assistant :
curl -X POST https://api.revoir.agenceelan.ca/api/mcp \
-H "Authorization: Bearer revoir_live_VOTRE_CLE" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'L'en-tête Accept est obligatoire et doit annoncer application/json et text/event-stream : c'est une exigence du transport Streamable HTTP, pas une particularité de Revoir. La réponse liste les six outils ci-dessous.
4. Les six outils
Tout ce qui suit est tiré du code qui sert réellement les appels. Les six outils sont en lecture seule et travaillent sur vos propres enregistrements : le compte est déduit du jeton, jamais d'un argument, donc aucun appel ne peut atteindre le compte de quelqu'un d'autre.
list_recordings, la ligne est marquée exemple: oui pour qu'un assistant ne la présente jamais comme une de vos réunions.Les quatre premiers lisent des enregistrements terminés, une fois l'extraction passée. Les deux derniers lisent la réunion en cours, pendant qu'elle se déroule.
list_recordings
Liste vos enregistrements, du plus récent au plus ancien. C'est le point d'entrée : c'est lui qui donne les identifiants dont les deux autres outils ont besoin.
| Paramètre | Type | Description |
|---|---|---|
| search | string (optionnel) | Filtre insensible à la casse sur le titre. Sous-chaîne, pas une recherche sémantique. |
| status | enum (optionnel) | Filtre par statut exact. Valeurs acceptées : uploading, uploaded, importing, extracting, indexing, ready, failed, import_failed. |
| limit | entier 1-50 (optionnel) | Nombre maximum de résultats. Défaut 20. Au-delà de 50, l’appel est rejeté par la validation. |
Une ligne par enregistrement, champs séparés par une barre verticale :
3f2a9c10-5b6d-4e7f-8a91-0b2c3d4e5f60 | Appel Voltix - cadrage du pilote | 2026-07-27 | 42min 10s | statut: ready b81d4f0e-2c33-4a15-9f70-6de8a1c2b345 | Atelier tarification - interne | 2026-07-24 | 1h 18min | statut: ready 9c07a2b1-77de-4d02-8e41-15aa3c9d0e77 | Démo RadarLégal | 2026-07-22 | 26min | statut: extracting
Dans l'ordre : identifiant, titre, date de création, durée, statut. Un enregistrement dont la durée n'a pas pu être mesurée affiche durée inconnue. Sans résultat, l'outil répond Aucun enregistrement trouvé.
search_recordings
Recherche sémantique dans le contenu extrait : transcription, décisions, résumé. Sans recordingId, elle couvre tous vos enregistrements ; avec, elle se restreint à celui-là.
| Paramètre | Type | Description |
|---|---|---|
| query | string (requis) | Texte de la recherche. Au moins un caractère. |
| recordingId | uuid (optionnel) | Restreint la recherche à cet enregistrement. Absent, la recherche couvre tous vos enregistrements. |
| limit | entier 1-20 (optionnel) | Nombre maximum d’extraits. Défaut 8. |
Chaque résultat porte le titre de l'enregistrement, l'horodatage du passage et un score de pertinence, suivis de l'extrait :
[Atelier tarification - interne] 00:31:12 (score 0.78): On garde 25 $ par siège pour Équipe avec un minimum de 2 sièges, et on monte Business à 59 $ avec 50 heures par siège. Le dépassement reste facturé à l'org. [Appel Voltix - cadrage du pilote] 00:21:40 (score 0.71): Pascal confirme qu'il finance le projet pilote pour l'automne, à condition que le panel admin par organisation soit livré avant le démarrage.
Les extraits sont coupés à 300 caractères. C'est assez pour reconnaître le passage et pour que l'assistant vous cite le bon moment, pas pour lire la réunion. Pour le texte complet d'un passage, passez par get_recording_document.
Un recordingId qui n'existe pas, ou qui ne vous appartient pas, répond Recording not found en erreur : la réponse est la même dans les deux cas, et c'est délibéré. Seul le dossier d'exemple y échappe, et seulement tant que votre compte n'a aucun enregistrement prêt : sans recordingId, la recherche porte alors sur lui, et son identifiant y est accepté. Dès votre premier enregistrement prêt, il répond Recording not found comme n'importe quel enregistrement qui n'est pas le vôtre.
get_recording_document
Récupère le document extrait d'un enregistrement, en entier. C'est le bon outil quand vous voulez un compte rendu, une relecture complète ou une reformulation, pas quand vous cherchez une phrase précise.
| Paramètre | Type | Description |
|---|---|---|
| recordingId | uuid (requis) | Identifiant de l’enregistrement, tel que rendu par list_recordings. |
| format | "markdown" | "xml" (optionnel) | Format du document. Défaut markdown. |
| visuals | booléen (optionnel) | Inclure les éléments visuels (partages d’écran, documents à l’image). Défaut false. |
[document tronqué à 60000 / 148213 caractères - utilise search_recordings pour cibler]. Une réunion d'une heure dépasse souvent ce seuil. Quand ça arrive, la bonne réponse est search_recordings, pas de redemander le document.L'outil répond en erreur dans trois cas nets, avec un message qui dit lequel : l'enregistrement n'existe pas ou n'est pas à vous, son traitement n'est pas terminé (le statut est alors donné dans le message), ou aucun document n'a été produit.
get_segment_frame
Renvoie l'image d'un segment, comme une vraie image et non comme une URL ou du texte : votre assistant peut donc la regarder. C'est le complément de get_recording_document, qui, lui, nomme chaque segment par son segmentId et marque d'un (image) ceux qui en portent une.
| Paramètre | Type | Description |
|---|---|---|
| recordingId | uuid (requis) | Identifiant de l’enregistrement, tel que rendu par list_recordings. |
| segmentId | string (requis) | Identifiant du segment, lu dans la sortie markdown de get_recording_document (ex: seg_003). Seuls les segments dont la ligne de titre se termine par (image) en ont une. |
L'image revient en image/jpeg. Au-delà de 5 Mo, elle est refusée avec un message plutôt que renvoyée.
L'outil répond en erreur, avec un message qui dit lequel : l'enregistrement n'existe pas ou n'est pas à vous, son traitement n'est pas terminé (le statut est alors donné dans le message), ou le segment demandé n'a pas d'image en stockage.
get_live_transcript
Rend la transcription de la réunion qui se déroule en ce moment, pendant qu'elle se déroule. Elle vient de l'application de bureau, qui dépose son transcript toutes les dix secondes quand la transcription en direct est activée. Il n'y a qu'un direct à la fois par compte, donc aucun identifiant à passer.
| Paramètre | Type | Description |
|---|---|---|
| maxChars | entier 1000-60000 (optionnel) | Plafond de caractères de la réponse. Défaut 40 000. Au-delà, ce sont les entrées les plus anciennes qui sautent, pas les plus récentes. |
Un entête, puis la timeline horodatée de ce qui a été dit et de ce qui a été montré à l'écran :
# Transcription en direct - Début : 2026-07-27T14:02:11.355Z - État : en cours - Dernière mise à jour : 2026-07-27T14:31:04.912Z - Entrées : 148 - Langue : fr [00:28:31] S1 : On garde le pilote pour l'automne, mais sans la reprise de données. [00:28:44] écran : Tableur « Voltix - jalons », colonne Automne surlignée. [00:28:52] S2 : Donc je retire la reprise du devis et je renvoie ça demain.
Les locuteurs sont des codes (S1, S2), pas des noms : la transcription en direct sépare les voix, elle ne les nomme pas. L'état vaut en cours pendant la réunion, puis terminée après l'arrêt.
search_live_transcript
Retrouve un passage de la réunion en cours, ou de la dernière réunion pendant l’heure qui suit son arrêt, sans en rapatrier toute la transcription. Recherche lexicale, pas sémantique : elle compare des mots, elle ne devine pas les synonymes.
| Paramètre | Type | Description |
|---|---|---|
| query | string (requis) | Mots à retrouver. Au moins un caractère. Casse et accents ignorés ; les termes d’une seule lettre sont écartés. |
| limit | entier 1-20 (optionnel) | Nombre maximum d’entrées rendues. Défaut 8. |
Les entrées qui portent le plus de termes de la requête sortent en premier ; à égalité, la plus récente passe devant, parce que dans une réunion en cours la dernière fois qu'un sujet a été abordé compte plus que la première :
[00:28:31] S1 : On garde le pilote pour l'automne, mais sans la reprise de données. [00:12:07] S2 : Le pilote démarre quand les accès sont ouverts, pas avant.
Sans résultat, l'outil répond une phrase explicite nommant la recherche, pas une erreur. Même chose quand aucune réunion n'est en cours ni terminée depuis moins d'une heure.
5. Limites de débit
Le plafond est horaire et dépend de votre plan. Une fenêtre d'une heure, un compteur par utilisateur, quelle que soit la forme du jeton.
| Paramètre | Type | Description |
|---|---|---|
| free | 60 / heure | De quoi mener une vraie conversation : lister, chercher, ouvrir un document et regarder une image tiennent largement dedans. |
| solo | 100 / heure | Le plan personnel. |
| legacy_pro | 100 / heure | Ancien plan Pro, mêmes conditions que solo. |
| team | 500 / heure | Plan Équipe. |
| legacy_team | 500 / heure | Ancien plan Team. |
| business | 1000 / heure | Plan Business. |
| agence | 5000 / heure | Plan interne. |
Un plan inconnu retombe sur la limite free. S'ajoute par-dessus un plafond plus grossier, commun à toute l'API : 100 requêtes par minute et par adresse IP. En usage normal c'est le plafond horaire qui mord en premier.
Chaque réponse porte l'état du compteur :
RateLimit-Limit: 1000 RateLimit-Remaining: 993 RateLimit-Reset: 1786012800 RateLimit-Policy: 1000;w=3600
RateLimit-Reset est l'instant de remise à zéro, en secondes depuis l'époque Unix. Au-delà du plafond, la réponse est un 429 :
{
"error": {
"code": "RATE_LIMITED",
"message": "Rate limit exceeded. Plan business allows 1000 requests per hour.",
"details": { "limit": 1000, "plan": "business", "retryAt": 1786012800 }
}
}6. Un exemple concret
Vous avez branché Claude Desktop. Vous écrivez, en langage courant, sans rien préparer :
« Dans mes réunions du mois dernier, qu'est-ce qu'on a décidé sur la tarification, et qui devait faire quoi ensuite ? »
Ce qui se passe, sans que vous ayez à le demander :
- Claude appelle
search_recordingsavec votre question. Il reçoit les passages pertinents, avec le titre de la réunion et l'horodatage. - Si un passage mérite son contexte complet, il appelle
get_recording_documentsur cet enregistrement précis. - Il vous répond en citant les décisions et en nommant le moment de la réunion où elles ont été prises.
Autres formulations qui marchent aussi bien : « liste-moi mes enregistrements dont le traitement a échoué » (il passe par list_recordings avec status), ou « fais-moi un compte rendu de l'atelier de la semaine dernière » (il liste, trouve, puis lit le document).
7. Ce que le serveur ne fait pas
Pour éviter toute mauvaise surprise au moment du câblage, voici les limites réelles d'aujourd'hui.
- Aucune écriture, d'aucune sorte. Les six outils lisent. Un assistant branché sur Revoir ne peut pas verser une vidéo, renommer un enregistrement, le classer, ni en supprimer un, ni démarrer ou arrêter une transcription en direct.
- Pas de fichier vidéo ni d'audio. Ce que le serveur rend, c'est du texte (le document extrait, des extraits de recherche) et l'image d'un segment. Le média lui-même, vidéo comme audio, reste dans Revoir.
- Pas de session, donc pas de mémoire. Le mode sans état veut dire que chaque appel repart de zéro côté serveur. La continuité de la conversation appartient à votre assistant.
- Pas d'accès aux enregistrements des autres. Y compris dans une organisation : le serveur MCP est scopé au compte porteur du jeton. Le panel d'organisation reste le chemin pour la lecture croisée. Seule exception à cette règle de propriété : le dossier d'exemple fourni par Revoir, que les quatre outils sur les enregistrements peuvent lire, en lecture seule, tant que votre compte n'a aucun enregistrement prêt. Il disparaît des réponses dès le premier.
- Pas de notification. Le serveur répond quand on l'appelle. Pour être prévenu à la fin d'un traitement, ce sont les webhooks qu'il faut.
- Un utilisateur, un jeton. Il n'y a pas de jeton de service partagé par une équipe. Chaque personne branche son propre compte.
Contact
Une question sur cette page, un outil qui manque, un comportement qui ne correspond pas à ce qui est décrit ici :