BlitzAdmin Automation Architecture

What We Now Know About BlitzAdmin

After reading Dylan Kirby’s project handoff emails (Sept 2025) and Sam’s documentation, here’s the confirmed technical architecture of the site builder.

Code Repositories (GitLab)

Repo Purpose Tech Stack
git.adectra.com/blitzmetrics/wordpress-site-builder The core BlitzAdmin site builder AWS Lambda, Python, PHP
git.adectra.com/blitzmetrics/white-label-dash/white-label-dash-back-end White-label dashboard backend (credential store, site management) Python, AWS Lambda
git.adectra.com/blitzmetrics/white-label-dash/white-label-dash-front-end White-label dashboard frontend Angular

Tech Stack (Confirmed)

Layer Technology Details
Compute AWS Lambda Serverless functions handle site provisioning
Backend Python + PHP Lambda functions in Python; WordPress plugins in PHP
Frontend (Dashboard) Angular White-label dashboard UI
Email Amazon SES Auto-configured for site form submissions
DNS Custom nameservers 4 nameservers provided per site
WordPress Theme Astra / Custom templates Imported via .wpress template files
Page Builder Elementor Drag-and-drop page builder
SEO Rank Math Pro Schema, meta, sitemaps
Custom Plugin Content Factory Auto-injects client info (social links, Google properties)
Custom Plugin Digital Plumbing Google Tag Manager integration
Migration All-In-One WP Migration Template import via .wpress files
Domain Registrar GoDaddy Primary domain purchasing
Hosting (Enterprise) Flywheel For high-touch custom builds

Required Skills for Engineering

From Dylan’s handoff: Must-haves: AWS (esp. Lambda), Python, PHP, WordPress (custom plugins). Nice-to-haves: Angular, Bash, Google & Meta APIs.

Current Process vs. Target Process

How It Works Today (6 Steps, 3 Manual)

# Step Who Status
1 Buy domain on GoDaddy Human MANUAL
2 Submit domain on blitzadmin.com → get 4 nameservers Human MANUAL
3 Update nameservers at GoDaddy Human MANUAL
4 WordPress site auto-provisions (24-48 hrs DNS propagation) BlitzAdmin AUTOMATED
5 Import .wpress template, run find/replace for client name VA MANUAL
6 Populate content pages manually VA MANUAL
Existing Shortcut: CSV Bulk Upload

Dylan built a CSV bulk upload feature — you provide a CSV of domain names and BlitzAdmin spins them all up within a day with vanilla Twenty Twenty-One theme. This handles steps 2-4 in bulk but still leaves steps 1, 5, and 6 manual.

Target Process (Zero-Human, 6 Steps All Automated)

# Step Who How
1 Purchase domain Claude GoDaddy MCP tools (already working)
2 Point nameservers to BlitzAdmin Claude GoDaddy API to update NS records BUILD
3 Trigger site provisioning Claude BlitzAdmin provisioning API MODIFY
4 Wait for DNS + auto-provision BlitzAdmin Already automated
5 Import template + configure site Claude WordPress REST API via MCP connector BUILD
6 Research person + populate content Claude Web search + Ahrefs + WP REST API (partially working)

The 3 Things We Need to Build

Everything else already exists. These are the only gaps between the current manual process and full automation.

Build 1: GoDaddy DNS Automation

Purpose: Automate nameserver changes after domain purchase

Currently a human logs into GoDaddy, navigates to DNS management, and types in 4 nameservers. This should be a single API call.

Technical Approach

The GoDaddy API has a PUT /v1/domains/{domain}/records/NS endpoint that updates nameserver records. We need to store the GoDaddy API key/secret and the 4 BlitzAdmin nameserver addresses, then expose a Claude tool that calls this endpoint after domain purchase.

# Pseudocode for NS update
def update_nameservers(domain: str):
    godaddy_api.put(
        f"/v1/domains/{domain}/records/NS",
        headers={"Authorization": f"sso-key {API_KEY}:{API_SECRET}"},
        json=[
            {"data": "ns1.blitzadmin.com", "ttl": 3600},  # Replace with actual NS
            {"data": "ns2.blitzadmin.com", "ttl": 3600},
            {"data": "ns3.blitzadmin.com", "ttl": 3600},
            {"data": "ns4.blitzadmin.com", "ttl": 3600},
        ]
    )

Effort: ~2 hours. The GoDaddy MCP already has domain tools — this is just adding nameserver update capability.

Build 2: BlitzAdmin Provisioning API Enhancement

Purpose: Let Claude trigger site creation and get back API credentials

The site builder currently requires a human to submit the domain through the blitzadmin.com UI. We need an API endpoint that does the same thing, plus auto-generates a WordPress application password for Claude to use.

Changes to the Site Builder Codebase

