<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: NEHA JAKATE</title>
    <description>The latest articles on DEV Community by NEHA JAKATE (@neha_jakate_).</description>
    <link>https://dev.to/neha_jakate_</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2988821%2F8630d9aa-dc48-4aee-8fb7-349c858dd02d.png</url>
      <title>DEV Community: NEHA JAKATE</title>
      <link>https://dev.to/neha_jakate_</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/neha_jakate_"/>
    <language>en</language>
    <item>
      <title>Vectors vs. Graphs: Picking the Right Tool for Code Intelligence</title>
      <dc:creator>NEHA JAKATE</dc:creator>
      <pubDate>Sun, 02 Aug 2026 11:44:26 +0000</pubDate>
      <link>https://dev.to/neha_jakate_/vectors-vs-graphs-picking-the-right-tool-for-code-intelligence-5e7c</link>
      <guid>https://dev.to/neha_jakate_/vectors-vs-graphs-picking-the-right-tool-for-code-intelligence-5e7c</guid>
      <description>&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Ask five teams building AI coding tools how they represent a codebase for an LLM, and you'll get two answers: embeddings, or a dependency graph. Both camps are right — for different questions. Picking the wrong one for your use case is why some "semantic code search" tools return technically-similar-but-practically-useless results.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture: What Each Model Actually Captures
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Vectors: Semantic Similarity
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;embed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;parse a JWT token&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&gt;≈&lt;/span&gt; &lt;span class="nf"&gt;embed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;verifyToken&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{...})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Embeddings place semantically similar functions close together in vector space. The query doesn't need exact keyword matches — "parse a JWT token" finds the right utility even if the function is named &lt;code&gt;decodeAuthPayload&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; finding unfamiliar code by intent, code completion across different styles, spotting duplicate logic, semantic clustering of docs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limitation:&lt;/strong&gt; vectors capture meaning, not structure. Two semantically similar functions might be years apart in age, one deprecated and one live in production — the embedding doesn't know the difference.&lt;/p&gt;

&lt;h3&gt;
  
  
  Graphs: Structural Truth
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;callers(auth/middleware.js)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;→&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;modules&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;communities()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;→&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="err"&gt;name:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"billing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;files:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;name:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"auth"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;files:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="p"&gt;]}]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Traversing imports, calls, and inheritance answers exact structural questions: reachability, transitive dependencies, ownership boundaries.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; finding what breaks if you change a function, mapping module dependencies, identifying hot-path slices, detecting team boundaries via community detection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limitation:&lt;/strong&gt; graphs find everything structurally &lt;em&gt;reachable&lt;/em&gt;, but can't rank by relevance or catch intent-based similarity across unrelated components. A graph traversal will happily return 40 structurally-connected files with no sense of which 3 actually matter for your question.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementation: The Combined Pattern
&lt;/h2&gt;

&lt;p&gt;Neither model wins outright — the canonical pattern chains them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Step 1: graph-first neighborhood
&lt;/span&gt;&lt;span class="n"&gt;neighborhood&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_neighborhood&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;target_file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;include&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;imports&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;callers&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;community&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Step 2: vector re-ranking inside that neighborhood
&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;vector_search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;user_query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;candidates&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;neighborhood&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;# constrained, not global
&lt;/span&gt;    &lt;span class="n"&gt;top_k&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gives you results that are both &lt;strong&gt;connected&lt;/strong&gt; (graph-verified as structurally relevant) and &lt;strong&gt;semantically relevant&lt;/strong&gt; (vector-ranked within that constrained set) — instead of either a noisy global vector search or an unranked pile of everything structurally reachable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Failure Modes to Watch For
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Failure&lt;/th&gt;
&lt;th&gt;Cause&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Vector search returns deprecated/dead code&lt;/td&gt;
&lt;td&gt;No graph-position awareness — embedding similarity ignores whether code is even reachable from production&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Graph traversal returns too much&lt;/td&gt;
&lt;td&gt;No relevance ranking — "structurally reachable" ≠ "relevant to this question"&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Learnings
&lt;/h2&gt;

&lt;p&gt;The decision framework that generalizes: ask what your engineers actually query for.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mostly &lt;em&gt;"find code that does X"&lt;/em&gt; → vectors alone are probably sufficient&lt;/li&gt;
&lt;li&gt;Mostly &lt;em&gt;"what breaks if I change X"&lt;/em&gt; or &lt;em&gt;"where are the team boundaries"&lt;/em&gt; → you need a graph&lt;/li&gt;
&lt;li&gt;Most mature codebases eventually need both, chained as above&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Spiderbrain uses this exact pattern: a pre-built structural graph with semantic re-ranking applied at query time.&lt;/li&gt;
&lt;li&gt;Related: &lt;em&gt;Every AI Coding Assistant Sees Your Files, Not Your Architecture&lt;/em&gt; (the graph side of this argument in more depth)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🚀 Free on Local · ☁️ Hosted on Pro &amp;amp; Cortex&lt;/p&gt;

