SEO that shows up every Monday.
Not a chatbot you prompt — a scheduled colleague. A Claude Code agent that wakes up every Monday morning, measures your Google positions with DataForSEO, checks where you passed or lost ground to your biggest competitor, hunts for keyword gaps, writes a weekly report into your repo, and files build suggestions to Notion for you to approve. It does the grunt work; you keep the wheel.
One routine, backing your whole team.
Every Monday it runs this loop on its own — measure, compare, propose — then hands the calls back to you. The agent does the grunt work; the SEO team stays in charge.
Five steps, then it runs without you.
Work through these in order. Click a step on the left, or use the arrows at the bottom of each panel. The first three get it running; the last two are the part everyone gets wrong — the approval loop and the guardrails.
Connect the DataForSEO MCP server
DataForSEO is the engine room — it's what gives the agent live Google SERP positions, search volume, keyword difficulty and competitor overlap. It's pay-per-use (a full weekly run is cents, not a SEMrush subscription), so you only pay for what the routine actually queries.
- Get API credentialsCreate a DataForSEO account and grab your API login + password from the dashboard. Top up a small balance — a weekly routine costs cents per run.
- Add the server to Claude CodeRun the command below, swapping in your credentials. This registers DataForSEO as an MCP connector Claude can call.
- Confirm it's liveRun claude mcp list and check that dataforseo shows as connected before moving on.
claude mcp add dataforseo --env DATAFORSEO_USERNAME=<login> --env DATAFORSEO_PASSWORD=<password> -- npx -y dataforseo-mcp-server Exact package name and available modules are in DataForSEO's own MCP docs at github.com/dataforseo/mcp-server-typescript — check there if the command above changes. Prefer their hosted remote server? Add it with --transport http and the URL from their docs instead.
Write the routine the agent runs from
The connector gives Claude the data. This file gives it the job. Drop a SEO_ROUTINE.md into your site repo — it's the agent's standing brief. Keep it specific: the site, the priority keywords, the one competitor that matters, and the exact five steps you want each week.
- Point it at your repoThe agent reads and writes your Astro (or any Git) site directly, so it can compare which pages exist against which should. Give it read/write access and a reports/ folder for the weekly write-ups.
- Define the five weekly jobsMeasure positions vs last week · check gains/losses vs the main competitor · find in-demand keywords you don't cover yet · compare pages that should exist against pages that do · write the report and commit it.
- Name your targetsList your 10–30 priority keywords and your single biggest competitor domain. Specific beats clever — the tighter the brief, the better the report.
There's a ready-to-edit SEO_ROUTINE.md template in the last section of this guide — copy it, fill in the four blanks, done.
Schedule it for Monday morning
This is what turns a prompt into a colleague. Claude Code's scheduling runs the routine on a cron — no one has to be at the keyboard. Point the scheduled run at your SEO_ROUTINE.md and pick a time.
/schedule every Monday at 07:00, run the routine in SEO_ROUTINE.md - Set the cadenceWeekly is the sweet spot for rankings — frequent enough to catch movement, slow enough that the data actually changed.
- Let it commitEach run saves the report to reports/ and commits it, so you get a clean week-over-week history in Git.
- Get pingedHave it drop a one-line summary to Slack or email when the report lands, so Monday starts with the headline, not the homework.
The approval loop: it proposes, you decide
Here's the part that keeps a human in charge. The agent doesn't publish — it files suggestions to a Notion database and waits for your yes. Approve what you want; the next run builds only those, as a pull request.
- It files suggestionsEvery new page idea, on-page fix or keyword gap becomes a Notion row: Title · Type · Keyword · Volume · Rationale · Status = Proposed. For new pages it can attach a full draft (H1, meta, outline) so you see exactly what it wants to build.
- You approveOpen Notion, set Status = Approved on the rows worth doing (or Rejected on the rest). That's the whole review — a few clicks over coffee.
- It builds — as a PRThe next run picks up only the approved rows, builds the Astro pages on a branch, opens a pull request, and sets Status = Built. Nothing goes live until you merge.
Notion connects to Claude as an MCP connector — authorise it once via /mcp in Claude Code, then the routine can read and write your backlog database.
What the agent will — and won't — do on its own
The routine is built with the same discipline we apply to client sites: analyse freely, change nothing without a human yes.
Copy the brief. Fill four blanks. Schedule it.
This is the SEO_ROUTINE.md from Step 02 — drop it in your repo, replace the bracketed bits, and point your Monday schedule at it. Want us to set the whole thing up on your site instead? That's a call away.
Have us build it →# Weekly SEO routine SITE: [yourdomain.com] (Astro repo, read/write) MAIN COMPETITOR: [competitor.com] PRIORITY KEYWORDS: [kw 1, kw 2, kw 3, ...] MARKET: [country / language] Every Monday, do this and nothing more: 1. Measure our Google positions for the priority keywords via DataForSEO. Compare to last week's report in /reports. 2. Check where we passed or lost ground vs MAIN COMPETITOR on those keywords. 3. Find in-demand keywords we don't cover yet. Add them to the Notion "SEO Backlog" database with Status = Proposed. 4. Compare pages that SHOULD exist (from keyword demand) against pages that DO exist in the repo. File the gaps to Notion as Proposed pages, each with a draft H1, meta and outline. 5. Write /reports/YYYY-MM-DD.md — "wins / losses / build next" — and commit it. BUILD STEP (same run, after the above): - Read Notion rows with Status = Approved only. - Build those Astro pages on a new branch. - Open a pull request. Set Status = Built. GUARDRAILS: - Never publish or merge. Never change live pages. - Only build Approved rows. Everything else stays a proposal. - Post a one-line summary to Slack when done.