<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Node.js Tutorial | ServerAvatar</title>
	<atom:link href="https://serveravatar.com/tag/node-js-tutorial/feed/" rel="self" type="application/rss+xml" />
	<link>https://serveravatar.com</link>
	<description></description>
	<lastBuildDate>Wed, 24 Sep 2025 06:34:44 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://serveravatar.com/wp-content/uploads/2025/02/cropped-favicon-32x32.png</url>
	<title>Node.js Tutorial | ServerAvatar</title>
	<link>https://serveravatar.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Create MCP Server in Node.js: Step-by-Step Guide</title>
		<link>https://serveravatar.com/create-mcp-server-nodejs/</link>
		
		<dc:creator><![CDATA[Suresh Ramani]]></dc:creator>
		<pubDate>Wed, 10 Sep 2025 16:30:00 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Guide]]></category>
		<category><![CDATA[Node.js]]></category>
		<category><![CDATA[MCP Guide]]></category>
		<category><![CDATA[MCP Server]]></category>
		<category><![CDATA[Node.js Tutorial]]></category>
		<guid isPermaLink="false">https://serveravatar.com/?p=27900</guid>

					<description><![CDATA[<p>Have you ever wondered how modern applications communicate seamlessly with each other? Think of an&#160;MCP server&#160;as a digital translator that helps different software systems have meaningful conversations. Just like how a skilled interpreter bridges language barriers between people from different countries, an MCP (Model Context Protocol) server bridges the gap between AI models and various [&#8230;]</p>
<p>The post <a href="https://serveravatar.com/create-mcp-server-nodejs/">Create MCP Server in Node.js: Step-by-Step Guide</a> first appeared on <a href="https://serveravatar.com">ServerAvatar</a>.</p>]]></description>
										<content:encoded><![CDATA[<figure class="wp-block-image size-large"><a href="https://serveravatar.com?ref=blog" target="_blank" rel=" noreferrer noopener"><img fetchpriority="high" decoding="async" width="1024" height="127" src="https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-1024x127.png" alt="Blog banner - ServerAvatar" class="wp-image-28182" srcset="https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-1024x127.png 1024w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-300x37.png 300w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-768x95.png 768w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-1536x190.png 1536w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-2048x253.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Have you ever wondered how modern applications communicate seamlessly with each other? Think of an&nbsp;<strong>MCP server</strong>&nbsp;as a digital translator that helps different software systems have meaningful conversations. Just like how a skilled interpreter bridges language barriers between people from different countries, an MCP (Model Context Protocol) server bridges the gap between AI models and various tools or data sources.</p>



<p>In today’s interconnected world, building robust server applications isn’t just a luxury &#8211; it’s a necessity. Whether you’re a seasoned developer or someone just starting their coding journey, understanding how to create an&nbsp;<strong>mcp server</strong>&nbsp;in Node.js will open doors to countless possibilities. This comprehensive guide will walk you through every step, ensuring you have the knowledge and confidence to build your own MCP server from scratch.</p>



<h2 class="wp-block-heading" id="what-is-an-mcp-server-and-why-should-you-care"><strong>What is an MCP Server and Why Should You Care?</strong></h2>



<p>An&nbsp;<strong>MCP server</strong>&nbsp;is essentially a specialized application that implements the Model Context Protocol, enabling AI models to interact with external tools, databases, and services. But why should this matter to you as a developer?</p>



<p>Imagine you’re building a smart assistant that needs to check the weather, send emails, and analyze data from your company’s database. Without an&nbsp;<strong>mcp server</strong>, you’d need to hardcode each integration separately. With MCP, your AI assistant can dynamically discover and use available tools through a standardized protocol.</p>



<h3 class="wp-block-heading" id="key-benefits-of-mcp-servers"><strong>Key Benefits of MCP Servers</strong></h3>



<p><strong>Standardization</strong>: MCP provides a unified way for AI models to interact with external resources, eliminating the need for custom integrations for each tool or service.</p>



<p><strong>Flexibility</strong>: Your server can expose multiple tools and capabilities, allowing AI models to choose the most appropriate ones for specific tasks.</p>



<p><strong>Scalability</strong>: As your application grows, you can easily add new tools and capabilities without restructuring your entire system.</p>



<h2 class="wp-block-heading" id="understanding-the-model-context-protocol"><strong>Understanding the Model Context Protocol</strong></h2>



<p>Before diving into code, let’s understand what makes MCP special. The&nbsp;<strong>Model Context Protocol</strong>&nbsp;is like a universal language that AI models and tools use to communicate. It defines how requests are made, how responses are structured, and how errors are handled.</p>



<h3 class="wp-block-heading" id="core-mcp-concepts"><strong>Core MCP Concepts</strong></h3>



<p><strong>Tools</strong>: These are functions that the AI model can call to perform specific actions, like searching a database or making an API request.</p>



<p><strong>Resources</strong>: Static or dynamic content that the AI model can access, such as files, documents, or data streams.</p>



<p><strong>Prompts</strong>: Pre-defined templates that help structure interactions between the AI model and your server.</p>



<p>Think of MCP as the postal system for AI interactions &#8211; it ensures messages get delivered to the right place in the right format, every time.</p>



<figure class="wp-block-video"><video height="1048" style="aspect-ratio: 1920 / 1048;" width="1920" controls src="https://serveravatar.com/wp-content/uploads/2025/09/RecordRTC-202589-g4qba6ocrn.webm"></video></figure>



<h2 class="wp-block-heading" id="setting-up-your-development-environment"><strong>Setting Up Your Development Environment</strong></h2>



<p>Getting started with building an&nbsp;<strong>mcp server</strong>&nbsp;requires the right tools and environment. Let’s set up everything you need for a smooth development experience.</p>



<h3 class="wp-block-heading" id="prerequisites"><strong>Prerequisites</strong></h3>



<p>Before we begin, make sure you have:</p>



<p><strong>Node.js</strong>&nbsp;(version 16 or higher): This is the runtime environment for our server. If you want to upgrade your node.js read this <a href="https://serveravatar.com/upgrade-node/" title="">guide for upgrade node.js</a>.</p>



<p><strong>npm or yarn</strong>: Package manager for installing dependencies</p>



<p><strong>A code editor</strong>: VS Code, Sublime Text, or your preferred editor&nbsp;</p>



<p><strong>Git</strong>: For version control (optional but recommended)</p>



<h3 class="wp-block-heading" id="creating-your-project-directory"><strong>Creating Your Project Directory</strong></h3>



<p>Start by creating a new directory for your MCP server project:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Bash</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>mkdir my-mcp-server
cd my-mcp-server
npm init -y</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">mkdir</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">my-mcp-server</span></span>
<span class="line"><span style="color: #DCDCAA">cd</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">my-mcp-server</span></span>
<span class="line"><span style="color: #DCDCAA">npm</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">init</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-y</span></span></code></pre></div>



<p>This creates a basic Node.js project structure with a&nbsp;<code>package.json</code>&nbsp;file that will track your dependencies and project metadata.</p>



<h2 class="wp-block-heading" id="installing-required-dependencies"><strong>Installing Required Dependencies</strong></h2>



<p>Now let’s install the packages we’ll need to build our&nbsp;<strong>mcp server</strong>. Think of these dependencies as the building blocks &#8211; each one serves a specific purpose in creating a robust server application.</p>



<h3 class="wp-block-heading" id="essential-dependencies"><strong>Essential Dependencies</strong></h3>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Bash</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>npm install @modelcontextprotocol/sdk
npm install express cors helmet
npm install --save-dev nodemon typescript @types/node
npm install -D tsx</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">npm</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">install</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">@modelcontextprotocol/sdk</span></span>
<span class="line"><span style="color: #DCDCAA">npm</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">install</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">express</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">cors</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">helmet</span></span>
<span class="line"><span style="color: #DCDCAA">npm</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">install</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">--save-dev</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">nodemon</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">typescript</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">@types/node</span></span>
<span class="line"><span style="color: #DCDCAA">npm</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">install</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-D</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">tsx</span></span></code></pre></div>



<p><strong>@modelcontextprotocol/sdk</strong>: The official MCP SDK that provides all the tools we need&nbsp;<strong>Express</strong>: Web framework for handling HTTP requests&nbsp;<strong>CORS</strong>: Enables cross-origin resource sharing&nbsp;<strong>Helmet</strong>: Adds security headers to protect your server&nbsp;<strong>Development dependencies</strong>: Tools that help during development</p>



<h3 class="wp-block-heading" id="setting-up-typescript-configuration"><strong>Setting Up TypeScript Configuration</strong></h3>



<p>Create a&nbsp;<code>tsconfig.json</code>&nbsp;file to configure TypeScript:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">JSON</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>{
  "compilerOptions": {
    "target": "ES2020",
    "module": "ES2020",
    "moduleResolution": "node",
    "outDir": "./dist",
    "rootDir": "./src",
    "strict": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true
  },
  "ts-node": {
    "esm": true
  }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">&quot;compilerOptions&quot;</span><span style="color: #D4D4D4">: {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">&quot;target&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;ES2020&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">&quot;module&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;ES2020&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">&quot;moduleResolution&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;node&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">&quot;outDir&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;./dist&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">&quot;rootDir&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;./src&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">&quot;strict&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #569CD6">true</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">&quot;esModuleInterop&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #569CD6">true</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">&quot;allowSyntheticDefaultImports&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #569CD6">true</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">&quot;skipLibCheck&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #569CD6">true</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">&quot;forceConsistentCasingInFileNames&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #569CD6">true</span></span>
<span class="line"><span style="color: #D4D4D4">  },</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">&quot;ts-node&quot;</span><span style="color: #D4D4D4">: {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">&quot;esm&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #569CD6">true</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<h2 class="wp-block-heading" id="creating-your-first-mcp-server-structure"><strong>Creating Your First MCP Server Structure</strong></h2>



<p>Let’s build the foundation of your&nbsp;<strong>mcp server</strong>. Like constructing a house, we need a solid structure before adding the fancy features.</p>



<h3 class="wp-block-heading" id="basic-server-setup"><strong>Basic Server Setup</strong></h3>



<p>Create a&nbsp;<code>src</code>&nbsp;directory and add your main server file:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">TypeScript</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>// src/server.ts
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';

class MyMCPServer {
  private server: Server;

  constructor() {
    this.server = new Server(
      {
        name: 'my-mcp-server',
        version: '1.0.0',
      },
      {
        capabilities: {
          tools: {},
          resources: {},
        },
      }
    );
  }

  async start() {
    const transport = new StdioServerTransport();
    await this.server.connect(transport);
    console.log('MCP Server started successfully!');
  }
}

const server = new MyMCPServer();
server.start().catch(console.error);</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">// src/server.ts</span></span>
<span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> { </span><span style="color: #9CDCFE">Server</span><span style="color: #D4D4D4"> } </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;@modelcontextprotocol/sdk/server/index.js&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> { </span><span style="color: #9CDCFE">StdioServerTransport</span><span style="color: #D4D4D4"> } </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;@modelcontextprotocol/sdk/server/stdio.js&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">MyMCPServer</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">server</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">Server</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">constructor</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">server</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">Server</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">      {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">name:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;my-mcp-server&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">version:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;1.0.0&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">      },</span></span>
<span class="line"><span style="color: #D4D4D4">      {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">capabilities:</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #9CDCFE">tools:</span><span style="color: #D4D4D4"> {},</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #9CDCFE">resources:</span><span style="color: #D4D4D4"> {},</span></span>
<span class="line"><span style="color: #D4D4D4">        },</span></span>
<span class="line"><span style="color: #D4D4D4">      }</span></span>
<span class="line"><span style="color: #D4D4D4">    );</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">async</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">start</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">transport</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">StdioServerTransport</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">server</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">connect</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">transport</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">console</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">log</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;MCP Server started successfully!&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">server</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">MyMCPServer</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #9CDCFE">server</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">start</span><span style="color: #D4D4D4">().</span><span style="color: #DCDCAA">catch</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">console</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">error</span><span style="color: #D4D4D4">);</span></span></code></pre></div>



<p>This basic structure creates an&nbsp;<strong>mcp server</strong>&nbsp;that can start and listen for connections, though it doesn’t do much yet.</p>



<h2 class="wp-block-heading" id="implementing-core-server-functionality"><strong>Implementing Core Server Functionality</strong></h2>



<p>Now comes the exciting part &#8211; adding functionality to your&nbsp;<strong>mcp server</strong>. Let’s implement the core features that will make your server useful.</p>



<h3 class="wp-block-heading" id="adding-your-first-tool"><strong>Adding Your First Tool</strong></h3>



