Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

MisarSEO MCP Server

REMOTE · API.MISAR.IO · 2 COMPONENTS

Research keywords, track rankings, audit sites, monitor backlinks and AI-search visibility — from…

+3 this week 85 Trust /100

Last scanned (3 hours ago)

Scores higher than 91% of remote servers

Reachable. Last reached 5 Nov 2026.

Category Marketing and SEO

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →

Endpoint Security89
Transport & Reachability100
Schema Quality & AI Usability79
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 36453 tokens (~199/item across 183 items; 180 tools + 3 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management63
  • Stability observed for 19 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage99
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 96% of tool parameters carry a description.Partial
Tool Safety99
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • 22 of 23 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "list_patch_auto_publish_rules" implies "publish" and declares readOnlyHint instead, contradicting what its own name says it does. See how to fix → Partial
  • An AI judge read all 181 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities60
  • Spec-recency check failed: implements MCP spec 2025-06-18; the latest is 2026-07-28. See how to fix → Fail
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 5 Nov 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 60 to 63. That category is still filling its 30-day observation window: 18 days of observed history at the previous scan, 19 at this one. The score rises as the window fills, whether or not the server changes.

  • 2 Nov 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 50 to 53. That category is still filling its 30-day observation window: 15 days of observed history at the previous scan, 16 at this one. The score rises as the window fills, whether or not the server changes.

  • 31 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 43 to 47. That category is still filling its 30-day observation window: 13 days of observed history at the previous scan, 14 at this one. The score rises as the window fills, whether or not the server changes.

  • 29 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 37 to 40. That category is still filling its 30-day observation window: 11 days of observed history at the previous scan, 12 at this one. The score rises as the window fills, whether or not the server changes.

  • 27 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 30 to 33. That category is still filling its 30-day observation window: 9 days of observed history at the previous scan, 10 at this one. The score rises as the window fills, whether or not the server changes.

  • 25 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 23 to 27. That category is still filling its 30-day observation window: 7 days of observed history at the previous scan, 8 at this one. The score rises as the window fills, whether or not the server changes.

  • 23 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 17 to 20. That category is still filling its 30-day observation window: 5 days of observed history at the previous scan, 6 at this one. The score rises as the window fills, whether or not the server changes.

  • 21 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 10 to 13. That category is still filling its 30-day observation window: 3 days of observed history at the previous scan, 4 at this one. The score rises as the window fills, whether or not the server changes.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 5 Nov 2026 · Probed https://api.misar.io/seo/mcp

TLS valid

Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .

Subject Issuer Valid from Valid until Key Signature Serial
CN=misar.io CN=WE1,O=Google Trust Services,C=US 28 Sept 2026 27 Dec 2026 ECDSA 256 ECDSA-SHA256 88a9d3888ba6d1ff0e0a186c4817562d
SANs: misar.io, *.misar.io
CN=WE1,O=Google Trust Services,C=US (CA) CN=GTS Root R4,O=Google Trust Services LLC,C=US 13 Dec 2023 20 Feb 2029 ECDSA 256 ECDSA-SHA384 7ff31977972c224a76155d13b6d685e3
CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE 15 Nov 2023 28 Jan 2028 ECDSA 384 SHA256-RSA 7fe530bf331343bedd821610493d8a1b

Background: What to check on a remote MCP endpoint →

DNSSEC insecure

Validation of api.misar.io. — Not signed

Zone DS Keys Algorithms Outcome
. trust_anchor 20326, 38696 8, 8 Verified
io. present 38690 8 Verified
misar.io. absent Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation
Authentication Challenged, unverified

The endpoint asked for a token, but we could not retrieve and validate the RFC 9728 metadata that tells a client how to obtain one.

Result Challenged, unverified
Enforced On tool calls
HTTP status 200

WWW-Authenticate challenge Bearer realm="MisarSEO", error_description="Send a MisarSEO API key as Authorization: Bearer mseo_... Create one as described at https://seo.misar.io/ai"

Bearer realm="MisarSEO", error_description="Send a MisarSEO API key as Authorization: Bearer mseo_... Create one as described at https://seo.misar.io/ai"
Header Value
strict-transport-security max-age=63072000; includeSubDomains; preload
content-security-policy default-src 'self'; script-src 'self' 'unsafe-inline' https://challenges.cloudflare.com; frame-src https://challenges.cloudflare.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self' data:; connect-src 'self' https://api.misar.io https://id.misar.io https://ph.misar.io https://*.ingest.us.sentry.io https://challenges.cloudflare.com; object-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'none'
x-content-type-options nosniff
x-frame-options DENY
referrer-policy strict-origin-when-cross-origin
permissions-policy camera=(), microphone=(), geolocation=(), interest-cohort=()

Protected resource metadata

Retrieved No
Problem no_resource_metadata

Background: How OAuth 2.1 works in the 2026 MCP spec →

Transports 2 probes
Transport URL Outcome Status Location
streamable-http https://api.misar.io/seo/mcp Verified 200
http (plaintext) http://api.misar.io/seo/mcp HTTPS enforced 301 https://api.misar.io/seo/mcp
MCP tools · 180 exposed · ~36,320 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
get_bing_site_overview ~235

Bing's own view of a project's domain: daily search performance (clicks/impressions), per-query stats, own-site inbound links, remaining URL Submission quota, crawl diagnostics (crawl stats, crawl issues, crawl settings), submitted feeds and query-parameter settings — read straight from the Bing Webmaster API. FREE (no credits). Bring-your-own-key: requires the deployment operator to set BING_WEBMASTER_API_KEY (one key covers every site verified on that Bing account — no per-project connect step). Answers { ok: false, reason: 'not_configured' } when unset, or 'no_matching_site' when the project's domain has no verified match on the account. Backlinks here are OWN-SITE ONLY — Bing exposes no competitor/any-domain backlink lookup, so this does not substitute for general backlink research. Per-URL lookups and keyword research have their own tools: get_bing_url_links, get_bing_url_info, get_bing_keyword_research.

NameTypeReqDescription
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.

No output schema declared.

No examples provided.

get_bing_url_info ~200

GetUrlInfo + optionally GetChildrenUrlInfo: index/crawl metadata (anchor count, discovery/last-crawled dates, HTTP status, whether Bing considers it a page) for one URL on a project's matched Bing site, and, when includeChildren is set, the same metadata for every URL Bing discovered under it. FREE (no credits). Bring-your-own-key: requires BING_WEBMASTER_API_KEY. Answers { ok: false, reason: 'not_configured' } when unset, or 'no_matching_site' when the project's domain has no verified match on the account.

NameTypeReqDescription
includeChildrenboolean–Also fetch the index/crawl metadata for URLs discovered under this one (one page of Bing's own pagination). Default false.
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.
urlstringyesThe URL to look up.

No output schema declared.

No examples provided.

get_bing_url_links ~190

GetUrlLinks: the inbound links (anchor text + source URL) pointing at one specific page on a project's matched Bing site, read straight from the Bing Webmaster API. FREE (no credits). Own-site only — Bing exposes no competitor/any-domain backlink lookup, and some verified sites are known to return an empty result here even when populated. Bring-your-own-key: requires BING_WEBMASTER_API_KEY. Answers { ok: false, reason: 'not_configured' } when unset, or 'no_matching_site' when the project's domain has no verified match on the account.

NameTypeReqDescription
pageinteger–0-based page of Bing's own pagination (default 0).
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.
urlstringyesThe specific page to find inbound links for.

No output schema declared.

No examples provided.

get_brand_radar_scan_status ~195

Status of a Brand Radar scan started by run_brand_radar_scan, by its `jobId`. `status` is queued/running/complete/errored; a complete scan carries the shaped `result` (share of voice, top cited pages, top prompts), an errored one carries `error.message`. FREE to poll: a completed scan re-reads the cached result and charges nothing. The one exception is a scan whose cached result has already expired (older than ~24h) — answering that re-runs the lookup and is charged and rate limited like a new scan, so collect results promptly. Use this instead of re-running run_brand_radar_scan, which always spends another monthly scan.

NameTypeReqDescription
jobIdstringyesThe `jobId` returned by run_brand_radar_scan.
projectIdstringyesRequired. The MisarSEO project ID the scan was run for.

No output schema declared.

No examples provided.

get_brand_scan_trend ~158

The recorded AI-visibility history for one brand or domain: mentions, cited sources and competitors seen at each past Brand Radar scan, oldest first. Answers whether visibility in AI answers is moving, which a single run_brand_radar_scan cannot. Returns only scans that actually ran — empty for a target never scanned, filling in as scans run, with nothing interpolated or back-filled. FREE — reads recorded scans, charges no credits.

NameTypeReqDescription
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.
sincestring–Inclusive lower bound, YYYY-MM-DD.
targetstringyesBrand or domain, matched case-insensitively against past scans.

No output schema declared.

No examples provided.

get_brave_search_rank_check ~395

Checks where a project's domain (or an explicit targetDomain) ranks in REAL Brave Search results for one keyword. Brave has run its own independent crawler and index since 2023 — a genuinely separate, separately-licensed data source, distinct from this server's free SearXNG/openserp-backed rank checks. Every successful response carries engine: 'brave_search' so it can never be mistaken for a free-tier number. PAID: bring-your-own-key — requires the deployment operator to set BRAVE_SEARCH_API_KEY (a single paid credential, like OPENPAGERANK_API_KEY — no OAuth flow). Every call spends that key's Brave Search API budget. Answers { ok: false, reason: 'not_configured' } when unset, or 'no_domain' when neither targetDomain nor the project's own domain is set. Makes exactly one Brave Search API call per check — depth (max 20) is Brave's own per-request ceiling, never paginated to search deeper. Brave publishes no submission/indexing API at all, only manual re-fetch/delist web forms — this tool is query-only.

NameTypeReqDescription
competitorDomainsarray–Competitor domains to also resolve positions for, free within the same fetched result set.
countrystring–2-letter country code Brave uses to target results, e.g. 'US'.
depthinteger–Results to fetch, 1-20 (Brave's own per-request ceiling). Default 20.
keywordstringyesKeyword to check.
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.
searchLangstring–ISO 639-1 language code Brave uses to filter results, e.g. 'en'.
targetDomainstring–Domain or URL to check. Defaults to the project's own domain when omitted.

No output schema declared.

No examples provided.

get_cannibalisation_report ~514

Finds the queries where the project's connected Search Console property competes with itself: two or more of its own pages drawing impressions for the same query, splitting that query's clicks, click signals and ranking history across URLs. Read-only and FREE (no credits) — Search Console is first-party data and meters nothing. It does spend Google's per-property request quota, so it is rate limited per user. Requires Search Console to be connected for the project. Returns exactly ONE of four states, which are four different facts — branch on `state` before reading anything else: `not_connected` (nothing is bound; tell the user to connect a property), `requires_reconnect` (bound but the Google grant is revoked/expired; tell the user to reconnect), `no_search_data` (Search Console returned nothing for the window — an absence of data, NOT a clean bill of health), `analysed` (we looked; `findings` may legitimately be empty and `coverage` is the proof, including `truncated` when the property had more rows than one report can fetch). In each of the first three states nothing was measured at all, so never report any of them as 'no cannibalisation found'. Every per-page figure is Search Console's own for that (query, page) pair — ctr is a 0-1 fraction, position is a 1-based average, dates are Pacific Time and the last ~3 days are excluded for data lag. `thresholds` ships with each analysed report so you can say whether a threshold, rather than the absence of a problem, is why a query is missing.

NameTypeReqDescription
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.
sortstring–Finding order (default impressions). 'impressions' = most affected search demand first. 'position_spread' = smallest gap between the competing pages' average positions first, i.e. the pages Google ra…
windowstring–Analysis window (default last_28_days). Capped at three months on purpose — Search Console's longer ranges are NOT offered, because over a long window 'two pages received impressions' also describes…

No output schema declared.

No examples provided.

get_competitor_monitor_changes ~162

Timeline of DETECTED changes for one monitored competitor URL, newest first — a check that found nothing does not appear here. Each entry's summary is a real diff: line-level content added/removed/unchanged counts with a short sample (never a fabricated similarity score), plus title/meta/status-code before-after values and added/removed external links and structured-data types.

NameTypeReqDescription
limitinteger–Max entries to return. Defaults to 50, capped at 200.
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.
targetIdstringyesMonitored URL's target ID, from list_competitor_monitors or add_competitor_monitor.

No output schema declared.

No examples provided.

get_content_decay_report ~475

Finds pages whose clicks declined by a meaningful amount between two adjacent windows, read entirely from MisarSEO's own archived Search Console history (the top-200-per-day per-page archive the nightly sync fills in). Read-only and FREE (no credits), and makes NO live Search Console call — unlike get_cannibalisation_report, this spends no Google quota, so it is rate limited only against ordinary abuse. Requires Search Console to be connected for the project. Returns exactly ONE of three states, which are three different facts — branch on `state` before reading anything else: `not_connected` (nothing is bound; tell the user to connect a property), `insufficient_history` (bound, but one of the two comparison windows has no archived rows at all — an absence of data, NOT a clean bill of health), `analysed` (we looked; `findings` may legitimately be empty and `coverage` is the proof). In both of the first two states nothing was measured, so never report either as 'no content decay found'. `window` selects the RECENT period length; the EARLIER period compared against it is the same length immediately before it, not a calendar-month split. `minEarlierClicks` (default 10) and `declineThresholdPct` (default 20) are this codebase's own chosen defaults, not a published vendor formula. A page that fell out of the archive's top-200-per-day entirely reports `recentClicks: 0` — correctly the most severe decay, not a data hole.

NameTypeReqDescription
declineThresholdPctinteger–How big a decline (percent) is required to be reported (default 20). 0 disables reporting entirely.
minEarlierClicksinteger–A page must have had at least this many clicks in the earlier window to be considered at all (default 10) — a noise floor, not part of the decay definition.
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.
windowstring–The RECENT period length (default last_28_days). The EARLIER period compared against it is the same length immediately before it — a period-over-period comparison, not a calendar-month split.

No output schema declared.

No examples provided.

get_content_optimizer_report ~344

On-page recommendations and an AI content grade for one page, benchmarked against the pages currently ranking for its target keyword, built together — one AI-gateway call produces both the grade and the recommendations). CHARGES ONE AI-gateway operation against the organization's shared monthly ceiling — not a plan-quota dimension of its own. The page crawl (target + up to 5 competitors) and the SERP fetch are both free. `url` does not have to belong to the project's own domain or to a page a site audit has crawled — any http(s) URL is graded fresh. ALWAYS narrow on `state` first: `target_unreachable` means the target page itself could not be fetched — an ordinary outcome, never treat it as 'this page scored zero'. `analysed` carries the full report; check `coverage.serpUnavailable` and `competitorsCrawled` before trusting the competitor comparison. `grade` is an AI-generated qualitative read of the measured signals, NOT a calibrated industry score. Does NOT detect AI-written content — that is not built; no reliable free technique exists for it.

NameTypeReqDescription
keywordstringyesThe keyword this page is meant to rank for.
languageCodestring–Language code. Defaults to the project's stored market, else 'en'.
locationCodeinteger–Numeric location code. Defaults to the project's stored market, else 2840 (United States).
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.
urlstringyesThe page to grade (any http(s) URL).

No output schema declared.

No examples provided.

get_content_page_metrics ~191

Lightweight on-page metrics for one arbitrary URL — the content optimizer's keyword-free, AI-free sibling. Built for ambient per-page checks (e.g. the browser extension's on-page panel checking whatever page the user is currently viewing) with none of `get_content_optimizer_report`'s cost: no keyword required, no AI-gateway charge, no competitor crawl or SERP fetch. `url` does not have to belong to the project's own domain — any http(s) URL is analyzed fresh. ALWAYS narrow on `state` first: `unreachable` means the page itself could not be fetched — an ordinary outcome for an arbitrary URL check, never treat it as an error.

NameTypeReqDescription
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.
urlstringyesThe page to analyze (any http(s) URL).

No output schema declared.

No examples provided.

get_dashboard ~143

One card per active project in the caller's organization: latest audit health, rank-tracker status, and trailing-7-day web-analytics sessions. FREE: database only. No SEO data provider is called and no credits are spent — GSC and backlinks are deliberately excluded from this view rather than fetched live, so calling this never spends a Search Console quota unit or a paid-provider credit. `audit`/`rankTracking`/`webAnalytics` are null on a card whose project has none of that data yet (never audited, no tracker configured, no analytics traffic) — a real 'not set up' fact, not a zero standing in for missing data.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

get_direct_vendor_answers ~322

Runs a prompt against up to 5 REAL, directly-verified vendor models — you_com (You.com Answer API), deepseek, grok (xAI), meta_ai (Meta's Model API) and minimax — each called through that vendor's own public API. Unlike explore_ai_prompt's persona labels, every result here reports the real vendor model id in `modelName`. A model whose API key is not configured on this deployment answers `status: "unavailable"` with no call made — a deployment fact, not an error; `status: "error"` means the vendor is configured but the call failed. `webSearch` is best-effort per vendor: You.com is always grounded, grok honours it, and deepseek, meta_ai and minimax always answer `webSearch: false`. meta_ai is a US-developers-only public preview, so an ineligible account reports an error naming that. Billed on the operator's own vendor keys: no plan gate and no MisarSEO credits are spent.

NameTypeReqDescription
highlightBrandstring–A brand/entity name to highlight mentions of in each answer.
modelsarrayyes1-5 vendor models to ask.
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.
promptstringyesThe prompt to send to each requested vendor model.
webSearchboolean–Ask for grounded answers where the vendor supports it (see the tool description). Defaults to false.

No output schema declared.

No examples provided.

get_domain_authority_history ~138

Domain-authority history: the stored trend of dated authority snapshots for one project+domain, oldest first. FREE (no credits) — reads back snapshots already captured, no provider call. Empty until at least one snapshot exists: get_domain_overview auto-captures one whenever `domain` is the project's own domain, or call capture_domain_authority_snapshot directly for any domain (including a tracked competitor).

NameTypeReqDescription
domainstringyesDomain to read history for (e.g. 'example.com').
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.

No output schema declared.

No examples provided.

get_domain_batch ~295

Domain batch analysis: one authority row per domain, up to 100 at once. FREE — no paid provider call, unlike get_domain_overview. `organicTraffic`, `organicKeywords`, `backlinks` and `referringDomains` are ALWAYS null on every row — batch mode never attempts the per-domain paid rank-overview call the single-domain overview makes, since fanning that out across many domains in one call is a materially bigger paid-provider commitment than anything else this codebase does in one request. `organicUnavailableReason` states this once for the whole response; use get_domain_overview for organic figures on one domain at a time. Malformed domain entries are dropped and counted in `skippedInvalid` rather than failing the whole call. `authorityUnavailableReason` is set only when the authority provider itself failed to answer — null authority on every row without it set means every domain was looked up and found unranked, not that nothing could be looked up.

NameTypeReqDescription
domainsarrayyes1-100 domains or URLs, any mix. Malformed entries are dropped, not rejected — see skippedInvalid in the result.
includeSubdomainsboolean–Count subdomains as part of each domain. Defaults to false, unlike get_domain_overview's default true.
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.

No output schema declared.

No examples provided.

get_domain_overview ~464

Returns a high-level view of a domain's organic footprint: estimated organic traffic, organic keyword count, and a 0-100 domain authority score. Use this first for domain research. `backlinks` and `referringDomains` are ALWAYS null on this tool — no data provider feeds them here, so a null is the absence of a source, not a domain with no links. Call get_backlinks_overview for those. CHARGES CREDITS ON THE PAID DATA PROVIDER (~100-300 typical) for the organic traffic/keyword figures. On the default free provider that endpoint has no equivalent, so `organicTraffic` and `organicKeywords` come back null, nothing is charged, and only the authority score is populated. Null there means not measured — never report it as zero traffic. Read `authoritySource` before quoting `authority`: 'openpagerank' is link-graph authority, 'tranco' is a POPULARITY rank used as a stand-in and must be labelled as such; a domain outside Tranco's top million honestly returns null. A result carrying data is cached 12 hours per domain; a result with neither organic keywords nor an authority score is deliberately not cached, so retrying it re-runs the lookup.

NameTypeReqDescription
domainstringyesDomain to analyze (e.g. 'example.com').
includeSubdomainsboolean–Include subdomains in the domain's metrics. Defaults to false.
languageCodestring–Language code (e.g. 'en', 'es', 'fr'). Omit it to use the project's default market language, which falls back to 'en'.
locationCodeinteger–DataForSEO location code. Omit it to use the project's default market, which falls back to 2840 (United States) for a project that has not set one. See dataforseo.com/help-center/locations. Some coun…
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.

No output schema declared.

No examples provided.

get_ga4_channel_breakdown ~144

MisarSEO's own retained daily GA4 channel breakdown (sessionDefaultChannelGroup) for the connected property — isolating Organic Search from every other acquisition channel, the SEO-relevant signal GA4 adds beyond Search Console's own click/impression data. Read-only and FREE (no credits), archive-only — same sync/quota story as get_ga4_performance_summary.

NameTypeReqDescription
endDatestringyesYYYY-MM-DD, required, not before startDate.
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.
startDatestringyesYYYY-MM-DD, required.

No output schema declared.

No examples provided.

get_ga4_landing_pages ~162

MisarSEO's own retained daily GA4 landing-page breakdown for the connected property: sessions/engagement/conversions per landing page, ordered by sessions descending within each day. Read-only and FREE (no credits), archive-only — same sync/quota story as get_ga4_performance_summary.

NameTypeReqDescription
endDatestringyesYYYY-MM-DD, required, not before startDate.
limitinteger–Rows to return, 1-1000 (default 1000). Landing-page cardinality is unbounded for a large site.
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.
startDatestringyesYYYY-MM-DD, required.

No output schema declared.

No examples provided.

get_ga4_performance_summary ~151

MisarSEO's own retained daily Google Analytics totals for the connected property: sessions, activeUsers, newUsers, engagementRate, bounceRate, conversions, screenPageViews. Read-only and FREE (no credits) — makes NO call to Google, reads only what the nightly sync (04:25 UTC) has archived. A property with no completed sync yet simply has no rows, not stale data.

NameTypeReqDescription
endDatestringyesYYYY-MM-DD, required, not before startDate.
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.
startDatestringyesYYYY-MM-DD, required.

No output schema declared.

No examples provided.

get_gbp_connection ~64

The project's currently linked Google Business Profile location, or `{ connection: null }` when none is linked yet. FREE: database only.

NameTypeReqDescription
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.

No output schema declared.

No examples provided.

get_gbp_optimization ~111

Completeness/quality score and AI-grounded optimization recommendations for the project's linked Google Business Profile location. The `score` (0-100) is a DETERMINISTIC heuristic checklist over real measured facts — not AI-generated. Only `recommendations` comes from the model. CHARGES ONE AI-GATEWAY OPERATION against the organization's shared monthly ceiling.

NameTypeReqDescription
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.

No output schema declared.

No examples provided.

get_gbp_performance ~181

Read-only Business Profile Performance API metrics for the project's linked location over an inclusive date range. `metrics` must be real DailyMetric values: BUSINESS_IMPRESSIONS_DESKTOP_MAPS, BUSINESS_IMPRESSIONS_DESKTOP_SEARCH, BUSINESS_IMPRESSIONS_MOBILE_MAPS, BUSINESS_IMPRESSIONS_MOBILE_SEARCH, BUSINESS_CONVERSATIONS, BUSINESS_DIRECTION_REQUESTS, CALL_CLICKS, WEBSITE_CLICKS, BUSINESS_BOOKINGS, BUSINESS_FOOD_ORDERS, BUSINESS_FOOD_MENU_CLICKS.

NameTypeReqDescription
endDatestringyesInclusive end date, YYYY-MM-DD.
metricsarrayyesWhich daily metrics to fetch.
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.
startDatestringyesInclusive start date, YYYY-MM-DD.

No output schema declared.

No examples provided.

get_gbp_profile ~109

Read-only Google Business Profile listing profile for the project's linked location: title, categories, phone, website, description, hours-period count, and which of Google's attribute taxonomy entries are set. Fetched LIVE from Google on every call. Returns NOT_FOUND if no location is linked yet — link one with set_gbp_connection (list_gbp_locations has the ids).

NameTypeReqDescription
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.

No output schema declared.

No examples provided.

get_gbp_reviews ~67

Read-only reviews for the project's linked Google Business Profile location, one Google-paginated page at a time.

NameTypeReqDescription
pageTokenstring––
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.

No output schema declared.

No examples provided.

get_google_business_questions ~377

Fetches question-and-answer rows for one business keyword. Run this only when Q&A evidence is needed. THE TWO PROVIDERS RETURN DIFFERENT THINGS AND YOU MUST SAY WHICH YOU HAVE. On the paid data provider these are real Google Business Profile questions and answers for a profile near `near`, and it CHARGES CREDITS. On the default free provider they are Google/Bing autocomplete completions reframed as questions — real search phrasings, but NOT anybody's Business Profile Q&A, with no answers and no asker — and NOTHING IS CHARGED. Never attribute a free-provider row to a business or quote it as a customer's question. `near` IS IGNORED ON THE FREE PROVIDER: the suggest APIs take no geography, so the same keyword returns the same rows from any coordinate. It is required because the paid provider needs it, not because the result is always localised. On the paid provider `radiusKm` is converted to metres and clamped into 200 m - 199,999 m, so a radius above about 200 km is silently reduced to that ceiling. An empty result means no Q&A was found for this phrasing; whether the business has questions elsewhere was not measured.

NameTypeReqDescription
depthinteger–Maximum Q&A rows to fetch (1-100). Defaults to 20.
keywordstringyesBusiness name or search phrase identifying the Google Business Profile.
languageCodestring–Language code (e.g. 'en', 'es', 'fr'). Omit it to use the project's default market language, which falls back to 'en'.
nearobjectyesCoordinate and radius to search around.
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.

No output schema declared.

No examples provided.

get_gsc_anonymous_queries ~320

Anonymized-query estimate: Search Console omits some rare queries entirely from a query-dimensioned response to protect searcher privacy (Google's own documented behaviour, not this codebase's assumption). This compares the SUM of named per-query clicks/impressions against the property's TRUE undimensioned total for the same window — the gap is a real, derived anonymized-query volume. Charges no credits but spends TWO Search Console requests of Google's per-property quota per call. ALWAYS narrow on `state` first: `not_connected`, `requires_reconnect` (the bound property's Google grant can no longer be used), `no_search_data` (Search Console returned nothing for the window — an absence of data, NOT zero anonymization), `analysed`. On `analysed`, ALWAYS check `possiblyRowCapped`: when true, part of the gap is queries the 1,000-row named-query fetch did not reach, not privacy anonymization — the estimate then overstates true anonymization.

NameTypeReqDescription
dateRangestring–Convenience window (default 'last_28_days'). This DOES call Google, so Search Console's usual ~16-month clamp and ~3-day data lag both apply.
endDatestring–Explicit end date (YYYY-MM-DD). Use with startDate.
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.
startDatestring–Explicit start date (YYYY-MM-DD). Use with endDate.

No output schema declared.

No examples provided.

get_gsc_ctr_by_position ~309

CTR by ranking position: the site's own historical Search Console clicks/impressions bucketed by position (1-3, 4-10, 11-20, 21+ — mirroring this codebase's existing rank-tracking position-distribution buckets), with the REAL clicks-weighted CTR this project achieved at each bucket. NEVER a fabricated industry-average CTR curve (the generic 'position 1 gets X% CTR' tables third-party vendors publish) — every figure is computed from this project's own archived Search Console history. Free and makes NO live Google call: reads only the archive `get_content_decay_report` also reads. ALWAYS narrow on `state` first: `not_connected` (connect a property), `no_data` (a property is bound but the archive has no rows at all for this dimension/window — an absence of data, NOT zero traffic), `analysed`.

NameTypeReqDescription
dateRangestring–Convenience window over MisarSEO's own archive (default 'last_28_days'). No Google clamp applies — this never calls Google.
dimensionstring–Bucket by query or page position (default 'query').
endDatestring–Explicit end date (YYYY-MM-DD). Use with startDate.
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.
startDatestring–Explicit start date (YYYY-MM-DD). Use with endDate.

No output schema declared.

No examples provided.

get_keyword_gap ~682

Compares the project's own domain against up to 3 competitor domains and classifies every keyword a competitor ranks for as missing / behind / tied / ahead / unknown. The inverse of find_serp_competitors, which asks who competes for a keyword set. CHARGES CREDITS: one ranked-keywords lookup per domain, so one call costs up to 4 upstream requests (our domain plus the competitors). Each lookup is cached 12h per domain, so re-running the same comparison with a different sort or classification filter is free — do that rather than issuing a new comparison. Compares the top 1000 keywords per domain by search volume, so a large domain is compared on a slice; per-domain `coverage` reports `keywordsFetched`, `keywordsTotal`, `truncated` and `volumeFloor`. `missing` and `unknown` are NOT interchangeable: `missing` means a competitor ranks and we provably do not; `unknown` means our own slice ran out above that keyword's volume, so nothing was measured about whether we rank. Never present `unknown` as a gap. The project's own domain is read from the project record and cannot be passed in — if the project has no domain the call fails with a validation error telling the user to set one. When `unavailable` is true, no configured data provider has a ranked-keyword source and no comparison happened; the empty `rows` in that case does NOT mean the competitors rank for nothing. At most 200 rows are returned; `totalRows` is the real match count.

NameTypeReqDescription
classificationsarray–Restrict rows to these classifications. Omit for all five — omitting never hides `unknown`. The filter is applied before the row cap, and `totalRows` reports the pre-cap match count.
competitorDomainsarrayyes1–3 competitor domains (bare domain or full URL). Each one is a separate billable ranked-keywords lookup, so pick the rivals actually being chased. The project's own domain is added automatically and…
includeSubdomainsboolean–Count subdomains as part of a domain. Defaults to true, and applies to every compared domain including ours.
languageCodestring–Language code (e.g. 'en', 'es', 'fr'). Omit it to use the project's default market language, which falls back to 'en'.
locationCodeinteger–DataForSEO location code. Omit it to use the project's default market, which falls back to 2840 (United States) for a project that has not set one. See dataforseo.com/help-center/locations. Some coun…
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.
sortFieldstring–Sort column: 'volume' (default), 'theirPosition' or 'ourPosition'. All three are measured values — there is deliberately no composite opportunity score. Nulls sort last in both directions.
sortOrderstring–Sort direction. Defaults to 'desc'.

No output schema declared.

No examples provided.

get_keyword_list_share_of_voice ~429

Share of Voice across a saved keyword list: the project's own domain plus up to 3 competitor domains, scored over a saved-keyword tag ("a saved keyword list" in this codebase IS a saved-keyword tag — omit tagId/tagName to mean every saved keyword in the project). Reuses the EXACT Share of Voice computation rank tracking's own Share of Voice already uses (CTR-weighted visibility, a comparative index — never a click forecast). BILLABLE-ADJACENT: one live SERP fetch per keyword in the resolved list, up to a bounded per-run cap (see `truncated`) — a saved list carries no stored positions the way a rank-tracking config does. The project's own domain is read from the project row, never accepted as a parameter. `keywordsFailed` keywords (a SERP fetch that errored) are excluded from the computation, never counted as "ranks nowhere".

NameTypeReqDescription
competitorDomainsarray–0-3 competitor domains (bare domain or full URL).
languageCodestring–Language code (e.g. 'en', 'es', 'fr'). Omit it to use the project's default market language, which falls back to 'en'.
locationCodeinteger–DataForSEO location code. Omit it to use the project's default market, which falls back to 2840 (United States) for a project that has not set one. See dataforseo.com/help-center/locations. Some coun…
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.
tagIdstring–The saved-keyword tag ID to treat as 'the list'. Omit with tagName to mean every saved keyword in the project.
tagNamestring–Alternative to tagId — the tag's name.

No output schema declared.

No examples provided.

get_keyword_potential ~384

Parent Topic and Traffic Potential for one keyword, built from real SERP overlap across a BOUNDED set (up to 5) of related keywords — not a full keyword-to-URL reverse index, which this codebase's free stack does not have. Parent Topic is the related keyword whose SERP shares the most top-10 organic URLs with the seed's. Traffic Potential is the seed's own volume plus the volume of every candidate whose own #1-ranking URL is the exact same page as the seed's — a bounded floor, never the true total traffic across every keyword that page ranks for. FREE — no paid provider or plan gate. Up to 7 upstream calls per cache miss, each independently cached (30 days for the combined result), so look keywords up one at a time. `parentTopic`/`trafficPotential` are null, not zero, when the bounded sample carries no qualifying evidence. A keyword whose SERP has no organic result throws SEO_DATA_UNAVAILABLE rather than returning zeros.

NameTypeReqDescription
keywordstringyesThe keyword to analyze.
languageCodestring–Language code (e.g. 'en', 'es', 'fr'). Omit it to use the project's default market language, which falls back to 'en'.
locationCodeinteger–DataForSEO location code. Omit it to use the project's default market, which falls back to 2840 (United States) for a project that has not set one. See dataforseo.com/help-center/locations. Some coun…
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.

No output schema declared.

No examples provided.

get_keyword_serp_overview ~365

Per-keyword SERP overview: a fresh live SERP snapshot for the keyword, PLUS — when this exact keyword happens to already be tracked in this project's rank tracking — its historical position trend and SERP volatility, read straight from the SAME rank-tracking services (`get_rank_keyword_history`/`get_rank_volatility_index`) already use. `tracked.isTracked: false` means this keyword is not currently tracked in any of the project's active rank-tracking configs — an honest absence, never a fabricated trend. One upstream call (the live SERP fetch, cached 12h); the rank-tracking portion is DB-only reads. `sinceDays` only affects `tracked.history` and is ignored when the keyword is not tracked.

NameTypeReqDescription
keywordstringyesThe keyword to look up.
languageCodestring–Language code (e.g. 'en', 'es', 'fr'). Omit it to use the project's default market language, which falls back to 'en'.
locationCodeinteger–DataForSEO location code. Omit it to use the project's default market, which falls back to 2840 (United States) for a project that has not set one. See dataforseo.com/help-center/locations. Some coun…
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.
sinceDaysinteger–How many days of tracked history to return, 1-730 (default 365). Only meaningful when the keyword is tracked.

No output schema declared.

No examples provided.

get_keyword_strategy ~403

Keyword Strategy Builder: a volume -> cluster -> page -> brief pipeline over 1-500 pasted keywords, composed entirely from existing pieces — the same bulk keyword lookup, the same shared-phrase clustering engine the saved-keyword Topic Clusters feature and get_topic_research both already use, a text-match against the project's own crawled pages, and a BOUNDED number of AI-gateway content-brief calls (one per cluster among the top few by measured volume, gated by the shared AI-gateway budget). `page.status: "existing"` on a cluster means the site already has a page ABOUT that topic (title/URL text-match), never a verified ranking claim — this codebase has no keyword-to-URL index. A cluster beyond the brief limit gets `brief: null, briefSkipped: true` — an honest 'not attempted', not an empty brief. Consumes the SAME keyword_lookups_per_day plan quota bulk lookups do (once per request) plus up to a handful of AI-gateway operations.

NameTypeReqDescription
keywordsarrayyes1-500 keywords to analyze (e.g. from a bulk research run or an export).
languageCodestring–Language code (e.g. 'en', 'es', 'fr'). Omit it to use the project's default market language, which falls back to 'en'.
locationCodeinteger–DataForSEO location code. Omit it to use the project's default market, which falls back to 2840 (United States) for a project that has not set one. See dataforseo.com/help-center/locations. Some coun…
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.

No output schema declared.

No examples provided.

get_link_intersect ~894

Finds the domains that link to 2–4 of the project's competitors but NOT to the project itself. Every row is a site that has already demonstrated it will link to something in this space, which is what makes it the most actionable backlink report there is. CHARGES CREDITS — the most expensive call in the backlinks surface: one referring-domains lookup per request, 5 of them paging the project's OWN referring domains plus 1 per competitor, so one run costs up to 9 upstream requests of 1000 domains each. Every request is cached per organization+target+page, so re-running the same intersect with a different threshold, proof filter or sort is FREE — do that rather than issuing a new run, and confirm with the user before sweeping several competitor sets. UNAVAILABLE ON THE FREE DATA PROVIDER: a backlink graph needs a proprietary web-scale crawl index, so a deployment on the free provider answers with `unavailable: true`, a reason, and no rows. `totalRows`, `provenRows` and `unprovenRows` are 0 on that response and are NOT measurements — they travel beside the flag precisely so an empty table is never read as an answer. Check `unavailable` before `rows`, and never report an unavailable run as 'no opportunities exist'. `absence` has two states that must NOT be conflated. `proven` means our own referring-domain read ruled the domain out, so "does not link to us" is a measurement. `unproven` means our read was cut off at or above that domain's authority, so it may already link to us and nothing was established — never present an `unproven` row as a confirmed opportunity. `provenRows` is the headline count and excludes them by construction. `absenceBound` says which regime applies: `complete` (our whole profile was read) or `authority-floor` with the `authorityFloor` strictly above which absence is evidence. `coverage[]` is the per-target ledger — `domainsRead`, the provider's `domainsTotal`, `requestsSpent`/`requestBudget`, `truncated`, `authorityFloor`, and a per-target `una…

NameTypeReqDescription
competitorDomainsarrayyes2–4 competitor domains (bare domain or full URL). Each one is a separate billable referring-domains lookup, so pick the rivals actually being chased. 2 is the floor because with a single competitor t…
includeUnprovenboolean–Include rows whose absence from our own profile could not be proven. Defaults to true — leave it true: unproven rows are labelled rather than hidden, and excluding them silently drops real candidates.
minCompetitorsinteger–Keep only domains linking to at least this many of the compared competitors. Defaults to 2, and is clamped to the number of competitors that actually resolved — compare `minCompetitors` against `minC…
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.
sortFieldstring–Sort column: 'competitors' (default), 'authority' or 'linkingPages'. All three are values the provider measured — there is deliberately no composite opportunity score. Re-sorting a run reuses the cac…
sortOrderstring–Sort direction. Defaults to 'desc'.

No output schema declared.

No examples provided.

get_local_pack_rank ~221

Read-only access to local pack rank check configs and their latest check. With `configId`, returns that config's latest check: `status` is "found" (a real 1-based `position` within Google's local pack), "not_found" (the page parsed cleanly but the business was not among the entries seen), or "unavailable" (the scraper is disabled, blocked, or nothing could be parsed) — never a fabricated position or confidence score. Without `configId`, lists all local pack rank configs in the project. This checks Google's LOCAL PACK for a named BUSINESS, distinct from get_local_rank_grid, which checks ORGANIC rank for a DOMAIN across a geo-grid. Create a config with create_local_pack_rank_config and run a new check with run_local_pack_rank_check.

NameTypeReqDescription
configIdstring–Local pack rank config ID. If omitted, lists all configs in the project.
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.

No output schema declared.

No examples provided.

get_local_rank_grid ~173

Read-only access to geo-grid rank-tracking configs and their latest run. With `configId`, returns that config's latest run plus per-point results (position, url, and the place name each point was reverse-geocoded to for its location override — null means no override was applied). Without it, lists all grid configs in the project. Reports ORGANIC rank at each point, NEVER local-pack position — the free SERP backend does not parse a local pack. Create a config with create_local_rank_grid_config and trigger a run with run_local_rank_grid.

NameTypeReqDescription
configIdstring–Grid config ID. If omitted, lists all grid configs in the project.
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.

No output schema declared.

No examples provided.

get_media_monitoring_report ~360

Media Monitoring: get_unlinked_mentions_report's candidates filtered to known social/forum/news platform domains, optionally merged with the citation-platform breakdown from a Prompt Explorer scan you already ran for the same brand. Same cost profile as `get_unlinked_mentions_report`, which this calls internally — no AI-gateway spend, even when `citations` is supplied (that data is only classified here, never fetched). NOT a real-time media-monitoring product: no social-platform API polling, no forum-API crawling, no news-aggregator feed — `scopeNote` states this on every `analysed` response. ALWAYS narrow on `state` first, same as `get_unlinked_mentions_report`. `aiCitationPlatforms: null` means no `citations` were supplied — distinct from an empty array, which would mean a scan cited nothing on a known platform.

NameTypeReqDescription
brandstringyesBrand name or bare domain to search for as a SERP QUERY (not a URL to fetch).
citationsarray–Citations from an ALREADY-RUN Prompt Explorer scan for this brand (map its `citations` to {url, domain}). Never fetched here — omitting it leaves `aiCitationPlatforms: null`.
languageCodestring–Language code. Defaults to the project's stored market, else 'en'.
locationCodeinteger–Numeric location code. Defaults to the project's stored market, else 2840 (United States).
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.
trackedDomainstringyesBare domain each result page is checked for a link to, e.g. 'acme.com'.

No output schema declared.

No examples provided.

get_portfolio ~96

One card per member project (same shape get_dashboard returns — no GSC, no backlinks, see its own description for why) plus aggregate totals. `totals.averageHealthScore` is averaged over member projects that HAVE been audited, not over every member. FREE: database only, no SEO data provider is called and no credits are spent.

NameTypeReqDescription
portfolioIdstringyesPortfolio ID. Use list_portfolios to find it.

No output schema declared.

No examples provided.

get_rank_ai_overview_trend ~286

AI Overview presence trend across a tracker's keywords, oldest first — what share of tracked keywords showed Google's AI Overview in the SERP, per check run, and how that has moved over time. FREE: database only, no SEO data provider is called and no credits are spent. Reuses `rank_snapshots.serpFeatures`, already populated by the SERP-feature capture the rank checker already does — no new SERP calls. `aiOverviewPresenceRatePct` is `keywordsWithAiOverview / keywordsTotal * 100`, rounded to one decimal, and `null` (not 0) for a run where `keywordsTotal` is 0 — nothing was checked that run, which is a missing measurement, not a truthful "0% presence".

NameTypeReqDescription
configIdstringyesRank tracker config ID. Call get_rank_tracker without a trackerId to list the project's trackers and their IDs.
devicestring–On every free SERP source today this narrows nothing — there is no device dimension, so every reading folds to one series regardless of what is passed. Defaults to desktop.
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.
sinceDaysinteger–How many days back to look, 1–730. Defaults to 365.

No output schema declared.

No examples provided.

get_rank_config_trend ~309

Per-run keyword-position-distribution buckets for a tracker, oldest first — how many tracked keywords sit in the top 3, 4-10, 11-20, or outside the top 20, per check run. Use it to answer 'is this domain's visibility trending up or down' without re-checking anything. FREE: database only. No SEO data provider is called and no credits are spent. Buckets are disjoint and cover every tracked keyword: `notRanking` is derived as the remainder, not fetched separately, and `top3 + top4to10 + top11to20 + notRanking` always equals the tracker's keyword count at that run. `device` is accepted but on every free SERP source today it narrows nothing — see get_rank_tracker's own note on this deployment's device support.

NameTypeReqDescription
configIdstringyesRank tracker config ID. Call get_rank_tracker without a trackerId to list the project's trackers and their IDs.
devicestring–Which device's positions to bucket. On every free SERP source today this narrows nothing — there is no device dimension, so every reading folds to one series regardless of what is passed. Defaults to…
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.
sinceDaysinteger–How many days back to look, 1–730. Defaults to 365.

No output schema declared.

No examples provided.

get_rank_keyword_history ~239

Per-keyword position series over time, oldest first — the same series the app's SERP-history chart draws for one tracked keyword. FREE: database only. No SEO data provider is called and no credits are spent. A `position` of `null` means checked but not found within that check's `searchedDepth` — a real event, not a missing check or a lost ranking. `searchedDepth: null` means the run predates that column, not that any particular depth was searched. At most one point per UTC day: a same-day re-check collapses to its latest reading.

NameTypeReqDescription
configIdstringyesRank tracker config ID. Call get_rank_tracker without a trackerId to list the project's trackers and their IDs.
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.
sinceDaysinteger–How many days back to look, 1–730. Defaults to 365.
trackingKeywordIdstringyesThe tracked keyword's own row ID (from get_rank_tracker's results), not the keyword text.

