Skip to the content.

Paid SEO tools from Claude Code: the automation playbook (verified 2026-10-24)

How to connect each vendor, what every call costs, and what the vendor’s terms allow, for unattended, credit-safe runs. The seo-automation skill uses this file. Plans and prices for buying decisions are in tools-paid.md.

Rules:

1. Semrush

Connect

Tools and the call flow

Unit costs (per line returned unless marked; historical data ×5)

Report Units Source
phrase_this, phrase_these (≤ 100 keywords), phrase_organic, phrase_all 10 semrush-keyword
phrase_fullsearch (broad match), phrase_adwords 20 semrush-keyword
phrase_related, phrase_questions 40 semrush-keyword
phrase_kdi (difficulty) 50 semrush-keyword
domain_organic, domain_organic_unique, domain_rank, url_organic 10 semrush-domain
domain_organic_organic (competitors) 40 semrush-domain
domain_domains (keyword gap) 80 semrush-domain
backlinks_overview 40 per request semrush-backlinks
backlinks, backlinks_refdomains, anchors, pages, matrix, comparison 40 semrush-backlinks
Site Audit: snapshots, info, meta issues, issue details, page id by URL 100 per request semrush-sa
Site Audit: page info 1,000 per request semrush-sa
Site Audit: snapshot info, snapshots history 10,000 per request (history: per snapshot). Never call semrush-sa
Position Tracking: campaigns list, campaign dates, overview, visibility index 100 per request semrush-pt
Position Tracking: positions 100 per keyword (500 keywords ≈ 50,000) semrush-pt
Position Tracking: competitors discovery / landing pages 1,000 per competitor / per page semrush-pt
Projects v3: list or get project 100 per request (v4 price [UNVERIFIED]) semrush-projects

The 10,000-row trap and the row-limit rule

UI-only: no API, so never drive the UI

Use an API equivalent where one exists, otherwise leave the feature out and say so in the report.

Terms (ToS last updated 2026-08-25) semrush-tos

2. Ahrefs

Connect

Metering and limits

Plan Units / month (MCP + Connect + API shared) Max rows per request Price / month
Lite 200,000 100 $129
Standard 800,000 250 $249
Advanced 2,000,000 500 $449
Enterprise custom unlimited $1,499 (annual)

Units and rows: ahrefs-api-help. Prices: ahrefs-pricing. API, MCP and Connect need Lite or higher; Ahrefs Free and Starter have no API ahrefs-api-help.

Terms

3. DataForSEO

Connect

Standard vs Live

API Standard (queued) Live Notes
Google organic SERP, per 10 results $0.0006 (~5 min) $0.002 (~6 s); priority $0.0012 +1 base per extra 10 results. Search operators ×5. load_async_ai_overview and calculate_rectangles +1 base each. PAA click +$0.00015 dfs-serp-price
Google Ads keyword data (search_volume, etc.) $0.06 per task of ≤ 1,000 keywords (1–3 h) $0.09 per task. 12 calls/min, one task per call Same price for 1 or 1,000 keywords. keywords_for_keywords takes ≤ 20 seeds dfs-ads-price
Labs (keyword_ideas, domain_intersection, bulk KD, …) — $0.012 per task + $0.00012 per item, ≤ 1,000 items include_clickstream_data ×2. keyword_ideas default limit 700, so always set it dfs-labs-price
Backlinks — $0.024 per request + $0.000036 per row, ≤ 1,000 rows timeseries_new_lost_summary charged per request dfs-bl-price
On-Page crawl, per page $0.00015 — JS $0.0015; browser rendering $0.0051; Lighthouse $0.005. max_crawl_pages is the spending cap dfs-onpage-price
LLM Mentions — $0.10 per task + $0.001 per row ChatGPT (US English) and AI Overviews; 60-day cycle dfs-llm-mentions
LLM Scraper (ChatGPT, Gemini) / AI Mode SERP $0.0012 per result $0.004 LLM Responses Standard $0.0002 + $0.01 advance, up to 72 h dfs-llm-responses
Google Autocomplete $0.0006 per task $0.002 dfs-autocomplete