In git.adectra.com/blitzmetrics/wordpress-site-builder:

Change Where What
Add API endpoint Lambda function (Python) New endpoint: POST /api/provision — accepts domain, client name, admin email, template tier. Returns nameservers + site_id
Auto-create app password Post-provisioning hook After WordPress is installed, run: wp user application-password create blitzadmin “claude-mcp” –porcelain and store the result
Store credentials White-label dashboard backend Save the app password alongside existing site credentials (the lock icon feature)
Add status webhook Lambda function Notify Claude when site is ready (DNS propagated + WordPress installed)

Key Insight: The White-Label Dashboard Already Stores Credentials

Dylan’s system already has a credential store — the white-label dashboard with the “lock icon” that shows site passwords. We don’t need to build a new credential store; we just need to add a column for the application password and expose it via an API endpoint that the MCP connector reads.

# In the white-label-dash-back-end repo
# New Lambda endpoint: GET /api/sites/{domain}/credentials
def get_site_credentials(domain):
    """Returns credentials for MCP connector"""
    site = db.get_site(domain)
    return {
        "site_url": site.url,
        "wp_username": site.admin_username,
        "app_password": site.application_password,  # NEW FIELD
        "admin_email": site.admin_email,
        "template_tier": site.tier,
        "provisioned_date": site.created_at
    }

Effort: ~1-2 days. This is the biggest change — modifying the Lambda functions and adding the application password generation to the post-provisioning hook. The CSV bulk upload flow should also be updated to generate app passwords.

Build 3: BlitzAdmin MCP Connector (Claude’s Gateway)

Purpose: Give Claude read/write access to every BlitzAdmin site

A lightweight MCP server that reads credentials from the white-label dashboard and talks to each site’s WordPress REST API. This is what lets Claude create posts, update pages, configure Rank Math schema, and manage content without anyone logging in.

Architecture

┌─────────────┐     ┌──────────────────────┐     ┌─────────────────────┐
│   Claude     │────▶│  BlitzAdmin MCP       │────▶│  WordPress Site      │
│   (Cowork)   │     │  Connector            │     │  REST API            │
│              │◀────│                        │◀────│  /wp-json/wp/v2/     │
└─────────────┘     └──────────────────────┘     └─────────────────────┘
                           │                              │
                     ┌─────┴──────┐              ┌────────┴──────────┐
                     │ White-Label │              │  Rank Math API     │
                     │ Dashboard   │              │  /wp-json/rankmath/│
                     │ (cred store)│              │  Content Factory   │
                     └────────────┘              └───────────────────┘

Flow:
1. Claude calls blitz_create_post("thedavidcarroll.com", ...)
2. MCP connector fetches app_password from White-Label Dashboard API
3. MCP connector calls WordPress REST API with Basic Auth
4. WordPress creates the post and returns success

MCP Tools to Expose

Tool Endpoint Priority
blitz_list_sites White-Label Dashboard API P0
blitz_site_status GET /wp-json/ (check site health) P0
blitz_create_post POST /wp-json/wp/v2/posts P0
blitz_update_post PUT /wp-json/wp/v2/posts/{id} P0
blitz_create_page POST /wp-json/wp/v2/pages P0
blitz_update_page PUT /wp-json/wp/v2/pages/{id} P0
blitz_list_content GET /wp-json/wp/v2/posts + /pages P0
blitz_upload_media POST /wp-json/wp/v2/media P1
blitz_get_schema GET /wp-json/rankmath/v1/… P1
blitz_update_schema PUT /wp-json/rankmath/v1/… P1
blitz_update_settings PUT /wp-json/wp/v2/settings P1
blitz_get_plugins GET /wp-json/wp/v2/plugins P2
blitz_provision_site POST /api/provision (Build 2) P1

Starter MCP Server Code

// blitzadmin-mcp/index.js
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";

const DASHBOARD_API = "https://api.blitzadmin.com";  // White-label dashboard
const DASHBOARD_KEY = process.env.BLITZ_API_KEY;

// Fetch site credentials from the White-Label Dashboard
async function getSiteCredentials(domain) {
  const res = await fetch(`${DASHBOARD_API}/api/sites/${domain}/credentials`, {
    headers: { "Authorization": `Bearer ${DASHBOARD_KEY}` }
  });
  if (!res.ok) throw new Error(`Site ${domain} not found`);
  return res.json(); // { site_url, wp_username, app_password }
}

