Aller au contenu

Connecteurs API

Plutôt que de copier vos données dans une base de connaissance, vous pouvez laisser l’IA interroger votre API en direct. Vous enregistrez une connexion (URL + authentification + opérations), et chaque opération en lecture devient un outil que le modèle peut appeler dans sa réflexion, comme la recherche web ou le RAG agentique.

Au portail (Intégrations → Connecteurs API) ou via l’API. Une connexion porte :

  • un nom et une URL de base (https://…) ;
  • une authentification : none, api_key (header ou query), bearer, basic, ou oauth2 (Google Drive et tout autre fournisseur OAuth2 — cf. section dédiée ci-dessous ; une bibliothèque SharePoint se branche, elle, sur l’application Microsoft de votre organisation, sans rien à saisir : cf. Synchroniser une bibliothèque SharePoint). Le secret est chiffré au repos (AES-256-GCM, une clé dédiée par connexion) ;
  • des headers statiques optionnels (auth_config.headers), envoyés sur chaque requête — typiquement une version d’API imposée par le fournisseur, ex. Notion : "auth_config": { "headers": { "Notion-Version": "2022-06-28" } }. Jamais de secret ici : ces headers ne sont pas chiffrés (et voyagent dans l’export du connecteur) ; les headers Authorization et Cookie y sont refusés, le secret passe par credential ;
  • une liste d’opérations définies à la main.
Fenêtre de terminal
curl https://api.miraca.fr/v1/connections \
-H "Authorization: Bearer $MIRACA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Mon Airtable",
"base_url": "https://api.airtable.com",
"auth_type": "bearer",
"credential": "patXXXX.XXXX",
"operations": [
{
"name": "list_records",
"description": "Liste les enregistrements d une table.",
"method": "GET",
"path": "/v0/{base_id}/{table}",
"params": [
{ "name": "base_id", "in": "path", "type": "string", "required": true },
{ "name": "table", "in": "path", "type": "string", "required": true },
{ "name": "filterByFormula", "in": "query", "type": "string" }
],
"access": "read"
}
]
}'

La réponse renvoie le slug de la connexion (identifiant stable par compte) — c’est lui qui sert à l’activer dans une requête de chat. Le secret n’est jamais renvoyé.

