<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: hiruthicSha</title>
    <description>The latest articles on DEV Community by hiruthicSha (@hiruthicsha).</description>
    <link>https://dev.to/hiruthicsha</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F335604%2F2a391c16-46f2-4402-96f3-ee3f423a4d1a.webp</url>
      <title>DEV Community: hiruthicSha</title>
      <link>https://dev.to/hiruthicsha</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hiruthicsha"/>
    <language>en</language>
    <item>
      <title>Building MCP Server - The Hidden Protocol Behind Smart AI Collaboration</title>
      <dc:creator>hiruthicSha</dc:creator>
      <pubDate>Sat, 25 Oct 2025 06:09:16 +0000</pubDate>
      <link>https://dev.to/hiruthicsha/building-mcp-server-the-hidden-protocol-behind-smart-ai-collaboration-3pdd</link>
      <guid>https://dev.to/hiruthicsha/building-mcp-server-the-hidden-protocol-behind-smart-ai-collaboration-3pdd</guid>
      <description>&lt;p&gt;Back in the 1960s, when computers were rare and applications even rarer, the term API quietly entered the scene. It wasn't about the web or microservices back then; it was about getting one piece of software to talk to another within the same machine.&lt;/p&gt;

&lt;p&gt;Fast forward to the 2000s, when the internet exploded into the hands of everyday developers. New frameworks, operating systems, and applications were popping up faster than anyone could keep track of. It was an incredible time; every week brought something new to try, build, or break.&lt;/p&gt;

&lt;p&gt;But that rapid innovation came with a cost: incompatibility. Everyone built their own thing in their own way. There was no single language or standard for systems to communicate. If your shopping site wanted to talk to another vendor, you had to build a custom connector. One partner? One connector. A hundred partners? A hundred connectors. It was chaos.&lt;/p&gt;

&lt;p&gt;That’s where APIs changed everything; they gave systems a common protocol to collaborate without needing to know each other’s internal wiring.&lt;/p&gt;

&lt;p&gt;And that's exactly what the Model Context Protocol (MCP) aims to do, but for AI systems. Just as APIs allowed applications to exchange data and perform tasks together, MCP defines a unified language that lets AI models, tools, and environments interoperate seamlessly.&lt;/p&gt;

&lt;p&gt;If you are new to MCP, please follow these before continuing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://medium.com/towards-artificial-intelligence/how-does-an-mcp-work-7ec566dc1145" rel="noopener noreferrer"&gt;How does an MCP work?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/towards-artificial-intelligence/how-i-built-an-mcp-client-and-how-you-can-too-9fc50d777583" rel="noopener noreferrer"&gt;How I Built an MCP Client (and How You Can Too)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;If you want to quickly get the idea without diving deep: &lt;a href="https://www.instagram.com/p/DIpoV9OzayA/" rel="noopener noreferrer"&gt;https://www.instagram.com/p/DIpoV9OzayA/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Building the MCP Server
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Project Setup
&lt;/h2&gt;

&lt;p&gt;In my earlier store, where we talked about how to build an MCP Client where we used &lt;a href="https://github.com/cyanheads/filesystem-mcp-server" rel="noopener noreferrer"&gt;filesystem-mcp-server&lt;/a&gt;. This time, since we are building our own server, we'll call it "Wannabe FS MCP Server".&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;wannabe-fs-mcp-server 
&lt;span class="nb"&gt;cd &lt;/span&gt;wannabe-fs-mcp-server
npm init &lt;span class="nt"&gt;-y&lt;/span&gt;
npm &lt;span class="nb"&gt;install &lt;/span&gt;express body-parser cors @modelcontextprotocol/sdk
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--save-dev&lt;/span&gt; typescript ts-node @types/node @types/express @types/cors
npx tsc &lt;span class="nt"&gt;--init&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Our project structure should look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mcp-server/
├─ src/
│  ├─ server.ts
│  └─ fs-service.ts
├─ package.json
├─ tsconfig.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Core Logic
&lt;/h2&gt;

&lt;p&gt;Let's create the obvious logic, listing files and reading the file &lt;code&gt;fs-service.ts&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;path&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ROOT_DIR&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;listDirectory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;relPath&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fullPath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ROOT_DIR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;relPath&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;fullPath&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ROOT_DIR&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Access denied&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readdirSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fullPath&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;readFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;relPath&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fullPath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ROOT_DIR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;relPath&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;fullPath&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ROOT_DIR&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Access denied&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fullPath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;utf-8&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This service logic is responsible for reading a file or listing a directory under a directory.&lt;br&gt;
Let's build the MCP part.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;McpServer&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@modelcontextprotocol/sdk/server/mcp.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;StdioServerTransport&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@modelcontextprotocol/sdk/server/stdio.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;fs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;path&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, let's be a good developer and follow proper security practices, at least one. We'll allow the server access to the current directory.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ROOT_DIR&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;safeResolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;relPath&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fullPath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ROOT_DIR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;relPath&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;fullPath&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ROOT_DIR&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Access denied&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;fullPath&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, let's create the handlers that the MCP can register as tools.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;listDirectory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;relPath&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fullPath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;safeResolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;relPath&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readdirSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fullPath&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;readFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;relPath&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fullPath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;safeResolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;relPath&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fullPath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;utf-8&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a new instance of the MCP Server and register the tools.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;McpServer&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;file-server&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1.0.0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;capabilities&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt; &lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;registerTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;list_dir&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;List files in a directory&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;relPath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;files&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;listDirectory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;relPath&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;files&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}]&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;err&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Error: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="p"&gt;}]&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Read file tool&lt;/span&gt;
&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;registerTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;read_file&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Read the contents of a file&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Error: path parameter is required&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}]&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;readFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt; &lt;span class="p"&gt;}]&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;err&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Error: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="p"&gt;}]&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above process is just telling the server instance to expose certain tools, which are bound to our handlers. This way, an MCP Client can discover these tools when the server is connected and provide context to the LLM. A little bit of driver like below and that's it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;transport&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;StdioServerTransport&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;transport&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Wannabe File System MCP Server running on stdio&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And that’s it, our humble, wannabe filesystem MCP server, "ready" to tackle production-level chaos (just kidding, don’t actually deploy it💀).&lt;/p&gt;

&lt;p&gt;You can build the project, grab the path to the transpiled script.js, and paste it into the MCP Client from the previous post to give it a spin.&lt;/p&gt;