// Generic WordPress REST API caller
async function wpApi(domain, method, endpoint, body = null) {
  const creds = await getSiteCredentials(domain);
  const auth = Buffer.from(
    `${creds.wp_username}:${creds.app_password}`
  ).toString("base64");

  const res = await fetch(`${creds.site_url}/wp-json/wp/v2/${endpoint}`, {
    method,
    headers: {
      "Authorization": `Basic ${auth}`,
      "Content-Type": "application/json",
    },
    body: body ? JSON.stringify(body) : undefined,
  });

  if (!res.ok) throw new Error(`WP API ${res.status}: ${await res.text()}`);
  return res.json();
}

// Tool: Create a blog post
async function createPost({ site, title, content, status, categories }) {
  const result = await wpApi(site, "POST", "posts", {
    title, content, status: status || "draft", categories
  });
  return `Post created: "${result.title.rendered}"
ID: ${result.id}  |  URL: ${result.link}
Status: ${result.status}`;
}

// Tool: List all content on a site
async function listContent({ site, type }) {
  const endpoint = type === "page" ? "pages" : "posts";
  const items = await wpApi(site, "GET", `${endpoint}?per_page=100`);
  return items.map(i => ({
    id: i.id,
    title: i.title.rendered,
    status: i.status,
    url: i.link,
    modified: i.modified
  }));
}

// Tool: List all BlitzAdmin sites
async function listSites() {
  const res = await fetch(`${DASHBOARD_API}/api/sites`, {
    headers: { "Authorization": `Bearer ${DASHBOARD_KEY}` }
  });
  return res.json();
}

// ... register tools with MCP server framework

Effort: ~1-2 days for the P0 tools, another 1-2 days for P1/P2. Can be built as a Cowork plugin for easy installation.

Retrofitting Existing Sites (Like thedavidcarroll.com)

For sites already provisioned by BlitzAdmin, we need a one-time operation to generate application passwords so Claude can manage them.

Option A: Batch Script via White-Label Dashboard

If the white-label dashboard has SSH/WP-CLI access to all sites (likely, since it manages them), run this across all sites:

#!/bin/bash
# retrofit-app-passwords.sh
# Run once to generate application passwords for all existing BlitzAdmin sites

SITES=$(curl -s "${DASHBOARD_API}/api/sites" -H "Authorization: Bearer ${API_KEY}" | jq -r '.[].domain')

for site in $SITES; do
  echo "Generating app password for $site..."
  # SSH into the site's WordPress install and create app password
  APP_PASS=$(wp user application-password create blitzadmin "claude-mcp" --porcelain --url="https://$site")

  # Store the password in the dashboard
  curl -X PUT "${DASHBOARD_API}/api/sites/$site/credentials" \
    -H "Authorization: Bearer ${API_KEY}" \
    -H "Content-Type: application/json" \
    -d "{\"application_password\": \"$APP_PASS\"}"

  echo "  Done: $site"
done

Option B: One-at-a-Time via wp-admin

For a quick proof of concept on thedavidcarroll.com right now:

1. Log into thedavidcarroll.com/wp-admin (credentials in white-label dashboard lock icon)
2. Go to Users → Profile → Application Passwords
3. Enter name: “claude-mcp” and click Add New Application Password
4. Copy the generated password and share it with me
5. I immediately start creating content via REST API

Recommendation: Do Option B right now for the proof of concept on David Carroll’s site, then build Option A for the fleet.

This lets us prove the content pipeline works today while the engineering work on the provisioning API happens in parallel.

Content Factory Plugin — What It Already Does

BlitzAdmin already has a custom WordPress plugin called Content Factory that auto-injects client information (social links, Google properties). This is important because it means some of the “personalization” step is already partially automated.

What Content Factory Handles

Feature Status Notes
Social media links in header/footer Auto Sometimes needs manual adjustment
Google Analytics / GTM integration Auto Via Digital Plumbing plugin (Tier 2+)
Client name injection Manual Currently via Better Search and Replace plugin
Page content population Manual VA fills in placeholder content
Schema/structured data Manual Configured in Rank Math per-site

The MCP connector replaces the manual steps — Claude does the find/replace, content population, and Rank Math configuration via API instead of a VA doing it by hand.

End-to-End: “Build a Site for David Carroll”

Here’s exactly what happens when someone says this to Claude, once all 3 builds are complete:

1
Domain Search
GoDaddy MCP
2
Purchase Domain
GoDaddy API
3
Set Nameservers
GoDaddy API (Build 1)
4
Provision Site
BlitzAdmin API (Build 2)
5
Research Person
Web + Ahrefs (exists)
6
Populate Content
WP API via MCP (Build 3)

Step-by-Step Detail

Step 1-2 (Domain): ~2 minutes
Claude: “Let me check domain availability for David Carroll.” Calls domains_suggest(“David Carroll entrepreneur Minneapolis”) and domains_check_availability(“thedavidcarroll.com”). Presents options. On approval, completes purchase.

Step 3 (DNS): ~1 minute
Claude calls the GoDaddy API to update nameservers to BlitzAdmin’s 4 NS records. Confirms change.

