Skip to content

Cloudflare MCP & Landing-Page Deploy Pipeline

Set up 2026-07-19. Session: landing-page revamp (pricing, testimonials, blog SEO).

Cloudflare MCP (Claude Code can manage Cloudflare directly)

Claude Code has the official Cloudflare plugin installed and OAuth-authorized against the Hariandprojects@gmail.com account (d1c23d717393388cf15b570c881e6bb5).

  • Install (already done, per-user): claude plugin marketplace add cloudflare/skills then claude plugin install cloudflare@cloudflare, then /reload-plugins in the session.
  • First tool use triggers OAuth in the browser; re-auth the same way if tokens expire.
  • The cloudflare-api MCP exposes the full REST API via cloudflare.request() — Pages projects/deployments/env vars, DNS records, Workers scripts & routes, zone settings. It can also hit undocumented dashboard endpoints (e.g. Pages deploy hooks under /pages/projects/<name>/deploy_hooks).
  • Destructive calls (DELETE) and raw curl to hook URLs get blocked by the permission classifier — expect a confirmation prompt.

Landing page hosting (facts verified via API)

  • Cloudflare Pages project landing-page ← GitHub astradial/landing-page, branch master, build npm run build:staticout/ (static export; output: "export").
  • Domains: astradial.com, www.astradial.com, landing-page-110.pages.dev.
  • Env vars (production + preview): Firebase client config, FIREBASE_SERVICE_ACCOUNT_JSON (secret, used at build time to read Firestore blogs), and now NEXT_PUBLIC_DEPLOY_HOOK_URL.

Blog auto-deploy pipeline (LIVE, verified end-to-end)

Static export means the site only updates on rebuild. The pipeline:

  1. Dashboard publish (BlogForm) writes the post to Firestore, then POSTs to the deploy hook: https://api.cloudflare.com/client/v4/pages/webhooks/deploy_hooks/c60fe5af-0e0b-480b-a25f-bf6e7064fdfb (hook firestore-blog-publish, existed since May, wired up this session via NEXT_PUBLIC_DEPLOY_HOOK_URL on the project + .env.local).
  2. Cloudflare rebuilds from master (~90 s); build fetches published blogs from Firestore.
  3. Verified 2026-07-19: hook fired → deployment d2b89eb1 → post live on astradial.com.

Blog behavior shipped alongside: newest-first ordering (in-code sort, no Firestore composite index), drafts excluded from generateStaticParams, SEO slugs from titles with clash-guard suffix (old ID URLs still build; canonical points at the slug), table content block (script-authored posts only — the dashboard editor can't author tables yet).

SEO baseline added

sitemap.xml (app/sitemap.ts, includes every blog slug), public/robots.txt (disallows /dashboard), real root meta description (was "Generated by create next app"), canonical + OpenGraph + Article JSON-LD on blog pages. Manual follow-ups: submit sitemap in Search Console; Google Business Profile for GEO.

Gotcha found: stale Superblog Worker route on www

Worker script astra proxies www.astradial.com/blogs*astradial.superblog.click (dead old blog host) → 404 on www/blogs only; apex works. Fix = delete that Workers route on the astradial.com zone (route id 072a9ce1fd774ef281d6fa329f0cd7e2). Resolved 2026-07-19: route deleted via MCP; www/blogs verified 200.