Skip to content
Scalekit Docs
Talk to an Engineer Dashboard

Connect AI agents to the OpenSEO MCP server

Vendor MCP
Open markdown

The OpenSEO MCP connector routes your AI agent's tool calls to OpenSEO's own MCP server through Scalekit. Each user signs in to OpenSEO once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 46 tools.

Tools
46
What they doRead · write · destructive
21 · 22 · 321 read22 write3 destructive
Users sign in with
OAuth app
Scalekit's or your own

Setup

  1. Install the SDK

    Terminal window
    npm install @scalekit-sdk/node dotenv
  2. Set your credentials

    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. Create the OpenSEO MCP connection

    In AgentKit > Connections, create an OpenSEO MCP connection. The name you give it is the connection_name your code passes. See Configure connections.

    Scalekit credentials are available for OpenSEO MCP server, so you don't need to register an OAuth app.

  4. Authorize a user and make your first call

    quickstart.mts
    import { ScalekitClient } from '@scalekit-sdk/node'
    import 'dotenv/config'
    import { createInterface } from 'node:readline/promises'
    const scalekit = new ScalekitClient(
    process.env.SCALEKIT_ENVIRONMENT_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)
    const rl = createInterface({ input: process.stdin, output: process.stdout })
    await rl.question('Press Enter after authorizing...')
    rl.close()
    // Make your first call
    const result = await actions.executeTool({
    connector,
    identifier,
    toolName: 'openseomcp_whoami',
    toolInput: {},
    })
    console.log(result)
    Terminal window
    npx tsx quickstart.mts

    Each user signs in once. See Authorize a user for the full flow and statuses.

Tools

Pass the exact name to execute_tool
Try in PlaygroundRequest a tool
  • openseomcp_estimate_rank_tracker_costEstimate rank tracker cost without spending credits or starting a check.Read-only

    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.

    Inputs

    projectIdstringrequired
    Required. The OpenSEO project ID to scope this call to. Get one from list_projects.
    trackerIdstringrequired
    Rank tracker ID from get_rank_tracker.
    additionalKeywordCountinteger
    Number 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_get_audit_issuesRead the prioritized issue report from a completed site audit.Read-only

    Get site 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.

    Inputs

    projectIdstringrequired
    Required. 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.
    auditIdstring
    ID of the audit to read issues from. If omitted, uses the project's most recent audit. Example: audit_5f3a1b2c.
    issueTypestring
    Only 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.one of blocked-pagerate-limited-pagecrawl-rate-limitedserver-errorbroken-internal-linkmissing-titlebroken-pageduplicate-titleduplicate-meta-descriptionduplicate-contentmissing-meta-descriptionmissing-h1multiple-h1redirect-chainredirect-loopcanonical-conflictthin-contentimages-missing-altorphan-pageno-outgoing-linkstitle-too-longtitle-too-shortmeta-description-too-longmeta-description-too-shortheading-order-skipslow-responsenoindex-pagecanonicalized-pagedeep-page
    limitinteger
    Maximum number of issues to return, between 1 and 1000. Defaults to 200.default 200
    severitystring
    Only return issues at this severity level: critical, warning, or info. Leave blank to return issues of every severity.one of criticalwarninginfo
  • openseomcp_get_audit_pagesList crawled pages from a site audit with per-page SEO data (status, title, description, word count, indexability, crawl depth, link counts).Read-only

    Get site 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.

    Inputs

    projectIdstringrequired
    Required. 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.
    auditIdstring
    ID of the audit to list pages from. If omitted, uses the project's most recent audit. Example: audit_5f3a1b2c.
    fetchClassstring
    Filter 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.one of okblockedrate_limitederror
    limitinteger
    Maximum number of pages to return, between 1 and 1000. Defaults to 100.default 100
    statusCodeinteger
    Filter to pages that returned exactly this HTTP status code. Example: 404.
    urlContainsstring
    Filter to page URLs containing this substring (case-sensitive). Example: /blog/.
  • openseomcp_get_google_analytics_audience_breakdownRead device, country, or new-versus-returning users, sessions, engagement, and key events.Read-only

    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.

    Inputs

    projectIdstringrequired
    Required. 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.
    breakdownstring
    How 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.one of devicecountrynew_vs_returningdefault device
    channelstring
    Which acquisition channel to scope the audience data to: organic_search (default) or all channels.one of organic_searchalldefault organic_search
    comparePreviousPeriodboolean
    When 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.default false
    endDatestring
    Inclusive end date of the reporting window, formatted as YYYY-MM-DD. Must be provided together with startDate. Example: 2026-08-31.
    limitinteger
    Maximum number of rows to return, between 1 and 1000. Defaults to 100.default 100
    offsetinteger
    Number of rows to skip before the first row returned, for paging through results beyond limit. Defaults to 0.default 0
    startDatestring
    Inclusive 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_performanceRead item views, add-to-cart units, purchases, and item revenue by item, or transactions and purchase revenue by landing page.Read-only

    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.

    Inputs

    projectIdstringrequired
    Required. 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.
    breakdownstring
    How 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.one of itemlanding_pagedefault item
    channelstring
    Which acquisition channel to scope the ecommerce data to: organic_search (default) or all channels.one of organic_searchalldefault organic_search
    endDatestring
    Inclusive end date of the reporting window, formatted as YYYY-MM-DD. Must be provided together with startDate. Example: 2026-08-31.
    limitinteger
    Maximum number of rows to return, between 1 and 1000. Defaults to 100.default 100
    offsetinteger
    Number of rows to skip before the first row returned, for paging through results beyond limit. Defaults to 0.default 0
    onlyWithTransactionsboolean
    When true and Breakdown is landing_page, limits results to landing pages that recorded at least one transaction. Defaults to false.default false
    startDatestring
    Inclusive 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_eventsRead active GA4 key events with counts and users by event or organic landing page.Read-only

    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.

    Inputs

    projectIdstringrequired
    Required. The OpenSEO project ID to scope this call to. Get one from list_projects.
    breakdownstring
    How to group key-event rows. Defaults to event.one of eventevent_and_landing_pagedefault event
    channelstring
    Traffic channel to filter to. Defaults to organic_search.one of organic_searchalldefault organic_search
    comparePreviousPeriodboolean
    Include a comparison against the immediately preceding period of equal length. Only applies to the event breakdown. Defaults to false.default false
    endDatestring
    Inclusive YYYY-MM-DD date. Provide both startDate and endDate.
    limitinteger
    Maximum number of key-event rows to return. Defaults to 100.default 100
    offsetinteger
    Number of rows to skip, for pagination. Defaults to 0.default 0
    startDatestring
    Inclusive YYYY-MM-DD date. Provide both startDate and endDate.
  • openseomcp_get_google_analytics_measurement_healthDiagnose the connected property's data streams, web measurement IDs, enhanced-measurement settings, key events, and custom definitions.Read-only

    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.

    Inputs

    projectIdstringrequired
    Required. 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_pagesRead organic-search landing page sessions, engagement, key events, transactions, and revenue from the project's connected GA4 property.Read-only

    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.

    Inputs

    projectIdstringrequired
    Required. The OpenSEO project ID to scope this call to. Get one from list_projects.
    endDatestring
    Inclusive YYYY-MM-DD date. Provide both startDate and endDate.
    limitinteger
    Maximum number of landing-page rows to return. Defaults to 100.default 100
    offsetinteger
    Number of rows to skip, for pagination. Defaults to 0.default 0
    startDatestring
    Inclusive YYYY-MM-DD date. Provide both startDate and endDate.