ChampRôle
namenom de l’opération → suffixe de l’outil exposé au modèle (<slug>__<opération>).
description(optionnel) contexte d’usage injecté dans la déf d’outil — aide fortement le modèle à savoir quand/comment l’appeler.
methodGET, POST… (une lecture peut être un POST, ex. une requête de recherche).
pathgabarit relatif à base_url ; les {param} sont substitués depuis les arguments. Peut aussi être une URL ABSOLUE (https://…) — elle court-circuite alors base_url pour cette opération précise. Utile quand un même jeu de credentials (ex. les mêmes tokens OAuth2) couvre plusieurs hôtes d’API — cf. l’exemple Google Docs ci-dessous.
paramsliste typée. in ∈ path | query | body ; type ∈ string | integer | number | boolean ; required.
accessread (défaut) | write. Les deux sont exécutées ; write ajoute un marqueur « modifie des données » à la déf, et n’est appelable que par une clé qui a l’accès en lecture et écriture (voir Permissions).
examples(optionnel) tableau JSON d’exemples d’appel ([{…args…}]) → une « bibliothèque » que le modèle peut imiter.

Au niveau de la connexion, un champ doc_url (optionnel) pointe vers la doc de l’API : il est ajouté au contexte des outils, et l’IA peut le lire via web_fetch si la recherche web est active.

Une opération peut rendre un fichier plutôt que du JSON. Le contenu est alors extrait automatiquement avant d’arriver au modèle : un classeur devient un tableau par feuille, un document Word et un PDF deviennent du texte. Aucun réglage à poser — la reconnaissance se fait sur la réponse elle-même.

Formats extraits : PDF, DOCX, XLSX. Un fichier d’un autre format binaire (image, archive, vidéo) est signalé comme illisible plutôt que rendu en caractères inintelligibles ; les formats Office d’avant 2007 (.doc, .xls) sont refusés avec la marche à suivre (les convertir).

Le document est aussi déposé dans l’espace de travail de la conversation : aux questions suivantes, il est relu sur place au lieu d’être retéléchargé, et un fichier trop long pour tenir dans une réponse y reste lisible en entier.

Exemple, pour un fichier importé dans Google Drive (un .xlsx envoyé depuis un ordinateur, par opposition à un Google Sheets natif) :

{
"name": "download-file",
"method": "GET",
"path": "/files/{fileId}?alt=media",
"access": "read",
"description": "Télécharge le contenu d'un fichier IMPORTÉ (xlsx, pdf, docx…). Pour un Google Docs/Sheets/Slides NATIF, utilisez export-file.",
"params": [
{ "name": "fileId", "in": "path", "type": "string", "required": true },
{ "name": "supportsAllDrives", "in": "query", "type": "boolean" }
]
}

Le ?alt=media est écrit dans le gabarit de chemin, donc figé : sans lui, la même URL rend les métadonnées du fichier au lieu de son contenu, et rien ne le signalerait. Tout paramètre qui décide de la nature de la réponse gagne à être posé là plutôt que laissé au modèle.

Certains fournisseurs (Google Drive en premier lieu) exigent OAuth2 plutôt qu’un secret statique. Le mécanisme est générique (réutilisable pour tout fournisseur OAuth2) — Google n’est qu’un préréglage.

Créer l’app côté Google (une fois, dans la console Google Cloud de votre Workspace) :

  1. Créez un projet, puis un écran de consentement OAuth de type Interne (« Internal ») — pas besoin de vérification Google, aucun plafond d’utilisateurs, refresh token de durée normale.
  2. Activez sur le projet les quatre API que le connecteur appelle : Google Drive, Google Docs, Google Sheets et Google Slides. Une API non activée répond 403 SERVICE_DISABLED à chaque opération de son format (lecture d’un tableur, écriture d’un document), alors que l’exploration du Drive fonctionne.
  3. Créez des identifiants OAuth client ID (type « Application Web »), et déclarez cette entrée dans URI de redirection autorisés (le portail l’affiche et la copie pour vous) :
    https://app.miraca.fr/api/integrations/oauth/callback
    Attention au champ : c’est bien URI de redirection autorisés, et non « Origines JavaScript autorisées », juste au-dessus dans la même page. La correspondance est stricte au caractère près (pas de slash final), et Google met parfois quelques minutes à propager un ajout.
  4. Notez le Client ID et le Client secret générés.

Créer la connexion côté Miraca (portail, auth_type: "oauth2") :

{
"name": "Google Drive",
"base_url": "https://www.googleapis.com/drive/v3",
"auth_type": "oauth2",
"auth_config": {
"authorize_url": "https://accounts.google.com/o/oauth2/v2/auth",
"token_url": "https://oauth2.googleapis.com/token",
"scopes": ["https://www.googleapis.com/auth/drive.readonly"],
// quirk Google : force l'émission d'un refresh_token à CHAQUE consentement
"extra_authorize_params": { "access_type": "offline", "prompt": "consent" }
},
"credential": { "client_id": "…", "client_secret": "…" },
"operations": [
{
"name": "list_files",
"method": "GET",
"path": "/files",
"access": "read",
"params": [
{ "name": "q", "in": "query", "type": "string" },
{ "name": "pageSize", "in": "query", "type": "integer" },
{ "name": "pageToken", "in": "query", "type": "string" },
{ "name": "fields", "in": "query", "type": "string" }
]
}
]
}

Le param q scope l’opération à un dossier précis, ex. "'<folder_id>' in parents" (fixé en paramètre fixe de la config de synchronisation, cf. section suivante) — sans lui, list_files liste tout le Drive accessible à l’app.

Au portail, cliquez ensuite « Connecter » sur la carte du connecteur : vous êtes redirigé vers l’écran de consentement Google, puis ramené au portail une fois l’autorisation accordée. La finalisation du consentement (l’échange du code contre les tokens) se fait uniquement au portail — un navigateur est nécessaire, ce n’est pas exposé sur /v1. La création de la connexion (avec client_id/client_secret), elle, reste possible via l’API.

Le consentement se lance depuis la page Intégrations et se termine sous la session Miraca de la personne qui l’a demandé (voir la note « Qui peut connecter, et sous quel compte », plus haut) : le navigateur du retour n’a pas à être celui du départ. Si le retour affiche « Session expirée, réessayez. », la demande a expiré (elle vaut dix minutes) : relancez-la avec « Connecter ».

Le menu « Nouveau connecteur » propose des modèles prêts à l’emploi : l’URL, les opérations, la description et le descriptif sont déjà remplis, il reste à coller votre jeton. Chaque modèle est vérifié contre la documentation officielle de son API.

ModèleCe qu’il couvreÀ préparer
AirtableLecture et écriture des enregistrements, découverte des bases, des tables et des champsJeton d’accès personnel avec data.records:read, data.records:write et schema.bases:read, accordé à chaque base
GitHubUn dépôt en lecture seule : code, arborescence, historique, issues et pull requestsJeton en lecture sur le dépôt ; remplacer PROPRIETAIRE/DEPOT aux quatre endroits indiqués
Google DriveFichiers du Drive, contenu des Docs, Sheets et Slides, en lecture et écritureApplication OAuth (ci-dessus), avec les quatre API activées
HubSpotObjets du CRM, recherche, pipelines, propriétaires, associations, en lecture et écritureJeton pat- : clé de service, ou application privée déjà créée, avec les droits crm.objects.* voulus
NotionPages, bases de données et blocs partagés avec l’intégration, en lecture et écritureJeton d’intégration ; partager les pages et bases concernées avec elle
PennylaneFactures clients et fournisseurs, clients, fournisseurs, produits, transactionsJeton de l’API externe v2
PipedriveDeals, personnes, organisations, activités, pipelines, en lecture et écritureJeton d’API personnel ; remplacer VOTRE-DOMAINE par votre sous-domaine
StripePaiements, clients, factures, abonnements, solde, virements, en lecture seuleClé restreinte en lecture seule, de préférence à la clé secrète

Deux choses à savoir :

  • Notion : le modèle parle la version 2022-06-28 de l’API. Une base à laquelle Notion a ajouté une seconde source de données n’y est plus lue ; l’assistant le signale au lieu de conclure que la base n’existe pas.
  • Un connecteur est une copie de son modèle : il ne suit pas ses évolutions. Quand nous corrigeons un modèle, la correction est aussi appliquée aux connecteurs dont les opérations ou le descriptif sont restés identiques au modèle ; ce que vous avez retouché reste le vôtre.

Le modèle Google Analytics du menu « Nouveau connecteur » branche une propriété GA4 en lecture seule : l’assistant peut alors répondre à « quelles pages ont été les plus vues le mois dernier ? », « d’où vient le trafic ? » ou « combien de visites cette semaine par rapport à la précédente ? ». Il repose sur l’OAuth2 décrit ci-dessus, avec la même application Interne de votre Google Workspace.

  1. Dans le projet Google Cloud de votre application OAuth, activez deux API : Google Analytics Data API (les rapports) et Google Analytics Admin API (la liste des propriétés). Sans elles, chaque appel est refusé (403, « API has not been used in project »).
  2. Relevez l’identifiant de la propriété dans Google Analytics : Administration, puis Détails de la propriété. C’est un nombre (312345678), pas l’identifiant de mesure G-XXXX.
  3. Au portail, choisissez le modèle, puis remplacez ID_PROPRIETE par ce nombre à quatre endroits : le chemin des opérations rapport, rapport-temps-reel et lire-metadonnees, et la description. Saisissez le Client ID et le Client secret.
  4. Cliquez « Connecter » en étant identifié à Google avec un compte qui a au moins le rôle Lecteur sur la propriété.
OpérationCe qu’elle rend
rapportles métriques d’une période, ventilées par dimensions (pages, sources, pays, appareils, dates), avec tri, filtres et comparaison de deux périodes
rapport-temps-reell’activité des 30 dernières minutes
lire-metadonneestoutes les dimensions et métriques de la propriété, personnalisées comprises
lister-proprietesles comptes et propriétés visibles par le compte connecté

Activez-la avec tools_enabled, en référençant son slug préfixé par connection: :

Fenêtre de terminal
curl https://api.miraca.fr/v1/chat/completions \
-H "Authorization: Bearer $MIRACA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "mistral-large",
"messages": [{ "role": "user", "content": "Combien d enregistrements dans la table Clients ?" }],
"tools_enabled": ["connection:mon-airtable"]
}'

