@oomkapwn/enquire-mcp 3.11.0-rc.1 → 3.11.0-rc.2

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.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,21 @@
2
2
 
3
3
  All notable changes to this project will be documented here. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and the project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
4
4
 
5
+ ## [3.11.0-rc.2] — 2026-06-22
6
+
7
+ > **TL;DR:** **Internationalization round 2 — README now in 9 languages.** Added **Russian** (`README.ru.md`), **Brazilian Portuguese** (`README.pt.md`), **French** (`README.fr.md`), and **Japanese** (`README.ja.md`) alongside English + 中文 + Español + हिन्दी + العربية. Every README carries a **9-way language switcher**; the four new files ship in the npm tarball, and the existing structural guards were extended to cover them. Docs only — no code/API change. **1331 tests unchanged** (the i18n invariants are data-driven, no new `it()`).
8
+
9
+ ### Added
10
+
11
+ - **README translations for Russian, Portuguese, French, and Japanese** (`README.ru.md`, `README.pt.md`, `README.fr.md`, `README.ja.md`) — full translations of the English README with badges, links, code blocks, CLI flags, and tool names preserved verbatim; only prose translated. Generated via a 4-agent parallel translation Workflow. With the existing EN/zh/es/hi/ar, enquire's README now covers **9 of the most-spoken languages**.
12
+ - **9-way language switcher** (`[English] · [中文] · [Español] · [हिन्दी] · [العربية] · [Русский] · [Português] · [Français] · [日本語]`) on every README (current language bolded). All four new files in `package.json` `files[]`.
13
+
14
+ ### Tests (1331)
15
+
16
+ - The per-language numeric-claim invariant (tools/prompts exact, tests `N+` lower bound) extended to ru/pt/fr/ja — the Russian regex matches `1329+ модульных тестов`, the Japanese the spaced `MCP プロンプト`. The switcher cross-link guard extended from 5 → **9 READMEs** (each links the other 8, bolds itself). Both are data-driven (no new `it()`), so the canonical count stays **1331**.
17
+
18
+ ---
19
+
5
20
  ## [3.11.0-rc.1] — 2026-06-22
6
21
 
7
22
  > **TL;DR:** **Closed-loop retrieval feedback (the "Karpathy loop") — the 46th tool, opt-in.** New `obsidian_mark_useful` (gated by `--feedback-weight <0..1>`, default **0 = OFF**): an agent records which recalled notes actually helped a query; the recorded usefulness then gently boosts those notes in subsequent `obsidian_search` results — a provable no-op at weight 0, mirroring the rc.5 recency boost. State lives in a per-vault cache sidecar (relative paths + counts only — **no note content, no query text**), erased by `prune`. Ships on `@rc`; `@latest` promotion is maintainer-gated. **45 → 46 tools · 1313 → 1331 tests.** No API breaks (additive minor).
package/README.ar.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # enquire-mcp
6
6
 
7
- <sub>[English](./README.md) · [中文](./README.zh.md) · [Español](./README.es.md) · [हिन्दी](./README.hi.md) · **العربية**</sub>
7
+ <sub>[English](./README.md) · [中文](./README.zh.md) · [Español](./README.es.md) · [हिन्दी](./README.hi.md) · **العربية** · [Русский](./README.ru.md) · [Português](./README.pt.md) · [Français](./README.fr.md) · [日本語](./README.ja.md)</sub>
8
8
 
9
9
  ### أكثر خوادم Obsidian MCP تطوّراً. ذاكرة طويلة الأمد لوكلاء الذكاء الاصطناعي.
10
10
 
package/README.es.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # enquire-mcp
6
6
 
7
- <sub>[English](./README.md) · [中文](./README.zh.md) · **Español** · [हिन्दी](./README.hi.md) · [العربية](./README.ar.md)</sub>
7
+ <sub>[English](./README.md) · [中文](./README.zh.md) · **Español** · [हिन्दी](./README.hi.md) · [العربية](./README.ar.md) · [Русский](./README.ru.md) · [Português](./README.pt.md) · [Français](./README.fr.md) · [日本語](./README.ja.md)</sub>
8
8
 
9
9
  ### El MCP de Obsidian más avanzado. Memoria a largo plazo para agentes de IA.
10
10
 
