Lacuna Research

officiel

Carte en lecture seule de la recherche en ML pour les agents de programmation : articles, axes de recherche, auteurs, conférences, institutions et hypothèses, chacun lié à ses sources. Hébergée, sans authentification ; également disponible sous forme de package PyPI.

Que pouvez-vous faire avec Lacuna Research MCP ?

  • Relier le code aux articles — Demandez quel article un dépôt GitHub met en œuvre et suivez la relation enregistrée official_code_for jusqu’à l’article et à ses sources.
  • Rechercher dans la littérature — Lancez une recherche d’articles avec search_lacuna, puis ouvrez un résultat avec get_paper pour obtenir un aperçu contextuel concis comprenant le résumé, les auteurs et les figures.
  • Trouver des ressources associées — Recherchez des bases de code, des jeux de données, des modèles ou des démos avec search_lacuna, puis examinez-en une avec get_resource pour consulter les articles associés et les facettes.
  • Explorer des pistes de recherche — Consultez le résumé d’une piste et parcourez les articles qui lui sont associés avec get_direction_papers.
  • Examiner les propositions générées — Recherchez des propositions avec search_type="hypothesis" et lisez-en une avec get_hypothesis comme une idée à étudier, et non comme un résultat établi.
  • Dresser le profil des chercheurs et des lieux de publication — Consultez le contexte, les articles, les pistes ou les chercheurs associés d’un auteur, puis comparez les lieux de publication et les institutions.

Serveur MCP hébergé

npx add-mcp 'https://lacuna.tiptreesystems.com/api/mcp'

S’installe dans Claude Code, Codex, Cursor et plus

Documentation

Lacuna Research MCP — Empower your coding agent for machine learning research

Python 3.11+ MCP server MIT license

Lacuna Research MCP

Lacuna, créé par Tiptree Systems, est une carte de la recherche en apprentissage automatique : un graphe de connaissances hétérogène reliant des articles, des axes de recherche, des auteurs, des lieux de publication, des institutions et des propositions de recherche générées, avec une piste de sources reliant chaque objet dérivé à l’article et à la page exacts qui l’ont produit.

Lacuna Research MCP fournit aux agents de programmation des chercheurs en IA :

  • Propositions de recherche générées. Explorez des idées de recherche générées avec The Alien Space of Science.
  • Axes de recherche. Parcourez des groupes de concepts associés à des articles, des auteurs et des propositions.
  • Littérature prête pour les agents. Recherchez des articles récents au format Markdown avec des liens vers les sources.
  • Informations sur les chercheurs. Retracez les auteurs, les publications, les axes de recherche, l’impact et les chercheurs associés.
  • Cartographie du paysage. Comparez les lieux de publication, les institutions, les chercheurs de premier plan et l’activité de publication.

Par exemple, retracez une implémentation jusqu’aux relations enregistrées avec les articles :

Trouve l’article à l’origine de Dao-AILab/flash-attention. Affiche la relation enregistrée avec le dépôt et crée un lien vers l’article original.

Cet exemple suit le parcours dépôt → relation enregistrée avec l’article → article et sources. Lacuna renvoie la relation official_code_for vers FlashAttention, avec des liens vers le dépôt et l’article original. Consultez ces sources pour vérifier la relation. Exécutez l’exemple ou parcourez le notebook.

Installation · Compétences de recherche · Première utilisation · Outils · Référence de l’API · Configuration

Installation

Extension d’agent pour Cursor

Ce dépôt fournit également la connexion MCP hébergée et les deux compétences de recherche sous la forme d’une extension d’agent. Cursor prend en charge ce format.

Pour la tester localement, copiez ce dépôt dans ~/.cursor/plugins/local/lacuna-research-mcp, rechargez Cursor et ouvrez Personnaliser pour vérifier les deux compétences et la connexion MCP. L’extension se connecte à https://lacuna.tiptreesystems.com/api/mcp ; aucune installation locale de Python ni aucun compte Lacuna ne sont nécessaires. Activez cette connexion ou un serveur Lacuna configuré manuellement pour éviter les outils en double.

Cursor et VS Code

Utilisez le serveur hébergé sans installation locale de Python ni compte Lacuna :

Add to Cursor Add to VS Code

Les boutons ouvrent le processus d’installation MCP de votre éditeur. Vérifiez l’URL du serveur et confirmez l’installation. Une fois connecté, posez la question sur FlashAttention ci-dessus ; votre agent devrait utiliser search_lacuna, get_resource et get_paper.