<p>Tools are the heart of any MCP server. Let’s add a simple calculator tool:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">TypeScript</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>// Add this to your server class constructor
this.server.setRequestHandler(ListToolsRequestSchema, async () => {
  return {
    tools: [
      {
        name: 'calculate',
        description: 'Perform basic mathematical calculations',
        inputSchema: {
          type: 'object',
          properties: {
            operation: { type: 'string', enum: &#91;'add', 'subtract', 'multiply', 'divide'&#93; },
            a: { type: 'number' },
            b: { type: 'number' }
          },
          required: &#91;'operation', 'a', 'b'&#93;
        }
      }
    ]
  };
});

this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
  const { name, arguments: args } = request.params;
  
  if (name === 'calculate') {
    const { operation, a, b } = args as any;
    let result: number;
    
    switch (operation) {
      case 'add': result = a + b; break;
      case 'subtract': result = a - b; break;
      case 'multiply': result = a * b; break;
      case 'divide': result = b !== 0 ? a / b : NaN; break;
      default: throw new Error('Invalid operation');
    }
    
    return {
      content: &#91;
        {
          type: 'text',
          text: `The result of ${a} ${operation} ${b} is ${result}`
        }
      &#93;
    };
  }
  
  throw new Error('Tool not found');
});</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">// Add this to your server class constructor</span></span>
<span class="line"><span style="color: #569CD6">this</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">server</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">setRequestHandler</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">ListToolsRequestSchema</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">async</span><span style="color: #D4D4D4"> () </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">tools:</span><span style="color: #D4D4D4"> [</span></span>
<span class="line"><span style="color: #D4D4D4">      {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">name:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;calculate&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">description:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;Perform basic mathematical calculations&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">inputSchema:</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #9CDCFE">type:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;object&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #9CDCFE">properties:</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">operation:</span><span style="color: #D4D4D4"> { </span><span style="color: #9CDCFE">type:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;string&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">enum:</span><span style="color: #D4D4D4"> &#91;</span><span style="color: #CE9178">&#39;add&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;subtract&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;multiply&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;divide&#39;</span><span style="color: #D4D4D4">&#93; },</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">a:</span><span style="color: #D4D4D4"> { </span><span style="color: #9CDCFE">type:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;number&#39;</span><span style="color: #D4D4D4"> },</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">b:</span><span style="color: #D4D4D4"> { </span><span style="color: #9CDCFE">type:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;number&#39;</span><span style="color: #D4D4D4"> }</span></span>
<span class="line"><span style="color: #D4D4D4">          },</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #9CDCFE">required:</span><span style="color: #D4D4D4"> &#91;</span><span style="color: #CE9178">&#39;operation&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;a&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;b&#39;</span><span style="color: #D4D4D4">&#93;</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"><span style="color: #D4D4D4">      }</span></span>
<span class="line"><span style="color: #D4D4D4">    ]</span></span>
<span class="line"><span style="color: #D4D4D4">  };</span></span>
<span class="line"><span style="color: #D4D4D4">});</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">this</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">server</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">setRequestHandler</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">CallToolRequestSchema</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">async</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">request</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> { </span><span style="color: #4FC1FF">name</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">arguments</span><span style="color: #D4D4D4">: </span><span style="color: #4FC1FF">args</span><span style="color: #D4D4D4"> } = </span><span style="color: #9CDCFE">request</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">params</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">name</span><span style="color: #D4D4D4"> === </span><span style="color: #CE9178">&#39;calculate&#39;</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> { </span><span style="color: #4FC1FF">operation</span><span style="color: #D4D4D4">, </span><span style="color: #4FC1FF">a</span><span style="color: #D4D4D4">, </span><span style="color: #4FC1FF">b</span><span style="color: #D4D4D4"> } = </span><span style="color: #9CDCFE">args</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">as</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">any</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">let</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">result</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">number</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">switch</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">operation</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #C586C0">case</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;add&#39;</span><span style="color: #D4D4D4">: </span><span style="color: #9CDCFE">result</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">a</span><span style="color: #D4D4D4"> + </span><span style="color: #9CDCFE">b</span><span style="color: #D4D4D4">; </span><span style="color: #C586C0">break</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #C586C0">case</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;subtract&#39;</span><span style="color: #D4D4D4">: </span><span style="color: #9CDCFE">result</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">a</span><span style="color: #D4D4D4"> - </span><span style="color: #9CDCFE">b</span><span style="color: #D4D4D4">; </span><span style="color: #C586C0">break</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #C586C0">case</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;multiply&#39;</span><span style="color: #D4D4D4">: </span><span style="color: #9CDCFE">result</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">a</span><span style="color: #D4D4D4"> * </span><span style="color: #9CDCFE">b</span><span style="color: #D4D4D4">; </span><span style="color: #C586C0">break</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #C586C0">case</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;divide&#39;</span><span style="color: #D4D4D4">: </span><span style="color: #9CDCFE">result</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">b</span><span style="color: #D4D4D4"> !== </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> ? </span><span style="color: #9CDCFE">a</span><span style="color: #D4D4D4"> / </span><span style="color: #9CDCFE">b</span><span style="color: #D4D4D4"> : </span><span style="color: #569CD6">NaN</span><span style="color: #D4D4D4">; </span><span style="color: #C586C0">break</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #C586C0">default</span><span style="color: #D4D4D4">: </span><span style="color: #C586C0">throw</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">Error</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;Invalid operation&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">content:</span><span style="color: #D4D4D4"> &#91;</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #9CDCFE">type:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;text&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #9CDCFE">text:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">`The result of </span><span style="color: #569CD6">${</span><span style="color: #9CDCFE">a</span><span style="color: #569CD6">}</span><span style="color: #CE9178"> </span><span style="color: #569CD6">${</span><span style="color: #9CDCFE">operation</span><span style="color: #569CD6">}</span><span style="color: #CE9178"> </span><span style="color: #569CD6">${</span><span style="color: #9CDCFE">b</span><span style="color: #569CD6">}</span><span style="color: #CE9178"> is </span><span style="color: #569CD6">${</span><span style="color: #9CDCFE">result</span><span style="color: #569CD6">}</span><span style="color: #CE9178">`</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"><span style="color: #D4D4D4">      &#93;</span></span>
<span class="line"><span style="color: #D4D4D4">    };</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">  </span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">throw</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">Error</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;Tool not found&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">});</span></span></code></pre></div>



<h3 class="wp-block-heading" id="understanding-tool-implementation"><strong>Understanding Tool Implementation</strong></h3>



<p>When you implement tools in your&nbsp;<strong>mcp server</strong>, you’re essentially creating functions that AI models can call. Each tool needs:</p>



<p><strong>A clear name</strong>: Something descriptive like ‘calculate’ or ‘search-database’&nbsp;<strong>A detailed description</strong>: This helps the AI understand when to use the tool&nbsp;<strong>An input schema</strong>: Defines what parameters the tool expects&nbsp;<strong>Implementation logic</strong>: The actual code that performs the work</p>



<h2 class="wp-block-heading" id="adding-tool-integration-capabilities"><strong>Adding Tool Integration Capabilities</strong></h2>



<p>Your&nbsp;<strong>mcp server</strong>&nbsp;becomes truly powerful when it can integrate with external services. Let’s add some real-world functionality.</p>



<h3 class="wp-block-heading" id="file-system-tool"><strong>File System Tool</strong></h3>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">TypeScript</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>// Add a file reading tool
this.server.setRequestHandler(ListToolsRequestSchema, async () => {
  return {
    tools: [
      // ... existing tools
      {
        name: 'read-file',
        description: 'Read contents of a text file',
        inputSchema: {
          type: 'object',
          properties: {
            path: { type: 'string', description: 'Path to the file' }
          },
          required: &#91;'path'&#93;
        }
      }
    ]
  };
});

// Implementation
import * as fs from 'fs/promises';

// In your CallToolRequestSchema handler
if (name === 'read-file') {
  const { path } = args as { path: string };
  
  try {
    const content = await fs.readFile(path, 'utf-8');
    return {
      content: &#91;{
        type: 'text',
        text: content
      }&#93;
    };
  } catch (error) {
    return {
      content: &#91;{
        type: 'text',
        text: `Error reading file: ${error.message}`
      }&#93;,
      isError: true
    };
  }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">// Add a file reading tool</span></span>
<span class="line"><span style="color: #569CD6">this</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">server</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">setRequestHandler</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">ListToolsRequestSchema</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">async</span><span style="color: #D4D4D4"> () </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">tools:</span><span style="color: #D4D4D4"> [</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #6A9955">// ... existing tools</span></span>
<span class="line"><span style="color: #D4D4D4">      {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">name:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;read-file&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">description:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;Read contents of a text file&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">inputSchema:</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #9CDCFE">type:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;object&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #9CDCFE">properties:</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">path:</span><span style="color: #D4D4D4"> { </span><span style="color: #9CDCFE">type:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;string&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">description:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;Path to the file&#39;</span><span style="color: #D4D4D4"> }</span></span>
<span class="line"><span style="color: #D4D4D4">          },</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #9CDCFE">required:</span><span style="color: #D4D4D4"> &#91;</span><span style="color: #CE9178">&#39;path&#39;</span><span style="color: #D4D4D4">&#93;</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"><span style="color: #D4D4D4">      }</span></span>
<span class="line"><span style="color: #D4D4D4">    ]</span></span>
<span class="line"><span style="color: #D4D4D4">  };</span></span>
<span class="line"><span style="color: #D4D4D4">});</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">// Implementation</span></span>
<span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">*</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">as</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">fs</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;fs/promises&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">// In your CallToolRequestSchema handler</span></span>
<span class="line"><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">name</span><span style="color: #D4D4D4"> === </span><span style="color: #CE9178">&#39;read-file&#39;</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> { </span><span style="color: #4FC1FF">path</span><span style="color: #D4D4D4"> } = </span><span style="color: #9CDCFE">args</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">as</span><span style="color: #D4D4D4"> { </span><span style="color: #9CDCFE">path</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">string</span><span style="color: #D4D4D4"> };</span></span>
<span class="line"><span style="color: #D4D4D4">  </span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">try</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">content</span><span style="color: #D4D4D4"> = </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">fs</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">readFile</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">path</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;utf-8&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">content:</span><span style="color: #D4D4D4"> &#91;{</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">type:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;text&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">text:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">content</span></span>
<span class="line"><span style="color: #D4D4D4">      }&#93;</span></span>
<span class="line"><span style="color: #D4D4D4">    };</span></span>
<span class="line"><span style="color: #D4D4D4">  } </span><span style="color: #C586C0">catch</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">error</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">content:</span><span style="color: #D4D4D4"> &#91;{</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">type:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;text&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">text:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">`Error reading file: </span><span style="color: #569CD6">${</span><span style="color: #9CDCFE">error</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">message</span><span style="color: #569CD6">}</span><span style="color: #CE9178">`</span></span>
<span class="line"><span style="color: #D4D4D4">      }&#93;,</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">isError:</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">true</span></span>
<span class="line"><span style="color: #D4D4D4">    };</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<h3 class="wp-block-heading" id="api-integration-tool"><strong>API Integration Tool</strong></h3>



<p>Adding external API capabilities makes your&nbsp;<strong>mcp server</strong>&nbsp;even more versatile. For production-grade applications, you might also want to explore advanced deployment options and server management techniques. You can find comprehensive guides on modern deployment strategies at the&nbsp;<a href="https://nodejs.org/en/docs/guides/">official Node.js documentation</a>&nbsp;for best practices and performance optimization.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">TypeScript</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>// Weather API tool example
{
  name: 'get-weather',
  description: 'Get current weather for a location',
  inputSchema: {
    type: 'object',
    properties: {
      city: { type: 'string', description: 'City name' }
    },
    required: &#91;'city'&#93;
  }
}

// Implementation
if (name === 'get-weather') {
  const { city } = args as { city: string };
  
  try {
    const response = await fetch(`https://api.weatherapi.com/v1/current.json?key=${process.env.WEATHER_API_KEY}&amp;q=${city}`);
    const data = await response.json();
    
    return {
      content: &#91;{
        type: 'text',
        text: `Weather in ${city}: ${data.current.temp_c}°C, ${data.current.condition.text}`
      }&#93;
    };
  } catch (error) {
    return {
      content: &#91;{
        type: 'text',
        text: `Error fetching weather: ${error.message}`
      }&#93;,
      isError: true
    };
  }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">// Weather API tool example</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C8C8C8">name</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&#39;get-weather&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C8C8C8">description</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&#39;Get current weather for a location&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C8C8C8">inputSchema</span><span style="color: #D4D4D4">: {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C8C8C8">type</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&#39;object&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C8C8C8">properties</span><span style="color: #D4D4D4">: {</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #C8C8C8">city</span><span style="color: #D4D4D4">: { </span><span style="color: #C8C8C8">type</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&#39;string&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #C8C8C8">description</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&#39;City name&#39;</span><span style="color: #D4D4D4"> }</span></span>
