<?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: Michael Egberts</title>
    <description>The latest articles on DEV Community by Michael Egberts (@megberts).</description>
    <link>https://dev.to/megberts</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%2F3842727%2F72c75668-5f03-4d45-8287-c5aaa231ad58.jpg</url>
      <title>DEV Community: Michael Egberts</title>
      <link>https://dev.to/megberts</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/megberts"/>
    <language>en</language>
    <item>
      <title>Week 16 Dev Log: From First Customer to 56 MCP Tools — Building an AI-Native Website Publisher</title>
      <dc:creator>Michael Egberts</dc:creator>
      <pubDate>Mon, 13 Apr 2026 14:05:54 +0000</pubDate>
      <link>https://dev.to/megberts/week-16-dev-log-from-first-customer-to-56-mcp-tools-building-an-ai-native-website-publisher-511k</link>
      <guid>https://dev.to/megberts/week-16-dev-log-from-first-customer-to-56-mcp-tools-building-an-ai-native-website-publisher-511k</guid>
      <description>&lt;p&gt;I'm building WebsitePublisher.ai — a platform where AI assistants build and publish websites through MCP (Model Context Protocol) tools. This week: first paying customer, team collaboration, and some interesting architecture decisions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Stack&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Quick context: Laravel/PHP backend, dual-server DigitalOcean cluster, Redis Sentinel, MySQL, S3 for assets. The AI layer is a multi-API stack:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PAPI&lt;/strong&gt; — pages and assets&lt;br&gt;
&lt;strong&gt;MAPI&lt;/strong&gt; — entities and structured data&lt;br&gt;
&lt;strong&gt;VAPI&lt;/strong&gt; — vault/secrets management&lt;br&gt;
&lt;strong&gt;IAPI&lt;/strong&gt; — third-party integrations (Stripe, Resend, Twilio, etc.)&lt;br&gt;
&lt;strong&gt;SAPI&lt;/strong&gt; — sessions, forms, visitor auth&lt;br&gt;
&lt;strong&gt;TAPI&lt;/strong&gt; — task tracking across AI sessions&lt;br&gt;
&lt;strong&gt;AAPI&lt;/strong&gt; — scheduled automations&lt;/p&gt;

&lt;p&gt;All exposed as MCP tools. Currently 56 tools, accessible from Claude, ChatGPT, Cursor, Windsurf, GitHub Copilot, Gemini, Grok, Mistral, and n8n.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What shipped this week&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Team Collaboration&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Our first paying customer — an agency — asked for multi-user support on day one. We shipped it within 48 hours:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Owner invites team members via email&lt;/li&gt;
&lt;li&gt;Team members get full access to all projects&lt;/li&gt;
&lt;li&gt;Magic link authentication (no passwords)&lt;/li&gt;
&lt;li&gt;Max 5 members per Agency account&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Architecture decision: no per-project granularity in v1. Simpler model, ship fast, iterate based on real usage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dashboard Vault — Secrets Without AI Exposure&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A security feature I'm particularly proud of: the Vault tab lets users manage API keys (Stripe, Resend, etc.) through the browser UI. The key insight: &lt;strong&gt;if you share an API key in an AI chat, it ends up in transcripts, logs, and context windows.&lt;/strong&gt; The Vault bypasses AI entirely — write-once, never displayed, rotate or delete only.&lt;/p&gt;

&lt;p&gt;Backend uses AES-256-GCM encryption keyed per project, so even if someone gains database access, secrets from other projects are unreadable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Language Refactor — From 4 Hardcoded Lists to Zero&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Our AI Coach (a conversational website builder) needed proper i18n. The old code had 4 separate hardcoded language→string mappings scattered across the codebase. We refactored to a single CapiLanguage value object with a Redis → DB → Haiku → fallback chain:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Check Redis cache&lt;/li&gt;
&lt;li&gt;Check papi_language_meta table (27 seeded languages)&lt;/li&gt;
&lt;li&gt;Ask Claude Haiku for language detection (costs ~$0.001)&lt;/li&gt;
&lt;li&gt;Fall back to English&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Result: any of the 250+ ISO 639-1 codes work automatically. Adding a new language = 1 database row.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;get_asset MCP Tool — Closing the Read Gap&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We had tools to list, upload, patch, and delete assets — but no tool to read them. AI agents were doing blind find/replace via patch_asset without knowing the current file state. get_asset closes that gap: text content returned directly, binary assets as base64.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Activation Challenge&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;67 signups, one paying customer. The gap is real. Our research this week showed that the friction is in the "how do I start?" moment — users sign up, see a dashboard, but don't know which AI platform to connect or how to begin.&lt;/p&gt;

