{"$schema":"https://verifymcp.io/schemas/trust-report.json","schemaVersion":1,"license":{"name":"CC BY-NC 4.0","url":"https://creativecommons.org/licenses/by-nc/4.0/"},"generatedAt":"2026-11-06T00:43:54.101Z","url":"https://verifymcp.io/servers/puneetindersingh-open-seo-crawler/open-seo-crawler-mcp","markdownUrl":"https://verifymcp.io/servers/puneetindersingh-open-seo-crawler/open-seo-crawler-mcp.md","server":{"slug":"puneetindersingh-open-seo-crawler","name":"Open SEO Crawler","registryName":"io.github.puneetindersingh/open-seo-crawler","description":"Self-hosted SEO crawler: run site audits and AI crawler checks, then read the issues and pages.","registryStatus":"active","deletedAt":null,"statusMessage":null,"liveness":"live","publisher":{"class":"unknown","claimed":false}},"component":{"slug":"open-seo-crawler-mcp","type":"mcpb","identifier":"https://github.com/puneetindersingh/open-seo-crawler/releases/download/mcp-v1.0.0/open-seo-crawler-mcp.mcpb","withdrawn":false,"url":"https://verifymcp.io/servers/puneetindersingh-open-seo-crawler/open-seo-crawler-mcp","version":"1.0.0","transport":"stdio","scoredAt":"2026-11-05T05:22:03.300Z"},"score":{"total":50,"tier":"low","status":"scored","weekDelta":3,"history":[{"date":"2026-11-05","total":50},{"date":"2026-11-04","total":49},{"date":"2026-11-03","total":49},{"date":"2026-11-02","total":49},{"date":"2026-11-01","total":48},{"date":"2026-10-31","total":48},{"date":"2026-10-30","total":47},{"date":"2026-10-29","total":47},{"date":"2026-10-28","total":46},{"date":"2026-10-27","total":46},{"date":"2026-10-26","total":45},{"date":"2026-10-25","total":45},{"date":"2026-10-24","total":44},{"date":"2026-10-23","total":44},{"date":"2026-10-22","total":41},{"date":"2026-10-21","total":41},{"date":"2026-10-20","total":41},{"date":"2026-10-19","total":41},{"date":"2026-10-18","total":41},{"date":"2026-10-17","total":41},{"date":"2026-10-16","total":41}]},"categories":[{"name":"Supply Chain Security","score":0,"verdict":"unverified","reasons":["No malware scan is available for this kind of package: the supply-chain vendors we use do not cover it. This is a permanent gap in our coverage, not a finding about the package.","Known CVEs could not be checked: we found no dependency list to check in this bundle: either it runs a compiled binary, whose bundled manifests we do not read, or none of the package.json, requirements.txt, pyproject.toml or uv.lock files it ships for its runtime declares a dependency we can read (a requirements.txt that only points at a setup.py project, a local path, or a nested requirements file we cannot follow counts as none).","Install-script risk not yet assessed.","Dependency health could not be checked: we found no dependency list to check in this bundle: either it runs a compiled binary, whose bundled manifests we do not read, or none of the package.json, requirements.txt, pyproject.toml or uv.lock files it ships for its runtime declares a dependency we can read (a requirements.txt that only points at a setup.py project, a local path, or a nested requirements file we cannot follow counts as none)."],"codes":[{"code":"supplychain.malware_inconclusive","args":{"reason":"ecosystem_unsupported"}},{"code":"cve.inconclusive","args":{"reason":"no_manifest_bundled"}},{"code":"installscript.inconclusive","args":{"reason":"no_install_concept"}},{"code":"dephealth.inconclusive","args":{"reason":"no_manifest_bundled"}}]},{"name":"Provenance & Transparency","score":45,"verdict":"fail","reasons":["Source repository is publicly reachable at the declared URL.","Provenance check failed: no build-provenance attestation is published.","Clear OSI-approved license (MIT).","Actively maintained (last published 20 days ago).","Disclosure check failed: no security disclosure policy was found in the source repository."],"codes":[{"code":"provenance.repo_verified","args":{}},{"code":"provenance.none","args":{}},{"code":"license.osi","args":{"spdx":"MIT"}},{"code":"maintenance.recent","args":{"age_days":"20"}},{"code":"disclosure.absent","args":{}}]},{"name":"Schema Quality & AI Usability","score":78,"verdict":"fail","reasons":["100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).","AI-judged instruction clarity (good).","Context-footprint check failed: tool/resource definitions use about 1675 tokens (~128/item across 13 items; 13 tools + 0 resources), over budget; trim descriptions and params.","Usage-examples check failed: none of the tools include examples."],"codes":[{"code":"schema.descriptions","args":{"pct":"100"}},{"code":"schema.ai_quality","args":{"band":"good"}},{"code":"schema.footprint_heavy","args":{"avg":"128","items":"13","tools":"13","tokens":"1675","resources":"0"}},{"code":"schema.examples_absent","args":{}}]},{"name":"Stability & Change Management","score":67,"verdict":"partial","reasons":["Stability observed for 20 of 30 days with no destabilising changes; credit accrues until the full window elapses."],"codes":[{"code":"stability.building_history","args":{"days":"20"}}]},{"name":"Tool Coverage","score":94,"verdict":"partial","reasons":["100% of tools have a non-trivial description (not blank, and not just the tool's name).","81% of tool parameters carry a description."],"codes":[{"code":"toolquality.descriptions","args":{"pct":"100"}},{"code":"toolquality.param_docs","args":{"pct":"81"}}]},{"name":"Tool Safety","score":100,"verdict":"pass","reasons":["No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.","We read all 13 captured tool definition(s), and no name or description among them implies an irreversible operation.","An AI judge read all 14 captured unit(s) of tool text and found none that tries to manipulate the model reading it."],"codes":[{"code":"toolsafety.injection_clean","args":{}},{"code":"toolsafety.destructive_none","args":{"tools":"13"}},{"code":"toolsafety.manipulation_clean","args":{"units":"14","judged":"14"}}]},{"name":"Capabilities","score":100,"verdict":"pass","reasons":["Implements a current MCP spec version (2026-07-28)."],"codes":[{"code":"protocol.current","args":{"version":"2026-07-28"}}]}],"inconclusive":["No malware scan is available for this kind of package: the supply-chain vendors we use do not cover it. This is a permanent gap in our coverage, not a finding about the package.","Known CVEs could not be checked: we found no dependency list to check in this bundle: either it runs a compiled binary, whose bundled manifests we do not read, or none of the package.json, requirements.txt, pyproject.toml or uv.lock files it ships for its runtime declares a dependency we can read (a requirements.txt that only points at a setup.py project, a local path, or a nested requirements file we cannot follow counts as none).","Install-script risk not yet assessed.","Dependency health could not be checked: we found no dependency list to check in this bundle: either it runs a compiled binary, whose bundled manifests we do not read, or none of the package.json, requirements.txt, pyproject.toml or uv.lock files it ships for its runtime declares a dependency we can read (a requirements.txt that only points at a setup.py project, a local path, or a nested requirements file we cannot follow counts as none)."],"malware":[],"components":[{"slug":"open-seo-crawler-mcp","type":"mcpb","identifier":"https://github.com/puneetindersingh/open-seo-crawler/releases/download/mcp-v1.0.0/open-seo-crawler-mcp.mcpb","withdrawn":false,"score":50,"current":true,"url":"https://verifymcp.io/servers/puneetindersingh-open-seo-crawler/open-seo-crawler-mcp","markdownUrl":"https://verifymcp.io/servers/puneetindersingh-open-seo-crawler/open-seo-crawler-mcp.md"}],"facts":[{"label":"Registry","value":"mcpb"},{"label":"Package","value":"https://github.com/puneetindersingh/open-seo-crawler/releases/download/mcp-v1.0.0/open-seo-crawler-mcp.mcpb"},{"label":"Version","value":"1.0.0"},{"label":"Transport","value":"stdio"},{"label":"SHA-256","value":"b858e554bd585e919f3eefe4e74dfb37324dba9ddc29c37fbcf86d6e25c836e3"}],"install":{"available":true,"bundleSha256":"b858e554bd585e919f3eefe4e74dfb37324dba9ddc29c37fbcf86d6e25c836e3"},"tools":[{"name":"start_crawl","title":"Start a crawl","description":"Crawl a website with the same engine and defaults as the app (1500 pages, 5 workers, 0.4 s delay per host, depth 10, robots.txt respected; then sitemap analysis, near-duplicate content and the AI crawler readability check). Returns a job id at once; poll crawl_status. Set max_pages low (20 to 100) for a quick look. The finished crawl is saved and also shows under Load in the app.","inputs":[{"name":"bot_check","type":"boolean","required":false,"description":"Run the AI and search crawler readability check afterwards (default true)."},{"name":"bot_sample","type":"integer","required":false,"description":"Pages in the readability sample (default 10)."},{"name":"compare_no_js","type":"boolean","required":false,"description":"With render_js: also fetch plain HTML and report what only appears with JS."},{"name":"crawl_delay","type":"number","required":false,"description":"Seconds between requests to one host (default 0.4)."},{"name":"exclude_patterns","type":"string","required":false,"description":"Skip matching URLs, one robots.txt-style pattern per line."},{"name":"ignore_noindex","type":"boolean","required":false,"description":"Follow links on noindex pages too."},{"name":"ignore_robots","type":"boolean","required":false,"description":"Crawl URLs robots.txt disallows. Only on sites you own or may crawl."},{"name":"include_patterns","type":"string","required":false,"description":"Only crawl matching URLs, one robots.txt-style pattern per line (* any text, $ end)."},{"name":"max_depth","type":"integer","required":false,"description":"Click depth limit (default 10)."},{"name":"max_pages","type":"integer","required":false,"description":"Page cap (default 1500; 5000 or more means no cap)."},{"name":"max_workers","type":"integer","required":false,"description":"Parallel fetches (default 5)."},{"name":"near_dup","type":"boolean","required":false,"description":"Find near-duplicate pages afterwards (default true)."},{"name":"near_dup_threshold","type":"number","required":false,"description":"Similarity percent for near duplicates (default 90)."},{"name":"render_js","type":"boolean","required":false,"description":"Render pages in a headless browser (for JS sites; 3 to 5 times slower)."},{"name":"sitemap","type":"boolean","required":false,"description":"Compare the crawl with the XML sitemap afterwards (default true)."},{"name":"solve_challenges","type":"boolean","required":false,"description":"Open a browser window to pass a bot challenge if one appears (default true)."},{"name":"url","type":"string","required":true,"description":"Start URL, e.g. https://example.com/"},{"name":"user_agent","type":"string","required":false,"description":"Blank for Chrome, a preset (chrome-mobile, googlebot, googlebot-mobile, bingbot, firefox, safari) or a full user-agent string."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":482},{"name":"crawl_status","title":"Crawl progress","description":"Progress of a crawl started in this session: state (crawling, sitemap, near_dup, bot_check, saving, done, stopped, error), pages so far, queue, and the saved crawl name once done.","inputs":[{"name":"job","type":"string","required":false,"description":"Job id from start_crawl (default: the latest)."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":71},{"name":"stop_crawl","title":"Stop a crawl","description":"Stop a running crawl like the Stop button. Pages fetched so far are kept, checked and saved.","inputs":[{"name":"job","type":"string","required":false,"description":"Job id (default: the latest)."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":43},{"name":"list_crawls","title":"Saved crawls","description":"Saved crawls from the last 30 days, newest first (crawls from the app and from here).","inputs":[{"name":"limit","type":"integer","required":false,"description":"Default 20."},{"name":"site","type":"string","required":false,"description":"Only crawls whose start URL or name contains this."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":60},{"name":"crawl_summary","title":"Crawl summary","description":"What the Summary tab shows, as data: pages, status codes, indexable pages, every issue grouped into errors, warnings and info with page counts and sample URLs, duplicates, redirect chains, sitemap gaps, near duplicates and the bot readability results.","inputs":[{"name":"crawl","type":"string","required":false,"description":"Which saved crawl: \"latest\" (default), a crawl file name from list_crawls, a job id from start_crawl, or part of the site name."},{"name":"sample_urls","type":"integer","required":false,"description":"Sample URLs per issue (default 5)."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":115},{"name":"get_pages","title":"Pages from a crawl","description":"Rows of a saved crawl, filtered and paged. Filter by issue (a Summary heading such as \"Missing H1\", or any text from the issue), severity, status (404, 3xx), URL text or indexability. Default fields: url, status_code, title, title_len, meta_description, meta_len, h1, word_count, depth, indexable, canonical, canonical_kind, response_time, issues. fields=\"all\" returns every field (large).","inputs":[{"name":"crawl","type":"string","required":false,"description":"Which saved crawl: \"latest\" (default), a crawl file name from list_crawls, a job id from start_crawl, or part of the site name."},{"name":"fields","type":"string","required":false,"description":"Comma-separated field names, or \"all\"."},{"name":"indexable","type":"boolean","required":false,"description":null},{"name":"issue","type":"string","required":false,"description":null},{"name":"limit","type":"integer","required":false,"description":"Default 50."},{"name":"offset","type":"integer","required":false,"description":null},{"name":"severity","type":"string","required":false,"description":null},{"name":"sort","type":"string","required":false,"description":"Default: most issues first."},{"name":"status","type":"string","required":false,"description":"A code such as 404, or a class such as 3xx."},{"name":"url_contains","type":"string","required":false,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":244},{"name":"get_page","title":"One page in detail","description":"Everything the crawl holds for one URL (meta, headings, canonical, hreflang, schema types, links, images, issues) plus the internal links pointing at it.","inputs":[{"name":"crawl","type":"string","required":false,"description":"Which saved crawl: \"latest\" (default), a crawl file name from list_crawls, a job id from start_crawl, or part of the site name."},{"name":"url","type":"string","required":true,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":91},{"name":"get_brief","title":"Crawl brief (Markdown)","description":"The app's AI brief for a crawl: a Markdown report grouped by severity with capped URL lists and a page table, under an audit prompt. Good as one read of a whole crawl.","inputs":[{"name":"crawl","type":"string","required":false,"description":"Which saved crawl: \"latest\" (default), a crawl file name from list_crawls, a job id from start_crawl, or part of the site name."},{"name":"page_limit","type":"integer","required":false,"description":"Rows in the page table (default 200)."},{"name":"page_table","type":"boolean","required":false,"description":"Include the page table (default true)."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":120},{"name":"compare_crawls","title":"Compare two crawls","description":"Diff two saved crawls of a site: pages added, removed and changed, and how the issue counts moved.","inputs":[{"name":"after","type":"string","required":true,"description":"The newer crawl."},{"name":"before","type":"string","required":true,"description":"The older crawl (same forms as crawl elsewhere)."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":59},{"name":"bot_check","title":"AI and search crawler readability","description":"Fetch pages as Googlebot, Bingbot, AI search, AI assistant and training crawlers and compare each with what a browser gets: blocked, CDN challenge, noindex, redirected, thinner or different content. Requests come from this computer with each crawler's user agent.","inputs":[{"name":"delay","type":"number","required":false,"description":"Seconds between requests (default 0.4)."},{"name":"render","type":"boolean","required":false,"description":"Also render the browser baseline with JS (default true)."},{"name":"urls","type":"array","required":true,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":102},{"name":"check_robots","title":"robots.txt","description":"Fetch and parse a site's robots.txt: rules, sitemaps, and which search and AI crawlers it blocks.","inputs":[{"name":"url","type":"string","required":true,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":40},{"name":"detect_cms","title":"Detect the CMS","description":"Identify the CMS behind a URL, with the crawl settings and exclude patterns the app suggests for it.","inputs":[{"name":"url","type":"string","required":true,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":36},{"name":"export_xlsx","title":"Export to Excel","description":"Write a saved crawl to an .xlsx file on this computer (All Pages and Issues Summary sheets).","inputs":[{"name":"crawl","type":"string","required":false,"description":"Which saved crawl: \"latest\" (default), a crawl file name from list_crawls, a job id from start_crawl, or part of the site name."},{"name":"path","type":"string","required":true,"description":"Where to write the .xlsx file."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":84}],"toolsTruncatedAtCapture":false,"diagnostics":{"capturedAt":"2026-11-05T05:22:03.000Z","track":"package","endpoint":null,"declaredUrl":null,"truncated":false,"tls":null,"dnssec":null,"auth":null,"httpsRedirect":null,"transports":[],"provenance":{"outcome":"none","label":"No attestation","reason":"no_attestation","reasonLabel":"No attestation published","discovery":null,"discoveryLabel":null,"sourceRepo":null,"attestationSkipped":null,"attestationSkippedLabel":null},"installScripts":[],"installScriptsTotal":null,"vulnerabilities":[],"vulnerabilitiesTotal":null,"dependencies":null},"mismatches":[],"changelog":{"trackingSince":"2026-10-16","recent":[{"id":"chg_01a1aa28-31c5-7058-8a99-d8cbdd9d9927","kind":"score.total_changed","summary":"Trust score (49 → 50)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-11-05","url":"https://verifymcp.io/servers/puneetindersingh-open-seo-crawler/open-seo-crawler-mcp#chg-chg_01a1aa28-31c5-7058-8a99-d8cbdd9d9927"},{"id":"chg_01a19aad-9769-7a6c-830c-45d512acbff8","kind":"score.total_changed","summary":"Trust score (48 → 49)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-11-02","url":"https://verifymcp.io/servers/puneetindersingh-open-seo-crawler/open-seo-crawler-mcp#chg-chg_01a19aad-9769-7a6c-830c-45d512acbff8"},{"id":"chg_01a1905b-c519-7b53-a5c7-6296f1114828","kind":"score.total_changed","summary":"Trust score (47 → 48)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-10-31","url":"https://verifymcp.io/servers/puneetindersingh-open-seo-crawler/open-seo-crawler-mcp#chg-chg_01a1905b-c519-7b53-a5c7-6296f1114828"},{"id":"chg_01a1860f-f47d-756c-bf96-d665dff9d35d","kind":"score.total_changed","summary":"Trust score (46 → 47)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-10-29","url":"https://verifymcp.io/servers/puneetindersingh-open-seo-crawler/open-seo-crawler-mcp#chg-chg_01a1860f-f47d-756c-bf96-d665dff9d35d"},{"id":"chg_01a17bc2-bc3e-7f1c-8747-f10e4597eda2","kind":"score.total_changed","summary":"Trust score (45 → 46)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-10-27","url":"https://verifymcp.io/servers/puneetindersingh-open-seo-crawler/open-seo-crawler-mcp#chg-chg_01a17bc2-bc3e-7f1c-8747-f10e4597eda2"},{"id":"chg_01a17175-a581-7ee9-b466-fcbf05f261d3","kind":"score.total_changed","summary":"Trust score (44 → 45)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-10-25","url":"https://verifymcp.io/servers/puneetindersingh-open-seo-crawler/open-seo-crawler-mcp#chg-chg_01a17175-a581-7ee9-b466-fcbf05f261d3"},{"id":"chg_01a16728-e290-7985-b9dc-e46785cd1a9e","kind":"check.reverified","summary":"Stability (unverified → 0.23)","materiality":"functional","direction":"improvement","scoreDelta":null,"occurredOn":"2026-10-23","url":"https://verifymcp.io/servers/puneetindersingh-open-seo-crawler/open-seo-crawler-mcp#chg-chg_01a16728-e290-7985-b9dc-e46785cd1a9e"},{"id":"chg_01a16728-e293-76cb-8da9-c8f63d041a11","kind":"score.total_changed","summary":"Trust score (41 → 44)","materiality":"functional","direction":"improvement","scoreDelta":3,"occurredOn":"2026-10-23","url":"https://verifymcp.io/servers/puneetindersingh-open-seo-crawler/open-seo-crawler-mcp#chg-chg_01a16728-e293-76cb-8da9-c8f63d041a11"},{"id":"chg_01a1437c-8c30-77ed-8d01-ae9d08ffc33b","kind":"score.first_scored","summary":"First indexed and scored","materiality":"functional","direction":"neutral","scoreDelta":null,"occurredOn":"2026-10-16","url":"https://verifymcp.io/servers/puneetindersingh-open-seo-crawler/open-seo-crawler-mcp#chg-chg_01a1437c-8c30-77ed-8d01-ae9d08ffc33b"},{"id":"chg_01a14351-6d0c-7d97-8fcf-74329eae1286","kind":"score.first_scored","summary":"First indexed and scored","materiality":"functional","direction":"neutral","scoreDelta":null,"occurredOn":"2026-10-16","url":"https://verifymcp.io/servers/puneetindersingh-open-seo-crawler/open-seo-crawler-mcp#chg-chg_01a14351-6d0c-7d97-8fcf-74329eae1286"}],"truncated":false,"feedUrl":"https://verifymcp.io/servers/puneetindersingh-open-seo-crawler/open-seo-crawler-mcp/changelog.json"},"links":{"html":"https://verifymcp.io/servers/puneetindersingh-open-seo-crawler/open-seo-crawler-mcp","markdown":"https://verifymcp.io/servers/puneetindersingh-open-seo-crawler/open-seo-crawler-mcp.md","changelogJson":"https://verifymcp.io/servers/puneetindersingh-open-seo-crawler/open-seo-crawler-mcp/changelog.json","changelogRss":"https://verifymcp.io/servers/puneetindersingh-open-seo-crawler/open-seo-crawler-mcp.xml","external":[{"label":"Repository","href":"https://github.com/puneetindersingh/open-seo-crawler"}]}}