&lt;p&gt;This is a very simple introduction to building an MCP Server, and there are a lot of other things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Different transport types&lt;/li&gt;
&lt;li&gt;Authentication and access control&lt;/li&gt;
&lt;li&gt;Error handling and retries&lt;/li&gt;
&lt;li&gt;Logging and observability&lt;/li&gt;
&lt;li&gt;Scaling and concurrency management&lt;/li&gt;
&lt;li&gt;Message schema versioning and backward compatibility&lt;/li&gt;
&lt;li&gt;Security and input validation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each of these aspects adds robustness and makes the server truly ready for real-world workloads.&lt;/p&gt;

&lt;p&gt;If you are interested, I have created such a simple MCP server that runs multiple LLMs at the same time and can also summarize by querying multiple LLMs. Read more: &lt;a href="https://medium.com/ai-in-plain-english/mmmcp-an-mcp-server-for-multi-model-prompts-86df1adf150e" rel="noopener noreferrer"&gt;MMMCP — An MCP Server for Multi-Model Prompts&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Stay Curious. Adios 👋&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Cover image generated with Canva AI&lt;/em&gt;&lt;/p&gt;

</description>
      <category>llm</category>
      <category>mcp</category>
      <category>ai</category>
      <category>chatgpt</category>
    </item>
    <item>
      <title>AI Weekend Projects That Slash Repetitive Work</title>
      <dc:creator>hiruthicSha</dc:creator>
      <pubDate>Tue, 12 Aug 2025 06:04:24 +0000</pubDate>
      <link>https://dev.to/hiruthicsha/ai-weekend-projects-that-slash-repetitive-work-5727</link>
      <guid>https://dev.to/hiruthicsha/ai-weekend-projects-that-slash-repetitive-work-5727</guid>
      <description>&lt;p&gt;&lt;strong&gt;Lets build some project that is not just a entry in your resume like, YouTube clone or Reddit clone.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you’ve been following my articles, you know I spend a few weekends each month on what I call “&lt;a href="https://hiruthicsha.medium.com/code-coffee-and-a-weekend-my-personal-hackathon-ritual-c6d8d48894da" rel="noopener noreferrer"&gt;Personal Hackathons&lt;/a&gt;”.&lt;br&gt;
These are my sprint sessions to build something that either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Becomes a product I can monetize, or&lt;/li&gt;
&lt;li&gt;Eliminates friction from my daily workflows.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here are some projects I’ve already built for myself, and a few more I’m planning for the coming weeks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Environment Status updates in Messaging Channels
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Build a tool that periodically monitors a service and takes action when certain conditions are met, for example:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If the response code isn’t 200, notify the DevOps team and possibly a potential fix aswell using an LLM.&lt;/li&gt;
&lt;li&gt;If latency exceeds 250ms, alert the development team and automatically create a ticket in your project management tool.
-If the issue is simple, trigger a background coding agent to work on the task and raise a PR.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This isn’t just for your organization, you can use it for your own hosted services as well.&lt;/p&gt;

&lt;h3&gt;
  
  
  What to learn
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A bit of scripting (Bash/Python/Node.js)&lt;/li&gt;
&lt;li&gt;REST APIs for your deployment environment.&lt;/li&gt;
&lt;li&gt;Power automate/n8n if your organization have the subscription.&lt;/li&gt;
&lt;li&gt;Prompt engineering.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How to approach
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Set up a bot or webhook for the messaging medium that your organization uses.&lt;/li&gt;
&lt;li&gt;Create a small service that fetches environment status from your infra (K8s cluster, VM health checks, API uptime).&lt;/li&gt;
&lt;li&gt;Post updates on-demand or at intervals to a dedicated Teams channel.&lt;/li&gt;
&lt;li&gt;Use the issue and code repository context, ask a coding agent to work on the task.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Potential
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Saves “Hey, is staging up?” Slack/Teams chatter.&lt;/li&gt;
&lt;li&gt;Can be extended to trigger alerts on failures.&lt;/li&gt;
&lt;li&gt;Please make sure your team’s in the loop and that you’re within organizational policy, before the IT team catches you and makes that face.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  CI/CD Pipeline Highlighter/Alert
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;This is similar to the previous tool. Build a tool that can detect pipeline completions or failure and trigger an alert to the respective person.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I have built this exact thing but only for highlighting, but you can extend it to alert. Below I have mentioned each of the learning path with “[Alerting]” or “[Highlighting]”&lt;/p&gt;

&lt;h3&gt;
  
  
  What to learn
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[Alerting] Your DevOps provider API (Azure, GitHub or others)&lt;/li&gt;
&lt;li&gt;[Highlighting] Browser extension development.&lt;/li&gt;
&lt;li&gt;[Highlighting] Basic HTML/CSS for visual cues.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How to approach
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[Alerting] Fetch pipeline run data via Azure DevOps API.&lt;/li&gt;
&lt;li&gt;[Highlighting] Highlight failed tasks, bottlenecks, or flaky tests visually.&lt;/li&gt;
&lt;li&gt;[Highlighting] Build as a browser extension.&lt;/li&gt;
&lt;li&gt;[Highlighting] String parsing through HTML to find the relevent emails.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Potential
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Immediate clarity on where a build went wrong.&lt;/li&gt;
&lt;li&gt;A massive time-saver during release crunch.&lt;/li&gt;
&lt;li&gt;Shows skill in automation + front-end + Browser extension development.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  WebUI for Ollama
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Ollama is a local LLM model runner which works in command line interfaces. These models will output text in md format when it needs to structure the output but the command line doesn’t render the markdown content.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;BTW, there is already a tool that does this &lt;a href="https://github.com/open-webui/open-webui" rel="noopener noreferrer"&gt;https://github.com/open-webui/open-webui&lt;/a&gt;. But what’s the fun in that.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to learn
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Working with Ollama API&lt;/li&gt;
&lt;li&gt;React/Next.js or any front-end framework you like or want to learn.
Prompt engineering fundamentals&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How to approach
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Spin up a small web app that interacts with your local Ollama server.&lt;/li&gt;
&lt;li&gt;Add features like conversation history, model switching, and file uploads.&lt;/li&gt;
&lt;li&gt;Keep it lightweight and internal for personal productivity.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Potential
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A custom AI playground tailored to your needs.&lt;/li&gt;
&lt;li&gt;Gateway to experimenting with AI tools without leaving the browser.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Retrain an LLM to Talk Like You
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;This one’s pretty self-explanatory. I’ve wanted to build it since my first year of university, after reading a post about a Chinese guy who created a tool to reply to his girlfriend, and she didn’t realize for an entire year.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I’m still not sure how he pulled that off without the advancements we have in LLMs today (and I don’t recall seeing the word LLM in that post either), but still… it’s a pretty cool project to try.&lt;/p&gt;