&lt;p&gt;Our answer: an embedded AI coach right inside the dashboard. Uses Sonnet (not Opus — cost control), generates one concept, writes directly to the user's first project. From "I just signed up" to "I have a website" in under 2 minutes.&lt;/p&gt;

&lt;p&gt;What's next&lt;/p&gt;

&lt;p&gt;Friday release agent (AAPI-powered automated changelog + test plans)&lt;br&gt;
patch_asset optimistic concurrency (base version hash to prevent conflicts)&lt;br&gt;
CAPI language refactor retest (waiting on external tester confirmation)&lt;/p&gt;

&lt;p&gt;If you're building with MCP or interested in AI-native development tools, I'd love to connect. The MCP ecosystem is moving fast.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub&lt;/strong&gt;: megberts/websitepublisher-mcp&lt;br&gt;
&lt;strong&gt;MCP Server&lt;/strong&gt;: mcp.websitepublisher.ai&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>webdev</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>How we built an MCP server that lets AI assistants publish complete websites</title>
      <dc:creator>Michael Egberts</dc:creator>
      <pubDate>Wed, 25 Mar 2026 07:53:24 +0000</pubDate>
      <link>https://dev.to/megberts/how-we-built-an-mcp-server-that-lets-ai-assistants-publish-complete-websites-3mjh</link>
      <guid>https://dev.to/megberts/how-we-built-an-mcp-server-that-lets-ai-assistants-publish-complete-websites-3mjh</guid>
      <description>&lt;p&gt;Building a website with an AI assistant usually ends the same way: you get a wall of HTML in a code block, you paste it somewhere, and then you're on your own for hosting, deployment, and every update after that.&lt;br&gt;
We wanted to fix that. So we built WebsitePublisher.ai — a platform where AI assistants don't just describe websites, they actually build and publish them.&lt;br&gt;
Here's how it works under the hood.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The core idea: AI as a first-class developer&lt;/strong&gt;&lt;br&gt;
The premise is simple. Instead of AI being a code generator that hands off to a human, we wanted AI to be the developer — with access to a real API it can call directly.&lt;br&gt;
That API needed to cover the full stack of what a website actually needs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pages and assets (HTML, CSS, images)&lt;/li&gt;
&lt;li&gt;Structured data (entities, records)&lt;/li&gt;
&lt;li&gt;Forms and visitor sessions&lt;/li&gt;
&lt;li&gt;Integrations (email, SMS, payments)&lt;/li&gt;
&lt;li&gt;Scheduled tasks&lt;/li&gt;
&lt;li&gt;Vault (credentials management)
So we built it. Eight API layers, all exposed through a Model Context Protocol (MCP) server.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What MCP gives us&lt;/strong&gt;&lt;br&gt;
MCP is an open protocol that lets AI assistants call tools — similar to function calling, but standardized across clients. Claude, ChatGPT, Cursor, Windsurf, GitHub Copilot, and others all support it.&lt;br&gt;
Our MCP server exposes ~55 tools. An AI can call &lt;em&gt;create_page&lt;/em&gt; with HTML content and it's live. It can call &lt;em&gt;configure_form&lt;/em&gt; and a contact form appears. It can call &lt;em&gt;create_scheduled_task&lt;/em&gt; and a nightly content refresh starts running.&lt;br&gt;
The AI doesn't need to know about hosting, DNS, or deployment. It just calls the tools.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The API layers&lt;/strong&gt;&lt;br&gt;
We ended up with eight layers, each with a clear responsibility:&lt;br&gt;
&lt;em&gt;PAPI (Pages &amp;amp; Assets)&lt;/em&gt; — Create, update, and version HTML pages and static assets. Includes diff-patch for surgical updates, URL fetching, and a content quality warning system.&lt;br&gt;
&lt;em&gt;MAPI (Entities &amp;amp; Data)&lt;/em&gt; — A schema-less data layer. The AI defines entities (think: database tables) and creates records. Powers everything from contact lists to leaderboards to inventory.&lt;br&gt;
&lt;em&gt;SAPI (Sessions &amp;amp; Forms)&lt;/em&gt; — Anonymous visitor sessions, form submissions, visitor authentication, and analytics. No cookies to configure — it just works.&lt;br&gt;
&lt;em&gt;VAPI (Vault)&lt;/em&gt; — Encrypted credential storage. The AI stores API keys that are then used by integrations — never exposed back to the client.&lt;br&gt;
&lt;em&gt;IAPI (Integrations)&lt;/em&gt; — A proxy engine that routes calls through stored credentials to external services. Resend, Mailgun, Stripe, Mollie, Twilio — the AI picks the integration, the vault provides the credentials.&lt;br&gt;
&lt;em&gt;AAPI (Agent API)&lt;/em&gt; — Scheduled tasks. The AI creates cron jobs that run PHP handlers on a schedule. Daily content refresh, nightly cleanup, automated data sync.&lt;br&gt;
&lt;em&gt;CAPI (Coach API)&lt;/em&gt; — A conversational intake system. Ask four questions, generate a complete website. The AI handles the conversation; the platform handles the generation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A real example&lt;/strong&gt;&lt;br&gt;
Here's what a Claude session looks like when building a site from scratch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User: Build me a landing page for my consulting business. Focus on lead generation.