Batching (scheduled jobs use Standard only)

.ai responses and FIELD_CONFIG

Account controls (set by the human in the dashboard; automation only reads them)

4. Crawlers: Screaming Frog, Sitebulb, Lumar

Screaming Frog SEO Spider

Sitebulb

Lumar

5. Free Google and Microsoft sources

Source Access and auth Quotas and limits Notes
Search Console API No official MCP; Google’s lists have none google-mcp-list. OAuth (installed/web app) or a service account added as a property user by an owner. Scope webmasters.readonly gsc-auth Search Analytics: 1,200 QPM per site and per user, plus load quotas (wait 15 min). URL Inspection: 2,000/day and 600/min per site gsc-limits rowLimit ≤ 25,000; ≤ 50K rows per day per search type. Query one day at a time and page startRow gsc-query. UI export stops at 1,000 rows gsc-perf-blog
GSC bulk export to BigQuery An owner sets it up; needs billing No row cap; no backfill; anonymized queries have no text Turn it on early for big sites gsc-bulk
GSC community MCP AminForou/mcp-gsc, uvx mcp-search-console, OAuth or service account. GSC_ALLOW_DESTRUCTIVE defaults to false Same as the API Third-party code holding GSC credentials: audit and pin it gsc-mcp-amin
GSC Generative AI performance report UI only; no API type value Impressions only; 1,000-row table Export with the user present (§7). CSV format UNVERIFIED
GA4 Official googleanalytics/google-analytics-mcp: pipx run analytics-mcp, ADC with analytics.readonly ga4-mcp. Not bundled in any seo-suite plugin. The user adds it: claude mcp add analytics-mcp --scope user -e "GOOGLE_APPLICATION_CREDENTIALS=PATH" -e "GOOGLE_PROJECT_ID=ID" -- pipx run analytics-mcp Standard property: 200,000 tokens per day, 40,000 per hour, 14,000 per project per hour, 10 concurrent. 360 gets 10× tokens. 120 thresholded requests per hour ga4-quotas 10 tools. 9 read-only: get_account_summaries, get_property_details, list_google_ads_links, list_property_annotations, get_custom_dimensions_and_metrics, run_report, run_realtime_report, run_funnel_report, run_conversions_report. create_property_annotation appears only with --allow-write + analytics.edit ga4-coordinator. Send returnPropertyQuota: true
Google Ads Official googleads/google-ads-mcp: read-only, 3 tools (GAQL search, get_resource_metadata, list_accessible_customers) ads-mcp — No Keyword Planner in the MCP ads-mcp-pr48
Keyword Planner (Ads API) KeywordPlanIdeaService needs Basic access (brand verification) or Standard. Explorer blocks Planning services. Developer tokens were sunset 2026-09-09; access is per Cloud project ads-access 1 request/s per customer ID ads-quotas GenerateKeywordIdeas ≤ 20 seeds ads-ideas. Historical metrics ≤ 10,000 keywords; cache monthly ads-kp-overview. Not built in seo-suite
PageSpeed Insights v5 Key optional, recommended for automation: psi_api_key in /plugin configure seo-suite@seo-suite, which the core SessionStart hook exports as PSI_API_KEY for psi.py Quota not stated by Google [UNVERIFIED: 25,000/day] Google plans to drop CrUX field data from PSI; no date psi-api
CrUX API / History API Cloud API key 150 queries/min per project, free; paying can’t raise it 28-day window, updated daily ~04:00 UTC. History: ≤ 40 weekly points, Mondays crux-api
Chrome DevTools MCP claude mcp add chrome-devtools --scope user npx chrome-devtools-mcp@latest devtools-clients — Traces plus lighthouse_audit (no performance category). --no-performance-crux, --no-usage-statistics, --slim devtools-mcp
Bing Webmaster Tools No official MCP. Community zizzfizzix/mcp-server-bwt (uvx) bwt-mcp. API key from Settings → API Access, one per user, or OAuth bwt-access — JSON endpoint ssl.bing.com/webmaster/api.svc/json/METHOD?apikey=…. SOAP/POX were scheduled to retire 2026-08-31 bwt-protocols. Methods include GetQueryStats, GetPageStats, GetUrlSubmissionQuota, SubmitUrlBatch bwt-methods
IndexNow Key file at the site root ≤ 10,000 URLs per POST Level 3 and up only indexnow
Microsoft Clarity Official MCP; the project admin creates the token clarity-mcp 10 requests per project per day, last 1–3 days, 1,000 rows One fixed daily job; never ad hoc clarity-api
Google Trends API Gated alpha Not published Don’t scrape trends.google.com trends-api
Indexing API — 200 publishes per day JobPosting / BroadcastEvent pages only. Never a general “force indexing” tool indexing-api