<span class="line"><span style="color: #D4D4D4">    },</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C8C8C8">required</span><span style="color: #D4D4D4">: &#91;</span><span style="color: #CE9178">&#39;city&#39;</span><span style="color: #D4D4D4">&#93;</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">// Implementation</span></span>
<span class="line"><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">name</span><span style="color: #D4D4D4"> === </span><span style="color: #CE9178">&#39;get-weather&#39;</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> { </span><span style="color: #4FC1FF">city</span><span style="color: #D4D4D4"> } = </span><span style="color: #9CDCFE">args</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">as</span><span style="color: #D4D4D4"> { </span><span style="color: #9CDCFE">city</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">string</span><span style="color: #D4D4D4"> };</span></span>
<span class="line"><span style="color: #D4D4D4">  </span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">try</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">response</span><span style="color: #D4D4D4"> = </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">fetch</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">`https://api.weatherapi.com/v1/current.json?key=</span><span style="color: #569CD6">${</span><span style="color: #9CDCFE">process</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">env</span><span style="color: #D4D4D4">.</span><span style="color: #4FC1FF">WEATHER_API_KEY</span><span style="color: #569CD6">}</span><span style="color: #CE9178">&amp;q=</span><span style="color: #569CD6">${</span><span style="color: #9CDCFE">city</span><span style="color: #569CD6">}</span><span style="color: #CE9178">`</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">data</span><span style="color: #D4D4D4"> = </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">response</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">json</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">content:</span><span style="color: #D4D4D4"> &#91;{</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">type:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;text&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">text:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">`Weather in </span><span style="color: #569CD6">${</span><span style="color: #9CDCFE">city</span><span style="color: #569CD6">}</span><span style="color: #CE9178">: </span><span style="color: #569CD6">${</span><span style="color: #9CDCFE">data</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">current</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">temp_c</span><span style="color: #569CD6">}</span><span style="color: #CE9178">°C, </span><span style="color: #569CD6">${</span><span style="color: #9CDCFE">data</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">current</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">condition</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">text</span><span style="color: #569CD6">}</span><span style="color: #CE9178">`</span></span>
<span class="line"><span style="color: #D4D4D4">      }&#93;</span></span>
<span class="line"><span style="color: #D4D4D4">    };</span></span>
<span class="line"><span style="color: #D4D4D4">  } </span><span style="color: #C586C0">catch</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">error</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">content:</span><span style="color: #D4D4D4"> &#91;{</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">type:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;text&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">text:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">`Error fetching weather: </span><span style="color: #569CD6">${</span><span style="color: #9CDCFE">error</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">message</span><span style="color: #569CD6">}</span><span style="color: #CE9178">`</span></span>
<span class="line"><span style="color: #D4D4D4">      }&#93;,</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">isError:</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">true</span></span>
<span class="line"><span style="color: #D4D4D4">    };</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<h2 class="wp-block-heading" id="handling-client-connections-and-communication"><strong>Handling Client Connections and Communication</strong></h2>



<p>Communication is key in any relationship, and the same applies to your&nbsp;<strong>mcp server</strong>. Let’s ensure your server can handle multiple clients gracefully.</p>



<h3 class="wp-block-heading" id="connection-management"><strong>Connection Management</strong></h3>



<p>Your MCP server needs to handle client connections properly. Here’s how to implement robust connection handling:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">TypeScript</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>class MyMCPServer {
  private clients: Set&lt;any> = new Set();

  async handleNewConnection(transport: any) {
    this.clients.add(transport);
    
    transport.onClose(() => {
      this.clients.delete(transport);
      console.log('Client disconnected');
    });
    
    console.log(`Client connected. Total clients: ${this.clients.size}`);
  }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">MyMCPServer</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">clients</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">Set</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">any</span><span style="color: #D4D4D4">&gt; = </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">Set</span><span style="color: #D4D4D4">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">async</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">handleNewConnection</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">transport</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">any</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">clients</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">add</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">transport</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">transport</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">onClose</span><span style="color: #D4D4D4">(() </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">clients</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">delete</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">transport</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">console</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">log</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;Client disconnected&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    });</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">console</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">log</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">`Client connected. Total clients: </span><span style="color: #569CD6">${</span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">clients</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">size</span><span style="color: #569CD6">}</span><span style="color: #CE9178">`</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<h3 class="wp-block-heading" id="message-processing"><strong>Message Processing</strong></h3>



<p>Your&nbsp;<strong>mcp server</strong>&nbsp;should process messages efficiently and respond appropriately:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">TypeScript</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>private async processMessage(message: any) {
  try {
    // Log incoming messages for debugging
    console.log('Received message:', JSON.stringify(message, null, 2));
    
    // Process the message based on its type
    switch (message.method) {
      case 'tools/list':
        return await this.handleListTools();
      case 'tools/call':
        return await this.handleCallTool(message.params);
      default:
        throw new Error(`Unknown method: ${message.method}`);
    }
  } catch (error) {
    console.error('Error processing message:', error);
    throw error;
  }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #9CDCFE">private</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">async</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">processMessage</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">message</span><span style="color: #D4D4D4">: </span><span style="color: #9CDCFE">any</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">try</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">// Log incoming messages for debugging</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">console</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">log</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;Received message:&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #4FC1FF">JSON</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">stringify</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">message</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">null</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">));</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">// Process the message based on its type</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">switch</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">message</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">method</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #C586C0">case</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;tools/list&#39;</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">handleListTools</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #C586C0">case</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;tools/call&#39;</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">handleCallTool</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">message</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">params</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #C586C0">default</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">throw</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">Error</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">`Unknown method: </span><span style="color: #569CD6">${</span><span style="color: #9CDCFE">message</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">method</span><span style="color: #569CD6">}</span><span style="color: #CE9178">`</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">  } </span><span style="color: #C586C0">catch</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">error</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">console</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">error</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;Error processing message:&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">error</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">throw</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">error</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<h2 class="wp-block-heading" id="error-handling-and-validation"><strong>Error Handling and Validation</strong></h2>



<p>Nobody likes crashes, especially in production servers. Let’s make your&nbsp;<strong>mcp server</strong>&nbsp;bulletproof with proper error handling and validation.</p>



<h3 class="wp-block-heading" id="input-validation"><strong>Input Validation</strong></h3>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">TypeScript</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>import Joi from 'joi';

const toolCallSchema = Joi.object({
  name: Joi.string().required(),
  arguments: Joi.object().required()
});

private validateToolCall(params: any) {
  const { error, value } = toolCallSchema.validate(params);
  if (error) {
    throw new Error(`Invalid tool call parameters: ${error.details&#91;0&#93;.message}`);
  }
  return value;
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Joi</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;joi&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">toolCallSchema</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">Joi</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">object</span><span style="color: #D4D4D4">({</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">name:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Joi</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">string</span><span style="color: #D4D4D4">().</span><span style="color: #DCDCAA">required</span><span style="color: #D4D4D4">(),</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">arguments:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Joi</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">object</span><span style="color: #D4D4D4">().</span><span style="color: #DCDCAA">required</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">});</span></span>
<span class="line"></span>
<span class="line"><span style="color: #9CDCFE">private</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">validateToolCall</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">params</span><span style="color: #D4D4D4">: </span><span style="color: #9CDCFE">any</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> { </span><span style="color: #4FC1FF">error</span><span style="color: #D4D4D4">, </span><span style="color: #4FC1FF">value</span><span style="color: #D4D4D4"> } = </span><span style="color: #9CDCFE">toolCallSchema</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">validate</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">params</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">error</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">throw</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">Error</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">`Invalid tool call parameters: </span><span style="color: #569CD6">${</span><span style="color: #9CDCFE">error</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">details</span><span style="color: #D4D4D4">&#91;</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">&#93;.</span><span style="color: #9CDCFE">message</span><span style="color: #569CD6">}</span><span style="color: #CE9178">`</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">value</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<h3 class="wp-block-heading" id="graceful-error-responses"><strong>Graceful Error Responses</strong></h3>



<p>Your&nbsp;<strong>mcp server</strong>&nbsp;should always provide helpful error messages:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">TypeScript</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>private handleError(error: Error, context: string) {
  console.error(`Error in ${context}:`, error);
  
  return {
    content: &#91;{
      type: 'text',
      text: `I encountered an error while ${context}: ${error.message}`
    }&#93;,
    isError: true
  };
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #9CDCFE">private</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">handleError</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">error</span><span style="color: #D4D4D4">: </span><span style="color: #9CDCFE">Error</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">context</span><span style="color: #D4D4D4">: </span><span style="color: #9CDCFE">string</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">console</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">error</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">`Error in </span><span style="color: #569CD6">${</span><span style="color: #9CDCFE">context</span><span style="color: #569CD6">}</span><span style="color: #CE9178">:`</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">error</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">  </span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">content:</span><span style="color: #D4D4D4"> &#91;{</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">type:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;text&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">text:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">`I encountered an error while </span><span style="color: #569CD6">${</span><span style="color: #9CDCFE">context</span><span style="color: #569CD6">}</span><span style="color: #CE9178">: </span><span style="color: #569CD6">${</span><span style="color: #9CDCFE">error</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">message</span><span style="color: #569CD6">}</span><span style="color: #CE9178">`</span></span>
<span class="line"><span style="color: #D4D4D4">    }&#93;,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">isError:</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">true</span></span>
<span class="line"><span style="color: #D4D4D4">  };</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<h3 class="wp-block-heading" id="timeout-handling"><strong>Timeout Handling</strong></h3>



<p>Prevent your server from hanging on long-running operations:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">TypeScript</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>private async withTimeout&lt;T>(promise: Promise&lt;T>, timeoutMs: number): Promise&lt;T> {
  return Promise.race(&#91;
    promise,
    new Promise&lt;never>((_, reject) => 
      setTimeout(() => reject(new Error('Operation timed out')), timeoutMs)
    )
  &#93;);
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #9CDCFE">private</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">async</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">withTimeout</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">T</span><span style="color: #D4D4D4">&gt;(</span><span style="color: #9CDCFE">promise</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">Promise</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4FC1FF">T</span><span style="color: #D4D4D4">&gt;, </span><span style="color: #9CDCFE">timeoutMs</span><span style="color: #D4D4D4">: </span><span style="color: #9CDCFE">number</span><span style="color: #D4D4D4">): </span><span style="color: #4EC9B0">Promise</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4FC1FF">T</span><span style="color: #D4D4D4">&gt; {</span></span>
<span class="line"><span style="color: #D4D4D4">  return Promise.race(</span><span style="color: #9CDCFE">&#91;</span></span>
<span class="line"><span style="color: #9CDCFE">    promise,</span></span>
<span class="line"><span style="color: #9CDCFE">    </span><span style="color: #569CD6">new</span><span style="color: #9CDCFE"> </span><span style="color: #4EC9B0">Promise</span><span style="color: #9CDCFE">&lt;</span><span style="color: #4EC9B0">never</span><span style="color: #9CDCFE">&gt;((_, reject) </span><span style="color: #569CD6">=&gt;</span><span style="color: #9CDCFE"> </span></span>
<span class="line"><span style="color: #9CDCFE">      </span><span style="color: #DCDCAA">setTimeout</span><span style="color: #9CDCFE">(() </span><span style="color: #569CD6">=&gt;</span><span style="color: #9CDCFE"> </span><span style="color: #DCDCAA">reject</span><span style="color: #9CDCFE">(</span><span style="color: #569CD6">new</span><span style="color: #9CDCFE"> </span><span style="color: #DCDCAA">Error</span><span style="color: #9CDCFE">(</span><span style="color: #CE9178">&#39;Operation timed out&#39;</span><span style="color: #9CDCFE">)), timeoutMs)</span></span>
<span class="line"><span style="color: #9CDCFE">    )</span></span>
<span class="line"><span style="color: #9CDCFE">  &#93;);</span></span>
<span class="line"><span style="color: #9CDCFE">}</span></span></code></pre></div>



<h2 class="wp-block-heading" id="testing-your-mcp-server"><strong>Testing Your MCP Server</strong></h2>



<p>Testing is crucial for any reliable&nbsp;<strong>mcp server</strong>. Let’s set up comprehensive testing to ensure your server works correctly.</p>



<h3 class="wp-block-heading" id="unit-testing-setup"><strong>Unit Testing Setup</strong></h3>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">TypeScript</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>npm install --save-dev jest @types/jest ts-jest</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #9CDCFE">npm</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">install</span><span style="color: #D4D4D4"> --</span><span style="color: #9CDCFE">save</span><span style="color: #D4D4D4">-</span><span style="color: #9CDCFE">dev</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">jest</span><span style="color: #D4D4D4"> @</span><span style="color: #9CDCFE">types</span><span style="color: #D4D4D4">/</span><span style="color: #9CDCFE">jest</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">ts</span><span style="color: #D4D4D4">-</span><span style="color: #9CDCFE">jest</span></span></code></pre></div>



<p>Create a test file:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">TypeScript</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>// tests/server.test.ts
import { MyMCPServer } from '../src/server';

describe('MCP Server', () => {
  let server: MyMCPServer;
  
  beforeEach(() => {
    server = new MyMCPServer();
  });
  
  test('should calculate addition correctly', async () => {
    const result = await server.callTool('calculate', {
      operation: 'add',
      a: 5,
      b: 3
    });
    
    expect(result.content&#91;0&#93;.text).toContain('8');
  });
  
  test('should handle division by zero', async () => {
    const result = await server.callTool('calculate', {
      operation: 'divide',
      a: 10,
      b: 0
    });
    
    expect(result.content&#91;0&#93;.text).toContain('NaN');
  });
});</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">// tests/server.test.ts</span></span>
<span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> { </span><span style="color: #9CDCFE">MyMCPServer</span><span style="color: #D4D4D4"> } </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;../src/server&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">describe</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;MCP Server&#39;</span><span style="color: #D4D4D4">, () </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">let</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">server</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">MyMCPServer</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #DCDCAA">beforeEach</span><span style="color: #D4D4D4">(() </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">server</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">MyMCPServer</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">  });</span></span>
<span class="line"><span style="color: #D4D4D4">  </span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #DCDCAA">test</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;should calculate addition correctly&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">async</span><span style="color: #D4D4D4"> () </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">result</span><span style="color: #D4D4D4"> = </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">server</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">callTool</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;calculate&#39;</span><span style="color: #D4D4D4">, {</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">operation:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;add&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">a:</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">5</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">b:</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">3</span></span>
<span class="line"><span style="color: #D4D4D4">    });</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">expect</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">result</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">content</span><span style="color: #D4D4D4">&#91;</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">&#93;.</span><span style="color: #9CDCFE">text</span><span style="color: #D4D4D4">).</span><span style="color: #DCDCAA">toContain</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;8&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">  });</span></span>
<span class="line"><span style="color: #D4D4D4">  </span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #DCDCAA">test</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;should handle division by zero&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">async</span><span style="color: #D4D4D4"> () </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">result</span><span style="color: #D4D4D4"> = </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">server</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">callTool</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;calculate&#39;</span><span style="color: #D4D4D4">, {</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">operation:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;divide&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">a:</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">10</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">b:</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">0</span></span>
<span class="line"><span style="color: #D4D4D4">    });</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">expect</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">result</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">content</span><span style="color: #D4D4D4">&#91;</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">&#93;.</span><span style="color: #9CDCFE">text</span><span style="color: #D4D4D4">).</span><span style="color: #DCDCAA">toContain</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;NaN&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">  });</span></span>
<span class="line"><span style="color: #D4D4D4">});</span></span></code></pre></div>