Configuration manuelle si le lien d’installation ne s’ouvre pas

Dans Cursor, fusionnez cette entrée dans mcpServers dans .cursor/mcp.json :

{
  "mcpServers": {
    "lacuna-research": {"url": "https://lacuna.tiptreesystems.com/api/mcp"}
  }
}

Dans VS Code, fusionnez cette entrée dans servers dans .vscode/mcp.json :

{
  "servers": {
    "lacuna-research": {"type": "http", "url": "https://lacuna.tiptreesystems.com/api/mcp"}
  }
}

Conservez toutes les entrées de serveur existantes. Ouvrez les paramètres MCP de votre éditeur pour vérifier la connexion et activer les outils de Lacuna pour la conversation.

Serveur MCP hébergé (connecteur Claude)

Utilisez le serveur MCP hébergé de Lacuna avec tout client prenant en charge Streamable HTTP. Aucune installation locale n’est nécessaire.

https://lacuna.tiptreesystems.com/api/mcp

Dans Claude, ouvrez Personnaliser → Connecteurs → + Ajouter → Ajouter un connecteur personnalisé. Nommez-le Lacuna Research, collez l’URL ci-dessus et sélectionnez Aucune connexion si une authentification vous est demandée. Terminez l’ajout, puis activez-le dans votre conversation via + → Connecteurs.

Pour les espaces de travail Team et Enterprise, le connecteur doit d’abord être ajouté dans Paramètres de l’organisation → Connecteurs. Consultez la configuration des connecteurs personnalisés de Claude pour plus de détails.

Installation locale

Le moyen le plus simple d’installer Lacuna Research MCP consiste à le demander à votre agent de programmation, par exemple Codex ou Claude Code :

Installe et configure le package lacuna-research-mcp depuis PyPI pour ce client.

Pour une configuration manuelle, les instructions ci-dessous utilisent uvx pour exécuter la dernière version balisée depuis PyPI. Installez d’abord uv ; Lacuna Research MCP nécessite Python 3.11 ou une version ultérieure.

Codex

Ajoutez le serveur avec l’interface en ligne de commande Codex :

codex mcp add lacuna-research -- uvx lacuna-research-mcp

Vous pouvez également ajouter l’entrée suivante à ~/.codex/config.toml (ou à .codex/config.toml dans un projet de confiance pour une configuration limitée au projet) :

[mcp_servers.lacuna-research]
command = "uvx"
args = ["lacuna-research-mcp"]

Exécutez codex mcp list pour vérifier que le serveur est configuré. L’application Codex, l’interface en ligne de commande et l’extension IDE partagent cette configuration sur la même machine.

Claude Code

Ajoutez le serveur à tous vos projets avec l’interface en ligne de commande Claude Code :

claude mcp add --scope user lacuna-research -- uvx lacuna-research-mcp

Omettez --scope user pour l’ajouter uniquement au projet actuel. Vous pouvez également ajouter l’entrée suivante sous l’objet de premier niveau mcpServers dans ~/.claude.json :

{
  "mcpServers": {
    "lacuna-research": {
      "type": "stdio",
      "command": "uvx",
      "args": ["lacuna-research-mcp"]
    }
  }
}

Exécutez claude mcp get lacuna-research pour vérifier que le serveur est configuré.

Claude Desktop

Ouvrez Paramètres → Développeur → Modifier la configuration, puis ajoutez le serveur sous mcpServers dans claude_desktop_config.json :

{
  "mcpServers": {
    "lacuna-research": {
      "command": "uvx",
      "args": ["lacuna-research-mcp"]
    }
  }
}

Redémarrez Claude Desktop après avoir enregistré le fichier.

Autres clients MCP

Pour tout client prenant en charge les serveurs MCP locaux via stdio, utilisez cette configuration standard :

{
  "mcpServers": {
    "lacuna-research": {
      "command": "uvx",
      "args": ["lacuna-research-mcp"]
    }
  }
}

Commande autonome

Installez le serveur MCP en tant que commande persistante :

uv tool install lacuna-research-mcp
lacuna-research-mcp

Exécutez-le sans installer de commande persistante :

uvx lacuna-research-mcp