&lt;p&gt;Link : &lt;a href="https://spiderbrain.ai/" rel="noopener noreferrer"&gt;https://spiderbrain.ai/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Linkedin : &lt;a href="https://www.linkedin.com/company/spiderbrain" rel="noopener noreferrer"&gt;https://www.linkedin.com/company/spiderbrain&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Discuss: if you're running vector search over a codebase today, are you constraining candidates by any structural signal first, or searching the whole embedding space every time?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>machinelearning</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Your Docs Are Already Lying to You — Here's How to Make Them Graph Nodes Instead</title>
      <dc:creator>NEHA JAKATE</dc:creator>
      <pubDate>Sun, 02 Aug 2026 10:56:54 +0000</pubDate>
      <link>https://dev.to/neha_jakate_/your-docs-are-already-lying-to-you-heres-how-to-make-them-graph-nodes-instead-eep</link>
      <guid>https://dev.to/neha_jakate_/your-docs-are-already-lying-to-you-heres-how-to-make-them-graph-nodes-instead-eep</guid>
      <description>&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Documentation diverges from code the moment it's written. Not eventually — immediately. There's no trigger anywhere in a typical stack that says "this code changed, go check if the doc describing it is still true."&lt;/p&gt;

&lt;p&gt;Six months later, that doc isn't just outdated. It's actively misleading, and nobody's the wiser until someone follows it and gets burned.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture: Docs as First-Class Graph Nodes
&lt;/h2&gt;

&lt;p&gt;The fix isn't "write better docs" or "review docs more often" — that doesn't scale and everyone already knows it. The fix is architectural: treat documentation as nodes in the same graph as your code, connected by real edges.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Without graph edges:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docs/auth.md  ──(no connection)──  auth/middleware.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Docs go stale silently. No trigger to update when code changes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;With graph edges:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docs/auth.md ──[describes]──&amp;gt; auth/middleware.js
                                     │
                              [commit fingerprint tracked]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Docs become connected nodes — flagged when stale, surfaced automatically when relevant.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementation: What Gets Ingested
&lt;/h2&gt;

&lt;p&gt;Three source types become graph nodes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Markdown files&lt;/strong&gt; — README, &lt;code&gt;docs/&lt;/code&gt;, architecture notes. Each file becomes a node.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docstrings&lt;/strong&gt; — JSDoc and Python docstrings, linked directly to the function/class node they document.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenAPI specs&lt;/strong&gt; — ingested as structured schema, woven into the graph rather than treated as a separate artifact.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Drift Detection
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;compare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;doc_commit_fingerprint&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;code_commit_fingerprint&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nx"&gt;code&lt;/span&gt; &lt;span class="nx"&gt;changed&lt;/span&gt; &lt;span class="nx"&gt;since&lt;/span&gt; &lt;span class="nx"&gt;doc&lt;/span&gt; &lt;span class="nx"&gt;was&lt;/span&gt; &lt;span class="nx"&gt;last&lt;/span&gt; &lt;span class="nx"&gt;reviewed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;flag&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;drift&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is systematic, not a manual "does this still look right?" pass — it's a commit-fingerprint diff.&lt;/p&gt;

&lt;h3&gt;
  
  
  Doc-Splitter Pattern
&lt;/h3&gt;

&lt;p&gt;Instead of treating a README as one giant node, each &lt;code&gt;##&lt;/code&gt;/&lt;code&gt;###&lt;/code&gt; section becomes its own node. A query like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"how does auth session expire?"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;returns the exact section describing session expiry — not the entire README dumped into context, which wastes tokens and buries the answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Learnings
&lt;/h2&gt;