No output schema declared.

No examples provided.

get_rank_movers ~359

Newcomers and fast climbers for a tracker's OWN domain, over a window. `newlyRanking` is keywords that started ranking during the window (no earlier position, or an earlier position of null). `fastClimbers` is keywords that ranked at both ends of the window and gained at least `minGain` positions. FREE: database only. No SEO data provider is called and no credits are spent. THIS IS NOT COMPETITOR DISCOVERY. No corpus of undeclared domains exists in this codebase to discover a newcomer domain from — a rank check only ever persists positions for the target domain and the already-tracked competitor list; every other domain in a fetched SERP is read and discarded. Do not describe a `newlyRanking` entry as a 'new competitor' or 'newly discovered domain' — it is a keyword the TRACKED domain itself started ranking for, nothing about a competitor. `newlyRanking` entries always have `gain: null` — there is no earlier position to measure a gain from, and `minGain` never filters them.

NameTypeReqDescription
configIdstringyesRank tracker config ID. Call get_rank_tracker without a trackerId to list the project's trackers and their IDs.
minGaininteger–Positions a keyword must have gained to count as a fast climber, 1–100. Defaults to 5. Does not affect newlyRanking, which has no earlier position to measure a gain from.
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.
sinceDaysinteger–How many days back to look, 1–730. Defaults to 365.

