MisarSEO MCP Server
NPM · @MISARSEO/MCP · 2 COMPONENTS
Research keywords, track rankings, audit sites, monitor backlinks and AI-search visibility — from…
Available components
Last scanned (22 hours ago)
Scores higher than 61% of npm servers
Category Marketing and SEO
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security98
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- No install/post-install scripts declared.Pass
- 30 of 92 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency45
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 14 days ago).Pass
- Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
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 Management60
- Stability observed for 18 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
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
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.
- 4 Nov 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 57 to 60. That category is still filling its 30-day observation window: 17 days of observed history at the previous scan, 18 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.
- 30 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 40 to 43. That category is still filling its 30-day observation window: 12 days of observed history at the previous scan, 13 at this one. The score rises as the window fills, whether or not the server changes.
- 28 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 33 to 37. That category is still filling its 30-day observation window: 10 days of observed history at the previous scan, 11 at this one. The score rises as the window fills, whether or not the server changes.
- 26 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 27 to 30. That category is still filling its 30-day observation window: 8 days of observed history at the previous scan, 9 at this one. The score rises as the window fills, whether or not the server changes.
- 24 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 20 to 23. That category is still filling its 30-day observation window: 6 days of observed history at the previous scan, 7 at this one. The score rises as the window fills, whether or not the server changes.
- 22 Oct 26 +3
- Stability: unverified → 0.17 ▲ functional
- 18 Oct 26 +15
- Malware scan: unverified → pass ▲ security
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 4 Nov 2026 · Analysed npm/@misarseo/mcp@1.0.0
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | npm |
Background: How many MCP packages publish verified provenance →
Dependencies 92 packages
| Packages resolved | 92 |
|---|---|
| Stale | 30 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
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 →
add_competitor_monitor ~206
Start monitoring one competitor page for changes: title/meta, a real line-level content diff (added/removed/unchanged line counts — never a fabricated similarity score), outbound links, and structured-data types. Checked once a day; the first snapshot is captured on the NEXT scheduled pass, not immediately. FREE — this codebase's own SSRF-safe fetch, no paid provider. Idempotent (re-adding an already-tracked URL is a no-op). A project can monitor at most 20 URLs.
| Name | Type | Req | Description |
|---|---|---|---|
| label | string | – | Optional human-readable label, e.g. 'Acme pricing page'. |
| projectId | string | yes | Required. The MisarSEO project ID to scope this call to. Get one from list_projects. |
| url | string | yes | The specific competitor page URL to monitor — not a domain to crawl. Normalised and SSRF-validated server-side; a URL resolving to a private/loopback/metadata address is rejected. |
No output schema declared.
No examples provided.
add_disavow_entry ~233
Disavow file management: mark one URL or domain for disavowal. FREE (no credits), but this is a MUTATION. entryType 'url' disavows exactly that page (value must be a full absolute URL); entryType 'domain' disavows the whole domain AND its subdomains (value is a bare host, no scheme) — per Google's own documented disavow-file format, there is no way to disavow just a subpath.
| Name | Type | Req | Description |
|---|---|---|---|
| entryType | string | yes | 'url' disavows one page; 'domain' disavows the whole domain and its subdomains. |
| note | string | – | Optional reason, written as a comment above the entry in the exported file. |
| projectId | string | yes | Required. The MisarSEO project ID to scope this call to. Get one from list_projects. |
| source | string | – | Where this entry came from. Defaults to 'manual'. |
| value | string | yes | A full absolute URL for entryType 'url'; a bare domain (no scheme) for entryType 'domain'. |
No output schema declared.
No examples provided.
add_link_prospect ~212
Link Building Tool: add one prospect domain/page to a project's list. FREE (no credits), but this is a MUTATION. White-hat scope: contact fields are plain manually-typed free text — NEVER auto-scraped or guessed. New prospects start at status 'prospected'; use update_link_prospect_status to move them through the pipeline.
| Name | Type | Req | Description |
|---|---|---|---|
| contactEmail | string | – | – |
| contactName | string | – | – |
| contactNotes | string | – | – |
| domain | string | yes | Bare domain, e.g. example.com. |
| label | string | – | – |
| note | string | – | Optional first activity-log entry, e.g. 'Found via competitor backlink profile.' |
| projectId | string | yes | Required. The MisarSEO project ID to scope this call to. Get one from list_projects. |
| targetUrl | string | – | The project's OWN page this outreach is trying to get linked. |
| url | string | – | Optional specific page on domain, a full absolute URL. |
No output schema declared.
No examples provided.
add_link_prospect_note ~106
Link Building Tool: add one manual activity-log entry to a prospect, e.g. "emailed on 9/5" or "follow-up sent". FREE (no credits), but this is a MUTATION.
| Name | Type | Req | Description |
|---|---|---|---|
| note | string | yes | – |
| projectId | string | yes | Required. The MisarSEO project ID to scope this call to. Get one from list_projects. |
| prospectId | string | yes | Prospect id, from list_link_prospects. |
No output schema declared.
No examples provided.
add_portfolio_projects ~107
Adds projects to a portfolio. Returns `{ added }` — only ids that resolve to a project of the CALLER'S organization are added; any other id is silently dropped rather than erroring the whole call. FREE: database only, no SEO data provider is called and no credits are spent.
| Name | Type | Req | Description |
|---|---|---|---|
| portfolioId | string | yes | Portfolio ID. Use list_portfolios to find it. |
| projectIds | array | yes | MisarSEO project IDs. Use list_projects to find them. |
No output schema declared.
No examples provided.
add_rank_annotation ~147
Adds a chart note to a rank tracker's own timeline. FREE: database only, no SEO data provider is called and no credits are spent. Config-level, not per-keyword or per-device. A config can hold at most 100 notes.
| Name | Type | Req | Description |
|---|---|---|---|
| configId | string | yes | Rank tracker config ID. Call get_rank_tracker without a trackerId to list the project's trackers and their IDs. |
| date | string | yes | UTC day the note applies to, YYYY-MM-DD. |
| label | string | yes | What happened, 1-200 characters. |
| projectId | string | yes | Required. The MisarSEO project ID to scope this call to. Get one from list_projects. |
No output schema declared.
No examples provided.
add_rank_tracking_keywords ~207
Adds keywords to an existing rank tracker config. Returns `{ added, addedIds }` — `added` counts only genuinely new keywords; anything already tracked for this config is silently skipped, so `added` can legitimately be lower than the number of keywords sent. FREE: database only, no SEO data provider is called and no credits are spent — but this CAN fail with a plan-limit error if adding these keywords would put the organization over its plan tier's rank-tracked-keywords cap, since that is a count limit, not a spend limit. This does not trigger a rank check or refresh keyword metrics — call get_rank_tracker afterward once you want positions.
| Name | Type | Req | Description |
|---|---|---|---|
| configId | string | yes | Rank tracker config ID. |
| keywords | array | yes | 1-100 keywords to add. Duplicates of already-tracked keywords are silently skipped. |
| projectId | string | yes | Required. The MisarSEO project ID to scope this call to. Get one from list_projects. |
No output schema declared.
No examples provided.
batch_draft_patches ~136
Patches: AI-drafts title AND metaDescription for up to 10 pages in one call. This is a MUTATION and costs one AI-gateway operation per field per page (up to 20) — never a bulk discount. One page/field failing is reported in that entry's own error without sinking the rest of the batch. Requires an org admin.
| Name | Type | Req | Description |
|---|---|---|---|
| pageUrls | array | yes | 1-10 crawled page URLs to draft title+metaDescription patches for. |
| projectId | string | yes | Required. The MisarSEO project ID to scope this call to. Get one from list_projects. |
No output schema declared.
No examples provided.
capture_domain_authority_snapshot ~156
Capture a domain-authority snapshot now: calls the same free resolver get_domain_overview already uses and records today's reading, so get_domain_authority_history has a trend to read back. FREE (no credits), but this is a MUTATION — idempotent per UTC day, so calling it twice in one day does not write twice. Useful for a domain get_domain_overview would not auto-capture on its own — e.g. a tracked competitor rather than the project's own domain.
| Name | Type | Req | Description |
|---|---|---|---|
| domain | string | yes | Domain to capture a snapshot for (e.g. 'example.com'). |
| projectId | string | yes | Required. The MisarSEO project ID to scope this call to. Get one from list_projects. |
No output schema declared.
No examples provided.
classify_keyword_intent ~173
Classify 1-200 keywords' search intent from their wording: informational, navigational, commercial, transactional, or unknown. Uses the SAME wording heuristic keyword research already applies as its free-tier fallback, made directly callable for a keyword list with no research/volume data yet. FREE and purely local: no upstream call, no billing, no market dependency. Navigational detection is limited to destination/account phrasing ("login", "official website", ...) that means the same thing regardless of brand — a brand-name navigational query with no such phrasing classifies as `unknown` rather than a guessed label.
| Name | Type | Req | Description |
|---|---|---|---|
| keywords | array | yes | 1-200 keywords to classify. |
| projectId | string | yes | Required. The MisarSEO project ID to scope this call to. Get one from list_projects. |
No output schema declared.
No examples provided.
compare_ai_competitor_positioning ~343
Runs ONE prompt through the explore_ai_prompt pipeline and checks a brand plus its named competitors against the SAME real per-model answers for mentions and citations. Bounded scope, stated plainly: this is what one prompt's observed answers show for the named entities — never a comprehensive cross-prompt visibility score. `mentionedByCount` / `citedByCount` are raw counts out of `successfulModelCount`, never a percentage or ranking. `entities[0]` is always the target brand; the rest are the competitors in submitted order. A model that failed upstream reports `status: "error"` with `mentioned`/`cited: null` for every entity — null, not false, because that model was never checked. REQUIRES A PAID PLAN and CHARGES the same as explore_ai_prompt for the requested models; comparing more competitors against that one set of answers costs nothing extra.
| Name | Type | Req | Description |
|---|---|---|---|
| brand | string | yes | The target brand, domain or product checked in each answer. |
| competitors | array | yes | 1-5 competitor brands/domains checked against the same answers. |
| models | array | yes | 1-4 model personas, as for explore_ai_prompt (persona labels, not vendor-verified models). |
| projectId | string | yes | Required. The MisarSEO project ID to scope this call to. Get one from list_projects. |
| prompt | string | yes | The one prompt every requested model answers. |
| webSearch | boolean | – | Ground the answers in a real retrieval pass with cited sources. Defaults to true. |
| webSearchCountryCode | string | – | Two-letter country the retrieval pass searches from. |
No output schema declared.
No examples provided.
create_gbp_post ~125
Publishes a new "What's New" post on the linked Google Business Profile location. It goes LIVE and PUBLIC immediately — there is no draft state and no undo here. Show the user the exact text and get their explicit approval before calling. Only standard posts are supported (no event, offer or alert fields).
| Name | Type | Req | Description |
|---|---|---|---|
| languageCode | string | – | Language of the post. Defaults to en. |
| projectId | string | yes | Required. The MisarSEO project ID to scope this call to. Get one from list_projects. |
| summary | string | yes | The post text. |
No output schema declared.
No examples provided.
create_local_pack_rank_config ~172
Creates a local pack rank check config: where businessName sits in Google's local pack for one keyword at one location. The location is composed into the query as "<keyword> in <locationLabel>" — not geocoded. Run checks with run_local_pack_rank_check and read them with get_local_pack_rank. FREE: database only.
| Name | Type | Req | Description |
|---|---|---|---|
| businessName | string | yes | The business name as it appears on Google. |
| keyword | string | yes | The search keyword, e.g. 'coffee shop'. |
| languageCode | string | – | Search language code. |
| locationLabel | string | yes | Place appended to the query, e.g. 'Shoreditch, London'. |
| projectId | string | yes | Required. The MisarSEO project ID to scope this call to. Get one from list_projects. |
No output schema declared.
No examples provided.
create_local_rank_grid_config ~221
Creates a geo-grid rank-tracking config: a 3x3 grid of points around a centre coordinate, checking ORGANIC rank for one keyword and domain from each point. centerLabel must name the place the grid is centred on — a heatmap with no stated centre is a claim about nowhere. Run it with run_local_rank_grid and read it with get_local_rank_grid. FREE: database only.
| Name | Type | Req | Description |
|---|---|---|---|
| centerLabel | string | yes | What the centre point is called, e.g. 'Manchester city centre'. |
| centerLat | number | yes | Latitude of the grid centre. |
| centerLng | number | yes | Longitude of the grid centre. |
| domain | string | yes | Domain whose organic rank is checked. |
| keyword | string | yes | The search keyword. |
| languageCode | string | – | Search language code. |
| projectId | string | yes | Required. The MisarSEO project ID to scope this call to. Get one from list_projects. |
| spacingKm | number | yes | Distance between grid points, 0.5-25 km. |
No output schema declared.
No examples provided.
create_portfolio ~63
Creates a portfolio. Returns `{ id }`. Starts with no member projects — use add_portfolio_projects next. FREE: database only, no SEO data provider is called and no credits are spent.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | Portfolio name, 1-100 characters. |
No output schema declared.
No examples provided.
create_rank_tracker ~362
Creates a rank tracker config (domain + market + devices + schedule) for a project and returns its configId. Next, add keywords with add_rank_tracking_keywords. Positions are collected by the SCHEDULED check ('daily' or 'weekly'; 'manual' means never on a schedule) and read with get_rank_tracker — nothing here triggers a check on demand. One tracker per (domain, market) per project: repeating a pair is a validation error, not a second tracker. FREE at creation: database only, no credits spent.
| Name | Type | Req | Description |
|---|---|---|---|
| competitorMoveAlertThreshold | integer|null | – | Notify when a tracked competitor gains at least this many positions. null turns it off. |
| devices | string | – | Devices to track. |
| domain | string | yes | Domain whose positions are tracked, e.g. example.com. |
| languageCode | string | – | Language code (e.g. 'en'). Omit it to use the project's default market language. |
| locationCode | integer | – | DataForSEO location code. Omit it to use the project's default market. |
| locationHint | string|null | – | Free-text city/region hint, honoured only where the SERP provider supports it. |
| newKeywordAlertEnabled | boolean | – | Notify when the domain starts ranking for a keyword it did not rank for before. |
| projectId | string | yes | Required. The MisarSEO project ID to scope this call to. Get one from list_projects. |
| rankDropAlertThreshold | integer|null | – | Notify when a keyword falls by at least this many positions. null turns it off. |
| scheduleInterval | string | – | How often the scheduled check runs. |
| serpDepth | integer | yes | How deep to search, 10-100 in steps of 10. |
No output schema declared.
No examples provided.
create_report_definition ~278
Creates a report definition with a chosen set of widgets, in print order. Returns `{ id }`. FREE: database only, no SEO data provider is called and no credits are spent.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | Report name, 1-100 characters. |
| projectId | string | yes | Required. The MisarSEO project ID to scope this call to. Get one from list_projects. |
| widgetTypes | array | yes | Widget types, in print order. Catalogue: site_health (Crawl findings and issue counts from the latest audit.); internal_linking (Orphan pages, dead ends and link depth from the latest crawl.); rank_t… |
No output schema declared.
No examples provided.
delete_brand_monitor ~82
Deletes a brand monitor, stopping its scheduled scans. Requires the admin role in the calling organization. Get the monitorId from list_brand_monitors.
| Name | Type | Req | Description |
|---|---|---|---|
| monitorId | string | yes | Brand monitor ID, from list_brand_monitors. |
| projectId | string | yes | Required. The MisarSEO project ID to scope this call to. Get one from list_projects. |
No output schema declared.
No examples provided.
delete_gbp_review_reply ~86
Removes the owner's published reply from one Google review (reviewId from get_gbp_reviews). The removal is public and immediate. Confirm with the user before calling.
| Name | Type | Req | Description |
|---|---|---|---|
| projectId | string | yes | Required. The MisarSEO project ID to scope this call to. Get one from list_projects. |
| reviewId | string | yes | Review ID, from get_gbp_reviews. |
No output schema declared.
No examples provided.
delete_local_pack_rank_config ~80
Deletes a local pack rank check config, INCLUDING its whole check history. Confirm with the user before calling.
| Name | Type | Req | Description |
|---|---|---|---|
| configId | string | yes | Config ID, from the matching get_* tool called without configId. |
| projectId | string | yes | Required. The MisarSEO project ID to scope this call to. Get one from list_projects. |
No output schema declared.
No examples provided.
delete_local_rank_grid_config ~83
Deletes a geo-grid rank-tracking config, INCLUDING its whole run and point history. Confirm with the user before calling.
| Name | Type | Req | Description |
|---|---|---|---|
| configId | string | yes | Config ID, from the matching get_* tool called without configId. |
| projectId | string | yes | Required. The MisarSEO project ID to scope this call to. Get one from list_projects. |
No output schema declared.
No examples provided.
delete_portfolio ~60
Deletes a portfolio. Member projects themselves are untouched — only the grouping is removed. FREE: database only, no SEO data provider is called and no credits are spent.
| Name | Type | Req | Description |
|---|---|---|---|
| portfolioId | string | yes | Portfolio ID. Use list_portfolios to find it. |
No output schema declared.
No examples provided.
delete_report_definition ~79
Deletes a report definition. FREE: database only, no SEO data provider is called and no credits are spent.
| Name | Type | Req | Description |
|---|---|---|---|
| projectId | string | yes | Required. The MisarSEO project ID to scope this call to. Get one from list_projects. |
| reportDefinitionId | string | yes | Report definition ID. Use list_report_definitions to find it. |
No output schema declared.
No examples provided.
delete_report_schedule ~95
Deletes a report definition's schedule. Requires the admin role in the calling organization, same as creating one. FREE: database only, no SEO data provider is called and no credits are spent.
| Name | Type | Req | Description |
|---|---|---|---|
| projectId | string | yes | Required. The MisarSEO project ID to scope this call to. Get one from list_projects. |
| reportDefinitionId | string | yes | Report definition ID. Use list_report_definitions to find it. |
No output schema declared.
No examples provided.
delete_tracked_prompt ~88
Deletes a tracked prompt, stopping its scheduled checks. Requires the admin role in the calling organization. Get the trackedPromptId from list_tracked_prompts.
| Name | Type | Req | Description |
|---|---|---|---|
| projectId | string | yes | Required. The MisarSEO project ID to scope this call to. Get one from list_projects. |
| trackedPromptId | string | yes | Tracked prompt ID, from list_tracked_prompts. |
No output schema declared.
No examples provided.
disable_patch_auto_publish ~107
Patches: stops auto-publishing freshly AI-drafted patches for this issue type — future drafts wait for a manual publish_patch call again. Already-published patches are unaffected. FREE (no credits), but this is a MUTATION. Requires an org admin.
| Name | Type | Req | Description |
|---|---|---|---|
| issueType | string | yes | Which issue type's auto-publish rule to remove. |
| projectId | string | yes | Required. The MisarSEO project ID to scope this call to. Get one from list_projects. |
No output schema declared.
No examples provided.
disconnect_ahrefs ~78
Full disconnect: drops BOTH the Rank Tracker and Site Audit bindings and the stored grant. Breaks Ahrefs data for every member of the organization, not just the caller — requires at least the admin role.
| Name | Type | Req | Description |
|---|---|---|---|
| projectId | string | yes | Required. The MisarSEO project ID to scope this call to. Get one from list_projects. |
No output schema declared.
No examples provided.
disconnect_baidu ~69
Remove a project's Baidu Webmaster connection. Breaks Baidu push submission for every member of the organization, not just the caller — requires at least the admin role.
| Name | Type | Req | Description |
|---|---|---|---|
| projectId | string | yes | Required. The MisarSEO project ID to scope this call to. Get one from list_projects. |
No output schema declared.
No examples provided.
disconnect_bing ~68
Unlink a project's Bing Webmaster site. Breaks Bing Webmaster data for every member of the organization, not just the caller — requires at least the admin role.
| Name | Type | Req | Description |
|---|---|---|---|
| projectId | string | yes | Required. The MisarSEO project ID to scope this call to. Get one from list_projects. |
No output schema declared.
No examples provided.
disconnect_ga4 ~67
Unlink a project's Google Analytics property. Breaks Analytics data for every member of the organization, not just the caller — requires at least the admin role.
| Name | Type | Req | Description |
|---|---|---|---|
| projectId | string | yes | Required. The MisarSEO project ID to scope this call to. Get one from list_projects. |
No output schema declared.
No examples provided.
disconnect_gbp ~82
Removes the project's link to its Google Business Profile location. Only MisarSEO's own record of the link is removed — the location on Google is untouched — but every GBP tool stops working for the project until it is linked again.
| Name | Type | Req | Description |
|---|---|---|---|
| projectId | string | yes | Required. The MisarSEO project ID to scope this call to. Get one from list_projects. |
No output schema declared.
No examples provided.
disconnect_yandex ~70
Unlink a project's Yandex Webmaster host. Breaks Yandex Webmaster data for every member of the organization, not just the caller — requires at least the admin role.
| Name | Type | Req | Description |
|---|---|---|---|
| projectId | string | yes | Required. The MisarSEO project ID to scope this call to. Get one from list_projects. |
No output schema declared.
No examples provided.
draft_patch ~231
Patches: drafts a title/metaDescription/canonical/redirect fix for one page's finding. FREE for canonical/redirect (deterministic — canonical is always the page's own URL, redirect always needs an explicit value); title/metaDescription cost one AI-gateway operation UNLESS `value` is given, which sets an explicit replacement instead of drafting one. This is a MUTATION — it creates or overwrites this page+field's draft, but does not publish it (use publish_patch for that). Requires an org admin.
| Name | Type | Req | Description |
|---|---|---|---|
| issueType | string | yes | Which finding this patch addresses — determines the field (title/metaDescription/canonical/redirect). |
| pageUrl | string | yes | The exact crawled page URL this finding is on. |
| projectId | string | yes | Required. The MisarSEO project ID to scope this call to. Get one from list_projects. |
| value | string | – | An explicit replacement value instead of AI-drafting one. Required for redirect (broken_page) — there is no computable default. Never used for canonical, which is always the page's own URL. |
No output schema declared.
No examples provided.
enable_patch_auto_publish ~141
Patches: from now on, a freshly AI-drafted patch for this issue type publishes immediately instead of waiting for a manual publish_patch call — capped at 20 auto-publishes per project per day. A hand-typed replacement value (draft_patch's `value` argument) is NEVER auto-published regardless of this rule. FREE (no credits), but this is a MUTATION. Requires an org admin.
| Name | Type | Req | Description |
|---|---|---|---|
| issueType | string | yes | Which finding type to auto-publish AI-drafted patches for. |
| projectId | string | yes | Required. The MisarSEO project ID to scope this call to. Get one from list_projects. |
No output schema declared.
No examples provided.
explore_ai_prompt ~347
Runs one prompt through up to 4 model personas and returns each answer verbatim, with real citations when webSearch is on. The four persona labels (chat_gpt/claude/gemini/perplexity) are NOT vendor-verified — none is guaranteed to be that vendor's own model; 'claude' and 'perplexity' in particular have no real vendor route at all. Treat every answer as 'a model answering as X', never as ground truth from X. REQUIRES A PAID PLAN and CHARGES one shared AI-gateway operation per call (not per model) — plus one more if analyzeSentiment and highlightBrand are BOTH set.
| Name | Type | Req | Description |
|---|---|---|---|
| analyzeSentiment | boolean | – | Classify sentiment toward highlightBrand in each answer. Requires highlightBrand. Spends one EXTRA AI-gateway operation on top of the base call — never charged unless both this and highlightBrand are… |
| highlightBrand | string | – | A brand/entity name to highlight mentions of in each answer. Required for analyzeSentiment. |
| models | array | yes | 1-4 model personas to answer the prompt (chat_gpt, claude, gemini, perplexity). See this tool's own description for what these labels do and do not guarantee. |
| projectId | string | yes | Required. The MisarSEO project ID to scope this call to. Get one from list_projects. |
| prompt | string | yes | The prompt to send to each requested model. |
| webSearch | boolean | – | Ground the answer in a real retrieval pass with cited sources, shared across every requested persona. Defaults to true. |
| webSearchCountryCode | string | – | – |
No output schema declared.
No examples provided.
export_disavow_file ~130
Disavow file management: export a project's disavow entries as the exact .txt content Google's disavow tool accepts (support.google.com/webmasters/answer/2648487) — one bare URL per line to disavow that exact page, or `domain:<host>` to disavow an entire domain and its subdomains. FREE (no credits). Save `fileContent` to a .txt file as-is (UTF-8).
| Name | Type | Req | Description |
|---|---|---|---|
| projectId | string | yes | Required. The MisarSEO project ID to scope this call to. Get one from list_projects. |
No output schema declared.
No examples provided.
export_link_prospects_csv ~74
Link Building Tool: export a project's prospect list as CSV text. FREE (no credits). Save `csvContent` to a .csv file as-is (UTF-8).
| Name | Type | Req | Description |
|---|---|---|---|
| projectId | string | yes | Required. The MisarSEO project ID to scope this call to. Get one from list_projects. |
No output schema declared.
No examples provided.
find_serp_competitors ~588
Compares domains competing in search results for a supplied keyword set. Useful for market and search-intelligence reports; not radius-based local SEO. The inverse of get_keyword_gap, which asks what one competitor ranks for that we do not. CHARGES CREDITS ON THE PAID DATA PROVIDER, which is also the only one that honours `resultTypes` and `includeSubdomains` and that measures `visibility`, `etv` and `rating`. On the default free provider competitors are aggregated from one live SERP per keyword: NOTHING IS CHARGED, only ORGANIC results are counted whatever `resultTypes` says, `includeSubdomains` is ignored, and visibility/traffic-estimate/rating are left unmeasured. Sorting never treats an unmeasured field as zero: rows the provider did not measure sort last and are reported in `unmeasuredForSort`. If that count equals the row count, the list is NOT ranked by anything — say so instead of presenting the first row as the strongest competitor. Omit `locationCode`/`languageCode` to use the project's default market.
| Name | Type | Req | Description |
|---|---|---|---|
| excludeDomains | array | – | Domains to exclude from results (e.g. the user's own site). |
| includeSubdomains | boolean | – | Count subdomains as part of the same competitor domain. |
| keywords | array | yes | Keywords whose SERPs are compared (1-100). |
| languageCode | string | – | Language code (e.g. 'en', 'es', 'fr'). Omit it to use the project's default market language, which falls back to 'en'. |
| limit | integer | – | Maximum competitors to return (1-100). Defaults to 50. |
| locationCode | integer | – | 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… |
| offset | integer | – | Rows to skip for pagination. |
| projectId | string | yes | Required. The MisarSEO project ID to scope this call to. Get one from list_projects. |
| resultTypes | array | – | SERP result types to include. Defaults to organic and local_pack. |
| sortBy | string | – | Sort order for returned competitors. Defaults to visibility. Only `keyword_count` and `avg_position` are measured on every provider — `visibility` and `traffic_estimate` are unmeasured on the free pr… |
No output schema declared.
No examples provided.
get_audit_comparison ~271
Compare a site audit against an earlier one: which issues are new, which were fixed, how many persist, and the health-score delta. Only pages BOTH crawls visited are compared, so a shorter crawl never reports the pages it missed as fixed — those are reported separately as notComparableCount. `newIssues` only ever covers an existing page newly showing a finding, never a brand-new page's own findings (those fold into notComparableCount/addedUrlCount instead, since a page neither crawl could compare has no meaningful 'new' vs. 'always there' answer). Returns an error when there is no earlier completed audit to compare against. Free — charges no credits.
| Name | Type | Req | Description |
|---|---|---|---|
| auditId | string | yes | Audit ID to compare, from crawl_site or get_crawl_results. |
| baselineAuditId | string | – | Audit ID to compare against. OMIT IT unless you have a reason: omitting picks the COMPLETED run immediately before auditId, while a baseline named here is used as given with no completed-status check… |
| projectId | string | yes | Required. The MisarSEO project ID to scope this call to. Get one from list_projects. |
No output schema declared.
No examples provided.
get_audit_core_web_vitals ~257
Core Web Vitals report: LCP/INP/CLS per page/strategy this audit already ran Lighthouse against, classified against Google's own published thresholds. No new fetch — reads audit_lighthouse_results, the same table the results UI already renders as raw numbers. LAB DATA ONLY, never Search Console's real Chrome UX Report (CrUX) field data — every number is a single simulated Lighthouse run, not an aggregated real-user measurement. This codebase's audit pipeline runs local headless Chrome as its PRIMARY path, so CrUX field data is not reliably available for any given page. ALWAYS narrow on `state` first: `no_lighthouse_data` (this audit has no Lighthouse rows at all — an absence of data, NOT every page passing) or `analysed`. Errors when no audit with that id belongs to the project. `pages[].allGood` is true only when all three metrics were measured AND all three are "good". Free — charges no credits.
| Name | Type | Req | Description |
|---|---|---|---|
| auditId | string | yes | Audit ID, from crawl_site or get_crawl_results. |
| projectId | string | yes | Required. The MisarSEO project ID to scope this call to. Get one from list_projects. |
No output schema declared.
No examples provided.
get_audit_https_report ~271
HTTPS Report: percentage of pages secure, mixed-content and insecure-link counts, homepage HTTPS-path status, and HTTP URLs in an HTTPS site's sitemap — for a project's latest completed crawl (or a named earlier one). Derives entirely from already-computed crawl data — no new work at read time. SOCKET-LEVEL TLS CHECKS STAY EXPLICITLY UNBUILT: expiring/expired certificate, old security protocol, incorrect certificate name, and subdomains without SNI/HSTS all need a real TLS handshake this fetch-based crawler does not make. `notDerivable` lists these with the reason. `homepageStatus.redirectsToHttps` is null (not measured), never assumed healthy, unless a standalone fetch actually observed a failure — this report cannot distinguish "checked and fine" from "never checked" from stored issue rows alone. ALWAYS narrow on `state` first: `no_audit` (no completed crawl yet), `analysed`. Free — charges no credits, makes no external call.
| Name | Type | Req | Description |
|---|---|---|---|
| auditId | string | – | Audit ID, from crawl_site or get_crawl_results. Omitted means the latest completed audit for this project. |
| projectId | string | yes | Required. The MisarSEO project ID to scope this call to. Get one from list_projects. |
No output schema declared.
No examples provided.
get_audit_internal_links ~281
Internal Link Report: outbound/inbound internal link counts per page, orphan pages, dead ends, and click-depth distribution for a project's latest completed crawl (or a named earlier one). No new computation — reads the same audit_pages/audit_issues columns already powering the in-app internal-links page. INTERNAL LINKS ONLY. External links are explicitly out of scope: an external link graph needs data this codebase does not collect. `totals.externalLinkOccurrences` is the one external-facing number here — a raw per-page outbound tally, never a graph. ALWAYS narrow on `state` first: `no_audit` (no completed crawl yet), `signal_not_captured` (a crawl exists but its link counts predate the inbound-link/click-depth migration or were otherwise never computed — an absence of data, NOT a site with no internal links), `analysed`. `notDerivable` is returned with every state and lists what this report can never compute from what is stored, and why. Free — charges no credits, makes no external call.
| Name | Type | Req | Description |
|---|---|---|---|
| auditId | string | – | Audit ID, from crawl_site or get_crawl_results. Omitted means the latest completed audit for this project. |
| projectId | string | yes | Required. The MisarSEO project ID to scope this call to. Get one from list_projects. |
No output schema declared.
No examples provided.
get_audit_structured_data ~285
Structured Data Report: pages grouped by schema.org @type, which pages have none, and which pages carry an unparseable JSON-LD block — for a project's latest completed crawl (or a named earlier one). Derives entirely from structured data already extracted at crawl time — no new crawl-time work. PRESENCE AND PARSE VALIDITY, NOT A RICH-RESULTS ELIGIBILITY CHECK. Only `typeGroups[].invalidCount` on the BreadcrumbList group is a real, verified per-type validity verdict; every other type reports only whether pages declare it and whether ANY block on the page failed to parse (page-level — never attributable to one type when a page declares several). ALWAYS narrow on `state` first: `no_audit` (no completed crawl yet), `analysed` (`typeGroups: []` means every page was measured and none declared any structured data — a real finding, not a withheld section). `notDerivable` lists what this report can never compute, and why. Free — charges no credits, makes no external call.
| Name | Type | Req | Description |
|---|---|---|---|
| auditId | string | – | Audit ID, from crawl_site or get_crawl_results. Omitted means the latest completed audit for this project. |
| projectId | string | yes | Required. The MisarSEO project ID to scope this call to. Get one from list_projects. |
No output schema declared.
No examples provided.
get_backlink_anchors ~282
Anchor-text distribution for a domain or URL, one page at a time: which anchor texts link to it, with backlinks, referring domains, referring pages and dofollow links per anchor. This is what reveals an over-optimised profile (one exact-match commercial phrase dominating) or a hacked one (pharma/casino anchors nobody wrote) — both invisible link by link. CHARGES CREDITS ON THE PAID DATA PROVIDER (~200-500 typical). UNAVAILABLE ON THE DEFAULT FREE DATA PROVIDER, like the rest of the backlinks surface: SEO_DATA_UNAVAILABLE there means the question was never asked, never an empty distribution. There is deliberately no spam-score column — an averaged spam score is not a spam score.
| Name | Type | Req | Description |
|---|---|---|---|
| page | integer | – | 1-based page number. Defaults to 1. |
| pageSize | integer | – | Rows per page. Defaults to 100. |
| projectId | string | yes | Required. The MisarSEO project ID to scope this call to. Get one from list_projects. |
| scope | string | – | Whether target is a whole domain or one page. Defaults to domain. |
| sortField | string | – | Sort column. Defaults to backlinks. |
| sortOrder | string | – | Sort direction. Defaults to desc. |
| target | string | yes | Domain or URL whose inbound anchor texts to list. |
No output schema declared.
No examples provided.
get_backlinks_overview ~281
Returns a backlinks profile summary (total backlinks, referring domains, referring pages, rank) plus the top referring domains by backlink count. CHARGES CREDITS ON THE PAID DATA PROVIDER (~200-500 typical): two lookups per call, the summary and one page of referring domains. UNAVAILABLE ON THE DEFAULT FREE DATA PROVIDER: a backlink graph needs a proprietary web-scale crawl index, so every method of this surface throws SEO_DATA_UNAVAILABLE there and nothing is charged. That error means the question was never asked — never report it as a site with no backlinks. Self-hosted deployments also need the Backlinks API enabled on their DataForSEO account. The two halves count DIFFERENT populations: the summary totals are unfiltered, while the referring-domain list has domains above the spam-score threshold filtered out. Do not present the listed domains as the top slice of the summary total, and do not subtract one from the other.
| Name | Type | Req | Description |
|---|---|---|---|
| projectId | string | yes | Required. The MisarSEO project ID to scope this call to. Get one from list_projects. |
| scope | string | – | 'domain' analyzes the whole domain; 'page' analyzes a specific URL. Defaults to 'domain'. |
| target | string | yes | Domain or URL to analyze (e.g. 'example.com' or 'https://example.com/blog'). |
No output schema declared.
No examples provided.
get_baidu_connection ~121
The project's current Baidu Webmaster (百度搜索资源平台) connection, plus today's push-quota usage. `today.lastRemain` is Baidu's own authoritative remaining-quota count as of the last push (null until the first push of the day) — `today.assumedDailyQuota` is a courtesy default only, never a real ceiling, since Baidu computes quota per-site dynamically and publishes no fixed number.
| Name | Type | Req | Description |
|---|---|---|---|
| projectId | string | yes | Required. The MisarSEO project ID to scope this call to. Get one from list_projects. |
No output schema declared.
No examples provided.
get_bing_backlinks ~179
GetLinkCounts: own-site inbound-link page list for a project's matched Bing site — the focused, single-call form of the backlinks field already embedded in get_bing_site_overview. 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.
| Name | Type | Req | Description |
|---|---|---|---|
| page | integer | – | 0-based page of Bing's own pagination (default 0). |
| projectId | string | yes | Required. The MisarSEO project ID to scope this call to. Get one from list_projects. |
No output schema declared.
No examples provided.
get_bing_detail_stats ~305
GetQueryTrafficStats + GetPageStats + GetPageQueryStats + GetQueryPageStats + GetQueryPageDetailStats: per-query and per-page search-performance detail for a project's matched Bing site. FREE (no credits). pageStats (site-wide, weekly) is always attempted. queryTrafficStats/queryPageStats are null unless `query` is given; pageQueryStats is null unless `pageUrl` is given; queryPageDetailStats is null unless both are given — a null section absent from `errors` was not requested, not a failure. pageStats carries one unresolved caveat: Microsoft's own doc page is internally inconsistent about whether that method's `query` field on each row holds a query string or a page URL — surfaced as-is. 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.
| Name | Type | Req | Description |
|---|---|---|---|
| pageUrl | string | – | The page to fetch query stats for. Required for pageQueryStats (and, with query, queryPageDetailStats). |
| projectId | string | yes | Required. The MisarSEO project ID to scope this call to. Get one from list_projects. |
| query | string | – | The search query to fetch traffic/page stats for. Required for queryTrafficStats/queryPageStats (and, with pageUrl, queryPageDetailStats). |
No output schema declared.
No examples provided.
get_bing_feed_details ~140
GetFeedDetails: the same Feed shape as one entry from Bing's GetFeeds list, for one specific feed URL on a project's matched site. FREE (no credits), read-only. 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.
| Name | Type | Req | Description |
|---|---|---|---|
| feedUrl | string | yes | Absolute URL of the previously-submitted sitemap/feed. |
| projectId | string | yes | Required. The MisarSEO project ID to scope this call to. Get one from list_projects. |
No output schema declared.
No examples provided.
get_bing_keyword_research ~231
GetKeyword + GetKeywordStats + GetRelatedKeywords: real Bing impression data for a query, its recent weekly history, and related queries — read straight from the Bing Webmaster API. FREE (no credits). Unlike derived/estimated keyword metrics, these numbers come from Bing's own search-impression logs. 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.
| Name | Type | Req | Description |
|---|---|---|---|
| country | string | – | Two-letter country code, e.g. 'us'. |
| endDate | string | – | YYYY-MM-DD. Applies to keyword/relatedKeywords only. |
| language | string | – | Language-region code, e.g. 'en-US'. |
| projectId | string | yes | Required. The MisarSEO project ID to scope this call to. Get one from list_projects. |
| query | string | yes | The search query to research. |
| startDate | string | – | YYYY-MM-DD. Applies to keyword/relatedKeywords only. |
No output schema declared.
No examples provided.
How do I install the MisarSEO MCP Server server?
MisarSEO MCP Server runs locally as an npm package, launched with npx -y @misarseo/mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
npm · @misarseo/mcp
claude mcp add misar-ai-misarseo-mcp -- npx -y @misarseo/mcp
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 npm package (@misarseo/mcp).
Is the MisarSEO MCP Server server safe to use?
MisarSEO MCP Server scores 79 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 4 November 2026. It declares no install or post-install scripts. 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.
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 4 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the MisarSEO MCP Server server under?
MisarSEO MCP Server declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.