<?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: Saja Sayara</title>
    <description>The latest articles on DEV Community by Saja Sayara (@sajasayara).</description>
    <link>https://dev.to/sajasayara</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4112346%2Fb67b5d57-efe4-4c00-b35f-f9d5671254b9.png</url>
      <title>DEV Community: Saja Sayara</title>
      <link>https://dev.to/sajasayara</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sajasayara"/>
    <language>en</language>
    <item>
      <title>From Zero to Shipped: My Journey Building an MCP Server</title>
      <dc:creator>Saja Sayara</dc:creator>
      <pubDate>Sun, 06 Sep 2026 13:17:17 +0000</pubDate>
      <link>https://dev.to/sajasayara/from-zero-to-shipped-my-journey-building-an-mcp-server-42ei</link>
      <guid>https://dev.to/sajasayara/from-zero-to-shipped-my-journey-building-an-mcp-server-42ei</guid>
      <description>&lt;p&gt;From Zero to Shipped: My Journey Building an MCP Server&lt;/p&gt;

&lt;p&gt;Six weeks ago, "MCP" didn't mean anything to me. Today, I've shipped tools, published a live website, and learned more about backend engineering — and about myself as a builder — than I expected from a single cohort.&lt;/p&gt;

&lt;p&gt;Where I started&lt;/p&gt;

&lt;p&gt;I joined NextFlows Academy's Building an MCP for an AI Engine program with a decent grip on the basics, but the Model Context Protocol itself was completely new territory. The idea that an AI assistant could reach out and call real, validated tools — not just generate text — was exciting, but the actual mechanics of it (stdio transport, schemas, tool lifecycles) took real time to click.&lt;/p&gt;

&lt;p&gt;What I built&lt;/p&gt;

&lt;p&gt;Working with my teammates, we built Quote-of-the-Day, an MCP server that lets an AI host fetch, search, and manage a collection of quotes. I owned two of the six tools:&lt;/p&gt;

&lt;p&gt;list_categories — surfaces every category in our dataset, so a user (or an AI) can browse quotes by theme.&lt;br&gt;
delete_quote — the one I'm most proud of. A delete button sounds simple until you actually think about what could go wrong. I built it to require an explicit confirm: true flag, to refuse to run if it would leave the collection empty, and to take an automatic backup before removing anything. Small details, but they're the difference between a toy feature and something you'd trust in production.&lt;/p&gt;

&lt;p&gt;Every tool we shipped went through Zod validation — strict types, length limits, character allowlists — so the server rejects bad input before it ever touches our data.&lt;/p&gt;

&lt;p&gt;Taking it further&lt;/p&gt;

&lt;p&gt;I didn't want the project to just live in a repo that only developers could appreciate, so I built and published a public project website on GitHub Pages. It walks through what the server does, introduces the team, and includes something I'm genuinely excited about: a Live Console — a section where anyone can actually run our tools, right in their browser, against the real dataset. Not a mockup, not screenshots — the real logic, live.&lt;/p&gt;

&lt;p&gt;Getting there wasn't frictionless. I ran into GitHub's permission model head-on: Collaborator access isn't the same as Admin access, and features like enabling GitHub Pages are gated behind repo ownership. I hit a confusing 404 on my first deploy attempt and had to work backward to realize it was a permissions issue, not a code bug. It was a good reminder that "it doesn't work" often has a boring, fixable cause if you're willing to dig.&lt;/p&gt;

&lt;p&gt;What was genuinely hard&lt;/p&gt;

&lt;p&gt;Two things stretched me the most:&lt;/p&gt;

&lt;p&gt;Writing validation that's strict without being annoying. It's easy to make a delete tool "safe" by making it painful to use. Finding the right balance — safe by default, but not obstructive — took a few iterations.&lt;br&gt;
Matching real behavior everywhere. When I built the Live Console, I made a rule for myself: it had to run the exact same logic as our actual quotes.ts and schemas, not a simplified stand-in. It would have been faster to fake it. It was more honest — and more useful — not to.&lt;br&gt;
What's next&lt;/p&gt;

&lt;p&gt;If I kept building, the first thing I'd add is a real backend behind the website's Live Console, so write actions (creating, updating, deleting quotes) persist for everyone, not just within a visitor's own browser session. Right now it's a great demo; with a backend, it'd be a real shared tool.&lt;/p&gt;

&lt;p&gt;The takeaway&lt;/p&gt;

&lt;p&gt;Six weeks ago I could describe what an API does. Now I've shipped one — tools, validation, safety guards, a live public site — and picked up a real feel for how "it works on my machine" turns into "it works for anyone who opens this link." That gap is most of what backend engineering actually is, and I'm glad I got to close it, mistake by mistake, with a great cohort and mentor around me.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>beginners</category>
      <category>typescript</category>
      <category>mcp</category>
    </item>
  </channel>
</rss>