No output schema declared.

No examples provided.

get_rank_tracker ~352

Read-only access to rank tracker configs and their latest results. With `trackerId`, returns the config plus the latest snapshot per keyword. Without it, lists all trackers in the project. FREE — reads stored MisarSEO state only, runs no SERP query and charges no credits. To trigger a new check, use the dashboard. A null position means THE DOMAIN WAS NOT FOUND WITHIN THE DEPTH SEARCHED. The response states that depth as a number — use THAT number, not the config's `serpDepth`, which is what was asked for and can be several times deeper than the search source reaches. Everything past the depth searched was not measured, so a null is neither a rank of zero nor proof the page stopped ranking — say 'not found in the top N' and give the N the response states. Device columns are printed only where this deployment measures desktop and mobile as separate searches; where it does not, the response says so and prints ONE position per keyword. Never report a mobile or desktop absence from a column the response did not print, and never infer one from the config's `devices` value. `previousPosition` is a roughly 7-day-old comparison point, and when no snapshot that old exists it falls back to the EARLIEST snapshot on record — so a 'was' figure can be much older than a week. Do not quote it as a week-over-week change without checking the tracker's history length.

NameTypeReqDescription
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.
trackerIdstring–Rank tracker config ID. If omitted, lists all rank trackers in the project.

