abb-opencode-local-rag 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (233) hide show
  1. package/LICENSE +21 -0
  2. package/README.de.md +416 -0
  3. package/README.es.md +416 -0
  4. package/README.fr.md +416 -0
  5. package/README.md +491 -0
  6. package/README.pt-BR.md +416 -0
  7. package/README.zh-CN.md +416 -0
  8. package/dist/bin/install-skills.d.ts +20 -0
  9. package/dist/bin/install-skills.d.ts.map +1 -0
  10. package/dist/bin/install-skills.js +195 -0
  11. package/dist/bin/install-skills.js.map +1 -0
  12. package/dist/chunker/index.d.ts +24 -0
  13. package/dist/chunker/index.d.ts.map +1 -0
  14. package/dist/chunker/index.js +2 -0
  15. package/dist/chunker/index.js.map +1 -0
  16. package/dist/chunker/semantic-chunker.d.ts +97 -0
  17. package/dist/chunker/semantic-chunker.d.ts.map +1 -0
  18. package/dist/chunker/semantic-chunker.js +294 -0
  19. package/dist/chunker/semantic-chunker.js.map +1 -0
  20. package/dist/chunker/sentence-splitter.d.ts +28 -0
  21. package/dist/chunker/sentence-splitter.d.ts.map +1 -0
  22. package/dist/chunker/sentence-splitter.js +219 -0
  23. package/dist/chunker/sentence-splitter.js.map +1 -0
  24. package/dist/cli/common.d.ts +65 -0
  25. package/dist/cli/common.d.ts.map +1 -0
  26. package/dist/cli/common.js +138 -0
  27. package/dist/cli/common.js.map +1 -0
  28. package/dist/cli/delete.d.ts +8 -0
  29. package/dist/cli/delete.d.ts.map +1 -0
  30. package/dist/cli/delete.js +173 -0
  31. package/dist/cli/delete.js.map +1 -0
  32. package/dist/cli/file-collection.d.ts +2 -0
  33. package/dist/cli/file-collection.d.ts.map +1 -0
  34. package/dist/cli/file-collection.js +53 -0
  35. package/dist/cli/file-collection.js.map +1 -0
  36. package/dist/cli/ingest.d.ts +100 -0
  37. package/dist/cli/ingest.d.ts.map +1 -0
  38. package/dist/cli/ingest.js +363 -0
  39. package/dist/cli/ingest.js.map +1 -0
  40. package/dist/cli/list.d.ts +35 -0
  41. package/dist/cli/list.d.ts.map +1 -0
  42. package/dist/cli/list.js +210 -0
  43. package/dist/cli/list.js.map +1 -0
  44. package/dist/cli/options.d.ts +100 -0
  45. package/dist/cli/options.d.ts.map +1 -0
  46. package/dist/cli/options.js +241 -0
  47. package/dist/cli/options.js.map +1 -0
  48. package/dist/cli/query.d.ts +24 -0
  49. package/dist/cli/query.d.ts.map +1 -0
  50. package/dist/cli/query.js +191 -0
  51. package/dist/cli/query.js.map +1 -0
  52. package/dist/cli/read-neighbors.d.ts +11 -0
  53. package/dist/cli/read-neighbors.d.ts.map +1 -0
  54. package/dist/cli/read-neighbors.js +224 -0
  55. package/dist/cli/read-neighbors.js.map +1 -0
  56. package/dist/cli/status.d.ts +8 -0
  57. package/dist/cli/status.d.ts.map +1 -0
  58. package/dist/cli/status.js +80 -0
  59. package/dist/cli/status.js.map +1 -0
  60. package/dist/cli/sync.d.ts +8 -0
  61. package/dist/cli/sync.d.ts.map +1 -0
  62. package/dist/cli/sync.js +244 -0
  63. package/dist/cli/sync.js.map +1 -0
  64. package/dist/cli-main.d.ts +12 -0
  65. package/dist/cli-main.d.ts.map +1 -0
  66. package/dist/cli-main.js +63 -0
  67. package/dist/cli-main.js.map +1 -0
  68. package/dist/embedder/index.d.ts +85 -0
  69. package/dist/embedder/index.d.ts.map +1 -0
  70. package/dist/embedder/index.js +284 -0
  71. package/dist/embedder/index.js.map +1 -0
  72. package/dist/features/list.d.ts +37 -0
  73. package/dist/features/list.d.ts.map +1 -0
  74. package/dist/features/list.js +40 -0
  75. package/dist/features/list.js.map +1 -0
  76. package/dist/features/sync.d.ts +207 -0
  77. package/dist/features/sync.d.ts.map +1 -0
  78. package/dist/features/sync.js +380 -0
  79. package/dist/features/sync.js.map +1 -0
  80. package/dist/index.d.ts +3 -0
  81. package/dist/index.d.ts.map +1 -0
  82. package/dist/index.js +53 -0
  83. package/dist/index.js.map +1 -0
  84. package/dist/ingest/compute.d.ts +86 -0
  85. package/dist/ingest/compute.d.ts.map +1 -0
  86. package/dist/ingest/compute.js +177 -0
  87. package/dist/ingest/compute.js.map +1 -0
  88. package/dist/ingest/file.d.ts +27 -0
  89. package/dist/ingest/file.d.ts.map +1 -0
  90. package/dist/ingest/file.js +67 -0
  91. package/dist/ingest/file.js.map +1 -0
  92. package/dist/ingest/visual.d.ts +45 -0
  93. package/dist/ingest/visual.d.ts.map +1 -0
  94. package/dist/ingest/visual.js +234 -0
  95. package/dist/ingest/visual.js.map +1 -0
  96. package/dist/parser/docx-parser.d.ts +12 -0
  97. package/dist/parser/docx-parser.d.ts.map +1 -0
  98. package/dist/parser/docx-parser.js +328 -0
  99. package/dist/parser/docx-parser.js.map +1 -0
  100. package/dist/parser/html-parser.d.ts +18 -0
  101. package/dist/parser/html-parser.d.ts.map +1 -0
  102. package/dist/parser/html-parser.js +102 -0
  103. package/dist/parser/html-parser.js.map +1 -0
  104. package/dist/parser/index.d.ts +214 -0
  105. package/dist/parser/index.d.ts.map +1 -0
  106. package/dist/parser/index.js +454 -0
  107. package/dist/parser/index.js.map +1 -0
  108. package/dist/parser/pdf-extract.d.ts +81 -0
  109. package/dist/parser/pdf-extract.d.ts.map +1 -0
  110. package/dist/parser/pdf-extract.js +112 -0
  111. package/dist/parser/pdf-extract.js.map +1 -0
  112. package/dist/parser/pdf-filter.d.ts +117 -0
  113. package/dist/parser/pdf-filter.d.ts.map +1 -0
  114. package/dist/parser/pdf-filter.js +528 -0
  115. package/dist/parser/pdf-filter.js.map +1 -0
  116. package/dist/parser/title-extractor.d.ts +69 -0
  117. package/dist/parser/title-extractor.d.ts.map +1 -0
  118. package/dist/parser/title-extractor.js +145 -0
  119. package/dist/parser/title-extractor.js.map +1 -0
  120. package/dist/pdf-visual/captioner.d.ts +16 -0
  121. package/dist/pdf-visual/captioner.d.ts.map +1 -0
  122. package/dist/pdf-visual/captioner.js +63 -0
  123. package/dist/pdf-visual/captioner.js.map +1 -0
  124. package/dist/pdf-visual/captioners/fast.d.ts +7 -0
  125. package/dist/pdf-visual/captioners/fast.d.ts.map +1 -0
  126. package/dist/pdf-visual/captioners/fast.js +103 -0
  127. package/dist/pdf-visual/captioners/fast.js.map +1 -0
  128. package/dist/pdf-visual/captioners/quality.d.ts +7 -0
  129. package/dist/pdf-visual/captioners/quality.d.ts.map +1 -0
  130. package/dist/pdf-visual/captioners/quality.js +127 -0
  131. package/dist/pdf-visual/captioners/quality.js.map +1 -0
  132. package/dist/pdf-visual/captioners/shared.d.ts +44 -0
  133. package/dist/pdf-visual/captioners/shared.d.ts.map +1 -0
  134. package/dist/pdf-visual/captioners/shared.js +104 -0
  135. package/dist/pdf-visual/captioners/shared.js.map +1 -0
  136. package/dist/pdf-visual/detector.d.ts +9 -0
  137. package/dist/pdf-visual/detector.d.ts.map +1 -0
  138. package/dist/pdf-visual/detector.js +234 -0
  139. package/dist/pdf-visual/detector.js.map +1 -0
  140. package/dist/pdf-visual/index.d.ts +13 -0
  141. package/dist/pdf-visual/index.d.ts.map +1 -0
  142. package/dist/pdf-visual/index.js +45 -0
  143. package/dist/pdf-visual/index.js.map +1 -0
  144. package/dist/pdf-visual/renderer.d.ts +9 -0
  145. package/dist/pdf-visual/renderer.d.ts.map +1 -0
  146. package/dist/pdf-visual/renderer.js +177 -0
  147. package/dist/pdf-visual/renderer.js.map +1 -0
  148. package/dist/pdf-visual/types.d.ts +62 -0
  149. package/dist/pdf-visual/types.d.ts.map +1 -0
  150. package/dist/pdf-visual/types.js +32 -0
  151. package/dist/pdf-visual/types.js.map +1 -0
  152. package/dist/server/error-utils.d.ts +79 -0
  153. package/dist/server/error-utils.d.ts.map +1 -0
  154. package/dist/server/error-utils.js +148 -0
  155. package/dist/server/error-utils.js.map +1 -0
  156. package/dist/server/index.d.ts +258 -0
  157. package/dist/server/index.d.ts.map +1 -0
  158. package/dist/server/index.js +1104 -0
  159. package/dist/server/index.js.map +1 -0
  160. package/dist/server/list-scanner.d.ts +52 -0
  161. package/dist/server/list-scanner.d.ts.map +1 -0
  162. package/dist/server/list-scanner.js +72 -0
  163. package/dist/server/list-scanner.js.map +1 -0
  164. package/dist/server/tool-definitions.d.ts +8 -0
  165. package/dist/server/tool-definitions.d.ts.map +1 -0
  166. package/dist/server/tool-definitions.js +181 -0
  167. package/dist/server/tool-definitions.js.map +1 -0
  168. package/dist/server/tool-input.d.ts +37 -0
  169. package/dist/server/tool-input.d.ts.map +1 -0
  170. package/dist/server/tool-input.js +216 -0
  171. package/dist/server/tool-input.js.map +1 -0
  172. package/dist/server/types.d.ts +331 -0
  173. package/dist/server/types.d.ts.map +1 -0
  174. package/dist/server/types.js +3 -0
  175. package/dist/server/types.js.map +1 -0
  176. package/dist/server-main.d.ts +46 -0
  177. package/dist/server-main.d.ts.map +1 -0
  178. package/dist/server-main.js +242 -0
  179. package/dist/server-main.js.map +1 -0
  180. package/dist/utils/base-dirs.d.ts +212 -0
  181. package/dist/utils/base-dirs.d.ts.map +1 -0
  182. package/dist/utils/base-dirs.js +422 -0
  183. package/dist/utils/base-dirs.js.map +1 -0
  184. package/dist/utils/errors.d.ts +24 -0
  185. package/dist/utils/errors.d.ts.map +1 -0
  186. package/dist/utils/errors.js +53 -0
  187. package/dist/utils/errors.js.map +1 -0
  188. package/dist/utils/limits.d.ts +26 -0
  189. package/dist/utils/limits.d.ts.map +1 -0
  190. package/dist/utils/limits.js +28 -0
  191. package/dist/utils/limits.js.map +1 -0
  192. package/dist/utils/list-sources.d.ts +47 -0
  193. package/dist/utils/list-sources.d.ts.map +1 -0
  194. package/dist/utils/list-sources.js +50 -0
  195. package/dist/utils/list-sources.js.map +1 -0
  196. package/dist/utils/raw-data-utils.d.ts +131 -0
  197. package/dist/utils/raw-data-utils.d.ts.map +1 -0
  198. package/dist/utils/raw-data-utils.js +255 -0
  199. package/dist/utils/raw-data-utils.js.map +1 -0
  200. package/dist/utils/scan.d.ts +126 -0
  201. package/dist/utils/scan.d.ts.map +1 -0
  202. package/dist/utils/scan.js +221 -0
  203. package/dist/utils/scan.js.map +1 -0
  204. package/dist/utils/scope-match.d.ts +43 -0
  205. package/dist/utils/scope-match.d.ts.map +1 -0
  206. package/dist/utils/scope-match.js +87 -0
  207. package/dist/utils/scope-match.js.map +1 -0
  208. package/dist/utils/sensitive-path.d.ts +23 -0
  209. package/dist/utils/sensitive-path.d.ts.map +1 -0
  210. package/dist/utils/sensitive-path.js +91 -0
  211. package/dist/utils/sensitive-path.js.map +1 -0
  212. package/dist/utils/sync-path-key.d.ts +20 -0
  213. package/dist/utils/sync-path-key.d.ts.map +1 -0
  214. package/dist/utils/sync-path-key.js +33 -0
  215. package/dist/utils/sync-path-key.js.map +1 -0
  216. package/dist/vectordb/index.d.ts +168 -0
  217. package/dist/vectordb/index.d.ts.map +1 -0
  218. package/dist/vectordb/index.js +619 -0
  219. package/dist/vectordb/index.js.map +1 -0
  220. package/dist/vectordb/search-filters.d.ts +39 -0
  221. package/dist/vectordb/search-filters.d.ts.map +1 -0
  222. package/dist/vectordb/search-filters.js +136 -0
  223. package/dist/vectordb/search-filters.js.map +1 -0
  224. package/dist/vectordb/types.d.ts +196 -0
  225. package/dist/vectordb/types.d.ts.map +1 -0
  226. package/dist/vectordb/types.js +224 -0
  227. package/dist/vectordb/types.js.map +1 -0
  228. package/package.json +105 -0
  229. package/skills/mcp-local-rag/SKILL.md +308 -0
  230. package/skills/mcp-local-rag/references/cli-reference.md +175 -0
  231. package/skills/mcp-local-rag/references/html-ingestion.md +78 -0
  232. package/skills/mcp-local-rag/references/query-optimization.md +57 -0
  233. package/skills/mcp-local-rag/references/result-refinement.md +56 -0