6. Other vendors with MCPs (primary sources)

Vendor MCP and auth Cost control
SE Ranking https://api.seranking.com/mcp, OAuth 2.1 or an X-Api-Key header. Keys have full account access seranking-mcp Only 2xx responses cost credits. DATA_getSubscription costs 0. Data API 10 RPS. Always ask before PROJECT_* writes seranking-credits
Similarweb https://mcp.similarweb.com, api-key header. Needs an API-only, Business or Enterprise plan similarweb-mcp Credits = domains × endpoint price × granularity × countries × history × results similarweb-credits. Claude Code header form [UNVERIFIED]
Keywords Everywhere https://mcp.keywordseverywhere.com/mcp, Bearer key ke-mcp Volume costs 1 credit per keyword, ≤ 100 per call. GET /account/credits returns the balance; 402 means none left ke-credits
AlsoAsked No MCP found [UNVERIFIED negative]. REST with X-Api-Key, Pro plan alsoasked-auth fresh=false repeats are free. Depth 3 costs 4 credits alsoasked-search
Otterly.AI https://data.otterly.ai/mcp, OAuth only otterly-mcp A per-period tool-call cap. get_account_info is free. Write tools are gated
Moz A docs page exists moz-mcp Endpoint, auth and quota [UNVERIFIED]

7. Browser automation rules

Target Automate? Why
Semrush web app No ToS §3.3(k), (p), (r) semrush-tos
Ahrefs web app No ToS §4.4(i)/(j), and a Cloudflare challenge ahrefs-tos
Similarweb platform No Restrictions (v): no automated means “for any purpose” similarweb-tos
Google Search results (rank checks) No Automated queries break the spam policies and ToS google-spam
business.google.com manager pages No robots.txt disallows them; Google’s ToS bans automated access against robots.txt gbp-robots
Your own Search Console / Bing Webmaster UI Yes, light use with the user present No robots disallow found. Prefer the free APIs, which return more rows browser-research-gsc
QA of your own site Yes Rendered DOM, traces, screenshots

8. The credit guard

${CLAUDE_PLUGIN_ROOT}/scripts/credit_guard.py in the core seo-suite plugin is the source of truth. This section describes what it does. If the two disagree, fix one of them.

Where it runs:

State:

Options are core-plugin userConfig, read as CLAUDE_PLUGIN_OPTION_<KEY> cc-plugin-ref:

Option Default Meaning
autonomy_level 1 autonomy.md levels 1–4
audit_profile auto The audit profile when the request names none: auto, quick, full-free or paid (references/profiles.md). Read by scripts/audit_profile.py, not by the guard
semrush_monthly_units, ahrefs_monthly_units 0 Monthly budget in vendor units. 0 = that vendor’s paid calls are denied
dataforseo_monthly_usd 0 Monthly DataForSEO budget in USD
other_monthly_usd 0 One USD budget shared by Similarweb, SE Ranking, Keywords Everywhere, AlsoAsked, Otterly and Lumar crawls, and ai_probe.py’s OpenAI, Perplexity and Anthropic calls
per_run_cap_pct 25 Share of the vendor’s monthly budget one run (session) may spend
ask_above_pct 5 A call estimated above this share of the monthly budget is deferred: denied and recorded in credit-guard/requests.jsonl for the end-of-run questions. 0 = defer every paid call
max_rows 50 Row limit the guard clamps or adds
cache_ttl_days per data type One TTL for every data type when set
psi_api_key (sensitive) unset Exported as PSI_API_KEY by the core SessionStart hook; not used by the guard
openai_api_key, perplexity_api_key, anthropic_api_key (sensitive) unset Exported as SEO_SUITE_OPENAI_API_KEY, SEO_SUITE_PERPLEXITY_API_KEY and SEO_SUITE_ANTHROPIC_API_KEY for ai_probe.py. The prefix keeps other tools in Bash on their own keys, and the Claude Code CLI never takes the Anthropic key as ANTHROPIC_API_KEY

Hooks get these variables, but commands Claude runs through Bash don’t cc-plugin-ref. So the core SessionStart hook also exports audit_profile, the four monthly budgets, per_run_cap_pct and max_rows to Bash under their CLAUDE_PLUGIN_OPTION_ names, the hooks’ CLAUDE_PLUGIN_DATA as SEO_SUITE_DATA, and the session id from its input as SEO_SUITE_SESSION_ID. audit_profile.py, rank_snapshot.py and ai_probe.py then read the same options, ledger and run as the hooks. An option changed mid-session reaches Bash at the next session.

Scripts that pay a vendor directly

The hook never sees rank_snapshot.py run (DataForSEO REST) or ai_probe.py run (OpenAI, Perplexity and Anthropic APIs). They use the guard’s own helper, script_check, script_reserve and script_settle in credit_guard.py:

Which tools it guards

The guard reads the server name: mcp_server.name from the hook input (v2.1.274+) when present, else the tool-name prefix cc-hooks. The vendor whose pattern matches is the one guarded, so every name form below is covered, except where a row says not:

How the server was added Tool name Source
Vendor plugin mcp__plugin_seo-suite-<vendor>_<server>__<tool>, e.g. mcp__plugin_seo-suite-semrush_semrush__execute_report cc-mcp
User ran claude mcp add (vendor docs) mcp__<name>__<tool>, e.g. mcp__semrush__…, mcp__semrush-key__…, mcp__ahrefs__…, mcp__dfs-mcp__… (the name DataForSEO’s guide uses dfs-help-cc). The plugin copy of the same URL is then dropped as a duplicate cc-mcp
claude.ai connector mcp__claude_ai_<Server>__<tool>. The exact normalisation is [UNVERIFIED]; copy the name from /mcp cc-permissions
claude.ai or desktop-app connector named by id mcp__<uuid>__<tool>. A second hook entry matches these. The guard names the vendor from mcp_server.name, else from the tool’s own name, in any case and with _ or -: Ahrefs (site-explorer-*, keywords-explorer-*, site-audit-*, content-helper*, serp-overview*, batch-analysis*, brand-radar-*, gsc-anonymous-queries) and Semrush (execute_report whose report id has Semrush’s shape, lower-case words joined by _, listed in the price table or not). Another connector’s execute_report with a report id of that shape is therefore treated as Semrush. An id-named DataForSEO or other vendor whose mcp_server.name names no vendor is not guarded: connect it through its seo-suite connector plugin cc-permissions