No output schema declared.

No examples provided.

get_rank_volatility_index ~340

SERP volatility index across recent runs — how much this tracker's own positions churned run over run, derived entirely from already-stored history (no new SERP calls). FREE: database only, no SEO data provider is called and no credits are spent. Modeled on the one step AccuRanker publicly discloses for their Grump Rating (sum of per-keyword differences / number of results), but CTR-weighted rather than a raw position delta — a #1-#2 swap counts far more than a #18-#19 swap. NOT a 0-10 Sensor score or a mood label (Semrush and MozCast do not publish their formulas, and both are calibrated against panels of hundreds of thousands to millions of keywords spanning the whole web). `volatilityIndex` is meaningful only relative to THIS tracker's own history over time, not as an absolute severity — do not describe a given value as 'high' or 'low' without comparing it to this same tracker's other points.

NameTypeReqDescription
configIdstringyesRank tracker config ID. Call get_rank_tracker without a trackerId to list the project's trackers and their IDs.
devicestring–On every free SERP source today this narrows nothing — there is no device dimension, so every reading folds to one series regardless of what is passed. Defaults to desktop.
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.
runLimitinteger–How many recent completed runs to compare consecutively, 2-26. Defaults to 12.

No output schema declared.

No examples provided.

get_report_definition ~85