Toutes les opérations de la connexion sont alors proposées au modèle, qui choisit lesquelles appeler. Les connecteurs coexistent avec la recherche web et le RAG agentique dans la même réflexion : tools_enabled: ["web_search", "connection:mon-airtable"] + knowledge_base.

Une réponse volumineuse (8 000 caractères ou plus) est rendue au modèle dans la limite de la place qui reste dans sa fenêtre, et gardée en entier dans l’espace de travail quand la requête en a un (une discussion de l’assistant, ou le paramètre workspace) : le modèle la relit par morceaux ou la traite dans un script, au lieu de rappeler l’API. Cette copie de travail est effacée 24 heures après la dernière activité (cf. Espaces de travail).

Pour n’exposer qu’une opération (au lieu de toutes), suffixez le slug par : + le nom de l’opération : tools_enabled: ["connection:mon-airtable:list_records"]. Seule cette déf d’outil est injectée — utile pour les automatisations (Make/n8n) qui savent ce qu’elles veulent, et pour réduire le contexte (donc le coût) sur les connecteurs riches en opérations.

Deux niveaux :

  • Scope de clé connections : une clé API doit porter ce scope pour utiliser le moindre connecteur (choisi à la création/édition de la clé). Sans lui, les connecteurs ne sont pas proposés au modèle.

  • Accès par connexion : par défaut, toutes vos clés peuvent utiliser un nouveau connecteur (toutes ses opérations, lecture comme écriture). Au portail (menu Accès du connecteur), vous réglez un niveau pour toutes les clés du compte, puis clé par clé :

    NiveauCe que la clé peut appeler
    Aucun accèsRien : le connecteur ne lui est pas proposé.
    Lecture seuleLes opérations read. Une opération write est refusée.
    Lecture et écritureToutes les opérations.

    Une clé a le plus élevé des deux niveaux : le sien et celui de toutes les clés. Vous pouvez donc laisser tout le compte en lecture seule et n’ouvrir l’écriture qu’à une clé. Le niveau vaut partout où la clé sert : agent (/v1/chat/completions), exécution de code et serveur MCP.

