--- name: trusty-search description: "Hybrid code search (BM25 + vector + KG) with RRF fusion. Single daemon serves multiple named indexes. Replaces mcp-vector-search." user-invocable: false disable-model-invocation: false license: Apache-2.0 compatibility: claude-code --- # trusty-search Hybrid semantic + lexical + relational code search. Replaces `mcp__mcp-vector-search__*` tools. ## When to Use - **Locate code**: "Where is X defined?" / "How is X used?" - **Explore concepts**: "How does the migration system work?" - **Find tech debt**: "Where are the TODOs / FIXMEs?" - **Q&A over codebase**: Use `chat` for synthesized answers with citations. **Do NOT use for**: persistent memory (use trusty-memory), edits (use Edit), or shell-level file listing. ## Architecture - **Single daemon** at `http://127.0.0.1:7878` serves all projects. - **Named indexes** — one per project: `claude-mpm`, `cto`, `duetto`, `open-mpm`, `rust-dre`, etc. - **Hybrid retrieval**: - **BM25** — lexical/keyword precision - **HNSW** — vector semantic similarity - **KG** — knowledge graph relational signals - Fused with **Reciprocal Rank Fusion (RRF)** ## Query Type Routing `search_code` accepts a `query_type` hint that biases the fusion weights. Always specify it. | `query_type` | Use For | Bias | |--------------|---------|------| | `Definition` | "Where is `run_pending_migrations` defined?" | BM25 precision | | `Usage` | "How is the planner agent invoked?" | Vector similarity | | `Conceptual` | "How does the migration system work?" | Balanced BM25+vector+KG | | `BugDebt` | "Show me the TODOs / hacks" | Keyword match | If unspecified, the daemon auto-routes — but explicit is better. ## Tool Reference ### Search **`search_code`** — primary tool. ``` mcp__trusty-search__search_code( query="migration registry", index="claude-mpm", query_type="Definition", limit=10 ) ``` **`chat`** — LLM-powered Q&A over the index with citations. ``` mcp__trusty-search__chat( index="claude-mpm", question="How does the hook dispatcher route PreToolUse events?" ) ``` ### Index Management ``` mcp__trusty-search__list_indexes() mcp__trusty-search__create_index(name="new-project", root="/abs/path") mcp__trusty-search__delete_index(name="old-project") mcp__trusty-search__index_status(index="claude-mpm") mcp__trusty-search__reindex(index="claude-mpm") mcp__trusty-search__index_file(index="claude-mpm", path="src/foo.py") mcp__trusty-search__remove_file(index="claude-mpm", path="src/old.py") ``` ### Health ``` mcp__trusty-search__search_health() # Returns daemon liveness + uptime. ``` ## When to Use `search_code` vs `chat` | Need | Tool | |------|------| | List of matching files/symbols | `search_code` | | Quick lookup, then read source | `search_code` | | Synthesized explanation across many files | `chat` | | Citations and a narrative answer | `chat` | | Bulk grep replacement | `search_code` with `query_type="Definition"` | `search_code` is cheap; `chat` is more expensive. Prefer `search_code` + targeted `Read` when feasible. ## Index Health Workflow ``` # 1. Confirm daemon up search_health() # 2. Confirm index registered and healthy index_status(index="claude-mpm") # 3. If stale or recently changed many files: reindex(index="claude-mpm") # 4. For single-file invalidation after edit: index_file(index="claude-mpm", path="src/claude_mpm/foo.py") ``` If `search_health` fails: the daemon is not running. Start it externally (`trusty-search serve`). The MCP transport assumes the daemon is already serving. ## Example Calls ### Definition lookup ``` search_code( query="run_pending_migrations", index="claude-mpm", query_type="Definition", limit=5 ) ``` ### Conceptual exploration ``` search_code( query="how hooks get dispatched after tool use", index="claude-mpm", query_type="Conceptual", limit=15 ) ``` ### Tech debt audit ``` search_code( query="TODO FIXME XXX HACK", index="claude-mpm", query_type="BugDebt", limit=50 ) ``` ### Q&A ``` chat( index="claude-mpm", question="What invariants does the migration registry enforce on migration IDs?" ) ``` ## Integration with trusty-memory Search → understand → remember. After investigation, persist learnings. ``` # 1. Find code search_code(query="model_tier_hook", index="claude-mpm", query_type="Definition") # 2. Read and understand the code (use Read tool) # 3. Persist the learning mcp__trusty-memory__memory_remember( content="model_tier_hook enforces planner→claude-opus-4-7 routing; config at ~/.claude-mpm/config/configuration.yaml models.planning", room="Backend", tags=["hooks", "model-tier", "planner"], importance=0.8 ) # 4. Optionally assert relationship in KG mcp__trusty-memory__kg_assert( subject="model_tier_hook", predicate="enforces", object="planner-model-routing" ) ``` ## Migration from mcp-vector-search | Old | New | |-----|-----| | `mcp__mcp-vector-search__search_code` | `mcp__trusty-search__search_code` | | `mcp__mcp-vector-search__index_project` | `mcp__trusty-search__create_index` + `reindex` | | `mcp__mcp-vector-search__get_project_status` | `mcp__trusty-search__index_status` | | `mcp__mcp-vector-search__search_similar` | `search_code` with `query_type="Usage"` | | `mcp__mcp-vector-search__search_context` | `search_code` with `query_type="Conceptual"` or `chat` | | `mcp__mcp-vector-search__search_hybrid` | `search_code` (hybrid is default) | ## Best Practices - **Always pass `index`**: the daemon hosts many projects; omitting `index` is ambiguous. - **Specify `query_type`**: it materially improves ranking. - **Start narrow**: `limit=10` for `search_code`, then expand if needed. - **Reindex sparingly**: full reindex is expensive — prefer `index_file` for single-file updates. - **Verify before claiming**: check `search_health` if results seem stale or empty. - **Pair with memory**: search to find, memory to remember.