&lt;h3&gt;
  
  
  What to learn
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Fine-tuning LLMs&lt;/li&gt;
&lt;li&gt;Dataset creation &amp;amp; cleaning&lt;/li&gt;
&lt;li&gt;Messaging API integrations (WhatsApp via Twilio, Telegram bots, Signal API) to read and respond to the texts.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How to approach
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Collect your writing/chat history (with consent where required).&lt;/li&gt;
&lt;li&gt;Fine-tune a small open-source model to mimic your tone and style.&lt;/li&gt;
&lt;li&gt;Deploy the model on a server and connect it to WhatsApp or other messaging platforms.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Potential
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Your own AI assistant that sounds like you.&lt;/li&gt;
&lt;li&gt;Can help with drafting messages, reminders, or automating repetitive responses.&lt;/li&gt;
&lt;li&gt;An advanced AI + automation project that’s a great portfolio talking point.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Some of the projects mentioned here involve data you may or may not have permission to access. Always communicate with the right stakeholders and make sure you’re following applicable policies and laws.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Stay Curious. Adios 👋&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Cover image generated with ChatGPT using DALL.E&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>chatgpt</category>
      <category>automation</category>
    </item>
    <item>
      <title>Why Vibe Coding Isn't the AI Utopia You Think It Is</title>
      <dc:creator>hiruthicSha</dc:creator>
      <pubDate>Sat, 09 Aug 2025 06:56:56 +0000</pubDate>
      <link>https://dev.to/hiruthicsha/why-vibe-coding-isnt-the-ai-utopia-you-think-it-is-1kf9</link>
      <guid>https://dev.to/hiruthicsha/why-vibe-coding-isnt-the-ai-utopia-you-think-it-is-1kf9</guid>
      <description>&lt;p&gt;The internet loves good vibe coding post like "AI wrote my app in 5 minutes".&lt;/p&gt;




&lt;p&gt;I mean, attention is gold in content creation and I totally get it but it doesn't show the other side of the process. Especially about the part where people say its replacing developers.&lt;/p&gt;

&lt;p&gt;It does raise the bar as now anyone can build a product with LLMs and vibe coding is fast. It feels smart. But it's not replacing developers. It's reminding us why they still matter.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is Vibe Coding?
&lt;/h2&gt;

&lt;p&gt;Vibe coding is what happens when developers offload code generation to AI. You give a high-level instruction like: "Write a function to parse a config and return only the active keys." and let the AI do the rest.&lt;/p&gt;

&lt;p&gt;The appeal is real. You get speed, fewer keystrokes, and less context-switching. The code often looks right, but that's not the same as being right.&lt;/p&gt;

&lt;h3&gt;
  
  
  My Experience
&lt;/h3&gt;

&lt;p&gt;I've been using LLMs for code since GitHub Copilot first dropped in early 2022 so without realizing it, I've been vibe coding for quite a while.&lt;br&gt;
Looking back, the evolution is undeniable. The current models are incredibly powerful. But even with all that progress, I never really felt like I was co-programming with an AI.&lt;/p&gt;

&lt;p&gt;At best, it helped me move faster, especially through the boring parts. It felt like a supercharged autocomplete, and honestly, that was great. But today's coding models are marketed as pair programmers, and that's where the illusion begins.&lt;/p&gt;

&lt;p&gt;Yes, the latest models are surprisingly capable. They've helped me generate things I didn't expect them to pull off. But here's the catch: it's still a coin toss. You might get exactly what you want, or something that totally misses the point. And even if it looks right, accuracy is never guaranteed.&lt;/p&gt;

&lt;p&gt;Sure, you could write a 1000 word prompt to steer it correctly, but come on, WTF? At that point, you might as well just code it yourself. 🤷‍♂️&lt;br&gt;
And honestly, that's to be expected. These models don't think, they run on probability, predicting the next best token. The real issue is how people treat them like some kind of god-tier dev replacement.&lt;/p&gt;

&lt;h3&gt;
  
  
  A Recent Issue I Faced #1
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Here's what happened:
&lt;/h4&gt;

&lt;p&gt;I asked the LLM to write a helper function. Simple stuff. It needed to read from a dictionary, extract some values, and return results. Instead of using &lt;code&gt;dict.get()&lt;/code&gt;, the AI used &lt;code&gt;dict.pop()&lt;/code&gt;. Of-course I had to give a big ass prompt, but this is the idea anyway.&lt;/p&gt;

&lt;p&gt;At first glance, it worked.&lt;/p&gt;

&lt;p&gt;But I realized later that this mutated the original dictionary. And that same dict was used later in the codebase. Suddenly, things were breaking.&lt;br&gt;
Why? Because &lt;code&gt;pop()&lt;/code&gt; removes the key. The AI broke a cardinal rule of clean code: never modify inputs unless that's the point. This wasn't just a bad choice, it was a sign that the LLM didn't understand intent.&lt;/p&gt;

&lt;h3&gt;
  
  
  It Had All the Context
&lt;/h3&gt;

&lt;p&gt;The code wasn't deeply nested. It was a short function, called directly from a file.&lt;/p&gt;

&lt;p&gt;This wasn't a case of lacking information. The LLM had everything it needed. It just didn't reason about it. It didn't realize that mutating the dict would have downstream effects.&lt;/p&gt;

&lt;p&gt;Because it can't reason. It only predicts.&lt;/p&gt;

&lt;p&gt;To my surprise, even the reasoning model failed this task multiple time and I had make the changes myself.&lt;/p&gt;

&lt;p&gt;There are a lot of times I had these issues along the years but it never bothered me as I wasn't expecting them to code for me instead to assist me. But the AI bros on the internet have a different idea.&lt;br&gt;
Don't get me wrong, there were days when I pushed the agents to their limits, relying on them to write nearly 80% of the code. That's exactly how this project came to life: I Vibe‑Coded My Way Into a Broken Android with ChatGPT &amp;amp; Python.&lt;/p&gt;

&lt;h3&gt;
  
  
  A Recent Issue I Faced #2
&lt;/h3&gt;

&lt;p&gt;I've been trying to migrate some data-fetch logic from one data source to another data source. In theory, the job is easy: read the existing code, follow the call chain, note what each method actually returns, and rewrite the bits that need changing. In practice?&lt;/p&gt;

&lt;p&gt;Copilot and other VS Code extensions kept telling me, "They call this method; I assume it returns X." &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Gee, thanks, Copilot. I, too, can assume.🤷‍♂️&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The whole reason I summoned an AI sidekick was so I wouldn't have to spelunk through twenty-three files at 2 AM.&lt;/p&gt;