package/README.fr.md ADDED
@@ -0,0 +1,416 @@
1
+ <p align="center">
2
+ <img src="assets/banner.jpg" alt="MCP Local RAG: Search below the surface." width="600" />
3
+ </p>
4
+
5
+ # MCP Local RAG
6
+
7
+ [![GitHub stars](https://img.shields.io/github/stars/shinpr/mcp-local-rag?style=social)](https://github.com/shinpr/mcp-local-rag)
8
+ [![npm version](https://img.shields.io/npm/v/mcp-local-rag.svg)](https://www.npmjs.com/package/mcp-local-rag)
9
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
10
+ [![MCP Registry](https://img.shields.io/badge/MCP-Registry-green.svg)](https://registry.modelcontextprotocol.io/)
11
+
12
+ <p align="center">
13
+ <a href="README.md">English</a> |
14
+ <a href="README.zh-CN.md">简体中文</a> |
15
+ <a href="README.de.md">Deutsch</a> |
16
+ <a href="README.es.md">Español</a> |
17
+ <a href="README.pt-BR.md">Português (Brasil)</a> |
18
+ <strong>Français</strong>
19
+ </p>
20
+
21
+ Recherchez dans des documents confidentiels depuis un client MCP ou un terminal, sans les envoyer à une API d'embeddings.
22
+
23
+ mcp-local-rag indexe les fichiers PDF, DOCX et Markdown ainsi que les fichiers texte sur votre machine. La recherche associe similarité sémantique et correspondance par mots-clés. Elle tient ainsi compte du sens de la requête comme des termes techniques exacts, tels que les noms d'API, de classes et les codes d'erreur.
24
+
25
+ ## Fonctionnalités
26
+
27
+ - **Exécution locale :** L'analyse des documents, les embeddings, le stockage et la recherche s'effectuent sur votre machine. Une fois le modèle téléchargé, l'import de texte et la recherche fonctionnent hors ligne.
28
+ - **Recherche hybride :** La recherche sémantique trouve les concepts voisins, tandis que la correspondance par mots-clés améliore le classement des termes techniques exacts.
29
+ - **Embeddings configurables :** Choisissez un modèle d'embeddings Hugging Face adapté à la langue et au domaine de vos documents.
30
+ - **Découpage sémantique :** Les documents sont découpés aux changements de sujet plutôt qu'après un nombre fixe de caractères. Les blocs de code Markdown restent intacts.
31
+ - **MCP et CLI :** Utilisez le même index depuis un outil de programmation assisté par IA ou directement dans le terminal.
32
+
33
+ Aucune clé d'API, aucun conteneur Docker, aucune installation de Python ni aucune base de données externe ne sont nécessaires.
34
+
35
+ ## Démarrage rapide
36
+
37
+ ### Prérequis
38
+
39
+ - Node.js 22 ou version ultérieure
40
+ - Une connexion Internet lors de la première utilisation pour télécharger le paquet npm et le modèle d'embeddings
41
+ - Un répertoire contenant les documents à rechercher
42
+
43
+ Définissez `BASE_DIR` sur ce répertoire. Il sert également de limite de sécurité pour les opérations sur les fichiers. Remplacez `/absolute/path/to/your/documents` dans les exemples par le chemin absolu du répertoire.
44
+
45
+ mcp-local-rag utilise le protocole MCP standard via un serveur stdio local. Il fonctionne donc avec les outils de programmation assistés par IA et les autres hôtes MCP qui prennent en charge les serveurs MCP locaux.
46
+
47
+ Utilisez l'un des exemples ci-dessous, ou enregistrez `npx -y mcp-local-rag` et définissez `BASE_DIR` selon le format de configuration MCP de votre client.
48
+
49
+ **Claude Code :** Exécutez cette commande :
50
+
51
+ ```bash
52
+ claude mcp add local-rag --scope user --env BASE_DIR=/absolute/path/to/your/documents -- npx -y mcp-local-rag
53
+ ```
54
+
55
+ **Codex :** Ajoutez ceci à `~/.codex/config.toml` :
56
+
57
+ ```toml
58
+ [mcp_servers.local-rag]
59
+ command = "npx"
60
+ args = ["-y", "mcp-local-rag"]
61
+
62
+ [mcp_servers.local-rag.env]
63
+ BASE_DIR = "/absolute/path/to/your/documents"
64
+ ```
65
+
66
+ **OpenCode :** Ajoutez ceci à `~/.config/opencode/opencode.json` (ou `opencode.jsonc`) :
67
+
68
+ ```json
69
+ {
70
+ "$schema": "https://opencode.ai/config.json",
71
+ "mcp": {
72
+ "local-rag": {
73
+ "type": "local",
74
+ "command": ["npx", "-y", "mcp-local-rag"],
75
+ "environment": {
76
+ "BASE_DIR": "/absolute/path/to/your/documents"
77
+ }
78
+ }
79
+ }
80
+ }
81
+ ```
82
+
83
+ **Cursor :** Ajoutez ceci à `~/.cursor/mcp.json` :
84
+
85
+ ```json
86
+ {
87
+ "mcpServers": {
88
+ "local-rag": {
89
+ "command": "npx",
90
+ "args": ["-y", "mcp-local-rag"],
91
+ "env": {
92
+ "BASE_DIR": "/absolute/path/to/your/documents"
93
+ }
94
+ }
95
+ }
96
+ }
97
+ ```
98
+
99
+ Redémarrez le client, puis demandez-lui de construire l'index :
100
+
101
+ ```text
102
+ Synchronise tous les documents du répertoire racine configuré et attends la fin de l'opération.
103
+ ```
104
+
105
+ La première synchronisation télécharge le modèle d'embeddings par défaut (environ 90 Mo). Une à deux minutes peuvent s'écouler avant le début de l'import. Les exécutions suivantes utilisent le cache local.
106
+
107
+ Une fois la synchronisation terminée, posez une question :
108
+
109
+ ```text
110
+ Que dit la documentation de l'API au sujet de l'authentification ?
111
+ ```
112
+
113
+ ### Démarrage rapide avec la CLI
114
+
115
+ Pour utiliser la CLI sans client MCP :
116
+
117
+ ```bash
118
+ npx mcp-local-rag ingest ./docs/
119
+ npx mcp-local-rag query "API d'authentification"
120
+ ```
121
+
122
+ Par défaut, la CLI utilise le répertoire courant comme racine documentaire. Exécutez les deux commandes depuis le même répertoire pour qu'elles partagent l'index par défaut, ou définissez explicitement `BASE_DIR` et `DB_PATH`.
123
+
124
+ ## Pourquoi ce projet
125
+
126
+ Certains documents ne peuvent pas être envoyés à un service d'embeddings hébergé pour des raisons de confidentialité ou de politique interne. Un index local permet de les rechercher sans ajouter de coût d'API à chaque requête.
127
+
128
+ Une recherche uniquement sémantique peut ignorer des identifiants exacts qui comptent dans la documentation technique. Le reclassement par mots-clés garde ces termes visibles sans renoncer aux requêtes en langage naturel.
129
+
130
+ ## Contenu pris en charge
131
+
132
+ | Entrée | Mode d'import |
133
+ |---|---|
134
+ | PDF, DOCX, TXT, Markdown | Import d'un fichier ou synchronisation d'un répertoire |
135
+ | HTML déjà récupéré par le client | `ingest_data` ; nettoyé avec Readability puis converti en Markdown |
136
+ | Texte brut ou Markdown en mémoire | `ingest_data` avec un identifiant de source stable |
137
+
138
+ Le serveur ne récupère pas lui-même les pages HTML. Un client MCP peut charger une page et transmettre son HTML à `ingest_data`.
139
+
140
+ L'import de fichiers ne prend pas en charge Excel, PowerPoint, les images seules ni les extensions de code source. Les PDF peuvent éventuellement utiliser un modèle visuel local pour décrire les figures, mais cette fonction n'est ni un OCR ni un moteur de recherche d'images.
141
+
142
+ ## Outils MCP
143
+
144
+ | Outil | Rôle |
145
+ |---|---|
146
+ | `sync_start` | Synchroniser l'index avec toutes les racines configurées ou avec un chemin précis |
147
+ | `sync_status` | Consulter l'état d'une synchronisation en cours |
148
+ | `ingest_file` | Importer ou remplacer un fichier |
149
+ | `ingest_data` | Importer du texte, du Markdown ou du HTML déjà présent dans le client |
150
+ | `query_documents` | Rechercher avec correspondance sémantique et renforcement des mots-clés |
151
+ | `read_chunk_neighbors` | Lire les segments voisins d'un résultat de recherche |
152
+ | `list_files` | Afficher les fichiers pris en charge et leur état d'import |
153
+ | `delete_file` | Supprimer un fichier indexé ou un élément `ingest_data` |
154
+ | `status` | Afficher l'état de l'index et de la recherche |
155
+
156
+ ### Synchroniser une racine documentaire
157
+
158
+ `sync_start` importe les fichiers nouveaux ou modifiés, ignore ceux qui sont identiques octet par octet et retire de l'index les fichiers qui n'existent plus :
159
+
160
+ ```text
161
+ Synchronise tout le contenu des racines documentaires configurées et attends la fin de l'opération.
162
+ ```
163
+
164
+ L'outil renvoie immédiatement un `jobId`. Le client doit interroger `sync_status` jusqu'à ce que son état passe à `succeeded` ou `failed`. Le mode visuel n'est pas disponible pendant une synchronisation ; les PDF modifiés sont importés comme texte.
165
+
166
+ Le processus serveur ne conserve qu'une tâche de synchronisation. Une nouvelle tâche remplace l'enregistrement d'une tâche terminée, et le redémarrage du serveur efface cet enregistrement.
167
+
168
+ ### Importer un fichier
169
+
170
+ `ingest_file` accepte les fichiers PDF, DOCX, TXT et Markdown. Les chemins transmis par MCP doivent être absolus et rester dans une racine documentaire configurée :
171
+
172
+ ```text
173
+ Importe le document /Users/me/docs/api-spec.pdf.
174
+ ```
175
+
176
+ Réimporter le même chemin remplace les segments existants.
177
+
178
+ ### Rechercher et lire davantage de contexte
179
+
180
+ ```text
181
+ Que dit la documentation de l'API au sujet de l'authentification ?
182
+ Trouve le comportement documenté de ERR_CONNECTION_REFUSED.
183
+ ```
184
+
185
+ Les résultats contiennent le texte, le chemin source, le titre, l'indice du segment et le score de pertinence. Pour obtenir plus de contexte, transmettez à `read_chunk_neighbors` le `chunkIndex` et le `filePath` ou la `source` du résultat :
186
+
187
+ ```text
188
+ Lis les segments voisins de ce résultat sur l'authentification.
189
+ ```
190
+
191
+ `query_documents` et `list_files` acceptent un préfixe de chemin absolu facultatif dans `scope`, ou une liste de préfixes. Un préfixe correspond au chemin exact et à tous ses descendants.
192
+
193
+ ### Importer du HTML
194
+
195
+ Utilisez `ingest_data` après que le client MCP a récupéré la page :
196
+
197
+ ```text
198
+ Récupère https://example.com/docs et importe le HTML.
199
+ ```
200
+
201
+ Le serveur extrait l'article principal, le convertit en Markdown et l'enregistre sous l'identifiant de source fourni. Réutiliser la même source met à jour le contenu existant.
202
+
203
+ Respectez les conditions du site source et les droits d'auteur lors de l'indexation de contenu externe.
204
+
205
+ ### Figures dans les PDF
206
+
207
+ Le mode visuel ajoute une description générée aux pages PDF riches en figures. Il est facultatif et ne charge aucun modèle visuel pendant un import normal.
208
+
209
+ ```text
210
+ Importe /Users/me/docs/research-paper.pdf avec visual: true.
211
+ ```
212
+
213
+ ```bash
214
+ npx mcp-local-rag ingest ./docs/research-paper.pdf --visual
215
+ ```
216
+
217
+ | Profil | Cache du modèle | Usage |
218
+ |---|---:|---|
219
+ | `fast` (par défaut) | environ 250 Mo | Indexation visuelle légère |
220
+ | `quality` | environ 2,9 Go | Figures contenant des libellés, des annotations ou d'autres textes intégrés à l'image |
221
+
222
+ Sélectionnez le modèle le plus volumineux avec `visualQuality: "quality"` via MCP ou `--visual-quality quality` via la CLI. Lors des mesures sur CPU, l'inférence a pris environ deux fois plus de temps qu'avec `fast`, mais le résultat dépend du matériel et des mises à jour du modèle.
223
+
224
+ Les descriptions sont des textes auxiliaires, pas des transcriptions fidèles. Considérez les descriptions et le texte extrait des documents comme des entrées non fiables, et non comme des instructions.
225
+
226
+ ## CLI
227
+
228
+ La CLI utilise le même analyseur, le même générateur d'embeddings et le même stockage vectoriel sans client MCP :
229
+
230
+ ```bash
231
+ npx mcp-local-rag ingest ./docs/
232
+ npx mcp-local-rag sync ./docs/
233
+ npx mcp-local-rag query "API d'authentification"
234
+ npx mcp-local-rag query "authentification" --scope /docs/api --scope /docs/guide
235
+ npx mcp-local-rag read-neighbors --file-path /abs/path.md --chunk-index 5
236
+ npx mcp-local-rag list
237
+ npx mcp-local-rag status
238
+ npx mcp-local-rag delete ./docs/old.pdf
239
+ npx mcp-local-rag delete --source "https://example.com/docs"
240
+ ```
241
+
242
+ Les options globales comme `--db-path`, `--cache-dir` et `--model-name` précèdent la sous-commande. Les options propres à la sous-commande viennent ensuite :
243
+
244
+ ```bash
245
+ npx mcp-local-rag --db-path ./my-db query "authentification"
246
+ ```
247
+
248
+ Exécutez `npx mcp-local-rag --help` pour afficher la référence complète des commandes.
249
+
250
+ La CLI ne lit pas la configuration du client MCP. Définissez les mêmes variables d'environnement ou options si les deux interfaces doivent partager un index. En particulier, `MODEL_NAME` et l'option CLI `--model-name` doivent correspondre pour une base de données partagée.
251
+
252
+ ## Réglage de la recherche
253
+
254
+ Le renforcement par mots-clés est activé par défaut. Pour les corpus qui nécessitent une sélection plus stricte, vous pouvez aussi configurer le regroupement par écarts de pertinence ainsi que les filtres de distance et de fichiers.
255
+
256
+ | Variable | Valeur par défaut | Description |
257
+ |----------|---------|-------------|
258
+ | `RAG_HYBRID_WEIGHT` | `0.6` | Facteur de renforcement des mots-clés (0.0–1.0). 0 désactive le reclassement par mots-clés et 1 applique le renforcement maximal. |
259
+ | `RAG_GROUPING` | non définie | `similar` conserve le premier groupe de pertinence ; `related` en conserve jusqu'à deux et utilise les écarts importants de distance vectorielle comme limites. |
260
+ | `RAG_MAX_DISTANCE` | non définie | Écarte les résultats peu pertinents, par exemple avec `0.5`. |
261
+ | `RAG_MAX_FILES` | non définie | Limite les résultats aux N fichiers les mieux classés, par exemple `1` pour le meilleur fichier uniquement. |
262
+
263
+ Pour les spécifications d'API et les autres documents comportant de nombreux identifiants, un poids plus élevé des mots-clés peut améliorer le classement des termes exacts :
264
+
265
+ ```json
266
+ "env": {
267
+ "RAG_HYBRID_WEIGHT": "0.7"
268
+ }
269
+ ```
270
+
271
+ - `0.7` : reclassement des termes exacts légèrement plus fort que la valeur par défaut
272
+ - `1.0` : renforcement maximal des mots-clés
273
+
274
+ ## Fonctionnement
275
+
276
+ Pendant l'import :
277
+
278
+ 1. L'analyseur extrait le texte du format d'entrée.
279
+ 2. Le découpage sémantique repère les changements de sujet et conserve les blocs de code Markdown.
280
+ 3. Transformers.js crée les embeddings localement.
281
+ 4. LanceDB stocke les segments, les métadonnées, les vecteurs et l'index de texte intégral.
282
+
283
+ Pendant la recherche :
284
+
285
+ 1. La requête est convertie en embedding avec le même modèle.
286
+ 2. La recherche vectorielle récupère les segments sémantiquement proches.
287
+ 3. Les filtres de distance et les groupes de pertinence facultatifs réduisent la liste des candidats lorsqu'ils sont configurés.
288
+ 4. Les correspondances en texte intégral renforcent les termes exacts de la requête.
289
+
290
+ ## Agent Skills
291
+
292
+ Les [Agent Skills](https://agentskills.io/) donnent aux assistants IA des consignes pour les requêtes et les imports :
293
+
294
+ ```bash
295
+ npx mcp-local-rag skills install --claude-code
296
+ npx mcp-local-rag skills install --claude-code --global
297
+ npx mcp-local-rag skills install --codex
298
+ ```
299
+
300
+ Les skills installées couvrent la formulation des requêtes, l'affinage des résultats et l'import de HTML. Si une skill ne s'active pas automatiquement, demandez explicitement à l'assistant d'utiliser la skill mcp-local-rag.
301
+
302
+ ## Configuration
303
+
304
+ Le serveur MCP lit les variables d'environnement. La CLI accepte les mêmes variables ainsi que les options du tableau ; les options de la CLI sont prioritaires.
305
+
306
+ | Variable d'environnement | Option CLI | Valeur par défaut | Description |
307
+ |---------------------|----------|---------|-------------|
308
+ | `BASE_DIR` | `--base-dir` | Répertoire courant | Une racine documentaire ; l'option CLI peut être répétée avec `ingest`, `list` et `sync` |
309
+ | `BASE_DIRS` | Non disponible | non définie | Tableau JSON de racines documentaires ; prioritaire sur `BASE_DIR` |
310
+ | `DB_PATH` | `--db-path` | `./lancedb/` | Emplacement de la base de données vectorielle |
311
+ | `CACHE_DIR` | `--cache-dir` | `./models/` | Répertoire du cache des modèles |
312
+ | `MODEL_NAME` | `--model-name` | `Xenova/all-MiniLM-L6-v2` | Modèle d'embeddings Hugging Face |
313
+ | `MAX_FILE_SIZE` | `--max-file-size` | `104857600` (100 Mo) | Taille maximale d'un fichier en octets |
314
+ | `CHUNK_MIN_LENGTH` | `--chunk-min-length` | `50` | Longueur minimale d'un segment en caractères (1–10000) |
315
+ | `RAG_DEVICE` | Non disponible | `cpu` | Périphérique utilisé par ONNX Runtime |
316
+ | `RAG_DTYPE` | Non disponible | `fp32` | Type de données des embeddings transmis au modèle choisi |
317
+
318
+ ### Racines documentaires (`BASE_DIR` et `BASE_DIRS`)
319
+
320
+ mcp-local-rag n'autorise les opérations sur les fichiers qu'à l'intérieur des racines configurées. Pour en utiliser plusieurs, `BASE_DIRS` doit être un tableau JSON de chemins non vides :
321
+
322
+ ```bash
323
+ export BASE_DIRS='["/Users/me/Documents/work","/Users/me/Projects/specs"]'
324
+ ```
325
+
326
+ La configuration est résolue dans cet ordre :
327
+
328
+ 1. Options CLI `--base-dir <path>` (répétables avec `ingest`, `list` et `sync`)
329
+ 2. `BASE_DIRS`
330
+ 3. `BASE_DIR`
331
+ 4. Répertoire courant
332
+
333
+ Chaque source remplace entièrement celle de priorité inférieure, au lieu de s'y ajouter. Une configuration `BASE_DIRS` incorrecte provoque une erreur sans revenir à `BASE_DIR` ni au répertoire courant. `status` reste disponible dans MCP afin que le client puisse signaler l'erreur de configuration.
334
+
335
+ ```bash
336
+ npx mcp-local-rag ingest --base-dir /Users/me/work --base-dir /Users/me/specs /Users/me/work/readme.md
337
+ npx mcp-local-rag list --base-dir /Users/me/work --base-dir /Users/me/specs
338
+ npx mcp-local-rag sync --base-dir /Users/me/work --base-dir /Users/me/specs
339
+ BASE_DIRS='["/Users/me/work","/Users/me/specs"]' npx mcp-local-rag list
340
+ ```
341
+
342
+ ### Stockage et modèles
343
+
344
+ `DB_PATH` et `CACHE_DIR` sont relatifs au répertoire de travail du processus par défaut. Utilisez des chemins absolus si le client MCP peut démarrer le serveur depuis différents répertoires de projet.
345
+
346
+ Définissez `MODEL_NAME` ou passez `--model-name` pour choisir un modèle d'embeddings Hugging Face adapté à la langue et au domaine de vos documents.
347
+
348
+ mcp-local-rag génère les embeddings avec un pooling moyen et une normalisation L2. Lorsque vous choisissez un modèle, vérifiez que ces réglages correspondent à sa méthode d'inférence recommandée, car le type de pooling peut influer sur la qualité de la recherche.
349
+
350
+ Modifier `MODEL_NAME`, `RAG_DEVICE` ou `RAG_DTYPE` peut rendre les vecteurs existants incompatibles. Après une modification de la configuration des embeddings, utilisez un nouveau `DB_PATH` ou supprimez l'index existant et réimportez les documents.
351
+
352
+ Un exemple de modèle disponible pour les documents en français est `sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2`.
353
+
354
+ ## Sécurité et exploitation
355
+
356
+ - L'accès aux fichiers est limité aux racines définies par `BASE_DIR`, `BASE_DIRS` ou l'option CLI `--base-dir`.
357
+ - Les liens symboliques qui pointent hors de toutes les racines configurées sont refusés.
358
+ - Le traitement des documents et la recherche n'effectuent plus de requêtes réseau une fois les modèles nécessaires en cache.
359
+ - Le serveur est conçu pour un seul utilisateur local et ne fournit ni authentification ni contrôle d'accès.
360
+ - Ne lancez pas plusieurs processus d'écriture CLI ou MCP sur le même `DB_PATH`. Les requêtes en lecture seule restent possibles pendant une synchronisation.
361
+ - Pour sauvegarder un index, copiez le répertoire `DB_PATH` lorsqu'aucun processus d'écriture n'est actif.
362
+
363
+ <details>
364
+ <summary><strong>Dépannage</strong></summary>
365
+
366
+ ### "No results found"
367
+
368
+ Les documents doivent d'abord être importés. Exécutez `"Répertoriez tous les fichiers importés"` pour vérifier leur état.
369
+
370
+ ### Échec du téléchargement du modèle
371
+
372
+ Vérifiez la connexion Internet. Si vous utilisez un proxy, contrôlez les paramètres réseau. Le modèle peut aussi être [téléchargé manuellement](https://huggingface.co/Xenova/all-MiniLM-L6-v2).
373
+
374
+ ### "File too large"
375
+
376
+ La limite par défaut est de 100 Mo. Découpez le fichier ou augmentez `MAX_FILE_SIZE`.
377
+
378
+ ### Requêtes lentes
379
+
380
+ Consultez le nombre de segments avec `status`. Les gros documents comportant de nombreux segments peuvent ralentir les requêtes. Envisagez de diviser les fichiers très volumineux.
381
+
382
+ ### "Path outside BASE_DIR"
383
+
384
+ Le chemin doit se trouver dans l'une des racines configurées : `BASE_DIR`, une entrée de `BASE_DIRS` ou un chemin fourni avec `--base-dir` dans la CLI. Utilisez un chemin absolu.
385
+
386
+ ### "BASE_DIRS must be a JSON array..."
387
+
388
+ `BASE_DIRS` accepte un tableau JSON comportant un ou plusieurs chemins non vides :
389
+
390
+ - Valide : `BASE_DIRS='["/Users/me/work","/Users/me/specs"]'`
391
+ - Invalide : `BASE_DIRS=/a:/b` (la syntaxe à séparateurs n'est pas prise en charge)
392
+ - Invalide : `BASE_DIRS='[]'` (tableau vide)
393
+
394
+ ### Le client MCP n'affiche pas les outils
395
+
396
+ 1. Vérifiez la syntaxe du fichier de configuration
397
+ 2. Quittez complètement le client, puis relancez-le (Cmd+Q sur Mac pour Cursor)
398
+ 3. Testez directement : `npx mcp-local-rag` doit démarrer sans erreur
399
+
400
+ </details>
401
+
402
+ ## Contribuer
403
+
404
+ Les contributions sont les bienvenues. Consultez [CONTRIBUTING.md](CONTRIBUTING.md) pour préparer l'environnement et connaître les règles du projet.
405
+
406
+ ## Licence
407
+
408
+ Licence MIT. Utilisation gratuite à des fins personnelles et commerciales.
409
+
410
+ ## Articles de blog
411
+
412
+ - [Building a Local RAG for Agentic Coding](https://www.norsica.jp/blog/local-rag-agentic-coding) : présentation technique du découpage sémantique et de la recherche hybride.
413
+
414
+ ## Remerciements
415
+
416
+ Développé avec le [Model Context Protocol](https://modelcontextprotocol.io/) d'Anthropic, [LanceDB](https://lancedb.com/) et [Transformers.js](https://huggingface.co/docs/transformers.js).