Si cette commande se termine avec une erreur de préversion (par exemple, « Python 3.14.0rc2 est une préversion… »), votre uv utilise une préversion anticipée de Python 3.14 que le SDK MCP ne prend pas en charge. Mettez uv à jour (uv self update), installez une version publiée de Python (uv python install 3.14), ou exécutez uvx --python 3.13 lacuna-research-mcp.

Serveur HTTP auto-hébergé

Pour servir des clients MCP distants via Streamable HTTP plutôt que stdio :

uvx lacuna-research-mcp --transport streamable-http --host 0.0.0.0 --port 8000

Le point de terminaison est /mcp. Le serveur est sans état et répond en JSON ; il peut donc fonctionner derrière un répartiteur de charge sans affinité de session. Avec la valeur par défaut --host 127.0.0.1, le serveur n’accepte que les en-têtes Host provenant de localhost ; liez-le donc à une adresse autre que l’adresse de bouclage lorsqu’un proxy inverse transmet un nom d’hôte public.

Dernière version de développement

PyPI contient des versions balisées. Pour essayer plutôt le code le plus récent de la branche main :

uvx --from git+https://github.com/tiptreesystems/lacuna-research-mcp.git lacuna-research-mcp

Développement local

Avec uv :

git clone https://github.com/tiptreesystems/lacuna-research-mcp.git
cd lacuna-research-mcp
uv sync --extra dev
uv run lacuna-research-mcp

Avec pip :

cd <path-to-lacuna-research-mcp>
python3 -m venv .venv
. .venv/bin/activate
python -m pip install -U pip
python -m pip install -e .

Compétences de recherche

Le serveur MCP fournit des outils. Ces compétences facultatives apprennent à votre agent à les utiliser pour deux tâches de recherche :

CompétenceExemple de demande
Vérifier les travaux antérieursAvant d’implémenter la fusion de jetons pour un transformeur de vision, trouve les travaux les plus proches et une référence à inclure.
Relier le code aux articlesQuel article l’implémentation Dao-AILab/flash-attention met-elle en œuvre ? Affiche la relation enregistrée et les sources.

Connectez d’abord le serveur MCP. Ensuite, avec Node.js 22.20+ installé, exécutez la CLI des compétences depuis votre projet :

npx skills add tiptreesystems/lacuna-research-mcp

Choisissez les compétences et l’agent que vous utilisez. Pour installer uniquement le flux de travail reliant le code aux articles :

npx skills add tiptreesystems/lacuna-research-mcp --skill lacuna-code-to-paper

Par défaut, les compétences s’installent dans le projet actuel. Elles n’installent ni ne configurent le serveur MCP. Démarrez une nouvelle session d’agent après l’installation si votre client en a besoin pour détecter les nouvelles compétences.

Première utilisation

Posez l’une des questions ci-dessus à votre agent connecté, ou essayez une question sur une liste de lecture :

Ma liste contient FlashAttention et FlashAttention-2. Quels travaux de référence ou quelles limites devrais-je lire au sujet de l’attention à long contexte ?

Pour un exemple reproductible ne nécessitant aucune clé d’API de modèle, clonez ce dépôt et exécutez :

uv run examples/code_to_paper.py

Le notebook explique chaque étape et compare la piste de sources à une recherche portant sur un seul article. Pour utiliser directement les outils, suivez le même processus :

  1. search_lacuna(query="FlashAttention", search_type="resource", resource_kind="codebase", limit=5)
  2. Vérifiez l’identité du dépôt, puis transmettez l’identifiant renvoyé à get_resource(resource_id_or_url=...).
  3. Suivez un publications[].paper_id renvoyé avec get_paper(artifact_id_or_url=..., view="context", figure_limit=0).

Pour rechercher de la littérature, utilisez search_lacuna(query="methods for detecting prompt injection attacks", search_type="paper", limit=5). Pour obtenir des propositions générées, utilisez search_lacuna(query="LLM jailbreak defense", search_type="hypothesis", limit=5) et suivez un identifiant renvoyé avec get_hypothesis. Les propositions générées sont des idées à étudier, et non des preuves de résultats publiés.

À propos de Lacuna

Le pipeline de Lacuna rapproche les notices bibliographiques d’OpenAlex, OpenReview, DBLP et arXiv ; extrait les éléments conceptuels du texte des articles et les regroupe en axes de recherche (article de Lacuna) ; et échantillonne de nouvelles propositions de recherche à partir de ces axes avec The Alien Space of Science. La carte couvre plus de 2,29 millions d’articles, 215 000+ profils d’auteurs, 28 000+ axes de recherche, 25 000+ propositions de recherche et 5 300+ lieux de publication — et s’enrichit continuellement à mesure que de nouveaux articles d’arXiv et d’autres travaux sur l’IA sont intégrés.