PreToolUse decisions (in this order)

  1. Not a recognised vendor, or a free tool or path → no opinion. The user’s permission rules decide. Free means:
    • Semrush: the 12 discovery tools and get_report_schema (expected free; [UNVERIFIED], see §1);
    • Ahrefs: rank-tracker-*, management-*, subscription-info*, web-analytics-*, social-media-*, public-*, gsc-* except gsc-anonymous-queries, plus doc, site-audit-projects and keywords-explorer-service-notices;
    • DataForSEO: docs_index, docs_list_sections, docs_search, and api_request to appendix/user_data, tasks_ready or task_get;
    • Lumar: everything except analyze_run_crawl, analyze_resume_crawl, analyze_create_single_page_request and lumar_act.
  2. Semrush execute_report with no row limit → deny. This applies to per-line reports and reports with no price entry. The reason tells Claude to read get_report_schema and pass display_limit or limit ≤ max_rows. This is the 10,000-row trap (§1).
  3. Clamp row limits to max_rows (the result is sent as updatedInput, every other field unchanged cc-hooks):
    • Semrush display_limit / limit;
    • Ahrefs limit, added when missing on list endpoints (default 1,000 rows);
    • DataForSEO limit, depth and max_crawl_pages, added when missing on list and crawl endpoints.
  4. Cache hit (same vendor, tool and input inside the TTL) → deny. The reason names the cached file, which Claude reads at zero cost. Deleting the file forces a fresh call.
  5. Monthly budget is 0 → deny.
  6. Estimate the cost from the static price tables in §1–3:
    • Semrush: lines × price, or the per-request price; history ×5;
    • Ahrefs: max(50, rows × field costs), with fixed prices for Site Audit and Content Helper;
    • DataForSEO: per task, plus per item, row, page or 10 SERP results. Only the first task of a Live call is billed.

    A call with no price entry is budgeted at the ask_above_pct threshold.

  7. Month-to-date + estimate > monthly budget → deny, with the remaining amount. Month-to-date includes in-flight reservations: every allowed call reserves its estimate, held for 30 minutes until PostToolUse settles it.
  8. This run’s spend + estimate > per_run_cap_pct of the monthly budget → deny.
  9. Defer (deny and record, never ask mid-run) when any of these hold:
    • the estimate is above ask_above_pct of the monthly budget;
    • ask_above_pct is 0;
    • it is a Semrush call with no price entry, for example Site Audit snapshot info (10,000 units).

    The guard appends one line per deferred call to credit-guard/requests.jsonl (deduplicated per session) and tells Claude to continue with free sources. Claude lists the deferred calls, with estimates, in the end-of-run questions (references/autonomy.md). The user approves by raising ask_above_pct or the budget for the next run.

  10. Otherwise allow, with the budget status as the reason.

Precedence and limits:

PostToolUse, PostToolUseFailure and PostToolBatch

Cache TTLs

The guard’s defaults by data type (cache_ttl_days replaces all of them):

Data type Default Basis
Keywords (volume, CPC, difficulty) 30 days Google Ads and DataForSEO monthly, mid-month dfs-freshness; Ahrefs at least monthly ahrefs-ke-freq; Semrush KMT monthly semrush-kmt-date
SERP, positions, domain snapshots 7 days SERPs refresh from days to weeks by popularity ahrefs-ke-freq; Ahrefs Rank Tracker weekly ahrefs-rt-freq
Backlinks 7 days (deltas run weekly) Indexes update continuously; full cycles ≤ 90 days ahrefs-links-freq
Audit data (Site Audit, Lumar) 1 day Per crawl
AI visibility (Brand Radar, LLM Mentions) 30 days Chatbot indexes monthly, LLM Mentions 60-day cycle ahrefs-brand-radar
Anything else 7 days —
Anything from Semrush Never more than 30 days, whatever the setting ToS: no caching beyond one month semrush-tos

Finer TTLs the pipelines apply when they store their own snapshots in seo-work/ (from vendor cadences):

What the guard cannot do

9. Credit plan per pipeline (one site, 3 competitors, October 2026 prices)

