<?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: Jameson</title>
    <description>The latest articles on DEV Community by Jameson (@jameson-bear).</description>
    <link>https://dev.to/jameson-bear</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4116165%2Fb204833c-ea2a-4c4f-b4aa-6627e99130d6.gif</url>
      <title>DEV Community: Jameson</title>
      <link>https://dev.to/jameson-bear</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jameson-bear"/>
    <language>en</language>
    <item>
      <title>VS Code ignored my MCP config for an hour and never said a word</title>
      <dc:creator>Jameson</dc:creator>
      <pubDate>Wed, 16 Sep 2026 12:14:15 +0000</pubDate>
      <link>https://dev.to/jameson-bear/vs-code-ignored-my-mcp-config-for-an-hour-and-never-said-a-word-31np</link>
      <guid>https://dev.to/jameson-bear/vs-code-ignored-my-mcp-config-for-an-hour-and-never-said-a-word-31np</guid>
      <description>&lt;p&gt;I spent an hour last week convinced my MCP server was down. It wasn't. VS Code had read my config file, found nothing it recognised, and said nothing at all.&lt;/p&gt;

&lt;p&gt;The whole bug is one word.&lt;/p&gt;

&lt;h2&gt;
  
  
  The two shapes
&lt;/h2&gt;

&lt;p&gt;Cursor, Windsurf and Claude Desktop put servers under a top-level &lt;code&gt;mcpServers&lt;/code&gt; 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;"context7"&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.context7.com/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;VS Code reads &lt;code&gt;servers&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;"servers"&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;"context7"&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.context7.com/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;That is the entire bug. Nearly every MCP snippet you'll find in a blog post, a README or a vendor quickstart is written for Cursor, because Cursor got there first and its format spread. Drop one into &lt;code&gt;.vscode/mcp.json&lt;/code&gt; and VS Code parses the file happily, because it is valid JSON, finds no &lt;code&gt;servers&lt;/code&gt; key, and concludes you have no MCP servers configured.&lt;/p&gt;

&lt;p&gt;Which looks exactly like never having edited the file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this one is worse than a normal typo
&lt;/h2&gt;

&lt;p&gt;A misspelled URL gives you a connection error. A bad command gives you &lt;code&gt;ENOENT&lt;/code&gt;. Both of those send you somewhere useful.&lt;/p&gt;

&lt;p&gt;This gives you nothing. No warning on startup, no entry in the MCP server list, no red squiggle in the editor. The failure and the success case are visually identical right up until you notice the server isn't in the list, and if you're new to MCP you don't yet know what the list is supposed to look like, so you assume the server is broken and start debugging the server.&lt;/p&gt;

&lt;p&gt;I checked the endpoint with curl. I re-ran the install. I read the server's changelog looking for a breaking change. The endpoint had been fine the entire time.&lt;/p&gt;

&lt;h2&gt;
  
  
  What &lt;code&gt;type&lt;/code&gt; is doing there
&lt;/h2&gt;

&lt;p&gt;A detail worth getting right, because I've seen it stated too strongly.&lt;/p&gt;

&lt;p&gt;VS Code's docs show HTTP servers written both ways. The MCP configuration reference includes &lt;code&gt;"type": "http"&lt;/code&gt; explicitly, while the 1.100 release notes introduce Streamable HTTP with just a &lt;code&gt;url&lt;/code&gt; and no &lt;code&gt;type&lt;/code&gt; at all. Recent builds infer the transport from the presence of a &lt;code&gt;url&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;So the key name is what silently breaks your config, and &lt;code&gt;type&lt;/code&gt; isn't. I still write &lt;code&gt;"type": "http"&lt;/code&gt; because it's explicit and it matches the current reference, but if you're hunting a silent failure, check the top-level key first and don't get distracted by this one.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to tell in ten seconds
&lt;/h2&gt;

&lt;p&gt;Open the MCP server list from the Command Palette.&lt;/p&gt;