&lt;p&gt;Could I stuff every source file into the prompt? Sure. But by the time I've hand fed the model half my repo, I already understand the code, and I'm paying $10/month for the privilege of explaining it to a chatbot.&lt;/p&gt;

&lt;p&gt;Weirdly, this guessing game only happens with Copilot, Gemini, and most VS Code extensions. Cursor? That thing actually reads the code. It hops through references, figures out real return types, and gives answers that don't begin with "I assume." It's not perfect (the previous issue with python code was done in cursor), but at least it behaves like it's seen my codebase before.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Tech Is New, And That's the Point
&lt;/h3&gt;

&lt;p&gt;This is bleeding-edge stuff. Tools like prompt.md, instructions.md, and AI-assisted flows are emerging to guide LLMs more effectively. We're learning how to wrangle them.&lt;/p&gt;

&lt;p&gt;But even with those tools, this tech is not yet a silver bullet. It's powerful, but still unreliable in critical workflows. It's evolving fast, but not fast enough to replace developers.&lt;/p&gt;

&lt;p&gt;What vibe coding is doing is shifting the developer's role:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;From author to editor.&lt;/li&gt;
&lt;li&gt;From builder to reviewer.&lt;/li&gt;
&lt;li&gt;From executor to architect.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It still needs your defensive programming habits. Your understanding of why some choices are bad even if they "work." You still hold the ownership of the things you build with it.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I did try this with multiple models GPT4 &amp;amp; 4.1, o3-mini, Sonnet 3.7 and few Gemini models and they all seem to have the same output except when used in Cursor.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  You're Still the Engineer
&lt;/h2&gt;

&lt;p&gt;AI is an incredible assistant, not a replacement. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It can vibe. It can guess. But it can't own code. &lt;/li&gt;
&lt;li&gt;It can't architect. It doesn't live with the consequences of its predictions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So sure, vibe code away. Just remember who's really accountable.&lt;br&gt;
Stay Curious. Adios 👋&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Cover image generated with DALL.E using ChatGPT&lt;/em&gt;&lt;/p&gt;

</description>
      <category>llm</category>
      <category>vibecoding</category>
      <category>openai</category>
      <category>githubcopilot</category>
    </item>
    <item>
      <title>I Vibe‑Coded My Way Into a Broken Android with ChatGPT &amp; Python</title>
      <dc:creator>hiruthicSha</dc:creator>
      <pubDate>Mon, 16 Jun 2025 07:47:44 +0000</pubDate>
      <link>https://dev.to/hiruthicsha/i-vibe-coded-my-way-into-a-broken-android-with-chatgpt-python-57pk</link>
      <guid>https://dev.to/hiruthicsha/i-vibe-coded-my-way-into-a-broken-android-with-chatgpt-python-57pk</guid>
      <description>&lt;p&gt;&lt;em&gt;It started with a crack, literally…&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;My friend dropped her phone on asphalt, and after six long years of brutal survival, the screen finally decided it had had enough.&lt;/p&gt;

&lt;p&gt;We're talking six years of tech abuse. No screen protector, no hard case, multiple drops on every imaginable surface. We used to joke that this phone was the true successor to the legendary Nokia brick. This device had more scars than the guy fighting the final boss.&lt;/p&gt;

&lt;p&gt;But this time it was different, guess it's just &lt;strong&gt;Wrong asphalt, wrong time.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The display still lit up, but the touchscreen? Possessed. Ghost taps everywhere, especially on the bottom edge, where it developed a deep obsession with hammering the Android "Back" button, like it was desperately trying to erase its own existence.&lt;/p&gt;

&lt;p&gt;To make matters worse, she lives life on &lt;strong&gt;maximum risk mode&lt;/strong&gt;, no cloud backup, no SD card, no local copy. Just raw, unprotected digital chaos.&lt;/p&gt;

&lt;p&gt;Replacing the screen? Not happening. The model was so old, it should've come with museum tags.&lt;/p&gt;

&lt;p&gt;That's when the idea struck: &lt;em&gt;What if we never touch the screen again?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Armed with &lt;strong&gt;ChatGPT, Python, ADB,&lt;/strong&gt; and a whole lot of &lt;strong&gt;vibe coding&lt;/strong&gt;, I hacked together a way to remotely control the phone using ADB. I ended up writing a tool that let me tap, swipe, and type on the phone, all by clicking on screenshots. And it actually worked.&lt;/p&gt;

&lt;h1&gt;
  
  
  The Problem
&lt;/h1&gt;

&lt;p&gt;We figured this was finally the moment to retire the old warrior and get a new phone, repairing it would've been expensive, given its age, and even then, it was living on borrowed time which makes the use even more risky.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We had one mission: get the data out.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;But that was easier said than done. Every time we tried to open an app or navigate the UI, the ghost taps would kick in, slamming the back button, opening random apps, or just spamming nonsense. It was like trying to defuse a bomb while someone kept pressing "Cancel".&lt;/p&gt;

&lt;p&gt;Since a screen replacement which was our easy way out, wasn't an option, we thought about buying a USB-C to USB-A (female) adapter to plug in a mouse and control the phone that way. But that meant waiting for the adapter. Since I had an idea in mind, I challenged myself: &lt;strong&gt;"Let me try fixing this before you finish that venti iced coffee."&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Idea
&lt;/h1&gt;

&lt;p&gt;I've seen people doing things with ADB to control things like tapping the screen and opening apps or installing. Since I still had the android development setup in my laptop, I quickly found the &lt;a href="https://developer.android.com/tools/releases/platform-tools" rel="noopener noreferrer"&gt;platform-tools&lt;/a&gt; location in my android SDK directory and tried connecting the device.&lt;/p&gt;

&lt;p&gt;Thankfully, the phone already had Developer Options and USB debugging enabled, from back when I used it to test a few apps. And since it was running an older version of Android, the Developer Options hadn't hidden themselves again, like newer versions love to do.&lt;/p&gt;

&lt;p&gt;That meant ADB was almost ready to roll, the only hurdle left was tapping "Allow" on the "Trust this computer?" prompt that appears the first time you connect ADB from a new machine. After the painful yet fun 5 minutes of a pleasant Tuesday evening, we were able to click the allow button before the ghost tapping started!&lt;/p&gt;

&lt;h2&gt;
  
  
  Attempt #1: Screenshots, Coordinates, and Pain
&lt;/h2&gt;

&lt;p&gt;With USB debugging enabled, I knew I could control the phone using ADB, this means I could simulate taps and swipes without physically touching the screen.&lt;/p&gt;