Périmètre

Le corpus couvre la recherche en apprentissage automatique et en IA : articles, axes de recherche, travaux des auteurs, lieux de publication, institutions, hypothèses de recherche générées et ressources de recherche (dépôts GitHub, jeux de données et modèles Hugging Face, notices Zenodo) liées aux articles. Il ne contient ni biographies, ni actualités, ni contenu Web non lié à la recherche. Les agents doivent répondre aux questions hors de ce périmètre à partir d’autres sources.

Contenu disponible

  • search_lacuna Utilise le point de terminaison public /api/v1/search de Lacuna pour les directions de recherche, les articles, les auteurs, les revues, les établissements, les hypothèses et les ressources. Les recherches explicites d’articles (search_type="paper") utilisent le moteur de classement lexical et sémantique de production du serveur lorsque les autres arguments de classement conservent leurs valeurs par défaut. Passez search_type="hypothesis" pour rechercher des hypothèses. Passez search_type="resource" pour rechercher des dépôts de code, des jeux de données, des modèles et des démonstrations liés aux articles, avec un filtrage facultatif à l’aide de resource_kind (codebase, dataset, model, demo) et de provider (github, huggingface, zenodo) ; par exemple, resource_kind="dataset" trouve des jeux de données de référence. La recherche de ressources rejette date_from/date_to, venue, les tris par année et le classement sémantique (les ressources n’ont ni dates, ni revues, ni embeddings).
  • get_hypothesis(hypothesis_id_or_url, view="context") Hypothèse/proposition. view="context" (par défaut) fournit un contexte de proposition compact en un seul appel (résumé, abstract, directions liées) ; view="full" renvoie l’enregistrement de version du serveur avec l’historique des versions et le nombre de signaux. Les corps des propositions se trouvent dans versions[].markdown.
  • get_direction(cluster_id_or_url, view="context") Direction de recherche/cluster. view="context" (par défaut) demande le résumé compact destiné aux agents ; view="full" renvoie l’enregistrement brut du cluster.
  • get_direction_papers(cluster_id_or_url, page, limit, view="compact") Articles paginés associés à une direction. view="compact" (par défaut) renvoie des lignes prêtes à citer (id, url, titre, année, revue, quelques auteurs, extrait de l’abstract) ; view="full" renvoie les enregistrements bruts des articles en amont.
  • get_paper(artifact_id_or_url, view="context", figure_limit=None, include_resources=True) Recherche d’article avec les versions disponibles ; utilisez l’ID d’artefact d’une version pour la lire. Les ressources liées (dépôts de code, jeux de données, modèles et démonstrations) sont incluses par défaut dans les vues context et full ; passez include_resources=False pour les omettre. Les autres vues ignorent cette option. view="context" (par défaut) demande le contexte compact destiné aux agents ; les autres vues sont "full", "preview", "blog", "figures", "concepts" ou "neighbors". Dans la vue context, figure_limit limite l’aperçu des figures (valeur par défaut du serveur : 3 ; passez 0 pour supprimer les aperçus tout en conservant un signal figures_truncated).
  • get_resource(resource_id_or_url) Recherche de ressource par id (issu de la recherche de ressources ou de la liste resources de get_paper) ou par URL /resource/... de Lacuna : URL externe, résumé, facettes (tâches, modalités, taille, licence), métriques du fournisseur, extrait du README/de la fiche, articles liés sous publications (avec paper_id et une relation telle que dataset_for), directions associées et ressources mentionnées.
  • Outils pour les auteurs : get_author_context(…, view="context"), get_author_papers, get_author_directions et get_author_neighbors. Commencez par get_author_context, qui utilise par défaut la vue compacte destinée aux agents (nombre limité d’articles et liste impact_directions lisible plutôt que la télémétrie brute impact_clusters). Utilisez les outils dédiés aux articles, aux directions et aux voisins pour parcourir ces collections sans répéter le contexte de l’auteur. view="full" renvoie le contexte complet, dans les limites imposées par le serveur (les collections restent limitées à 100). Passez include_neighbors=true pour inclure explicitement les auteurs similaires ; cela peut augmenter considérablement la latence du serveur.
  • Outils pour les revues et les établissements : get_venue_context(…, view="context"), get_institution_context(…, view="context"), get_institution_authors. Les outils de contexte utilisent par défaut le format compact (listes limitées, blocs dupliqués supprimés ; pour les revues, une tranche d’activité récente qui inclut toujours le year demandé). Utilisez get_institution_authors pour parcourir la liste complète des auteurs d’un établissement.

