MCP Research Friend Server
officielOutils de recherche, incluant un espace de stockage de documents basé sur Sqlite
Documentation
Research Friend
Un assistant convivial pour les outils d'IA qui ont besoin de chercher des informations sur le web et de gérer une réserve locale de recherche.
Research Friend est un serveur MCP qui donne à vos outils d'IA la capacité de récupérer des pages web et de rechercher sur Internet. Il utilise un véritable navigateur web en arrière-plan, ce qui lui permet de fonctionner même avec les sites web modernes qui dépendent fortement de JavaScript. Il inclut également une « réserve » locale pour stocker des documents, extraire du texte et effectuer des recherches dans votre bibliothèque.
Pour profiter de toutes ses fonctionnalités, vous aurez besoin d'un client MCP qui prend en charge les invites (courant) et l'échantillonnage (moins courant). Nous développons Research Friend en parallèle de Chabeau, qui prend en charge les deux.
Que peut-il faire ?
- Récupérer des pages web avec un vrai navigateur (y compris les sites utilisant beaucoup de JavaScript)
- Récupérer des PDF et extraire leur contenu textuel
- Rechercher sur le web via DuckDuckGo ou Google
- Gérer une réserve locale de documents pour la recherche, le listage et l'extraction
Pour commencer
Vous aurez besoin de Node.js version 20 ou plus récente installée sur votre ordinateur.
1. Installer les dépendances
Ouvrez un terminal dans ce dossier et exécutez :
npm install
2. Installer la prise en charge du navigateur
Research Friend utilise Playwright pour contrôler un navigateur web. Après avoir installé les dépendances, vous devrez installer le navigateur :
npx playwright install chromium
Ceci télécharge une copie de Chromium que Playwright utilisera. Elle est distincte de tous les navigateurs que vous avez déjà installés.
3. Démarrer le serveur
node src/index.js
Le serveur communique via stdio (entrée/sortie standard), ce qui est la manière dont les clients MCP s'y connectent.
Ajouter à votre client MCP
La manière d'ajouter Research Friend dépend du client MCP que vous utilisez. Voici un exemple général de ce à quoi la configuration pourrait ressembler :
[[mcp_servers]]
id = "research-friend"
command = "node"
args = ["/path/to/mcp-research-friend/src"]
transport = "stdio"
Remplacez /path/to/mcp-research-friend par le chemin réel vers ce dossier sur votre ordinateur.
Outils
Outils web
friendly_web_fetch
Récupère une page web et retourne son contenu. Par défaut, retourne du markdown avec les liens préservés — idéal pour les LLM. Utilise Readability pour extraire le contenu principal (en supprimant la navigation, les publicités, etc.). Pour les PDF, la pagination ou la recherche dans le contenu, utilisez plutôt friendly_web_extract.
Paramètres :
url(requis) - L'adresse web à récupéreroutputFormat- Format de sortie :markdown(par défaut),text, ouhtmlwaitMs- Temps supplémentaire à attendre après le chargement de la page, au cas où le contenu apparaîtrait lentementtimeoutMs- Combien de temps attendre avant d'abandonner (par défaut : 15 secondes)maxChars- Quantité maximale de contenu à retourner (par défaut : 40 000 caractères)includeHtml- Mettre àtruepour également retourner le HTML brut avec le contenuheadless- Mettre àfalsepour voir la fenêtre du navigateur (utile pour le débogage)
Retourne :
url- L'URL qui a été demandéefinalUrl- L'URL après toute redirectiontitle- Le titre de la pagecontent- Le contenu extrait (dans le format demandé)html- HTML brut (seulement siincludeHtmlest vrai)meta- Métadonnées de la page (description, auteur, heure de publication, etc.)fetchedAt- Horodatage ISO du moment où la page a été récupéréetruncated- Si le contenu a été tronqué pour correspondre àmaxChars
friendly_search
Recherche sur le web et retourne une liste de résultats.
Paramètres :
query(requis) - Ce qu'il faut rechercherengine- Quel moteur de recherche utiliser (duckduckgoougoogle)maxResults- Combien de résultats retourner (par défaut : 10, maximum : 50)timeoutMs- Combien de temps attendre avant d'abandonner (par défaut : 15 secondes)headless- Mettre àfalsepour voir la fenêtre du navigateur
Retourne :
query- La requête de recherche qui a été utiliséeengine- Quel moteur de recherche a été utiliséresults- Tableau de résultats, chacun avectitle,url, etsnippetsearchedAt- Horodatage ISO du moment où la recherche a été effectuéefallback_result_html- HTML brut de la page (inclus seulement si aucun résultat n'a été trouvé)debug_info- Informations de diagnostic sur la tentative de recherche
Gestion des CAPTCHA :
Si un CAPTCHA est détecté lors de l'exécution en mode headless, l'outil réessaie automatiquement avec une fenêtre de navigateur visible. Cela vous donne une chance de résoudre le CAPTCHA manuellement. Le champ debug_info.retried indique si cette solution de repli a été utilisée.
friendly_web_extract
Extrait le contenu d'une URL. Détecte automatiquement si l'URL pointe vers un PDF ou une page web et gère chacun de manière appropriée.
Paramètres :
url(requis) - L'URL à récupérer (PDF ou page web)maxChars- Quantité maximale de texte à retourner (par défaut : 40 000 caractères)offset- Position du caractère à partir de laquelle commencer (par défaut : 0). Utilisez ceci pour paginer à travers un contenu volumineux.search- Rechercher une phrase et retourner les correspondances avec le contexte environnant au lieu du contenu completcontextChars- Caractères de contexte autour de chaque correspondance de recherche (par défaut : 200)waitMs- Temps supplémentaire à attendre après le chargement de la page pour le contenu dynamique (pages web uniquement)timeoutMs- Combien de temps attendre avant d'abandonner (par défaut : 15 secondes, pages web uniquement)headless- Mettre àfalsepour voir la fenêtre du navigateur (pages web uniquement)
Retourne (mode normal) :
url- L'URL qui a été demandéecontentType- Soitpdfouhtmltitle- Le titre de la page/documentauthor- L'auteur du PDF (PDF uniquement, si disponible)creationDate- Quand le PDF a été créé (PDF uniquement, si disponible)pageCount- Nombre de pages (PDF uniquement)totalChars- Nombre total de caractères (à utiliser avecoffsetpour paginer)offset- Le décalage qui a été utilisécontent- Le contenu textuel extraitfetchedAt- Horodatage ISOtruncated- S'il reste plus de contenu après ce segment
Retourne (mode recherche) :
url,contentType,title,totalChars,fetchedAt- Identique à ci-dessussearch- La phrase de recherche qui a été utiliséematchCount- Nombre de correspondances trouvéesmatches- Tableau de correspondances, chacune avecposition,context,prefix, etsuffix
friendly_web_ask
Récupère une URL (PDF ou page web) et demande à un LLM de répondre à des questions à son sujet. Détecte automatiquement le type de contenu. Le document est traité dans un contexte séparé, ce qui permet de garder votre conversation principale compacte.
Paramètres :
url(requis) - L'URL à récupérer (PDF ou page web)ask(requis) - Question ou instruction pour le LLM (résumer, extraire des informations, répondre à des questions, etc.)askMaxInputTokens- Nombre maximal de jetons d'entrée par appel LLM (par défaut : 150 000)askMaxOutputTokens- Nombre maximal de jetons de sortie par appel LLM (par défaut : 4 096)askTimeout- Délai d'attente en millisecondes (par défaut : 300 000 = 5 minutes)askSplitAndSynthesize- Pour les documents volumineux : diviser en segments, traiter chacun, puis synthétiser les résultats (par défaut : false). Attention : consomme beaucoup de jetons.waitMs- Temps supplémentaire à attendre après le chargement de la page pour le contenu dynamique (pages web uniquement)timeoutMs- Combien de temps attendre avant d'abandonner (par défaut : 15 secondes, pages web uniquement)headless- Mettre àfalsepour voir la fenêtre du navigateur (pages web uniquement)
Retourne :
url- L'URL qui a été demandéecontentType- Soitpdfouhtmltitle- Le titre de la page/documenttotalChars- Nombre total de caractères dans le documentask- L'instruction qui a été donnéeanswer- La réponse du LLMmodel- Le modèle qui a généré la réponsechunksProcessed- Nombre de segments traités (1 pour les petits documents, plus lors de l'utilisation deaskSplitAndSynthesize)fetchedAt- Horodatage ISO
Le mode Ask utilise l'échantillonnage MCP pour qu'un LLM traite le document avec n'importe quelle instruction. Ceci est utile pour :
- Les documents volumineux qui submergeraient le contexte
- Réduire les coûts de jetons sur la conversation principale
Lorsque askSplitAndSynthesize est activé, les documents dépassant askMaxInputTokens sont automatiquement divisés en segments qui se chevauchent. Chaque segment est traité séparément, et les résultats sont synthétisés en une seule réponse cohérente. La réponse finale est fournie dans la même langue que votre demande, quelle que soit la langue du document.
Réserve de documents
La réserve est une bibliothèque locale de documents consultable. Elle prend en charge les PDF, les fichiers HTML et le texte brut (Markdown/TXT). Lorsque vous ajoutez un document, Research Friend stocke le fichier original, extrait le texte (pour les PDF/HTML) et enregistre les métadonnées dans une base de données locale. Les recherches utilisent ripgrep en arrière-plan pour une correspondance rapide et sensible aux phrases.
Emplacement de la réserve
La réserve se trouve sous ~/.research-friend/ :
inbox/- Déposez les fichiers ici pour qu'ils soient traitésstore/- Stockage organisé des documents et texte extraitstash.db- Base de données de métadonnées
Types de fichiers pris en charge
- PDF :
.pdf(texte extrait) - HTML :
.html,.htm(texte extrait) - Markdown :
.md,.markdown(stocké en texte brut) - Texte :
.txt(stocké en texte brut)
Outils de la réserve
stash_open_inbox
Ouvrir le dossier de la boîte de réception de la réserve dans votre gestionnaire de fichiers pour un glisser-déposer plus facile.
Retourne :
opened- Si la demande d'ouverture du dossier a été envoyéeinboxPath- Chemin absolu vers la boîte de réceptioncommand- Commande OS utiliséeargs- Arguments de commande utilisés
stash_process_inbox
Traiter les fichiers dans inbox/, les classer par sujets, extraire le texte et stocker les résultats.
Pour les documents longs, la classification utilise des sections échantillonnées (début/milieu/fin plus quelques segments aléatoires) pour améliorer la précision du sujet.
Retourne :
processed- Tableau des noms de fichiers traités avec succèserrors- Toute erreur rencontréedocuments- Tableau des enregistrements de documents créés
reindex_stash
Régénérer les résumés, réallouer les sujets et mettre à jour les métadonnées de la réserve pour les documents stockés. Si ids est omis ou vide, tous les documents sont réindexés.
Paramètres :
ids- ID des documents à réindexer (optionnel)
Retourne :
reindexed- ID des documents réindexéserrors- Toute erreur rencontréedocuments- Tableau des enregistrements de documents mis à jour
stash_list
Lister les documents dans la réserve.
Paramètres :
topic- Filtrer par sujet (optionnel)limit- Nombre maximal de résultats (par défaut : 50)offset- Décalage de pagination (par défaut : 0)
Retourne :
type-alloutopictotalDocuments- Nombre total de documents (seulement lorsquetypeestall)count- Résultats retournés après paginationoffset- Décalage de pagination utilisélimit- Limite de pagination utiliséetopics- Résumé des sujets connus et du nombre de documentsdocuments- Liste des documents avec métadonnées (inclutisPrimarylors du listage d'un sujet)
stash_search
Rechercher des noms de fichiers et du contenu dans toute la réserve. Tous les termes de recherche doivent être présents (logique ET). Les correspondances de nom de fichier sont listées en premier. Utilisez des guillemets pour les phrases exactes.
Paramètres :
query(requis) - Termes de recherche. Utilisez des guillemets pour les phrases :"sparkling wine"topic- Filtrer par sujet (optionnel)ids- Filtrer par ID de document spécifiques (optionnel)limit- Nombre maximal de documents à retourner (par défaut : 20)offset- Décalage de pagination (par défaut : 0)maxMatchesPerDoc- Nombre maximal de correspondances par document (par défaut : 50)context- Lignes de contexte autour de chaque correspondance (par défaut : 1, max : 5). Contrôle à la fois la proximité à laquelle les termes doivent apparaître pour correspondre ET la quantité de texte environnant retourné. Retourne :totalMatches- Total des documents correspondants avant paginationcount- Résultats retournés après paginationresults- Tableau de documents, chacun avec :id,filename,fileType,summary,charCount,createdAtmatchType-filename,content, oufilename+contentmatches- Tableau de{ line, context }pour chaque emplacement de correspondance
Utilisez les valeurs line avec stash_extract pour accéder directement aux emplacements des correspondances.
stash_extract
Extrait le contenu d'un document stocké pour le lire. Utilisez les numéros de ligne des résultats de stash_search pour accéder directement aux correspondances.
Paramètres :
id(requis) - ID du document provenant destash_list/stash_searchmaxChars- Quantité maximale de texte à retourner (par défaut : 40 000 caractères)offset- Position du caractère de départ (mutuellement exclusif avecline)line- Numéro de ligne de départ (mutuellement exclusif avecoffset)
Retourne :
id,filename,fileType,summary- Métadonnées du documenttotalChars- Nombre total de caractères dans le documentoffset- Décalage de caractère (inclus lors de l'utilisation delinepour référence)line- Numéro de ligne (uniquement lorsque le paramètrelinea été utilisé)content- Le contenu textuel extraittruncated- Indique s'il reste du contenu après ce segment
stash_ask
Permet à un LLM de répondre à des questions sur un document stocké. Le document est traité dans un contexte séparé, ce qui garde votre conversation principale compacte.
Paramètres :
id(requis) - ID du document provenant destash_list/stash_searchask(requis) - Question ou instruction pour le LLMaskMaxInputTokens- Nombre maximal de jetons d'entrée par appel LLM (par défaut : 150 000)askMaxOutputTokens- Nombre maximal de jetons de sortie par appel LLM (par défaut : 4 096)askTimeout- Délai d'expiration en millisecondes (par défaut : 300 000 = 5 minutes)askSplitAndSynthesize- Pour les documents volumineux : diviser en segments, traiter chacun, puis synthétiser les résultats (par défaut : false)
Retourne :
id,filename,fileType,summary- Métadonnées du documenttotalChars- Nombre total de caractères dans le documentask- L'instruction qui a été donnéeanswer- La réponse du LLMmodel- Le modèle qui a généré la réponsechunksProcessed- Nombre de segments traités
Flux typique
- Déposez les fichiers dans
~/.research-friend/inbox/ - Exécutez
stash_process_inbox - Utilisez
stash_listpour parcourir les sujets - Utilisez
stash_searchpour trouver les documents pertinents - Utilisez
stash_extractpour lire un document spécifique, oustash_askpour poser des questions à son sujet
Dépannage
« Navigateur fermé de manière inattendue » ou erreurs similaires
Essayez de réinstaller le navigateur :
npx playwright install chromium --force
Sur Linux, vous pourriez également avoir besoin de dépendances système :
npx playwright install-deps chromium
Le serveur ne démarre pas
Assurez-vous d'utiliser Node.js 20 ou une version plus récente :
node --version
Si votre version est plus ancienne, visitez nodejs.org pour en télécharger une plus récente.
Licence
MIT