&lt;p&gt;I started by blindly guessing the coordinates, because hey, what could go wrong? Turns out: &lt;em&gt;everything&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;I ran commands like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;adb shell input tap 500 1000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;…and hoped it landed on the right button.&lt;/p&gt;

&lt;p&gt;Sometimes I'd get lucky and open the correct app. Most of the time, though, I was just poking empty pixels.&lt;/p&gt;

&lt;p&gt;So I leveled up, just a little.&lt;/p&gt;

&lt;p&gt;I began taking screenshots with ADB:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;adb shell screencap &lt;span class="nt"&gt;-p&lt;/span&gt; /sdcard/screen.png
adb pull /sdcard/screen.png
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then I'd open the image in MS Paint, hover over the UI element I wanted to tap, grab the x and y coordinates, and fire off an ADB tap with surgical precision.&lt;/p&gt;

&lt;p&gt;It was progress… but every single tap felt like a full-blown side quest: screenshot, open Paint, find coordinates, run command, observe results, repeat.&lt;/p&gt;

&lt;p&gt;The whole process felt like trying to control a wild animal using chopsticks.&lt;/p&gt;

&lt;p&gt;There had to be a better way. I decided it was time to automate the chaos. And me being me, if something has more than zero steps, I'm automating it. You'd know that if you've been following along and reading these stories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://medium.com/@hiruthicsha/mmmcp-an-mcp-server-for-multi-model-prompts-86df1adf150e" rel="noopener noreferrer"&gt;MMMCP - An MCP Server for Multi-Model Prompts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@hiruthicsha/goodbye-setup-scripts-ansible-made-my-home-server-management-easier-ba56d02cc118" rel="noopener noreferrer"&gt;Goodbye Setup Scripts: Ansible Made My Home Server Management Easier&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@hiruthicsha/apply-the-dry-principle-to-your-life-automate-repetitive-tasks-for-greater-efficiency-a606abf57e29" rel="noopener noreferrer"&gt;Apply the DRY principle to your life: automate repetitive tasks for greater efficiency&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/r/?url=https%3A%2F%2Fhiruthicsha.medium.com%2Fstop-struggling-these-tricks-will-instantly-boost-your-productivity-c3b4f0499e5e" rel="noopener noreferrer"&gt;Stop Struggling! These Tricks Will Instantly Boost Your Productivity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/r/?url=https%3A%2F%2Fhiruthicsha.medium.com%2Ftips-for-becoming-an-efficient-developer-28442f998320" rel="noopener noreferrer"&gt;Tips for becoming an efficient developer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/r/?url=https%3A%2F%2Fhiruthicsha.medium.com%2Fthe-hidden-roi-of-coding-how-i-built-software-that-saved-me-a-fortune-965e028dced0" rel="noopener noreferrer"&gt;The Hidden ROI of Coding: How I Built Software That Saved Me a Fortune&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxftih3m9urmjq0jf2yap.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxftih3m9urmjq0jf2yap.jpg" alt="Meme generated with imgflip.com" width="750" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Attempt #2: Vibe coding a tool
&lt;/h2&gt;

&lt;p&gt;The goal is to be able to click on the phone screen from my machine using ADB. So, my requirements are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Render the phone screen on my machine by taking a screenshot.&lt;/li&gt;
&lt;li&gt;Get the coordinates when I click on the screen and generate an ADB command, and send it.&lt;/li&gt;
&lt;li&gt;Need a way to type, for input fields like phone numbers or login forms.&lt;/li&gt;
&lt;li&gt;Need a way to swipe to unlock by pattern.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So I spent maybe like 5 mins creating the prompt for my requirements and asked ChatGPT. After reviewing the code, and asking it to cover a few cases and few adjustments later, I had a tool that could mirror my phone. Now, after finding the sweet spot between the code crashing and having a steady stream of screen updates, I had around 20–25 FPS.&lt;/p&gt;

&lt;p&gt;And that's it. From there, I shared my script with her, gave her instructions on how to use it, and in under 30 minutes, the WhatsApp backup was under control, and other backups were also started.&lt;/p&gt;

&lt;h1&gt;
  
  
  Lessons Learned at a Coffee Time
&lt;/h1&gt;

&lt;p&gt;In the end, we didn't need a new screen, a USB adapter, or even a working touchscreen.&lt;/p&gt;

&lt;p&gt;All we needed was a bit of Python, some OpenCV magic, and a spark of vibe coding spirit.&lt;/p&gt;

&lt;p&gt;With a little help from ChatGPT, I turned a random idea into a working tool that saved data from a decade-old phone powered purely by commitment and sheer f***ing will.&lt;/p&gt;

&lt;p&gt;And yes, for the record, I did finish before she finished her coffee.&lt;/p&gt;

&lt;p&gt;Never thought I'd say this, but coding does make life a little better.&lt;br&gt;
That is… as long as you use it wisely, and actually understand what your LLM is spitting out.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;So, always enable USB debugging.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;That's a joke, please don't.&lt;/strong&gt; Backup regularly and keep your data safe.&lt;br&gt;
Here is the script: &lt;a href="https://gist.github.com/hiruthicShaSS/e2ce710032199729b16160eb040e5c8d" rel="noopener noreferrer"&gt;https://gist.github.com/hiruthicShaSS/e2ce710032199729b16160eb040e5c8d&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Stay Curious. Adios 👋&lt;br&gt;
&lt;em&gt;Cover image generated with ChatGPT.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>vibecoding</category>
      <category>llm</category>
      <category>chatgpt</category>
      <category>ai</category>
    </item>
    <item>
      <title>You're Still Using Just One Type of Breakpoint?</title>
      <dc:creator>hiruthicSha</dc:creator>
      <pubDate>Sun, 08 Jun 2025 06:09:26 +0000</pubDate>
      <link>https://dev.to/hiruthicsha/youre-still-using-just-one-type-of-breakpoint-1271</link>
      <guid>https://dev.to/hiruthicsha/youre-still-using-just-one-type-of-breakpoint-1271</guid>
      <description>&lt;p&gt;Most developers smash &lt;strong&gt;F5&lt;/strong&gt;, &lt;strong&gt;F9&lt;/strong&gt; and &lt;strong&gt;F10&lt;/strong&gt; or click the buttons that are far left that you need to swipe your mouse twice to reach.&lt;br&gt;
But what if I told you you're only scratching the surface of what morden debuggers can do?&lt;br&gt;
There's a whole toolbox (or 3 which I going to cover) of smarter breakpoints that can save your time if you learn how to use them.&lt;br&gt;
Let's break them down. (Pun intended.)&lt;/p&gt;
&lt;h2&gt;
  
  
  The Basic Breakpoint
&lt;/h2&gt;