<h3 class="wp-block-heading" id="integration-testing"><strong>Integration Testing</strong></h3>



<p>Test your&nbsp;<strong>mcp server</strong>&nbsp;with real MCP clients:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">TypeScript</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>// tests/integration.test.ts
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';

describe('MCP Server Integration', () => {
  test('should handle client connection', async () => {
    const server = new MyMCPServer();
    const transport = new StdioServerTransport();
    
    await expect(server.connect(transport)).resolves.not.toThrow();
  });
});</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">// tests/integration.test.ts</span></span>
<span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> { </span><span style="color: #9CDCFE">StdioServerTransport</span><span style="color: #D4D4D4"> } </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;@modelcontextprotocol/sdk/server/stdio.js&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">describe</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;MCP Server Integration&#39;</span><span style="color: #D4D4D4">, () </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #DCDCAA">test</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;should handle client connection&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">async</span><span style="color: #D4D4D4"> () </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">server</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">MyMCPServer</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">transport</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">StdioServerTransport</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">expect</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">server</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">connect</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">transport</span><span style="color: #D4D4D4">)).</span><span style="color: #9CDCFE">resolves</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">not</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">toThrow</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">  });</span></span>
<span class="line"><span style="color: #D4D4D4">});</span></span></code></pre></div>



<h2 class="wp-block-heading" id="advanced-configuration-options"><strong>Advanced Configuration Options</strong></h2>



<p>As your&nbsp;<strong>mcp server</strong>&nbsp;grows, you’ll need more sophisticated configuration options. Let’s explore advanced settings that give you greater control.</p>



<h3 class="wp-block-heading" id="environment-based-configuration"><strong>Environment-Based Configuration</strong></h3>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">TypeScript</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>// src/config.ts
export interface ServerConfig {
  port: number;
  environment: 'development' | 'production' | 'test';
  logLevel: 'debug' | 'info' | 'warn' | 'error';
  timeout: number;
  maxConnections: number;
}

export const config: ServerConfig = {
  port: parseInt(process.env.PORT || '3000'),
  environment: (process.env.NODE_ENV as any) || 'development',
  logLevel: (process.env.LOG_LEVEL as any) || 'info',
  timeout: parseInt(process.env.TIMEOUT || '30000'),
  maxConnections: parseInt(process.env.MAX_CONNECTIONS || '100')
};</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">// src/config.ts</span></span>
<span class="line"><span style="color: #C586C0">export</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">interface</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">ServerConfig</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">port</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">number</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">environment</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&#39;development&#39;</span><span style="color: #D4D4D4"> | </span><span style="color: #CE9178">&#39;production&#39;</span><span style="color: #D4D4D4"> | </span><span style="color: #CE9178">&#39;test&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">logLevel</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&#39;debug&#39;</span><span style="color: #D4D4D4"> | </span><span style="color: #CE9178">&#39;info&#39;</span><span style="color: #D4D4D4"> | </span><span style="color: #CE9178">&#39;warn&#39;</span><span style="color: #D4D4D4"> | </span><span style="color: #CE9178">&#39;error&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">timeout</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">number</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">maxConnections</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">number</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #C586C0">export</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">config</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">ServerConfig</span><span style="color: #D4D4D4"> = {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">port:</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">parseInt</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">process</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">env</span><span style="color: #D4D4D4">.</span><span style="color: #4FC1FF">PORT</span><span style="color: #D4D4D4"> || </span><span style="color: #CE9178">&#39;3000&#39;</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">environment:</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">process</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">env</span><span style="color: #D4D4D4">.</span><span style="color: #4FC1FF">NODE_ENV</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">as</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">any</span><span style="color: #D4D4D4">) || </span><span style="color: #CE9178">&#39;development&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">logLevel:</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">process</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">env</span><span style="color: #D4D4D4">.</span><span style="color: #4FC1FF">LOG_LEVEL</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">as</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">any</span><span style="color: #D4D4D4">) || </span><span style="color: #CE9178">&#39;info&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">timeout:</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">parseInt</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">process</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">env</span><span style="color: #D4D4D4">.</span><span style="color: #4FC1FF">TIMEOUT</span><span style="color: #D4D4D4"> || </span><span style="color: #CE9178">&#39;30000&#39;</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">maxConnections:</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">parseInt</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">process</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">env</span><span style="color: #D4D4D4">.</span><span style="color: #4FC1FF">MAX_CONNECTIONS</span><span style="color: #D4D4D4"> || </span><span style="color: #CE9178">&#39;100&#39;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">};</span></span></code></pre></div>



<h3 class="wp-block-heading" id="tool-configuration"><strong>Tool Configuration</strong></h3>



<p>Make your tools configurable:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">TypeScript</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>// src/tools/config.ts
export interface ToolConfig {
  calculator: {
    precision: number;
    maxValue: number;
  };
  fileSystem: {
    allowedPaths: string[];
    maxFileSize: number;
  };
  weather: {
    apiKey: string;
    cacheDuration: number;
  };
}

const toolConfig: ToolConfig = {
  calculator: {
    precision: 2,
    maxValue: Number.MAX_SAFE_INTEGER
  },
  fileSystem: {
    allowedPaths: &#91;'/tmp', '/uploads'&#93;,
    maxFileSize: 1024 * 1024 * 10 // 10MB
  },
  weather: {
    apiKey: process.env.WEATHER_API_KEY || '',
    cacheDuration: 5 * 60 * 1000 // 5 minutes
  }
};</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">// src/tools/config.ts</span></span>
<span class="line"><span style="color: #C586C0">export</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">interface</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">ToolConfig</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">calculator</span><span style="color: #D4D4D4">: {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">precision</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">number</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">maxValue</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">number</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">  };</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">fileSystem</span><span style="color: #D4D4D4">: {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">allowedPaths</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">string</span><span style="color: #D4D4D4">[];</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">maxFileSize</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">number</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">  };</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">weather</span><span style="color: #D4D4D4">: {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">apiKey</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">string</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">cacheDuration</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">number</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">  };</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">toolConfig</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">ToolConfig</span><span style="color: #D4D4D4"> = {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">calculator:</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">precision:</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">maxValue:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Number</span><span style="color: #D4D4D4">.MAX_SAFE_INTEGER</span></span>
<span class="line"><span style="color: #D4D4D4">  },</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">fileSystem:</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">allowedPaths:</span><span style="color: #D4D4D4"> &#91;</span><span style="color: #CE9178">&#39;/tmp&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;/uploads&#39;</span><span style="color: #D4D4D4">&#93;,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">maxFileSize:</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">1024</span><span style="color: #D4D4D4"> * </span><span style="color: #B5CEA8">1024</span><span style="color: #D4D4D4"> * </span><span style="color: #B5CEA8">10</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955">// 10MB</span></span>
<span class="line"><span style="color: #D4D4D4">  },</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">weather:</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">apiKey:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">process</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">env</span><span style="color: #D4D4D4">.</span><span style="color: #4FC1FF">WEATHER_API_KEY</span><span style="color: #D4D4D4"> || </span><span style="color: #CE9178">&#39;&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">cacheDuration:</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">5</span><span style="color: #D4D4D4"> * </span><span style="color: #B5CEA8">60</span><span style="color: #D4D4D4"> * </span><span style="color: #B5CEA8">1000</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955">// 5 minutes</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">};</span></span></code></pre></div>



<h2 class="wp-block-heading" id="security-best-practices"><strong>Security Best Practices</strong></h2>



<p>Security should never be an afterthought when building an&nbsp;<strong>mcp server</strong>. Let’s implement essential security measures to protect your server and users.</p>



<h3 class="wp-block-heading" id="authentication-and-authorization"><strong>Authentication and Authorization</strong></h3>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">TypeScript</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>// src/auth/middleware.ts
export class AuthMiddleware {
  private validTokens = new Set&lt;string>();
  
  validateToken(token: string): boolean {
    return this.validTokens.has(token);
  }
  
  requireAuth(handler: Function) {
    return async (request: any) => {
      const token = request.headers?.authorization?.replace('Bearer ', '');
      
      if (!token || !this.validateToken(token)) {
        throw new Error('Unauthorized: Invalid or missing token');
      }
      
      return await handler(request);
    };
  }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">// src/auth/middleware.ts</span></span>
<span class="line"><span style="color: #C586C0">export</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">AuthMiddleware</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">validTokens</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">Set</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">string</span><span style="color: #D4D4D4">&gt;();</span></span>
<span class="line"><span style="color: #D4D4D4">  </span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #DCDCAA">validateToken</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">token</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">string</span><span style="color: #D4D4D4">): </span><span style="color: #4EC9B0">boolean</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">validTokens</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">has</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">token</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">  </span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #DCDCAA">requireAuth</span><span style="color: #D4D4D4">(</span><span style="color: #DCDCAA">handler</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">Function</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">async</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">request</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">any</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">token</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">request</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">headers</span><span style="color: #D4D4D4">?.</span><span style="color: #9CDCFE">authorization</span><span style="color: #D4D4D4">?.</span><span style="color: #DCDCAA">replace</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;Bearer &#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">      </span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (!</span><span style="color: #9CDCFE">token</span><span style="color: #D4D4D4"> || !</span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">validateToken</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">token</span><span style="color: #D4D4D4">)) {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">throw</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">Error</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;Unauthorized: Invalid or missing token&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">      }</span></span>
<span class="line"><span style="color: #D4D4D4">      </span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">handler</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">request</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    };</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<h3 class="wp-block-heading" id="input-sanitization"><strong>Input Sanitization</strong></h3>



<p>Protect your&nbsp;<strong>mcp server</strong>&nbsp;from malicious inputs:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">TypeScript</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>import validator from 'validator';

function sanitizeString(input: string): string {
  return validator.escape(input.trim());
}

function validateFilePath(path: string): boolean {
  // Prevent directory traversal attacks
  return !path.includes('..') &amp;&amp; !path.includes('~');
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">validator</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;validator&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">sanitizeString</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">input</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">string</span><span style="color: #D4D4D4">): </span><span style="color: #4EC9B0">string</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">validator</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">escape</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">input</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">trim</span><span style="color: #D4D4D4">());</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">validateFilePath</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">path</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">string</span><span style="color: #D4D4D4">): </span><span style="color: #4EC9B0">boolean</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">// Prevent directory traversal attacks</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> !</span><span style="color: #9CDCFE">path</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">includes</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;..&#39;</span><span style="color: #D4D4D4">) &amp;&amp; !</span><span style="color: #9CDCFE">path</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">includes</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;~&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<h3 class="wp-block-heading" id="rate-limiting"><strong>Rate Limiting</strong></h3>



<p>Prevent abuse of your server:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">TypeScript</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>class RateLimiter {
  private requests = new Map&lt;string, number[]>();
  
  checkRateLimit(clientId: string, limit: number, windowMs: number): boolean {
    const now = Date.now();
    const clientRequests = this.requests.get(clientId) || [];
    
    // Remove old requests outside the window
    const validRequests = clientRequests.filter(time => now - time &lt; windowMs);
    
    if (validRequests.length >= limit) {
      return false; // Rate limit exceeded
    }
    
    validRequests.push(now);
    this.requests.set(clientId, validRequests);
    return true;
  }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">RateLimiter</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">requests</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">Map</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">string</span><span style="color: #D4D4D4">, </span><span style="color: #4EC9B0">number</span><span style="color: #D4D4D4">[]&gt;();</span></span>
