Connecter Kurra à votre client MCP
Votre veille devient un outil de votre assistant : il y ajoute des contenus et l'interroge sans quitter la conversation. La connexion se fait en OAuth — aucune clé à copier, aucun mot de passe à stocker.
Avant de commencer
Un client MCP compatible OAuth 2.1 : Claude Code, Claude Desktop, claude.ai, ou tout client acceptant le transport HTTP.
1. Ajoutez le serveur
Dans Claude Code, une commande suffit :
claude mcp add --transport http kurra https://gabeko.vercel.app/api/mcp --scope user--scope user rend le serveur disponible dans tous vos projets. Utilisez --scope project pour le partager avec votre équipe via le fichier .mcp.json du dépôt.
Pour un client qui se configure par fichier, l'équivalent est :
{
"mcpServers": {
"kurra": {
"type": "http",
"url": "https://gabeko.vercel.app/api/mcp"
}
}
}Dans Claude Desktop ou sur claude.ai, ajoutez un connecteur personnalisé et collez cette même URL : https://gabeko.vercel.app/api/mcp
2. Autorisez l'accès
À la première utilisation, le client vous demande de vous authentifier. Dans Claude Code, tapez /mcp, choisissez kurra, puis Authenticate.
- Votre navigateur s'ouvre sur Kurra.
- Connectez-vous si votre session a expiré.
- L'écran Autoriser l'accès récapitule le client demandeur et les permissions. Validez.
Votre client conserve et renouvelle le jeton tout seul. Il n'y a aucun secret à copier dans un fichier de configuration.
3. Vérifiez
/mcp doit maintenant afficher kurra connecté, avec ses 12 outils. Demandez ensuite à votre assistant :
Ajoute https://exemple.com/un-article a ma veille Kurra,
puis dis-moi ce que l'equipe a partage cette semaine.L'enrichissement (extraction, résumé, tags) est asynchrone : le contenu revient en pending et devient processed quelques instants plus tard.
Ce que le serveur voit de vous
- Les outils s'exécutent sous votre identité, avec exactement les droits que vous avez dans l'application. Rien n'est accessible au serveur MCP que vous ne puissiez déjà voir.
- Ils travaillent dans votre organisation active, celle affichée dans le dashboard. Changez-en et le MCP suit : elle est relue à chaque appel.
- Certains outils exigent d'être administrateur de l'organisation — la référence ci-dessous le précise outil par outil.
- Vous pouvez révoquer l'accès à tout moment en supprimant le serveur de votre client (
claude mcp remove kurra).
Les 12 outils
Contrats extraits du serveur lui-même : nom, paramètres, résultat, droits requis.
Curation (4 outils)
Alimenter la veille de votre équipe et l'interroger.
add_contentAjouter du contenuPartage une URL dans la veille de votre organisation active. Le type est auto-détecté et l'enrichissement (extraction, résumé, tags, embeddings) est asynchrone : l'outil rend la main immédiatement.
- Paramètres
url— string (URL) requisAdresse du contenu à partager.comment— string (500 caractères max) optionnelCommentaire personnel joint au partage.contentType— enum : linkedin | youtube | article | x optionnelForce le type au lieu de le laisser détecter depuis l'URL.
- Retourne
- { id, status: "pending" } — suivre l'enrichissement avec get_content_status.
- Droits requis
- Membre de l'organisation
- Codes d'erreur
- CONTENT_DUPLICATE · RATE_LIMIT · CONTENT_INSERT_FAILED
get_content_statusStatut d'un contenuÉtat d'ingestion d'un contenu partagé (pending → processing → processed | failed).
- Paramètres
id— string (UUID) requisIdentifiant renvoyé par add_content.
- Retourne
- { id, status, title, tags, has_embeddings, error_details }
- Droits requis
- Membre de l'organisation
- Codes d'erreur
- CONTENT_NOT_FOUND
list_recent_contentsContenus récentsListe les contenus partagés dans l'organisation active sur les N derniers jours, tous contributeurs confondus.
- Paramètres
days— entier (1-90) optionnel (défaut : 7)Profondeur de la fenêtre, en jours.status— enum : pending | processing | processed | failed optionnelNe garde que les contenus dans cet état d'ingestion.limit— entier (1-100) optionnel (défaut : 50)Nombre maximum de contenus renvoyés.
- Retourne
- { count, items: [{ id, url, title, content_type, status, tags, created_at }] }
- Droits requis
- Membre de l'organisation
- Codes d'erreur
- CONTENT_ORG_REQUIRED · CONTENT_LIST_FAILED
search_contentsRecherche sémantiqueRetrouve les contenus proches d'une question, par le sens et non par les mots (embeddings Voyage + pgvector), dans l'organisation active.
- Paramètres
query— string (non vide) requisQuestion ou sujet recherché.limit— entier (1-50) optionnel (défaut : 10)Nombre maximum de contenus renvoyés.similarityThreshold— nombre (0-1) optionnel (défaut : 0.35)Seuil de similarité ; monter vers 0.5 pour ne garder que les correspondances fortes.
- Retourne
- { count, matches: [{ similarity, id, title, url, content_type }] }
- Droits requis
- Membre de l'organisation — nécessite aussi que l'instance soit configurée :
VOYAGE_API_KEY - Codes d'erreur
- CONTENT_SEARCH_UNAVAILABLE · CONTENT_ORG_REQUIRED · CONTENT_EMBEDDING_FAILED · CONTENT_SEARCH_FAILED
Diffusion (6 outils)
Transformer la veille en newsletter et en campagne d'emailing.
generate_newsletter_draftGénérer un brouillon de newsletterGénère un brouillon (sélection « À ne pas rater » par sujet + angle éditorial RAG) à partir des contenus de la période.
- Paramètres
days— entier (1-90) optionnel (défaut : 7)Fenêtre de contenus analysée, en jours.
- Retourne
- { newsletterId, topicsCount, contentsCount, hasEditorialAngle }
- Droits requis
- Administrateur de l'organisation
- Codes d'erreur
- AUTH_UNAUTHORIZED · PERMISSION_ORG_FORBIDDEN · VALIDATION_ORG_REQUIRED · NEWSLETTER_NO_CONTENT · NEWSLETTER_GENERATION_FAILED
regenerate_editorial_angleRégénérer l'angle éditorialRecalcule (RAG + LLM) la seule section « angle éditorial » d'un brouillon existant.
- Paramètres
newsletterId— string (UUID) requisBrouillon dont l'angle est recalculé.
- Retourne
- { sectionId, title, body, sourceContentIds, model, query }
- Droits requis
- Administrateur de l'organisation
- Codes d'erreur
- AUTH_UNAUTHORIZED · PERMISSION_ORG_FORBIDDEN · VALIDATION_NOT_FOUND
get_newsletterRelire une newsletterCharge une newsletter et ses sections pour relecture. Sans identifiant, prend le dernier brouillon de l'organisation active. Un membre ne voit que les numéros déjà envoyés ; les brouillons sont réservés aux administrateurs de l'organisation.
- Paramètres
id— string (UUID) optionnelNewsletter à relire ; à défaut, le dernier brouillon.
- Retourne
- { newsletter, sections: [...], contents: [...] }
- Droits requis
- Membre de l'organisation
- Codes d'erreur
- VALIDATION_ORG_REQUIRED · NEWSLETTER_LIST_FAILED · NEWSLETTER_NOT_FOUND
schedule_newsletterPlanifier l'envoiPasse un brouillon en « planifié » à la date fournie ; l'envoi réel est déclenché par pg_cron.
- Paramètres
newsletterId— string (UUID) requisBrouillon à planifier.scheduledAt— string (date-heure ISO 8601) requisDate d'envoi souhaitée, par exemple 2026-09-01T08:00:00Z.
- Retourne
- { id, status: "scheduled", scheduled_at }
- Droits requis
- Administrateur de l'organisation
- Codes d'erreur
- NEWSLETTER_SCHEDULE_FAILED
sync_subscribers_to_brevoSynchroniser les abonnés vers BrevoRecopie les abonnés confirmés de l'organisation dans la liste Brevo cible (idempotent). Supabase reste la source de vérité de l'opt-in.
- Paramètres
listId— entier positif optionnelListe Brevo visée ; à défaut, la valeur de BREVO_LIST_ID.
- Retourne
- { listId, submitted, processId } — l'import Brevo est asynchrone.
- Droits requis
- Administrateur de l'organisation — nécessite aussi que l'instance soit configurée :
BREVO_API_KEY,BREVO_LIST_ID - Codes d'erreur
- BREVO_NOT_CONFIGURED · BREVO_LIST_MISSING · SUBSCRIBER_LIST_FAILED · BREVO_IMPORT_FAILED
create_brevo_campaignCréer une campagne Brevo (brouillon)Rend le HTML de la newsletter puis crée une campagne Brevo en brouillon. N'envoie jamais : la relecture et l'envoi restent manuels dans Brevo.
- Paramètres
newsletterId— string (UUID) requisNewsletter à mettre en campagne.listId— entier positif optionnelListe Brevo visée ; à défaut, la valeur de BREVO_LIST_ID.scheduledAt— string (date-heure ISO 8601) optionnelDate de programmation posée sur la campagne Brevo.
- Retourne
- { campaignId, status: "draft", listId, brevoDashboardUrl }
- Droits requis
- Administrateur de l'organisation — nécessite aussi que l'instance soit configurée :
BREVO_API_KEY,BREVO_LIST_ID,NEWSLETTER_FROM_EMAIL - Codes d'erreur
- BREVO_NOT_CONFIGURED · BREVO_LIST_MISSING · BREVO_SENDER_MISSING · NEWSLETTER_RENDER_EMPTY · BREVO_CAMPAIGN_FAILED
Contributeur (2 outils)
Votre activité personnelle et les angles de publication qui en découlent.
generate_digestGénérer un digestProduit la synthèse personnelle d'un contributeur (statistiques, thèmes, angles LinkedIn). Un administrateur d'organisation la génère pour tous les membres, un membre pour lui seul.
- Paramètres
type— enum : daily | weekly optionnel (défaut : daily)Périodicité du digest.periodStart— string (date-heure ISO 8601) optionnelDébut de période ; sans bornes, la période est calculée en Europe/Paris.periodEnd— string (date-heure ISO 8601) optionnelFin de période.
- Retourne
- { digestType, periodStart, periodEnd, usersProcessed, usersSkipped, usersFailed, digests, orgsProcessed }
- Droits requis
- Membre de l'organisation
- Codes d'erreur
- AUTH_UNAUTHORIZED · VALIDATION_ORG_REQUIRED
get_linkedin_ideasIdées de post LinkedInRelit les angles LinkedIn (accroche, points clés, sources) du dernier digest de l'utilisateur connecté, dans l'organisation active.
- Paramètres
type— enum : daily | weekly optionnelRestreint au dernier digest de cette périodicité.
- Retourne
- { digestId, digestType, period, suggestionsCount, suggestions }
- Droits requis
- Membre de l'organisation
- Codes d'erreur
- VALIDATION_ORG_REQUIRED · DIGEST_READ_FAILED · DIGEST_NOT_FOUND
Si ça ne marche pas
- Le client n'arrive pas à découvrir l'authentification
- Vérifiez que le point d'entrée répond bien. La commande ci-dessous doit renvoyer un
401accompagné d'un en-têteWWW-Authenticatequi pointe vershttps://gabeko.vercel.app/.well-known/oauth-protected-resource. C'est ce 401 qui déclenche tout le flux OAuth.curl -i https://gabeko.vercel.app/api/mcp - Les outils répondent « non autorisé » après un moment
- Le jeton a expiré et n'a pas pu être renouvelé. Relancez
/mcp→kurra→ Authenticate. - « Autorisation impossible » au moment d'autoriser l'accès
- Votre client rejoue un enregistrement que Kurra ne connaît plus — c'est le cas après une restauration de sauvegarde ou un changement d'instance. Se réauthentifier ne suffit pas : il faut réenregistrer le client. Retirez le serveur puis ajoutez-le de nouveau.
claude mcp remove kurra claude mcp add --transport http kurra https://gabeko.vercel.app/api/mcp --scope user - CONTENT_ORG_REQUIRED ou VALIDATION_ORG_REQUIRED
- Votre compte n'a pas d'organisation active. Ouvrez le dashboard et sélectionnez une organisation, puis relancez l'outil.
- CONTENT_SEARCH_UNAVAILABLE
- La recherche sémantique n'est pas configurée sur cette instance. Les autres outils de curation restent utilisables.
- BREVO_NOT_CONFIGURED ou BREVO_LIST_MISSING
- Les outils de campagne exigent une configuration d'emailing côté instance. Voyez avec l'administrateur de votre espace.
- RATE_LIMIT
- Votre organisation a atteint son plafond mensuel d'ingestion. Les ajouts reprennent au début du mois suivant.
- CONTENT_DUPLICATE
- L'URL est déjà dans la veille de l'organisation. C'est voulu : un contenu n'y entre qu'une fois.
Et le transport local (stdio) ?
Le dépôt contient un second transport, en ligne de commande. Il exige les identifiants d'un compte en clair dans la configuration du client : il n'est distribuable à personne et reste réservé au développement interne. La connexion décrite sur cette page est la seule supportée.