<?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: Ladislav Sopko</title>
    <description>The latest articles on DEV Community by Ladislav Sopko (@ladislav_sopko_0ics).</description>
    <link>https://dev.to/ladislav_sopko_0ics</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3755428%2F4b424856-4493-4cc5-a751-bbfb2306e070.jpg</url>
      <title>DEV Community: Ladislav Sopko</title>
      <link>https://dev.to/ladislav_sopko_0ics</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ladislav_sopko_0ics"/>
    <language>en</language>
    <item>
      <title>I've been coding for 30+ years. All I ever wanted was to stop typing.</title>
      <dc:creator>Ladislav Sopko</dc:creator>
      <pubDate>Fri, 15 May 2026 10:15:15 +0000</pubDate>
      <link>https://dev.to/ladislav_sopko_0ics/ive-been-coding-for-30-years-all-i-ever-wanted-was-to-stop-typing-1f7o</link>
      <guid>https://dev.to/ladislav_sopko_0ics/ive-been-coding-for-30-years-all-i-ever-wanted-was-to-stop-typing-1f7o</guid>
      <description>&lt;p&gt;I started coding in the early 90s. Assembly first, then C, then the C++ years where you'd fight the compiler more than you'd write features.&lt;/p&gt;

&lt;p&gt;By 2007 I was deep into enterprise systems — building a document engine with a colleague. My part was the fun stuff: a plugin system, a parallel B+Tree block file system, Lua scripting integration. I even wrote a custom virtual memory manager to fix LuaJIT's 1GB RAM limit on 64-bit — patching memory pages at the OS level, Windows and Linux, portable. The kind of thing where you're staring at hex dumps at 2am wondering if you've gone too far.&lt;/p&gt;

&lt;p&gt;My colleague handled the C core. We shipped it. Enterprise clients used it for years.&lt;/p&gt;

&lt;p&gt;But here's the thing nobody tells you about decades of systems programming: &lt;strong&gt;your hands pay the price&lt;/strong&gt;. Thousands of hours of typing. Millions of keystrokes. I started dreaming about a world where I could just &lt;em&gt;say&lt;/em&gt; what I wanted and watch the code appear.&lt;/p&gt;

&lt;h2&gt;
  
  
  The voice coding rabbit hole (spoiler: it sucked for 20 years)
&lt;/h2&gt;

&lt;p&gt;I tried everything. Dragon NaturallySpeaking with custom macros. Voice Attack. Talon. Various VSCode extensions that promised voice-to-code and delivered voice-to-frustration.&lt;/p&gt;

&lt;p&gt;The problem was always the same: programming isn't dictation. You can't just say "open curly brace semicolon" and expect to be productive. The overhead of translating your intent into dictation commands was &lt;em&gt;worse&lt;/em&gt; than just typing. Every time I tried, I'd give up within a week and go back to the keyboard.&lt;/p&gt;

&lt;p&gt;But the dream never died. I kept trying, year after year. My colleagues thought I was obsessed. They were right.&lt;/p&gt;

&lt;h2&gt;
  
  
  Then the wave hit
&lt;/h2&gt;

&lt;p&gt;When Cline came out, something clicked. Not because it was voice — it wasn't. But because for the first time, the AI wasn't just autocompleting tokens. It was understanding &lt;em&gt;intent&lt;/em&gt;. You could describe what you wanted at a high level and watch it navigate files, read code, make changes.&lt;/p&gt;

&lt;p&gt;I jumped from Cline to Cursor to Claude Code in maybe 6 months. Each one better than the last. Claude Code was the inflection point — a real terminal-based agent that understood my codebase, my project structure, my intent.&lt;/p&gt;

&lt;p&gt;But I still had to &lt;em&gt;type&lt;/em&gt; everything. The irony.&lt;/p&gt;

&lt;h2&gt;
  
  
  Voice ...
&lt;/h2&gt;

&lt;p&gt;I think human progress actually happens because we're naturally lazy. We need to simplify our lives — and I'm no different. I'm an eternal optimiser. So I built VoiceCC.&lt;/p&gt;

&lt;p&gt;VoiceCC is what happens when a guy who's been dreaming about voice coding for 20 years finally has the right foundation to build on.&lt;/p&gt;

&lt;p&gt;I have a small USB keypad on my desk. Each button is mapped to a different terminal session. I press a button, speak naturally — Italian, English, Slovak, doesn't matter — and Whisper transcribes it locally. No cloud, all offline, about 600ms. The hub figures out which terminal to target and injects the right keystrokes into that specific session.&lt;/p&gt;

