<?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: Yves Jutard</title>
    <description>The latest articles on DEV Community by Yves Jutard (@yvem).</description>
    <link>https://dev.to/yvem</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%2F2924041%2F0ea12451-4c0c-4e5c-8b47-533b2ea09b24.jpg</url>
      <title>DEV Community: Yves Jutard</title>
      <link>https://dev.to/yvem</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yvem"/>
    <language>en</language>
    <item>
      <title>How to run a local MCP server in typeScript with node 23 without a build step</title>
      <dc:creator>Yves Jutard</dc:creator>
      <pubDate>Fri, 30 May 2025 02:42:10 +0000</pubDate>
      <link>https://dev.to/yvem/how-to-run-a-local-mcp-server-in-typescript-with-node-23-without-a-build-step-5gd5</link>
      <guid>https://dev.to/yvem/how-to-run-a-local-mcp-server-in-typescript-with-node-23-without-a-build-step-5gd5</guid>
      <description>&lt;p&gt;I experimented with &lt;strong&gt;writing and running a local MCP server in TypeScript&lt;/strong&gt; and I ran into difficulties having it properly called from Claude.&lt;/p&gt;

&lt;p&gt;In this article, I'll share the working config and the issues I encountered.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisite: MCP server code
&lt;/h2&gt;

&lt;p&gt;I copy/pasted the &lt;a href="https://github.com/modelcontextprotocol/quickstart-resources/blob/main/weather-server-typescript/src/index.ts" rel="noopener noreferrer"&gt;TypeScript example&lt;/a&gt; from &lt;a href="https://modelcontextprotocol.io/quickstart/server#node" rel="noopener noreferrer"&gt;Claude documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Goal: Direct Local execution
&lt;/h2&gt;

&lt;p&gt;Claude rightfully recommends using TypeScript and suggests a build step to convert &lt;code&gt;.ts&lt;/code&gt; to &lt;code&gt;.js&lt;/code&gt;. However node &amp;gt;23.6 now supports &lt;a href="https://nodejs.org/en/learn/typescript/run-natively" rel="noopener noreferrer"&gt;direct execution of TypeScript with type stripping&lt;/a&gt;, so the build step felt unnecessary ❌.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL:DR; Here is the working config:
&lt;/h2&gt;

&lt;p&gt;Final, working, Claude's local &lt;code&gt;config.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;"hello-world"&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;"/Users/sam/.nvm/nvm-exec"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&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;"NODE_VERSION"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"23"&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;"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="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"--disable-warning=ExperimentalWarning --experimental-strip-types"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"/Users/sam/work/src/mcp/module/src/index.ts"&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;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;h2&gt;
  
  
  Issues encountered and solutions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Everything path must be absolute
&lt;/h3&gt;

&lt;p&gt;Claude's config doesn't perform any path interpolation or env inheritance, so everything has to be explicitly declared and all paths have to be absolute. No &lt;code&gt;~&lt;/code&gt; or &lt;code&gt;$HOME&lt;/code&gt; or &lt;code&gt;PATH&lt;/code&gt; preset:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"command": "/Users/sam/.nvm/nvm-exec"
"/Users/sam/work/src/mcp/module/src/index.ts"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Calling the right node
&lt;/h3&gt;

&lt;p&gt;I'm using &lt;code&gt;nvm&lt;/code&gt; to manage my node runtimes. Even after installing the latest node 23 with &lt;code&gt;nvm install 23&lt;/code&gt;, calling &lt;code&gt;node&lt;/code&gt; from Claude yielded another version. The solution is to use &lt;code&gt;nvm-exec&lt;/code&gt; with an env variable &lt;code&gt;NODE_VERSION=23&lt;/code&gt;, see the config above. Note that &lt;code&gt;nvm-exec&lt;/code&gt; must be referenced with an absolute path.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stdout pollution
&lt;/h3&gt;

&lt;p&gt;Since node 23's &lt;code&gt;--experimental-strip-types&lt;/code&gt; is considered experimental, there is a warning message displayed on invocation. Since the local MCP protocol relies on stdin/stdout, this warning message disrupted the protocol.&lt;/p&gt;