MéthodeRouteRôle
GET/v1/connectionsliste
POST/v1/connectionscréer
GET/v1/connections/{slug}détail
PATCH/v1/connections/{slug}modifier (credential omis = inchangé)
DELETE/v1/connections/{slug}supprimer
POST/v1/connections/{slug}/syncdéclencher une synchronisation → { ok, outcome }

Toutes ces routes exigent le scope connections. Le POST .../sync lance la synchronisation configurée (cf. section suivante) et facture l’embedding sur la clé de l’appel — c’est la parité API du bouton « Synchroniser » du portail (en plus de la planification automatique).

Synchroniser une connexion vers une base de connaissance

Section intitulée « Synchroniser une connexion vers une base de connaissance »

Pour rendre les données d’un connecteur cherchables, la voie recommandée est de les synchroniser dans une base de connaissance : Miraca aspire les enregistrements d’une opération de liste et les enregistre comme documents de la base (un enregistrement = un document, clé d’upsert = external_id). La recherche reste alors unifiée sur la base — même pertinence, mêmes facettes, et surtout la recherche sémantique — pour n’importe quel connecteur, y compris ceux dont l’API n’offre aucune recherche texte.

Dans la modale du connecteur, section Synchronisation :

  1. Opération de liste : une opération read qui liste les enregistrements. Miraca pagine automatiquement, à condition que l’opération déclare le paramètre de pagination de l’API (cf. Pagination suivie plus bas).

  2. Paramètres fixes (optionnel) : arguments requis par l’opération en plus de la pagination. Cas typique — une base Airtable dont la table est un paramètre (GET /{table}) : mettez {"table":"Entreprises"}. Une synchronisation cible une source ; pour plusieurs tables, créez une config (ou un connecteur) par table.

  3. Base cible : le slug de la base de connaissance qui reçoit les documents.

  4. Correspondance des champs (map) : comment transformer un enregistrement en document. Cliquez Détecter pour pré-remplir identifiant / titre / date / lien / version à partir d’un échantillon de l’opération (ajustez ensuite ; les facettes restent à définir car elles dépendent de votre base). Chaque champ est un nom de champ (top-level, chemin pointé, ou fields.X façon Airtable) ou un gabarit {champ} composant plusieurs champs.

    • external_id (requis) — l’identifiant stable de l’enregistrement (clé d’upsert) ;
    • title (requis) — le titre du document ;
    • text (optionnel) — le contenu indexé ; par défaut, tous les champs de l’enregistrement sont sérialisés en lignes « Clé : valeur » (bon pour le sémantique) ;
    • date (optionnel) — la date métier du document (doc_date) ;
    • url (optionnel) — un lien vers l’enregistrement, ex. https://airtable.com/appXXX/{id} ;
    • facets (optionnel) — une correspondance clé de facette → champ, pour filtrer ensuite ;
    • version (optionnel) — un champ de date de modification (ex. updated_at) : un document n’est ré-indexé que si cette valeur change → synchronisations incrémentales peu coûteuses, insensibles aux champs volatils (liens signés, etc.). Sinon, la détection se base sur le contenu.
  5. Découpage : simple (déterministe, gratuit, bon défaut pour des enregistrements courts), whole (un enregistrement = un extrait : le plus juste quand chaque fiche synchronisée est déjà une unité complète, contact ou facture) ou ai (un modèle re-segmente le document selon l’intention de la base et remplit les facettes, utile pour des documents longs ou quand la base a des facettes à extraire). En mode ai, choisissez le modèle de découpage et la clé qui porte la consommation. Sans choix explicite, c’est la dernière clé API créée sur le compte qui est retenue — les clés internes de Miraca (assistant, accès MCP d’une personne, copilote) n’entrent jamais dans ce choix. En mode ai, cette clé doit avoir la permission chat : sans elle, chaque document échoue et la synchronisation se termine en « terminée avec N erreurs ». L’embedding, lui, est toujours facturé sur cette clé. Si vous ne précisez pas de découpage, la synchronisation suit le réglage par défaut de la base cible.

  6. Fréquence : manuelle (bouton uniquement) ou automatique — quotidienne, hebdomadaire ou mensuelle. Miraca resynchronise alors tout seul à cette cadence (vous pouvez toujours lancer une sync à la main entre deux).

