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.

  1. Votre navigateur s'ouvre sur Kurra.
  2. Connectez-vous si votre session a expiré.
  3. 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 contenu

    Partage 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écents

    Liste 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émantique

    Retrouve 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 newsletter

    Gé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 éditorial

    Recalcule (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 newsletter

    Charge 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'envoi

    Passe 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 Brevo

    Recopie 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 digest

    Produit 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 LinkedIn

    Relit 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 401 accompagné d'un en-tête WWW-Authenticate qui pointe vers https://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 /mcpkurra 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.