&lt;p&gt;Let's get this out of the way.&lt;br&gt;
You set it up on a line, the execution stops, you inspect stuff.&lt;br&gt;
It works, until your app loops 999 times or you're tracing something that happens sometimes under some condition. That's when the basic Breakpoint becomes… basic.&lt;/p&gt;
&lt;h2&gt;
  
  
  Conditional Breakpoint
&lt;/h2&gt;

&lt;p&gt;Break only when a condition is met.&lt;br&gt;
Perfect when you're debugging a loop but only care when &lt;code&gt;i == 998&lt;/code&gt;.&lt;br&gt;
So, no more pushing debug lines to the PR like this anymore:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="m"&gt;998&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead, right click on your breakpoint or the breakpoint pane -&amp;gt; "Condition"-&amp;gt; &lt;code&gt;i == 998&lt;/code&gt;. And boom. It'll pause only when it matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tracepoint / Logpoint
&lt;/h2&gt;

&lt;p&gt;Print without pausing.&lt;br&gt;
Sometimes you want to see what's happening, but stopping the program ruins the flow. That's where tracepoints come in.&lt;br&gt;
Log values, hit counts, or custom messages straight from the debugger, no debug code is required.&lt;br&gt;
Let's say, you're debugging a race condition or async code. A normal breakpoint ruins it. A tracepoint observes silently.&lt;/p&gt;

&lt;h2&gt;
  
  
  Temporary Breakpoint
&lt;/h2&gt;

&lt;p&gt;Trigger once, then disappear.&lt;br&gt;
Ideal when you're checking a one-time setup or a rare code path.&lt;br&gt;
Why spam breakpoints or logs and keep cleaning up later? This one is deleted once the breakpoint is hit.&lt;br&gt;
Just right click and mark it temporary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dependent Breakpoint
&lt;/h2&gt;

&lt;p&gt;Break only after another one fires.&lt;br&gt;
Let's say, you have a multi-step validation process where you only care about your breakpoint when a particular breakpoint is also hit.&lt;br&gt;
Instead of manually tracking that, you cane make a breakpoint dependent on another breakpoint.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data Breakpoint / Watchpoint
&lt;/h2&gt;

&lt;p&gt;Triggers on field/property write or read operations. Useful when the output is wrong but you suspect that something else is also changing the property or field.&lt;/p&gt;

&lt;p&gt;This type may not be available on all.&lt;/p&gt;




&lt;p&gt;Debugger didn't stop there, but it's a start and knowing these exists can help you do your job a lot let less harder.&lt;br&gt;
&lt;strong&gt;Stay Curious. Adios 👋&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>webdev</category>
      <category>productivity</category>
      <category>learning</category>
    </item>
    <item>
      <title>You're Not Debugging. You're Just Wasting Time</title>
      <dc:creator>hiruthicSha</dc:creator>
      <pubDate>Sun, 01 Jun 2025 05:41:04 +0000</pubDate>
      <link>https://dev.to/hiruthicsha/youre-not-debugging-youre-just-wasting-time-1bc6</link>
      <guid>https://dev.to/hiruthicsha/youre-not-debugging-youre-just-wasting-time-1bc6</guid>
      <description>&lt;p&gt;If I had a penny for every time a developer copy-pasted an error into Google or Stack Overflow without reading it, I'd be running a global datacenter by now. And don't get me started with this new LLM race, blindly following what the LLM asks you to do.&lt;/p&gt;

&lt;p&gt;An error pops up… and instead of reading it, your fingers are already firing up Chrome. Paste. Search. Click random Stack Overflow answers. Try. Fail. Try again. Maybe drop it into ChatGPT, hoping magic happens.&lt;/p&gt;

&lt;p&gt;And somehow, this feels like debugging.&lt;br&gt;
Let's be clear, &lt;strong&gt;this is not debugging&lt;/strong&gt;.  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It's reaction. It's panic. It's a habit. And it's wasting your time, your growth, and your ability to actually solve problems.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Trial-and-Error Culture
&lt;/h2&gt;

&lt;p&gt;We've all been there. Stuck. Frustrated. The deadline is creeping up, tasks are getting reprioritized and all you want is for the damn thing to work. So what do you do?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Paste the error into Google.
&lt;/li&gt;
&lt;li&gt;Click the first few links. Hope that someone have faced the same error as you.
&lt;/li&gt;
&lt;li&gt;Try the top-voted fix.
&lt;/li&gt;
&lt;li&gt;Didn't work? Try the next.
&lt;/li&gt;
&lt;li&gt;Still doesn't? Ask ChatGPT. Copy. Paste. Pray.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Most of the times it works. But you didn't learn why. You don't know what caused it. You don't know what actually fixed it. You just know that something made the red squiggly go away.&lt;/p&gt;

&lt;p&gt;This is the trial-and-error trap, a culture of coding that &lt;strong&gt;looks like progress but isn't&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In a world flooded with AI tools, blogs (written by AI), answer farms (made by AI), and auto-complete (AI again), we've unknowingly trained ourselves to skip the one thing that truly matters:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Thinking&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The irony? Most errors already tell you what's wrong. Stack traces, logs, line number, they're practically handing you the answer. But we've built this twitchy, compulsive loop around skipping them.&lt;/p&gt;

&lt;p&gt;Don't get me wrong, there's nothing wrong with searching for help. If you're digging into the why, exploring different angles, and making informed, calculated decisions, you're doing it right.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But that's not what most developers are doing.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The problem starts when you blindly apply every fix you find online, hoping something sticks.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Is Doing to You
&lt;/h2&gt;

&lt;h3&gt;
  
  
  You're Losing Knowledge
&lt;/h3&gt;

&lt;p&gt;Every time you skip understanding an error, you miss a chance to sharpen your mental model of how things work.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You don't understand why the issue happened.
&lt;/li&gt;
&lt;li&gt;You can't explain what fixed it, or worse, if it's really fixed.
&lt;/li&gt;
&lt;li&gt;You become dependent on external tools to solve basic problems.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You're not building experience. You're just building a stack of accidental successes. &lt;strong&gt;If you can't explain the root cause, you haven't actually debugged anything.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;All this adds up, and before you know it, you are single-handedly destroying the project.&lt;/p&gt;

&lt;h3&gt;
  
  
  You're Wasting Time
&lt;/h3&gt;

