SEOcrawl AI
SEO + AI visibility in chat
- Category
- Marketing
- Primary Subcategory
- SEO Rank Tracking & Keyword Research
Integration details
Description
Bring your whole SEO stack into ChatGPT. SEOcrawl AI connects ChatGPT to your live SEO data: Google Search Console performance (clicks, impressions, CTR, positions), GA4 analytics including the traffic you receive from AI assistants, and SEOcrawl's AI Tracker, which monitors how your brand appears and gets cited across ChatGPT, Claude, Gemini and Perplexity. Compare date ranges, surface winning and losing keywords and pages, drill into any URL or query, and explore your site with advanced filters. Then act on insights without leaving the chat: create and update SEO tasks, add comments, manage tags and tag rules, save Smart Views and log annotations. 43 tools on a hosted, secure OAuth connector — part of the SEOcrawl SEO + GEO platform (https://seocrawl.ai/mcp).
- Integration type
- Plugin
- Verification status
- Not applicable
- Platform
- ChatGPT
- Primary Subcategory
- SEO Rank Tracking & Keyword Research
- Secondary Subcategories
- None listed
- Brand
- SEOcrawl
- Access
- Account required
- First tracked
- 2026-09-14
- Tool count
- 82
- Geography
- US
The Primary Subcategory used for this profile’s headline score.
Other Subcategories where the Integration is listed.
Get alerts for SEOcrawl AI
Get updates when SEOcrawl AI’s Discoverability Score or category rank changes.
ChatGPT Plugin Discovery Score
ChatGPT Plugin discovery is coming soon
ChatGPT can surface a Plugin when it matches a user's request.Your Plugin Discovery Score measures how often yours appears.
No spam. Unsubscribe any time.
What discovery looks like

