Skip to content
Scalekit Docs

OpenSEO MCP

Vendor MCP46 toolsOAuth 2.1/DCRMarketingAnalyticsSearch

Connect to OpenSEO MCP. Research keywords, analyze live SERP results, review domain and competitor intelligence, track rankings, check backlinks, and read...

OpenSEO MCP connector

  1. Terminal window
    npm install @scalekit-sdk/node

    Full SDK reference: Node.js | Python

  2. Add your Scalekit credentials to your .env file. Find values in app.scalekit.com > Developers > API Credentials.

    .env
    SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
    SCALEKIT_CLIENT_ID=<your-client-id>
    SCALEKIT_CLIENT_SECRET=<your-client-secret>
  3. quickstart.ts
    import { ScalekitClient } from '@scalekit-sdk/node'
    import 'dotenv/config'
    const scalekit = new ScalekitClient(
    process.env.SCALEKIT_ENV_URL,
    process.env.SCALEKIT_CLIENT_ID,
    process.env.SCALEKIT_CLIENT_SECRET,
    )
    const actions = scalekit.actions
    const connector = 'openseomcp'
    const identifier = 'user_123'
    // Generate an authorization link for the user
    const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
    console.log('Authorize OpenSEO MCP:', link)
    process.stdout.write('Press Enter after authorizing...')
    await new Promise(r => process.stdin.once('data', r))
    // Make your first call
    const result = await actions.executeTool({
    connector,
    identifier,
    toolName: 'openseomcp_list_projects',
    toolInput: {},
    })
    console.log(result)

Connect this agent connector to let your agent:

  • Whoami records — Confirms the connected OpenSEO account, server mode, token scopes, and current credit balance when the user asks to check their account or connection
  • Update project context — Writes to a project’s shared memory so the app, SAM, and other agents see it
  • Search local businesses — Searches local business listings near a coordinate, with optional rating, review-count, and claimed-status filters
  • Keywords save, research, remove rank tracking — Save keywords to a project’s saved-keywords list
  • Run site audit, rank tracker — Start a site audit: crawls the site (robots.txt-aware, same-origin), checks every page for SEO issues (broken links, duplicate/missing titles and descriptions, redirect chains, orphan pages, canonical problems, thin content, and more), and optionally runs Lighthouse on a sample of pages
  • List saved keywords, projects, business categories — Lists keywords saved to a project (with cached metrics like search volume, difficulty, CPC, and tags if available)

Use the exact tool names from the Tool list below when you call execute_tool. If you’re not sure which name to use, list the tools available for the current user first.

openseomcp_add_rank_tracking_keywords#Add keywords to an existing rank tracker. The mutation itself uses no credits and does not start a check or fetch metrics, but scheduled trackers will spend credits on future recurring checks. For a scheduled tracker, call estimate_rank_tracker_cost with additionalKeywordCount, show the recurring estimate and live-fallback caveat to the user, and pass the approved nominal per-check estimate as maxEstimatedScheduledCheckCredits. This approval is not a runtime spending cap: rejected, failed, or timed-out queued tasks may use additional separately billed live fallback. Existing and repeated keywords are skipped, and `added` is the number actually inserted.5 params

Add keywords to an existing rank tracker. The mutation itself uses no credits and does not start a check or fetch metrics, but scheduled trackers will spend credits on future recurring checks. For a scheduled tracker, call estimate_rank_tracker_cost with additionalKeywordCount, show the recurring estimate and live-fallback caveat to the user, and pass the approved nominal per-check estimate as maxEstimatedScheduledCheckCredits. This approval is not a runtime spending cap: rejected, failed, or timed-out queued tasks may use additional separately billed live fallback. Existing and repeated keywords are skipped, and `added` is the number actually inserted.

NameTypeRequiredDescription
keywordsarrayrequiredKeywords to track. Existing and repeated keywords are skipped.
projectIdstringrequiredRequired. The OpenSEO project ID to scope this call to. Get one from list_projects.
trackerIdstringrequiredRank tracker ID from get_rank_tracker.
matchCasebooleanoptionalTrack the keywords exactly as typed instead of lowercasing them. Defaults to false. Use for brand names where Google's results differ by capitalization; a cased keyword is tracked and billed separately from its lowercase form.
maxEstimatedScheduledCheckCreditsintegeroptionalNominal queued credits per scheduled check that the user approved after seeing estimate_rank_tracker_cost with additionalKeywordCount. Required for scheduled trackers. This is an estimate approval, not a runtime cap; live fallback may add separately billed credits.
openseomcp_create_project#Create a new project in the user's organization. Uses no credits — does not call DataForSEO. Provide a name, and optionally a domain and default market (locationCode/languageCode; a languageCode requires a locationCode). Returns the created {id, name, domain, locationCode, languageCode, url}; pass the returned `id` as `projectId` to other OpenSEO tools. Call list_projects first to avoid creating a duplicate.5 params

Create a new project in the user's organization. Uses no credits — does not call DataForSEO. Provide a name, and optionally a domain and default market (locationCode/languageCode; a languageCode requires a locationCode). Returns the created {id, name, domain, locationCode, languageCode, url}; pass the returned `id` as `projectId` to other OpenSEO tools. Call list_projects first to avoid creating a duplicate.

NameTypeRequiredDescription
namestringrequiredProject name, 1-120 characters. This becomes the project's display name in OpenSEO.
domainstringoptionalOptional root domain for the project, host only (no scheme or path), e.g. 'example.com'. Sets the default target for domain, backlink, and rank tools.
languageCodestringoptionalOptional language code for the project's default market, e.g. 'en' or 'fr'. Requires locationCode to be set; derived from the location when omitted.
locationCodeintegeroptionalOptional DataForSEO location code for the project's default market, e.g. 2840 for United States or 2504 for Morocco. Falls back to the organization default when omitted.
organizationIdstringoptionalOrganization id to create the project in. Required when the user belongs to more than one organization; omitting it in that case returns the list of organizations instead of creating a project, so confirm the choice with the user before retrying.
openseomcp_create_rank_tracker#Create a rank tracking configuration for a project. Creating an empty tracker uses no credits and starts no check, but daily, weekly, and monthly trackers will spend credits after keywords are added. The domain defaults to the project's domain; market defaults to the project's market; devices default to mobile, search depth to 40, and schedule to manual. Use estimate_rank_tracker_cost before adding keywords to a scheduled tracker or starting a live run. Call get_rank_tracker first to avoid duplicates.8 params

Create a rank tracking configuration for a project. Creating an empty tracker uses no credits and starts no check, but daily, weekly, and monthly trackers will spend credits after keywords are added. The domain defaults to the project's domain; market defaults to the project's market; devices default to mobile, search depth to 40, and schedule to manual. Use estimate_rank_tracker_cost before adding keywords to a scheduled tracker or starting a live run. Call get_rank_tracker first to avoid duplicates.