&lt;p&gt;Being on this loop may feel fast, but it's not.&lt;br&gt;&lt;br&gt;
You might find a fix in 5 minutes today. But because you didn't understand it, you'll spend 2 hours on a similar bug next week. And next month. And during production.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chasing unrelated solutions because you didn't analyze the actual error.
&lt;/li&gt;
&lt;li&gt;Applying fixes that seem to work but introduce silent bugs.
&lt;/li&gt;
&lt;li&gt;Wasting time debugging the same class of problems repeatedly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The trial-and-error habit doesn't just slow you down in the moment, but it quietly chips away at your growth and efficiency over time. This is brainrot for developers.&lt;/p&gt;

&lt;p&gt;Think about it. You're in an interview, and the recruiter hits you with the classic:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Tell me about a challenging task you faced and how you solved it."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now what do you say?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Yeah, I bravely copy-pasted 10 random solutions from Stack Overflow until one of them kind of worked… I think."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's not a story. That's a montage of confusion.&lt;/p&gt;

&lt;p&gt;You didn't struggle with the problem — you struggled with the copy-paste buffer. And when they ask you to explain what the actual issue was or why your 'fix' worked?&lt;/p&gt;

&lt;p&gt;Crickets. 🦗🦗🦗🦗&lt;/p&gt;

&lt;h2&gt;
  
  
  The LLM Trap
&lt;/h2&gt;

&lt;p&gt;Look, I love LLMs as much as any developer. It's fast, helpful, and honestly kind of magical. But here's the uncomfortable truth: If you don't know what you're asking, LLMs won't save you.&lt;/p&gt;

&lt;p&gt;They'll respond with 500 words of confident-sounding nonsense, sprinkled with just enough keywords to feel legit. But without your context or understanding, it's just noise dressed as code.&lt;/p&gt;

&lt;p&gt;LLMs are powerful tools, but they can't read your mind. They don't know your architecture, your business idea, or your weird edge-cases. And if your first move is to dump errors into an LLM hoping for divine intervention, you're just automating the same bad habit.&lt;/p&gt;

&lt;p&gt;And no, it doesn't matter if the response sounds smart. LLMs are trained to be fluent, not necessarily correct.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Actually Debug
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Read the Error
&lt;/h3&gt;

&lt;p&gt;Modern tech is built around developer experience. Most of the times the error clearly states what went wrong and languages like Rust even suggest you possible fixes.&lt;br&gt;&lt;br&gt;
You just have to read it, understand the trace and make a calculated decisions.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Reproduce it
&lt;/h3&gt;

&lt;p&gt;Can you reliably trigger the error? What changed recently? Does this happen only with specific data or tenant? Does the environment play a role in this behavior?&lt;br&gt;&lt;br&gt;
Asking these questions will itself lead you to figuring out 80% of the problem.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Form a Hypothesis
&lt;/h3&gt;

&lt;p&gt;Take an educated guess on what could be wrong and test it  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I think this fails because X happens before Y."&lt;br&gt;&lt;br&gt;
"What if this object is null because of Z?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now you have something to test. Something to validate or eliminate.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Search with Precision
&lt;/h3&gt;

&lt;p&gt;Now, go to Google, but with clarity. If you want to use an LLM, don't just paste the error. Add context:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What you're trying to do.
&lt;/li&gt;
&lt;li&gt;What language/framework you're using.
&lt;/li&gt;
&lt;li&gt;What you've already tried.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You'll get better answers and be more likely to understand them.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Reflect Once it's Fixed
&lt;/h3&gt;

&lt;p&gt;The moment you get it working, don't just sprint to the next task.&lt;/p&gt;

&lt;p&gt;Stop. Ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What actually went wrong?
&lt;/li&gt;
&lt;li&gt;Why did this fix work?
&lt;/li&gt;
&lt;li&gt;Could it happen again?
&lt;/li&gt;
&lt;li&gt;Should I document it or write a test?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where real growth happens, not when you fix it, but when you understand it.&lt;/p&gt;

&lt;p&gt;Debugging isn't about memorizing solutions. It's about training your brain to think like a system.&lt;br&gt;&lt;br&gt;
And the sooner you get out of the trial-and-error cycle, the sooner you start writing code like someone who actually owns it.&lt;/p&gt;




&lt;p&gt;Let's be clear, there's nothing wrong with using Google, Stack Overflow, or LLMs.&lt;/p&gt;

&lt;p&gt;In fact, it'd be silly not to. These tools exist to help us move faster, solve problems, and learn from each other.&lt;br&gt;&lt;br&gt;
But the line between help and habit is thin.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The real issue isn't the tool — it's skipping the thinking part.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you're not taking the time to understand the problem, you're not growing. You're just duct-taping your way through it.&lt;/p&gt;

&lt;p&gt;So use the tools. Copy that snippet. Ask that LLM.&lt;br&gt;&lt;br&gt;
But do it &lt;strong&gt;after&lt;/strong&gt; you've read the error, asked questions, formed a theory, and tried thinking it through.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stay Curious. Adios 👋&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>productivity</category>
      <category>discuss</category>
      <category>ai</category>
    </item>
    <item>
      <title>MMMCP - An MCP Server for Multi-Model Prompts</title>
      <dc:creator>hiruthicSha</dc:creator>
      <pubDate>Sun, 25 May 2025 05:35:00 +0000</pubDate>
      <link>https://dev.to/hiruthicsha/mmmcp-an-mcp-server-for-multi-model-prompts-3g0</link>
      <guid>https://dev.to/hiruthicsha/mmmcp-an-mcp-server-for-multi-model-prompts-3g0</guid>
      <description>&lt;p&gt;As a software engineer deeply engaged with large language models (LLMs) like &lt;a href="https://medium.com/r/?url=https%3A%2F%2Fchatgpt.com%2F" rel="noopener noreferrer"&gt;ChatGPT&lt;/a&gt;, &lt;a href="https://medium.com/r/?url=https%3A%2F%2Fclaude.ai%2F" rel="noopener noreferrer"&gt;Claude&lt;/a&gt;, and &lt;a href="https://medium.com/r/?url=https%3A%2F%2Fgemini.google.com%2F" rel="noopener noreferrer"&gt;Gemini&lt;/a&gt;, I often cross-reference their responses to gain diverse perspectives. This practice sparked a question: Can I streamline this process?&lt;/p&gt;

&lt;p&gt;I also started seeing a wave of posts claiming how easy it is to build an MCP server. That was enough motivation, even if it didn't work out, I knew I'd learn about building an MCP and gain hands-on experience in the process.&lt;/p&gt;

&lt;p&gt;This project was born out of one of my regular weekend hackathons, something I've written about in &lt;a href="https://medium.com/@hiruthicsha/code-coffee-and-a-weekend-my-personal-hackathon-ritual-c6d8d48894da" rel="noopener noreferrer"&gt;Code, Coffee, and a Weekend: My Personal Hackathon Ritual&lt;/a&gt;. If you've ever felt that itch to just build something for the joy of it, you'll relate.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is MCP?
&lt;/h2&gt;