package/README.fr.md ADDED
@@ -0,0 +1,334 @@
1
+ <div align="center">
2
+
3
+ <a href="https://github.com/oomkapwn/enquire-mcp"><img src="./assets/social-preview.png" alt="enquire-mcp — le MCP Obsidian le plus avancé. Mémoire à long terme pour les agents IA. Bâti sur votre coffre Obsidian. Open source, MCP-natif, neutre vis-à-vis des fournisseurs. Récupération hybride, reranker BGE, HNSW, PDF avec OCR. Pour Claude Code, Claude Desktop, Cursor, ChatGPT, Codex, OpenClaw." width="100%"></a>
4
+
5
+ # enquire-mcp
6
+
7
+ <sub>[English](./README.md) · [中文](./README.zh.md) · [Español](./README.es.md) · [हिन्दी](./README.hi.md) · [العربية](./README.ar.md) · [Русский](./README.ru.md) · [Português](./README.pt.md) · **Français** · [日本語](./README.ja.md)</sub>
8
+
9
+ <sub>**TL;DR pour les agents IA** — Serveur MCP qui expose un coffre markdown Obsidian local à Claude Code, Claude Desktop, Cursor, ChatGPT, Codex et OpenClaw comme une mémoire persistante interrogeable. Récupération hybride (BM25 + embeddings ML + reranker BGE, fusionnés par RRF), HNSW + quantification int8, RAG agentique (HyDE + sous-questions), GraphRAG-light, PDF + OCR, Bases autonomes. Neutre vis-à-vis des fournisseurs, MIT, zéro appel au cloud pendant le service. Installation : `npm i -g @oomkapwn/enquire-mcp`. Docs : [llms.txt](https://github.com/oomkapwn/enquire-mcp/blob/main/llms.txt) · [AGENTS.md](https://github.com/oomkapwn/enquire-mcp/blob/main/AGENTS.md) · [API](https://oomkapwn.github.io/enquire-mcp/).</sub>
10
+
11
+ ### Le MCP Obsidian le plus avancé. Mémoire à long terme pour les agents IA.
12
+
13
+ **Arrêtez de réexpliquer le contexte à Claude, Cursor, ChatGPT, Codex, OpenClaw à chaque session. Vos notes Obsidian deviennent une mémoire partagée et interrogeable pour chaque agent compatible MCP — votre savoir, tous les modèles, à vous pour toujours.**
14
+
15
+ [![CI](https://github.com/oomkapwn/enquire-mcp/actions/workflows/ci.yml/badge.svg)](https://github.com/oomkapwn/enquire-mcp/actions/workflows/ci.yml)
16
+ [![npm](https://img.shields.io/npm/v/@oomkapwn/enquire-mcp.svg?label=npm&color=cb3837)](https://www.npmjs.com/package/@oomkapwn/enquire-mcp)
17
+ [![downloads](https://img.shields.io/npm/dm/@oomkapwn/enquire-mcp.svg?color=cb3837)](https://www.npmjs.com/package/@oomkapwn/enquire-mcp)
18
+ [![tests](https://img.shields.io/badge/tests-1329%20passing-brightgreen.svg)](#trust)
19
+ [![stable](https://img.shields.io/badge/v3.10.x-stable-brightgreen.svg)](./STABILITY.md)
20
+ [![build provenance](https://img.shields.io/badge/build_provenance-SLSA_L2-blue.svg)](https://slsa.dev/spec/v1.0/levels#build-l2)
21
+ [![MCP](https://img.shields.io/badge/MCP-1.29-8A2BE2.svg)](https://modelcontextprotocol.io/)
22
+ [![License](https://img.shields.io/badge/license-MIT-yellow.svg)](./LICENSE)
23
+
24
+ **[⚡ Installation en 30 secondes](#-démarrage-rapide) · [🧠 Cas d'usage](#-cas-dusage) · [📊 Benchmarks](./docs/benchmarks.md) · [📖 Référence de l'API](https://oomkapwn.github.io/enquire-mcp/) · [💬 Comparer les alternatives](./docs/COMPARISON.md)**
25
+
26
+ **Claude Code — en une seule ligne :**
27
+
28
+ ```bash
29
+ claude mcp add obsidian -- npx -y @oomkapwn/enquire-mcp serve --vault ~/Documents/Obsidian\ Vault
30
+ ```
31
+
32
+ </div>
33
+
34
+ > 📌 Ce document est la traduction française de [README.md](./README.md), pour en faciliter la lecture aux francophones ; en cas de divergence, **la version anglaise fait foi** (elle est mise à jour à chaque publication).
35
+
36
+ ---
37
+
38
+ ## Le problème
39
+
40
+ Chaque session d'IA repart de zéro. Vous réexpliquez votre projet, vos décisions de conception, les conclusions de la recherche de la semaine dernière. Les fonctionnalités de « mémoire » des fournisseurs ([Claude Memory](https://www.anthropic.com/news/memory-and-tool-use), [ChatGPT Memory](https://openai.com/index/memory-and-new-controls-for-chatgpt/), la mémoire de Cursor) enferment votre savoir dans le cloud d'un seul fournisseur — et l'oublient à nouveau dès que vous changez d'outil. **Votre savoir n'arrête pas de recommencer à zéro.**
41
+
42
+ ## La solution
43
+
44
+ Votre coffre Obsidian devient une **mémoire à long terme persistante et interrogeable** pour tout agent compatible MCP. Une seule installation — votre savoir est instantanément accessible depuis Claude Code, Claude Desktop, Cursor, le GPT personnalisé de ChatGPT, Codex, OpenClaw et tout autre client MCP. Des fichiers markdown bruts **qui vous appartiennent**, indexés localement, interrogés avec toute la pile moderne de recherche d'information (RI), rappelés à chaque session et avec chaque modèle.
45
+
46
+ **Ancré, pas extrait.** Les outils de mémoire conversationnelle (mem0, Zep, Supermemory, Memobase) *extraient* des faits de vos journaux de chat vers un dépôt séparé que vous ne pouvez pas lire. enquire-mcp fait l'inverse : il est **ancré dans le savoir que vous avez déjà écrit** — vos propres notes `.md`, à la lettre, avec citations — de sorte que le rappel est auditable, modifiable dans n'importe quel éditeur, et jamais un résumé avec perte d'un chat dont vous vous souvenez à moitié. Et contrairement aux plateformes de mémoire de ***flotte*** côté serveur — des dépôts cloud multi-locataires qui paraphrasent le trafic des agents dans une base de données partagée — enquire est **mono-utilisateur et local-first** : un seul coffre qui vous appartient entièrement et que vous pouvez lire, modifier et supprimer vous-même, avec zéro appel au cloud pendant le service. (Cette critique de l'« extraction » vise spécifiquement la catégorie de la mémoire de chat — pas les outils de graphe de connaissances / ETL comme cognee, ni les pairs de recherche personnelle comme Khoj.)
47
+
48
+ **Ancré — et conscient de la fraîcheur.** Rappeler un fait n'est que la moitié du problème ; savoir s'il est encore *vrai* est l'autre moitié. Le [benchmark Memora](https://arxiv.org/abs/2604.20006) (avr. 2026) a montré que les systèmes de mémoire échouent systématiquement à réutiliser les faits périmés — rappeler une note vieille d'un an comme si elle avait été écrite aujourd'hui. Parce que la mémoire d'enquire *est* vos vrais fichiers markdown, chaque résultat de recherche porte `age_days` + un indicateur `stale` dérivé de l'heure de dernière modification réelle de la note, et vous pouvez activer un classement pondéré par récence (`--recency-weight`) pour que les notes plus fraîches remontent en premier. Votre savoir, conscient de la fraîcheur — et non un bloc intemporel.
49
+
50
+ > **Ce qui rend enquire-mcp différent** :
51
+ > 1. **Neutre vis-à-vis des fournisseurs.** Votre mémoire vit dans des fichiers `.md`. Passez de Claude à Cursor — votre mémoire vous suit.
52
+ > 2. **Récupération de premier ordre.** BM25 hybride + embeddings multilingues + reranker cross-encoder BGE fusionnés par RRF, mis à l'échelle avec HNSW + quantification int8. La même pile de RI qu'une startup de recherche bâtirait — open-sourcée, dans un seul binaire.
53
+ > 3. **Zéro appel au cloud pendant le service.** Modèles mis en cache localement (téléchargement unique depuis HuggingFace). Le contenu de votre coffre ne quitte jamais votre machine. Sûr en environnement isolé par défaut.
54
+ > 4. **Rappel conscient de la fraîcheur.** Chaque résultat indique l'âge de la note ; le reclassement par récence optionnel permet à un agent de préférer le savoir frais et de signaler les faits périmés à revérifier — la frontière consciente de l'oubli, bâtie sur le `mtime` que vos fichiers possèdent déjà.
55
+
56
+ **46 outils · 19 prompts MCP · 1329+ tests unitaires · 50+ langues · v3.10.x stable · lié au semver · MIT · provenance de build npm (SLSA L2).**
57
+
58
+ ---
59
+
60
+ ## 🏆 Pourquoi c'est le meilleur
61
+
62
+ **Six fonctionnalités qu'aucun autre Obsidian-MCP ne possède** (GraphRAG-light, exécution autonome de `.base`, HyDE, quantification int8, late-chunking, harnais d'évaluation intégré). **Plus toute la pile moderne de RI** (BM25 + embeddings ML + reranking par cross-encoder + HNSW), dont les concurrents proposent au plus un ou deux éléments. Côte à côte :
63
+
64
+ | Capacité | enquire-mcp | Smart Connections | Autres Obsidian-MCP |
65
+ |---|:---:|:---:|:---:|
66
+ | Récupération hybride (BM25 + TF-IDF + embeddings ML, fusionnés par RRF) | ✅ | ❌ | ❌ |
67
+ | **Reranking par cross-encoder** (BGE, +15.5 NDCG@10 mesuré) | ✅ | ❌ | ❌ |
68
+ | **Index vectoriel HNSW** (top-K en moins de 10 ms, persisté) | ✅ | ❌ | ❌ |
69
+ | **Quantification vectorielle int8** (embed-db ~4× plus petite) | ✅ | ❌ | ❌ |
70
+ | **Late-chunking** (embeddings à fenêtre de contexte) | ✅ | ❌ | ❌ |
71
+ | **PDF fondus dans la recherche hybride** (citations `[page: N]`) | ✅ | ❌ | ❌ |
72
+ | **OCR pour les PDF scannés** (Tesseract.js, multilingue) | ✅ | ❌ | ❌ |
73
+ | **Graph-boost de wikilinks** comme signal de récupération | ✅ | ❌ | ❌ |
74
+ | **Recherche sémantique multilingue** (50+ langues, sur l'appareil) | ✅ | 💰 payant | ❌ |
75
+ | **Harnais d'évaluation de la qualité de récupération intégré** (NDCG, Recall, MRR, matrice A/B) | ✅ | ❌ | ❌ |
76
+ | **MCP distant** sur HTTP + auth bearer + sessions à état | ✅ | ❌ | partiel |
77
+ | **Observabilité par signal** pour chaque résultat | ✅ | ❌ | ❌ |
78
+ | **MCP-natif** (Claude · Cursor · ChatGPT · Codex · OpenClaw · n'importe quel client) | ✅ | ❌ Obsidian uniquement | variable |
79
+ | **Filtre de confidentialité** vérifié à chaque chemin de recherche + écriture | ✅ | s.o. | ❌ |
80
+ | **46 outils de production** (34 outils de lecture toujours actifs + 4 optionnels + 7 écritures restreintes + 1 outil de retour) | ✅ | s.o. | variable |
81
+ | **GraphRAG-light** (détection de communautés de wikilinks par modularité de Louvain) | ✅ **uniquement ici** | ❌ | ❌ |
82
+ | **Exécution autonome de requêtes `.base`** (fonctionne sans Obsidian ouvert) | ✅ **uniquement ici** | ❌ | ❌ délègue à Obsidian |
83
+ | **Récupération HyDE** (Gao et al. 2023) + décomposition en sous-questions | ✅ **uniquement ici** | ❌ | ❌ |
84
+ | **1329 tests unitaires · 9 portes CI requises + 5 indicatives par PR** | ✅ | s.o. | rare |
85
+ | **Provenance de build signée** (npm + Sigstore, SLSA Build L2) | ✅ | s.o. | ❌ |
86
+ | **Surface publique liée au semver** ([STABILITY.md](./STABILITY.md)) | ✅ | s.o. | ❌ |
87
+ | Autonome (aucun plugin Obsidian requis) | ✅ | ❌ requiert Obsidian | variable |
88
+ | Licence | MIT, gratuit | propriétaire, payant | variable |
89
+
90
+ <sub>Comparaison fondée sur les capacités publiques de chaque projet à la date de la version stable v3.8.x (instantané initial v3.7.0 / 2026-05-15 ; actualisé en v3.8.4). Smart Connections est un plugin Obsidian payant (pas un serveur MCP). « Autres Obsidian-MCP » désigne les serveurs Obsidian-MCP publics open source présents sur GitHub au moment de la rédaction. Les benchmarks de récupération de bout en bout publics d'enquire-mcp sont publiés dans <a href="./docs/benchmarks.md"><code>docs/benchmarks.md</code></a> — le delta mesuré de `rerank-bge` est de +24.7 MRR / +15.5 NDCG@10 par rapport à l'hybride pur sur une ablation de 60 requêtes.</sub>
91
+
92
+ > Affirmation stratégique : enquire-mcp est le backend open source des [wikis LLM façon Karpathy](https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f) bâtis sur votre coffre Obsidian existant. Un savoir qui se cumule, traçable jusqu'aux sources.
93
+
94
+ ---
95
+
96
+ ## ⚡ Démarrage rapide
97
+
98
+ ```bash
99
+ npm install -g @oomkapwn/enquire-mcp
100
+ enquire-mcp serve --vault ~/Documents/Obsidian\ Vault
101
+ ```
102
+
103
+ Connectez-le à n'importe quel client MCP :
104
+
105
+ ```json
106
+ {
107
+ "mcpServers": {
108
+ "obsidian": {
109
+ "command": "npx",
110
+ "args": ["-y", "@oomkapwn/enquire-mcp", "serve", "--vault", "/path/to/vault"]
111
+ }
112
+ }
113
+ }
114
+ ```
115
+
116
+ 📂 Configurations prêtes à l'emploi dans [`examples/`](./examples/) — **Claude Desktop**, **Cursor**, **GPT personnalisé de ChatGPT** (MCP distant sur HTTP), plus un jeu de requêtes d'exemple pour le harnais d'évaluation.
117
+
118
+ **Vous voulez toute la puissance hybride ?** Mise en route sans friction, en une commande :
119
+
120
+ ```bash
121
+ enquire-mcp setup --vault <path> # télécharge le modèle, construit FTS5 + embed-db
122
+ enquire-mcp serve --vault <path> --persistent-index --enable-reranker --use-hnsw
123
+ enquire-mcp doctor --vault <path> # contrôle de santé codé par couleur ✓/⚠/✗
124
+ ```
125
+
126
+ ---
127
+
128
+ ## 🤖 Configuration dans votre agent IA — prompts à copier-coller
129
+
130
+ Une fois `enquire-mcp` installé, collez ces prompts dans votre agent pour qu'il sache que le coffre est disponible comme mémoire.
131
+
132
+ <details>
133
+ <summary><b>Claude Code (terminal)</b> — ajouter le serveur MCP + premier prompt</summary>
134
+
135
+ ```bash
136
+ # Ajoutez le serveur MCP à votre configuration Claude Code (une seule fois)
137
+ claude mcp add obsidian -- npx -y @oomkapwn/enquire-mcp serve --vault ~/Documents/Obsidian\ Vault
138
+ ```
139
+
140
+ Ensuite, dans n'importe quelle session Claude Code :
141
+
142
+ > Tu disposes désormais d'outils `obsidian_*` qui recherchent et lisent mon coffre Obsidian — ma mémoire à long terme. Avant de répondre à des questions sur des projets, des décisions, des personnes ou un contexte technique, appelle `obsidian_search` avec les termes pertinents. Cite chaque fait avec la note source (et `[page: N]` pour les PDF). Si tu ne trouves pas de note pertinente, dis-le — ne devine pas.
143
+
144
+ </details>
145
+
146
+ <details>
147
+ <summary><b>Claude Desktop</b> — fichier de configuration + premier prompt</summary>
148
+
149
+ Déposez [`examples/claude-desktop-hybrid.json`](./examples/claude-desktop-hybrid.json) dans la configuration MCP de Claude Desktop (modifiez d'abord le chemin du coffre). Redémarrez Claude Desktop, puis :
150
+
151
+ > Tu as mon coffre Obsidian branché comme mémoire interrogeable via les outils `obsidian_*`. Vérifie toujours `obsidian_search` en premier quand je te demande quoi que ce soit dans mes notes — contexte de réunion, recherche, décisions, entrées de journal. Cite le chemin de la note source pour chaque fait.
152
+
153
+ </details>
154
+
155
+ <details>
156
+ <summary><b>Cursor</b> — configuration MCP stdio + règle d'agent</summary>
157
+
158
+ Déposez [`examples/cursor-mcp.json`](./examples/cursor-mcp.json) à `~/.cursor/mcp.json` (modifiez le chemin du coffre). Dans votre fichier `.cursorrules` ou dans le chat :
159
+
160
+ > Avant de proposer du code qui touche à un sujet sur lequel j'ai peut-être des notes (décisions d'architecture, contrats d'API, évaluations de fournisseurs), appelle d'abord `obsidian_search`. Considère mon coffre Obsidian comme un contexte faisant autorité.
161
+
162
+ </details>
163
+
164
+ <details>
165
+ <summary><b>GPT personnalisé de ChatGPT</b> — MCP distant sur HTTP</summary>
166
+
167
+ Suivez [`examples/chatgpt-actions.md`](./examples/chatgpt-actions.md) pour exposer `serve-http` via un tunnel avec auth bearer. Dans les instructions de votre GPT personnalisé :
168
+
169
+ > Tu as un accès en lecture à mon coffre Obsidian via la famille d'outils `obsidian_*`. Cherche avant de répondre à tout ce qui pourrait se trouver dans mes notes ; cite le chemin du fichier source pour chaque affirmation.
170
+
171
+ </details>
172
+
173
+ <details>
174
+ <summary><b>OpenClaw / Codex / tout autre client MCP</b></summary>
175
+
176
+ La même commande `npx -y @oomkapwn/enquire-mcp serve --vault <path>` fonctionne pour tout client compatible MCP. Consultez la documentation de configuration MCP du client pour savoir où déposer l'entrée du serveur, puis utilisez l'un des prompts ci-dessus.
177
+
178
+ </details>
179
+
180
+ **Règle d'agent réutilisable** (à déposer dans n'importe quel `AGENTS.md` / `CLAUDE.md` / `.cursorrules` pour que l'agent sache *quand* recourir au coffre) :
181
+
182
+ > Quand ma question touche à mes propres notes, décisions, projets, personnes ou recherches, **cherche d'abord dans mon coffre Obsidian** via les outils `obsidian_*` (commence par `obsidian_search`) et cite la note source pour chaque fait. Préfère enquire pour le rappel *conceptuel / interlangue / « qu'ai-je dit à propos de X »* ; utilise `grep` / `ripgrep` simple pour les chaînes littérales exactes. Si rien de pertinent ne ressort, dis-le — ne devine pas.
183
+
184
+ ### Exemples de requêtes qui fonctionnent bien
185
+
186
+ - *« Trouve chaque note où j'ai discuté de stratégie tarifaire, résume l'évolution. »* — la fusion RRF + le reranker gèrent « évolution » sémantiquement
187
+ - *« Quelle a été ma décision sur PostgreSQL vs MongoDB ? Cite la note quotidienne. »* — le graph-boost de wikilinks fait remonter le document de décision central
188
+ - *« Анализируй мои заметки о RAG за последние 3 месяца »* — embeddings multilingues + filtre de date sur le frontmatter
189
+ - *« De quelles pages du PDF de l'article LLaMA-3 parle-t-on de mise à l'échelle ? »* — PDF fondus dans la recherche avec citations `[page: N]`
190
+ - *« Montre-moi les communautés thématiques de mon coffre de recherche — quels thèmes ai-je explorés ? »* — `obsidian_get_communities` (GraphRAG-light)
191
+
192
+ ---
193
+
194
+ ## 🧠 Cas d'usage
195
+
196
+ **1 — Mémoire à long terme pour les agents IA.** Déposez votre coffre Obsidian dans n'importe quel agent compatible MCP (Claude Code, Claude Desktop, Cursor, ChatGPT, Codex, OpenClaw). L'agent dispose désormais d'un rappel sémantique durable sur chaque note de réunion, entrée de journal, journal de recherche et document de décision que vous ayez jamais écrit — à travers les sessions, les modèles et les fournisseurs. Contrairement à `Claude Memory` ou `ChatGPT Memory`, votre savoir n'est pas enfermé dans le cloud d'un seul fournisseur ; il vit dans du markdown brut qui vous appartient et que vous pouvez migrer librement.
197
+
198
+ **2 — Base de connaissances personnelle / second cerveau.** La récupération hybride fait remonter la bonne note pour *n'importe quelle* formulation, dans l'une des 50+ langues. Posez une question en anglais sur une entrée de journal en russe d'il y a deux ans, obtenez le bon résultat. Le graph-boost de wikilinks reclasse les notes qui se trouvent au centre de votre graphe de connaissances. GraphRAG-light fait émerger des communautés thématiques — découvrez des connexions que vous aviez oublié avoir faites. Les PDF se fondent dans la recherche avec des citations `[page: N]`, de sorte que les articles de recherche et les transcriptions de réunions deviennent une mémoire de premier ordre.
199
+
200
+ **3 — RAG agentique / ingénierie de contexte.** `obsidian_search` expose les scores par signal pour que l'agent voie *pourquoi* chaque résultat a été classé. HyDE réécrit au préalable les requêtes vagues en réponses hypothétiques riches avant la récupération. La décomposition en sous-questions gère les questions multi-sauts (« comment notre stratégie tarifaire a-t-elle évolué et quelle a été la réaction des clients ? ») en les découpant en sous-requêtes indépendantes, puis en fusionnant les résultats. Le harnais d'évaluation intégré (NDCG / Recall / MRR) vous permet de mesurer la qualité de récupération sur vos propres requêtes plutôt que de faire confiance aux benchmarks des fournisseurs.
201
+
202
+ ---
203
+
204
+ ## 🚫 Quand enquire-mcp n'est *pas* le bon outil
205
+
206
+ Des non-objectifs honnêtes — tournez-vous vers autre chose quand :
207
+
208
+ - **Vous voulez une recherche littérale de chaîne / regex.** `ripgrep` / `grep` est plus rapide et exact pour « trouver ce token précis ». enquire brille sur le rappel *conceptuel* — synonymes, interlangue, « qu'ai-je dit à propos de X ». Utilisez les deux : `rg` pour le littéral, enquire pour le sens.
209
+ - **Votre savoir vit dans des journaux de chat, pas dans des notes.** enquire est *ancré* dans le markdown que vous avez rédigé. Les outils de mémoire conversationnelle (mem0, Zep, Supermemory) qui *extraient* des faits de transcriptions de chat vers un dépôt séparé sont une catégorie différente — voir la [comparaison](./docs/COMPARISON.md).
210
+ - **Vous avez besoin d'une recherche multi-utilisateurs / hébergée / synchronisée.** enquire est local-first et mono-coffre par conception — pas d'index multi-locataire côté serveur.
211
+ - **Vos sources ne sont ni du Markdown ni du PDF.** `.md` / `.canvas` / `.base` / `.pdf` sont de premier ordre ; les autres formats nécessitent d'abord une conversion.
212
+ - **Vous voulez une interface graphique ou un plugin intégré à Obsidian.** enquire est un serveur MCP / CLI sans interface — il *complète* Obsidian, il n'en est pas un. (Smart Connections est l'option de plugin intégré à l'app.)
213
+ - **Vous avez besoin d'une recherche en moins d'une milliseconde sur des millions de notes.** HNSW offre un top-K en moins de 10 ms à grande échelle, mais enquire vise les coffres personnels / d'équipe, pas les corpus à l'échelle du web.
214
+
215
+ ---
216
+
217
+ ## 📖 Référence de l'API
218
+
219
+ **[Référence de l'API auto-générée sur oomkapwn.github.io/enquire-mcp](https://oomkapwn.github.io/enquire-mcp/)** — chaque outil, prompt et helper exporté avec un TSDoc complet (`@param` / `@returns` / `@example`). Reconstruite depuis les sources à chaque push sur `main` via [`publish-docs.yml`](https://github.com/oomkapwn/enquire-mcp/blob/main/.github/workflows/publish-docs.yml) (TypeDoc → GitHub Pages). Sans dérive par construction : le même TSDoc que voient les agents IA et les IDE est celui qui est publié.
220
+
221
+ ---
222
+
223
+ ## 🏗️ Comment fonctionne la récupération
224
+
225
+ ```mermaid
226
+ graph LR
227
+ Q[Query] --> S[obsidian_search]
228
+ S --> BM25[BM25 / FTS5]
229
+ S --> TFIDF[TF-IDF cosine]
230
+ S --> EMB[ML embeddings<br/>HNSW]
231
+ BM25 --> RRF{RRF fusion<br/>k=60}
232
+ TFIDF --> RRF
233
+ EMB --> RRF
234
+ RRF --> GB[Graph boost<br/>α × in-degree]
235
+ GB --> RR[BGE cross-encoder<br/>reranker]
236
+ RR --> R[Ranked hits<br/>per_signal observability]
237
+ ```
238
+
239
+ `obsidian_search` détecte automatiquement les signaux disponibles et se dégrade avec élégance. Le graph-boost de wikilinks reclasse le top-K via un PageRank personnalisé d'un pas. Le reranking par cross-encoder optionnel re-score le top-N pour +15.5 NDCG@10 mesuré. Chaque résultat renvoie `per_signal: { bm25, tfidf, embeddings }` pour que vous voyiez POURQUOI il a été classé.
240
+
241
+ | Niveau | Configuration | Ce que vous obtenez |
242
+ |---|---|---|
243
+ | **1** | `serve --vault <path>` | Cosinus TF-IDF (zéro configuration, instantané) |
244
+ | **2** | + `--persistent-index` | + BM25 / FTS5 (top-10 en moins de 100 ms) |
245
+ | **3** | + `setup` (télécharge le modèle + construit embed-db) | + embeddings ML multilingues |
246
+ | **4** | + `--enable-reranker` | + cross-encoder BGE (+15.5 NDCG@10 mesuré) |
247
+ | **5** | + `--use-hnsw` | + top-K en moins de 10 ms à l'échelle du million de chunks |
248
+ | **6** | + `--include-pdfs` | + PDF fondus dans tout ce qui précède |
249
+ | **7** | `serve-http --bearer-token …` | + MCP distant (web Claude.ai, ChatGPT, Cursor HTTP, mobile) |
250
+
251
+ ---
252
+
253
+ ## 🛠️ Les 46 outils
254
+
255
+ 46 outils au total : 34 de lecture toujours actifs (dont le parapluie `obsidian_search`) + 4 de lecture optionnels + 7 écritures restreintes + 1 de retour en boucle fermée. Référence complète : **[docs/api.md](./docs/api.md)**.
256
+
257
+ | Catégorie | Outils |
258
+ |---|---|
259
+ | **Recherche & récupération** | `obsidian_search` (parapluie, fusionné par RRF) · `obsidian_hyde_search` (augmenté par HyDE, v3.1.0) · `obsidian_search_text` · `obsidian_full_text_search` · `obsidian_semantic_search` · `obsidian_embeddings_search` · `obsidian_find_similar` |
260
+ | **Wikilinks & graphe** | `obsidian_resolve_wikilink` · `obsidian_get_backlinks` · `obsidian_get_outbound_links` · `obsidian_get_note_neighbors` · `obsidian_get_unresolved_wikilinks` · `obsidian_find_path` · `obsidian_get_communities` (v3.4.0, GraphRAG-light) |
261
+ | **Frontmatter & Dataview** | `obsidian_frontmatter_get` · `obsidian_frontmatter_search` · `obsidian_dataview_query` · `obsidian_list_tags` |
262
+ | **Lire & naviguer** | `obsidian_read_note` · `obsidian_list_notes` · `obsidian_get_recent_edits` · `obsidian_stale_notes` · `obsidian_open_questions` · `obsidian_context_pack` · `obsidian_chat_thread_read` · `obsidian_open_in_ui` · `obsidian_stats` |
263
+ | **PDF, Canvas & Bases** | `obsidian_read_pdf` · `obsidian_list_pdfs` · `obsidian_ocr_pdf` · `obsidian_read_canvas` · `obsidian_list_canvases` · `obsidian_list_bases` (v3.2.0) · `obsidian_read_base` (v3.2.0) · `obsidian_query_base` (v3.2.0) |
264
+ | **Écritures** (restreintes par `--enable-write`) | `obsidian_create_note` · `obsidian_append_to_note` · `obsidian_rename_note` · `obsidian_replace_in_notes` · `obsidian_archive_note` · `obsidian_frontmatter_set` · `obsidian_chat_thread_append` |
265
+ | **Diagnostic / lint** | `obsidian_lint_wiki` · `obsidian_paper_audit` · `obsidian_validate_note_proposal` |
266
+ | **Retour** (optionnel via `--feedback-weight`) | `obsidian_mark_useful` (boucle fermée : enregistre quelles notes rappelées ont aidé ; les valorise dans les recherches futures) |
267
+
268
+ Plus 3 ressources MCP (`obsidian://vault/info`, `obsidian://note/{path}`, `obsidian://chunk/{n}/{path}`) et 19 **prompts MCP** (`summarize_recent_edits` · `review_tag` · `find_orphans` · `weekly_review` · `extract_todos` · `process_inbox` · `consolidate_tags` · `find_duplicates` · `lint_wiki` · `monthly_review` · `search_with_query_expansion` · `vault_synth` · `vault_wiki_compile` · `vault_lint_extended` · `vault_capture` · `vault_persona_search` · `vault_automation_setup` · `vault_research` · `vault_synthesis_page`) pour les flux de travail courants sur le coffre.
269
+
270
+ ---
271
+
272
+ ## 🛡️ Confiance
273
+
274
+ | Aspect | Posture |
275
+ |---|---|
276
+ | **Par défaut** | Lecture seule — `--enable-write` requis pour les 7 outils d'écriture |
277
+ | **Moindre privilège** | `--disabled-tools` / `--enabled-tools` exposent une surface minimale (p. ex. un agent de recherche en lecture seule n'obtient que `obsidian_search` + `obsidian_read_note`) |
278
+ | **Sécurité des chemins** | Vérification realpath à chaque lecture+écriture ; les liens symboliques sortant du coffre sont rejetés |
279
+ | **Filtre de confidentialité** | Vérifié aux chemins de ressources FTS5 + embed-db + chunk ; fail-closed sur des listes d'autorisation/interdiction vides |
280
+ | **Transport HTTP** | Auth bearer (SHA-256 à temps constant + `timingSafeEqual`), limite de débit par token, CORS strict |
281
+ | **Frontmatter** | `js-yaml@4` `load` (schéma cœur YAML 1.2, sûr par défaut) — aucune exécution de code |
282
+ | **Fichiers de cache + index** | chmod 0600, répertoire parent 0700 |
283
+ | **CI** | **9 portes** de protection de branche **requises** : (1) `lint`, (2) `test` sur Node 22, (3) `test` sur Node 24, (4) `smoke`, (5) `audit`, (6) `coverage`, (7) `version-consistency`, (8) `docs`, (9) `oia`. **5 indicatives** : `test-macos` + `docker` (build du Dockerfile + smoke d'introspection `tools/list`) via `.github/workflows/ci.yml` ; CodeQL ×2 + actions Analyze via le [default-setup de GitHub](https://docs.github.com/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-default-setup-for-code-scanning) (pas des fichiers de workflow). Le workflow de release revérifie que les 9 portes requises sont passées sur le SHA taggé avant la publication npm. _v3.7.10 — `docs` (porte de génération TypeDoc) ajoutée à l'ensemble requis. v3.7.13 — plancher `engines.node` relevé à `>=22.13.0` pour correspondre à la matrice CI. v3.8.0-rc.6 — `oia` (Outside-In Audit) promue depuis l'ensemble indicatif._ |
284
+ | **Couverture** | Lignes ≥86 % · instructions ≥82 % · fonctions ≥75 % · branches ≥74 % (sous garde) |
285
+ | **Publications** | npm + release GitHub par tag · semver · **provenance de build signée** (npm + Sigstore, SLSA Build L2 ; générateur L3 sur la feuille de route) |
286
+ | **Stabilité** | v3.0+ liée au semver — chaque flag CLI, nom d'outil, ressource MCP, prompt et symbole exporté est un contrat |
287
+
288
+ Posture complète : **[SECURITY.md](./SECURITY.md)** · Surface de stabilité : **[STABILITY.md](./STABILITY.md)** · Vulnérabilités : `oomkapwn@gmail.com`.
289
+
290
+ ---
291
+
292
+ ## ❓ FAQ
293
+
294
+ **Faut-il installer Obsidian ?** Non. Lit `.md` + `.canvas` + `.pdf` directement. Fonctionne avec n'importe quel coffre au format Obsidian.
295
+
296
+ **Va-t-il écrire dans mon coffre ?** Pas sauf si vous passez `--enable-write`. Les 7 outils d'écriture sont restreints ; les outils destructifs prennent en charge `dry_run`.
297
+
298
+ **Des données envoyées quelque part ?** Uniquement lors de `enquire-mcp install-model` (télécharge les poids ONNX depuis HuggingFace, une seule fois). Le mode serve ne fait jamais d'HTTP sortant. Les embeddings + le reranker s'exécutent localement sur le CPU.
299
+
300
+ **Performances ?** Build à froid FTS5 : ~5 s/1k notes, ~30 s/50k. Requête BM25 : <100 ms toujours. Build d'embeddings : ~30 ms/chunk sur M1. **HNSW top-10 : moins de 10 ms à toute échelle.** Démarrage à froid de serve : ~50 ms avec persistance HNSW.
301
+
302
+ **Langues ?** Par défaut `paraphrase-multilingual-MiniLM-L12-v2` (50+ langues). Cross-encoder multilingue. Validé de bout en bout sur des coffres bilingues russe + anglais. Tokenisation CJK/thaï/khmer via `Intl.Segmenter`.
303
+
304
+ **Exécution à distance ?** Oui — `serve-http` expose le même serveur via [Streamable HTTP](https://modelcontextprotocol.io/specification/2025-06-18/basic/transports#streamable-http). Mettez Tailscale Funnel ou Cloudflare Tunnel devant pour le HTTPS. Fonctionne avec le web claude.ai, le GPT personnalisé de ChatGPT, le mode HTTP de Cursor et les clients MCP mobiles. Voir **[docs/http-transport.md](./docs/http-transport.md)**.
305
+
306
+ ---
307
+
308
+ ## 🚀 Publications
309
+
310
+ **v3.0.0 — canal stable.** La feuille de route de récupération v2.x est complète et la surface publique est désormais [liée au semver](./STABILITY.md). Florilège :
311
+
312
+ `v2.0` récupération hybride (BM25+TF-IDF+embeddings via RRF) · `v2.6` MCP distant · `v2.7-2.8` PDF fondus · `v2.9` reranker BGE · `v2.10` OCR · `v2.11` doctor + setup · `v2.12` harnais d'évaluation · `v2.13` HNSW · `v2.14` sessions à état · `v2.15` late-chunking · `v2.16` persistance HNSW · `v2.17` quantification int8 · `v3.8.0` stable · `v3.8.7` durcissement du transport HTTP · **`v3.9.0` stable** : embed-sync du watcher pour les PDF OCRisés, mise à jour HNSW en mémoire en temps réel lors des modifications de fichiers, refill HNSW adaptatif R-10 (clôt la sous-restitution avec >66 % d'exclusion). · **`v3.10` (`@rc`)** : fraîcheur consciente de l'oubli — indicateur `age_days` + `stale` + reclassement optionnel `--recency-weight` + `obsidian_search` conscient du frontmatter.
313
+
314
+ Canal : `npm install @oomkapwn/enquire-mcp` → dernière version stable (`@latest` = v3.10.x). Préversion : `npm install @oomkapwn/enquire-mcp@rc` (le dernier candidat à la version — voir [CHANGELOG.md](./CHANGELOG.md)). Changelog complet : **[CHANGELOG.md](./CHANGELOG.md)** · Plan à venir : **[ROADMAP.md](https://github.com/oomkapwn/enquire-mcp/blob/main/ROADMAP.md)**.
315
+
316
+ ---
317
+
318
+ ## 🤝 Contribuer
319
+
320
+ ```bash
321
+ git clone https://github.com/oomkapwn/enquire-mcp.git
322
+ cd enquire-mcp && npm install
323
+ npm test # suite complète (1329 tests, ~12 s)
324
+ npm run lint # zéro avertissement
325
+ npm run build # tsc → dist/
326
+ ```
327
+
328
+ Issues, PR et idées bienvenues. La protection de branche exige une revue de PR sur `main`.
329
+
330
+ ---
331
+
332
+ ## 📜 Licence
333
+
334
+ MIT. Réalisé par [Alex (@OomkaBear)](https://github.com/oomkapwn). Nommé d'après le [prototype du WWW de Tim Berners-Lee de 1980](https://en.wikipedia.org/wiki/ENQUIRE) — le système hypertexte originel, avant le web. La spécification d'origine était la suivante : vous pouviez interroger le système sur tout. **enquire-mcp apporte cela à votre coffre.**
package/README.hi.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # enquire-mcp
6
6
 
7
- <sub>[English](./README.md) · [中文](./README.zh.md) · [Español](./README.es.md) · **हिन्दी** · [العربية](./README.ar.md)</sub>
7
+ <sub>[English](./README.md) · [中文](./README.zh.md) · [Español](./README.es.md) · **हिन्दी** · [العربية](./README.ar.md) · [Русский](./README.ru.md) · [Português](./README.pt.md) · [Français](./README.fr.md) · [日本語](./README.ja.md)</sub>
8
8
 
9
9
  ### सबसे उन्नत Obsidian MCP। AI एजेंट्स के लिए बनी दीर्घकालिक स्मृति।
10
10