&lt;p&gt;If your server is listed but failing, you have a real connectivity or auth problem, and the error string is worth reading properly. MCP error codes are their own genre of unhelpful, and I've written up what &lt;code&gt;-32000&lt;/code&gt; and &lt;code&gt;-32001&lt;/code&gt; actually mean at &lt;a href="https://mcpcontext7.com/troubleshooting" rel="noopener noreferrer"&gt;mcpcontext7.com/troubleshooting&lt;/a&gt;, because each of them covers two unrelated conditions.&lt;/p&gt;

&lt;p&gt;If your server is missing entirely, it's the key name. Every time, in my experience. VS Code isn't failing to connect; it doesn't know there's anything to connect to.&lt;/p&gt;

&lt;p&gt;For a working server, expanding it should show its tools. Tools appearing means the handshake completed, which is a stronger signal than the server merely being listed.&lt;/p&gt;

&lt;h2&gt;
  
  
  The general version of this
&lt;/h2&gt;

&lt;p&gt;MCP is young enough that the clients haven't converged, and the config formats diverged early. The top-level key is the most visible difference, though Claude Desktop goes further and can't take a remote URL from its config file at all, which surprises people who assume every client accepts the same JSON with a different wrapper.&lt;/p&gt;

&lt;p&gt;The practical rule I've settled on: never adapt a config from one client to another. Copy it from something written for the client you're actually using. Adapting looks easy and is where the silent failures live.&lt;/p&gt;

&lt;p&gt;I got tired of re-deriving these, so I wrote down the exact JSON for each client. &lt;a href="https://mcpcontext7.com/vscode" rel="noopener noreferrer"&gt;VS Code&lt;/a&gt;, &lt;a href="https://mcpcontext7.com/cursor" rel="noopener noreferrer"&gt;Cursor&lt;/a&gt;, Claude Desktop and Windsurf all have their own page, because no two of them agree.&lt;/p&gt;

&lt;p&gt;If you're staring at a config that looks right and a server that isn't there, check the key. It took me an hour and I'd rather it took you ten seconds.&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>mcp</category>
      <category>ai</category>
      <category>debugging</category>
    </item>
    <item>
      <title>Context7 fixed the thing I kept blaming myself for</title>
      <dc:creator>Jameson</dc:creator>
      <pubDate>Wed, 09 Sep 2026 09:19:15 +0000</pubDate>
      <link>https://dev.to/jameson-bear/context7-fixed-the-thing-i-kept-blaming-myself-for-3k41</link>
      <guid>https://dev.to/jameson-bear/context7-fixed-the-thing-i-kept-blaming-myself-for-3k41</guid>
      <description>&lt;p&gt;I'm a vibe coder. I describe what I want, I read the diff, and if it runs I keep going. That gets me a long way, and then it fell apart in a very specific and very confusing way.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setting
&lt;/h2&gt;