<span class="line"><span style="color: #D4D4D4">  </span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #DCDCAA">checkRateLimit</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">clientId</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">string</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">limit</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">number</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">windowMs</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">number</span><span style="color: #D4D4D4">): </span><span style="color: #4EC9B0">boolean</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">now</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">Date</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">now</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">clientRequests</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">requests</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">get</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">clientId</span><span style="color: #D4D4D4">) || [];</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">// Remove old requests outside the window</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">validRequests</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">clientRequests</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">filter</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">time</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">now</span><span style="color: #D4D4D4"> - </span><span style="color: #9CDCFE">time</span><span style="color: #D4D4D4"> &lt; </span><span style="color: #9CDCFE">windowMs</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">validRequests</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">length</span><span style="color: #D4D4D4"> &gt;= </span><span style="color: #9CDCFE">limit</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">false</span><span style="color: #D4D4D4">; </span><span style="color: #6A9955">// Rate limit exceeded</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">validRequests</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">push</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">now</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">requests</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">set</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">clientId</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">validRequests</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">true</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<figure class="wp-block-image size-large"><a href="https://serveravatar.com?ref=blog" target="_blank" rel=" noreferrer noopener"><img decoding="async" width="1024" height="127" src="https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-1024x127.png" alt="Blog banner - ServerAvatar" class="wp-image-28184" srcset="https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-1024x127.png 1024w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-300x37.png 300w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-768x95.png 768w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-1536x190.png 1536w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-2048x254.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<h2 class="wp-block-heading" id="performance-optimization-techniques"><strong>Performance Optimization Techniques</strong></h2>



<p>A slow&nbsp;<strong>mcp server</strong>&nbsp;can frustrate users and waste resources. Let’s optimize your server for peak performance.</p>



<h3 class="wp-block-heading" id="caching-strategies"><strong>Caching Strategies</strong></h3>



<p>Implement intelligent caching to reduce response times:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">TypeScript</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>// src/cache/manager.ts
class CacheManager {
  private cache = new Map&lt;string, { data: any, expiry: number }>();
  
  set(key: string, data: any, ttlMs: number = 60000) {
    this.cache.set(key, {
      data,
      expiry: Date.now() + ttlMs
    });
  }
  
  get(key: string): any | null {
    const entry = this.cache.get(key);
    
    if (!entry || Date.now() > entry.expiry) {
      this.cache.delete(key);
      return null;
    }
    
    return entry.data;
  }
}

// Usage in your tools
const cacheManager = new CacheManager();

if (name === 'get-weather') {
  const cacheKey = `weather:${city}`;
  let weatherData = cacheManager.get(cacheKey);
  
  if (!weatherData) {
    weatherData = await fetchWeatherFromAPI(city);
    cacheManager.set(cacheKey, weatherData, 5 * 60 * 1000); // 5 minutes
  }
  
  return weatherData;
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">// src/cache/manager.ts</span></span>
<span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">CacheManager</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">cache</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">Map</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">string</span><span style="color: #D4D4D4">, { </span><span style="color: #9CDCFE">data</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">any</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">expiry</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">number</span><span style="color: #D4D4D4"> }&gt;();</span></span>
<span class="line"><span style="color: #D4D4D4">  </span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #DCDCAA">set</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">key</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">string</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">data</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">any</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">ttlMs</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">number</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">60000</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">cache</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">set</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">key</span><span style="color: #D4D4D4">, {</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">data</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">expiry:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Date</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">now</span><span style="color: #D4D4D4">() + </span><span style="color: #9CDCFE">ttlMs</span></span>
<span class="line"><span style="color: #D4D4D4">    });</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">  </span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #DCDCAA">get</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">key</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">string</span><span style="color: #D4D4D4">): </span><span style="color: #4EC9B0">any</span><span style="color: #D4D4D4"> | </span><span style="color: #4EC9B0">null</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">entry</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">cache</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">get</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">key</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (!</span><span style="color: #9CDCFE">entry</span><span style="color: #D4D4D4"> || </span><span style="color: #9CDCFE">Date</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">now</span><span style="color: #D4D4D4">() &gt; </span><span style="color: #9CDCFE">entry</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">expiry</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">cache</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">delete</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">key</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">null</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">entry</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">data</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">// Usage in your tools</span></span>
<span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">cacheManager</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">CacheManager</span><span style="color: #D4D4D4">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">name</span><span style="color: #D4D4D4"> === </span><span style="color: #CE9178">&#39;get-weather&#39;</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">cacheKey</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">`weather:</span><span style="color: #569CD6">${</span><span style="color: #9CDCFE">city</span><span style="color: #569CD6">}</span><span style="color: #CE9178">`</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">let</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">weatherData</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">cacheManager</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">get</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">cacheKey</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">  </span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (!</span><span style="color: #9CDCFE">weatherData</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">weatherData</span><span style="color: #D4D4D4"> = </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">fetchWeatherFromAPI</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">city</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">cacheManager</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">set</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">cacheKey</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">weatherData</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">5</span><span style="color: #D4D4D4"> * </span><span style="color: #B5CEA8">60</span><span style="color: #D4D4D4"> * </span><span style="color: #B5CEA8">1000</span><span style="color: #D4D4D4">); </span><span style="color: #6A9955">// 5 minutes</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">  </span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">weatherData</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<h3 class="wp-block-heading" id="connection-pooling"><strong>Connection Pooling</strong></h3>



<p>For database connections and external APIs:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">TypeScript</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>// src/db/pool.ts
import { Pool } from 'pg';

class DatabaseManager {
  private pool: Pool;
  
  constructor() {
    this.pool = new Pool({
      host: process.env.DB_HOST,
      port: parseInt(process.env.DB_PORT || '5432'),
      database: process.env.DB_NAME,
      user: process.env.DB_USER,
      password: process.env.DB_PASSWORD,
      max: 20, // Maximum number of connections
      idleTimeoutMillis: 30000,
      connectionTimeoutMillis: 2000
    });
  }
  
  async query(text: string, params?: any[]) {
    const client = await this.pool.connect();
    try {
      return await client.query(text, params);
    } finally {
      client.release();
    }
  }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">// src/db/pool.ts</span></span>
<span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> { </span><span style="color: #9CDCFE">Pool</span><span style="color: #D4D4D4"> } </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;pg&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">DatabaseManager</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">pool</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">Pool</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">constructor</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">pool</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">Pool</span><span style="color: #D4D4D4">({</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">host:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">process</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">env</span><span style="color: #D4D4D4">.</span><span style="color: #4FC1FF">DB_HOST</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">port:</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">parseInt</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">process</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">env</span><span style="color: #D4D4D4">.</span><span style="color: #4FC1FF">DB_PORT</span><span style="color: #D4D4D4"> || </span><span style="color: #CE9178">&#39;5432&#39;</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">database:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">process</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">env</span><span style="color: #D4D4D4">.</span><span style="color: #4FC1FF">DB_NAME</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">user:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">process</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">env</span><span style="color: #D4D4D4">.</span><span style="color: #4FC1FF">DB_USER</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">password:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">process</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">env</span><span style="color: #D4D4D4">.</span><span style="color: #4FC1FF">DB_PASSWORD</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">max:</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">20</span><span style="color: #D4D4D4">, </span><span style="color: #6A9955">// Maximum number of connections</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">idleTimeoutMillis:</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">30000</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">connectionTimeoutMillis:</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">2000</span></span>
<span class="line"><span style="color: #D4D4D4">    });</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">  </span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">async</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">query</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">text</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">string</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">params</span><span style="color: #D4D4D4">?: </span><span style="color: #4EC9B0">any</span><span style="color: #D4D4D4">[]) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">client</span><span style="color: #D4D4D4"> = </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">pool</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">connect</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">try</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">client</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">query</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">text</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">params</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    } </span><span style="color: #C586C0">finally</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">client</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">release</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<h3 class="wp-block-heading" id="asynchronous-processing"><strong>Asynchronous Processing</strong></h3>



<p>Handle heavy workloads without blocking:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">TypeScript</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>// src/queue/processor.ts
class TaskQueue {
  private queue: Array&lt;{ task: Function, resolve: Function, reject: Function }> = [];
  private processing = false;
  
  async add&lt;T>(task: () => Promise&lt;T>): Promise&lt;T> {
    return new Promise((resolve, reject) => {
      this.queue.push({ task, resolve, reject });
      this.process();
    });
  }
  
  private async process() {
    if (this.processing || this.queue.length === 0) return;
    
    this.processing = true;
    
    while (this.queue.length > 0) {
      const { task, resolve, reject } = this.queue.shift()!;
      
      try {
        const result = await task();
        resolve(result);
      } catch (error) {
        reject(error);
      }
    }
    
    this.processing = false;
  }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">// src/queue/processor.ts</span></span>
<span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">TaskQueue</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">queue</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">Array</span><span style="color: #D4D4D4">&lt;{ </span><span style="color: #DCDCAA">task</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">Function</span><span style="color: #D4D4D4">, </span><span style="color: #DCDCAA">resolve</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">Function</span><span style="color: #D4D4D4">, </span><span style="color: #DCDCAA">reject</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">Function</span><span style="color: #D4D4D4"> }&gt; = [];</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">processing</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">false</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">async</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">add</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">T</span><span style="color: #D4D4D4">&gt;(</span><span style="color: #DCDCAA">task</span><span style="color: #D4D4D4">: () </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Promise</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">T</span><span style="color: #D4D4D4">&gt;): </span><span style="color: #4EC9B0">Promise</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">T</span><span style="color: #D4D4D4">&gt; {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Promise</span><span style="color: #D4D4D4">((</span><span style="color: #9CDCFE">resolve</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">reject</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">queue</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">push</span><span style="color: #D4D4D4">({ </span><span style="color: #9CDCFE">task</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">resolve</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">reject</span><span style="color: #D4D4D4"> });</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">process</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    });</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">  </span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">async</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">process</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">processing</span><span style="color: #D4D4D4"> || </span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">queue</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">length</span><span style="color: #D4D4D4"> === </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">) </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">processing</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">true</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">while</span><span style="color: #D4D4D4"> (</span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">queue</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">length</span><span style="color: #D4D4D4"> &gt; </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> { </span><span style="color: #4FC1FF">task</span><span style="color: #D4D4D4">, </span><span style="color: #4FC1FF">resolve</span><span style="color: #D4D4D4">, </span><span style="color: #4FC1FF">reject</span><span style="color: #D4D4D4"> } = </span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">queue</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">shift</span><span style="color: #D4D4D4">()!;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #C586C0">try</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">result</span><span style="color: #D4D4D4"> = </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">task</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">resolve</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">result</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">      } </span><span style="color: #C586C0">catch</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">error</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">reject</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">error</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">      }</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">processing</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">false</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<h2 class="wp-block-heading" id="deployment-strategies"><strong>Deployment Strategies</strong></h2>



<p>Your&nbsp;<strong>mcp server</strong>&nbsp;is ready for the world! Let’s explore different deployment options to get your server running in production.</p>



<h3 class="wp-block-heading" id="docker-deployment"><strong>Docker Deployment</strong></h3>



<p>Create a Dockerfile for containerized deployment:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Dockerfile</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># Dockerfile
FROM node:18-alpine

WORKDIR /app

COPY package*.json ./
RUN npm ci --only=production

COPY dist/ ./dist/

EXPOSE 3000

USER node

CMD &#91;"node", "dist/server.js"&#93;</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955"># Dockerfile</span></span>
<span class="line"><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> node:18-alpine</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">WORKDIR</span><span style="color: #D4D4D4"> /app</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">COPY</span><span style="color: #D4D4D4"> package*.json ./</span></span>
<span class="line"><span style="color: #569CD6">RUN</span><span style="color: #D4D4D4"> npm ci --only=production</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">COPY</span><span style="color: #D4D4D4"> dist/ ./dist/</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">EXPOSE</span><span style="color: #D4D4D4"> 3000</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">USER</span><span style="color: #D4D4D4"> node</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">CMD</span><span style="color: #D4D4D4"> &#91;</span><span style="color: #CE9178">&quot;node&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&quot;dist/server.js&quot;</span><span style="color: #D4D4D4">&#93;</span></span></code></pre></div>



<h3 class="wp-block-heading" id="environment-configuration"><strong>Environment Configuration</strong></h3>



<p>Create different environment files:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Plaintext</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># .env.production
NODE_ENV=production
PORT=3000
LOG_LEVEL=info
DB_HOST=production-db.example.com
WEATHER_API_KEY=your-production-key

# .env.development
NODE_ENV=development
PORT=3001
LOG_LEVEL=debug
DB_HOST=localhost
WEATHER_API_KEY=your-dev-key</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4"># .env.production</span></span>
<span class="line"><span style="color: #D4D4D4">NODE_ENV=production</span></span>
<span class="line"><span style="color: #D4D4D4">PORT=3000</span></span>
<span class="line"><span style="color: #D4D4D4">LOG_LEVEL=info</span></span>
<span class="line"><span style="color: #D4D4D4">DB_HOST=production-db.example.com</span></span>
<span class="line"><span style="color: #D4D4D4">WEATHER_API_KEY=your-production-key</span></span>
<span class="line"><span style="color: #D4D4D4"></span></span>
<span class="line"><span style="color: #D4D4D4"># .env.development</span></span>
<span class="line"><span style="color: #D4D4D4">NODE_ENV=development</span></span>
<span class="line"><span style="color: #D4D4D4">PORT=3001</span></span>
<span class="line"><span style="color: #D4D4D4">LOG_LEVEL=debug</span></span>
<span class="line"><span style="color: #D4D4D4">DB_HOST=localhost</span></span>
<span class="line"><span style="color: #D4D4D4">WEATHER_API_KEY=your-dev-key</span></span></code></pre></div>



<h3 class="wp-block-heading" id="process-management"><strong>Process Management</strong></h3>



<p>Use PM2 for production process management:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">JavaScript</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>// ecosystem.config.js
module.exports = {
  apps: &#91;{
    name: 'mcp-server',
    script: 'dist/server.js',
    instances: 'max',
    exec_mode: 'cluster',
    env: {
      NODE_ENV: 'production',
      PORT: 3000
    },
    error_file: './logs/err.log',
    out_file: './logs/out.log',
    log_file: './logs/combined.log'
  }&#93;
};</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">// ecosystem.config.js</span></span>
<span class="line"><span style="color: #4EC9B0">module</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">exports</span><span style="color: #D4D4D4"> = {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">apps:</span><span style="color: #D4D4D4"> &#91;{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">name:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;mcp-server&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">script:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;dist/server.js&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">instances:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;max&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">exec_mode:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;cluster&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">env:</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">NODE_ENV:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;production&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">PORT:</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">3000</span></span>
<span class="line"><span style="color: #D4D4D4">    },</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">error_file:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;./logs/err.log&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">out_file:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;./logs/out.log&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">log_file:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;./logs/combined.log&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">  }&#93;</span></span>
<span class="line"><span style="color: #D4D4D4">};</span></span></code></pre></div>



