Cette page t'a-t-elle aidé ?

Cette page t'a-t-elle aidé ?
Bridge MCP
28 tools `learn_*` exposés via MCP pour opérer Solve Learn end-to-end depuis Claude Code, ChatGPT, Cursor ou tout client MCP — sans toucher au Studio ni au SQL.
Dernière mise à jour : 30 mai 2026
Le toolset Solve Learn partage la même clé MCP que le reste (tools Gmail, Calendar, routines, …) : voir Bridge MCP pour la génération de clé et la configuration de votre client.
Un appel typique pour lister vos formations :
curl -X POST 'https://gilbert.solveholding.com/api/mcp?key=glb_VOTRECLE' \
-H 'Content-Type: application/json' \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "learn_list_formations"
}
}'Gestion des espaces clients. Un tenant a un slug unique (URL publique /client/<slug>) et un name affichable.
learn_list_tenantsListe tous les tenants Solve Learn (id, slug, name, created_at).
learn_create_tenantCrée un nouveau tenant. L'appelant devient owner automatiquement.
Inputs : name (requis), slug (optionnel, auto-dérivé du name)
Refuse les slugs réservés (admin, api, login, studio, …). Pas de collision : auto-suffixe -2, -3, …
learn_update_tenantPatch partiel d'un tenant (whitelist).
Inputs : tenant_slug (requis), name?, logo_url?, primary_color? — passer null pour effacer logo/color
Le slug N'EST PAS modifiable (casserait les URLs publiques). logo_url doit être https + ext image. primary_color doit être #RRGGBB.
Cycle de vie complet d'une formation : créer, éditer les champs pédagogiques avec audit (undo possible), soft-delete réversible, et hard-delete physique avec confirm en 2 temps.
learn_list_formationsListe des formations cross-tenant (id, slug, title, lifecycle_state, sessions_count).
learn_get_formationDétail d'une formation (catalogue + champs pédagogiques étendus).
Inputs : formation_id (requis)
learn_create_formationCrée une formation dans un tenant. Défaut lifecycle_state='setup', published=false.
Inputs : tenant_slug (requis), title (requis), slug (optionnel)
learn_update_formation_fieldMet à jour UN champ pédagogique d'une formation. Snapshot l'ancienne valeur (undo possible).
Inputs : formation_id, field, value, source?
Whitelist : title, subtitle, audience, prerequisites, evaluation, objectives, methods, deliverables, need_statement, commanditaire_*, target_audience_volume, tools_used, pedagogical_objectives, modalities, previous_references. PAS lifecycle_state, price_*, published — refus explicite.
learn_list_formation_editsHistorique des edits sur une formation (20 dernières par défaut).
Inputs : formation_id (requis), limit?
learn_undo_formation_editAnnule un edit : restaure la valeur précédente, trace l'undo lui-même (append-only).
Inputs : edit_id (requis)
learn_delete_formationSoft-delete : lifecycle_state='completed' + published=false. Récupérable. Audité.
Inputs : formation_id (requis)
learn_hard_delete_formationDESTRUCTIF IRRÉVERSIBLE — supprime physiquement la formation et toutes ses dépendances. Flow en 2 temps : preview puis confirm:true.
Inputs : formation_id (requis), confirm? (défaut false)
Refus si still_published ou has_completed_sessions. Pas de transaction — un échec en milieu de cascade laisse la DB partiellement supprimée (voir cascade_failed.<table>).
Exemple — créer une formation dans le tenant acme-corp :
curl -X POST 'https://gilbert.solveholding.com/api/mcp?key=glb_VOTRECLE' \
-H 'Content-Type: application/json' \
-d '{
"jsonrpc": "2.0", "id": 1, "method": "tools/call",
"params": {
"name": "learn_create_formation",
"arguments": {
"tenant_slug": "acme-corp",
"title": "Initiation IA"
}
}
}'Sessions = séances live d'une formation. Auto-ordering : l'ordre est calculé serveur-side (MAX existant + 1) si non fourni, pour éviter à Gilbert de coordonner.
learn_list_sessionsListe des sessions d'une formation, triées par ordering.
Inputs : formation_id (requis)
learn_get_sessionDétail d'une session : métadonnées + contenu pédagogique + supports/prompts/exercices.
Inputs : session_id (requis)
learn_create_sessionCrée une session dans une formation. Auto-ordering (MAX+1) si omis. Défaut status='draft', duration_min=60.
Inputs : formation_id (requis), title?, scheduled_at?, duration_min?, ordering?
learn_update_sessionPatch partiel d'une session (whitelist). Audité via formation_edits.
Inputs : session_id (requis), title?, subtitle?, summary?, scheduled_at?, duration_min?, status?
Status whitelist : draft | scheduled | live | completed | cancelled.
learn_delete_sessionSoft-delete : status='cancelled'. Audité.
Inputs : session_id (requis)
CRUD sur les 3 tables enfant d'une session : supports, prompts et exercices. Chaque triplette suit le même contrat : create (tenant_id hérité de la session, ordering auto-append), update_*_field (patch granulaire whitelisté) et delete (HARD delete — ce sont des rows de contenu feuille). Tous les writes sont audités dans formation_edits avec field_path = <table>:<row_id>:<create|delete|field>.
learn_create_supportCrée un support attaché à une session. tenant_id hérité de la session, ordering auto-append si omis.
Inputs : session_id (requis), kind (requis: pdf|link|slides|other), title (requis), url?, storage_path?, byte_size?, ordering?
learn_update_support_fieldPatch UN champ d'un support. Audité.
Inputs : support_id (requis), field (requis), value (requis)
Champs : kind, title, url, storage_path, byte_size, ordering.
learn_delete_supportHARD delete d'un support (contenu feuille, pas de soft-delete).
Inputs : support_id (requis)
learn_create_promptCrée un prompt-type attaché à une session. ordering auto-append si omis.
Inputs : session_id (requis), label (requis), template (requis), tags?, target_llm? (claude|chatgpt|perplexity), ordering?
learn_update_prompt_fieldPatch UN champ d'un prompt. Audité.
Inputs : prompt_id (requis), field (requis), value (requis)
Champs : label, template, tags, target_llm, ordering.
learn_delete_promptHARD delete d'un prompt.
Inputs : prompt_id (requis)
learn_create_exerciseCrée un exercice attaché à une session. Pas de colonne 'content' unique : le corps vit dans payload/solution/scoring_rules (jsonb). ordering auto-append si omis.
Inputs : session_id (requis), type (requis: multiple_choice|true_false|ordering|fill_blank|llm_deeplink), label (requis), payload?, solution?, scoring_rules?, points?, time_limit_seconds?, replay_trigger_seconds?, prompt_template?, context_template?, target_llm?, ordering?
Contrainte DB : tout type != llm_deeplink exige scoring_rules non vide.
learn_update_exercise_fieldPatch UN champ d'un exercice. Audité.
Inputs : exercise_id (requis), field (requis), value (requis)
Champs : type, label, prompt_template, context_template, target_llm, payload, solution, scoring_rules, points, time_limit_seconds, replay_trigger_seconds, ordering.
learn_delete_exerciseHARD delete d'un exercice.
Inputs : exercise_id (requis)
Gestion des memberships d'un tenant. L'ajout par email gère automatiquement le cas user inconnu via magic link Supabase (réplique le flow /api/spacede Solve Learn — la membership s'attache après confirmation du link).
learn_list_membersListe les membres d'un tenant avec leur email (via RPC SECURITY DEFINER).
Inputs : tenant_slug (requis)
learn_add_memberAjoute un membre par email. Si l'user existe → INSERT direct. Sinon → magic link Supabase avec metadata pending_tenant_*.
Inputs : tenant_slug (requis), email (requis), role? (défaut 'apprenant')
Rôles : owner | admin | formateur | apprenant. Gère la collision 23505 (déjà membre).
learn_remove_memberDELETE de la membership matchant (user_id, tenant_id). Garde-fou last_owner_protected.
Inputs : tenant_slug (requis), user_id (requis)
Refuse si la cible est le dernier owner du tenant — sinon tenant orphelin.
learn_hard_delete_formation est le seul tool destructif irréversible du toolset. Il exige un flag confirm: trueexplicite — sans ça, l'appel retourne uniquement un preview avec le décompte des rows à supprimer. C'est le safety net intrinsèque qui remplace le delai 5-min de publish_linkedin_post.
# 1. D'abord, dry-run pour voir ce qui sera supprimé
curl -X POST 'https://gilbert.solveholding.com/api/mcp?key=glb_VOTRECLE' \
-d '{
"jsonrpc": "2.0", "id": 1, "method": "tools/call",
"params": {
"name": "learn_hard_delete_formation",
"arguments": { "formation_id": "uuid-de-la-formation" }
}
}'
# → renvoie { requires_confirmation: true, preview: { will_delete: { sessions: 4, ... } } }
# 2. Si OK, re-call avec confirm: true
curl -X POST '...' -d '{
"params": {
"name": "learn_hard_delete_formation",
"arguments": {
"formation_id": "uuid-de-la-formation",
"confirm": true
}
}
}'Tous les writes sur les formations sont tracés dans learn.formation_edits avec actor='gilbert', actor_user_id=<votre user_id> et source='mcp_tool' (ou mcp_tool:soft_delete pour le soft-delete). Permet retracer qui a touché quoi via learn_list_formation_edits, et d'annuler via learn_undo_formation_edit.
Les writes sur sessions sont audités dans la même table avec field_path='session:<id>:<field>' . Les opérations sur tenants / memberships / learn_remove_member / learn_update_tenant ne sont pour V0 que tracées dans les logs serveur (Vercel) via console.warn— une table d'audit dédiée (tenant_edits, membership_audit) est à venir.
Code source : solve-gilbert/src/lib/gilbert/learnTools.ts. Tests : solve-gilbert/src/lib/gilbert/learnTools.test.ts. Tous les tools sont taggés group: "solve-learn" sur leur PersonalToolDefinition — permet à un consumer futur (Studio, MCP server filtré) de regrouper par produit.