NameTypeRequiredDescription
projectIdstringrequiredRequired. The OpenSEO project ID to scope this call to. Get one from list_projects.
devicesstringoptionalDevices to track. Defaults to mobile.
domainstringoptionalDomain to track. Defaults to the project's domain. Accepts a hostname or URL and stores the normalized hostname.
languageCodestringoptionalLanguage code (e.g. 'en', 'es', 'vi'). Defaults to the project's default market language (see list_projects).
locationCodeintegeroptionalDataForSEO location code. Defaults to the project's default market (see list_projects; editable in project settings). See dataforseo.com/help-center/locations. Some countries (e.g. Iceland, 2352) are served from Google Ads data: keyword volume/CPC/trends work, but keyword difficulty, search intent, and domain analytics are unavailable.
locationNamestringoptionalOptional city or region name for local rank tracking.
scheduleIntervalstringoptionalCheck schedule. Defaults to manual so creating a tracker cannot cause future credit spend. Scheduled checks may use credits later.
serpDepthintegeroptionalNumber of Google results to inspect. Defaults to 40.
openseomcp_estimate_rank_tracker_cost#Estimate rank tracker cost without spending credits or starting a check. The live estimate covers one explicit run_rank_tracker check. For a scheduled tracker, the response also includes nominal queued per-check and approximate monthly recurring cost. Pass additionalKeywordCount before adding keywords to project the post-add cost. Scheduled estimates are not runtime caps; rejected, failed, or timed-out queued tasks may use additional separately billed live fallback.3 params

Estimate rank tracker cost without spending credits or starting a check. The live estimate covers one explicit run_rank_tracker check. For a scheduled tracker, the response also includes nominal queued per-check and approximate monthly recurring cost. Pass additionalKeywordCount before adding keywords to project the post-add cost. Scheduled estimates are not runtime caps; rejected, failed, or timed-out queued tasks may use additional separately billed live fallback.

NameTypeRequiredDescription
projectIdstringrequiredRequired. The OpenSEO project ID to scope this call to. Get one from list_projects.
trackerIdstringrequiredRank tracker ID from get_rank_tracker.
additionalKeywordCountintegeroptionalNumber of keywords you plan to add. Include this before adding to a scheduled tracker so the response projects its recurring per-check and monthly cost.
openseomcp_find_serp_competitors#Compares domains competing in Google results for a supplied keyword set in a country-level DataForSEO Labs market. Accepts location/language codes; not radius-based local SEO. Charges credits.11 params

Compares domains competing in Google results for a supplied keyword set in a country-level DataForSEO Labs market. Accepts location/language codes; not radius-based local SEO. Charges credits.