Cliquez Synchroniser : Miraca reflète l’état de la source dans la base (vraie synchronisation miroir) :

  • ajouts / modifications → (ré)indexés par external_id. Un document n’est ré-embeddé que si son contenu a changé (empreinte) → les relances sont peu coûteuses ;
  • suppressions → les documents de ce connecteur disparus de la source sont supprimés de la base (réconciliation). Garde-fou : si la source ne renvoie aucun enregistrement (auth cassée, mauvaise config), rien n’est supprimé : le miroir n’est jamais vidé par erreur. Rien n’est supprimé non plus tant que la liste n’a pas été lue en entier (cf. « Liste incomplète » ci-dessous) : un document absent d’une liste partielle n’a pas forcément disparu.

Seuls les documents issus de ce connecteur sont concernés : vos documents ajoutés à la main ou synchronisés depuis une autre source ne sont jamais touchés. La synchronisation est gratuite hormis l’embedding des documents (re)indexés (facturé sur la clé choisie).

Une API rend une longue liste par pages. La synchronisation demande des pages de 100 enregistrements (quand l’opération a un paramètre de taille : limit, pageSize, per_page, maxRecords) et suit la liste jusqu’au bout, si l’opération déclare le paramètre qui porte la page suivante, ou si la réponse donne elle-même l’adresse de la page suivante. Les formes reconnues :

Ce que l’API renvoieParamètre à déclarer dans l’opérationExemples
un curseur au premier niveau de la réponse (offset, next, next_cursor, nextCursor, nextPageToken, cursor)un paramètre dont le nom contient cursor, offset ou pageToken (cursor, start_cursor, offset, pageToken)Airtable, Notion, Pennylane, Google
paging.next.afterafterHubSpot
has_more: true, sans curseurstarting_after (reçoit l’identifiant du dernier objet de la page)Stripe, listes
has_more: true et next_pagepageStripe, recherche
additional_data.next_cursorcursorPipedrive v2
additional_data.pagination.next_startstartPipedrive v1
@odata.nextLink (l’adresse complète de la page suivante)aucun : le lien est suivi tel quel, à condition de pointer vers l’hôte du connecteurMicrosoft Graph (SharePoint, OneDrive)

Un lien @odata.nextLink qui désigne un autre hôte que celui du connecteur n’est jamais suivi (le jeton ne part que vers cet hôte) : la synchronisation s’arrête avec une erreur, sans rien supprimer.

Deux plafonds bornent une synchronisation : 50 000 enregistrements et 600 pages.

Ne sont pas suivies : la pagination par numéro de page (page=2), la suite donnée dans un en-tête Link (GitHub), et le décalage numérique que la réponse ne renvoie pas (offset=100). Dans le dernier cas, la synchronisation s’arrête à la première page sans pouvoir le détecter : restreignez la liste avec les paramètres fixes pour qu’elle tienne en une page.

// exemple de config `sync` (champ de la connexion, via l'API ou pré-rempli au portail)
{
"operation": "list_records", // une opération de LISTE déclarée en lecture
"args": { "table": "Entreprises" },
"target_kb": "crm-airtable",
"map": {
"external_id": "id",
"title": "fields.Nom",
"date": "fields.Créé le",
"url": "https://airtable.com/appXXX/{id}",
"facets": { "ville": "fields.Ville", "statut": "fields.Statut" }
},
"chunking": "ai", // "simple" | "ai" | "whole" ; absent = défaut de la base cible
"chunk_model": "mistral-large", // (mode ai) modèle de découpage
"chunk_size": 1000, // (mode simple) taille cible des extraits, 200-6000
"key": "<token de clé>", // (optionnel) clé portant la conso ; défaut = dernière clé du compte
// (jamais une clé interne) ; le mode "ai" exige la permission `chat`
"schedule": "daily" // "manual" (défaut) | "daily" | "weekly" | "monthly"
}

