Aller au contenu principal

Référence MCP

Le serveur MCP de Campbooks se trouve à POST /api/mcp sur toute instance Campbooks. Il implémente le protocole MCP version 2025-03-26 sur HTTP streamable et expose 72 outils (plus 3 outils de contexte qui ne nécessitent aucun scope).

Autorisation

POST /api/mcp accepte trois formes d'Authorization :

FormeValeur d'en-têteNotes
Clé MCPBearer <uid>.<client-secret>UID du client et secret en clair séparés par un point. Les UID et secrets Doorkeeper ne contiennent pas de point, le point est donc sans ambiguïté.
HTTP BasicBasic base64(uid:secret)Équivalent HTTP standard de la forme clé MCP.
Token DoorkeeperBearer <access-token>Token de courte durée (2 h) obtenu via POST /api/oauth/token. Convient pour les scripts ponctuels ; pas adapté aux configurations d'agents statiques.

L'API REST (/api/v1/*) accepte uniquement les tokens bearer Doorkeeper. Les formes 1 et 2 — clés MCP — ne sont prises en charge qu'à /api/mcp.

Expiration et rotation des clés

Les clés MCP n'expirent pas. Le serveur effectue une comparaison bcrypt à chaque requête ; les taux d'appel des agents sont bien en deçà de la limite de 600 req/min.

Révoquer un token d'accès Doorkeeper ne désactive pas une clé MCP. Pour révoquer une clé MCP, faites pivoter le client secret ou supprimez le client dans Paramètres → Accès à l'API. La clé MCP est affichée une fois lors de la création du client ; regénérez le client secret si vous la perdez.

Codes d'erreur d'authentification

Statuterror.codeQuand
401invalid_clientClient introuvable, secret incorrect, application non confidentielle ou secret vide
403insufficient_scopeLe client n'a aucun scope assigné

Scopes

Les scopes contrôlent quels outils apparaissent dans tools/list. Un ensemble plus restreint signifie moins d'outils et moins de contexte par session. La liste complète des scopes est documentée dans la vue d'ensemble de l'API sous Développeurs.

Les trois outils de contexte — get_overview, get_setup_status et guide — ne nécessitent aucun scope et sont toujours disponibles pour tout client authentifié.

Limites de débit

600 requêtes par minute par client. Dépasser cette limite renvoie HTTP 429 avec error.code: "rate_limit_exceeded".

Catalogue des outils

Les outils sont regroupés par famille ci-dessous. La colonne « Scope » indique le OAuth scope requis ; (any) signifie qu'aucun scope n'est requis.

Outils de contexte

OutilScopeFinalité
get_overview(any)Snapshot rapide de ce qui nécessite attention. Ne renvoie que les sections dont les compteurs ne sont pas nuls. À appeler en premier.
get_setup_status(any)Snapshot de configuration de l'espace de travail pour l'intégration et les diagnostics. Liste les lacunes comme next_steps pour guider la skill de configuration.
guide(any)Guides narratifs pour travailler avec Campbooks via MCP. Sans sujet — liste des sujets disponibles. Passez un nom de sujet pour le guide complet.

E-mail

OutilScopeFinalité
list_emailsemails:readListe les e-mails les plus récents accessibles à l'appelant, du plus récent au plus ancien. Filtres optionnels : non lus, requête, compte, catégorie, priorité, plage de dates.
search_emailsemails:readRecherche des e-mails avec des filtres. Utilise une combinaison sémantique + mots-clés lorsqu'une requête textuelle est fournie.
get_emailemails:readRécupère un seul e-mail par id. format=text (défaut) renvoie le corps en texte brut, tronqué à 8 000 caractères.
send_emailemails:sendEnvoie un nouvel e-mail depuis l'un des comptes connectés de l'appelant.
reply_emailemails:sendRépond à un e-mail existant. Enchaîne depuis le message source et envoie depuis son compte sauf substitution.
mark_email_reademails:writeMarque un e-mail comme lu et synchronise le drapeau avec la boîte aux lettres du fournisseur.
mark_email_unreademails:writeMarque un e-mail comme non lu (local uniquement).
add_email_tagtags:writeAttache une étiquette existante de l'espace de travail à un e-mail (par tag_id ou nom). Les étiquettes ne sont pas créées ici — utilisez create_tag.
remove_email_tagtags:writeDétache une étiquette d'un e-mail.
update_emailsemails:writeAction en masse sur les e-mails. archive/unarchive/trash/snooze/unsnooze agissent sur des fils entiers (comme l'UI de l'application).
move_emails_to_folderemails:writeDéplace des e-mails (et leurs fils complets) vers un dossier. Passez folder_name pour travailler entre comptes.
tag_emailstags:writeAjoute ou supprime une étiquette sur un ensemble d'e-mails. L'étiquette doit exister — utilisez create_tag pour en créer de nouvelles.
forward_emailemails:sendTransfère un e-mail à une autre adresse.
get_skim_deckemails:readRenvoie le jeu de skim sous forme d'anneaux compacts et de cartes de clusters. Appliquez les décisions avec skim_decide.
skim_decideemails:writeApplique une décision de triage Skim aux e-mails d'un cluster. Reproduit la boucle d'apprentissage de l'UI de la boîte de réception (archiver, conserver, promouvoir).