Step 4 (Provisioning): ~30 minutes to 48 hours
Claude calls blitz_provision_site which triggers BlitzAdmin’s Lambda function. DNS propagation happens. BlitzAdmin auto-creates the WordPress site, installs all plugins, and generates an application password. Claude gets notified when ready (or polls periodically).

Step 5 (Research): ~5 minutes
While waiting for DNS, Claude runs the full research playbook: web search for media features, podcast appearances, social profiles; Ahrefs for SEO baseline; YouTube for video content. Produces a structured dossier. (We already proved this works — see the David Carroll audit report from this session.)

Step 6 (Content): ~15 minutes
Claude uses the MCP connector to: (a) Update site title and tagline, (b) Create/update About page with full biography from research, (c) Create Press & Media page with publication logos and links, (d) Create Podcast page with embeds, (e) Write and publish 3 SEO-optimized blog posts, (f) Configure Rank Math Person schema with sameAs links, (g) Generate a final report for the team.

Total time: ~25 minutes of Claude work + DNS wait time. Zero human logins.

Template Tiers (From Existing Documentation)

BlitzAdmin has a tiered template system. Each tier determines which plugins and features are installed.

Feature Tier 1 (Basic) Tier 2 (Standard) Tier 3 (Premium)
WordPress + Astra + Elementor Yes Yes Yes
Rank Math Pro Yes Yes Yes
Content Factory plugin Yes Yes Yes
Amazon SES email Yes Yes Yes
Digital Plumbing (GTM) No Yes Yes
Google Search Console verification No Yes Yes
Custom template design No No Yes

For the automated pipeline, all personal brand sites should be Tier 2 minimum so they get Digital Plumbing and Search Console verification automatically.

QA Checklist (From Existing Documentation)

These are the quality benchmarks from the existing BlitzMetrics documentation. Claude should verify these after every site build.

Metric Target How Claude Checks
Pages indexed by Google 100+ Google Search Console API via Ahrefs
Domain rating 20+ Ahrefs domain-rating tool
PageSpeed score 90+ (mobile & desktop) PageSpeed Insights API
Homepage payload 5 MB or under WebFetch + size check
Admin login URL NOT /wp-admin Verified during provisioning
Digital Plumbing Configured GTM tag verification
All software up to date Latest versions WP REST API plugins endpoint
404 pages None Search Console / Ahrefs crawl
Page title matches headline Yes WebFetch comparison
Meta description = first paragraph Yes Rank Math API

Immediate Next Steps

Today (Proof of Concept)

1. Create an application password on thedavidcarroll.com

Dennis: Log into thedavidcarroll.com/wp-admin (credentials should be in the white-label dashboard lock icon — or use access@blitzmetrics.com / jauFoDLbfzhy if it’s the default). Go to Users → Profile → Application Passwords, create one called “claude-mcp”, and share the password with me. I’ll immediately start pushing content.

2. Give me access to the GitLab repos

I need read access to git.adectra.com/blitzmetrics/wordpress-site-builder and white-label-dash-back-end to identify the exact files where I need to add the provisioning API endpoint and application password generation. Share via Git clone, ZIP download, or give me GitLab credentials.

This Week (Build 3 — MCP Connector)

3. Build the MCP connector as a Cowork plugin

Once I have one working application password (from step 1), I can build and test the full MCP connector. It starts as a hardcoded proof of concept, then evolves to read from the white-label dashboard API once Build 2 is complete.

Next 2 Weeks (Builds 1 & 2)

4. Modify the site builder Lambda functions

With repo access, I can write the code changes for: (a) the provisioning API endpoint, (b) application password auto-generation, and (c) the credential store update. I’ll submit these as merge requests for review.

5. Retrofit all existing sites

Run the batch script to generate application passwords across all existing BlitzAdmin sites. This is a one-time operation that unlocks Claude management for the entire fleet.

Month 1 (Full Pipeline Live)

6. End-to-end test: “Build a personal brand site for [Name]”

Run the complete pipeline from domain purchase to published content. Document any issues. Iterate. Then open it to the team.

Summary

BlitzAdmin already does most of what we need. The site builder auto-provisions WordPress sites, Content Factory auto-injects client info, and the white-label dashboard stores credentials. We only need 3 builds to go from “3 manual steps” to “zero manual steps” — and the hardest one (Build 2) is a modification of existing Lambda code, not a greenfield build.

The fastest path: get one application password working on thedavidcarroll.com today, prove the content pipeline, then build outward.

Sources: Dylan Kirby project handoff (Sept 2025), Sam McLeod documentation, BlitzMetrics personal branding checklist

Architecture Document v2.0 • April 5, 2026

Scroll to Top