Fraîcheur : une synchronisation planifiée (schedule) se rafraîchit une fois par jour / semaine / mois. Pour une donnée qui doit être à la seconde, préférez le connecteur comme outil de l’agent (interrogation en direct).

Le modèle Microsoft SharePoint (bibliothèque de documents) du menu « Nouveau connecteur » copie les fichiers d’une bibliothèque de documents SharePoint (Microsoft 365) dans une base de connaissance et la tient à jour, par la synchronisation miroir décrite plus haut. L’assistant et l’API retrouvent ensuite ces documents, et les citent, comme ceux de n’importe quelle base. Le connecteur est en lecture seule : il ne modifie rien dans SharePoint.

Il n’y a rien à saisir pour l’authentification : le connecteur utilise l’application Microsoft de votre organisation, ou celle de Miraca. Pas de Client ID, pas de secret.

  • Un Microsoft 365 de travail. Un compte Microsoft personnel (outlook.com) n’a pas de SharePoint et ne convient pas.
  • Une application Microsoft utilisable par votre organisation. Miraca fournit la sienne, qui apparaît d’elle-même dans Portail › Intégrations › Applications OAuth ; vous pouvez aussi y déclarer la vôtre. Sans application utilisable, le connecteur ne se crée pas, et la fenêtre renvoie à cette section.
  • L’approbation par l’administrateur de votre Microsoft 365. Le connecteur demande la lecture des fichiers et des sites (Files.Read.All, Sites.Read.All). Dans un Microsoft 365 aux réglages par défaut, il arrive qu’un utilisateur ne puisse pas les accorder seul : si Microsoft demande l’approbation d’un administrateur (erreur AADSTS90094), l’administrateur approuve l’application une fois, pour toute l’organisation. La page Compte connecté explique où trouver le lien d’approbation (section « Pour l’administrateur : Microsoft »). Si votre organisation a déclaré sa propre application, elle doit déclarer dans Microsoft Entra les autorisations déléguées Files.Read.All et Sites.Read.All.
  • Un compte qui lit la bibliothèque. Le connecteur lit ce que lit le compte qui l’a connecté, et rien de plus. Un compte de service, auquel seule cette bibliothèque est partagée, vaut mieux qu’un compte nominatif.
  1. Créer le connecteur. Intégrations › Connecteurs API › Nouveau connecteur, puis le modèle Microsoft SharePoint (bibliothèque de documents). La section Authentification dit qu’il n’y a rien à saisir. Donnez un nom, et choisissez la base cible dans la section Source : c’est la base de connaissance qui recevra les documents. Cliquez sur Créer le connecteur.
  2. Le connecter à Microsoft. Ouvrez le connecteur (clic sur sa carte, la mention « Autorisation Microsoft à terminer » le signale), puis Connecter à Microsoft, et connectez-vous avec le compte qui lit la bibliothèque. Vous revenez au portail une fois l’accès accordé, et la fenêtre indique Connecté.
  3. Choisir la bibliothèque. Rouvrez le connecteur : la section Bibliothèque SharePoint propose le champ Adresse du site SharePoint. Collez l’adresse que montre votre navigateur, par exemple https://votre-organisation.sharepoint.com/sites/Equipe (celle d’une page ou d’une bibliothèque du site convient, ce qui suit le nom du site est ignoré), puis Trouver les bibliothèques. Cliquez sur celle à synchroniser : elle est posée dans les paramètres fixes de la synchronisation (drive_id).
  4. Régler la fréquence, puis enregistrer. La fréquence est Manuelle au départ : choisissez-en une automatique (quotidienne, hebdomadaire, mensuelle) une fois la bibliothèque choisie. Cliquez sur Enregistrer.
  5. Synchroniser. Sur la carte du connecteur, Synchroniser. La première synchronisation lit chaque fichier ; les suivantes ne reprennent que ceux qui ont changé.

Si Trouver les bibliothèques échoue, le message dit pourquoi :