&lt;p&gt;What this means in practice: I run 3-4 Claude Code instances in parallel, each working on a different task. Press button 1: "yes approve that". Press button 3: "try the alternative approach with dependency injection". Press button 2: "show me the test results". Each going to a different Claude Code working on a different part of the project.&lt;/p&gt;

&lt;p&gt;I built it in about 40 days. Co-authored most commits with Claude Code itself. Which felt... appropriate.&lt;/p&gt;

&lt;p&gt;For the first time in 30 years, I could sit at my desk with a little keypad and &lt;em&gt;direct multiple AI agents with my voice&lt;/em&gt;. Not "open curly brace" — actual intent.&lt;/p&gt;

&lt;p&gt;The dream, somehow, actually worked.&lt;/p&gt;

&lt;h2&gt;
  
  
  The plot twist
&lt;/h2&gt;

&lt;p&gt;Here's where it gets funny.&lt;/p&gt;

&lt;p&gt;I spent 30 years wanting to stop typing. I built the tools to make it happen. And now I sit here, talking to my terminal, watching AI write code that sometimes scares me with how good it is.&lt;/p&gt;

&lt;p&gt;I went from "I wish I could dictate code" to "I wish the AI would slow down and let me think."&lt;/p&gt;

&lt;p&gt;Once you have an AI that writes code, you realize the bottleneck shifts. The AI is fast, but it's also blind — it doesn't know your libraries, it hallucinates APIs, it greps through thousands of files burning tokens. So I kept building. A server to give it access to Visual Studio's compiler intelligence. A language server for AI agents, covering 9 languages. A service that indexes 890+ open-source libraries so it stops making things up. Each one solving a problem the previous tool exposed.&lt;/p&gt;

&lt;p&gt;But those are details for another article. What I want to say here is something else.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I actually learned
&lt;/h2&gt;

&lt;p&gt;I wanted voice coding in 2005. I got it in 2026. The version I got is wildly better than what I imagined — and also stranger.&lt;/p&gt;

&lt;p&gt;Building B+Trees, memory managers, and plugin systems by hand for a decade is exactly why I could build the rest. I knew what "real code intelligence" meant because I'd lived without it. Systems programming didn't become obsolete when the AI showed up. It became the thing that let me know what to ask for.&lt;/p&gt;

&lt;p&gt;The keyboard isn't dead, but it's optional now. I still type when I'm in deep flow. But for the 80% of coding that's orchestration, navigation, and review. Voice plus AI is just... better.&lt;/p&gt;

&lt;p&gt;At 20 I imagined dictating code like a typist imagines dictating a novel. At 50 I find myself orchestrating agents that are sometimes better than me. It's not what I wanted. It's better, and it makes me a little uncomfortable. Twenty years of waiting to discover that the dream was wrong — and the right dream was something I couldn't even have formulated back then.&lt;/p&gt;

&lt;p&gt;I'm starting to think I might end up leading the resistance against Skynet. Only half joking.&lt;/p&gt;




&lt;h2&gt;
  
  
  Stuff I built along the way
&lt;/h2&gt;

&lt;p&gt;If you want to try any of the tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;VoiceCC&lt;/strong&gt; — &lt;a href="https://github.com/LadislavSopko/VoiceCC" rel="noopener noreferrer"&gt;github.com/LadislavSopko/VoiceCC&lt;/a&gt; — the multi-channel voice command center described above. Currently a proof of concept. &lt;strong&gt;If you'd like to build a community around it, reach out — I'd be happy to open the sources fully, I just don't have the bandwidth to maintain it alone.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;vs-mcp&lt;/strong&gt; — &lt;a href="https://marketplace.visualstudio.com/items?itemName=LadislavSopko.mcpserverforvs" rel="noopener noreferrer"&gt;VS Marketplace&lt;/a&gt; — Visual Studio's Roslyn intelligence exposed via MCP. The first piece of software I ever built without writing a single line of code by hand.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LSAI&lt;/strong&gt; — &lt;a href="https://github.com/0ics-srls/lsai-xmp4.public" rel="noopener noreferrer"&gt;github.com/0ics-srls/lsai-xmp4.public&lt;/a&gt; — LSP-style intelligence for AI agents, 9 languages, 14 tools.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;xmp4&lt;/strong&gt; — add &lt;code&gt;https://mcp.example4.ai/mcp&lt;/code&gt; to your MCP config — 890+ pre-indexed libraries, 17 tools, free.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;30 years of typing. Now I just talk. What a time.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Disclosure: I built all of these. The code is real, the benchmarks are published. AMA in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>voicecoding</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I gave my AI agent the compiler's eyes — here's what changed</title>
      <dc:creator>Ladislav Sopko</dc:creator>
      <pubDate>Wed, 13 May 2026 14:42:23 +0000</pubDate>
      <link>https://dev.to/ladislav_sopko_0ics/i-gave-my-ai-agent-the-compilers-eyes-heres-what-changed-2f6f</link>
      <guid>https://dev.to/ladislav_sopko_0ics/i-gave-my-ai-agent-the-compilers-eyes-heres-what-changed-2f6f</guid>
      <description>&lt;p&gt;— grepping across my monorepo, reading 50 files, half of them irrelevant, then guessing.&lt;/p&gt;