API encapsulées

Outil MCPPoint de terminaison de l’API Lacuna
search_lacuna(query, search_type, limit, offset, author_id_or_url, date_from, date_to, venue, sort, ranking_profile, fields, resource_kind, provider)GET /api/v1/search (resource_kind et provider sont envoyés sous forme de paramètres de requête kind et provider répétés et nécessitent search_type="resource" ou "all". author_id_or_url limite search_type="paper" à un seul auteur et accepte un ID d’auteur brut ou l’URL de sa page Lacuna. fields restreint/pondère les champs textuels utilisés pour le classement lexical, par ex. title^4,abstract, et sélectionne le moteur de classement lexical expérimental ; pour une recherche d’articles triée par pertinence par défaut, cela contourne le moteur de classement lexical et sémantique de production. Les champs autorisés sont title, abstract, summary, concepts, name, top_names, venue, description, topics, provider_key, paper_titles, chacun n’étant valide que pour les types qui le prennent en charge — title : article/cluster/revue/hypothèse/ressource ; description/topics/provider_key/paper_titles : ressource ; abstract/summary/concepts : article ; name : auteur/établissement/revue ; top_names : cluster/hypothèse ; venue : article/revue (search_type="all" couvre tous les types). Les pondérations doivent respecter 0 < weight <= 100. Les champs inconnus, les pondérations hors limites, les champs incompatibles avec le type et la combinaison de fields avec ranking_profile="semantic" sont rejetés, car le serveur les supprimerait, les plafonnerait ou les ignorerait silencieusement.)
get_hypothesis(hypothesis_id_or_url, view="context")view="context" → GET /api/v1/context/hypothesis/{hypothesis_id}?view=compact ; view="full" → GET /api/v1/hypotheses/{hypothesis_id}
get_direction(cluster_id_or_url, view="context")view="context" → GET /api/v1/context/direction/{cluster_id}?view=compact ; view="full" → GET /api/v1/clusters/{cluster_id}
get_direction_papers(cluster_id_or_url, page, limit, view="compact")GET /api/v1/clusters/{cluster_id}/papers?view=compact (par défaut) ou ?view=complete
get_paper(artifact_id_or_url, view="context", figure_limit=None, include_resources=True)view="context" → GET /api/v1/context/paper/{artifact_id}?view=compact (&figure_limit=N lorsqu’il est défini) ; view="full" → GET /api/v1/papers/{artifact_id} ; view="preview" → …/preview ; view="blog" → …/blog ; view="figures" → …/figures ; view="concepts" → …/concepts ; view="neighbors" → …/neighbors ; context et full envoient include_resources. Une URL de page Work (/work/<name>, /work/<slug>/wrk_…) ou un id wrk_… brut est d’abord lu via GET /api/v1/context/work/{work_id_or_name}
get_resource(resource_id_or_url)GET /api/v1/resources/{resource_id}
get_author_papers(author_id_or_url, limit=50, offset=0)GET /api/v1/authors/{author_id}/papers
get_author_directions(author_id_or_url, limit=50, offset=0)GET /api/v1/authors/{author_id}/directions
get_author_context(author_id_or_url, view="context", include_neighbors=false)view="context" → GET /api/v1/context/author/{author_id}?view=compact ; view="full" → GET /api/v1/context/author/{author_id} (include_neighbors=true demande explicitement les auteurs similaires)
get_author_neighbors(author_id_or_url, limit=8, offset=0)GET /api/v1/authors/{author_id}/neighbors
get_venue_context(venue_key_or_url, year, view="context")view="context" → GET /api/v1/context/venue/{vkey}[/{year}]?view=compact ; view="full" → même route sans view
get_institution_context(institution_key_or_url, view="context")view="context" → GET /api/v1/context/institution/{ikey}?view=compact ; view="full" → même route sans view
get_institution_authors(institution_key_or_url, limit=50, offset=0)GET /api/v1/institutions/{ikey}/authors