&lt;p&gt;I was building a small static site with Astro. I needed to load a folder of Markdown files and list them. Bread and butter stuff. I asked for it, and got back something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;Astro&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;glob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./posts/*.md&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Confident, idiomatic, and completely non-existent.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Astro.glob()&lt;/code&gt; was removed in Astro 6. I'm on Astro 7. There was no deprecation warning first, it was simply gone, and the error I got was the kind of unhelpful undefined-is-not-a-function noise that makes you assume you've misconfigured your own project.&lt;/p&gt;

&lt;p&gt;So I did what a vibe coder does: I assumed it was me. I checked my folder structure. I moved files around. I asked the assistant to fix its own error, and it produced a content-collections config in the old shape (&lt;code&gt;src/content/config.ts&lt;/code&gt;, no loader) which was &lt;em&gt;also&lt;/em&gt; removed in Astro 6. Two wrong answers in a row, both of which used to be exactly right.&lt;/p&gt;

&lt;p&gt;I lost most of an evening to this before the penny dropped. The assistant wasn't hallucinating. It was answering correctly for Astro 4, and nobody had told it Astro 4 was over.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why prompting harder doesn't help
&lt;/h2&gt;

&lt;p&gt;This took me too long to understand. A model's library knowledge is frozen at its training cutoff, and it has no way to know which version of Astro is in my &lt;code&gt;package.json&lt;/code&gt;. So it averages everything it ever saw, and for a library that's shipped three majors since, the average is wrong.&lt;/p&gt;

&lt;p&gt;You can't prompt your way out of missing information. Telling it to "use the latest Astro API" just makes it confidently guess what latest means.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Context7 actually does
&lt;/h2&gt;

&lt;p&gt;Context7 is an MCP server whose entire job is to fetch current library documentation and put it into the model's context &lt;em&gt;before&lt;/em&gt; it answers. The model is unchanged and the output isn't post-processed. It's a retrieval step in front of the thing that was already guessing. It exposes two tools: one that maps a name like "Astro" to a library it has indexed, and one that fetches the current docs for it, optionally scoped to a topic so you're not dumping an entire manual into your context window.&lt;/p&gt;

&lt;p&gt;The install I'd recommend is &lt;a href="https://mcpcontext7.com/install" rel="noopener noreferrer"&gt;the remote HTTP one&lt;/a&gt;, because there is genuinely nothing to install:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add &lt;span class="nt"&gt;--scope&lt;/span&gt; user &lt;span class="nt"&gt;--transport&lt;/span&gt; http context7 https://mcp.context7.com/mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There's no &lt;code&gt;npx&lt;/code&gt;, no Node process idling in the background, and no package to keep current. Most guides lead with a local installer; skip it unless you specifically want a local process. Restart, then run &lt;code&gt;claude mcp list&lt;/code&gt; and check &lt;code&gt;context7&lt;/code&gt; is in it. Other editors take the same URL as JSON, and annoyingly no two of them agree on the shape: &lt;a href="https://mcpcontext7.com/cursor" rel="noopener noreferrer"&gt;Cursor&lt;/a&gt; and &lt;a href="https://mcpcontext7.com/vscode" rel="noopener noreferrer"&gt;VS Code&lt;/a&gt; want different top-level keys. I wrote each one down so I'd stop re-deriving them.&lt;/p&gt;

&lt;p&gt;Then I asked the same question again, with &lt;code&gt;use context7&lt;/code&gt; on the end. This time it came back with the actual current API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;defineCollection&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;astro:content&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;glob&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;astro/loaders&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;defineCollection&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;loader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;glob&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;base&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./src/content/posts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;**/*.md&lt;/span&gt;&lt;span class="dl"&gt;'&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;Which is right, and which I would not have got to on my own without reading the migration guide I was specifically trying to avoid reading.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed, concretely
&lt;/h2&gt;

&lt;p&gt;The failure mode I described at the top has stopped happening. The specific thing where I burn an evening on an API that was removed two majors ago is gone, because the docs are in the prompt now.&lt;/p&gt;

&lt;p&gt;Two honest caveats. It doesn't make the model better at programming: my logic bugs are still entirely mine. And it only knows public library documentation, so it has nothing to say about my own modules.&lt;/p&gt;

&lt;p&gt;The case for it is narrow and extremely common: a library moving faster than the model's cutoff, and a version you can name. If you've ever argued with an assistant about whether a method exists, and then found out you were both describing real APIs from different years, this is what fixes it.&lt;/p&gt;

&lt;p&gt;If you get stuck wiring it up, the error strings are their own adventure and I wrote them down at &lt;a href="https://mcpcontext7.com/troubleshooting" rel="noopener noreferrer"&gt;mcpcontext7.com/troubleshooting&lt;/a&gt;. &lt;code&gt;MCP error -32000&lt;/code&gt; means two completely different things depending on the message next to it, which I discovered the slow way.&lt;/p&gt;

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