&lt;p&gt;I'm sure, at this point you would have bombarded by the new buzz word "MCP Server". So Ill keep it brief.&lt;/p&gt;

&lt;h3&gt;
  
  
  Problem
&lt;/h3&gt;

&lt;p&gt;Integrating LLMs with external systems is a mess. Every use case required custom scripts, tool-specific APIs, and brittle logic hardcoded into the prompt or application. This is a headache even in small-scale use cases due to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Tight coupling: Tools and models were glued together in non-standard ways.&lt;/li&gt;
&lt;li&gt;Lack of reusability: Every integration had to be rebuilt from scratch.&lt;/li&gt;
&lt;li&gt;Security concerns: Exposing sensitive systems via direct API calls was risky.&lt;/li&gt;
&lt;li&gt;One-way interactions: Models could only respond, not act or observe.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Solution
&lt;/h3&gt;

&lt;p&gt;Model Context Protocol (MCP) is Anthropic's attempt to fix this mess.&lt;br&gt;
MCP is a standard protocol that allows models to interact with external tools in a structured, secure, and two-way fashion. Here's what it improves:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Two-way communication: Models can request data and act on responses.&lt;/li&gt;
&lt;li&gt;Modular design: Tools are plug-and-play, and models can discover and invoke them dynamically.&lt;/li&gt;
&lt;li&gt;Security-first: Tool usage is transparent, scoped, and auditable.&lt;/li&gt;
&lt;li&gt;Context awareness: Tools can expose metadata, usage instructions, and schemas that the model can understand natively.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This makes LLM integrations predictable, scalable, and safer. Here is a general statement you'll see for an MCP:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Think of MCP as the "USB-C" for AI applications, providing a standardized way to connect AI models to various services and datasets.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here is a shameless plug: &lt;a href="https://www.instagram.com/p/DIpoV9OzayA" rel="noopener noreferrer"&gt;https://www.instagram.com/p/DIpoV9OzayA&lt;/a&gt; Please follow!😌&lt;/p&gt;

&lt;h2&gt;
  
  
  Building MMMCP
&lt;/h2&gt;

&lt;p&gt;I'd been hearing about MCP for a while but didn't pay it much attention at first. However, since I'm someone who loves automating anything that seems possible, I knew I had to give it a shot. If you've been following my other articles, you already know I'm a bit of an automation freak…&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://medium.com/@hiruthicsha/goodbye-setup-scripts-ansible-made-my-home-server-management-easier-ba56d02cc118" rel="noopener noreferrer"&gt;Goodbye Setup Scripts: Ansible Made My Home Server Management Easier&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@hiruthicsha/apply-the-dry-principle-to-your-life-automate-repetitive-tasks-for-greater-efficiency-a606abf57e29" rel="noopener noreferrer"&gt;Apply the DRY principle to your life: automate repetitive tasks for greater efficiency&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/r/?url=https%3A%2F%2Fhiruthicsha.medium.com%2Fstop-struggling-these-tricks-will-instantly-boost-your-productivity-c3b4f0499e5e" rel="noopener noreferrer"&gt;Stop Struggling! These Tricks Will Instantly Boost Your Productivity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/r/?url=https%3A%2F%2Fhiruthicsha.medium.com%2Ftips-for-becoming-an-efficient-developer-28442f998320" rel="noopener noreferrer"&gt;Tips for becoming an efficient developer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/r/?url=https%3A%2F%2Fhiruthicsha.medium.com%2Fthe-hidden-roi-of-coding-how-i-built-software-that-saved-me-a-fortune-965e028dced0" rel="noopener noreferrer"&gt;The Hidden ROI of Coding: How I Built Software That Saved Me a Fortune&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Problem
&lt;/h3&gt;

&lt;p&gt;The problem I faced was that I've been using LLMs since before ChatGPT went mainstream, and I often cross-check answers from multiple models to reduce bias and gain richer insights. For example, Claude tends to make fewer coding errors, Gemini (sometimes in the &lt;a href="https://medium.com/r/?url=https%3A%2F%2Faistudio.google.com%2F" rel="noopener noreferrer"&gt;AI Studio&lt;/a&gt;) is more expressive, and ChatGPT excels at handling complex context. Comparing their responses helps me think more critically and make better decisions.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I Built
&lt;/h3&gt;

&lt;p&gt;Motivated by the need for a more efficient comparison between LLMs, I developed MMMCP (Multi-Model MCP Server). This MCP server:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Accepts any prompt.&lt;/li&gt;
&lt;li&gt;Fetches responses from OpenAI's GPT-3.5 and Google's Gemini Pro asynchronously.&lt;/li&gt;
&lt;li&gt;Returns both responses for quick comparison.&lt;/li&gt;
&lt;li&gt;Optionally summarizes the outputs for a consolidated view.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The MMMCP server is built using Python(for now) and sends the prompt to multiple LLMs through API calls.&lt;/p&gt;

&lt;h3&gt;
  
  
  Future Enhancements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Update the code architecture to provide a better experience in adding new models.&lt;/li&gt;
&lt;li&gt;Integrate additional LLMs for broader comparisons.&lt;/li&gt;
&lt;li&gt;Enhance summarization capabilities to be able to configure by the user for more personalized outputs.&lt;/li&gt;
&lt;li&gt;Building the project in Python introduced one challenge: deploying it to Cloudflare. While Cloudflare offers beta support for Python, I'm hesitant to rely on it just yet. So, I'm planning to migrate the project to JavaScript for better compatibility.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here is the project: &lt;a href="https://github.com/hiruthicShaSS/MMMCP" rel="noopener noreferrer"&gt;https://github.com/hiruthicShaSS/MMMCP&lt;/a&gt;. I built it over a weekend, so it's not perfect, it needs refactoring and better decoupling to make adding new models easier. I'll update it when I have time, but I welcome any feedback or suggestions. Feel free to open a PR if you'd like to contribute! 🙂&lt;/p&gt;




&lt;p&gt;BTW, if you want to learn more about MCP, Hugging Face has an extraordinary course on this topic: &lt;a href="https://huggingface.co/learn/mcp-course/unit0/introduction" rel="noopener noreferrer"&gt;https://huggingface.co/learn/mcp-course/unit0/introduction&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Stay Curious. Adios 👋&lt;br&gt;
Cover image generated with &lt;a href="https://chatgpt.com/" rel="noopener noreferrer"&gt;ChatGPT&lt;/a&gt;&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>llm</category>
      <category>chatgpt</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