NameTypeRequiredDescription
keywordsarrayrequiredKeywords whose SERPs are compared (1-100).
projectIdstringrequiredRequired. The OpenSEO project ID to scope this call to. Get one from list_projects.
excludeDomainsarrayoptionalDomains to exclude from results (e.g. the user's own site).
includeSubdomainsbooleanoptionalCount subdomains as part of the same competitor domain.
languageCodestringoptionalLanguage for locationCode. Defaults to that location's primary language when locationCode overrides the project market.
limitintegeroptionalMaximum competitors to return (1-100). Defaults to 50.
locationCodeintegeroptionalCountry-level DataForSEO Labs location code. Defaults to the project's market; takes precedence over the legacy market object.
marketobjectoptionalLegacy US selector. Prefer locationCode/languageCode for any Labs market. Explicit locationCode takes precedence; otherwise omitted = the project's default market.
offsetintegeroptionalRows to skip for pagination.
resultTypesarrayoptionalSERP result types to include. Defaults to organic and local_pack.
sortBystringoptionalSort order for returned competitors. Defaults to visibility.
openseomcp_get_audit_issues#Read the prioritized issue report from a completed site audit. Every issue carries a how_to_fix with concrete remediation steps an agent can act on. Free — reads OpenSEO state. Omit auditId for the most recent audit.5 params

Read the prioritized issue report from a completed site audit. Every issue carries a how_to_fix with concrete remediation steps an agent can act on. Free — reads OpenSEO state. Omit auditId for the most recent audit.

NameTypeRequiredDescription
projectIdstringrequiredRequired. The OpenSEO project ID that scopes this call to a specific connected property. Obtain valid project IDs from the list_projects tool. Example: proj_8f3a1c2b9d4e.
auditIdstringoptionalID of the audit to read issues from. If omitted, uses the project's most recent audit. Example: audit_5f3a1b2c.
issueTypestringoptionalOnly return issues of this type, such as broken-internal-link, duplicate-title, thin-content, or redirect-chain. See the enum for the full list of recognized issue types. Leave blank to return every type.
limitintegeroptionalMaximum number of issues to return, between 1 and 1000. Defaults to 200.
severitystringoptionalOnly return issues at this severity level: critical, warning, or info. Leave blank to return issues of every severity.
openseomcp_get_audit_pages#List crawled pages from a site audit with per-page SEO data (status, title, description, word count, indexability, crawl depth, link counts). Free — reads OpenSEO state. Omit auditId for the most recent audit.6 params

List crawled pages from a site audit with per-page SEO data (status, title, description, word count, indexability, crawl depth, link counts). Free — reads OpenSEO state. Omit auditId for the most recent audit.

NameTypeRequiredDescription
projectIdstringrequiredRequired. The OpenSEO project ID that scopes this call to a specific connected property. Obtain valid project IDs from the list_projects tool. Example: proj_8f3a1c2b9d4e.
auditIdstringoptionalID of the audit to list pages from. If omitted, uses the project's most recent audit. Example: audit_5f3a1b2c.
fetchClassstringoptionalFilter by fetch outcome: ok, blocked (the site's bot protection challenged the crawler), rate_limited (a 429 prevented the crawler from reading the page), or error. Leave blank to return pages of every fetch outcome.
limitintegeroptionalMaximum number of pages to return, between 1 and 1000. Defaults to 100.
statusCodeintegeroptionalFilter to pages that returned exactly this HTTP status code. Example: 404.
urlContainsstringoptionalFilter to page URLs containing this substring (case-sensitive). Example: /blog/.
openseomcp_get_audit_status#Check the progress of a site audit (phase, pages crawled, Lighthouse progress). Free — reads OpenSEO state and may reconcile a dead workflow by marking its audit failed. Omit auditId for the most recent audit.2 params

Check the progress of a site audit (phase, pages crawled, Lighthouse progress). Free — reads OpenSEO state and may reconcile a dead workflow by marking its audit failed. Omit auditId for the most recent audit.

NameTypeRequiredDescription
projectIdstringrequiredRequired. The OpenSEO project ID that scopes this call to a specific connected property. Obtain valid project IDs from the list_projects tool. Example: proj_8f3a1c2b9d4e.
auditIdstringoptionalID of the audit to check. If omitted, uses the project's most recent audit. Example: audit_5f3a1b2c.
openseomcp_get_business_profile#Reads one Google Business Profile: categories, rating and review count, rating breakdown, address, phone, website, claimed status, opening hours, and photo count. Use it to audit your own profile or to compare a competitor's. Charges credits.7 params

Reads one Google Business Profile: categories, rating and review count, rating breakdown, address, phone, website, claimed status, opening hours, and photo count. Use it to audit your own profile or to compare a competitor's. Charges credits.

NameTypeRequiredDescription
projectIdstringrequiredRequired. The OpenSEO project ID to scope this call to. Get one from list_projects.
businessNamestringoptionalBusiness name as it appears on Google. Supply exactly one of businessName, cid, or placeId.
cidstringoptionalGoogle-defined business CID (from get_local_serp_results rows). Most precise identifier.
languageCodestringoptionalLanguage code (e.g. 'en', 'es', 'vi'). Defaults to the project's default market language (see list_projects).
locationCodeintegeroptionalDataForSEO location code. Ignored when `near` is set; otherwise defaults to the project's market.
nearobjectoptionalCoordinate to search from. Use it when the business name is ambiguous; otherwise locationCode is enough.
placeIdstringoptionalGoogle Maps place_id (from get_local_serp_results rows).
openseomcp_get_business_reviews#Collects Google reviews for a business, with rating, author, text, and whether the owner replied. Use it for review-gap analysis against competitors and to spot unanswered reviews. Usually completes within this call; if the queued job is still running you get status 'processing' plus a taskId — call again with that taskId in 30-60 seconds to collect the result at no extra cost. Charges credits.11 params

Collects Google reviews for a business, with rating, author, text, and whether the owner replied. Use it for review-gap analysis against competitors and to spot unanswered reviews. Usually completes within this call; if the queued job is still running you get status 'processing' plus a taskId — call again with that taskId in 30-60 seconds to collect the result at no extra cost. Charges credits.

NameTypeRequiredDescription
projectIdstringrequiredRequired. The OpenSEO project ID to scope this call to. Get one from list_projects.
businessNamestringoptionalBusiness name as it appears on Google. Supply exactly one of businessName, cid, or placeId.
cidstringoptionalGoogle-defined business CID (from get_local_serp_results rows). Most precise identifier.
depthintegeroptionalNumber of reviews to collect (10-200). Defaults to 20. Billed per 10 reviews (per 20 when includeOtherSources is true).
includeOtherSourcesbooleanoptionalAlso collect the reviews Google shows from other sites (Yelp, Tripadvisor, Trustpilot). Defaults to false. Costs more per review and cannot be sorted.
languageCodestringoptionalLanguage code (e.g. 'en', 'es', 'vi'). Defaults to the project's default market language (see list_projects).
locationCodeintegeroptionalDataForSEO location code. Ignored when `near` is set; otherwise defaults to the project's market.
nearobjectoptionalCoordinate to search from. Use it when the business name is ambiguous; otherwise locationCode is enough.
placeIdstringoptionalGoogle Maps place_id (from get_local_serp_results rows).
sortBystringoptionalReview sort order. Defaults to newest. Ignored when includeOtherSources is true — the extended endpoint has no sort option.
taskIdstringoptionalResume a previous call that returned status "processing". Pass back the taskId exactly as returned (format "google:<id>" or "extended:<id>"); it selects the right endpoint on its own. Resuming charges no extra credits.
openseomcp_get_business_updates#Collects the posts (updates, offers, events) published on a Google Business Profile. Use it to check posting activity and recency on your profile or a competitor's. Usually completes within this call; a 'processing' response returns a taskId to call back with in 30-60 seconds at no extra cost. Charges credits.9 params

Collects the posts (updates, offers, events) published on a Google Business Profile. Use it to check posting activity and recency on your profile or a competitor's. Usually completes within this call; a 'processing' response returns a taskId to call back with in 30-60 seconds at no extra cost. Charges credits.

NameTypeRequiredDescription
projectIdstringrequiredRequired. The OpenSEO project ID to scope this call to. Get one from list_projects.
businessNamestringoptionalBusiness name as it appears on Google. Supply exactly one of businessName, cid, or placeId.
cidstringoptionalGoogle-defined business CID (from get_local_serp_results rows). Most precise identifier.
depthintegeroptionalNumber of posts to collect (10-100). Defaults to 10.
languageCodestringoptionalLanguage code (e.g. 'en', 'es', 'vi'). Defaults to the project's default market language (see list_projects).
locationCodeintegeroptionalDataForSEO location code. Ignored when `near` is set; otherwise defaults to the project's market.
nearobjectoptionalCoordinate to search from. Use it when the business name is ambiguous; otherwise locationCode is enough.
placeIdstringoptionalGoogle Maps place_id (from get_local_serp_results rows).
taskIdstringoptionalResume a previous call that returned status "processing". Pass back the taskId exactly as returned. Resuming charges no extra credits.
openseomcp_get_domain_keyword_suggestions#Returns the organic keywords a domain ranks for, including position and available metrics. Use after get_domain_overview when you want the detailed keyword opportunity list for a competitor or reference domain. Charges credits (~100-300 typical). Cached for 12 hours.5 params

Returns the organic keywords a domain ranks for, including position and available metrics. Use after get_domain_overview when you want the detailed keyword opportunity list for a competitor or reference domain. Charges credits (~100-300 typical). Cached for 12 hours.

NameTypeRequiredDescription
domainstringrequiredCompetitor or reference domain or URL to extract ranked keywords from.
projectIdstringrequiredRequired. The OpenSEO project ID to scope this call to. Get one from list_projects.
languageCodestringoptionalLanguage code, e.g. 'en', 'es', 'vi'. Defaults to the project's default market language.
locationCodeintegeroptionalDataForSEO location code, e.g. 2840 for United States or 2504 for Morocco. Defaults to the project's default market. Some countries (e.g. Iceland, 2352) are served from Google Ads data, where keyword difficulty, search intent, and domain analytics are unavailable.
scopestringoptionalResearch scope: 'domain' (hostname without subdomains), 'subdomains' (hostname plus all subdomains), 'subfolder' (path and its children), or 'exact_url' (one page). Defaults to 'subdomains' for root inputs and 'subfolder' when the input has a path.
openseomcp_get_domain_overview#Returns a high-level view of a domain's organic footprint: estimated organic traffic, organic keyword count, backlinks, and referring domains. Use this first for domain research; for the detailed ranked-keyword list, call get_domain_keyword_suggestions next. Charges credits (~100-300 typical). Cached for 12 hours per domain.6 params

Returns a high-level view of a domain's organic footprint: estimated organic traffic, organic keyword count, backlinks, and referring domains. Use this first for domain research; for the detailed ranked-keyword list, call get_domain_keyword_suggestions next. Charges credits (~100-300 typical). Cached for 12 hours per domain.

NameTypeRequiredDescription
domainstringrequiredDomain or URL to analyze, e.g. 'example.com'.
projectIdstringrequiredRequired. The OpenSEO project ID to scope this call to. Get one from list_projects.
includeSubdomainsbooleanoptionalDeprecated: use scope ('subdomains' or 'domain') instead.
languageCodestringoptionalLanguage code, e.g. 'en', 'es', 'vi'. Defaults to the project's default market language.
locationCodeintegeroptionalDataForSEO location code, e.g. 2840 for United States or 2504 for Morocco. Defaults to the project's default market. Some countries (e.g. Iceland, 2352) are served from Google Ads data, where keyword difficulty, search intent, and domain analytics are unavailable.
scopestringoptionalResearch scope: 'domain' (hostname without subdomains), 'subdomains' (hostname plus all subdomains), 'subfolder' (path and its children), or 'exact_url' (one page). Defaults to 'subdomains' for root inputs and 'subfolder' when the input has a path. Overview metrics always cover the hostname plus subdomains; narrower scopes are labeled accordingly — use get_ranked_keywords with a scope for scoped keyword data.
openseomcp_get_google_analytics_audience_breakdown#Read device, country, or new-versus-returning users, sessions, engagement, and key events. Previous-period comparison is available for device and new-versus-returning breakdowns. No demographic or user-level dimensions. Read-only and uses no OpenSEO credits.8 params

Read device, country, or new-versus-returning users, sessions, engagement, and key events. Previous-period comparison is available for device and new-versus-returning breakdowns. No demographic or user-level dimensions. Read-only and uses no OpenSEO credits.

NameTypeRequiredDescription
projectIdstringrequiredRequired. The OpenSEO project ID that scopes this call to a specific connected property. Obtain valid project IDs from the list_projects tool. Example: proj_8f3a1c2b9d4e.
breakdownstringoptionalHow to group audience data: device (default; desktop/mobile/tablet), country, or new_vs_returning (new versus returning users). Previous-period comparison is available for device and new_vs_returning. Defaults to device.
channelstringoptionalWhich acquisition channel to scope the audience data to: organic_search (default) or all channels.
comparePreviousPeriodbooleanoptionalWhen true, adds previous-period comparison values alongside the current period's metrics. Only available when Breakdown is device or new_vs_returning Defaults to false.
endDatestringoptionalInclusive end date of the reporting window, formatted as YYYY-MM-DD. Must be provided together with startDate. Example: 2026-08-31.
limitintegeroptionalMaximum number of rows to return, between 1 and 1000. Defaults to 100.
offsetintegeroptionalNumber of rows to skip before the first row returned, for paging through results beyond limit. Defaults to 0.
startDatestringoptionalInclusive start date of the reporting window, formatted as YYYY-MM-DD. Must be provided together with endDate; when both are omitted OpenSEO falls back to its standard recent date range. Example: 2026-08-01.
openseomcp_get_google_analytics_ecommerce_performance#Read item views, add-to-cart units, purchases, and item revenue by item, or transactions and purchase revenue by landing page. Returns a detected, none, or unknown activity state; landing pages can be limited to those with transactions. Organic Search is the default. Read-only and uses no OpenSEO credits.8 params

Read item views, add-to-cart units, purchases, and item revenue by item, or transactions and purchase revenue by landing page. Returns a detected, none, or unknown activity state; landing pages can be limited to those with transactions. Organic Search is the default. Read-only and uses no OpenSEO credits.

NameTypeRequiredDescription
projectIdstringrequiredRequired. The OpenSEO project ID that scopes this call to a specific connected property. Obtain valid project IDs from the list_projects tool. Example: proj_8f3a1c2b9d4e.
breakdownstringoptionalHow to group ecommerce performance data: item (item views, add-to-cart units, purchases, and item revenue per item) or landing_page (transactions and purchase revenue per landing page). Defaults to item.
channelstringoptionalWhich acquisition channel to scope the ecommerce data to: organic_search (default) or all channels.
endDatestringoptionalInclusive end date of the reporting window, formatted as YYYY-MM-DD. Must be provided together with startDate. Example: 2026-08-31.
limitintegeroptionalMaximum number of rows to return, between 1 and 1000. Defaults to 100.
offsetintegeroptionalNumber of rows to skip before the first row returned, for paging through results beyond limit. Defaults to 0.
onlyWithTransactionsbooleanoptionalWhen true and Breakdown is landing_page, limits results to landing pages that recorded at least one transaction. Defaults to false.
startDatestringoptionalInclusive start date of the reporting window, formatted as YYYY-MM-DD. Must be provided together with endDate; when both are omitted OpenSEO falls back to its standard recent date range. Example: 2026-08-01.
openseomcp_get_google_analytics_key_events#Read active GA4 key events with counts and users by event or organic landing page. Previous-period comparison is available for the event breakdown. Read-only and uses no OpenSEO credits.8 params

Read active GA4 key events with counts and users by event or organic landing page. Previous-period comparison is available for the event breakdown. Read-only and uses no OpenSEO credits.

NameTypeRequiredDescription
projectIdstringrequiredRequired. The OpenSEO project ID to scope this call to. Get one from list_projects.
breakdownstringoptionalHow to group key-event rows. Defaults to event.
channelstringoptionalTraffic channel to filter to. Defaults to organic_search.
comparePreviousPeriodbooleanoptionalInclude a comparison against the immediately preceding period of equal length. Only applies to the event breakdown. Defaults to false.
endDatestringoptionalInclusive YYYY-MM-DD date. Provide both startDate and endDate.
limitintegeroptionalMaximum number of key-event rows to return. Defaults to 100.
offsetintegeroptionalNumber of rows to skip, for pagination. Defaults to 0.
startDatestringoptionalInclusive YYYY-MM-DD date. Provide both startDate and endDate.
openseomcp_get_google_analytics_measurement_health#Diagnose the connected property's data streams, web measurement IDs, enhanced-measurement settings, key events, and custom definitions. Read-only and uses no OpenSEO credits.1 param

Diagnose the connected property's data streams, web measurement IDs, enhanced-measurement settings, key events, and custom definitions. Read-only and uses no OpenSEO credits.

NameTypeRequiredDescription
projectIdstringrequiredRequired. The OpenSEO project ID that scopes this call to a specific connected property. Obtain valid project IDs from the list_projects tool. Example: proj_8f3a1c2b9d4e.
openseomcp_get_google_analytics_organic_landing_pages#Read organic-search landing page sessions, engagement, key events, transactions, and revenue from the project's connected GA4 property. Defaults to the last 28 complete property days. Read-only and uses no OpenSEO credits.5 params

Read organic-search landing page sessions, engagement, key events, transactions, and revenue from the project's connected GA4 property. Defaults to the last 28 complete property days. Read-only and uses no OpenSEO credits.

NameTypeRequiredDescription
projectIdstringrequiredRequired. The OpenSEO project ID to scope this call to. Get one from list_projects.
endDatestringoptionalInclusive YYYY-MM-DD date. Provide both startDate and endDate.
limitintegeroptionalMaximum number of landing-page rows to return. Defaults to 100.
offsetintegeroptionalNumber of rows to skip, for pagination. Defaults to 0.
startDatestringoptionalInclusive YYYY-MM-DD date. Provide both startDate and endDate.
openseomcp_get_google_analytics_organic_overview#Answer whether organic traffic is improving with top-line sessions, users, engagement, key events, transactions, revenue, an equal-length previous-period comparison, and a daily or weekly trend. Read-only and uses no OpenSEO credits.4 params

Answer whether organic traffic is improving with top-line sessions, users, engagement, key events, transactions, revenue, an equal-length previous-period comparison, and a daily or weekly trend. Read-only and uses no OpenSEO credits.

NameTypeRequiredDescription
projectIdstringrequiredRequired. The OpenSEO project ID to scope this call to. Get one from list_projects.
endDatestringoptionalInclusive YYYY-MM-DD date. Provide both startDate and endDate.
startDatestringoptionalInclusive YYYY-MM-DD date. Provide both startDate and endDate.
trendstringoptionalGranularity of the trend series returned alongside the summary. Defaults to daily.
openseomcp_get_google_analytics_page_performance#Read page views, users, engagement duration, and key events from the connected GA4 property. Organic Search is the default; set channel to all to include every channel. Read-only and uses no OpenSEO credits.7 params

Read page views, users, engagement duration, and key events from the connected GA4 property. Organic Search is the default; set channel to all to include every channel. Read-only and uses no OpenSEO credits.

NameTypeRequiredDescription
projectIdstringrequiredRequired. The OpenSEO project ID to scope this call to. Get one from list_projects.
channelstringoptionalTraffic channel to filter to. Defaults to organic_search.
endDatestringoptionalInclusive YYYY-MM-DD date. Provide both startDate and endDate.
includeDatebooleanoptionalBreak results out by date in addition to page. Defaults to false.
limitintegeroptionalMaximum number of page rows to return. Defaults to 100.
offsetintegeroptionalNumber of rows to skip, for pagination. Defaults to 0.
startDatestringoptionalInclusive YYYY-MM-DD date. Provide both startDate and endDate.
openseomcp_get_google_analytics_traffic_acquisition#Compare session acquisition by channel group, source/medium, or campaign, including sessions, users, engagement, key events, transactions, and revenue. Previous-period comparison is available for channel group; source/medium also reports attribution-quality diagnostics. Read-only and uses no OpenSEO credits.7 params

Compare session acquisition by channel group, source/medium, or campaign, including sessions, users, engagement, key events, transactions, and revenue. Previous-period comparison is available for channel group; source/medium also reports attribution-quality diagnostics. Read-only and uses no OpenSEO credits.

NameTypeRequiredDescription
projectIdstringrequiredRequired. The OpenSEO project ID that scopes this call to a specific connected property. Obtain valid project IDs from the list_projects tool. Example: proj_8f3a1c2b9d4e.
breakdownstringoptionalHow to group traffic-acquisition sessions: channel_group (default marketing channel groups), source_medium (raw source/medium pairs, plus attribution-quality diagnostics), or campaign (campaign names). Defaults to channel_group.
comparePreviousPeriodbooleanoptionalWhen true, adds previous-period comparison values alongside the current period's metrics. Only available when Breakdown is channel_group Defaults to false.
endDatestringoptionalInclusive end date of the reporting window, formatted as YYYY-MM-DD. Must be provided together with startDate. Example: 2026-08-31.
limitintegeroptionalMaximum number of rows to return, between 1 and 1000. Defaults to 100.
offsetintegeroptionalNumber of rows to skip before the first row returned, for paging through results beyond limit. Defaults to 0.
startDatestringoptionalInclusive start date of the reporting window, formatted as YYYY-MM-DD. Must be provided together with endDate; when both are omitted OpenSEO falls back to its standard recent date range. Example: 2026-08-01.
openseomcp_get_google_business_questions#Fetches Google Business Profile questions and answers for one business (by businessName, cid, or placeId) near a coordinate. Run this only when Q&A evidence is needed. Charges credits.7 params

Fetches Google Business Profile questions and answers for one business (by businessName, cid, or placeId) near a coordinate. Run this only when Q&A evidence is needed. Charges credits.

NameTypeRequiredDescription
nearobjectrequiredCoordinate and radius to search around.
projectIdstringrequiredRequired. The OpenSEO project ID to scope this call to. Get one from list_projects.
businessNamestringoptionalBusiness name as it appears on Google. Supply exactly one of businessName, cid, or placeId.
cidstringoptionalGoogle-defined business CID (from get_local_serp_results rows). Most precise identifier.
depthintegeroptionalMaximum Q&A rows to fetch (1-100). Defaults to 20.
languageCodestringoptionalLanguage code (e.g. 'en', 'es', 'vi'). Defaults to the project's default market language (see list_projects).
placeIdstringoptionalGoogle Maps place_id (from get_local_serp_results rows).
openseomcp_get_keyword_metrics#Hydrate up to 700 known keywords with search volume, keyword difficulty (KD), search intent, CPC, competition, and monthly trends in a single call. Use it to score candidate or known keywords — including Search Console striking-distance queries — by real demand and ranking difficulty. For countries served from Google Ads data (e.g. Iceland), KD and intent are null. Charges credits.7 params

Hydrate up to 700 known keywords with search volume, keyword difficulty (KD), search intent, CPC, competition, and monthly trends in a single call. Use it to score candidate or known keywords — including Search Console striking-distance queries — by real demand and ranking difficulty. For countries served from Google Ads data (e.g. Iceland), KD and intent are null. Charges credits.

NameTypeRequiredDescription
keywordsarrayrequiredKeywords to fetch metrics for (1-700).
projectIdstringrequiredRequired. The OpenSEO project ID to scope this call to. Get one from list_projects.
includeClickstreamDatabooleanoptionalRefine search volumes with clickstream data, which disaggregates Google Ads' grouped close-variant volumes (plurals/misspellings). DOUBLES the credit cost of the call. Default false. No effect for countries served from Google Ads data.
includeMonthlyTrendsbooleanoptionalInclude monthly search-volume trend rows. Defaults to true.
languageCodestringoptionalLanguage code (e.g. 'en', 'es', 'vi'). Defaults to the project's default market language (see list_projects).
locationCodeintegeroptionalDataForSEO location code. Defaults to the project's default market (see list_projects; editable in project settings). See dataforseo.com/help-center/locations. Some countries (e.g. Iceland, 2352) are served from Google Ads data: keyword volume/CPC/trends work, but keyword difficulty, search intent, and domain analytics are unavailable.
sortBystringoptionalSort order for returned rows. Defaults to search_volume.
openseomcp_get_local_rank_grid#Runs one Google Maps search per point of a square grid around a coordinate and reports where the target business ranks at each point — plus each point's result count and #1 business — revealing how far its Maps visibility reaches. Cost scales with the grid: gridSize squared SERP calls (3x3 = 9, the sensible default; 5x5 = 25). Charges credits per grid point.9 params

Runs one Google Maps search per point of a square grid around a coordinate and reports where the target business ranks at each point — plus each point's result count and #1 business — revealing how far its Maps visibility reaches. Cost scales with the grid: gridSize squared SERP calls (3x3 = 9, the sensible default; 5x5 = 25). Charges credits per grid point.

NameTypeRequiredDescription
centerobjectrequiredCoordinate the grid is centered on (usually the storefront).
keywordstringrequiredSearch query to run on Google Maps at every grid point.
projectIdstringrequiredRequired. The OpenSEO project ID to scope this call to. Get one from list_projects.
targetobjectrequiredThe business to locate in each result set. Supply at least one of cid, placeId, or name.
devicestringoptionalDevice the SERP is rendered for. Defaults to mobile.
gridSizeintegeroptionalGrid width: 3 (9 searches) or 5 (25 searches). Defaults to 3.
languageCodestringoptionalLanguage code (e.g. 'en', 'es', 'vi'). Defaults to the project's default market language (see list_projects).
spacingKmnumberoptionalDistance between neighbouring grid points, in km. Defaults to 2.
zoomintegeroptionalMap zoom every point is searched at. Defaults to a zoom derived from spacingKm and latitude so each point's viewport spans the grid spacing; override only when you need a specific viewport.
openseomcp_get_local_serp_results#Fetches one Google Maps or Local Finder SERP near a coordinate. Returns trimmed provider rows (identity, rank, rating, categories, hours) with rank fields intact; callers decide how to match a target business. Charges credits.7 params

Fetches one Google Maps or Local Finder SERP near a coordinate. Returns trimmed provider rows (identity, rank, rating, categories, hours) with rank fields intact; callers decide how to match a target business. Charges credits.

NameTypeRequiredDescription
keywordstringrequiredSearch query to run on Google Maps or Local Finder.
nearobjectrequiredCoordinate (and optional map zoom) the SERP is fetched from.
projectIdstringrequiredRequired. The OpenSEO project ID to scope this call to. Get one from list_projects.
depthintegeroptionalNumber of results to fetch (1-100). Defaults to 20.
devicestringoptionalDevice the SERP is rendered for. Defaults to mobile, matching get_local_rank_grid.
languageCodestringoptionalLanguage code (e.g. 'en', 'es', 'vi'). Defaults to the project's default market language (see list_projects).
searchTypestringoptionalWhich local SERP to fetch. Defaults to maps.
openseomcp_get_project_context#Reads a project's shared memory: business overview, current goal, positioning, writing preferences, custom sections, competitors, key pages, and the recent research log. Uses no credits. Call this before SEO work to ground it in what the user already told OpenSEO, and check the research log before re-buying research. Sections listed as missing are the ones worth filling with update_project_context.1 param

Reads a project's shared memory: business overview, current goal, positioning, writing preferences, custom sections, competitors, key pages, and the recent research log. Uses no credits. Call this before SEO work to ground it in what the user already told OpenSEO, and check the research log before re-buying research. Sections listed as missing are the ones worth filling with update_project_context.

NameTypeRequiredDescription
projectIdstringrequiredRequired. The OpenSEO project ID to scope this call to. Get one from list_projects.
openseomcp_get_rank_tracker#Read-only access to rank tracker configs and their latest results. With `trackerId`, returns config + latest snapshot per keyword, including `trackingKeywordId` for removals. Without it, lists all trackers in the project. Uses no credits. Use create_rank_tracker when no tracker exists; then use add_rank_tracking_keywords, remove_rank_tracking_keywords, estimate_rank_tracker_cost, or run_rank_tracker to manage it. `lastCheckedAt` shows position freshness.2 params

Read-only access to rank tracker configs and their latest results. With `trackerId`, returns config + latest snapshot per keyword, including `trackingKeywordId` for removals. Without it, lists all trackers in the project. Uses no credits. Use create_rank_tracker when no tracker exists; then use add_rank_tracking_keywords, remove_rank_tracking_keywords, estimate_rank_tracker_cost, or run_rank_tracker to manage it. `lastCheckedAt` shows position freshness.

NameTypeRequiredDescription
projectIdstringrequiredRequired. The OpenSEO project ID to scope this call to. Get one from list_projects.
trackerIdstringoptionalRank tracker config ID. If omitted, lists all rank trackers in the project.
openseomcp_get_ranked_keywords#Returns market-specific keyword, URL, rank, search volume, CPC, intent, and traffic rows for a domain or page. Accepts country-level DataForSEO Labs location/language codes. Use this for strategy evidence; use get_domain_overview for aggregate domain footprint. Charges credits.14 params

Returns market-specific keyword, URL, rank, search volume, CPC, intent, and traffic rows for a domain or page. Accepts country-level DataForSEO Labs location/language codes. Use this for strategy evidence; use get_domain_overview for aggregate domain footprint. Charges credits.

NameTypeRequiredDescription
projectIdstringrequiredRequired. The OpenSEO project ID to scope this call to. Get one from list_projects.
targetstringrequiredDomain (no protocol/www) or absolute page URL to list ranked keywords for.
excludeBrandTermsarrayoptionalExclude keywords containing any of these brand terms.
includeSubdomainsbooleanoptionalDeprecated: use scope ('subdomains' or 'domain') instead.
languageCodestringoptionalLanguage for locationCode. Defaults to that location's primary language when locationCode overrides the project market.
limitintegeroptionalMaximum rows to return (1-100). Defaults to 50.
locationCodeintegeroptionalCountry-level DataForSEO Labs location code. Defaults to the project's market; takes precedence over the legacy market object.
marketobjectoptionalLegacy US selector. Prefer locationCode/languageCode for any Labs market. Explicit locationCode takes precedence; otherwise omitted = the project's default market.
maxRankintegeroptionalOnly return keywords ranking at this position or better.
minSearchVolumeintegeroptionalOnly return keywords with at least this monthly search volume.
offsetintegeroptionalRows to skip for pagination.
resultTypesarrayoptionalSERP result types to include. Defaults to organic and paid.
scopestringoptionalResearch scope: 'domain' (hostname without subdomains), 'subdomains' (hostname plus all subdomains), 'subfolder' (path and its children), or 'exact_url' (one page). Defaults to 'subdomains' for root inputs and 'subfolder' when the input has a path.
sortBystringoptionalSort order for returned rows. Defaults to search_volume.
openseomcp_get_search_console_performance#Query the connected Search Console property's Search Analytics: clicks, impressions, CTR, and average position by query/page/country/device/date. First-party data — use it for what already ranks, near-ranking queries, and pages with real demand. ctr is a 0-1 fraction; position is a 1-based average and is omitted from rows when type is 'discover' or 'googleNews' (Google does not report it there — treat it as unavailable, not a failure); dates are Pacific Time; the last ~3 days may be incomplete. Read-only; uses no credits.10 params

Query the connected Search Console property's Search Analytics: clicks, impressions, CTR, and average position by query/page/country/device/date. First-party data — use it for what already ranks, near-ranking queries, and pages with real demand. ctr is a 0-1 fraction; position is a 1-based average and is omitted from rows when type is 'discover' or 'googleNews' (Google does not report it there — treat it as unavailable, not a failure); dates are Pacific Time; the last ~3 days may be incomplete. Read-only; uses no credits.

NameTypeRequiredDescription
projectIdstringrequiredRequired. The OpenSEO project ID to scope this call to. Get one from list_projects.
dataStatestringoptional'all' (default) includes fresh/incomplete recent data.
dateRangestringoptionalConvenience window (default last_28_days). End is set ~3 days back for GSC data lag. Ignored if startDate+endDate are given. Max lookback is 16 months.
dimensionsarrayoptionalGroup rows by these dimensions. Default ['query']. Use ['page'] for top pages, ['query','page'] to map queries to pages / spot cannibalization, ['date'] for a time series.
endDatestringoptionalExplicit end (YYYY-MM-DD, Pacific Time). Use with startDate.
filtersarrayoptionalAND-combined filters. To get the queries for one page: [{dimension:'page',operator:'equals',expression:'https://example.com/post'}] with dimensions ['query'].
rowLimitintegeroptionalRows per call (default 1000, max 1000). GSC sorts by clicks desc and can't filter by position — filter 'striking distance' positions client-side, and paginate with startRow when hasMore is true.
startDatestringoptionalExplicit start (YYYY-MM-DD, Pacific Time). Use with endDate.
startRowintegeroptionalPagination offset.
typestringoptionalSearch type (default web).
openseomcp_get_search_opportunities#Join Search Console pages ranking in positions 4–20 with GA4 organic landing-page outcomes, then score matched opportunities by demand, business value, and reachability. Unmatched pages remain visible and unscored. Read-only and uses no OpenSEO credits.4 params

Join Search Console pages ranking in positions 4–20 with GA4 organic landing-page outcomes, then score matched opportunities by demand, business value, and reachability. Unmatched pages remain visible and unscored. Read-only and uses no OpenSEO credits.

NameTypeRequiredDescription
projectIdstringrequiredRequired. The OpenSEO project ID to scope this call to. Get one from list_projects.
endDatestringoptionalInclusive YYYY-MM-DD date. Provide both startDate and endDate.
limitintegeroptionalMaximum number of opportunity rows to return. Defaults to 50.
startDatestringoptionalInclusive YYYY-MM-DD date. Provide both startDate and endDate.
openseomcp_get_serp_results#Fetch live Google organic search results for 1-10 keywords. Use this to inspect who ranks for a query, verify competitors, compare SERPs across keywords, or gather source URLs before content planning. Returns the top `depth` result rows per keyword (default 20). Charges credits per keyword: ~5 each at the default depth 20, and each additional 10 of depth adds ~2.5. Does not save results to OpenSEO. Per-keyword errors don't fail the batch.3 params

Fetch live Google organic search results for 1-10 keywords. Use this to inspect who ranks for a query, verify competitors, compare SERPs across keywords, or gather source URLs before content planning. Returns the top `depth` result rows per keyword (default 20). Charges credits per keyword: ~5 each at the default depth 20, and each additional 10 of depth adds ~2.5. Does not save results to OpenSEO. Per-keyword errors don't fail the batch.

NameTypeRequiredDescription
projectIdstringrequiredRequired. The OpenSEO project ID to scope this call to. Get one from list_projects.
queriesarrayrequired1-10 queries. Bulk-friendly — prefer this over multiple single-query calls.
depthintegeroptionalHow many SERP rows to crawl per keyword — a multiple of 10 from 10 to 100, default 20. Google has no offset, so a deeper crawl re-fetches the top too: each additional 10 adds ~2.5 credits per keyword. Only raise it when you need ranks past the top 20.
openseomcp_inspect_urls#Run Google Search Console's URL Inspection on up to 10 URLs of the connected property: index/coverage state, last crawl time, Google-selected vs declared canonical, and mobile/rich-results verdicts. Use it to answer 'is this page indexed? why not?'. Per-URL failures are reported inline. Read-only; uses no credits.3 params

Run Google Search Console's URL Inspection on up to 10 URLs of the connected property: index/coverage state, last crawl time, Google-selected vs declared canonical, and mobile/rich-results verdicts. Use it to answer 'is this page indexed? why not?'. Per-URL failures are reported inline. Read-only; uses no credits.

NameTypeRequiredDescription
projectIdstringrequiredRequired. The OpenSEO project ID to scope this call to. Get one from list_projects.
urlsarrayrequired1–10 absolute URLs to inspect. Each must belong to the connected property.
languageCodestringoptionalBCP-47 language for the inspection result (e.g. 'en-US').
openseomcp_list_business_categories#Lists the Google Business categories DataForSEO recognizes, ranked by how many businesses use them. Use it to find valid category slugs for search_local_businesses (e.g. 'pizza_restaurant'). Uses no credits (the full list is cached for 7 days).3 params

Lists the Google Business categories DataForSEO recognizes, ranked by how many businesses use them. Use it to find valid category slugs for search_local_businesses (e.g. 'pizza_restaurant'). Uses no credits (the full list is cached for 7 days).

NameTypeRequiredDescription
projectIdstringrequiredRequired. The OpenSEO project ID to scope this call to. Get one from list_projects.
limitintegeroptionalMaximum categories to return (1-200). Defaults to 50.
querystringoptionalCase-insensitive substring to match against category slugs (e.g. 'plumb').
openseomcp_list_projects#Lists the user's projects. Uses no credits — does not call DataForSEO. Use this whenever you need a `projectId` for another OpenSEO tool. Returns an array of {id, name, domain, locationCode, languageCode}; pass the `id` value as `projectId`. locationCode/languageCode are the project's default market — tools fall back to them when a call omits location/language args. When the user belongs to several organizations, each project is labeled with its organization and organizationId (pass that to create_project).0 params

Lists the user's projects. Uses no credits — does not call DataForSEO. Use this whenever you need a `projectId` for another OpenSEO tool. Returns an array of {id, name, domain, locationCode, languageCode}; pass the `id` value as `projectId`. locationCode/languageCode are the project's default market — tools fall back to them when a call omits location/language args. When the user belongs to several organizations, each project is labeled with its organization and organizationId (pass that to create_project).

openseomcp_list_saved_keywords#Lists keywords saved to a project (with cached metrics like search volume, difficulty, CPC, and tags if available). Uses no credits — reads from OpenSEO's database, no DataForSEO call. Use tag filters when the user asks for a saved segment; multiple tags match ANY tag.4 params

Lists keywords saved to a project (with cached metrics like search volume, difficulty, CPC, and tags if available). Uses no credits — reads from OpenSEO's database, no DataForSEO call. Use tag filters when the user asks for a saved segment; multiple tags match ANY tag.

NameTypeRequiredDescription
projectIdstringrequiredRequired. The OpenSEO project ID to scope this call to. Get one from list_projects.
limitintegeroptionalMaximum number of saved keyword rows to return: 50, 100, or 250. Defaults to 100.
searchstringoptionalOptional keyword text filter; matches keywords containing this text.
tagsarrayoptionalOptional tag-name filters (up to 20). A saved keyword matches if it has ANY of the listed tags.
openseomcp_remove_rank_tracking_keywords#Stop tracking keywords by their trackingKeywordId. Uses no credits and preserves historical snapshots. Missing, stale, foreign, and repeated IDs are ignored; `removed` is the number actually deleted from this tracker.3 params

Stop tracking keywords by their trackingKeywordId. Uses no credits and preserves historical snapshots. Missing, stale, foreign, and repeated IDs are ignored; `removed` is the number actually deleted from this tracker.

NameTypeRequiredDescription
keywordIdsarrayrequiredTracking keyword IDs to remove. Use `trackingKeywordId` values returned by get_rank_tracker.
projectIdstringrequiredRequired. The OpenSEO project ID to scope this call to. Get one from list_projects.
trackerIdstringrequiredRank tracker ID from get_rank_tracker.
openseomcp_research_keywords#Research keyword data (search volume, difficulty, CPC, related ideas) for 1-5 seed keywords in one call. Charges credits per seed (~30-100 credits each, varies by source; flat ~96 for countries served from Google Ads data, where difficulty/intent are unavailable). Returns per-seed results — a single bad seed won't fail the batch.4 params

Research keyword data (search volume, difficulty, CPC, related ideas) for 1-5 seed keywords in one call. Charges credits per seed (~30-100 credits each, varies by source; flat ~96 for countries served from Google Ads data, where difficulty/intent are unavailable). Returns per-seed results — a single bad seed won't fail the batch.

NameTypeRequiredDescription
projectIdstringrequiredRequired. The OpenSEO project ID to scope this call to. Get one from list_projects.
seedsarrayrequired1-5 seed keywords. Each seed is researched independently and returns related keywords with volume/difficulty/CPC. Bulk-friendly — prefer this over multiple single-seed calls.
includeClickstreamDatabooleanoptionalRefine search volumes with clickstream data, which disaggregates Google Ads' grouped close-variant volumes (plurals/misspellings). Doubles the credit cost of each seed. Defaults to false (standard Google-Ads-derived volumes). Has no effect for countries served from Google Ads data.
resultLimitintegeroptionalMaximum related keywords returned per seed: 150, 300, or 500. Defaults to 150.
openseomcp_run_rank_tracker#Start an explicit live rank check for every keyword and configured device. This spends credits: call estimate_rank_tracker_cost, show the estimate to the user, and pass the approved credit amount as maxCostCredits. A fresh estimate above that ceiling is rejected. Hosted accounts require a paid plan, while self-hosted deployments are not plan-gated. If a run is already in progress, its blocking run ID is reported without starting or charging another check. The schedule is unchanged.3 params

Start an explicit live rank check for every keyword and configured device. This spends credits: call estimate_rank_tracker_cost, show the estimate to the user, and pass the approved credit amount as maxCostCredits. A fresh estimate above that ceiling is rejected. Hosted accounts require a paid plan, while self-hosted deployments are not plan-gated. If a run is already in progress, its blocking run ID is reported without starting or charging another check. The schedule is unchanged.

NameTypeRequiredDescription
maxCostCreditsintegerrequiredMaximum credits the user approved after seeing estimate_rank_tracker_cost. The run is rejected if its fresh estimate is higher.
projectIdstringrequiredRequired. The OpenSEO project ID to scope this call to. Get one from list_projects.
trackerIdstringrequiredRank tracker ID from get_rank_tracker.
openseomcp_run_site_audit#Start a site audit: crawls the site (robots.txt-aware, same-origin), checks every page for SEO issues (broken links, duplicate/missing titles and descriptions, redirect chains, orphan pages, canonical problems, thin content, and more), and optionally runs Lighthouse on a sample of pages. Runs in the background — poll get_audit_status, then read get_audit_issues. If the site rate limits the crawler it slows down and retries; pages it still cannot read are honestly flagged as blocked or rate-limited rather than misreported.4 params

Start a site audit: crawls the site (robots.txt-aware, same-origin), checks every page for SEO issues (broken links, duplicate/missing titles and descriptions, redirect chains, orphan pages, canonical problems, thin content, and more), and optionally runs Lighthouse on a sample of pages. Runs in the background — poll get_audit_status, then read get_audit_issues. If the site rate limits the crawler it slows down and retries; pages it still cannot read are honestly flagged as blocked or rate-limited rather than misreported.

NameTypeRequiredDescription
projectIdstringrequiredRequired. The OpenSEO project ID that scopes this call to a specific connected property. Obtain valid project IDs from the list_projects tool. Example: proj_8f3a1c2b9d4e.
urlstringrequiredThe start URL to crawl. The crawl stays same-origin and honors the site's robots.txt. Example: https://www.example.com/.
maxPagesintegeroptionalPage budget for the crawl, between 10 and 10000. Defaults to 50.
runLighthousebooleanoptionalWhen true, runs Lighthouse on a sample of up to 10 representative pages, adding several minutes of wall-clock time. Pass true only when performance/Core Web Vitals detail is wanted. Defaults to false.
openseomcp_save_keywords#Save keywords to a project's saved-keywords list. Uses no credits — does not call DataForSEO. Idempotent: re-saving an existing keyword is a no-op. If tags are provided, missing tags may be created. By default tags are appended; set tagMode=replace to remove existing tags from these saved keywords before applying the provided tags, which is useful for reorganizing keywords into page/topic clusters. Ask the user for confirmation before applying or replacing tags broadly.7 params

Save keywords to a project's saved-keywords list. Uses no credits — does not call DataForSEO. Idempotent: re-saving an existing keyword is a no-op. If tags are provided, missing tags may be created. By default tags are appended; set tagMode=replace to remove existing tags from these saved keywords before applying the provided tags, which is useful for reorganizing keywords into page/topic clusters. Ask the user for confirmation before applying or replacing tags broadly.

NameTypeRequiredDescription
keywordsarrayrequiredKeywords to save, 1-100. Saving an already-saved keyword is a no-op.
projectIdstringrequiredRequired. The OpenSEO project ID to scope this call to. Get one from list_projects.
languageCodestringoptionalLanguage code, e.g. 'en', 'es', 'vi'. Defaults to the project's default market language.
locationCodeintegeroptionalDataForSEO location code, e.g. 2840 for United States or 2504 for Morocco. Defaults to the project's default market. Some countries (e.g. Iceland, 2352) are served from Google Ads data, where keyword difficulty, search intent, and domain analytics are unavailable.
metricsarrayoptionalOptional cached metrics for the saved keywords, one entry per keyword matched by its keyword field. Copy searchVolume, keywordDifficulty, cpc, competition and intent straight from the matching research_keywords rows, and map each row's trend to monthlySearches.
tagModestringoptionalHow to apply tags: 'append' adds the given tags to any existing ones (default); 'replace' removes existing tags from these saved keywords before applying the given tags — useful for reorganizing keywords into page/topic clusters.
tagsarrayoptionalOptional tags to attach to every saved keyword in this call. Missing tag names may be created. Ask the user for explicit confirmation before using this, especially when saving many keywords or creating new tag names.
openseomcp_search_local_businesses#Searches local business listings near a coordinate, with optional rating, review-count, and claimed-status filters. Use this to find local business candidates, nearby competitors, or unclaimed listings; it does not run Maps rank checks or Q&A. Returns a compact row per business (identity, contact, rating, claim status); use get_business_profile for one business's full profile. Charges credits.10 params

Searches local business listings near a coordinate, with optional rating, review-count, and claimed-status filters. Use this to find local business candidates, nearby competitors, or unclaimed listings; it does not run Maps rank checks or Q&A. Returns a compact row per business (identity, contact, rating, claim status); use get_business_profile for one business's full profile. Charges credits.

NameTypeRequiredDescription
nearobjectrequiredCoordinate and radius to search around.
projectIdstringrequiredRequired. The OpenSEO project ID to scope this call to. Get one from list_projects.
categoriesarrayoptionalBusiness categories to filter by (e.g. 'pizza_restaurant').
isClaimedbooleanoptionalFilter by whether the listing is claimed by its owner. false surfaces unclaimed listings (outreach prospects).
limitintegeroptionalMaximum businesses to return (1-50). Defaults to 20.
minRatingnumberoptionalOnly return businesses rated at least this (1-5).
minReviewsintegeroptionalOnly return businesses with at least this many Google reviews.
offsetintegeroptionalRows to skip for pagination.
querystringoptionalBusiness name or title text to match.
sortBystringoptionalSort order for returned rows. Defaults to relevance.
openseomcp_update_project_context#Writes to a project's shared memory so the app, SAM, and other agents see it. Uses no credits. Send a list of patch ops; sections are prose (~4,000 chars max), competitors and key pages are curated shortlists (100 max each), and appendResearchLog records what research was bought so nobody re-buys it. Confirm facts with the user before storing them.2 params

Writes to a project's shared memory so the app, SAM, and other agents see it. Uses no credits. Send a list of patch ops; sections are prose (~4,000 chars max), competitors and key pages are curated shortlists (100 max each), and appendResearchLog records what research was bought so nobody re-buys it. Confirm facts with the user before storing them.

NameTypeRequiredDescription
projectIdstringrequiredRequired. The OpenSEO project ID to scope this call to. Get one from list_projects.
updatesarrayrequiredPatch ops, applied in order. Empty section content clears the section; adds upsert by domain/url; research-log entries are date-stamped by the server.
openseomcp_whoami#Confirms the connected OpenSEO account, server mode, token scopes, and current credit balance when the user asks to check their account or connection. Uses no credits — does not call DataForSEO.0 params

Confirms the connected OpenSEO account, server mode, token scopes, and current credit balance when the user asks to check their account or connection. Uses no credits — does not call DataForSEO.