&lt;p&gt;So I built two MCP servers. They changed everything.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem every AI coding agent has
&lt;/h2&gt;

&lt;p&gt;Whether you use Claude Code, Cursor, Copilot, or anything else — when your AI needs to understand code, it defaults to &lt;strong&gt;text search&lt;/strong&gt;. Grep, ripgrep, file reads, regex.&lt;/p&gt;

&lt;p&gt;On a real codebase (mine is 1,500+ C#/.NET projects), that means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Who calls &lt;code&gt;PublishAsync&lt;/code&gt;?" → grep → 200 string matches → read 50 files → half are tests/docs/comments → guess which are real callers&lt;/li&gt;
&lt;li&gt;"What breaks if I change this?" → no idea, read everything that mentions it&lt;/li&gt;
&lt;li&gt;"How does &lt;code&gt;GetRequiredService&lt;/code&gt; work in the DI container?" → clone dotnet/runtime, search, give up&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cost: 40,000-60,000 tokens per question. Often wrong.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix: give the AI the compiler's eyes
&lt;/h2&gt;

&lt;p&gt;I built two MCP servers that solve opposite sides of the same problem:&lt;/p&gt;

&lt;h3&gt;
  
  
  LSAI — your code, live
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/0ics-srls/Zerox.Lsai.Public" rel="noopener noreferrer"&gt;LSAI&lt;/a&gt; runs on your machine and wraps &lt;strong&gt;real LSP servers&lt;/strong&gt; — the same language servers your IDE uses:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Language&lt;/th&gt;
&lt;th&gt;LSP Server&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;C#&lt;/td&gt;
&lt;td&gt;Roslyn (in-process)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;ty&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Java&lt;/td&gt;
&lt;td&gt;jdtls&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TypeScript/JS&lt;/td&gt;
&lt;td&gt;typescript-language-server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rust&lt;/td&gt;
&lt;td&gt;rust-analyzer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td&gt;gopls&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHP&lt;/td&gt;
&lt;td&gt;intelephense&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C/C++&lt;/td&gt;
&lt;td&gt;clangd&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;14 MCP tools.&lt;/strong&gt; The highlights:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;lsai_callers("PublishAsync")
→ 15 callers, exact file:line, compiler-resolved

lsai_impact("PublishAsync")  
→ MEDIUM risk, 15 references, 27 tests affected
  Tests: PublishServiceTests, V32SpecComplianceTests...

lsai_hierarchy("BaseService")
→ full inheritance chain, interfaces, implementations
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install once, add one line to &lt;code&gt;.mcp.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&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;"lsai"&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;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"~/.lsai/run"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&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;"--stdio"&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;Your code never leaves your machine. LSAI is 100% local.&lt;/p&gt;

&lt;h3&gt;
  
  
  xmp4 — every library, pre-indexed
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://example4.ai" rel="noopener noreferrer"&gt;xmp4&lt;/a&gt; is the other lens. It has &lt;strong&gt;900+ OSS libraries&lt;/strong&gt; already indexed across 12 languages — 15,000+ navigable projects. When your AI needs to understand how a third-party API actually works, it reads the real source, not docs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;xmp4_source("GetRequiredService", project="dotnet/runtime")
→ public interface ISupportRequiredService {
    object GetRequiredService(Type serviceType);
  }

xmp4_callers("MongoClient.connect")
→ 26 real call sites across 4 repos, typed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One line in your MCP config, no install, no API key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&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;"xmp4"&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://mcp.example4.ai/mcp"&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;&lt;strong&gt;17 MCP tools.&lt;/strong&gt; Covers C#, Java, TypeScript, Python, Rust, PHP, Go, JavaScript, Dart, Ruby, C++, Scala.&lt;/p&gt;

&lt;h2&gt;
  
  
  The tandem — where it gets powerful
&lt;/h2&gt;

&lt;p&gt;Here's what happened yesterday in a real session. I needed to understand a dependency chain:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1 — LSAI on my code:&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;lsai_callees("PublishAsync")
→ CreateScope()             — PublishService.cs:22
→ GetRequiredService&amp;lt;Ctx&amp;gt;   — PublishService.cs:23
→ Where&amp;lt;PublishedProject&amp;gt;   — PublishService.cs:74
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;My AI now knows my code calls &lt;code&gt;GetRequiredService&lt;/code&gt;. But how does that work?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2 — xmp4 on the library:&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;xmp4_source("GetRequiredService", project="dotnet/runtime")
→ ISupportRequiredService interface
→ Throws InvalidOperationException if not registered
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now it knows the contract AND the failure mode.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3 — LSAI for risk assessment:&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;lsai_impact("PublishAsync")
→ MEDIUM risk — 15 refs, 27 tests
→ All test names listed, all lines numbered
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three calls. The AI traced from my code → into a library's internals → back to risk assessment. &lt;strong&gt;~1,500 tokens total.&lt;/strong&gt; No grep. No guessing. No cloning.&lt;/p&gt;

&lt;h2&gt;
  
  
  The numbers
&lt;/h2&gt;

&lt;p&gt;I measured this on real tasks across 4 tier-1 libraries (spring-boot, tokio, django, efcore):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Tokens&lt;/th&gt;
&lt;th&gt;Accuracy&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;xmp4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1,558&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Exact (compiler-resolved)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;grep + clone&lt;/td&gt;
&lt;td&gt;47,200&lt;/td&gt;
&lt;td&gt;Approximate (string match)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitMCP&lt;/td&gt;
&lt;td&gt;65,629&lt;/td&gt;
&lt;td&gt;Approximate (text search)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context7&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;td&gt;Can't answer (docs only)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;42x fewer tokens than GitMCP. 30x fewer than grep.&lt;/strong&gt; &lt;a href="https://github.com/0ics-srls/lsai-xmp4.public/blob/main/docs/benchmarks/WHITEPAPER.md" rel="noopener noreferrer"&gt;Full benchmark whitepaper&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get started
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;LSAI (your code):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://github.com/0ics-srls/Zerox.Lsai.Public/releases/latest/download/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;xmp4 (libraries):&lt;/strong&gt; add the JSON config above. That's it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Visual Studio users:&lt;/strong&gt; there's also &lt;a href="https://marketplace.visualstudio.com/items?itemName=LadislavSopko.mcpserverforvs" rel="noopener noreferrer"&gt;vs-mcp&lt;/a&gt; — same concept but as a VS extension with 41 Roslyn-powered tools.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Landing page:&lt;/strong&gt; &lt;a href="https://example4.ai" rel="noopener noreferrer"&gt;example4.ai&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Both free. Both actively developed — I ship improvements every week. Both speak standard MCP, so they work with Claude Code, Cursor, VS Code, Claude Desktop, and any other MCP client.&lt;/p&gt;




&lt;p&gt;I'm building this because I needed it myself. If you're spending tokens on code exploration instead of code generation, these two might help. Happy to answer questions.&lt;/p&gt;

</description>
      <category>aimcpprogrammingclaudecode</category>
    </item>
    <item>
      <title>I plugged my Claude Code into 881 indexed libraries. Here's what changed.</title>
      <dc:creator>Ladislav Sopko</dc:creator>
      <pubDate>Wed, 29 Apr 2026 20:47:45 +0000</pubDate>
      <link>https://dev.to/ladislav_sopko_0ics/i-plugged-my-claude-code-into-881-indexed-libraries-heres-what-changed-554e</link>
      <guid>https://dev.to/ladislav_sopko_0ics/i-plugged-my-claude-code-into-881-indexed-libraries-heres-what-changed-554e</guid>
      <description>&lt;p&gt;There's a class of bug that the current generation of AI coding assistants reliably produces, and it's worth naming because the fix is real and available now.&lt;/p&gt;

&lt;p&gt;The bug: your assistant calls a library method that &lt;strong&gt;doesn't exist&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Not a typo. Not a logic error. A confident, well-formatted, syntactically perfect call to a method that has been deprecated, renamed, or never existed in the version you're using. The compiler tells you. You go back, ask the assistant to fix it, and 40% of the time it suggests a different method that also doesn't exist. By the time you've corrected it manually, you've burned 15 minutes and 30,000 tokens.&lt;/p&gt;

&lt;p&gt;This isn't because the model is bad. It's because the model's training data is a &lt;strong&gt;snapshot&lt;/strong&gt;, and library code is a &lt;strong&gt;stream&lt;/strong&gt;. The data set knew StackExchange.Redis 2.5; you're on 2.8. The data set knew Tokio when its runtime API had a different shape. The model is doing exactly what it was trained to do — reproduce patterns it saw — and the patterns have moved.&lt;/p&gt;

&lt;p&gt;The grep workaround makes it worse. When the assistant fetches your repo and runs textual searches over node_modules or vendor directories, it's still pattern-matching on substrings. It finds "Connect" in 200 places and has no way to tell which is the actual method definition vs. a comment vs. a similarly-named function in an unrelated package.&lt;/p&gt;

&lt;p&gt;What's missing is the same thing your IDE has: a &lt;strong&gt;semantic index&lt;/strong&gt;. A structured map that knows &lt;code&gt;ConnectionMultiplexer.Connect&lt;/code&gt; is one specific method, returns these types, is called from these 47 places, was added in version X. SCIP — the format Sourcegraph open-sourced — is exactly that. It's how your "Find references" key works.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I did
&lt;/h2&gt;

&lt;p&gt;I connected my Claude Code (and a parallel Cursor session for cross-checking) to a public MCP server that hosts SCIP indexes for 881 popular open-source libraries: &lt;a href="https://mcp.example4.ai/?utm_source=devto&amp;amp;utm_medium=organic&amp;amp;utm_campaign=launch-d0" rel="noopener noreferrer"&gt;mcp.example4.ai&lt;/a&gt;. Free, zero install, one URL in the MCP config.&lt;/p&gt;

&lt;p&gt;Then I re-ran the kinds of questions that usually go sideways:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;em&gt;"Use StackExchange.Redis to connect to a sentinel cluster."&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;"Show me how &lt;code&gt;tokio::select!&lt;/code&gt; actually expands at runtime."&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;"Find every place in Spring Boot where &lt;code&gt;WebSecurityConfigurerAdapter&lt;/code&gt; is used so I know what to migrate to."&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;"What does &lt;code&gt;useFormStatus&lt;/code&gt; actually do under the hood in React 19?"&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In every case, the assistant didn't hit the model first. It made tool calls — &lt;code&gt;xmp4_search&lt;/code&gt;, &lt;code&gt;xmp4_source&lt;/code&gt;, &lt;code&gt;xmp4_usages&lt;/code&gt;, &lt;code&gt;xmp4_callers&lt;/code&gt;, &lt;code&gt;xmp4_hierarchy&lt;/code&gt; — and pulled back &lt;strong&gt;real, current, indexed source&lt;/strong&gt;. Then it answered.&lt;/p&gt;

&lt;h2&gt;
  
  
  The token economics
&lt;/h2&gt;

&lt;p&gt;The team behind it published a reproducible benchmark on their protocol repo. Same questions answered with grep-based retrieval vs. SCIP-based retrieval — &lt;strong&gt;between 70 and 93 percent fewer tokens&lt;/strong&gt; for equivalent answers, depending on the kind of query (outline lookups land near the top, deep impact-analysis queries near the floor). I rerun a slimmed version on my side: same direction, same magnitude. The savings come from the index returning &lt;strong&gt;just the relevant symbols&lt;/strong&gt; instead of the assistant having to triangulate through dumps of file content.&lt;/p&gt;

&lt;p&gt;The downstream effect is the part nobody talks about: when you save tokens on retrieval, the conversation stays coherent for longer. Long sessions on hard refactors stop drifting because the context window isn't half-full of grep results.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it works and where it doesn't
&lt;/h2&gt;

&lt;p&gt;It works on the libraries that are &lt;strong&gt;indexed&lt;/strong&gt;. 881 today, including most of the ones I touch in real work — React, Vue, Svelte, Django, FastAPI, Flask, Spring Boot, Tokio, Axum, StackExchange.Redis, gRPC, Tailwind, Vercel AI SDK. 11 languages.&lt;/p&gt;

&lt;p&gt;It does not work on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your private repo (you'd need to run a private indexer).&lt;/li&gt;
&lt;li&gt;Libraries not yet in the index (request publicly, they triage weekly).&lt;/li&gt;
&lt;li&gt;Niche language ecosystems they don't yet cover.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to try it
&lt;/h2&gt;

&lt;p&gt;In your MCP client config (Claude Code, Cursor, Claude Desktop, Continue, Cline — all support MCP), add:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&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;"example4"&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;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://mcp.example4.ai/mcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"transport"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http"&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;Restart your client. Ask it a library question. Watch the tool calls.&lt;/p&gt;

&lt;h2&gt;
  
  
  My take
&lt;/h2&gt;

&lt;p&gt;This is not a "10x your productivity" claim. It is a "stop your AI from making this specific class of mistake" claim. That alone is worth the two-minute config change for me. The token savings is a bonus.&lt;/p&gt;

&lt;p&gt;Spec + numbers (open source): &lt;a href="https://github.com/LadislavSopko/lsai-protocol" rel="noopener noreferrer"&gt;github.com/LadislavSopko/lsai-protocol&lt;/a&gt;&lt;br&gt;
Public endpoint: &lt;a href="https://mcp.example4.ai/?utm_source=devto&amp;amp;utm_medium=organic&amp;amp;utm_campaign=launch-d0" rel="noopener noreferrer"&gt;mcp.example4.ai&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>claudecode</category>
      <category>programming</category>
    </item>
    <item>
      <title>How to give Your AI Coder Visual Studio's IntelliSense?</title>
      <dc:creator>Ladislav Sopko</dc:creator>
      <pubDate>Thu, 05 Feb 2026 19:28:17 +0000</pubDate>
      <link>https://dev.to/ladislav_sopko_0ics/what-if-your-ai-had-visual-studios-intellisense-40e7</link>
      <guid>https://dev.to/ladislav_sopko_0ics/what-if-your-ai-had-visual-studios-intellisense-40e7</guid>
      <description>&lt;h2&gt;
  
  
  The Problem Nobody Talks About
&lt;/h2&gt;

&lt;p&gt;Every AI coding tool operates at the filesystem level. They read files. They run grep. They parse text.&lt;/p&gt;

&lt;p&gt;When you ask "find all usages of &lt;code&gt;ProcessDocument&lt;/code&gt;", they run something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-rn&lt;/span&gt; &lt;span class="s2"&gt;"ProcessDocument"&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--include&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"*.cs"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And you get back:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The actual method definition&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ProcessDocumentAsync&lt;/code&gt; (different method!)&lt;/li&gt;
&lt;li&gt;String literals in log messages&lt;/li&gt;
&lt;li&gt;Comments mentioning the method&lt;/li&gt;
&lt;li&gt;Variable names like &lt;code&gt;processDocumentResult&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;XML documentation references&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now imagine doing a &lt;strong&gt;rename&lt;/strong&gt; based on that. 💀&lt;/p&gt;

&lt;p&gt;Meanwhile, Visual Studio knows — through Roslyn, the C# compiler — exactly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Where &lt;code&gt;ProcessDocument&lt;/code&gt; is &lt;strong&gt;defined&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Every place it's &lt;strong&gt;called&lt;/strong&gt; (and nothing else)&lt;/li&gt;
&lt;li&gt;What &lt;strong&gt;interface&lt;/strong&gt; declares it&lt;/li&gt;
&lt;li&gt;What classes &lt;strong&gt;override&lt;/strong&gt; it&lt;/li&gt;
&lt;li&gt;What it's &lt;strong&gt;not&lt;/strong&gt; (ProcessDocumentAsync is a different symbol)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Solution: Expose Roslyn via MCP
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=LadislavSopko.mcpserverforvs" rel="noopener noreferrer"&gt;VS-MCP&lt;/a&gt; is a Visual Studio extension that exposes Roslyn's semantic analysis as MCP (Model Context Protocol) tools.&lt;/p&gt;

&lt;p&gt;Any MCP-compatible client — Claude Code, Claude Desktop, Codex CLI, Gemini CLI, OpenCode, Aider, Cline, Windsurf — can now use &lt;strong&gt;20 tools&lt;/strong&gt; powered by the actual C# compiler.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Tools
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔍 Navigation (find things semantically)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;FindSymbols&lt;/code&gt;&lt;/strong&gt; — Search symbols by name. Not text. Symbols.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You: "Find WhisperFactory in my solution"

AI: Found WhisperFactory
    → Class | Whisper.net | WhisperFactory.cs | Line 16
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One result. Exact. Knows it's a class, knows the namespace.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;FindSymbolDefinition&lt;/code&gt;&lt;/strong&gt; — The semantic equivalent of F12.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You: "Go to the definition of IDocumentService"

AI: → Interface | DocFlow.Core | IDocumentService.cs | Line 8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;code&gt;FindSymbolUsages&lt;/code&gt;&lt;/strong&gt; — Every reference, compiler-verified.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You: "Find all usages of ProcessDocument"

AI: Found 4 usages:
    → IDocumentService.cs:12 (declaration)
    → DocumentService.cs:45 (implementation)
    → DocumentController.cs:23 (call)
    → BackgroundWorker.cs:67 (call)

    Note: ProcessDocumentAsync NOT included — different symbol
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;code&gt;GetSymbolAtLocation&lt;/code&gt;&lt;/strong&gt; — What's at line X, column Y?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You: "What's the symbol at line 15 in Program.cs?"

AI: → Method: ConfigureServices | Class: Program | Returns: void
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🌳 Understanding (comprehend architecture)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;GetInheritance&lt;/code&gt;&lt;/strong&gt; — Full type hierarchy.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You: "What inherits from BaseDocument?"

AI: BaseDocument hierarchy:
    → Base: EntityBase
    → Interfaces: IDocument, ITrackable, IAuditable
    → Derived: Invoice, PurchaseOrder, CreditNote, DeliveryNote
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Try getting this from grep. I'll wait.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;GetMethodCallers&lt;/code&gt;&lt;/strong&gt; — Who calls this method?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You: "What calls ValidateToken?"

AI: ValidateToken is called by:
    → ApiKeyMiddleware.Invoke()
    → LoginController.Authenticate()
    → RefreshTokenHandler.Handle()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;code&gt;GetMethodCalls&lt;/code&gt;&lt;/strong&gt; — What does this method call?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You: "What does ValidateToken call internally?"

AI: ValidateToken calls:
    → TokenRepository.FindByHash()
    → ClaimsParser.Extract()
    → AuditLogger.LogAccess()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Combine callers + callees and you have a &lt;strong&gt;call graph&lt;/strong&gt;. From the compiler. Not from guessing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;GetDocumentOutline&lt;/code&gt;&lt;/strong&gt; — Semantic structure of any file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You: "Show me the structure of DocumentService.cs"

AI: DocumentService.cs outline:
    → Namespace: DocFlow.Services
      → Class: DocumentService : IDocumentService
        → Method: ProcessDocument(Document doc) → Result
        → Method: ValidateDocument(Document doc) → bool
        → Property: Logger (ILogger)
        → Field: _repository (IDocumentRepository)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ✏️ Refactoring (change things safely)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;RenameSymbol&lt;/code&gt;&lt;/strong&gt; — The killer tool. Roslyn-powered rename across the entire solution.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You: "Rename ProcessDocument to HandleDocument"

AI: ✓ Renamed in 8 files, 23 locations
    → Interface updated
    → Implementations updated
    → Call sites updated
    → ProcessDocumentAsync: untouched (different symbol)
    → String literals: untouched
    → Build verification: 0 errors
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;code&gt;FormatDocument&lt;/code&gt;&lt;/strong&gt; — Visual Studio's own formatter, not &lt;code&gt;dotnet format&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  🏗️ Infrastructure
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;ExecuteCommand&lt;/code&gt;&lt;/strong&gt; — Build/clean with structured diagnostics.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You: "Build MyProject"

AI: Build succeeded | 0 errors | 2 warnings
    → Warning CS0168: Variable 'ex' declared but never used (File.cs:42)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;code&gt;ExecuteAsyncTest&lt;/code&gt;&lt;/strong&gt; — Run tests with real-time status.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You: "Run the integration tests"

AI: Running tests... 12/45 passed
    ...
    Complete: 44 passed, 1 failed
    → Failed: TestPaymentProcessing — Assert.Equal failed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;code&gt;GetSolutionTree&lt;/code&gt;&lt;/strong&gt; — Full solution structure.&lt;br&gt;
&lt;strong&gt;&lt;code&gt;GetProjectReferences&lt;/code&gt;&lt;/strong&gt; — Dependency graph between projects.&lt;br&gt;
&lt;strong&gt;&lt;code&gt;TranslatePath&lt;/code&gt;&lt;/strong&gt; — WSL ↔ Windows path conversion (crucial for Claude Code users).&lt;br&gt;
&lt;strong&gt;&lt;code&gt;GetSelection&lt;/code&gt; / &lt;code&gt;CheckSelection&lt;/code&gt;&lt;/strong&gt; — Read active editor selection.&lt;br&gt;
&lt;strong&gt;&lt;code&gt;GetActiveFile&lt;/code&gt;&lt;/strong&gt; — Current file and cursor position.&lt;br&gt;
&lt;strong&gt;&lt;code&gt;GetLoggingStatus&lt;/code&gt; / &lt;code&gt;SetLogLevel&lt;/code&gt;&lt;/strong&gt; — Diagnostics.&lt;/p&gt;
&lt;h2&gt;
  
  
  Multi-Solution: See Inside Your Dependencies
&lt;/h2&gt;

&lt;p&gt;Enterprise devs don't just work on their own code. You depend on libraries — and sometimes you need the AI to understand those libraries too.&lt;/p&gt;

&lt;p&gt;VS-MCP supports &lt;strong&gt;multiple Visual Studio instances simultaneously&lt;/strong&gt; — each on its own configurable port.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Your project                         → VS-MCP on port 3010
Whisper.net source (cloned from GH)  → VS-MCP on port 3011
EF Core source (cloned from GH)      → VS-MCP on port 3012
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your AI connects to all three. Now it can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Find how library authors &lt;strong&gt;intended&lt;/strong&gt; their API to be used&lt;/li&gt;
&lt;li&gt;Discover &lt;strong&gt;implementation patterns&lt;/strong&gt; inside library source code&lt;/li&gt;
&lt;li&gt;Trace calls &lt;strong&gt;across your code and library code&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Understand inheritance that &lt;strong&gt;spans project boundaries&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In your MCP client configuration, you simply set up named connections. Three options depending on your client:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option 1: Clients with native HTTP support (Claude Desktop, Claude Code)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&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;"vs-mcp"&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:3010/sdk/"&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;"vs-mcp-whisper"&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:3011/sdk/"&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;&lt;strong&gt;Option 2: Clients without HTTP support (via mcp-remote proxy)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&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;"vs-mcp"&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;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&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;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mcp-remote"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:3010/sdk/"&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;"vs-mcp-whisper"&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;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&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;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mcp-remote"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:3011/sdk/"&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;&lt;strong&gt;Option 3: Codex CLI (TOML)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[mcp_servers.vs-mcp]&lt;/span&gt;
&lt;span class="py"&gt;type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"stdio"&lt;/span&gt;
&lt;span class="py"&gt;command&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"npx"&lt;/span&gt;
&lt;span class="py"&gt;args&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"mcp-remote"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"http://localhost:3010/sdk/"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="nn"&gt;[mcp_servers.vs-mcp-whisper]&lt;/span&gt;
&lt;span class="py"&gt;type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"stdio"&lt;/span&gt;
&lt;span class="py"&gt;command&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"npx"&lt;/span&gt;
&lt;span class="py"&gt;args&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"mcp-remote"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"http://localhost:3011/sdk/"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each name tells the AI what it's connecting to. &lt;code&gt;vs-mcp&lt;/code&gt; is your project, &lt;code&gt;vs-mcp-whisper&lt;/code&gt; is the library source. The AI knows where to look.&lt;/p&gt;

&lt;p&gt;No more guessing how a library works. Open the source, connect VS-MCP, and your AI reads it with compiler-level understanding.&lt;/p&gt;

&lt;p&gt;Plus: toggle individual tools on/off and switch WSL/Windows path formats from a settings panel inside VS.&lt;/p&gt;

&lt;h2&gt;
  
  
  When You Need This
&lt;/h2&gt;

&lt;p&gt;You don't need this for a weekend project with 3 files.&lt;/p&gt;

&lt;p&gt;You need this when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your solution has 20+ projects&lt;/li&gt;
&lt;li&gt;You have complex inheritance hierarchies&lt;/li&gt;
&lt;li&gt;Dependency injection makes grep useless for finding implementations&lt;/li&gt;
&lt;li&gt;You need safe refactoring across hundreds of files&lt;/li&gt;
&lt;li&gt;Your AI assistant keeps saying "I found 47 matches for that method name"&lt;/li&gt;
&lt;li&gt;You want your AI to understand architecture, not just read text&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Install from &lt;a href="https://marketplace.visualstudio.com/items?itemName=LadislavSopko.mcpserverforvs" rel="noopener noreferrer"&gt;Visual Studio Marketplace&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Set your port in MCP Server Settings (default: 3010)&lt;/li&gt;
&lt;li&gt;Add to your MCP client config:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"vs-mcp"&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:3010/sdk/"&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;Or via mcp-remote for clients without native HTTP:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"vs-mcp"&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;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"args"&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;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mcp-remote"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:3010/sdk/"&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;ol&gt;
&lt;li&gt;Your AI now has compiler-level intelligence&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Works with Claude Code, Claude Desktop, Codex CLI, Gemini CLI, OpenCode, Aider, Cline, Windsurf, and any MCP-compatible client.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;VS-MCP: 20 tools. 12 Roslyn-powered. Free.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🌐 &lt;a href="https://www.0ics.com/static/vs-mcp.html" rel="noopener noreferrer"&gt;Website →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📥 &lt;a href="https://marketplace.visualstudio.com/items?itemName=LadislavSopko.mcpserverforvs" rel="noopener noreferrer"&gt;Install from Marketplace →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🎬 &lt;a href="https://youtu.be/fYV4oqY9n5g" rel="noopener noreferrer"&gt;Watch the demo →&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;&lt;a href="https://0ics.it" rel="noopener noreferrer"&gt;0ics srl&lt;/a&gt; — Italian software company specializing in AI-powered development tools.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>ai</category>
      <category>mcp</category>
      <category>visualstudio</category>
    </item>
  </channel>
</rss>
