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 (8 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
What we tested

Checks we ran (13)

  • TLS certificate
  • Authorization
  • HTTPS
  • HSTS header
  • DNSSEC
  • Transport
  • Schema quality
  • Stability
  • Tool coverage
  • Injection markers
  • Destructive annotations
  • Judged manipulation
  • MCP protocol

Does not apply to this hosted endpoint (2)

  • Supply Chain SecurityScored on package channels only. This is a hosted endpoint, so there is nothing to install or inspect.
  • Provenance & TransparencyScored on package channels only. This is a hosted endpoint, so there is nothing to install or inspect.

The score does not measure everything. What the score does not measure →

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. DS published 38690 8 Verified
misar.io. No DS 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_topic_research ~312

Content ideas for a seed keyword, composed from three sources this codebase already fetches for other features: the SERP for the seed (titles of pages already ranking for it), PAA-style questions (real autocomplete completions reframed as questions), and autocomplete keyword suggestions. Grouped into topic clusters by shared phrasing, using the same phrase-clustering engine the saved-keyword Topic Clusters feature uses. FREE — none of the three sources is billable in this codebase today. Three real upstream calls per request, so it is rate limited. NOT a Keywords-Explorer-style overlap report: this codebase has no keyword-to-URL index, so `clusters` group the REAL text of three OBSERVED sources rather than a fabricated 'what else these pages rank for'. `coverage.serpUnavailable`/`suggestionsUnavailable` mean that source could not be asked at all — distinct from that source genuinely returning nothing — and one source being unavailable never sinks the other two. Every idea not assigned to a cluster is still returned in `ungrouped`, never discarded.

NameTypeReqDescription
keywordstringyesThe seed keyword to research.
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.

No output schema declared.

No examples provided.

get_tracked_prompt_trend ~114

Observed history for one tracked prompt — one point per real scheduled check (`mentionedByCount`/`citedByCount` out of `successfulModelCount`), oldest first. Empty until checks accumulate; never interpolated or back-filled. FREE — reads recorded checks.

NameTypeReqDescription
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.
trackedPromptIdstringyesTracked prompt ID, from list_tracked_prompts.

No output schema declared.

No examples provided.

get_unlinked_mentions_report ~351

Unlinked brand mentions: searches the free SERP backend for `brand` as a QUERY, then checks whether each result page already links to `trackedDomain`. Free: one SERP fetch plus up to 10 live third-party page fetches, no AI-gateway spend. ALWAYS narrow on `state` first: `serp_unavailable` means no free SERP provider could be reached — never treat it as "zero mentions found". `analysed` carries `candidates[]`, each `status: "linked" | "unlinked" | "unreachable"`. Bounded by SERP result count (the first page or two of free-SERP results), never an exhaustive web crawl or a full content index — the Common Crawl-based version of this gap is a decided wont-fix; `scopeNote` states this on every response. `candidates[].platform` reuses the AI-citation platform classification (YouTube/TikTok/Reddit/Wikipedia/LinkedIn/Quora, or null) at no extra cost.

NameTypeReqDescription
brandstringyesBrand name or bare domain to search for as a SERP QUERY (not a URL to fetch).
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_usage ~191

Plan tier, credits remaining, and every quota/count dimension tracked against it for the caller's organization. FREE: reads counters this codebase already maintains for its own gating — nothing here calls a paid provider or spends a credit. `gatingActive` is false on a self-hosted deployment with no billing provider configured: `tier`, `creditsRemaining` and `quotas` are all null there, not a fabricated tier. `counts` (projects/rank-tracked keywords/API keys) is always populated. Inside a quota dimension, `used: null` means NOT TRACKED — an unlimited tier's counter is never incremented in the first place — never a real zero; `used: 0` IS a real measured zero. `aiGatewayOps` is the shared platform AI-gateway key's own monthly ceiling, reported separately because it is a platform-abuse ceiling, not a plan entitlement.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

get_web_analytics_devices ~103

Device/browser/OS breakdown for a project's own tracking snippet. Every field is derived server-side from the visitor's User-Agent header at collection time. FREE, first-party.

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_web_analytics_sources ~202

Referrer/channel/UTM breakdown for a project's own tracking snippet, including AI referral attribution: aiReferral.bySource breaks the ai-referral channel out by assistant (chatgpt/claude/perplexity/gemini/copilot/you/poe). aiReferral.undercountNote is not decoration — industry measurement puts a large share of real AI-assistant referrals arriving with no referrer header at all, landing in the direct channel instead. This number is a measurable floor, never a complete count. FREE, first-party.

NameTypeReqDescription
endDatestringyesYYYY-MM-DD, required, not before startDate.
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.
referrerLimitinteger–Rows in topReferrers, 1-200, default 50.
startDatestringyesYYYY-MM-DD, required.

No output schema declared.

No examples provided.

get_web_analytics_summary ~139

Sessions/pageviews/bounce-rate time series for a project's own tracking snippet. FREE — first-party data collected by MisarSEO's own snippet (/api/analytics/snippet.js), never a paid or rate-limited third-party call. `totals.bounceRate` is null (not 0) when there were no sessions in the range.

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_web_analytics_top_pages ~126

Top pages by view count, plus separate entry-page and exit-page breakdowns, for a project's own tracking snippet. FREE, first-party.

NameTypeReqDescription
endDatestringyesYYYY-MM-DD, required, not before startDate.
limitinteger–Rows per list (topPages/entryPages/exitPages), 1-200, default 50.
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_yandex_site_overview ~251

Yandex's own view of a project's domain: the indexing summary — including the Site Quality Index (SQI), a third independent authority signal alongside OpenPageRank and Tranco — and popular search queries, read straight from the Yandex Webmaster API. FREE (no credits). Bring-your-own-token: requires the deployment operator to set YANDEX_WEBMASTER_OAUTH_TOKEN (one token covers every host verified on that Yandex account — no per-project connect step, and MisarSEO never drives the OAuth flow itself). Answers { ok: false, reason: 'not_configured' } when unset, or 'no_matching_host' when the project's domain has no verified match on the account. Yandex publishes no backlink-lookup endpoint at all, so unlike get_bing_site_overview this has no backlinks section. `diagnostics` lists individually named issues (e.g. NO_SITEMAPS, DNS_ERROR) that `summary.siteProblems` only counts by severity.

NameTypeReqDescription
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.
queryLimitinteger–Max popular queries to return (1-500).

No output schema declared.

No examples provided.

import_link_prospects_csv ~115

Link Building Tool: bulk-add up to 500 prospects at once from already-parsed rows (each with at least a domain). FREE (no credits), but this is a MUTATION. One bad or duplicate row never aborts the rest — the response reports added/duplicates/errors per row.

NameTypeReqDescription
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.
rowsarrayyesRows to import, each with at least a domain.

No output schema declared.

No examples provided.

inspect_urls ~234

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?'. Read-only and FREE (no credits) — Search Console is first-party data and meters nothing. Every submitted URL comes back as a row, but a row carrying `error` was NOT inspected: Google refused or failed on it, so its index state was not measured rather than found to be bad. Count the rows without an `error` when saying how many URLs you checked. A verdict of UNKNOWN is Google's own 'no determination', not a page that is missing from the index.

NameTypeReqDescription
languageCodestring–BCP-47 language for the inspection result (e.g. 'en-US').
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.
urlsarrayyes1–10 absolute URLs to inspect. Each must belong to the connected property.

No output schema declared.

No examples provided.

list_ahrefs_projects ~132

Every Rank Tracker AND Site Audit project the caller's connected Ahrefs Connect grant can access — the data source for picking which project(s) to bind to a MisarSEO project (see set_ahrefs_project). Live call to the Ahrefs API v3 under the caller's OWN OAuth token. Read-only and FREE (no credits). Check `requiresReconnect` before treating both lists as 'no projects': true means the stored grant can no longer reach Ahrefs.

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

No output schema declared.

No examples provided.

list_bing_sites ~132

Every site the caller's connected Bing Webmaster OAuth grant can access — the data source for picking which site to bind to a project (see set_bing_site). Live call to the Bing Webmaster API (GetUserSites) under the caller's OWN OAuth token, not the operator key. Read-only and FREE (no credits). Check `requiresReconnect` before treating an empty `sites` list as 'no sites': true means the stored grant can no longer reach Bing Webmaster.

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

No output schema declared.

No examples provided.

list_brand_monitors ~74

Lists a project's brand monitors — targets re-scanned by Brand Radar on a schedule rather than only when run_brand_radar_scan is called. FREE: database only, no credits spent.

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

No output schema declared.

No examples provided.

list_competitor_monitors ~96

Competitor page change detection: the specific competitor URLs monitored for a project, with `lastCheckedAt` (null until the first scheduled check reaches it). FREE — database only, no credits spent. Use get_competitor_monitor_changes for the actual detected-change timeline of one URL.

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

No output schema declared.

No examples provided.

list_disavow_entries ~77

Disavow file management: every disavow entry for a project, oldest first. FREE (no credits). Use export_disavow_file to get the actual Google-format .txt content.

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

No output schema declared.

No examples provided.

list_ga4_properties ~126

Every GA4 property the caller's connected Google Analytics grant can access — the data source for picking which property to bind to a project (see set_ga4_property). Live call to the Analytics Admin API (accountSummaries.list), not an archive read. Read-only and FREE (no credits). Check `requiresReconnect` before treating an empty `properties` list as 'no properties': true means the stored grant can no longer reach Google Analytics.

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

No output schema declared.

No examples provided.

list_gbp_locations ~106

Every Google Business Profile account and location this deployment's operator credential can manage — the picker data for set_gbp_connection. Not project-scoped data (the answer does not depend on the project passed; projectId only satisfies the ownership check). Returns `{ accounts: [{ name, accountName, locations: [...] }] }`. Live Google API calls.

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

No output schema declared.

No examples provided.

list_gbp_posts ~64

Posts published on the project's linked Google Business Profile location. A 404 means no location is linked — use set_gbp_connection first.

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

No output schema declared.

No examples provided.

list_link_prospect_activity ~86

Link Building Tool: a prospect's activity log — every manually-typed note plus every auto-recorded status change, newest first. FREE (no credits).

NameTypeReqDescription
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.
prospectIdstringyesProspect id, from list_link_prospects.

No output schema declared.

No examples provided.

list_link_prospects ~85

Link Building Tool: every prospect for a project, newest first, each enriched with a LIVE domain-authority read (never cached, never an invented score). FREE (no credits). White-hat scope: research + outreach assistance only.

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

No output schema declared.

No examples provided.

list_patch_auto_publish_rules ~84

Patches: every issue type this project auto-publishes a freshly AI-drafted patch for, immediately on draft (capped at 20 auto-publishes per project per day). FREE (no credits), read-only.

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

No output schema declared.

No examples provided.

list_patches ~73

Patches: every title/metaDescription/canonical/redirect fix drafted for a project, newest first, one active row per (page, field). FREE (no credits), read-only.

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

No output schema declared.

No examples provided.

list_portfolios ~38

Lists the caller organization's portfolios, each carrying `projectCount`. FREE: database only, no SEO data provider is called and no credits are spent.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

list_projects ~118

Lists the active projects in the user's organization. FREE — database only, charges no credits. Use this whenever you need a `projectId` for another MisarSEO tool. Returns `{id, name, domain, url}` per project; pass the `id` value as `projectId`. `domain` is null for a project that has never had one set, which is not a missing lookup — get_keyword_gap and get_link_intersect read the project's own domain from this record and refuse to run without it. Archived projects are not listed.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

list_rank_annotations ~136

Chart notes on a rank tracker's own timeline — 'deployed new title tags', 'algorithm update' — oldest first. FREE: database only, no SEO data provider is called and no credits are spent. Config-level, not per-keyword or per-device: a deploy or algorithm change is a fact about the date, not about any one 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.

No output schema declared.

No examples provided.

list_rank_cannibalisation ~187

Tracked keywords whose latest ranking URL is not the target URL you declared for them (see set_rank_keyword_target_url). FREE: database only, no SEO data provider is called and no credits are spent. NOT the same detector as get_cannibalisation_report (Search Console-based), which finds two-or-more of the site's OWN pages splitting Search Console impressions for one query. A rank check records only the single best-ranking URL per keyword per run, so this can only tell you the winning page was not the one you intended — not that a second own page also appeared in the SERP.

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.

No output schema declared.

No examples provided.

list_rank_keyword_tags ~264

Lists the tags in use on one rank tracker, plus the project's whole tag vocabulary. Use it to find tag IDs before calling update_rank_keyword_tag, and to see how a tracker with hundreds of keywords is already organised. FREE: database only. No SEO data provider is called and no credits are spent, so it is safe to call as often as needed. The two lists mean different things and are deliberately separate. `tagsInUse` is what THIS tracker's keywords actually carry, and its `keywordCount` counts TRACKED keywords carrying the tag — not the saved-keyword count the same tag carries elsewhere, which would never match the rows it filters. It is empty for a tracker that has never used a tag. `projectTags` is the project's full vocabulary including tags unused here, so a tag can be reused rather than re-coined. The vocabulary is the project's EXISTING saved-keyword tags: one namespace shared with the saved-keyword list, not a second set.

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.

No output schema declared.

No examples provided.

list_rank_tracking_keywords ~180

Lists the keywords tracked by ONE rank tracker: `{ keywords, totalCount, page, pageSize }`, each row `{ id, configId, keyword, searchVolume, keywordDifficulty, cpc, metricsFetchedAt, createdAt }`. It returns NO positions and runs no check — read positions with get_rank_tracker. The row `id` is the tracking-keyword ID that remove_rank_tracking_keywords, update_rank_keyword_tag and set_rank_keyword_target_url take. FREE: database only.

NameTypeReqDescription
configIdstringyesRank tracker config ID.
pageinteger–1-based page number. Defaults to 1.
pageSizeinteger–Rows per page. Defaults to 50.
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.

No output schema declared.

No examples provided.

list_report_definitions ~66

Lists a project's report definitions, each carrying `widgetCount`. 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.

No output schema declared.

No examples provided.

list_saved_keywords ~265

Lists keywords saved to a project, with whatever metrics have been cached for them (search volume, difficulty, CPC) and their tags. FREE — reads MisarSEO's own database, runs no provider lookup and charges no credits. Filter by keyword text with `search`; page through with `page` and `limit` (50, 100 or 250 rows per page — any other value is rounded down to one of those), ordered by `sort`/`order`. A metric is null when nothing has ever fetched it for that keyword — saving a keyword does not measure it. Null is not zero volume and not zero difficulty; run research_keywords to fill them. `totalCount` is how many keywords match the filter, and `rows` is only the current page of them, so report both.

NameTypeReqDescription
limit––Maximum rows to return. Defaults to 100.
orderstring–Sort direction (default desc).
pageinteger–1-based page number (default 1).
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.
searchstring–Optional keyword text filter.
sortstring–Sort column (default createdAt).

No output schema declared.

No examples provided.

list_tracked_prompts ~80

Lists a project's tracked prompts — prompts re-run through explore_ai_prompt's real answer pipeline on a schedule and diffed against the previous check for mention/citation drops. FREE: database only, no credits spent.

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

No output schema declared.

No examples provided.

list_yandex_hosts ~109

Every host the caller's connected Yandex Webmaster OAuth grant can access — the data source for picking which host to bind to a project (see set_yandex_host). Read-only and FREE (no credits). Check `requiresReconnect` before treating an empty `hosts` list as 'no hosts': true means the stored grant can no longer reach Yandex Webmaster.

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

No output schema declared.

No examples provided.

log_analyzer_daily_summary ~197

Bot hit counts per (day, bot category, bot label, status code, content-type bucket) across every log upload in the date range — powers a time-series, status-code, or content-type view of bot traffic. Rows are `{ day, botCategory, botLabel, statusCode, contentType, hitCount }`; botCategory is ai_crawler/search_engine/other_bot. Dates are ISO (YYYY-MM-DD), UTC. An empty result means nothing was measured in the range — no bot hits were recorded from the logs uploaded for those days, which is not the same as no bots visiting. FREE (no credits).

NameTypeReqDescription
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.
sinceDaystringyesInclusive start day, ISO date, UTC.
untilDaystringyesInclusive end day, ISO date, UTC.

No output schema declared.

No examples provided.

log_analyzer_list_uploads ~161

A project's server-log uploads and their parse status — the Log File Analyzer / Bot Analytics feature. Each row is `{ id, fileName, sizeBytes, status, lineCount, parsedLineCount, skippedLineCount, errorMessage, createdAt, completedAt }`. `status` is one of queued/parsing/completed/failed. lineCount/parsedLineCount/skippedLineCount are null until parsing completes — an absent count is not zero. FREE (no credits). Pair with log_analyzer_upload to add a log, log_analyzer_daily_summary / log_analyzer_top_paths for the report.

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

No output schema declared.

No examples provided.

log_analyzer_top_paths ~157

The paths bots hit most, per (bot category, bot label, path, status code) — the busiest-paths table of Bot Analytics. Rows are `{ botCategory, botLabel, path, statusCode, hitCount, lastSeenAt }`, ordered by hitCount descending, capped at 200. Optionally filter to one bot category (ai_crawler/search_engine/other_bot). An empty result means nothing was measured — no bot path hits were recorded from uploaded logs. FREE (no credits).

NameTypeReqDescription
botCategorystring–Filter to one bot category; omit for all.
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.

No output schema declared.

No examples provided.

log_analyzer_upload ~194

Upload a server access log for background parsing (Log File Analyzer / Bot Analytics). Only Apache/Nginx Combined Log Format text is supported. Pass the raw log text in `content`; parsing runs in the background, so this returns once the upload is stored, before it is fully processed — poll log_analyzer_list_uploads for status. Requires the `admin` role. Plan-tier gated: the deployment's tier caps lines processed per upload and uploads per month. Practical limit: tool calls carrying megabytes of text are impractical — prefer the web UI for large logs. FREE (no credits).

NameTypeReqDescription
contentstringyesRaw Combined Log Format text, one line per request.
fileNamestringyesThe log file's name, e.g. 'access.log'.
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.

No output schema declared.

No examples provided.

publish_patch ~120

Patches: makes a drafted fix live — visible in the project's public manifest, which the embedded snippet (or, for redirects, an operator-deployed Worker) reads from the visitor's browser. The audited site's own origin content is never touched. FREE (no credits), but this is a MUTATION. Requires an org admin.

NameTypeReqDescription
patchIdstringyesThe patch id, from list_patches or draft_patch.
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.

No output schema declared.

No examples provided.

reindex_yandex_url ~200

Asks Yandex Webmaster to re-crawl one specific URL on a project's matched host. FREE (no credits), but this is a MUTATION — unlike get_yandex_site_overview, it queues real work on the operator's live Yandex Webmaster account and spends that account's daily recrawl quota. Bring-your-own-token: requires YANDEX_WEBMASTER_OAUTH_TOKEN. Answers { ok: false, reason: 'not_configured' } when unset, or 'no_matching_host' when the project's domain has no verified match on the account. Yandex's own documented failure cases — the URL already queued, or the account's recrawl quota already spent — surface as a normal tool error, not a 200 with ok:false.

NameTypeReqDescription
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.
urlstringyesAbsolute URL to re-crawl.

No output schema declared.

No examples provided.

remove_competitor_monitor ~104

Stops monitoring one competitor URL. Its historical snapshots and detected changes are deleted along with it (cascading delete) — unlike rank tracking's competitor removal, there is no separate archive kept.

NameTypeReqDescription
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.

remove_disavow_entry ~99

Disavow file management: remove one disavow entry by id (from list_disavow_entries). FREE (no credits), but this is a MUTATION. Succeeds whether or not entryId existed.

NameTypeReqDescription
entryIdstringyesEntry id, from list_disavow_entries.
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.

No output schema declared.

No examples provided.

remove_link_prospect ~99

Link Building Tool: remove one prospect by id (from list_link_prospects), along with its activity log. FREE (no credits), but this is a MUTATION. Succeeds whether or not prospectId existed.

NameTypeReqDescription
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.
prospectIdstringyesProspect id, from list_link_prospects.

No output schema declared.

No examples provided.

remove_portfolio_projects ~84

Removes projects from a portfolio. Succeeds whether or not an id was actually a member. FREE: database only, no SEO data provider is called and no credits are spent.

NameTypeReqDescription
portfolioIdstringyesPortfolio ID. Use list_portfolios to find it.
projectIdsarrayyesMisarSEO project IDs. Use list_projects to find them.

No output schema declared.

No examples provided.

remove_rank_annotation ~122

Removes a chart note from a rank tracker's own timeline. FREE: database only, no SEO data provider is called and no credits are spent. Succeeds whether or not `id` matched an existing note.

NameTypeReqDescription
configIdstringyesRank tracker config ID. Call get_rank_tracker without a trackerId to list the project's trackers and their IDs.
idstringyesNote ID, from list_rank_annotations.
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.

No output schema declared.

No examples provided.

remove_rank_tracking_keywords ~105

Removes keywords from a rank tracker by their tracking-keyword IDs (from list_rank_tracking_keywords). The keywords stop being checked; their past position snapshots are deliberately kept, so history survives. FREE: database only.

NameTypeReqDescription
configIdstringyesRank tracker config ID.
keywordIdsarrayyesTracking-keyword IDs to remove.
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.

No output schema declared.

No examples provided.

rename_portfolio ~64

Renames a portfolio. FREE: database only, no SEO data provider is called and no credits are spent.

NameTypeReqDescription
namestringyesPortfolio name, 1-100 characters.
portfolioIdstringyesPortfolio ID. Use list_portfolios to find it.

No output schema declared.

No examples provided.

rename_report_definition ~95

Renames a report definition. FREE: database only, no SEO data provider is called and no credits are spent.

NameTypeReqDescription
namestringyesReport name, 1-100 characters.
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.

render_report_definition ~157

Renders a report definition — fetches ONLY its selected widgets, not a fixed set. FREE: every widget is a local Postgres read, no upstream call, so this never spends a paid-provider credit or a live Search Console quota unit. `rank_volatility` and `share_of_voice` read the project's FIRST active rank tracker only; `rank_movers` sums across every active tracker.

NameTypeReqDescription
periodDays––7, 28 or 90 days. Defaults to 28.
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.

reply_to_gbp_review ~99

Reply to (or overwrite the reply on) one review, by reviewId from get_gbp_reviews. Google's endpoint has no separate create/update — this always overwrites. Publishes immediately; there is no draft/preview step.

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

No output schema declared.

No examples provided.

research_ai_prompts ~181

Turns a seed topic into candidate prompts worth tracking (real Google/Bing autocomplete completions reframed as questions) plus observed mention-rate signals from this project's own already-tracked prompts. This is NOT prompt search volume — no honest corpus of 'how many people ask this' exists anywhere this codebase can reach, so no volume or difficulty number is invented. FREE: no AI-gateway budget, no paid-plan gate, no credits spent.

NameTypeReqDescription
languageCodestring–Language code (e.g. 'en', 'es', 'fr'). Omit it to use the project's default market language, which falls back to 'en'.
projectIdstringyesRequired. The MisarSEO project ID to scope this call to. Get one from list_projects.
seedTopicstringyesTopic to derive trackable prompt candidates from.

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.

What did VerifyMCP test on the MisarSEO MCP Server server?

VerifyMCP ran 13 checks on MisarSEO MCP Server, covering TLS certificate, Authorization, HTTPS, HSTS header and 9 more. Supply Chain Security and Provenance & Transparency do not apply to a hosted endpoint, so they were not tested. The score does not measure everything, and the scoring documentation lists what it leaves out.