Claude: [calls get_skill to load WebsitePublisher context]
[calls create_page with full HTML/CSS]
[calls configure_form with name, email, message fields]
[calls setup_integration with Resend credentials]
[calls execute_integration to test email delivery]

Done — your page is live at yourproject.websitepublisher.ai.
The contact form sends leads to your inbox via Resend.
Want me to add a thank-you page or set up SMS notifications too?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No copy-paste. No deployment step. The AI did it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The interesting engineering problems&lt;/strong&gt;&lt;br&gt;
A few things that weren't obvious until we built them:&lt;br&gt;
&lt;em&gt;Multi-session coordination&lt;/em&gt;. When multiple AI sessions work on the same project in parallel, they can overwrite each other's progress. We built TAPI — an append-only task tracking system — specifically to solve this. Each session logs progress via INSERTs only. MAX(completion_pct) from history records prevents any session from accidentally rolling back another's progress.&lt;br&gt;
&lt;em&gt;Tool count limits&lt;/em&gt;. Our MCP server returns 55 tools in tools/list. Some clients have limits on how many they load. Our workaround: the get_skill tool loads a SKILL.md document that gives the AI a map of the full API — so even with five tools loaded, it can use the REST API directly for everything else.&lt;br&gt;
&lt;em&gt;Content quality detection&lt;/em&gt;. AIs occasionally send a file path instead of HTML content to create_page. We added a WarningCollector that catches this pattern and returns a structured warning before anything gets saved.&lt;br&gt;
&lt;em&gt;Authentication across API layers&lt;/em&gt;. Each layer needed a different auth model. Project tokens (wpa_) for AI access. Dashboard sessions (wps_) for humans. Admin tokens (wsa_) for visitor-facing login flows. Getting these to coexist cleanly took a few iterations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's next&lt;/strong&gt;&lt;br&gt;
We're currently in the Mistral sprint — working on SSE streaming for the conversational intake (so responses feel instant instead of batched), parallel concept generation, and getting listed in Mistral's connector directory.&lt;br&gt;
If you're building with MCP, or thinking about what "AI-native" infrastructure actually means in practice — we'd love to hear what you think.&lt;/p&gt;

&lt;p&gt;The MCP server is at mcp.websitepublisher.ai&lt;br&gt;
Full docs at websitepublisher.ai/docs&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>webdev</category>
      <category>cloud</category>
    </item>
  </channel>
</rss>