Gets a report definition's name and ordered widget types. FREE: database only, no SEO data provider is called and no credits are spent.

NameTypeReqDescription
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.
reportDefinitionIdstringyesReport definition ID. Use list_report_definitions to find it.

No output schema declared.

No examples provided.

get_report_schedule ~86

Gets a report definition's schedule, if it has one. FREE: database only, no SEO data provider is called and no credits are spent.

NameTypeReqDescription
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.
reportDefinitionIdstringyesReport definition ID. Use list_report_definitions to find it.

No output schema declared.

No examples provided.

get_search_console_coverage ~240

MisarSEO's own index-coverage report for the connected property: which URLs are indexed, excluded, or errored, and why. FREE (no credits) and makes NO call to Google — unlike get_search_console_performance, this reads `gscUrlCoverage`, populated by a nightly scan built on the URL Inspection API's ~2000/day quota, so coverage fills in over days rather than in one pass. `summary` is the headline count per coverageState. `rows` is one page (default 200, max 1000) of the URLs themselves, newest-inspected first — filter to one state with `coverageState`. An empty summary/rows with ok: true means the nightly scan has not populated this property yet, not that every page is fine.

NameTypeReqDescription
coverageStatestring–Filter to one state, e.g. "Submitted and indexed". Free text, matching Google's own strings verbatim.
limitinteger––
offsetinteger––
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.

