memory-fabric 0.4.1__tar.gz

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 (42) hide show
  1. memory_fabric-0.4.1/PKG-INFO +432 -0
  2. memory_fabric-0.4.1/README.md +419 -0
  3. memory_fabric-0.4.1/pyproject.toml +44 -0
  4. memory_fabric-0.4.1/setup.cfg +4 -0
  5. memory_fabric-0.4.1/src/memory_fabric/__init__.py +41 -0
  6. memory_fabric-0.4.1/src/memory_fabric/cli.py +397 -0
  7. memory_fabric-0.4.1/src/memory_fabric/contracts.py +212 -0
  8. memory_fabric-0.4.1/src/memory_fabric/eval.py +1165 -0
  9. memory_fabric-0.4.1/src/memory_fabric/frontmatter.py +120 -0
  10. memory_fabric-0.4.1/src/memory_fabric/llm.py +372 -0
  11. memory_fabric-0.4.1/src/memory_fabric/locking.py +95 -0
  12. memory_fabric-0.4.1/src/memory_fabric/paths.py +130 -0
  13. memory_fabric-0.4.1/src/memory_fabric/py.typed +1 -0
  14. memory_fabric-0.4.1/src/memory_fabric/security.py +72 -0
  15. memory_fabric-0.4.1/src/memory_fabric/server.py +562 -0
  16. memory_fabric-0.4.1/src/memory_fabric/storage/__init__.py +61 -0
  17. memory_fabric-0.4.1/src/memory_fabric/storage/_shared.py +228 -0
  18. memory_fabric-0.4.1/src/memory_fabric/storage/consolidation.py +402 -0
  19. memory_fabric-0.4.1/src/memory_fabric/storage/context.py +287 -0
  20. memory_fabric-0.4.1/src/memory_fabric/storage/dream.py +410 -0
  21. memory_fabric-0.4.1/src/memory_fabric/storage/finalize.py +430 -0
  22. memory_fabric-0.4.1/src/memory_fabric/storage/journal.py +89 -0
  23. memory_fabric-0.4.1/src/memory_fabric/storage/lifecycle.py +425 -0
  24. memory_fabric-0.4.1/src/memory_fabric/storage/patch.py +165 -0
  25. memory_fabric-0.4.1/src/memory_fabric/storage/search.py +120 -0
  26. memory_fabric-0.4.1/src/memory_fabric/storage/sections.py +143 -0
  27. memory_fabric-0.4.1/src/memory_fabric/storage/snapshots.py +61 -0
  28. memory_fabric-0.4.1/src/memory_fabric/storage/store.py +279 -0
  29. memory_fabric-0.4.1/src/memory_fabric/templates.py +220 -0
  30. memory_fabric-0.4.1/src/memory_fabric/version.py +5 -0
  31. memory_fabric-0.4.1/src/memory_fabric.egg-info/PKG-INFO +432 -0
  32. memory_fabric-0.4.1/src/memory_fabric.egg-info/SOURCES.txt +40 -0
  33. memory_fabric-0.4.1/src/memory_fabric.egg-info/dependency_links.txt +1 -0
  34. memory_fabric-0.4.1/src/memory_fabric.egg-info/entry_points.txt +3 -0
  35. memory_fabric-0.4.1/src/memory_fabric.egg-info/requires.txt +6 -0
  36. memory_fabric-0.4.1/src/memory_fabric.egg-info/top_level.txt +1 -0
  37. memory_fabric-0.4.1/tests/test_dream_store.py +238 -0
  38. memory_fabric-0.4.1/tests/test_frontmatter.py +92 -0
  39. memory_fabric-0.4.1/tests/test_memory_fabric.py +1516 -0
  40. memory_fabric-0.4.1/tests/test_resources.py +176 -0
  41. memory_fabric-0.4.1/tests/test_robustness.py +250 -0
  42. memory_fabric-0.4.1/tests/test_security.py +60 -0