Pipeline Cadence Paid step and call shape Per run Per month Sources
B1 Full audit Quarterly None on full-free, the default audit profile at every size (references/profiles.md). Paid crawlers follow the profile’s lists: Screaming Frog CLI is Main on paid-big ($0 per crawl with a licence) and Reserve elsewhere; DataForSEO On-Page with max_crawl_pages is a Cross-check on paid-small and paid-big, within budgets $0. On-Page 5,000 pages: $0.75 / JS $7.50 / browser $25.50. Semrush SA read path ≈ 400 + 100 per non-zero issue ≈ $0 dfs-onpage-price sf-pricing
B2 Weekly technical monitor Weekly Ahrefs site-audit/projects (free), then issues with date_compared only if “new” > 0 (interactive only) $0; Ahrefs ≤ 50 units $0 ahrefs-sa-issues
B3 Keyword research Quarterly or on demand Shortlist of 300: DataForSEO search_volume Standard (1 task) + Labs bulk_keyword_difficulty. SERPs for the top 20. No Keyword Planner: Labs keyword_ideas with limit 1,000 $0.06 + $0.048 + $0.012 ≈ $0.12 (+$0.132 for ideas). Semrush 3,000 units. Ahrefs 6,300 units ≈ $0.04 averaged dfs-ads-price dfs-keyword-ideas ahrefs-ke-ref
B4 Competitor gap Monthly DataForSEO domain_intersection (intersections=false, limit 100, volume filter) per competitor 3 × $0.024 = $0.072. Ahrefs 3 × 2,200 units. Semrush 3 × 1,000 units $0.07 dfs-intersection semrush-domain
B5 Backlink deltas Weekly timeseries_new_lost_summary (group_range=week). Only when non-zero: backlinks/backlinks/live (one_per_domain, first_seen > last run, limit 100) for new and for lost ≤ $0.08 per domain; 4 domains ≤ $0.32 ≤ $1.39 dfs-timeseries dfs-bl-price
B6 Rank tracking Daily / weekly rank_snapshot.py, SERP Standard: 50 money keywords daily at depth 10, 450 weekly at depth 20, up to 100 tasks a POST, free tasks_ready and task_get/advanced. GSC (rank_snapshot.py gsc) and Ahrefs Rank Tracker reads are free $0.03 per day; $0.54 per week, per market and language ≈ $3.22 (+$0.90 with AI Overview on the money tier) dfs-serp-price
B7 GSC content refresh Monthly SERP Standard for the flagged pages’ top queries (~20) $0.012 (AIO $0.024) ≈ $0.02 dfs-serp-price
B8 AI visibility Monthly ai_probe.py through the official APIs: 40 prompts × 2 engines (OpenAI main, Perplexity cross-check) × 3 runs = 240 probes, at about 10,000 tokens in and 1,000 out each [estimate]. From other_monthly_usd, not DataForSEO. LLM Scraper is out: it drives chatgpt.com and gemini.google.com ≈ $2.60 (OpenAI gpt-5-mini ≈ $0.0145 a probe, Perplexity fast preset ≈ $0.0075); Claude claude-sonnet-5-5 adds ≈ $4.80 (≈ $0.04 a probe) ≈ $2.60 openai-pricing
B9 Multilingual blog QA Weekly or per PR Optional SERP check per target keyword per locale $0.0006 per keyword-locale (10 posts × 3 locales ≈ $0.018) ≈ $0.08 dfs-serp-price
B10 Blog batch Weekly SERP Standard only for the topics whose snapshot is stale (next-topics --limit 12 per locale). Volumes for the shortlisted head terms only when they are missing or stale: search_volume Standard as in B3, one task per locale $0.0006 per keyword-locale (12 topics × 3 locales ≈ $0.022). Volumes $0.06 per task ≈ $0.09 (+$0.06 per locale whose volumes are refreshed, at most monthly) dfs-serp-price
Total scheduled (DataForSEO)       ≈ $4.9 a month (≈ $5.8 with AI Overview on the money tier); budget $10  
Total scheduled (other_monthly_usd)       ≈ $2.60 a month for B8; budget $12, so one run stays under the $3 per-run cap  

Semrush and Ahrefs fit interactive, targeted work: competitor keyword sets, link-index lookups and Semrush-only metrics. Keep them ≤ 40% of the included allowance, so other skills still have room.

Do not run on these vendors as pipelines:

[UNVERIFIED] — do not state as fact; settle at runtime or with the vendor

Sources

Each bracketed label in the text links to the URL defined below. The definitions are visible in the raw file.