<?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: Darshan Kachare</title>
    <description>The latest articles on DEV Community by Darshan Kachare (@dskdevai).</description>
    <link>https://dev.to/dskdevai</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%2F4141771%2Fd65f3b63-d21c-4441-8430-11f652b1ca94.png</url>
      <title>DEV Community: Darshan Kachare</title>
      <link>https://dev.to/dskdevai</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dskdevai"/>
    <language>en</language>
    <item>
      <title>MCP Nexus 1.0: the routing &amp;amp; discovery layer for MCP tools</title>
      <dc:creator>Darshan Kachare</dc:creator>
      <pubDate>Thu, 24 Sep 2026 18:56:07 +0000</pubDate>
      <link>https://dev.to/dskdevai/mcp-nexus-10-the-routing-amp-discovery-layer-for-mcp-tools-16ed</link>
      <guid>https://dev.to/dskdevai/mcp-nexus-10-the-routing-amp-discovery-layer-for-mcp-tools-16ed</guid>
      <description>&lt;p&gt;Agents keep gaining access to more MCP tools — dozens, then hundreds. Exposing them all at once to Claude Code, Cursor, or OpenCode creates four concrete problems:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;th&gt;Consequence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Discovery&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;an agent can't reason over 500 tool descriptions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Context&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;every exposed tool bloats the agent's context with irrelevant schemas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Security&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;a tool shouldn't automatically receive unlimited permissions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Maintenance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;wiring each tool into each agent is duplicated, scattered work&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;MCP Nexus&lt;/strong&gt; answers with a &lt;em&gt;capability surface&lt;/em&gt;: rather than dumping every tool, it exposes the few that fit the current request. One umbrella MCP endpoint in front of hundreds of tools — the agent only ever sees the right capability at the right time.&lt;/p&gt;

&lt;p&gt;It's free and open source (Apache-2.0), written in TypeScript, and runs on the &lt;a href="https://modelcontextprotocol.io" rel="noopener noreferrer"&gt;Model Context Protocol&lt;/a&gt;. v1.0.0 is out.&lt;/p&gt;




&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One endpoint, hundreds of tools&lt;/strong&gt; — agents connect once over &lt;strong&gt;stdio&lt;/strong&gt; or &lt;strong&gt;Streamable HTTP&lt;/strong&gt; to the full &lt;code&gt;nexus.*&lt;/code&gt; surface: &lt;code&gt;register_tool&lt;/code&gt;, &lt;code&gt;remove_tool&lt;/code&gt;, &lt;code&gt;inspect_tool&lt;/code&gt;, &lt;code&gt;list_tools&lt;/code&gt;, &lt;code&gt;route&lt;/code&gt;, &lt;code&gt;discover&lt;/code&gt;, &lt;code&gt;invoke&lt;/code&gt;, &lt;code&gt;approvals&lt;/code&gt;, &lt;code&gt;resolve_approval&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic capability discovery&lt;/strong&gt; — &lt;code&gt;nexus.discover&lt;/code&gt; returns the minimal tool surface that fits the request instead of 500 schemas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Explainable routing&lt;/strong&gt; — every decision carries a provider, confidence, matched capabilities, and alternatives.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LLM-optional&lt;/strong&gt; — heuristic → semantic → LLM fallback. It routes perfectly with &lt;strong&gt;no GPU, no API key, no internet&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Policy-aware execution&lt;/strong&gt; — per-tool permission scopes plus allow / deny / approval rules.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit-ready&lt;/strong&gt; — JSONL activity log with &lt;code&gt;executionId&lt;/code&gt; correlated end-to-end from gateway invoke to dashboard activity.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                    AI AGENT
             Claude / Cursor / Codex
                       │
                       ▼
              ┌─────────────────┐
              │    MCP SERVER   │     stdio · Streamable HTTP
              └────────┬────────┘
                       │
                       ▼
              ┌─────────────────┐
              │   DISCOVERY     │
              └────────┬────────┘
                       │
             ┌─────────┴─────────┐
             ▼                   ▼
        TOOL REGISTRY         ROUTER          intent overlay
                               │
                   ┌───────────┼───────────┐
                   ▼           ▼           ▼
                Heuristic   Semantic    LLM*
                   │           │           │
                   └───────────┼───────────┘
                               ▼
                         POLICY ENGINE
                               │
                               ▼
                         TOOL RUNNER
                               │
              local · stdio · docker · http
                               │
                               ▼
                            MCP TOOL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;*&lt;/code&gt; LLM is optional — the zero-dependency router stack runs fully offline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick start
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Requires &lt;strong&gt;Node.js ≥ 22&lt;/strong&gt; (Node 24 recommended for native TypeScript).&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/dsk-dev-ai/mcp-nexus.git
&lt;span class="nb"&gt;cd &lt;/span&gt;mcp-nexus
npm &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="c"&gt;# stdio (local client)&lt;/span&gt;
npm start

&lt;span class="c"&gt;# …or Streamable HTTP (remote clients)&lt;/span&gt;
npm start &lt;span class="nt"&gt;--&lt;/span&gt; start:http        &lt;span class="c"&gt;# http://127.0.0.1:3001/mcp&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Connect the endpoint from any MCP client. From a second terminal, manage the registry:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm start &lt;span class="nt"&gt;--&lt;/span&gt; add tools/repoarch.json
npm start &lt;span class="nt"&gt;--&lt;/span&gt; add tools/ctx.json
npm start &lt;span class="nt"&gt;--&lt;/span&gt; add tools/dependency-audit.json