No output schema declared.

No examples provided.

get_search_console_hourly_performance ~205

MisarSEO's own retained HOURLY Search Console totals for the connected property — the hourly counterpart to get_search_console_performance's daily archive. FREE (no credits) and makes NO call to Google: reads MisarSEO's own Postgres. Unlike the daily archive, a wider date range does not mean more history — Google itself only offers roughly the trailing 8-10 days of hourly data, and the nightly sync only ever fetches that same window, so a startDate earlier than it simply returns nothing for the days outside it. Each row's `hour` is 0-23 in Search Console's own America/Los_Angeles reporting hour.

NameTypeReqDescription
endDatestringyesYYYY-MM-DD, required, not before startDate.
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.
startDatestringyesYYYY-MM-DD, required.

No output schema declared.

No examples provided.

get_search_console_performance ~517

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; dates are Pacific Time; the last ~3 days may be incomplete. Read-only and FREE (no credits) — Search Console is first-party data and meters nothing. It does spend Google's per-property request quota. Google omits rows it will not disclose (anonymised queries) and returns at most `rowLimit` of the rest, so what it withholds is not measured rather than absent: zero rows is not zero demand, and a total summed from these rows is a floor, never the property's real total. When `hasMore` is true you have seen only part of the match set — page with `startRow` before reporting any sum or count as complete.