Pour les arguments id-or-URL, passez soit l’id brut renvoyé par search_lacuna, soit l’URL de la page Lacuna correspondante. Le MCP normalise les champs url et *_url relatifs à Lacuna en URL absolues, et convertit également en URL absolues les liens Lacuna (y compris les pages /resource/...) présents dans les champs nommés summary_markdown, article_markdown, markdown, content ou description.

get_author_context est limité côté serveur dans les deux vues. La vue compacte par défaut renvoie un briefing sélectionné ; view="full" renvoie la structure complète plus détaillée, avec les collections intégrées limitées à 100. Utilisez get_author_papers et get_author_directions plutôt que d’essayer de parcourir les collections intégrées au contexte.

Les recherches sont limitées à 50 résultats par appel, et les requêtes de pages d’articles par direction sont limitées à 100 résultats par appel. Dans search_lacuna, date_from et date_to sont des bornes inclusives de dates de publication. Les formats acceptés sont YYYY, YYYY-MM et YYYY-MM-DD ; par exemple, date_from="2020", date_to="2022-03" inclut les articles du 1er janvier 2020 au 31 mars 2022.

search_lacuna expose les profils de classement suivants :

  • default / lexical Profil par défaut pour toutes les recherches. Lorsque search_type="paper", sort="relevance" et fields ne sont pas définis, il utilise le moteur de classement lexical et sémantique de production du serveur, avec repli progressif. Le search_type="all" par défaut du MCP utilise plutôt le classement lexical par défaut du serveur.
  • semantic À utiliser pour la recherche d’articles fondée sur les embeddings. La requête sémantique omet la composante de classement lexical habituelle, mais le serveur peut toujours ajouter les correspondances lexicales exactes de titres. Pris en charge uniquement pour les recherches paper et all (seuls les articles ont des embeddings sémantiques), et incompatible avec les filtres resource_kind/provider.
  • bm25_title_abstract / bm25 À utiliser pour la correspondance lexicale limitée au titre et à l’abstract. Rejeté pour les recherches author et institution (ces enregistrements n’ont pas de champs de titre ou d’abstract).

Toutes les recherches utilisent la valeur par défaut du serveur, sauf si ranking_profile est fourni. Le MCP rejette les combinaisons profil/type non prises en charge, car le serveur se rabattrait autrement sur une recherche par sous-chaîne et ignorerait silencieusement le profil de classement demandé.

sort accepte relevance (par défaut), year_desc et year_asc. Les tris par année ne peuvent pas être combinés avec ranking_profile="semantic" — le serveur ignorerait silencieusement le tri — ; le MCP rejette donc cette combinaison. Pour les requêtes visant des résultats récents et pertinents, conservez le classement sémantique et limitez la récence avec date_from/date_to.

Variables d’environnement

  • LACUNA_SITE_URL Valeur par défaut : https://lacuna.tiptreesystems.com
  • LACUNA_MCP_TIMEOUT Valeur par défaut : 30
  • LACUNA_MCP_MAX_RETRIES Valeur par défaut : 2 ; s’applique aux délais d’attente, aux erreurs de transport et aux réponses HTTP 429, 502, 503 et 504.
  • LACUNA_MCP_USER_AGENT Valeur par défaut : lacuna-research-mcp/{package_version}
  • LACUNA_MCP_BEARER_TOKEN Jeton bearer facultatif envoyé sous la forme Authorization: Bearer ... pour les déploiements privés de Lacuna.
  • LACUNA_MCP_CLIENT_TOKEN Jeton facultatif envoyé sous la forme X-Lacuna-Client-Token pour identifier auprès de Lacuna un serveur MCP hébergé, afin de bénéficier de sa propre limite de débit de recherche.
  • LACUNA_MCP_LOG_LEVEL Valeur par défaut : WARNING (l’une des valeurs suivantes : DEBUG, INFO, WARNING, ERROR, CRITICAL). La valeur par défaut garde le fonctionnement normal silencieux ; ne la réduisez que pour le débogage, car INFO/DEBUG permettent au client HTTP de journaliser sur stderr les URL complètes des requêtes — y compris la chaîne de requête de recherche — que certains hôtes MCP conservent.

Les variables d’environnement sont lues une seule fois lors de la création du serveur MCP, ou lors du premier appel direct à un outil/à l’API si le module est importé sans appeler create_mcp().

Organisation de l’implémentation