Comptes e-mail

OutilScopeFinalité
list_email_accountsemail_accounts:readListe les comptes e-mail connectés visibles à l'appelant. Utilisez l'id comme email_account_id pour le filtrage.
connect_email_accountemail_accounts:writeConnecte un nouveau compte e-mail. mode=web renvoie une URL à ouvrir dans un navigateur (flux OAuth normal — recommandé pour les utilisateurs cloud). mode=token accepte un token de rafraîchissement pré-créé (chemin OAuth local pour l'auto-hébergé).

Documents

OutilScopeFinalité
list_documentsdocuments:readListe les documents de l'espace de travail, du plus récent au plus ancien. Filtres optionnels par id de type de document et statut de révision.
get_documentdocuments:readRécupère un document par id avec ses champs extraits et les informations de fichier (téléchargement via download_path du fichier).
upload_documentdocuments:writeTéléverse un nouveau document depuis un contenu base64. La classification par IA s'exécute de manière asynchrone.
update_documentdocuments:writeModifie les champs extraits d'un document. Ne change pas son statut de révision (utilisez approve/reject/reclassify pour cela).
approve_documentdocuments:writeApprouve (signe) un document.
reject_documentdocuments:writeRejette un document.
reclassify_documentdocuments:writeChange le type d'un document (l'approuve également).

Contacts

OutilScopeFinalité
list_contactscontacts:readListe les contacts de l'espace de travail. Requête textuelle optionnelle sur nom/e-mail et filtre favoris uniquement.
get_contactcontacts:readRécupère un seul contact par id.
update_contactcontacts:writeMet à jour le nom et/ou le type de relation d'un contact.
set_contact_statecontacts:writeAjouter/retirer des favoris, autoriser, bloquer ou débloquer un contact.

Étiquettes

OutilScopeFinalité
list_tagstags:readListe les étiquettes de l'espace de travail (les étiquettes s'appliquent aux e-mails).
create_tagtags:writeCrée une nouvelle étiquette dans l'espace de travail. Les étiquettes s'appliquent aux e-mails et peuvent être utilisées pour filtrer.

Types de document

OutilScopeFinalité
list_document_typesdocument_types:readListe les types de document de l'espace de travail (utilisés pour classifier les documents).
create_document_typedocument_types:writeCrée un nouveau type de document pour classifier les pièces jointes.

Dossiers

OutilScopeFinalité
list_foldersfolders:readListe les dossiers personnalisés de l'espace de travail.
get_folderfolders:readRécupère un dossier et les documents qui y sont archivés.
create_folderfolders:writeCrée un dossier personnalisé. Quand provision: true, le dossier est créé sur chaque compte e-mail connecté comme étiquette/dossier côté fournisseur.
file_documentfolders:writeArchive un document dans un dossier.
unfile_documentfolders:writeRetire un document d'un dossier (par id de membre).

Tâches (conditionnel)

Les outils de tâches nécessitent que la fonctionnalité Tâches soit activée sur le serveur (ENABLE_TASKS). Ils n'apparaissent dans tools/list que lorsque la fonctionnalité est active.

OutilScopeFinalité
list_taskstasks:readListe les tâches de l'espace de travail. Filtre de statut optionnel ; include_archived pour voir les tâches archivées.
get_tasktasks:readRécupère une tâche par id avec le détail complet.
create_tasktasks:writeCrée une tâche dans l'espace de travail.
update_tasktasks:writeMet à jour les champs d'une tâche. Les changements de statut utilisent la transition appropriée (publie des événements).
complete_tasktasks:writeMarque une tâche comme terminée.
create_task_from_emailtasks:writeExtrait et crée une tâche à partir d'un e-mail via le registre d'actions.

Calendrier

OutilScopeFinalité
list_calendarscalendar:readListe les calendriers visibles à l'appelant. Utilisez l'id comme calendar_id dans create_calendar_event.
list_calendar_eventscalendar:readListe les événements de calendrier accessibles à l'appelant, du plus proche au plus lointain. Filtres optionnels start_after / start_before.
get_calendar_eventcalendar:readRécupère un événement de calendrier par id.
create_calendar_eventcalendar:writeCrée un événement de calendrier sur l'un des calendriers modifiables de l'appelant. Les heures sont en ISO-8601.
update_calendar_eventcalendar:writeMet à jour un événement de calendrier (accès en écriture requis). recurrence_scope : this ou all.
delete_calendar_eventcalendar:writeSupprime un événement de calendrier (suppression asynchrone côté fournisseur). recurrence_scope : this ou all.
rsvp_calendar_eventcalendar:writeDéfinit votre RSVP sur un événement (needs_action, accepted, declined, tentative).
create_event_from_emailcalendar:writeExtrait et crée un événement de calendrier à partir d'un e-mail. L'IA infère les détails de l'événement ; fournissez des substitutions au besoin.

Rappels