@@ -0,0 +1,432 @@
1
+ Metadata-Version: 2.4
2
+ Name: memory-fabric
3
+ Version: 0.4.1
4
+ Summary: File-first MCP memory fabric for AI coding assistants
5
+ Author: Memory Fabric Contributors
6
+ License: MIT
7
+ Requires-Python: >=3.11
8
+ Description-Content-Type: text/markdown
9
+ Provides-Extra: mcp
10
+ Requires-Dist: mcp>=1.0.0; extra == "mcp"
11
+ Provides-Extra: test
12
+ Requires-Dist: pytest>=8; extra == "test"
13
+
14
+ # Memory Fabric
15
+
16
+ [![CI](https://github.com/elViRafa/agentic-memory/actions/workflows/ci.yml/badge.svg)](https://github.com/elViRafa/agentic-memory/actions/workflows/ci.yml)
17
+
18
+ **File-first, local-first memory layer for MCP-compatible AI coding assistants.**
19
+
20
+ Memory Fabric gives AI tools like Claude Code, Cursor, and GitHub Copilot a consistent, project-aware context layer without locking you into one model, editor, cloud provider, or operating system.
21
+
22
+ Memory is stored as human-readable Markdown with YAML frontmatter. No vector database. No cloud account. No embeddings required.
23
+
24
+ ---
25
+
26
+ ## Features
27
+
28
+ - **MCP-native**: exposes memory tools through the standard Model Context Protocol
29
+ - **File-first**: Markdown files are the source of truth, inspectable and commit-ready
30
+ - **Local-first**: core reads and writes work offline
31
+ - **Secret-safe**: API keys and credentials are redacted before writing
32
+ - **Token-budget aware**: assembles context within limits; never slices files mid-document
33
+ - **Quality eval**: scores memory usefulness and Dreaming before/after results locally
34
+ - **Unicode-safe**: works with any human language
35
+ - **Graceful degradation**: works without `rg`, git hooks, or Dreaming configured
36
+
37
+ ---
38
+
39
+ ## Status
40
+
41
+ **v0.4.0 — published to PyPI.**
42
+ Core CLI and MCP tools work end-to-end.
43
+
44
+ ---
45
+
46
+ ## Installation
47
+
48
+ ### From PyPI (recommended)
49
+
50
+ Requires Python ≥ 3.11.
51
+
52
+ ```sh
53
+ pipx install memory-fabric # CLI only
54
+ pipx install "memory-fabric[mcp]" # CLI + MCP server
55
+ ```
56
+
57
+ Or with plain `pip` (inside a virtual environment):
58
+
59
+ ```sh
60
+ pip install memory-fabric # CLI only
61
+ pip install "memory-fabric[mcp]" # CLI + MCP server
62
+ ```
63
+
64
+ Zero-install one-off run (requires [`uv`](https://docs.astral.sh/uv/)):
65
+
66
+ ```sh
67
+ uvx --from "memory-fabric[mcp]" memory-fabric-mcp # starts the MCP server on stdio
68
+ ```
69
+
70
+ ### From GitHub (latest, pre-release)
71
+
72
+ ```sh
73
+ # CLI only
74
+ pipx install "git+https://github.com/elViRafa/agentic-memory.git"
75
+
76
+ # CLI + MCP server
77
+ pipx install "memory-fabric[mcp] @ git+https://github.com/elViRafa/agentic-memory.git"
78
+ ```
79
+
80
+ Or with plain `pip` (inside a virtual environment):
81
+
82
+ ```sh
83
+ pip install "git+https://github.com/elViRafa/agentic-memory.git" # CLI only
84
+ pip install "memory-fabric[mcp] @ git+https://github.com/elViRafa/agentic-memory.git" # + MCP
85
+ ```
86
+
87
+ ### Upgrading
88
+
89
+ Because Memory Fabric is in active development, we recommend upgrading regularly. To pull the latest updates (including the new asynchronous engine and native MCP Sampling support):
90
+
91
+ 1. **Reinstall/Upgrade the Package**:
92
+ ```sh
93
+ # If installed via pipx:
94
+ pipx install --force "memory-fabric[mcp] @ git+https://github.com/elViRafa/agentic-memory.git"
95
+
96
+ # If installed in a virtual environment via pip:
97
+ pip install --upgrade --force-reinstall "memory-fabric[mcp] @ git+https://github.com/elViRafa/agentic-memory.git"
98
+ ```
99
+
100
+ 2. **Restart MCP Clients**:
101
+ After upgrading, restart your IDE (Cursor, VS Code) or assistant process (Claude Code) to ensure the client reloads the updated `memory-fabric-mcp` server.
102
+
103
+ 3. **Refresh Local Projects (Optional)**:
104
+ If you have projects initialized with older versions of Memory Fabric, navigate to the project directory and run:
105
+ ```sh
106
+ ai-memory init --install-hooks
107
+ ```
108
+ This will safely refresh starter templates and local git hook integration to the latest format without overwriting your existing memory markdown files.
109
+
110
+ Or clone and install in editable mode for local development:
111
+
112
+ ```sh
113
+ git clone https://github.com/elViRafa/agentic-memory.git
114
+ cd agentic-memory
115
+ pip install -e . # CLI only
116
+ pip install -e ".[mcp]" # CLI + MCP server
117
+ ```
118
+
119
+ ---
120
+
121
+ ## Quick Start
122
+
123
+ ### 1. Initialize a project
124
+
125
+ ```sh
126
+ ai-memory init
127
+ ```
128
+
129
+ Creates `.ai-memory/` in the current directory with starter sections and a `.gitignore`.
130
+
131
+ ### 2. Check health
132
+
133
+ ```sh
134
+ ai-memory doctor
135
+ ```
136
+
137
+ ### 3. Evaluate memory quality
138
+
139
+ ```sh
140
+ ai-memory eval
141
+ ai-memory eval --json
142
+ ```
143
+
144
+ `eval` scores whether memories are useful for coding assistants. It checks section coverage, starter-template content, summary quality, metadata, retrieval readiness, and likely secrets.
145
+
146
+ If `.ai-memory/` exists, reports are saved under ignored local files:
147
+
148
+ ```text
149
+ .ai-memory/evals/latest.json
150
+ .ai-memory/evals/latest.md
151
+ .ai-memory/evals/<timestamp>-memory.json
152
+ .ai-memory/evals/<timestamp>-memory.md
153
+ ```
154
+
155
+ If `.ai-memory/` does not exist yet, eval prints a pre-init report only and creates no files.
156
+
157
+ ### 4. Query memory
158
+
159
+ ```sh
160
+ ai-memory query "authentication"
161
+ ```
162
+
163
+ ### 5. Run maintenance (Dreaming)
164
+
165
+ ```sh
166
+ ai-memory dream --mode light
167
+ ai-memory dream --mode deep
168
+ ```
169
+
170
+ Dreaming creates a snapshot before maintenance. You can evaluate whether a Dreaming run improved memory quality:
171
+
172
+ ```sh
173
+ ai-memory eval --dream latest
174
+ ai-memory dream --mode light --eval
175
+ ```
176
+
177
+ Dream eval compares the pre-dream snapshot to current memory and reports score delta, changed files, improvements, and regressions.
178
+
179
+ ---
180
+
181
+ ## MCP Server
182
+
183
+ Add to your MCP client configuration (for example Claude Code or Cursor):
184
+
185
+ ```json
186
+ {
187
+ "mcpServers": {
188
+ "memory-fabric": {
189
+ "command": "memory-fabric-mcp"
190
+ }
191
+ }
192
+ }
193
+ ```
194
+
195
+ ### Available MCP Tools
196
+
197
+ | Tool | Description |
198
+ |---|---|
199
+ | `initialize_memory_fabric_tool` | Create `.ai-memory/` scaffolding in a project |
200
+ | `read_combined_context_tool` | Load Tier 0 directives + prioritized memory within token budget |
201
+ | `read_section_tool` | Read a single memory section by name |
202
+ | `keyword_search_tool` | Search memory with ripgrep or Python fallback |
203
+ | `write_local_memory_tool` | Append or replace a section with secret scanning |
204
+ | `propose_memory_patch_tool` | Preview proposed memory changes without applying |
205
+ | `dream_tool` | Run memory maintenance / consolidation (--mode light|deep) |
206
+ | `prepare_dream_payload_tool` | Prepare candidate snapshot and return consolidation prompt for client-driven dreaming |
207
+ | `apply_dream_results_tool` | Apply LLM consolidated JSON output to candidate snapshot and save changes |
208
+ | `evaluate_memory_fabric_tool` | Evaluate local memory quality |
209
+ | `evaluate_dream_quality_tool` | Evaluate a Dreaming run against a snapshot |
210
+ | `write_memory_store_tool` | Write a memory file to a semantic store path (e.g. `architecture/decisions/auth`) |
211
+ | `read_memory_store_tool` | Read a single memory-store file by its semantic path |
212
+ | `list_memory_store_tool` | List files in the memory store, optionally filtered by prefix/tags |
213
+ | `delete_memory_store_tool` | Remove a memory-store file by its semantic path |
214
+
215
+ ---
216
+
217
+ ## Agentic Architecture (making agents use Memory Fabric automatically)
218
+
219
+ Registering the MCP server is necessary but not sufficient — AI agents will not use its tools unless explicitly instructed to do so.
220
+
221
+ Memory Fabric provides an automated **Agentic Architecture** to handle this for you.
222
+
223
+ When you run `ai-memory init` in your project, the CLI automatically deploys a complete suite of agent instruction files tailored for every major AI tool:
224
+
225
+ | Target | File(s) Created |
226
+ |:---|:---|
227
+ | **Gemini CLI / Codex / Antigravity** | `AGENTS.md` |
228
+ | **Grok (TUI / Build / Agent harness)** | `AGENTS.md` (primary project rules); full docs + MCP registration in `~/.grok/config.toml` or `.mcp.json`; see also `.grok/docs/user-guide/13-memory-fabric.md` when installed for the client |
229
+ | **Cursor IDE** | `.cursor/rules/memory-fabric.mdc` |
230
+ | **Windsurf IDE** | `.windsurf/rules/memory-fabric.md` |
231
+ | **Cline / Generic IDE Agents** | `.agents/rules/memory-store.md`, `.agents/rules/dreaming.md` |
232
+ | **Claude Code** | `CLAUDE.md` (created or appended) |
233
+ | **GitHub Copilot** | `.github/copilot-instructions.md` (created or appended) |
234
+
235
+ ### Single Source of Truth (Syncing)
236
+ All these files are generated from **two canonical content blocks** inside the Memory Fabric Python package. Running `ai-memory sync-agents` regenerates every platform file from these templates, guaranteeing perfect consistency. If you used `ai-memory init --install-hooks`, a `pre-commit` git hook runs this sync automatically on every commit.
237
+
238
+ For full details on the architecture, see [`AGENTIC_ARCHITECTURE.md`](AGENTIC_ARCHITECTURE.md).
239
+
240
+ ### Why this matters
241
+
242
+ Without these instruction files, agents will often explain they "don't use MCP tools automatically," or worse, they will write memory markdown files directly using native file-system tools—bypassing secret scanning, token budgeting, and background Dreaming management.
243
+
244
+ By simply running `ai-memory init`, you get zero-configuration, plug-and-play capability across the entire agent ecosystem.
245
+
246
+ ---
247
+
248
+ ## Using Memory Fabric in Other Projects
249
+
250
+ You can use a single installed instance of Memory Fabric across all your coding projects:
251
+
252
+ 1. **Scaffold the target project**:
253
+ Navigate to your target project's root folder and initialize it:
254
+ ```sh
255
+ cd /path/to/other-project
256
+ ai-memory init --install-hooks
257
+ ```
258
+ This automatically creates `.ai-memory/`, deploys the **Agentic Architecture** rule files, sets up `.gitignore`, and installs the git post-commit hooks.
259
+
260
+ 2. **Global MCP Configuration**:
261
+ Verify your AI assistant's configuration points to your globally installed `memory-fabric-mcp` executable. The MCP tools automatically parse and use the active project's path passed by the assistant as the `cwd` argument, enabling a single global MCP server registration to support all your local workspaces.
262
+
263
+ ---
264
+
265
+ ## Project Memory Layout
266
+
267
+ ```text
268
+ .ai-memory/
269
+ |-- index.md
270
+ |-- architecture.md
271
+ |-- schemas.md
272
+ |-- decisions.md
273
+ |-- debt.md
274
+ |-- ubiquitous-language.md
275
+ |-- framework-rules.md
276
+ |-- evals/ # ignored local quality reports
277
+ |-- snapshots/ # ignored rollback baselines
278
+ |-- private/ # ignored personal notes
279
+ `-- .gitignore
280
+ ```
281
+
282
+ All shared memory files use YAML frontmatter:
283
+
284
+ ```markdown
285
+ ---
286
+ section: architecture
287
+ summary: "One-line fallback used when the file exceeds the token budget."
288
+ priority: high
289
+ tags: [api, auth]
290
+ schema_version: "1.3"
291
+ last_updated: 2026-06-01T12:00:00-04:00
292
+ ---
293
+
294
+ Your memory content here.
295
+ ```
296
+
297
+ ---
298
+
299
+ ## Global Memory
300
+
301
+ Developer-level preferences that apply across all projects are stored at:
302
+
303
+ | Platform | Path |
304
+ |---|---|
305
+ | Windows | `%APPDATA%\memory-fabric\global\` |
306
+ | macOS | `~/Library/Application Support/memory-fabric/global/` |
307
+ | Linux | `$XDG_CONFIG_HOME/memory-fabric/global/` |
308
+
309
+ `global/directives.md` is **Tier 0**: it is always loaded fully, bypassing token budgeting.
310
+
311
+ ---
312
+
313
+ ## CLI Reference
314
+
315
+ ```text
316
+ ai-memory [--cwd <path>] [--json] [--debug-llm] <command>
317
+
318
+ Commands:
319
+ init Create .ai-memory/ scaffolding
320
+ status Show memory status
321
+ doctor Validate memory files and environment
322
+ eval Score memory quality or Dreaming quality
323
+ dream Run memory maintenance (--mode light|deep)
324
+ query Search memory
325
+ store CRUD operations on semantic memory store
326
+ sync-global Preview local-to-global promotions
327
+ rollback Restore from a snapshot
328
+ ```
329
+
330
+ Eval examples:
331
+
332
+ ```sh
333
+ ai-memory eval
334
+ ai-memory eval --json
335
+ ai-memory eval --llm-review
336
+ ai-memory eval --dream latest
337
+ ai-memory eval --dream memory-20260601T140000_0400
338
+ ```
339
+
340
+ Optional LLM review is never enabled by default. When requested, deterministic local scores remain the source of truth; LLM notes are secondary and inputs are sanitized before review.
341
+
342
+ ---
343
+
344
+ ## LLM Configuration & MCP Sampling
345
+
346
+ Memory Fabric uses Large Language Models (LLMs) to perform semantic memory consolidation (Dreaming) and qualitative evaluation. You can configure this in two ways: via direct environment variables or via zero-config **MCP Sampling**.
347
+
348
+ ### Resolution Precedence
349
+
350
+ When an operation requires an LLM, Memory Fabric resolves the provider in the following order:
351
+
352
+ 1. **Direct LLM Provider**: Uses direct API calls if `MEMORY_FABRIC_LLM_PROVIDER` is set in the environment along with the corresponding API keys.
353
+ 2. **Native MCP Sampling**: If no direct provider is set (or configured keys are missing) AND the command is executed within an active MCP session where the parent agent supports sampling, Memory Fabric delegates the LLM call to the agent itself.
354
+ 3. **Graceful Local Fallback**: If neither is available, it degrades gracefully to local, deterministic regex-based deduplication without semantic synthesis.
355
+
356
+ ### Using MCP Sampling in Dreaming
357
+
358
+ MCP Sampling allows Memory Fabric to run semantic Dreaming and evaluations **without configuring any local API keys or provider environment variables**. Instead, it uses the host client's (e.g. Claude Code) native LLM connection.
359
+
360
+ #### How It Works
361
+ 1. When your AI assistant calls the `dream_tool` or `evaluate_memory_fabric_tool` via MCP, the Memory Fabric server checks if the client session supports sampling capabilities.
362
+ 2. If supported and no direct provider is configured, the server sends a `create_message` request back to the client.
363
+ 3. The client assistant executes the LLM reasoning under the hood and returns the consolidated memory JSON or evaluation notes.
364
+
365
+ #### Key Benefits
366
+ - **Zero-Config:** No need to configure or expose `GEMINI_API_KEY`, `OPENAI_API_KEY`, or `ANTHROPIC_API_KEY` to the background MCP server process.
367
+ - **Unified Context:** The consolidation uses the same model and settings configured in your main coding assistant.
368
+
369
+ > [!IMPORTANT]
370
+ > **CLI Limitation:** MCP Sampling relies on an active client-server session. Since the standalone terminal CLI (`ai-memory`) runs outside of an MCP client, running `ai-memory dream` from the command line **cannot** use MCP Sampling. To use LLM-based consolidation via the CLI, you must configure a direct LLM provider.
371
+
372
+ ### Client-Driven / Split-Tool Dreaming (Avoiding Deadlocks & Timeouts)
373
+
374
+ In some sequential/blocking MCP client environments (like IDE extensions or agentic loops), executing a nested MCP Sampling request (`create_message`) while the client is waiting for a tool response can lead to a JSON-RPC deadlock or execution timeouts.
375
+
376
+ To completely avoid this re-entrancy issue, Memory Fabric provides a client-driven split-tool dreaming protocol:
377
+
378
+ 1. **Prepare Payload**: The agent/client first calls `prepare_dream_payload_tool`. This returns a `consolidation_prompt` and a `candidate_store` ID, but performs no blocking LLM reasoning.
379
+ 2. **Execute Locally**: The client uses its own local LLM connection/context to execute the returned `consolidation_prompt` and captures the raw JSON output.
380
+ 3. **Apply Results**: The client sends the raw LLM JSON response back by calling `apply_dream_results_tool(candidate_store=..., llm_response=...)`. Memory Fabric parses the response, applies the consolidated changes to the candidate folder, and saves the new memory states.
381
+
382
+ ### Direct LLM Providers Configuration
383
+
384
+ To use the CLI with LLMs, or to bypass MCP Sampling with a specific provider, set the following environment variables:
385
+
386
+ | Provider | Environment Variables | Notes |
387
+ |---|---|---|
388
+ | **Gemini** | `MEMORY_FABRIC_LLM_PROVIDER=gemini`<br>`GEMINI_API_KEY=your_key` | Defaults to `gemini-2.5-flash` |
389
+ | **OpenAI** | `MEMORY_FABRIC_LLM_PROVIDER=openai`<br>`OPENAI_API_KEY=your_key`<br>`OPENAI_MODEL=gpt-4o-mini` *(opt)*<br>`OPENAI_API_BASE=...` *(opt)* | Can connect to custom local/remote OpenAI-compatible endpoints |
390
+ | **Anthropic** | `MEMORY_FABRIC_LLM_PROVIDER=anthropic`<br>`ANTHROPIC_API_KEY=your_key` | Defaults to `claude-3-5-haiku-20241022` |
391
+ | **Ollama** | `MEMORY_FABRIC_LLM_PROVIDER=ollama`<br>`OLLAMA_HOST=...` *(opt)*<br>`OLLAMA_MODEL=gemma2` *(opt)* | Offline, local reasoning |
392
+
393
+ ---
394
+
395
+ ## LLM Debugging
396
+
397
+ If you want to view the exact prompts sent and responses received by the LLM providers (Gemini, OpenAI, Anthropic, Ollama), you can enable LLM debug logging.
398
+
399
+ - **Via the CLI**: Pass the `--debug-llm` global flag **before** the subcommand:
400
+ ```sh
401
+ ai-memory --debug-llm dream --mode deep
402
+ ```
403
+ This automatically prints logs to `sys.stderr` and appends them to a file named `llm_debug.log` (in `.ai-memory/llm_debug.log` if the directory exists, otherwise in the current working directory).
404
+
405
+ - **Via Environment Variables**: Set the `MEMORY_FABRIC_LLM_DEBUG` variable in your environment:
406
+ - `stderr`: Output prompts and raw JSON responses only to `sys.stderr`.
407
+ - `1` or `true`: Output to `sys.stderr` and write to the default `llm_debug.log` file.
408
+ - `/path/to/log.txt` (or any other custom value): Append logs to a custom file path.
409
+
410
+ To protect your credentials and API keys, headers like `Authorization` and `x-api-key` are automatically redacted as `[REDACTED]` in the debug logs.
411
+
412
+ ---
413
+
414
+ ## Write Safety
415
+
416
+ Every write path runs secret detection before saving. Detected secrets are replaced with `[REDACTED_SECRET]` and returned in the `redactions` field of the response. File locking prevents concurrent write corruption.
417
+
418
+ Eval scans existing memories for likely secrets but does not rewrite existing files. It reports what needs manual review.
419
+
420
+ ---
421
+
422
+ ## Requirements
423
+
424
+ - Python >= 3.11
425
+ - `mcp >= 1.0.0` (optional, required for MCP server only)
426
+ - `rg` (optional; ripgrep speeds up keyword search, Python fallback used when absent)
427
+
428
+ ---
429
+
430
+ ## License
431
+
432
+ MIT