&lt;p&gt;The core insight that generalizes: &lt;strong&gt;a graph edge is the actual mechanism that turns docs from a static artifact into a living layer of your code intelligence system.&lt;/strong&gt; Without the edge, "keep docs updated" is a policy nobody follows consistently. With the edge, staleness becomes a detectable, gateable property — same as a failing test.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Spiderbrain ingests markdown, docstrings, and OpenAPI specs into the graph automatically. Free on Local, hosted brain on Pro and Cortex.&lt;/li&gt;
&lt;li&gt;Related: &lt;em&gt;The One Metric Your AI Code Review Tool Ignores&lt;/em&gt; (same commit-fingerprint approach applied to blast radius instead of docs)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🚀 Free on Local · ☁️ Hosted on Pro &amp;amp; Cortex&lt;br&gt;
Link : &lt;a href="https://spiderbrain.ai/" rel="noopener noreferrer"&gt;https://spiderbrain.ai/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Linkedin : &lt;a href="https://www.linkedin.com/company/spiderbrain" rel="noopener noreferrer"&gt;https://www.linkedin.com/company/spiderbrain&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Discuss: what's your team's current process for catching doc drift, if any? Curious how many people are doing this manually vs. not at all.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>software</category>
      <category>documentation</category>
    </item>
    <item>
      <title>28 MCP Tools in One Connection: A Developer's Field Guide</title>
      <dc:creator>NEHA JAKATE</dc:creator>
      <pubDate>Sun, 02 Aug 2026 10:55:16 +0000</pubDate>
      <link>https://dev.to/neha_jakate_/28-mcp-tools-in-one-connection-a-developers-field-guide-3m6e</link>
      <guid>https://dev.to/neha_jakate_/28-mcp-tools-in-one-connection-a-developers-field-guide-3m6e</guid>
      <description>&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Model Context Protocol (MCP) lets an AI agent call structured tools instead of guessing from raw text dumped into a context window. Fine in theory — but most MCP integrations just expose "read file" and "search," which barely improves on copy-pasting code into a chat window.&lt;/p&gt;

&lt;p&gt;The real question: what tools should an agent actually have access to, for codebase work specifically?&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture: Three Tool Categories
&lt;/h2&gt;

&lt;p&gt;Spiderbrain's MCP server exposes 28 tools, split into three functional groups:&lt;/p&gt;

&lt;h3&gt;
  
  
  Codebase Tools (17)
&lt;/h3&gt;

&lt;p&gt;Structural queries a flat context window literally cannot answer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;blast_radius(path)      // reach, callers, transitive impact
score_summary()          // keystones, blindspots, node scores
communities()            // clusters, boundary edges, paths
insights(area)           // summaries, diffs, navigation, search
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Memory Tools (9)
&lt;/h3&gt;

&lt;p&gt;Access to the Memory Tree — a project's accumulated decisions and constraints, persisted across sessions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;memory_recall(files)     // scoped brief for current context
memory_search(query)     // semantic search over the full tree
memory_add(node)         // write with explicit user ratification
memory_browse(scope)     // browse by scope or recency
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Blueprint Tools (2)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;spiderbrain_blueprint_read()   // current nodes, edges, annotations
spiderbrain_blueprint_draw()   // AI proposes canvas edits — requires human acceptance
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Implementation: Which Tools to Call, and When
&lt;/h2&gt;

&lt;p&gt;Don't call all 28 on every turn — that's noise, not context. Here's the practical dispatch table:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situation&lt;/th&gt;
&lt;th&gt;Call&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;New project&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;score_summary()&lt;/code&gt; + &lt;code&gt;top_spikescore(10)&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Before editing a file&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;node(path)&lt;/code&gt; + &lt;code&gt;blast_radius(path)&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Session start&lt;/td&gt;
&lt;td&gt;&lt;code&gt;memory_recall(files)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Planning a refactor&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;communities()&lt;/code&gt; + &lt;code&gt;boundary_edges()&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Onboarding to unfamiliar code&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;blueprint_read()&lt;/code&gt; + &lt;code&gt;insights(area)&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This mapping matters more than tool count. An agent with 28 tools and no dispatch logic will either call none of them or call all of them — both are worse than an agent with 5 tools it actually reaches for at the right moment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Learnings
&lt;/h2&gt;

&lt;p&gt;The pattern that generalizes beyond this specific server: &lt;strong&gt;structure your MCP tools around the moments in a workflow, not around your data model.&lt;/strong&gt; "New project," "before editing," "session start," "refactor," and "onboarding" are moments a developer or agent actually hits. "Get node," "get edge," "get community" are just database operations wearing a tool-call costume.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Spiderbrain is free on Local, hosted brain available on Pro and Cortex.&lt;/li&gt;
&lt;li&gt;Related: &lt;em&gt;Every AI Coding Assistant Sees Your Files, Not Your Architecture&lt;/em&gt; (for the underlying graph model these tools query)
🚀 Free on Local · ☁️ Hosted on Pro &amp;amp; Cortex&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Link : &lt;a href="https://spiderbrain.ai/" rel="noopener noreferrer"&gt;https://spiderbrain.ai/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Linkedin : &lt;a href="https://www.linkedin.com/company/spiderbrain" rel="noopener noreferrer"&gt;https://www.linkedin.com/company/spiderbrain&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Discuss: has anyone else settled on a "moment-based" tool dispatch pattern for their own MCP servers? Curious what situations you gate on.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>mcp</category>
    </item>
  </channel>
</rss>