&lt;p&gt;The solution is to silence this warning with &lt;code&gt;--disable-warning=ExperimentalWarning&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;It works!&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6uf92y4uvykbplnwi28b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6uf92y4uvykbplnwi28b.png" alt="Claude Settings showing the valid active MCP" width="800" height="287"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I hope you'll overcome those issues faster thanks to this post. Good luck experimenting with MCP! Comments and reactions are appreciated 😊&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>node</category>
      <category>llm</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Install those 6 browsers now… (Yes you need them all!)</title>
      <dc:creator>Yves Jutard</dc:creator>
      <pubDate>Thu, 20 Mar 2025 05:25:37 +0000</pubDate>
      <link>https://dev.to/yvem/install-those-3-browsers-now-not-the-ones-you-think-1367</link>
      <guid>https://dev.to/yvem/install-those-3-browsers-now-not-the-ones-you-think-1367</guid>
      <description>&lt;p&gt;I'm Frontend Software Engineer. I routinely use 2x browsers at once. Since last year, I further improved my productivity thanks to 2x extra browsers.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclaimer: 2 of them are macOs only.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1st: Main browser: &lt;a href="https://www.mozilla.org/en-US/firefox/new/" rel="noopener noreferrer"&gt;Firefox&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.mozilla.org/en-US/firefox/new/" rel="noopener noreferrer"&gt;Firefox&lt;/a&gt; is not the greatest and fastest browser, but it has 2x killer features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Vertical tabs&lt;/strong&gt;: (&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/sidebery/" rel="noopener noreferrer"&gt;webextension&lt;/a&gt;) THE killer feature. A collapsible tree of tabs is a huge productivity gain! Chrome absolutely rejects vertical tabs for no clear reasons.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ad blocking&lt;/strong&gt;: while Chrome is &lt;a href="https://ublockorigin.com/" rel="noopener noreferrer"&gt;trying to kill ad blockers&lt;/a&gt;, Firefox promised they would keep them working. I use an advanced one called &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/umatrix/" rel="noopener noreferrer"&gt;uMatrix&lt;/a&gt; but I heard good things about &lt;a href="https://ublockorigin.com/" rel="noopener noreferrer"&gt;uBlock Origin&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2nd: Secondary browser: Chrome
&lt;/h2&gt;

&lt;p&gt;The most supported browser, also the most "enterprise ready", the only one supporting all my company's internal tools.&lt;/p&gt;

&lt;p&gt;Killer feature:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The standard&lt;/strong&gt;: like it or not, all websites work on Chrome, especially business webapps.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-profiles&lt;/strong&gt;: allowing to seamlessly keep a separate personal profile on the side of a work one.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Be sure to tweak the security settings to block 3rd party cookies!&lt;/p&gt;

&lt;h2&gt;
  
  
  3rd: Dev browser: &lt;a href="https://www.google.com/intl/en_us/chrome/dev/" rel="noopener noreferrer"&gt;Chrome Dev&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Using a dedicated Dev browser is a big gain! To properly debug websites (esp. perf issues), one needs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;no webextensions&lt;/strong&gt;: daily-life webextensions such as password managers inject code into pages, add extra iframes etc. This is confusing when trying to debug a page, seeing extra logs &amp;amp; errors, extra classes on elements, confusing flamegraphs...&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;a cleanable browser&lt;/strong&gt;: a dedicated dev browser allows you to safely "reset" your browser, clearing all cookies and site data without impacting all your work sessions on the main browser(s).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;a defaulted browser&lt;/strong&gt;: unlike your main browser which is likely "strenghtened" (strict Safe Browsing, 3p blocking…), you can keep the dev browser "defaulted" to experience it like most of your users do.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.google.com/intl/en_us/chrome/dev/" rel="noopener noreferrer"&gt;Chrome Dev&lt;/a&gt; is an excellent choice. It's evergreen and the most used browser anyway.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6jw8bxy106607owua0bx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6jw8bxy106607owua0bx.png" alt="Chrome Dev splash screen" width="800" height="588"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4th: "picker" browser: &lt;a href="https://sindresorhus.com/velja" rel="noopener noreferrer"&gt;Velja&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://sindresorhus.com/velja" rel="noopener noreferrer"&gt;Velja&lt;/a&gt; by Sindre Sorhus is not a real browser but a browser picker. By setting it as the default system browser, it shows a picker upon click on a link from outside of a browser (ex. in your Terminal, Slack, Zoom…):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgjwsfybm0r31lg9acbv1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgjwsfybm0r31lg9acbv1.png" alt="Velja demo" width="800" height="218"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  (Bonus) 5th: Mobile debugging browser &lt;a href="https://developer.apple.com/safari/technology-preview/" rel="noopener noreferrer"&gt;Safari Technology Preview&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Killer feature:&lt;/strong&gt; mobile debugging. Safari Technology Preview can open dev tools on a connected iPhone, either a physical one or an emulated one. This is invaluable when fixing mobile issues.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I'm not doing much mobile debugging at the moment, but when needed, it's a must-have.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  (Bonus) 6th: Responsive Development browser &lt;a href="https://polypane.app/" rel="noopener noreferrer"&gt;Polypane&lt;/a&gt; or &lt;a href="https://responsively.app/" rel="noopener noreferrer"&gt;Responsively&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Killer feature:&lt;/strong&gt; responsive development. Both browsers allow to simultaneously open several synchronised tabs with different viewport sizes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcee0p2467z64vtdernx8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcee0p2467z64vtdernx8.png" alt="Multi viewports demo" width="800" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://polypane.app/" rel="noopener noreferrer"&gt;Polypane&lt;/a&gt; is paid but feature-packed by very motivated devs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;brew install --cask polypane&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://responsively.app/" rel="noopener noreferrer"&gt;Responsively&lt;/a&gt; is free but has less features&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;brew install --cask responsively&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I'm not doing much responsive dev at the moment, but when needed, it's a must-have.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8bnc8k6hshnkbashku5j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8bnc8k6hshnkbashku5j.png" alt="List of browsers" width="566" height="749"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's it!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>frontend</category>
      <category>tooling</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
