Build1 distinct publisher3 min readUpdated
A dev.to walkthrough wires chokidar, tree-sitter, Qdrant and an MCP server into a code search stack. Every part is off the shelf; the unresolved work is reindexing and retrieval quality.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
Follow any of these and your For You feed starts watching them — no settings page required.
A tutorial published on dev.to, originally on the author's own site, lays out a full reference build for a "RAG-assisted" Model Context Protocol server that turns a local monorepo into a queryable index, presented as a do-it-yourself version of tools like repowise [1]. What makes it worth reading is not any modelling idea but the parts list: every box in the diagram is a named, installable dependency, which moves the risk out of research and into integration.
The shape is three stages plus a serving path. A chokidar file watcher feeds a LangChain-based indexer, which writes into a Qdrant vector store; a hybrid retriever sits behind a FastMCP server that IDE and CLI clients such as Claude and Cursor consume [2]. Chunking is done with tree-sitter so splits land on functions and classes rather than arbitrary character offsets [3], keyed on `function_declaration`, `class_declaration` and `method_definition` nodes, with each chunk given an id of the form `path:startRow-endRow` [4]. Embeddings come from a local FastAPI service running sentence-transformers with `BAAI/bge-small-en-v1.5`, normalised, on port 8000, justified on privacy and zero API cost [5]. Prerequisites are Node 20+, Python 3.11+, a running Qdrant, and a repo under a million files [6].
Note where the model sits: behind an HTTP POST to `/embed` [5]. That boundary is the whole argument. Swapping the embedding model is a config change; the things you cannot swap are the chunker, the watcher's update semantics, and the ranking.
The watcher is described as updating the store incrementally [7], and that is where the id scheme starts to matter. Because ids encode start and end lines [4], inserting a line near the top of a file changes the id of every chunk below it, so an upsert-only path leaves the previous generation of chunks resident and still eligible for similarity search unless the indexer deletes by file path first [8]. The excerpt supplied stops mid-function inside `indexFile`, before any of that logic appears [9], so on the evidence available the hardest part of the build is the part not shown.
Retrieval quality has the same gap. Combining vector similarity with BM25 lexical search and AST context [10] is the right shape for code, where identifiers want exact matching and intent wants embeddings. But the material specifies no fusion weighting, no evaluation set, and no measured recall, latency or index size [11]. At the tutorial's stated ceiling of a million files [6], the distinction between a correct answer to "where do we check user permissions" and a plausible one is entirely ranking [12], and ranking regressions are silent unless you have fixed queries with known answers.
Watch three things if you build this. Whether your incremental path handles deletes and renames, not just edits [8]. Whether the exclude-pattern and language config, which the shared types expose as `excludePatterns` and `languages` [13], is doing enough to keep generated code and vendored trees out of the index. And whether anyone on the team owns a retrieval eval; the tutorial reserves a section for production hardening and an FAQ [14], but hardening a pipeline is not the same as knowing it answers correctly.
Ranked by verification strength, evidence, and original report placement.
The tutorial uses tree-sitter for language-agnostic parsing, stating this preserves semantic boundaries (functions, classes) instead of arbitrary character splits, and that the indexer splits code into AST-aware chunks, embeds them and stores them in a local vector database.
The sample chunker emits a chunk when a tree-sitter node type is one of function_declaration, class_declaration or method_definition, and sets the chunk id to `${filePath}:${node.startPosition.row}-${node.endPosition.row}`.
A tutorial titled "Build a Codebase Intelligence Tool Like repowise With a RAG-Assisted MCP for Your Monorepo" was published on dev.to, noting it was originally published on tamiz.pro, and describes building a production-grade RAG-assisted Model Context Protocol server that turns a local codebase into a queryable knowledge base for LLMs and CLI tools, framed as building your own version of tools like repowise.
The tutorial's architecture diagram shows a File Watcher (chokidar) feeding an Indexer (LangChain) feeding a Vector Store (Qdrant), with a Retriever (Hybrid) feeding an MCP Server (FastMCP) that serves IDE/CLI clients including Claude and Cursor.
The tutorial describes the retriever as combining vector similarity with BM25 lexical search and AST context for precise retrieval.
The tutorial motivates the build by arguing that traditional code search, including ripgrep, Sourcegraph and IDE search, struggles with semantic queries such as "how do we handle payment retries?" or "find all places where user permissions are checked", and that modern monorepos contain hundreds of thousands of files spanning multiple services, libraries and configurations.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Runnable snippets, zero measurements
The source supplies concrete, inspectable artifacts — package layout, a tree-sitter chunker, a FastAPI embedding service, a Qdrant-backed indexer with watcher bindings, and an MCP server skeleton — which is real evidence about the shape of the stack. It supplies nothing about whether the stack works: no evaluation set, no retrieval metrics, latency or index-size figures, no fusion weighting, and the body is truncated before client integration and production hardening. One publisher, one artifact, no independent corroboration.
No adoption signal in supplied material
The cluster contains a how-to article and no release, deployment, usage disclosure, benchmark or pricing event. Named third-party tools (repowise, Claude, Cursor, Qdrant, Sourcegraph) appear as references or targets, not as evidence that anyone has adopted the described stack. Nothing in the supplied material supports an adoption score, and inferring one from tool mentions would be a guess.
'Production-grade' outruns what is shown
The article promises a production-grade build with precise retrieval and incremental index updates. What the supplied code establishes is a plumbing sketch: retrieval quality is asserted with no evaluation, the hybrid retriever's lexical and fusion logic is not present, the change path upserts without clearing prior chunks whose ids are line-number-derived, the only delete keys on a path that cannot match a chunk id, and language-agnostic parsing is claimed while only TypeScript is loaded. Gap is positive and moderate rather than extreme, because the component-composition claim itself is accurate and verifiable from the snippets.
Self-published tutorial, product-shaped framing
The observable incentive is authorial promotion: the piece is cross-posted to dev.to from the author's own site (tamiz.pro) and is framed around replicating a named product, repowise, with incumbent tools cast as inadequate. That shapes the optimistic 'production-grade' register. No sponsorship, vendor relationship or commercial interest in any named component (Qdrant, LangChain, FastMCP, repowise) is disclosed or evident either way, so this reads as ordinary developer-content self-interest rather than vendor marketing.
One truncated source, ledger inconsistency
Confidence is limited by structure, not by contradiction between publishers: there is exactly one publisher and one artifact, and its body is cut off mid-statement so three promised sections cannot be assessed. The published ledger further locates the truncation inside indexFile, which the supplied body contradicts, indicating the upstream capture of this artifact was itself inconsistent. What can be stated with confidence is narrow and internal — the component list, the chunker's id scheme, and the absence of measurements.
product
Salesforce turns 200-plus Data 360 APIs into MCP endpoints, and governance into a grant decision1 distinct publisher
science
OX Security says MCP command execution is a design choice, so server owners own the risk1 distinct publisher
product
LangChain's dcode and NVIDIA's NemoClaw sell controls, not code quality1 distinct publisher
product
Binance gives agents a trading seat, and gives users the permission slip1 distinct publisher
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 15, 2026