OutilScopeFinalité
list_remindersreminders:readListe les rappels extraits par l'IA accessibles à l'appelant. Filtre de statut optionnel (pending, confirmed, dismissed, snoozed).
get_reminderreminders:readRécupère un rappel par id.
confirm_reminderreminders:writeConfirme un rappel en événement de calendrier. Passez optionnellement due_at pour ajuster l'heure d'abord.
dismiss_reminderreminders:writeIgnore un rappel.
snooze_reminderreminders:writeReporte un rappel à l'heure indiquée, ou une semaine si omis.

E-mails programmés

OutilScopeFinalité
list_scheduled_emailsscheduled_emails:readListe les e-mails programmés (et récurrents) dans l'espace de travail, de la prochaine occurrence la plus proche à la plus lointaine.
get_scheduled_emailscheduled_emails:readRécupère un e-mail programmé par id.
create_scheduled_emailscheduled_emails:writeProgramme un e-mail pour envoi ultérieur (optionnellement récurrent via RRULE). Envoie depuis un compte depuis lequel l'utilisateur peut envoyer.
update_scheduled_emailscheduled_emails:writeMet à jour un e-mail programmé en attente (destinataire, sujet, corps, heure, rrule).
cancel_scheduled_emailscheduled_emails:writeAnnule un e-mail programmé (doux : définit le statut à cancelled).

Scout

OutilScopeFinalité
list_scout_threadsscout:readListe les fils de chat Scout de l'appelant, du plus récent au plus ancien.
create_scout_threadscout:writeDémarre un nouveau fil de chat Scout.
list_scout_messagesscout:readListe les messages dans un fil Scout. Passez after_message_id pour attendre la réponse asynchrone de l'IA.
send_scout_messagescout:writePublie un message utilisateur dans un fil Scout. La réponse de l'IA est générée de manière asynchrone ; utilisez list_scout_messages avec after_message_id jusqu'à ce qu'elle apparaisse.

Flux de travail (conditionnel)

Les outils de flux de travail nécessitent que la fonctionnalité Flux de travail soit activée sur le serveur (ENABLE_WORKFLOWS). Ils n'apparaissent dans tools/list que lorsque la fonctionnalité est active.

OutilScopeFinalité
list_workflowsworkflows:readListe les flux de travail d'automatisation de l'espace de travail.
trigger_workflowworkflows:triggerDéclenche un flux de travail webhook activé avec un payload JSON optionnel.
list_workflow_executionsworkflows:readListe l'historique d'exécutions d'un flux de travail (du plus récent au plus ancien).

Modèles (conditionnel)

OutilScopeFinalité
list_email_templatestemplates:readListe les modèles d'e-mail réutilisables de l'espace de travail.

Familles conditionnelles

Trois familles d'outils sont masquées lorsque la fonctionnalité serveur correspondante est désactivée :

FamilleVariable d'environnement serveurPar défaut
TâchesENABLE_TASKSdésactivé
Flux de travailENABLE_WORKFLOWSdésactivé
Modèles(drapeau interne)variable

Ces outils n'apparaissent simplement pas dans tools/list quand la fonctionnalité est désactivée — ils ne renvoient pas d'erreur.

connect_email_account — mode web vs. token

L'outil connect_email_account prend en charge deux modes :

  • mode: "web" — renvoie un chemin relatif à ouvrir dans un navigateur. Le flux OAuth du serveur gère la redirection ; c'est le bon choix pour les utilisateurs de Campbooks Cloud et tout serveur dont les callbacks OAuth sont publiquement accessibles.
  • mode: "token" — accepte un token de rafraîchissement pré-créé directement. Utilisez-le pour les instances auto-hébergées où les callbacks OAuth du serveur ne sont pas accessibles depuis internet. Le token doit avoir été créé avec les accréditations OAuth du serveur lui-même (GOOGLE_CLIENT_ID/ZOHO_CLIENT_ID), sinon le serveur échouera à le rafraîchir. Consultez Claude Code → OAuth local pour le script d'assistance.

Garanties de sécurité

Permissions de boîte aux lettres par utilisateur — une clé MCP agit en tant qu'utilisateur qui l'a créée. Les boîtes aux lettres que cet utilisateur ne peut pas lire dans l'application, la clé ne le peut pas non plus. Les comptes depuis lesquels cet utilisateur ne peut pas envoyer, la clé ne le peut pas non plus. Les OAuth scopes sont un plafond supplémentaire au-dessus de ces permissions, pas un remplacement.

404-pas-403 — les ressources qui existent mais appartiennent à un espace de travail différent renvoient 404, pas 403. L'API et le serveur MCP ne révèlent jamais si une ressource existe en dehors de vos données.

Confirmer avant d'envoyer — les skills /campbooks:triage et /campbooks:setup sont conçues pour afficher le texte complet du brouillon et attendre un « oui » explicite avant d'appeler send_email, reply_email ou forward_email. Si vous construisez votre propre invite d'agent sur les outils MCP, suivez le même modèle : n'appelez jamais un outil d'envoi sans approbation explicite de l'utilisateur dans le même échange.