MessageCe qu’il faut faire
« Adresse de site non reconnue »Collez l’adresse d’un site de la forme https://organisation.sharepoint.com/sites/NomDuSite (ou /teams/…). Le site racine de l’organisation et un sous-site ne se devinent pas de l’adresse.
« Aucun site SharePoint à cette adresse »Vérifiez l’adresse. Le compte connecté ne voit peut-être pas ce site.
« Le compte Microsoft qui a connecté ce connecteur n’a pas accès à ce site… »Donnez au compte un accès en lecture au site, ou faites approuver l’application par l’administrateur de votre Microsoft 365 (cf. plus haut).
« Microsoft a refusé le jeton du connecteur : reconnectez-le »Reconnecter à Microsoft dans la fenêtre du connecteur.
« Microsoft limite temporairement les appels »Patientez quelques instants et recommencez.

Chaque fichier de la bibliothèque, sous-dossiers compris, devient un document de la base. Son titre est le nom du fichier, sa date celle de sa dernière modification, et son lien renvoie vers le fichier dans SharePoint.

Le texte n’est lu que pour les formats que Miraca sait extraire, reconnus à l’extension du nom : PDF, Word (.docx), Excel (.xlsx), texte (.txt, .md, .markdown, .text, .log), tableaux (.csv, .tsv), pages web (.html, .htm) et .rtf. Tout autre fichier est indexé par ses métadonnées seules (nom, date, lien), sans contenu : images, archives, présentations (.pptx) et anciens formats Office (.doc, .xls) en font partie, de même qu’un PDF scanné qui ne contient aucun texte. Au plus 60 000 caractères de texte sont retenus par fichier.

Ne sont jamais synchronisés : les dossiers, les éléments supprimés, les carnets OneNote et les listes SharePoint (ce ne sont pas des fichiers). Un OneDrive personnel n’est pas l’objet de ce connecteur : chaque personne lit le sien en connectant son compte (page Compte connecté).

Le bouton Prévisualiser montre le nom, la date et le lien des dix premiers fichiers : leur texte n’est lu qu’à la synchronisation.

La synchronisation est un miroir : la base reflète la bibliothèque telle que le compte connecté la lit.

  • Un fichier ajouté est indexé ; un fichier modifié, renommé ou déplacé est relu et ré-indexé ; un fichier inchangé n’est pas relu et ne coûte aucun embedding.
  • Un fichier supprimé de la bibliothèque, ou dont le compte connecté perd l’accès, disparaît de la base à la synchronisation suivante.
  • Garde-fous : si Microsoft ne renvoie aucun fichier, si la synchronisation est arrêtée, ou si la lecture de la liste échoue en route, rien n’est supprimé. Une bibliothèque trop longue pour être lue en entier (plus de 50 000 éléments, dossiers compris, ou 600 pages) est indexée jusqu’au plafond : la carte affiche « liste incomplète » et aucune suppression n’est répercutée tant que c’est le cas (voir « Liste incomplète » plus haut). Si Microsoft limite les appels pendant la lecture des fichiers, la synchronisation s’arrête sans insister, la carte affiche « interrompue » avec le nombre de fichiers restants, et la passe suivante reprend.
  • 15 Mo par fichier. Au-delà, le fichier est indexé par ses métadonnées seules, et la synchronisation se termine en « terminée avec N erreurs » en le nommant.
  • Microsoft limite le débit des appels. Quand il demande d’attendre, Miraca attend le délai indiqué (deux minutes au plus). Au-delà, ou si Microsoft continue de refuser, la synchronisation s’arrête pour ne pas insister, sans rien supprimer de la base, et la suivante reprend où elle s’était arrêtée. Sur une grande bibliothèque, lancez la première synchronisation en dehors des heures de travail.
  • Le connecteur tient à la personne qui l’a connecté. Si son compte est désactivé ou si Microsoft révoque ses accès, la synchronisation s’arrête avec un message qui demande de Reconnecter à Microsoft, et la carte du connecteur le propose. Rien n’est supprimé entre-temps.
  • Retirer au compte son accès à la bibliothèque ne demande pas de reconnecter : la synchronisation échoue alors sur l’erreur d’accès que rend Microsoft, sans rien supprimer. Rendez l’accès dans SharePoint, puis relancez.

Le modèle déclare aussi des opérations en lecture seule, que l’assistant peut appeler en direct (tools_enabled: ["connection:<slug>"]) pour retrouver une bibliothèque ou un fichier. Pour répondre sur le texte des documents, la recherche dans la base synchronisée est la voie à privilégier.