NameTypeReqDescription
dataStatestring–'all' (default) includes fresh/incomplete recent data.
dateRangestring–Convenience 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.
dimensionsarray–Group 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.
endDatestring–Explicit end (YYYY-MM-DD, Pacific Time). Use with startDate.
filtersarray–AND-combined filters. To get the queries for one page: [{dimension:'page',operator:'equals',expression:'https://example.com/post'}] with dimensions ['query'].
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.
rowLimitinteger–Rows 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.
startDatestring–Explicit start (YYYY-MM-DD, Pacific Time). Use with endDate.
startRowinteger–Pagination offset.
typestring–Search type (default web).

No output schema declared.

No examples provided.

get_search_console_sitemaps ~252

Search Console sitemaps.list/sitemaps.get: every sitemap submitted for the connected property and its processing status (pending, last downloaded, warning/error counts, per-content-type submitted counts), or one named sitemap. Read-only — needs only the `webmasters.readonly` scope this deployment's Search Console connection already requests. Submit/delete need the broader `webmasters` scope and are deliberately not offered. Free (no credits) but spends one call of Google's per-property quota. Omit `feedpath` to list every sitemap; pass one (a sitemap's own URL) to fetch just that one instead — either way the response is `sitemaps`, a one-entry array for `feedpath`. `lastSubmitted`/`lastDownloaded`/`warnings`/`errors` are absent, not zero, when Google has nothing to report for that field.

NameTypeReqDescription
feedpathstring–A specific sitemap's own URL (e.g. another entry's own `path`). Omitted lists every sitemap Search Console has on record for the property.
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.