<h2 class="wp-block-heading" id="troubleshooting-common-issues"><strong>Troubleshooting Common Issues</strong></h2>



<p>Even the best&nbsp;<strong>mcp server</strong>&nbsp;can encounter problems. Here’s how to diagnose and fix common issues.</p>



<h3 class="wp-block-heading" id="connection-problems"><strong>Connection Problems</strong></h3>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">TypeScript</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>// Debug connection issues
private debugConnection(transport: any) {
  transport.onError((error: Error) => {
    console.error('Transport error:', error);
    this.reconnect();
  });
  
  transport.onClose(() => {
    console.log('Connection closed, attempting reconnect...');
    setTimeout(() => this.reconnect(), 5000);
  });
}

private async reconnect() {
  try {
    await this.start();
    console.log('Reconnected successfully');
  } catch (error) {
    console.error('Reconnection failed:', error);
    setTimeout(() => this.reconnect(), 10000);
  }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">// Debug connection issues</span></span>
<span class="line"><span style="color: #9CDCFE">private</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">debugConnection</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">transport</span><span style="color: #D4D4D4">: </span><span style="color: #9CDCFE">any</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">transport</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">onError</span><span style="color: #D4D4D4">((</span><span style="color: #9CDCFE">error</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">Error</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">console</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">error</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;Transport error:&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">error</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">reconnect</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">  });</span></span>
<span class="line"><span style="color: #D4D4D4">  </span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">transport</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">onClose</span><span style="color: #D4D4D4">(() </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">console</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">log</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;Connection closed, attempting reconnect...&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">setTimeout</span><span style="color: #D4D4D4">(() </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">reconnect</span><span style="color: #D4D4D4">(), </span><span style="color: #B5CEA8">5000</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">  });</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #9CDCFE">private</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">async</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">reconnect</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">try</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">start</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">console</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">log</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;Reconnected successfully&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">  } </span><span style="color: #C586C0">catch</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">error</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">console</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">error</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;Reconnection failed:&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">error</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">setTimeout</span><span style="color: #D4D4D4">(() </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">reconnect</span><span style="color: #D4D4D4">(), </span><span style="color: #B5CEA8">10000</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<h3 class="wp-block-heading" id="memory-management"><strong>Memory Management</strong></h3>



<p>Monitor and manage memory usage:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">JavaScript</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>// Memory monitoring
setInterval(() => {
  const usage = process.memoryUsage();
  console.log('Memory usage:', {
    rss: Math.round(usage.rss / 1024 / 1024) + 'MB',
    heapUsed: Math.round(usage.heapUsed / 1024 / 1024) + 'MB',
    heapTotal: Math.round(usage.heapTotal / 1024 / 1024) + 'MB'
  });
  
  // Alert if memory usage is too high
  if (usage.heapUsed > 500 * 1024 * 1024) { // 500MB
    console.warn('High memory usage detected!');
  }
}, 30000);</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">// Memory monitoring</span></span>
<span class="line"><span style="color: #DCDCAA">setInterval</span><span style="color: #D4D4D4">(() </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">usage</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">process</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">memoryUsage</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">console</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">log</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;Memory usage:&#39;</span><span style="color: #D4D4D4">, {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">rss:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Math</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">round</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">usage</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">rss</span><span style="color: #D4D4D4"> / </span><span style="color: #B5CEA8">1024</span><span style="color: #D4D4D4"> / </span><span style="color: #B5CEA8">1024</span><span style="color: #D4D4D4">) + </span><span style="color: #CE9178">&#39;MB&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">heapUsed:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Math</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">round</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">usage</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">heapUsed</span><span style="color: #D4D4D4"> / </span><span style="color: #B5CEA8">1024</span><span style="color: #D4D4D4"> / </span><span style="color: #B5CEA8">1024</span><span style="color: #D4D4D4">) + </span><span style="color: #CE9178">&#39;MB&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">heapTotal:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Math</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">round</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">usage</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">heapTotal</span><span style="color: #D4D4D4"> / </span><span style="color: #B5CEA8">1024</span><span style="color: #D4D4D4"> / </span><span style="color: #B5CEA8">1024</span><span style="color: #D4D4D4">) + </span><span style="color: #CE9178">&#39;MB&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">  });</span></span>
<span class="line"><span style="color: #D4D4D4">  </span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">// Alert if memory usage is too high</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">usage</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">heapUsed</span><span style="color: #D4D4D4"> &gt; </span><span style="color: #B5CEA8">500</span><span style="color: #D4D4D4"> * </span><span style="color: #B5CEA8">1024</span><span style="color: #D4D4D4"> * </span><span style="color: #B5CEA8">1024</span><span style="color: #D4D4D4">) { </span><span style="color: #6A9955">// 500MB</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">console</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">warn</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;High memory usage detected!&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">}, </span><span style="color: #B5CEA8">30000</span><span style="color: #D4D4D4">);</span></span></code></pre></div>



<h3 class="wp-block-heading" id="logging-and-debugging"><strong>Logging and Debugging</strong></h3>



<p>Implement comprehensive logging:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">TypeScript</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>// src/utils/logger.ts
import winston from 'winston';

export const logger = winston.createLogger({
  level: process.env.LOG_LEVEL || 'info',
  format: winston.format.combine(
    winston.format.timestamp(),
    winston.format.errors({ stack: true }),
    winston.format.json()
  ),
  transports: &#91;
    new winston.transports.File({ filename: 'error.log', level: 'error' }),
    new winston.transports.File({ filename: 'combined.log' }),
    new winston.transports.Console({
      format: winston.format.simple()
    })
  &#93;
});</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">// src/utils/logger.ts</span></span>
<span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">winston</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;winston&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #C586C0">export</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">logger</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">winston</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">createLogger</span><span style="color: #D4D4D4">({</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">level:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">process</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">env</span><span style="color: #D4D4D4">.</span><span style="color: #4FC1FF">LOG_LEVEL</span><span style="color: #D4D4D4"> || </span><span style="color: #CE9178">&#39;info&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">format:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">winston</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">format</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">combine</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">winston</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">format</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">timestamp</span><span style="color: #D4D4D4">(),</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">winston</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">format</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">errors</span><span style="color: #D4D4D4">({ </span><span style="color: #9CDCFE">stack:</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">true</span><span style="color: #D4D4D4"> }),</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">winston</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">format</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">json</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">  ),</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">transports:</span><span style="color: #D4D4D4"> &#91;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">winston</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">transports</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">File</span><span style="color: #D4D4D4">({ </span><span style="color: #9CDCFE">filename:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;error.log&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">level:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;error&#39;</span><span style="color: #D4D4D4"> }),</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">winston</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">transports</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">File</span><span style="color: #D4D4D4">({ </span><span style="color: #9CDCFE">filename:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;combined.log&#39;</span><span style="color: #D4D4D4"> }),</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">winston</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">transports</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Console</span><span style="color: #D4D4D4">({</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">format:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">winston</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">format</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">simple</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">    })</span></span>
<span class="line"><span style="color: #D4D4D4">  &#93;</span></span>
<span class="line"><span style="color: #D4D4D4">});</span></span></code></pre></div>



<p><strong>Github Repository:</strong> <a href="https://github.com/srvrsoorg/my-mcp-server" title="">srvrsoorg/my-mcp-server</a></p>



<h2 class="wp-block-heading" id="conclusion">Conclusion</h2>



<p>Congratulations! You’ve just learned how to build a comprehensive&nbsp;<strong>mcp server</strong>&nbsp;in Node.js from the ground up. We’ve covered everything from basic setup to advanced deployment strategies, giving you the tools and knowledge needed to create robust, scalable MCP servers.</p>



<p>Remember, building a great&nbsp;<strong>mcp server</strong>&nbsp;is like learning to cook &#8211; you start with basic recipes and gradually add your own flavors and techniques. The foundation we’ve built here will serve you well as you expand your server’s capabilities and tackle more complex use cases.</p>



<p>Your&nbsp;<strong>mcp server</strong>&nbsp;is now ready to bridge the gap between AI models and the tools they need to be truly useful. Whether you’re building internal tools for your team or creating public APIs for the broader developer community, the principles and patterns we’ve discussed will help you create servers that are secure, performant, and maintainable.</p>



<p>Keep experimenting, keep learning, and most importantly, keep building amazing things with your new&nbsp;<strong>mcp server</strong>&nbsp;skills!</p>



<h2 class="wp-block-heading" id="frequently-asked-questions-faqs">Frequently Asked Questions (FAQs)</h2>



<div data-schema-only="false" class="wp-block-aioseo-faq"><h3 class="aioseo-faq-block-question"><strong>What exactly is an MCP server and how does it differ from a regular web server?</strong></h3><div class="aioseo-faq-block-answer">
<p>An&nbsp;<strong>mcp server</strong>&nbsp;is specifically designed to implement the Model Context Protocol, which enables AI models to interact with external tools and resources. Unlike regular web servers that primarily handle HTTP requests from browsers, an MCP server facilitates communication between AI models and various tools, databases, or services through a standardized protocol. Think of it as a specialized translator that helps AI understand and use external capabilities.</p>
</div></div>



<div data-schema-only="false" class="wp-block-aioseo-faq"><h3 class="aioseo-faq-block-question"><strong>Do I need extensive Node.js experience to build an MCP server?</strong></h3><div class="aioseo-faq-block-answer">
<p>While basic Node.js knowledge is helpful, you don’t need to be an expert to build a functional&nbsp;<strong>mcp server</strong>. The MCP SDK handles much of the complexity for you. If you understand JavaScript fundamentals, can work with async/await patterns, and are comfortable with package management, you’ll be able to follow this guide successfully. The key is starting simple and gradually adding more sophisticated features as you learn.</p>
</div></div>



<div data-schema-only="false" class="wp-block-aioseo-faq"><h3 class="aioseo-faq-block-question"><strong>Can my MCP server handle multiple AI models simultaneously?</strong></h3><div class="aioseo-faq-block-answer">
<p>Absolutely! A well-designed&nbsp;<strong>mcp server</strong>&nbsp;can handle multiple client connections simultaneously, whether they’re different AI models or multiple instances of the same model. The server manages each connection independently, so one client’s operations won’t interfere with another’s. Just ensure you implement proper connection management and consider resource usage when dealing with many concurrent clients.</p>
</div></div>



<div data-schema-only="false" class="wp-block-aioseo-faq"><h3 class="aioseo-faq-block-question"><strong>How do I secure my MCP server against unauthorized access?</strong></h3><div class="aioseo-faq-block-answer">
<p>Security for your&nbsp;<strong>mcp server</strong>&nbsp;involves multiple layers: implement authentication tokens to verify client identity, use input validation to prevent malicious data, apply rate limiting to prevent abuse, sanitize all inputs to avoid injection attacks, and use HTTPS for encrypted communication. Additionally, limit file system access to specific directories and regularly update your dependencies to patch security vulnerabilities.</p>
</div></div>



<div data-schema-only="false" class="wp-block-aioseo-faq"><h3 class="aioseo-faq-block-question"><strong>What’s the best way to debug issues with my MCP server?</strong></h3><div class="aioseo-faq-block-answer">
<p>Effective debugging of an&nbsp;<strong>mcp server</strong>&nbsp;starts with comprehensive logging &#8211; log all incoming requests, outgoing responses, and any errors that occur. Use structured logging with different levels (debug, info, warn, error) so you can adjust verbosity as needed. Implement health check endpoints to monitor server status, use debugging tools like Node.js inspector for step-through debugging, and create unit tests for individual components. Most importantly, test with real MCP clients to identify integration issues early.</p>
</div></div>



<div style="font-family: 'Public Sans', sans-serif; background: #fff; border: 1px solid #e1eaff; padding: 40px 35px; border-radius: 16px; margin: 60px 0; box-shadow: 0 10px 32px rgba(0, 0, 0, 0.05); max-width: 860px; margin-left: auto; margin-right: auto; text-align: center;">

  <h2 style="font-size: 28px; font-weight: 800; color: #0b2b53; margin-top: 0; margin-bottom: 16px;">
    Stop Wasting Time on Servers. Start Building Instead.
  </h2>

  <p style="font-size: 17px; color: #333; font-weight: 500; margin: 0 0 12px;">
    You didn’t start your project to babysit servers.
    Let <strong>ServerAvatar</strong> handle deployment, monitoring, and backups — so you can focus on growth.
  </p>

  <p style="font-size: 16px; color: #555; font-weight: 400; margin-bottom: 24px;">
    Deploy <strong>WordPress, Laravel, N8N</strong>, and more in minutes.
    No DevOps required. No command line. No stress.
  </p>

  <div style="display: inline-flex; justify-content: center; gap: 10px; flex-wrap: wrap; margin-bottom: 16px;">
    <a href="https://app.serveravatar.com" target="_blank" rel="noopener"
       style="background: linear-gradient(135deg, #007bff, #0056d2); color: #fff; text-decoration: none; padding: 10px 20px; font-size: 14px; font-weight: 600; border-radius: 8px; text-align: center;">
      🚀 Try Free
    </a>
    <a href="https://serveravatar.com/" target="_blank" rel="noopener"
       style="background: #f5f9ff; color: #0056d2; text-decoration: none; padding: 10px 20px; font-size: 14px; font-weight: 600; border-radius: 8px; border: 1px solid #d2e3ff; text-align: center;">
      🌐 Learn More
    </a>
  </div>

  <p style="font-size: 14px; color: #888; margin-top: 10px;">
    Trusted by 10,000+ developers and growing.
  </p>
</div><p>The post <a href="https://serveravatar.com/create-mcp-server-nodejs/">Create MCP Server in Node.js: Step-by-Step Guide</a> first appeared on <a href="https://serveravatar.com">ServerAvatar</a>.</p>]]></content:encoded>
					
		
		<enclosure url="https://serveravatar.com/wp-content/uploads/2025/09/RecordRTC-202589-g4qba6ocrn.webm" length="3061600" type="video/webm" />

			</item>
		<item>
		<title>How to Upgrade Node: Beginner&#8217;s Tutorial</title>
		<link>https://serveravatar.com/upgrade-node/</link>
		
		<dc:creator><![CDATA[Meghna Meghwani]]></dc:creator>
		<pubDate>Tue, 22 Jul 2025 11:32:05 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Node.js]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[How to Update Node]]></category>
		<category><![CDATA[Node.js Tutorial]]></category>
		<category><![CDATA[Node.js Upgrade Guide]]></category>
		<category><![CDATA[Server Management]]></category>
		<category><![CDATA[Upgrade Node]]></category>
		<guid isPermaLink="false">https://serveravatar.com/?p=26496</guid>

					<description><![CDATA[<p>Upgrade Node might sound like a technical chore, but it is actually as easy as updating your phone’s software, once you know where to tap and how to do it. Whether you&#8217;re building websites, apps, or scripts, staying updated is the key to better speed, security, and features. In this beginner&#8217;s tutorial, we’ll walk you [&#8230;]</p>
<p>The post <a href="https://serveravatar.com/upgrade-node/">How to Upgrade Node: Beginner’s Tutorial</a> first appeared on <a href="https://serveravatar.com">ServerAvatar</a>.</p>]]></description>
										<content:encoded><![CDATA[<figure class="wp-block-image size-large"><a href="https://serveravatar.com?ref=blog" target="_blank" rel=" noreferrer noopener"><img decoding="async" width="1024" height="127" src="https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-1024x127.png" alt="Blog banner - ServerAvatar" class="wp-image-28182" srcset="https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-1024x127.png 1024w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-300x37.png 300w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-768x95.png 768w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-1536x190.png 1536w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-2048x253.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p><strong>Upgrade Node</strong> might sound like a technical chore, but it is actually as easy as updating your phone’s software, once you know where to tap and how to do it. Whether you&#8217;re building websites, apps, or scripts, staying updated is the key to better speed, security, and features.</p>



<p>In this beginner&#8217;s tutorial, we’ll walk you through everything you need to know about upgrading Node.js on your system, step by step, with no complex technical talks. Think of this as your friendly tour guide through the Node upgrade process. Let’s dive in!</p>



<h2 class="wp-block-heading">What Is Node.js and Why Upgrade?</h2>



<p><strong>Node.js</strong>&nbsp;is like the engine of a train for many web applications. It powers everything behind the scenes, from real-time messaging to running backend scripts. But like any engine, it needs regular updates to perform better, fix bugs, and add new capabilities.</p>



<h2 class="wp-block-heading">Why should you upgrade?</h2>



<ul class="wp-block-list">
<li>New features that can save you time</li>



<li>Security patches update to protect your code</li>



<li>Performance improvements</li>



<li>Compatibility with modern packages</li>
</ul>



<h2 class="wp-block-heading">How to Check Your Current Node.js Version</h2>



<p>Before upgrading, it’s smart to know where you stand. Let&#8217;s check out the current version installed on your system, just enter the below command by opening terminal:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Bash</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>node -v</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">node</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-v</span></span></code></pre></div>



<p>You’ll see your current node version as an output. As you can see in the screenshot below.<br><a href="https://storage.3.basecamp.com/5840738/blobs/3f023ff4-661e-11f0-acf6-0242ac120004/download/image.png" target="_blank" rel="noreferrer noopener"></a></p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="55" src="https://serveravatar.com/wp-content/uploads/2025/07/image-2025-07-22T151413.027-1024x55.png" alt="Check Nod.js Version" class="wp-image-26497" srcset="https://serveravatar.com/wp-content/uploads/2025/07/image-2025-07-22T151413.027-1024x55.png 1024w, https://serveravatar.com/wp-content/uploads/2025/07/image-2025-07-22T151413.027-300x16.png 300w, https://serveravatar.com/wp-content/uploads/2025/07/image-2025-07-22T151413.027-768x41.png 768w, https://serveravatar.com/wp-content/uploads/2025/07/image-2025-07-22T151413.027.png 1489w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">Common Reasons People Upgrade Node.js</h2>



<p>Still wondering if it is really necessary? Here are a few popular reasons that you should know:</p>



<ul class="wp-block-list">
<li><strong>Outdated tools:</strong>&nbsp;New packages needs newer Node versions</li>



<li><strong>Security risks:</strong>&nbsp;Old versions are vulnerable to known threats</li>



<li><strong>Speed:</strong>&nbsp;Updates often include performance improvements</li>



<li><strong>Better developer experience:</strong>&nbsp;New features can simplify your workflow</li>
</ul>



<p>Think of it like upgrading your car&#8217;s engine, it will be smoother, faster, and more secure than previous one.</p>



<h2 class="wp-block-heading">Tools for Node Version Management&nbsp;</h2>



<p>Managing your Node.js versions can be very difficult. However, if you have right tools, it can be very easy with tools. Popular tools includes &#8220;NVM&#8221; (Node Version Manager), &#8220;NPM&#8221; (Node Package Manager), and other version managers such as &#8220;N&#8221;. These tools allow you to switch between different Node versions easily, ensuring your environment is set up for every project you&#8217;re working on.</p>



<p><strong>Some popular Node Version Manager tools:</strong></p>



<ul class="wp-block-list">
<li><strong>NVM (Node Version Manager):&nbsp;</strong>NVM is ideal for managing multiple Node versions on your system.</li>



<li><strong>NPM:</strong>&nbsp;NPM comes pre-installed with Node. However, it can assist you with managing packages.</li>



<li><strong>N:</strong>&nbsp;N is a simple version manager for Node.js</li>
</ul>



<h2 class="wp-block-heading">Preparing for the Update</h2>



<p>Upgrading without preparation is like changing tires without parking the car first. Here&#8217;s how to get ready:</p>



<ul class="wp-block-list">
<li><strong>Check your dependencies</strong>&nbsp;</li>



<li><strong>Read the changelog</strong>&nbsp;on Node.js official site</li>
</ul>



<h2 class="wp-block-heading">Methods to update Node.js and NPM:</h2>



<ul class="wp-block-list">
<li><strong>Method 1:&nbsp;</strong>Using NVM (Node Version Manager)</li>



<li><strong>Method 2:</strong>&nbsp;Use Node.js Installer for Windows &amp; macOS</li>



<li><strong>Method 3:&nbsp;</strong>Upgrade Node.js on Linux</li>



<li><strong>Method 4:&nbsp;</strong>Using Homebrew on macOS</li>



<li><strong>Method 5:&nbsp;</strong>Using&nbsp;<a href="https://serveravatar.com/" target="_blank" rel="noreferrer noopener">ServerAvatar</a></li>
</ul>



<h2 class="wp-block-heading">Method 1:&nbsp; Using NVM (Node Version Manager)</h2>



<p><strong>Step 1:&nbsp;</strong>Check the current version of NVM by entering below command on terminal:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Bash</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>nvm -v</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">nvm</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-v</span></span></code></pre></div>



<p><strong>Step 2:&nbsp;</strong>Use below command for install and update Node to latest version.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Bash</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>nvm install node</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">nvm</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">install</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">node</span></span></code></pre></div>



<p>The installation process is mentioned in the image below:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="112" src="https://serveravatar.com/wp-content/uploads/2025/07/image-2025-07-22T151653.343-1024x112.png" alt="Node Version Manager" class="wp-image-26498" srcset="https://serveravatar.com/wp-content/uploads/2025/07/image-2025-07-22T151653.343-1024x112.png 1024w, https://serveravatar.com/wp-content/uploads/2025/07/image-2025-07-22T151653.343-300x33.png 300w, https://serveravatar.com/wp-content/uploads/2025/07/image-2025-07-22T151653.343-768x84.png 768w, https://serveravatar.com/wp-content/uploads/2025/07/image-2025-07-22T151653.343-1536x168.png 1536w, https://serveravatar.com/wp-content/uploads/2025/07/image-2025-07-22T151653.343.png 1910w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>This is easiest and safest way for most of the users who want to upgrade node version for system.</p>



<p><strong>Step 3:&nbsp;</strong>Set this as your default version by using the below mentioned command:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Bash</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>nvm use node
nvm alias default node</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">nvm</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">use</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">node</span></span>
<span class="line"><span style="color: #DCDCAA">nvm</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">alias</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">default</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">node</span></span></code></pre></div>



<p>That’s it! You have got the newest Node running.</p>



<h2 class="wp-block-heading">Method 2: Use Node.js Installer for Windows &amp; macOS</h2>



<p>Generally, windows does not support NVM. However, follow steps mentioned below to install node.js on Windows or MacOS.</p>



<p><strong>Step 1:&nbsp;</strong>Download node.js Installer by navigating to the&nbsp;<a href="https://nodejs.org/en" target="_blank" rel="noreferrer noopener">official website</a>&nbsp;of&nbsp;<a href="https://nodejs.org/en" target="_blank" rel="noreferrer noopener">Node.js</a>.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="562" src="https://serveravatar.com/wp-content/uploads/2025/07/image-2025-07-22T151802.211-1024x562.png" alt="Upgrade Node" class="wp-image-26499" srcset="https://serveravatar.com/wp-content/uploads/2025/07/image-2025-07-22T151802.211-1024x562.png 1024w, https://serveravatar.com/wp-content/uploads/2025/07/image-2025-07-22T151802.211-300x165.png 300w, https://serveravatar.com/wp-content/uploads/2025/07/image-2025-07-22T151802.211-768x421.png 768w, https://serveravatar.com/wp-content/uploads/2025/07/image-2025-07-22T151802.211.png 1444w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p><strong>Step 2:&nbsp;</strong>Run the installer by opening the installer that is just downloaded, and follow the step-by-step instructions to complete the installation process.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="720" height="466" src="https://serveravatar.com/wp-content/uploads/2025/07/image-2025-07-22T151832.491.png" alt="Node Setup" class="wp-image-26500" srcset="https://serveravatar.com/wp-content/uploads/2025/07/image-2025-07-22T151832.491.png 720w, https://serveravatar.com/wp-content/uploads/2025/07/image-2025-07-22T151832.491-300x194.png 300w" sizes="auto, (max-width: 720px) 100vw, 720px" /></figure>



<p><strong>Step 3:&nbsp;</strong>Verify Installation.</p>



<p>Now let&#8217;s checkout the process to upgrade<strong>&nbsp;</strong>the&nbsp;<strong>NPM&nbsp;</strong>using<strong>&nbsp;</strong>the npm:</p>



<p><strong>Step 4:</strong>&nbsp;You can install the latest version of npm by using the below given command:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Bash</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>npm install -g npm@latest</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">npm</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">install</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-g</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">npm@latest</span></span></code></pre></div>



<p><strong>Step 5:&nbsp;</strong>check out installed npm version by entering below mentioned command:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Bash</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>npm -v</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">npm</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-v</span></span></code></pre></div>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="720" height="35" src="https://serveravatar.com/wp-content/uploads/2025/07/image-2025-07-22T151945.522.png" alt="ServerAvatar" class="wp-image-26501" srcset="https://serveravatar.com/wp-content/uploads/2025/07/image-2025-07-22T151945.522.png 720w, https://serveravatar.com/wp-content/uploads/2025/07/image-2025-07-22T151945.522-300x15.png 300w" sizes="auto, (max-width: 720px) 100vw, 720px" /></figure>



<p>Simple, right?</p>



<figure class="wp-block-image size-large"><a href="https://serveravatar.com?ref=blog" target="_blank" rel=" noreferrer noopener"><img loading="lazy" decoding="async" width="1024" height="127" src="https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-1024x127.png" alt="Blog banner - ServerAvatar" class="wp-image-28184" srcset="https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-1024x127.png 1024w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-300x37.png 300w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-768x95.png 768w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-1536x190.png 1536w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-2048x254.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<h2 class="wp-block-heading">Method 3: Upgrade Node.js for Linux Systems</h2>



<p><strong>Step 1:&nbsp;</strong>Linux users can direct use NVM (recommended) or package manager like &#8220;apt&#8221; for installation and update of node.js.</p>



<p>APT is used for Debian and Ubuntu systems. Run the below command to install node using APT:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Bash</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>sudo apt update
sudo apt install nodejs npm</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">sudo</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">apt</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">update</span></span>
<span class="line"><span style="color: #DCDCAA">sudo</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">apt</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">install</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">nodejs</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">npm</span></span></code></pre></div>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="102" src="https://serveravatar.com/wp-content/uploads/2025/07/image-2025-07-22T152051.860-1024x102.png" alt="ServerAvatar" class="wp-image-26502" srcset="https://serveravatar.com/wp-content/uploads/2025/07/image-2025-07-22T152051.860-1024x102.png 1024w, https://serveravatar.com/wp-content/uploads/2025/07/image-2025-07-22T152051.860-300x30.png 300w, https://serveravatar.com/wp-content/uploads/2025/07/image-2025-07-22T152051.860-768x76.png 768w, https://serveravatar.com/wp-content/uploads/2025/07/image-2025-07-22T152051.860-1536x153.png 1536w, https://serveravatar.com/wp-content/uploads/2025/07/image-2025-07-22T152051.860.png 1903w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p><strong>Step 2:&nbsp;</strong>Check the version of node and npm on your system by using the below command:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Bash</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>node -v
npm -v</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">node</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-v</span></span>
<span class="line"><span style="color: #DCDCAA">npm</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-v</span></span></code></pre></div>



<h2 class="wp-block-heading">Method 4: Using Homebrew on macOS</h2>



<p>Let&#8217;s see the installation on macOS using Homebrew, that is a popular package manager useful for only macOS. Homebrew used for macOS to simplifying the process of managing installations, including Node.js.</p>



<p><strong>Step 1:</strong>&nbsp;First, let&#8217;s install &#8220;Homebrew&#8221; from it&#8217;s official website:&nbsp;<a href="https://brew.sh/" target="_blank" rel="noreferrer noopener">brew.sh</a>, follow the below step-by-step installation process.</p>



<p><strong>Step 2:</strong>&nbsp;Let&#8217;s update brew using the below command:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Bash</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>brew update</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">brew</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">update</span></span></code></pre></div>



<p><strong>Step 3:&nbsp;</strong>Use below mentioned command for installing Node.js:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Bash</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>brew install node</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">brew</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">install</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">node</span></span></code></pre></div>



<p><strong>Step 4:</strong>&nbsp;You can use below mentioned command to updating Node.js to latest version:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Bash</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>brew upgrade node</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">brew</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">upgrade</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">node</span></span></code></pre></div>



<p><strong>Step 5:&nbsp;</strong>To check out the installed version of node, enter below mentioned command and verify node version&nbsp; easily.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Bash</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>node -v</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">node</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-v</span></span></code></pre></div>



<h2 class="wp-block-heading">Method 5:&nbsp; Using ServerAvatar</h2>



<p>ServerAvatar is a powerful server management platform that takes the hassles out of managing your servers and applications, especially for developers, startups, and agencies. With a user-friendly control panel, ServerAvatar allows you to manage everything from server provisioning to application deployment, security, backups, and software updates, without needing to use the terminal.&nbsp;</p>



<p>Whether you&#8217;re running a Node.js application or a full-stack project, ServerAvatar makes server management tasks like upgrading Node.js as easy as clicking a button. It&#8217;s perfect for anyone who wants to focus more on building apps and less on server-side complexity.</p>



<p>ServerAvatar installs node.js by default when deploying server and you can easily change the version of node and npm using ServerAvatar. Just follow the steps below:</p>



<p><strong>Step 1:&nbsp;</strong>Login to your ServerAvatar account and navigate to your Server Panel by clicking on the server dashboard icon.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="314" src="https://serveravatar.com/wp-content/uploads/2025/07/image-2025-07-22T152339.782-1024x314.png" alt="ServerAvatar Server Dashboard" class="wp-image-26503" srcset="https://serveravatar.com/wp-content/uploads/2025/07/image-2025-07-22T152339.782-1024x314.png 1024w, https://serveravatar.com/wp-content/uploads/2025/07/image-2025-07-22T152339.782-300x92.png 300w, https://serveravatar.com/wp-content/uploads/2025/07/image-2025-07-22T152339.782-768x236.png 768w, https://serveravatar.com/wp-content/uploads/2025/07/image-2025-07-22T152339.782-1536x471.png 1536w, https://serveravatar.com/wp-content/uploads/2025/07/image-2025-07-22T152339.782.png 1891w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p><strong>Step 2:</strong>&nbsp;Navigate to the &#8220;Settings&#8221; section from server panel. After scrolling, you will see the section of&nbsp; &#8220;Node.js&#8221;.</p>



<p><strong>Step 3:</strong>&nbsp;You can see your current&nbsp;<strong>Node</strong>&nbsp;and&nbsp;<strong>NPM&nbsp;</strong>version, and you can directly update the version by clicking on the &#8220;Update&#8221; button. (If the node is not installed in your server, you will see the button to install the latest version of node at the place of update.)</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="472" src="https://serveravatar.com/wp-content/uploads/2025/07/image-2025-07-22T152412.786-1024x472.png" alt="ServerAvatar Panel Setting" class="wp-image-26504" srcset="https://serveravatar.com/wp-content/uploads/2025/07/image-2025-07-22T152412.786-1024x472.png 1024w, https://serveravatar.com/wp-content/uploads/2025/07/image-2025-07-22T152412.786-300x138.png 300w, https://serveravatar.com/wp-content/uploads/2025/07/image-2025-07-22T152412.786-768x354.png 768w, https://serveravatar.com/wp-content/uploads/2025/07/image-2025-07-22T152412.786-1536x708.png 1536w, https://serveravatar.com/wp-content/uploads/2025/07/image-2025-07-22T152412.786.png 1847w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">Managing Multiple Versions of Node.js</h2>



<p>Sometimes, you need different Node versions for different projects. That’s where NVM works. With NVM, you can directly switch between versions like changing browser tabs:</p>



<ul class="wp-block-list">
<li>You can use the below command to install the &#8220;nvm&#8221; version you want for your project:</li>
</ul>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Bash</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>nvm install (version)</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">nvm</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">install</span><span style="color: #D4D4D4"> (version)</span></span></code></pre></div>



<p>You can use the version you installed for your project easily. Just use the command below:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Bash</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>nvm use (version)</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">nvm</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">use</span><span style="color: #D4D4D4"> (version)</span></span></code></pre></div>



<p>For example, if you need version 18 later, you can easily install and switch the versions by using the same commands:</p>



<p><strong>For example:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Bash</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>nvm install 18
nvm use 18</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">nvm</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">install</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">18</span></span>
<span class="line"><span style="color: #DCDCAA">nvm</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">use</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">18</span></span></code></pre></div>



<h2 class="wp-block-heading">Rolling Back to an Older Version</h2>



<p>Oops! Something broke after the upgrade? No worries. You can easily roll back to the older version. Simply use NVM to go back. You can follow the commands mentioned below to use older version:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Bash</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>nvm use (version)</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">nvm</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">use</span><span style="color: #D4D4D4"> (version)</span></span></code></pre></div>



<p>You can also uninstall the latest version if needed:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Bash</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>nvm uninstall node</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">nvm</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">uninstall</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">node</span></span></code></pre></div>



<h2 class="wp-block-heading">Frequently Asked Questions About Node Upgrades</h2>



<p>We’ll explore more in the FAQ section, but here are quick hits:</p>



<ul class="wp-block-list">
<li><strong>Should I always use the latest version?</strong>&nbsp;→ Not always. Use LTS (Long-Term Support) for stability.</li>



<li><strong>Can upgrading break my apps?&nbsp;</strong>→ Rarely, but always test your code after upgrade.</li>



<li><strong>What is LTS?</strong>&nbsp;→ It’s like the “stable” version Node recommends for production use.</li>
</ul>



<h2 class="wp-block-heading">Final Tips for Smooth Upgrades</h2>



<ul class="wp-block-list">
<li>Stick with LTS unless you’re experimenting</li>



<li>Always backup before upgrading</li>



<li>Read release notes</li>



<li>Update dependencies (npm update)</li>
</ul>



<h2 class="wp-block-heading">Common Errors and How to Fix Them</h2>



<p><strong>1) “nvm: command not found”</strong><br><strong>&gt;&gt;&nbsp;</strong>Make sure NVM is installed and sourced in your terminal config.</p>



<p><strong>2) Permission errors</strong>&nbsp;during upgrade<br><strong>&gt;&gt;&nbsp;</strong>Use sudo carefully, or reinstall Node with NVM.</p>