Competing in ChatGPT SEO Rank Tracking & Keyword Research
View Category82 tools agents can invoke
Get Brand Radar mentions overview: how often the property's brand appears in AI-assistant answers (ChatGPT, Claude, Gemini, Perplexity) across all tracked prompts for the date range. Returns total_prompts and three mutually-exclusive buckets, each {count, percent}: mentioned (brand named prominently), mentioned_in_text (brand appears only in the answer body) and absent (not mentioned). Note: these are mention-*presence* buckets, not sentiment/tone. Accepts a date range as presets (last_7_days, last_28_days, last_3_months, last_year) or absolute dates (from/to in Y-m-d). Pass the property ID (UUID) or URL (sc-domain:...) from list_properties. Cost: 3 credits per call. Examples: ```json // Brand mention breakdown across tracked prompts over the last 28 days. {"property":"sc-domain:example.com","range":"last_28_days"} ```
get_ai_visibility_mentions
Get AI/LLM referral traffic for a Google Analytics 4 property, broken down by engine (ChatGPT, OpenAI, Perplexity, Gemini, Claude, Copilot, Deepseek, …) detected from the GA4 session source/medium. Accepts a date range as presets (last_7_days, last_28_days, last_3_months, last_year) or absolute dates (from/to in Y-m-d), with the immediately preceding period for comparison. Each engine returns sessions, key events, average session duration and the percentage change of each vs the previous period. Pass the project ID (UUID) or URL from list_ga4_properties. Cost: 3 credits per call. Examples: ```json // AI/LLM referral traffic for the last 28 days. {"property":"sc-domain:example.com","range":"last_28_days"} ```
get_ga4_ai_referrers
Get Brand Radar share-of-voice: how visible the property's brand is in AI-assistant answers (ChatGPT, Claude, Gemini, Perplexity) versus its competitors, aggregated across all tracked prompts for the date range. Returns own_domain, a ranking of domains by share_of_voice (0-100 average visibility, each with visibility_change vs the equal-length preceding period), and a head-to-head competitor_comparison (prompts the brand wins/loses against the top competitor). This is the aggregate AI Tracker overview; use list_prompts / get_prompt_detail for per-prompt data. Accepts a date range as presets (last_7_days, last_28_days, last_3_months, last_year) or absolute dates (from/to in Y-m-d). Pass the property ID (UUID) or URL (sc-domain:...) from list_properties. Cost: 3 credits per call. Examples: ```json // Brand vs competitor share of voice over the last 28 days. {"property":"sc-domain:example.com","range":"last_28_days"} ```
get_ai_visibility_share_of_voice
Get the daily Brand Radar visibility trend for the property: one series ("visibility") of {date, value} points where value is the percentage (0-100) of tracked prompts whose AI-assistant answers (ChatGPT, Claude, Gemini, Perplexity) linked to the brand that day, ready for a time-series chart. Also returns "points" (number of days in range) and "insufficient_history" (true when too few points to chart meaningfully). Accepts a date range as presets (last_7_days, last_28_days, last_3_months, last_year) or absolute dates (from/to in Y-m-d). Pass the property ID (UUID) or URL (sc-domain:...) from list_properties. Cost: 3 credits per call. Examples: ```json // Daily AI-visibility trend over the last 3 months. {"property":"sc-domain:example.com","range":"last_3_months"} ```
get_ai_visibility_history
Create an annotation (chart note) on a property. Requires property (the property UUID or sc-domain URL from list_properties), date (Y-m-d) and note (the annotation text). Optional: description (longer body), category (an existing category name or UUID), taskId (a task UUID to link, from list_tasks). URL scope: context controls which URLs the note applies to — sitewide (default, whole property), single (one URL, pass exactly one in urls), or list_of_urls (several explicit URLs in urls; alias: several). urls is a list of full http(s) URLs, required for single/list_of_urls and must be empty for sitewide. Keyword scope: keywords is an optional list of GSC queries the note applies to (the web app's "List of Keywords"); omit it or pass [] for all keywords. The two scopes combine (AND) — a single-URL note with keywords covers only those queries on that page. Keywords match GSC queries exactly and case-sensitively (no patterns), so pass them as GSC reports them, e.g. from get_top_keywords; blanks and duplicates are dropped. The annotation is created as a custom note authored by the calling user. Requires the annotations:write scope. Cost: free. Examples: ```json // create a sitewide note on a single date {"property":"sc-domain:example.com","date":"2026-05-01","note":"Published the new pricing page","description":"Launched the revamped pricing page with annual plans."} // scope a note to one page and two GSC queries {"property":"sc-domain:example.com","date":"2026-05-01","note":"Rewrote the running-shoes buying guide","context":"single","urls":["https://example.com/guides/running-shoes"],"keywords":["running shoes","best running shoes"]} ```
add_annotation
Add a comment to a task. ticket_id accepts UUID, ticket slug, or a full browser task URL (property optional when ticket_id is a URL). Cost: 1 credit per call. Examples: ```json // add a comment to a task by its UUID {"ticketId":"00000000-0000-0000-0000-000000000001","body":"Reviewed the draft, looks good to ship.","property":"sc-domain:example.com"} ```
add_comment
List the Google Analytics 4 properties connected to the authenticated user's projects. Each entry returns the project `id` and `url` (use either as the `property` argument for the other GA4 tools), the human title, the underlying GA4 `ga4_property_id`, and `connected_at`. Only projects with a connected GA4 property are returned. Cost: 1 credit per call. Examples: ```json // List all GA4 properties connected to the authenticated user. [] ```
list_ga4_properties
Get Google Analytics 4 summary metrics (sessions, users, new users, conversions, engagement rate, sessions per user) for a property over a date range, with the immediately preceding period for comparison. Accepts a date range as presets (last_7_days, last_28_days, last_3_months, last_year) or as absolute dates (from/to in Y-m-d format). Each metric returns current, prev and delta. `data_synced` is false when the property has no synced GA4 data yet, so an all-zero result is not mistaken for real zeros. `data_start_date` is the earliest synced day: when the requested range — or its preceding period — predates it, the zeros are a coverage gap, not real zeros (e.g. a prev of 0 because the previous period is before `data_start_date`). `partial_coverage.current` / `partial_coverage.previous` state that conclusion directly: when either is true, treat the numbers for that period, and any delta against it, as a coverage gap rather than a trend. The latest synced day is the `data_freshness.last_complete_date` on every response. Pass the project ID (UUID) or URL from list_ga4_properties. Cost: 3 credits per call. Examples: ```json // GA4 summary metrics for the last 28 days vs the prior period. {"property":"sc-domain:example.com","range":"last_28_days"} ```
get_ga4_summary
Get Google Analytics 4 metrics per individual page (landing/URL) for a property, ranked so you can see which pages drive the most sessions, signups (conversions) or users. The page dimension is the GA4 page path. Each row returns the page plus sessions, users, conversions and engagement_rate (engaged sessions / sessions), each with the immediately preceding period (prev) and change_pct for period-over-period comparison. Accepts a date range as presets (last_7_days, last_28_days, last_3_months, last_year) or absolute dates (from/to in Y-m-d). Sort with sortBy = sessions (default), conversions or users; rows are capped by limit (default 25, max 100). `data_synced` is false when the property has no synced GA4 data yet (so an all-zero result is not mistaken for real zeros), and `data_start_date` is the earliest synced day — `partial_coverage.current` / `partial_coverage.previous` flag when a period starts before it, so the zeros and change_pct for that period are a coverage gap rather than a trend. Note: crossing pages with a traffic source/channel, and new_users / avg_session_duration per page, are not yet available. Pass the project ID (UUID) or URL from list_ga4_properties. Cost: 5 credits per call. Examples: ```json // Top landing pages by GA4 sessions for the last 28 days vs the prior period. {"property":"sc-domain:example.com","range":"last_28_days"} // Top 10 pages by conversions (signups) over the last 3 months. {"property":"sc-domain:example.com","range":"last_3_months","sortBy":"conversions","limit":10} ```
get_ga4_top_pages
Get Google Analytics 4 traffic (sessions) for a property broken down by acquisition source. Set dimension to "source_medium" (default) for session source/medium, or "channel" for the GA4 default channel grouping. Accepts a date range as presets (last_7_days, last_28_days, last_3_months, last_year) or absolute dates (from/to in Y-m-d). Rows are sorted by sessions descending and capped by `limit` (default 25, max 100); each row returns name, sessions and share_pct — the share of sessions attributed to that dimension for the period. Note: for source_medium the attributed sessions total can be slightly below the property's overall sessions (a GA4 attribution-scope quirk), so share_pct is relative to that attributed total, not to total property sessions; the channel dimension matches the overall sessions total. `data_synced` is false when the property has no synced GA4 data yet. Pass the project ID (UUID) or URL from list_ga4_properties. Cost: 3 credits per call. Examples: ```json // GA4 sessions by default channel grouping for the last 28 days. {"property":"sc-domain:example.com","range":"last_28_days","dimension":"channel"} ```
get_ga4_traffic_by_source
Get a single annotation (chart note) by its id. Pass annotationId (the UUID returned by add_annotation or list_annotations). Returns the date (Y-m-d), note text, description, category, linked task_id, author email, the property it belongs to (null for global/official notes), its URL scope (context, urls, urls_used, filters) and its keyword scope (keyword_context: all or list_of_keywords; keywords: the GSC queries a list_of_keywords note is restricted to). Set includeImpact=true to also compute the before/after GSC impact around the annotation date at 7/14/30-day windows (clicks, impressions, ctr, position — each with value_before, value_after, diff, change_pct), scope-aware (the note's urls, and only its keywords for a list_of_keywords note); costs 3 credits, and incomplete windows are flagged complete=false. Use list_annotations to find an id. Cost: free. Examples: ```json // Fetch one annotation by the UUID from list_annotations. {"annotationId":"00000000-0000-0000-0000-000000000001"} // Fetch an annotation with its 7/14/30-day before/after GSC impact inline. {"annotationId":"00000000-0000-0000-0000-000000000001","includeImpact":true} ```
get_annotation
List annotations (chart notes) for a property within a date range, newest first. Pass property (the UUID or sc-domain URL from list_properties). Date range: either range (last_7_days, last_28_days, last_3_months, last_year) or absolute from/to (Y-m-d); defaults to last_3_months when omitted. Optional: search (substring match on the note text), page and limit (pagination; limit capped at 200). Every row carries its URL scope (context, urls, urls_used, filters) and its keyword scope (keyword_context: all or list_of_keywords; keywords: the GSC queries a list_of_keywords note is restricted to). Set url to filter to the annotations attached to that page — single-URL notes, list-of-URLs notes containing it, and multi-condition notes whose conditions name the URL literally (exactly-matches / list-of-urls); sitewide notes are excluded (you get the URL's history, not the property's) and pattern conditions (contains / starts-with / ends-with / regex) never match. Both sides are normalized (http/https, www, trailing slash, case, utm params), so a roughly-right URL still matches; urlMatch picks exact (default), prefix (plain string prefix — url .../blog also matches .../blog-old) or contains (substring; accepts a bare fragment like blog/post-1), and is ignored without url. The url_filter block echoes the normalized needle, the mode and total (the size of the whole matching set, not just this page). One URL per call — for several URLs, call in parallel. Set keyword to keep only the notes explicitly scoped to that GSC query (a list_of_keywords note containing it); all-keyword notes are excluded. keyword is compared exactly after trimming, collapsing whitespace and lowercasing — no substring or pattern matching; the keyword_filter block echoes the normalized keyword and total. url and keyword combine (a note must match both). Set includeImpact=true to attach each annotation's before/after GSC impact at 7/14/30-day windows (as in get_annotation); this caps the page to 10 rows (50 when url is set) and costs 3 credits per annotation. For a note attached to several URLs the impact block aggregates across all of the note's URLs (as in get_annotation), not only the queried one; a list_of_keywords note's impact counts only its keywords. Use a returned id with get_annotation for full detail. Cost: free. Examples: ```json // Recent annotations for a property over the last 3 months. {"property":"sc-domain:example.com","range":"last_3_months","limit":25} // One URL's annotation history with before/after GSC impact per note. {"property":"sc-domain:example.com","url":"https://example.com/blog/post-1","includeImpact":true} // Notes scoped to one GSC query, with before/after impact on that query. {"property":"sc-domain:example.com","keyword":"running shoes","includeImpact":true} ```
list_annotations
Manually apply a tag to specific keywords and/or pages, on top of any auto-assignment rules. Pass keywords (exact keyword strings → tags them as a keyword tag) and/or urls (exact page URLs → tags them as a page tag); at least one is required. The tag is created for the relevant type if it does not exist yet. Use remove_tag to undo. Pass the property ID (UUID) or URL (sc-domain:...) from list_properties. Cost: 1 credit per call. Examples: ```json // tag a single keyword with the Brand tag {"property":"sc-domain:example.com","tag":"Brand","keywords":["example brand"]} ```
apply_tag
Link a task to a roadmap milestone, or unassign it. ticket accepts a UUID, ticket slug, or full browser task URL (property optional when ticket is a URL). milestone accepts a milestone id or slug on the same board; omit milestone (or pass an empty string) to unassign the task from any milestone. A task belongs to at most one milestone. Cost: 2 credits per call. Examples: ```json // assign a task to the Q3 milestone. {"property":"sc-domain:example.com","ticket":"fix-favicon-on-homepage","milestone":"q3-launch"} ```
assign_task_to_milestone
List the auto-assignment rules of a property — the patterns that tag keywords/pages automatically (see create_tag_rule). Optionally filter by tag. Each rule returns rule_id, tag, field (keyword|url), country and its conditions (match + value). Pass the property ID (UUID) or URL (sc-domain:...) from list_properties. Cost: 1 credit per call. Examples: ```json // list the auto-assignment rules targeting the Priority Pages tag. {"property":"sc-domain:example.com","tag":"Priority Pages"} ```
list_tag_rules
Report the live health of the MCP backend per surface (gsc, ga4, site_audit, ai_tracker, task_board) and per backing store (mysql, clickhouse, mongodb, redis). Each entry is {status: ok|degraded|down, last_check_at, sample_error}. Poll this before launching a multi-step workflow so a broken endpoint is visible up front. Takes no arguments. Cost: free. Examples: ```json // check backend health before running a workflow [] ```
health
List the AI Tracker (Brand Radar) prompts a property is tracking. Each item has prompt_id, prompt_text, engines_tracked (the LLM engines the prompt runs against), last_run_at (ISO-8601, all-time most recent run, null if never run) and runs_in_range (number of recorded engine executions inside the date window). Pass the property ID (UUID) or URL (sc-domain:...) from list_properties. Date range scopes runs_in_range only (not which prompts are returned): either range (last_7_days, last_28_days, last_3_months, last_year) or absolute from/to (Y-m-d); defaults to last_28_days when omitted. Optional engine (chatgpt, openai, claude, anthropic, gemini, perplexity, ai_overview) filters to prompts tracking that engine (chatgpt/openai and claude/anthropic are treated as the same engine). Optional q filters to prompts whose text contains it (case-insensitive substring). For per-engine mention rate use get_prompt_detail, for individual answers list_prompt_runs, for cited sources list_prompt_citations. Paginated via limit (max 200) and the opaque next_cursor in the response. Cost: 2 credits per call. Examples: ```json // AI Tracker prompts mentioning "books" over the last 28 days. {"property":"sc-domain:example.com","range":"last_28_days","q":"books","limit":25} ```
list_prompts
List detected on-page code/HTML changes tracked by Code Monitor, newest first. Each row returns url, date, created_at (ISO), and change_types (which fields changed, e.g. Title, Canonical, Meta Description, noindex, robots.txt, sitemap.xml, H1 Heading, Status code, Hreflang, Open graph, Twitter image, Analytics, Tag manager). Filter to one monitored page with seoMonitorId (from list_code_monitor_pages) or page (its URL); omit both for the project-wide recent-changes feed — this is how you check what changed / "alerts" across the whole property. Narrow the window with from and to (YYYY-MM-DD, inclusive); omit both for full history. Cursor-paginated (limit defaults to 50, max 200). Use get_code_monitor_change with the row's url + created_at for the before/after diff. Returns feature_not_available when the plan does not include Code Monitor. Pass the property ID (UUID) or URL (sc-domain:...) from list_properties. Cost: 5 credits per call. Examples: ```json // Project-wide detected changes in June (the "alerts" feed). {"property":"sc-domain:example.com","from":"2026-06-01","to":"2026-06-30"} ```
list_code_monitor_changes
List the pages a property tracks in Code Monitor (on-page HTML/code change monitoring), with each page's monitoring status. Each row returns id (the seo_monitor_id — pass it to list_code_monitor_changes / get_code_monitor_snapshot), url, last_change_at (ISO datetime of the most recent detected change, or null if none), and changes_count (total detected changes). Optionally filter by search (URL substring). Cursor-paginated: pass the returned next_cursor for the next page (limit defaults to 50, max 200). Returns feature_not_available when the property's plan does not include Code Monitor. Pass the property ID (UUID) or URL (sc-domain:...) from list_properties. Cost: 5 credits per call. Examples: ```json // List the monitored pages and their change status. {"property":"sc-domain:example.com","limit":25} ```
list_code_monitor_pages
Get the before/after values for a single detected Code Monitor change, addressed by url + createdAt (both from a list_code_monitor_changes row). Returns changes: a list of { type, property, before, after } — one entry per on-page field that changed in that snapshot (title/canonical/meta/robots/headings/hreflang/status code/OpenGraph/Twitter/Analytics/Tag Manager; before/after are raw values, arrays for multi-valued fields). Pass changeType (one of the change_types labels, e.g. "Title") to return just that field. Returns not_found when no change exists for that url+createdAt on this property, invalid_change_type for an unknown changeType, feature_not_available when the plan lacks Code Monitor. Pass the property ID (UUID) or URL (sc-domain:...) from list_properties. Cost: 3 credits per call. Examples: ```json // Before/after diff for a detected change on the pricing page. {"property":"sc-domain:example.com","url":"https://example.com/pricing","createdAt":"2026-06-15 03:00:00"} ```
get_code_monitor_change
Compare two Google Analytics 4 date ranges for a property. Period A accepts a preset (last_7_days, last_28_days, last_3_months, last_year) or absolute dates (periodAFrom/periodATo in Y-m-d). Period B is always absolute (periodBFrom/periodBTo). Returns per-metric sessions/users/new_users/conversions/engagement_rate with values for both periods plus diff and change_pct. `data_start_date` is the earliest synced day, so a 0 for either period that predates it reads as a coverage gap, not a real zero; `partial_coverage.period_a` / `partial_coverage.period_b` flag exactly that, so do not read diff or change_pct against a flagged period as a trend. The latest synced day is the `data_freshness.last_complete_date` on every response. Pass the project ID (UUID) or URL from list_ga4_properties. Cost: 6 credits per call. Examples: ```json // compare two absolute GA4 periods for a property {"property":"sc-domain:example.com","periodAFrom":"2026-05-01","periodATo":"2026-05-28","periodBFrom":"2026-04-01","periodBTo":"2026-04-28"} ```
compare_ga4_date_ranges
Compare two Google Search Console date ranges for a property. Period A accepts a preset (last_7_days, last_28_days, last_3_months, last_year) or absolute dates (periodAFrom/periodATo in Y-m-d). Period B is always absolute (periodBFrom/periodBTo). Returns per-metric clicks/impressions/ctr/position with values for both periods plus diff and change_pct. Optional filters: country (ISO-3166 alpha-3, e.g. "usa") and device ("desktop"/"mobile"/"tablet") compare that slice only; the applied filters are echoed back under "filters". Pass the property ID (UUID) or URL (sc-domain:...) from list_properties. Cost: 6 credits per call. Examples: ```json // compare two absolute Search Console periods for mobile traffic {"property":"sc-domain:example.com","periodAFrom":"2026-05-01","periodATo":"2026-05-28","periodBFrom":"2026-04-01","periodBTo":"2026-04-28","device":"mobile"} ```
compare_date_ranges
Compare two Site Audit (crawler) runs of a property to see what changed — use this for "what regressed/improved since the last crawl?". Crawl A is the baseline (earlier), crawl B the comparison (later); by default A is the previous crawl and B is the latest. Pass crawlA / crawlB (ISO-8601 crawl dates as returned by get_site_audit_summary's crawl_date / prev_crawl_date or list_site_audit_projects) to compare a specific pair. Returns crawl_a and crawl_b (each date + health), health_diff (B−A), counts {new, resolved, worsened, improved}, and four issue lists: new_issues (appeared in B), resolved_issues (gone in B), worsened (more pages affected in B) and improved (fewer in B). Each issue carries issue_code, title, severity (critical|warning|notice), category, pages_affected (in B), prev (in A) and delta (B−A). Returns no_previous_crawl when the audit has only one crawl, crawl_not_found when a given date matches no crawl, or audit_not_found for an unknown auditId. Defaults to the most-recently-finished audit; pass the auditId argument (an audit_id from list_site_audit_projects) to target a specific one. Pass the property ID (UUID) or URL (sc-domain:...) from list_properties. Cost: 5 credits per call. Examples: ```json // Compare the latest site audit crawl against the previous one. {"property":"sc-domain:example.com"} ```
compare_site_audit_crawls
List GSC properties (projects) available to the authenticated user. Cost: 1 credit per call. Examples: ```json // list every GSC property the authenticated user can access. [] ```
list_properties
Get the Site Audit (crawler) detail for a single crawled URL from the latest crawl. Returns status_code, crawl_depth, indexability_score (0–100), health_score, title, meta_description, category_scores (onPage/crawlability/indexability/internationalSeo/technical/social/structuredData/sitemaps — structuredData, sitemaps, and internationalSeo are null on crawls that predate those categories or never stored International page facts), issue_counts {critical, warning, notice}, and issues[] — the page's failing checks, each with issue_code, title, severity (critical|warning|notice), category, description (the per-page finding) and how_to_fix. NOTE: the crawler does not store canonical, H1, word count, internal-link counts, response time or byte size, so those are not returned. Returns page_not_found when the URL was not part of the latest crawl. Defaults to the most-recently-finished audit; pass the auditId argument (an audit_id from list_site_audit_projects) to target a specific one. Pass the property ID (UUID) or URL (sc-domain:...) from list_properties, and url = the exact page URL (as shown by list_site_audit_issue_pages or page_explorer). Cost: 3 credits per call. Examples: ```json // Technical detail + issues for a single page from the latest site audit crawl. {"property":"sc-domain:example.com","url":"https://example.com/pricing"} ```
get_site_audit_page
Create a Smart View on a property from a set of tags. A Smart View is a named, saved tag selection that appears in the SEOcrawl UI exactly like a natively-created one and can be edited there. type is "keyword" (a view over keywords, using keyword tags) or "page" (a view over pages, using page tags). tags is the list of tag names to include — read them from list_tags. Returns the created view with view_id, name, type and tags. Use list_smart_views to read them back and delete_smart_view to remove one. Pass the property ID (UUID) or URL (sc-domain:...) from list_properties. Cost: 1 credit per call. Examples: ```json // create a keyword Smart View grouping the Brand tag {"property":"sc-domain:example.com","name":"Brand keywords","tags":["Brand"],"type":"keyword"} ```
create_smart_view
Create an auto-assignment rule that tags every matching keyword or page — current and future. field is "keyword" or "url"; match is contains | not_contains | exact | starts_with | ends_with | regex; value is the pattern (a safe RE2 regex when match=regex). Example: field=keyword, match=contains, value="chess" tags every keyword containing "chess". The rule applies worldwide (all countries). Tagging of existing items runs asynchronously, so the tag/members may take a moment to appear in list_tags; the rule itself is created immediately. One rule per tag+field. Pass the property ID (UUID) or URL (sc-domain:...) from list_properties. Cost: 1 credit per call. Examples: ```json // auto-tag every keyword containing the brand term {"property":"sc-domain:example.com","tag":"Brand","field":"keyword","match":"contains","value":"example brand"} ```
create_tag_rule
Create a roadmap milestone on a property's task board. name and both dates are required — startDate and endDate are YYYY-MM-DD and must satisfy startDate <= endDate (a roadmap milestone is always scheduled). Optional: description and color (#RRGGBB hex). Assign tasks to it afterwards with assign_task_to_milestone. Dependencies between milestones are not set here. Cost: 2 credits per call. Examples: ```json // create a Q3 roadmap milestone with a start and end date. {"property":"sc-domain:example.com","name":"Q3 Launch","startDate":"2026-07-01","endDate":"2026-09-30"} ```
create_milestone
Create an AI Tracker (Brand Radar) prompt topic on a property. A topic groups prompts on the LLM Tracker page. title is required. Idempotent upsert by title: if a topic with the same title (case-insensitive) already exists it is returned unchanged with created=false; otherwise it is created with created=true. Use list_prompt_topics to read them and delete_prompt_topic to remove one. Pass the property ID (UUID) or URL (sc-domain:...) from list_properties. Cost: 1 credit per call. Examples: ```json // create (or fetch) the "Pricing" prompt topic {"property":"sc-domain:example.com","title":"Pricing"} ```
create_prompt_topic
Create a tag on a property. type is "keyword" (tags keywords), "url" (tags pages) or "both" (creates one of each). Optional color is a hex string (e.g. "#3366ff") used by the SEOcrawl UI. Tag identity is name + type, so creating an existing tag just updates its color. Returns the created tag(s) with tag_id, name, type and color. Use list_tags to read them back and the tags filter on get_top_keywords / get_top_pages / list_winners_losers to query by them. Pass the property ID (UUID) or URL (sc-domain:...) from list_properties. Cost: 1 credit per call. Examples: ```json // create a keyword tag named Brand with a custom color {"property":"sc-domain:example.com","name":"Brand","type":"keyword","color":"#3366ff"} ```
create_tag
Create a task on a property. Requires title. Optional: description, assignee user id, priority (1-5, default 3), taskbox (column UUID or a status keyword: todo, in_progress, qa, done — case-insensitive; default TO-DO column), due_date (YYYY-MM-DD, the task Goal Date), parent (a ticket UUID, slug, or browser URL — creates the task as that ticket's subtask). To make the task an applyable native SEO change, also pass targetUrl (absolute page URL), field (one of: meta_title, meta_description, h1, canonical, robots_meta, og_title, og_description, image_alt) and proposedValue; optionally platform (shopify|webflow|wordpress), currentValue, rationale. Nothing is applied automatically — the change is only proposed and needs explicit approval. Cost: 2 credits per call. Examples: ```json // create a task in the TO-DO column with a goal date {"property":"sc-domain:example.com","title":"Optimize the pricing page meta description","taskbox":"todo","dueDate":"2026-05-28"} // create the task as a subtask of an existing ticket (referenced by slug). {"property":"sc-domain:example.com","title":"Draft the H1 variants","parent":"optimize-the-pricing-page"} // create an actionable task carrying a proposed native SEO change (approval + apply happen later). {"property":"sc-domain:example.com","title":"Rewrite the pricing page meta title","targetUrl":"https://example.com/pricing","platform":"shopify","field":"meta_title","currentValue":"Pricing","proposedValue":"Pricing Plans & Costs (2026) — Example","rationale":"Low CTR at avg position 6; the current title is generic."} ```
create_task
Render an interactive data table (sort, search, pagination) from already-fetched rows. Call this when a tool response includes render_with="render-data-table": pass the rows through unchanged, do not re-format them as a markdown table. columns is [{key, label}]; rows is an array of objects keyed by column key. Keep array cell values as JSON arrays (do NOT flatten them to comma-separated strings). Optionally set pageSize, and source={tool, params} for an "Open in SEOcrawl" deep link. Cost: free. Examples: ```json // Interactive table built from a get_top_pages list. {"title":"Top pages","columns":[{"key":"url","label":"URL"},{"key":"clicks","label":"Clicks"}],"rows":[{"url":"/pricing","clicks":120},{"url":"/blog","clicks":90}]} ```
render-data-table
Delete a Smart View from a property. viewId is the view_id returned by create_smart_view / list_smart_views. Only Smart Views are deletable through this tool — a regular applied filter id returns not_found. Deletion is permanent and removes the view from the SEOcrawl UI too; the underlying tags are not affected. Pass the property ID (UUID) or URL (sc-domain:...) from list_properties. Cost: 1 credit per call. Examples: ```json // delete a Smart View by its id {"property":"sc-domain:example.com","viewId":"00000000-0000-0000-0000-000000000001"} ```
delete_smart_view
Delete a custom annotation (chart note) by its id. Pass annotationId (the UUID returned by add_annotation or list_annotations). Only custom notes on a property you can edit are deletable — official/global notes are rejected. Returns { id, deleted: true }. Requires the annotations:write scope. Cost: free. Examples: ```json // delete a custom annotation by its UUID {"annotationId":"00000000-0000-0000-0000-000000000001"} ```
delete_annotation
Delete an auto-assignment rule by its rule_id (from list_tag_rules). This stops future auto-tagging for that pattern; keywords/pages already carrying the tag keep it (use remove_tag or delete_tag to unassign). Pass the property ID (UUID) or URL (sc-domain:...) from list_properties. Cost: 1 credit per call. Examples: ```json // Delete one auto-tagging rule by its rule_id. {"property":"sc-domain:example.com","ruleId":"00000000-0000-0000-0000-000000000001"} ```
delete_tag_rule
Delete an AI Tracker (Brand Radar) prompt and all of its recorded engine responses. This is irreversible. promptId is the prompt UUID (from list_prompts). The prompt's topic is left untouched. Pass the property ID (UUID) or URL (sc-domain:...) from list_properties. Cost: 1 credit per call. Examples: ```json // delete a tracked prompt {"property":"sc-domain:example.com","promptId":"00000000-0000-0000-0000-000000000001"} ```
delete_prompt
Delete an AI Tracker (Brand Radar) prompt topic. WARNING: this cascades — every prompt filed under the topic, and all of those prompts' recorded engine responses, are permanently deleted along with the topic. This is irreversible. topicId is the topic UUID (from list_prompt_topics). The response returns prompts_deleted, the number of prompts removed by the cascade. Pass the property ID (UUID) or URL (sc-domain:...) from list_properties. Cost: 1 credit per call. Examples: ```json // delete a prompt topic and every prompt under it {"property":"sc-domain:example.com","topicId":"00000000-0000-0000-0000-000000000001"} ```
delete_prompt_topic
Delete a tag from a property entirely: unassigns it from every keyword/page and removes the tag itself. type is "keyword", "url" or "both". The built-in Brand / Non-Brand tags cannot be deleted. This does not delete auto-assignment rules that target the tag (use delete_tag_rule for those). Pass the property ID (UUID) or URL (sc-domain:...) from list_properties. Cost: 1 credit per call. Examples: ```json // Delete a custom tag from both keywords and pages. {"property":"sc-domain:example.com","name":"Brand","type":"both"} ```
delete_tag
Get Google Discover summary metrics (clicks, impressions, CTR) for a property, with period-over-period comparison against the equal-length window immediately before the range. Discover is a distinct Search Console surface (the Google Discover feed) — separate from Search performance; use get_gsc_summary for Search. Accepts a date range as presets (last_7_days, last_28_days, last_3_months, last_year) or absolute dates (from/to in Y-m-d). Returns each metric as *_current / *_prev / *_delta / *_change_pct (ctr is a 0-1 fraction, not a percentage). Discover has no query/position or country/device breakdown, so none is returned. Pass the property ID (UUID) or URL (sc-domain:...) from list_properties. Cost: 3 credits per call. Examples: ```json // Discover summary over the last 28 days. {"property":"sc-domain:example.com","range":"last_28_days"} ```
get_discover_summary
List top Google Discover pages of a property ranked by a chosen metric, with period-over-period change against the equal-length window immediately before the range. Discover is the Google Discover feed surface, distinct from Search performance (use get_top_pages for Search pages). Accepts a date range as presets (last_7_days, last_28_days, last_3_months, last_year) or absolute dates (from/to in Y-m-d). Sort by clicks (default), impressions, or ctr. Each page returns clicks/impressions/ctr as *_current plus *_change_pct (ctr is a 0-1 fraction). Cursor-paginated: pass the returned next_cursor back as cursor to page. Pass the property ID (UUID) or URL (sc-domain:...) from list_properties. Cost: 5 credits per call. Examples: ```json // Top 25 Discover pages by clicks over the last 28 days. {"property":"sc-domain:example.com","range":"last_28_days","sortBy":"clicks","limit":25} ```
get_discover_top_pages
Get the daily Google Discover trend for a property: two series ("clicks" and "impressions"), each a list of {date, value} points (missing days back-filled with 0), ready for a time-series chart. Discover is the Google Discover feed surface, distinct from Search performance (use get_gsc_summary/get_top_pages for Search). Accepts a date range as presets (last_7_days, last_28_days, last_3_months, last_year) or absolute dates (from/to in Y-m-d). Also returns "points" (number of days) and "insufficient_history" (true when too few points to chart meaningfully). Pass the property ID (UUID) or URL (sc-domain:...) from list_properties. Cost: 3 credits per call. Examples: ```json // Daily Discover clicks/impressions trend over the last 3 months. {"property":"sc-domain:example.com","range":"last_3_months"} ```
get_discover_history
Fetch a single live URL on demand (plain HTTP GET, no JavaScript) and return its parsed SEO elements, clean markdown content and optionally raw HTML — so you can inspect any page mid-conversation without launching a crawl. Always returns a `fetch` block (final_url, status_code, redirect_chain, content_type, response_time_ms, page_size_bytes (decoded/uncompressed size), fetched_at). `include` selects extra blocks: "seo" (title, meta_description, meta_robots, x_robots_tag, canonical, hreflang, html_lang, viewport, h1/h2, og/twitter tags, json_ld_types, word_count, internal/external/nofollow link counts, images_missing_alt), "content" (main body as markdown, truncated at 100 KB) and "html" (raw HTML, truncated at 200 KB); default ["seo","content"]. Non-HTML responses return only the fetch block. On a transport failure the result carries a structured `error` (dns_error, timeout, connection_error, too_large, blocked_url, too_many_redirects) instead. http/https only; private/reserved hosts are blocked. Free; rate-limited per user. Cost: free. Examples: ```json // inspect the SEO elements and content of a page {"url":"https://seocrawl.ai","include":["seo","content"]} ```
fetch_url
Get the Google Search Console index-coverage summary for a property: how many of its tracked (sitemap-submitted) URLs Google actually indexes, derived from the same data as the SEOcrawl Indexation tool. Returns known_urls, indexed, not_indexed and indexed_pct (each as current/prev/delta), sitemap_urls, and by_state — the URL count per Google coverage state ("Submitted and indexed", "Crawled - currently not indexed", "Discovered - currently not indexed", "Excluded by 'noindex' tag", "Page with redirect", "Not found (404)", "Soft 404", …). IMPORTANT: only indexed carries a real prev/delta (the daily metric records the same indexed count, so its end-of-prev-period value is a true comparison). known_urls/not_indexed/indexed_pct prev/delta are null, and by_state carries no prev/delta — Google reports only the latest state per URL (no daily coverage history) and the daily metric's known count is the plan-capped tracked-list size, not the coverage inventory, so it cannot be compared over time. known_urls counts only the URLs SEOcrawl tracks and the plan caps that list, so on a larger sitemap it is a subset of the site, NOT its size — never report it as the page count. sitemap_urls is the URL count the property's sitemaps actually declare, per Google's own Sitemaps API (null unless Google has reported every registered sitemap in the past week — never a partial sum); when it exceeds known_urls, say plainly that coverage is measured on known_urls of sitemap_urls URLs. indexed_pct is a percentage (0–100) of known_urls. Accepts a date range as presets (last_7_days, last_28_days, last_3_months, last_year) or absolute dates (from/to in Y-m-d). Pass the property ID (UUID) or URL (sc-domain:...) from list_properties. Returns feature_not_available when the property's plan does not include Indexation. Cost: 3 credits per call. Examples: ```json // Index-coverage summary with per-state breakdown for the last 28 days. {"property":"sc-domain:example.com","range":"last_28_days"} ```
get_indexation_summary
Get the daily indexed-pages trend for a property: how many of its URLs Google had indexed on each day, from the pre-aggregated daily sitemap metrics (forward-filled and summed across the property's sitemaps, so the latest day reconciles with get_indexation_summary). Returns one series ("indexed") of {date, value} points, ready for a time-series chart. NOTE: only "indexed" is exposed — the daily metric's known-URL count is the plan-capped tracked-list size (not the coverage inventory), so a daily "not_indexed"/coverage-% trend cannot be reconstructed faithfully; use get_indexation_summary for the current not_indexed/% breakdown. Accepts a date range as presets (last_7_days, last_28_days, last_3_months, last_year) or absolute dates (from/to in Y-m-d). Also returns "points" (number of days with real data) and "insufficient_history" (true when too few points to chart meaningfully — the daily metrics accrue forward and cannot be backfilled, so skip rendering a near-empty trend). Pass the property ID (UUID) or URL (sc-domain:...) from list_properties. Returns feature_not_available when the property's plan does not include Indexation. Cost: 3 credits per call. Examples: ```json // Daily indexed vs not-indexed trend over the last 3 months. {"property":"sc-domain:example.com","range":"last_3_months"} ```
get_indexation_history
Render a KPI scorecard (card grid) from already-fetched summary data. Call this when a tool response includes render_with="render-scorecard": pass the same numbers through, do not summarise them in prose. Values are RAW numbers (e.g. 1234567, not "1.2M"); the widget formats them. unit is "$" (prefix), "%" (suffix) or "s" (a duration like 687 -> "11m 27s"). Money is a raw decimal in the account currency (not cents). Use group to section cards when there are more than 4. Pass source={tool, params} to render an "Open in SEOcrawl" deep link. Cost: free. Examples: ```json // KPI scorecard built from a get_gsc_summary response (raw numbers passed through). {"title":"GSC summary","cards":[{"label":"Clicks","value":5432,"change":{"value":13.1,"direction":"up"}},{"label":"Avg position","value":8.5}]} ```
render-scorecard
Get daily Google Search Console metrics (clicks, impressions, CTR, position) for one or more search query keywords within a property. Pass a single keyword (keyword) or up to 50 at once (keywords array — mutually exclusive with keyword); the bulk form returns a results array with one daily series per keyword, keyed by the input. Accepts a date range as presets (last_7_days, last_28_days, last_3_months, last_year) or as absolute dates (from/to in Y-m-d format). Pass the property ID (UUID) or URL (sc-domain:...) from list_properties. Cost: 3 credits per call. Examples: ```json // Daily GSC metrics for a single keyword over the last 28 days. {"property":"sc-domain:example.com","keyword":"best running shoes","range":"last_28_days"} ```
get_keyword_detail
List the search query keywords that drive clicks/impressions to a specific page URL of a property, ranked by a chosen metric with period-over-period comparison. Accepts a date range as presets (last_7_days, last_28_days, last_3_months, last_year) or as absolute dates (from/to in Y-m-d format). Sort by clicks, impressions, position, or ctr. Returns all four metrics per keyword, a page-level summary, and cursor pagination (pass the returned next_cursor to fetch the next page). position_min/position_max keep only keywords whose current-period average position falls in that range, applied regardless of sort (position is returned on every row). The optional country/device parameters are accepted and echoed in filters but not yet applied to results. Pass the property ID (UUID) or URL (sc-domain:...) from list_properties, and the full page URL. Cost: 5 credits per call. Examples: ```json // Keywords driving traffic to a page over the last 28 days. {"property":"sc-domain:example.com","url":"https://example.com/pricing","range":"last_28_days","sortBy":"clicks"} ```
list_keywords_for_page
Get the most recent captured state of a Code Monitor page — the current extracted on-page fields (title, canonical, metaDescriptionContent, metaRobots, robotsTxt, sitemapXml, h1Heading, heading, statusCode, hreflang, imageOpenGraph, twitterImage, googleAnalytics, googleTagManager). Address the page with seoMonitorId (from list_code_monitor_pages) or url. Returns seo_monitor_id, url, captured_at (ISO, or null if never captured), and fields (the captured values; empty when no snapshot exists yet). Note: raw HTML and screenshots are not stored — only these structured fields. Returns not_found for an unknown page, missing_page_identifier when neither seoMonitorId nor url is given, feature_not_available when the plan lacks Code Monitor. Pass the property ID (UUID) or URL (sc-domain:...) from list_properties. Cost: 3 credits per call. Examples: ```json // Latest captured on-page fields of the monitored pricing page. {"property":"sc-domain:example.com","url":"https://example.com/pricing"} ```
get_code_monitor_snapshot
Get daily Google Search Console metrics (clicks, impressions, CTR, position) for one or more page URLs within a property. Pass a single page (url) or up to 50 at once (urls array — mutually exclusive with url); the bulk form returns a results array with one daily series per URL, keyed by the input. Accepts a date range as presets (last_7_days, last_28_days, last_3_months, last_year) or as absolute dates (from/to in Y-m-d format). Pass the property ID (UUID) or URL (sc-domain:...) from list_properties. Cost: 3 credits per call. Examples: ```json // Daily GSC metrics for a single page over the last 28 days. {"property":"sc-domain:example.com","url":"https://example.com/pricing","range":"last_28_days"} ```
get_page_detail
Find pages from the site audit (crawler) that match technical SEO criteria. Use this to answer questions like "which pages have no canonical tag?", "list all 404 pages", or "show pages missing an H1". Filters: status_code (e.g. 404), no_canonical (true → pages with missing canonical tag), missing_h1 (true → pages missing H1 heading), check_title (any audit check title as shown in the UI, e.g. "Title Tag too short"). Sorting: health (default), status_code, url, depth. Returns url, status_code, title, indexability, performance_score (= health), last_crawled_at, count_errors, count_warnings, check_description (when a check filter is active). Requires at least one completed crawl for the property. Pass the property ID (UUID) or URL (sc-domain:...) from list_properties. Cost: 5 credits per call. Examples: ```json // list 404 pages found by the latest site audit crawl. {"property":"sc-domain:example.com","statusCode":404,"limit":25} ```
page_explorer
How do I improve a ChatGPT Plugin's discoverability?
The levers are the listing surface agents actually read: names, descriptions, keywords, tool metadata, and registry health. Which lever matters depends on where discovery breaks, which is what continuous measurement shows.
What are SEOcrawl AI alternatives on ChatGPT?
As of 2026-09-20, SEOcrawl AI competes with Able SEO by VibeSEO, AccuRanker Search Intelligence, Advanced Web Ranking, Ahrefs, Appskyline, Grow My Website, GSC SEO & Content Planner, GSC Wizard, Keyword Tool Pro, Keyword Tool: Free SEO Ideas, Keyword.com, OpenRush, PagePulse, SE Ranking, Semji, Semrush, SEO with Distribb, Serpstat, SignalSumo, SiteGuru, Ubersuggest, vidIQ, Windsor.ai Search Console, Writrex SEO, ラッコキーワード in ChatGPT SEO Rank Tracking & Keyword Research, ranked by public Discoverability Score.
Where is this profile measured?
This profile uses the geography attached to the latest public registry snapshot: US. Locale tags are intentionally omitted.