No output schema declared.

No examples provided.

get_site_audit_status ~200

Progress of a site audit started by start_site_audit: `{ status, pagesCrawled, pagesTotal, lighthouseTotal, lighthouseCompleted, lighthouseFailed, currentPhase, startedAt, completedAt }`. `status` is 'running', 'completed' or 'failed' — poll until it is 'completed' or 'failed'; there is no 'complete' status, so waiting for that string never ends. It does NOT return crawled pages or individual issues. Once completed, read it with get_audit_comparison, get_audit_core_web_vitals, get_audit_https_report, get_audit_internal_links and get_audit_structured_data. FREE.

NameTypeReqDescription
auditIdstringyesThe auditId (or jobId — the same value) returned by start_site_audit.
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.

No output schema declared.

No examples provided.

Install

How do I install the MisarSEO MCP Server server?

MisarSEO MCP Server is a hosted endpoint at https://api.misar.io/seo/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

remote · api.misar.io

# add to Claude Code
claude mcp add --transport http misar-ai-misarseo-mcp 'https://api.misar.io/seo/mcp'
Common questions

What is the MisarSEO MCP Server server?

MisarSEO MCP Server is listed in the public MCP registry as io.github.Misar-AI/misarseo-mcp. Research keywords, track rankings, audit sites, monitor backlinks and AI-search visibility, from… This page covers its hosted endpoint (https://api.misar.io/seo/mcp).

Is the MisarSEO MCP Server server safe to use?

MisarSEO MCP Server scores 85 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the MisarSEO MCP Server server expose?

MisarSEO MCP Server exposes 180 tools: list_projects, get_dashboard, research_keywords, save_keywords, list_saved_keywords, and 175 more. Their descriptions and schemas cost roughly 36,320 tokens of context every time the server is loaded.

Does the MisarSEO MCP Server server require authentication?

Yes. MisarSEO MCP Server asked us for credentials when we connected, so you will need to authorise it in your MCP client before it can do anything.

Is the MisarSEO MCP Server server still maintained?

MisarSEO MCP Server is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.