OpérationCe qu’elle rend
trouver-siteun site d’après le nom de son adresse (contoso.sharepoint.com, Equipe)
chercher-sitesles sites qui correspondent à un mot
lister-bibliothequesles bibliothèques de documents d’un site (leur id est le drive_id)
lister-racine, lister-dossierle contenu de la racine, ou d’un dossier, d’une bibliothèque
chercher-fichiersles fichiers d’une bibliothèque qui correspondent à un mot
lister-fichierstoute la bibliothèque, sous-dossiers compris : sert à la synchronisation

Une liste rendue en direct est paginée par Microsoft et n’est suivie que par la synchronisation : en direct, elle peut être partielle, et un total qu’on en tirerait serait faux.

La création par POST /v1/connections est possible sans le portail : auth_type vaut oauth2, auth_config porte {"application": "microsoft"} (et, au choix, une liste scopes de lecture), base_url est https://graph.microsoft.com/v1.0, et aucun credential n’est envoyé. La réponse porte "application": "microsoft". Le connecteur doit appartenir à une organisation qui a une application Microsoft utilisable. Seuls les scopes de lecture du modèle sont acceptés, et tout chemin d’opération qui sort de graph.microsoft.com est refusé : le jeton ne part pas ailleurs.

Le consentement reste réservé au portail (bouton Connecter à Microsoft), comme pour tout connecteur OAuth2. Pour reprendre les opérations du modèle, créez le connecteur au portail puis lisez-le par GET /v1/connections/{slug}. La bibliothèque se pose dans la configuration de synchronisation, sync.args valant {"drive_id": "<id de la bibliothèque>"} ; l’opération lister-bibliotheques en donne l’identifiant.

Une configuration de connecteur est portable : vous pouvez l’exporter pour la partager (avec un collègue, entre deux comptes, ou pour la versionner) puis la réimporter ailleurs.

  • Exporter : sur la carte d’un connecteur, le bouton Exporter télécharge un fichier <slug>.connection.json. Il contient l’URL de base, le type d’auth, les opérations, la description, le schéma et la configuration de recherche, mais jamais le secret (clé/token). Pour oauth2, authorize_url/token_url/scopes (structurels) sont exportés, mais jamais client_id/client_secret ni les tokens obtenus. Un connecteur branché sur l’application Microsoft (bibliothèque SharePoint) s’exporte avec application: "microsoft", jamais l’identifiant d’une application : importé, il se rebranche sur l’application Microsoft de l’organisation qui l’importe. Côté API, un simple GET /v1/connections/{slug} renvoie la même configuration (le secret n’est jamais exposé).
  • Importer : le bouton Importer (en haut de la section) lit un fichier .json et pré-remplit la modale de création. Comme le secret n’est jamais inclus dans un export, vous ressaisissez votre clé avant de créer le connecteur. Côté API, postez le fichier sur POST /v1/connections en ajoutant le champ credential.

Le format tolère aussi une configuration écrite à la main : seul base_url est obligatoire.

  • Non-streaming : comme tout mode agentique, la réponse arrive en une fois (stream: true ignoré).
  • Gratuit : l’appel à votre API n’est pas facturé en plus (seuls les tokens du modèle le sont).
  • Sécurité : les réponses de votre API sont traitées comme des données, jamais comme des instructions. Les réponses sont bornées, les redirections ne sont pas suivies, et une garde SSRF refuse les URL privées ou loopback, y compris lorsqu’elles sont désignées par un nom d’hôte qui résout vers une adresse privée, et pas seulement par une adresse écrite littéralement. La connexion est épinglée sur l’adresse vérifiée, de sorte qu’un nom ne peut pas changer de destination entre la vérification et l’appel. Un base_url (ou le path absolu d’une opération) écrit comme une adresse privée ou loopback (127.0.0.1, 10.…, 192.168.…, localhost) est refusé dès la création du connecteur, par une erreur 400 qui le dit ; un nom d’hôte qui résout vers un réseau interne est refusé au moment de l’appel.
  • Souveraineté : une connexion vers votre API hébergée en UE garde les données dans un pipeline européen. Router vers un modèle cloud reste soumis à l’opt-in habituel.

Une opération déclarée en write modifie un système qui n’est pas le nôtre : elle est donc soumise à une validation humaine avant d’être exécutée par l’assistant ou par le Slackbot. Voir Confirmation des écritures pour ce qui est soumis, comment s’en dispenser, et ce qu’un administrateur peut imposer.

Les tâches programmées en sont exemptes : leur périmètre d’écriture se déclare à la création de la tâche.