<p><strong>3) App not running after upgrade?</strong><br><strong>&gt;&gt;</strong>&nbsp;Downgrade Node, or reinstall project dependencies:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Bash</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>rm -rf node_modules
npm install</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">rm</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-rf</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">node_modules</span></span>
<span class="line"><span style="color: #DCDCAA">npm</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">install</span></span></code></pre></div>



<h2 class="wp-block-heading">Conclusion</h2>



<p>Upgrading Node.js doesn’t have to be intimidating. With the right tools like NVM and a bit of preparation and knowledge, it becomes a smooth and simple process. Just like updating your phone or refreshing your browser, a Node upgrade ensures your development environment is secure, fast, and ready for modern tools.</p>



<p>Now that you know how to do it, go ahead, give your Node a little upgrade love!</p>



<h2 class="wp-block-heading">FAQs</h2>



<div data-schema-only="false" class="wp-block-aioseo-faq"><h3 class="aioseo-faq-block-question"><strong>1. How do I know if I need to upgrade Node.js?</strong></h3><div class="aioseo-faq-block-answer">
<p>Check your version using node -v. If it’s outdated compared to the latest LTS version, consider upgrading.</p>
</div></div>



<div data-schema-only="false" class="wp-block-aioseo-faq"><h3 class="aioseo-faq-block-question"><strong>2. Will upgrading Node.js break my project?</strong></h3><div class="aioseo-faq-block-answer">
<p>Usually not, but it’s smart to test after upgrading. Back up your project before starting.</p>
</div></div>



<div data-schema-only="false" class="wp-block-aioseo-faq"><h3 class="aioseo-faq-block-question"><strong>3. Is it possible to have two versions of Node.js installed?</strong></h3><div class="aioseo-faq-block-answer">
<p>Yes! Tools like NVM let you switch between multiple versions easily.</p>
</div></div>



<div data-schema-only="false" class="wp-block-aioseo-faq"><h3 class="aioseo-faq-block-question"><strong>4. What’s the difference between Node.js LTS and Current?</strong></h3><div class="aioseo-faq-block-answer">
<p>LTS is the stable, long-term supported version. “Current” has the newest features but may change more often.</p>
</div></div>



<div data-schema-only="false" class="wp-block-aioseo-faq"><h3 class="aioseo-faq-block-question"><strong>5. How often should I upgrade Node.js?</strong></h3><div class="aioseo-faq-block-answer">
<p>Stick to upgrading when a new LTS version is released or when a required package needs a newer Node version.</p>
</div></div>



<p></p><p>The post <a href="https://serveravatar.com/upgrade-node/">How to Upgrade Node: Beginner’s Tutorial</a> first appeared on <a href="https://serveravatar.com">ServerAvatar</a>.</p>]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
