Votre agent de codage est très doué pour trouver des éléments dans un dépôt, tant qu’ils sont du texte. Demandez à Claude Code ou à Cursor ce que la fiche technique du capteur indique concernant la température de fonctionnement et il utilise grep, ne trouve rien, puis devine ou abandonne, car la fiche technique est un PDF et le registre de décision est un fichier Word. GroupDocs.Search.Mcp s’exécute localement dans Docker et fournit à l’agent un index plein texte sur ces documents, avec la même boucle recherche‑puis‑lecture qu’il utilise déjà pour le code :

Indexez le dossier docs, puis dites‑moi ce que la fiche technique du capteur indique concernant la température de fonctionnement et quel ADR a décidé du stockage de télémétrie.

La version pas‑à‑pas avec configuration et dépannage se trouve dans la documentation : How to let Claude Code or Cursor search the PDFs and Word documents in a repository.

Pourquoi grep ne renvoie-t-il rien ?

Parce que les PDF et DOCX ne stockent pas leurs mots en texte brut. Un DOCX est une archive zip ; un PDF compresse ses flux de texte. Rechercher octet par octet ne trouve pas les mots. Nous l’avons testé avec un petit dépôt : un PDF de fiche technique, un registre de décision d’architecture et un document d’exigences en DOCX, ainsi qu’un fichier source.

$ grep -ri "TimescaleDB\|operating temperature\|I2C" docs/
$ grep -rn "datasheet" src/
src/sensor.py:1:MAX_TEMP_C = 85  # see docs/datasheet

Le seul résultat est un commentaire de code pointant vers le document que l’agent ne peut pas lire. C’est le problème : la raison d’une constante, la décision derrière un design, l’exigence derrière un test résident souvent exactement dans ces fichiers.

Qu’est‑ce qui change avec un index ?

L’agent obtient un outil de récupération pour les documents. Enregistrez le serveur depuis la racine du dépôt, de façon que le dépôt soit monté comme dossier de stockage :

claude mcp add groupdocs-search -- docker run --rm -i \
  -v "$(pwd)":/data ghcr.io/groupdocs-search/search-net-mcp:latest

Ensuite les mêmes questions obtiennent des réponses. Voici ce que le serveur a renvoyé dans notre dépôt de test (chemins affichés relatifs à la racine du dépôt) :

-> add_to_index {"documentsPath":"docs","indexName":"gateway"}
<- Indexed 'docs' into index 'gateway': 3 document(s) added,
   3 in the index.

-> search {"query":"TimescaleDB","indexName":"gateway"}
<- documentsFound 1: docs/adr-007-telemetry-storage.docx

-> get_text_fragments {"query":"I2C","indexName":"gateway"}
<- === docs/requirements-v2.docx (1 occurrence(s)) ===
     …REQ-15: the I2C bus runs at 400 kHz.…
   === docs/tmp117-sensor-datasheet.pdf (1 occurrence(s)) ===
     …I2C address selection: ADD0 pin to GND gives 0x48…

Une requête a trouvé à la fois l’exigence et la ligne de la fiche technique, ce qui représente le type de référence croisée fastidieuse à faire manuellement et impossible avec grep. Sur notre petit index, les recherches reviennent en 80 à 240 millisecondes après le premier appel.

La boucle que l’agent connaît déjà

user              agent                         Search MCP server
 |  "Que dit la fiche technique à propos des adresses I2C ?"         |
 |---------------->|                                           |
 |                 |-- search {"query":"I2C"} --------------->|
 |                 |<- requirements-v2.docx,                   |
 |                 |   tmp117-sensor-datasheet.pdf ------------|
 |                 |-- get_text_fragments {"query":"I2C"} --->|
 |                 |<- "...ADD0 pin to GND gives 0x48..." -----|
 |<- "0x48 avec ADD0 à la terre, 0x49 à V+ (fiche technique, p.1);      |
 |    REQ-15 fait fonctionner le bus à 400 kHz."                         |

search indique quels fichiers, get_text_fragments renvoie les lignes correspondantes avec quelques mots de contexte, et l’agent cite les deux. C’est la forme de grep, étendue à 82 formats : PDF, DOCX, XLSX, PPTX, HTML, Markdown, même les fils de courriels exportés dans le dépôt.

Indiquer à l’agent quand l’utiliser

Les agents suivent les instructions du projet concernant le moment d’utiliser un outil. Trois lignes dans CLAUDE.md ou AGENTS.md font la différence entre un agent qui tente grep, échoue et abandonne, et un qui interroge d’abord l’index :

PDF, DOCX and XLSX files under docs/ are indexed in the groupdocs-search MCP index
'docs'. grep cannot read them: use search (quote phrases) and get_text_fragments
for anything in specs, datasheets or ADRs, and cite the file.
Run update_index (indexName: docs) after pulling changes.

Deux points d’entretien. L’index est écrit dans .groupdocs-search-index/ à la racine du dossier monté, ajoutez‑le donc à .gitignore. Et après un pull, update_index relit uniquement ce qui a changé, ainsi garder l’index à jour ne coûte qu’un appel.

Cursor et VS Code

Le même conteneur fonctionne dans n’importe quel client MCP. Dans VS Code, un espace de travail .vscode/mcp.json peut monter le dossier ouvert, de façon que l’index suive le projet :

{
  "servers": {
    "groupdocs-search": {
      "type": "stdio",
      "command": "docker",
      "args": [ "run", "--rm", "-i",
                "-v", "${workspaceFolder}:/data",
                "ghcr.io/groupdocs-search/search-net-mcp:latest" ]
    }
  }
}

Cursor utilise le même command et les mêmes args sous mcpServers dans .cursor/mcp.json. Commitez le fichier de configuration et chaque développeur du projet disposera de l’outil ; gardez l’index lui‑même hors du dépôt git.

Pourquoi ne pas tout convertir en texte d’abord ?

Vous pouvez : faire convertir chaque PDF à la volée, ou vérifier les copies Markdown dans le dépôt. Les deux fonctionnent pour quelques fichiers. L’index effectue la conversion une seule fois, la maintient à jour avec un appel, et répond quel fichier importe avant que l’agent ne le lise, ce qui réduit le contexte d’une longue session. Le moteur derrière cela est GroupDocs.Search, qui lit directement les documents Office et PDF plutôt que via un convertisseur que vous devez entretenir.

Limites honnêtes

  • En mode évaluation, un index ne contient au maximum que 100 documents et une recherche renvoie au plus 10 résultats ; appelez d’abord get_license_status.
  • Texte intégral, pas sémantique : l’agent doit utiliser les mots employés dans les documents, ou essayer des variantes.
  • Pas d’OCR : une fiche technique numérisée sans couche texte est indexée uniquement par ses propriétés de fichier.
  • Docker uniquement. Sous Linux, ajoutez --user "$(id -u):$(id -g)" afin que le conteneur puisse écrire l’index dans un dépôt que vous possédez.

FAQ

Claude Code peut-il lire les fichiers PDF dans mon dépôt ?
Pas avec grep. Avec le serveur GroupDocs.Search MCP il peut les rechercher et les citer, localement, sans les convertir au préalable.

Fonctionne-t-il aussi dans Cursor et VS Code ?
Oui. Utilisez les mêmes arguments docker run dans .cursor/mcp.json ou .vscode/mcp.json ; VS Code peut monter ${workspaceFolder}`.

L’index finira-t-il dans mes commits ?
Seulement si vous le laissez faire. Ajoutez .groupdocs-search-index/ à .gitignore.

Aller plus loin