npm start &lt;span class="nt"&gt;--&lt;/span&gt; list                               &lt;span class="c"&gt;# browse&lt;/span&gt;
npm start &lt;span class="nt"&gt;--&lt;/span&gt; inspect repoarch                   &lt;span class="c"&gt;# full manifest&lt;/span&gt;
npm start &lt;span class="nt"&gt;--&lt;/span&gt; search &lt;span class="s2"&gt;"check vulnerable dependencies"&lt;/span&gt;   &lt;span class="c"&gt;# dry-run routing&lt;/span&gt;
npm start &lt;span class="nt"&gt;--&lt;/span&gt; doctor                             &lt;span class="c"&gt;# environment check&lt;/span&gt;
npm start &lt;span class="nt"&gt;--&lt;/span&gt; benchmark                          &lt;span class="c"&gt;# CI gate&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now connect any MCP client and ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Analyze my repository architecture and check dependencies for vulnerabilities."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent calls &lt;code&gt;nexus.route&lt;/code&gt; / &lt;code&gt;nexus.invoke&lt;/code&gt;; Nexus discovers, selects, policy-checks, and executes the right tool — over both transports.&lt;/p&gt;

&lt;h2&gt;
  
  
  How routing works
&lt;/h2&gt;

&lt;p&gt;The router chain is &lt;strong&gt;provider fallback, left to right&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;heuristic → semantic → llm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;heuristic&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;deterministic keyword / capability scoring with an embedded stemmer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;semantic&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;zero-dependency character-bigram / IDF fuzzy router; recovers typos like "archtecture" and "vulnerbilities"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;llm&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Gemini (REST) or OpenRouter (OpenAI-compatible); reports &lt;code&gt;unavailable&lt;/code&gt; without a key so the chain never depends on it&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A deterministic &lt;strong&gt;intent overlay&lt;/strong&gt; fires at the route head in both heuristic and semantic layers, so domain vocabulary — git history, dependency/lockfile risk, secret scanning, repo structure — always wins over generic context fallbacks.&lt;/p&gt;

&lt;p&gt;Every decision is explainable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ npm start -- search "check vulnerable dependencies"

Request: "check vulnerable dependencies"
Selected: dependency-audit
Provider: heuristic
Confidence: 100%
Matched capabilities: dependency-audit
Alternatives: repoarch (49%), ctx (0%)
Why: Matched capabilities: dependency-audit for "dependency-audit".
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Policy-aware execution
&lt;/h2&gt;

&lt;p&gt;Manifests carry permission scopes; global rules add allow / deny / approval:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json-doc"&gt;&lt;code&gt;&lt;span class="c1"&gt;// .nexus/policy.json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"default"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"allow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"rules"&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="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"tool"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"git"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"blocklists"&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="s2"&gt;"git.push"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"approvals"&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="s2"&gt;"git.commit"&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="w"&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="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Approval-gated tools queue for an operator and resolve over the gateway (&lt;code&gt;nexus.approvals&lt;/code&gt;, &lt;code&gt;nexus.resolve_approval&lt;/code&gt;) or through the web dashboard.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deterministic benchmark, not vibes
&lt;/h2&gt;

&lt;p&gt;A fully-offline reference suite — &lt;strong&gt;6 tools / 32 tasks&lt;/strong&gt; across exact / semantic / ambiguous / unknown intents — reproducible on any machine:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Accuracy&lt;/th&gt;
&lt;th&gt;exact&lt;/th&gt;
&lt;th&gt;semantic&lt;/th&gt;
&lt;th&gt;ambiguous&lt;/th&gt;
&lt;th&gt;unknown&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Heuristic&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100.0%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;15/15&lt;/td&gt;
&lt;td&gt;4/4&lt;/td&gt;
&lt;td&gt;5/5&lt;/td&gt;
&lt;td&gt;8/8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Semantic&lt;/td&gt;
&lt;td&gt;87.5%&lt;/td&gt;
&lt;td&gt;15/15&lt;/td&gt;
&lt;td&gt;4/4&lt;/td&gt;
&lt;td&gt;2/5&lt;/td&gt;
&lt;td&gt;7/8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hybrid&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;93.8%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;15/15&lt;/td&gt;
&lt;td&gt;4/4&lt;/td&gt;
&lt;td&gt;4/5&lt;/td&gt;
&lt;td&gt;7/8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Large (50 tools)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100.0%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;20/20&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Hard failures: none.&lt;/strong&gt; &lt;code&gt;mcp-nexus benchmark&lt;/code&gt; exits &lt;code&gt;0&lt;/code&gt; only when every exact + semantic reference task routes correctly — and that &lt;em&gt;is&lt;/em&gt; the CI gate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/dsk-dev-ai/mcp-nexus" rel="noopener noreferrer"&gt;dsk-dev-ai/mcp-nexus&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Project site:&lt;/strong&gt; &lt;a href="https://dsk-dev-ai.github.io/mcp-nexus/" rel="noopener noreferrer"&gt;dsk-dev-ai.github.io/mcp-nexus&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docs:&lt;/strong&gt; API, architecture, routing, registry, benchmarks, dashboard, security, clients, SDK, performance, integrations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sponsor:&lt;/strong&gt; &lt;a href="https://github.com/sponsors/dsk-dev-ai" rel="noopener noreferrer"&gt;github.com/sponsors/dsk-dev-ai&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>mcp</category>
      <category>typescript</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