Le serveur est un adaptateur MCP léger au-dessus de l’API HTTP de Lacuna. L’implémentation est répartie selon les responsabilités :

  • lacuna_research_mcp/server.py Création de l’application MCPServer, enregistrement des outils, nettoyage du cycle de vie et point d’entrée CLI lacuna-research-mcp.
  • lacuna_research_mcp/tools.py Fonctions des outils MCP. Chaque outil normalise ses entrées, appelle le point de terminaison Lacuna correspondant via les fonctions d’aide du client partagé et renvoie des données compatibles avec JSON.
  • lacuna_research_mcp/client.py Accès HTTP à Lacuna à l’exécution : le httpx.AsyncClient lié à la boucle d’événements, la gestion des nouvelles tentatives, l’encapsulation des erreurs, l’analyse JSON, la normalisation des URL dans les réponses et api_get/api_object/api_payload.
  • lacuna_research_mcp/config.py Constantes d’exécution, RuntimeConfig, construction de l’agent utilisateur du package et analyse de l’environnement.
  • lacuna_research_mcp/ids.py Fonctions d’aide acceptant des id bruts ou des URL de pages Lacuna et extrayant des segments de chemin d’API sûrs.
  • lacuna_research_mcp/normalize.py Post-traitement des réponses pour les URL Lacuna relatives et les liens Markdown.
  • lacuna_research_mcp/errors.py Type d’exception destiné à l’utilisateur pour les échecs d’accès à l’API Lacuna.

Remarques

  • get_paper et get_direction utilisent view="context" par défaut. Ces vues contextuelles demandent par défaut les charges utiles compactes de Lacuna, conçues pour les agents, afin de limiter la taille des réponses MCP. Le contexte d’un article inclut summary_markdown lorsqu’il est disponible (sinon abstract), les auteurs et les figures ; le contexte d’une direction inclut summary_markdown, un nombre limité d’articles, d’auteurs et de directions connexes, ainsi que des marqueurs de troncature. Utilisez view="full" lorsque vous avez besoin des métadonnées brutes, et les autres vues d’article (preview, blog, figures, concepts, neighbors) lorsque vous souhaitez consulter une seule sous-ressource isolée.
  • Une recherche d’articles explicite, triée par pertinence et sans fields personnalisé, utilise par défaut le moteur de classement lexical et sémantique de production du serveur. Définissez ranking_profile="semantic" pour une recherche basée sur des embeddings (avec éventuellement une surcouche de correspondance exacte des titres) ou "bm25_title_abstract" pour une correspondance lexicale sur les titres et les résumés.
  • La plupart des outils de détail acceptent soit l’identifiant renvoyé par la recherche, soit l’URL Lacuna correspondante.
  • Les URL Lacuna relatives dans les champs de réponse url/*_url et dans les champs nommés summary_markdown, article_markdown, markdown, content ou description sont converties en URL absolues.
  • Les clés des lieux de publication et des établissements sont des hachages opaques (par exemple d7bf22905bd6), et non des noms lisibles par un humain comme icml. Trouvez d’abord la clé avec search_lacuna(search_type="venue"), ou transmettez une URL de page /venue/....

Citation

Si nos travaux vous sont utiles, n’hésitez pas à citer les articles à l’origine de la génération de propositions de recherche et de la carte de recherche de Lacuna.

Génération de propositions de recherche — The Alien Space of Science

@inproceedings{artiles2026alien,
  title     = {The Alien Space of Science: Sampling Coherent but Cognitively Unavailable Research Directions},
  author    = {Artiles, Alejandro H. and Weiss, Martin and Brinkmann, Levin and Rahwan, Iyad and Sch{\"o}lkopf, Bernhard and Pal, Christopher and Larochelle, Hugo and Goyal, Anirudh and Rahaman, Nasim},
  booktitle = {Advances in Neural Information Processing Systems},
  year      = {2026},
  eprint    = {2603.01092},
  archivePrefix = {arXiv},
  url       = {https://arxiv.org/abs/2603.01092}
}

Carte de recherche — Lacuna

@misc{weiss2026lacunaresearchmapmachine,
  title         = {Lacuna: A Research Map for Machine Learning},
  author        = {Martin Weiss and Miles Q. Li and Alejandro H. Artiles and Yacine Mkhinini and Chris Pal and Hugo Larochelle and Nasim Rahaman},
  year          = {2026},
  eprint        = {2606.26246},
  archivePrefix = {arXiv},
  primaryClass  = {cs.DL},
  url           = {https://arxiv.org/abs/2606.26246}
}

Licence

MIT. Consultez LICENSE.