{"$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-05T19:27:53.956Z","url":"https://verifymcp.io/servers/bojankovachki-recovery-probe/recovery-probe","markdownUrl":"https://verifymcp.io/servers/bojankovachki-recovery-probe/recovery-probe.md","server":{"slug":"bojankovachki-recovery-probe","name":"io.github.BojanKovachki/recovery-probe","registryName":"io.github.BojanKovachki/recovery-probe","description":"Fail reads in web and Electron test apps, inspect recovery, and compare before/after evidence.","registryStatus":"active","deletedAt":null,"statusMessage":null,"liveness":"live","publisher":{"class":"unknown","claimed":false}},"component":{"slug":"recovery-probe","type":"npm","identifier":"recovery-probe","withdrawn":false,"url":"https://verifymcp.io/servers/bojankovachki-recovery-probe/recovery-probe","version":"1.0.2","transport":"stdio","scoredAt":"2026-11-05T07:20:43.803Z"},"score":{"total":70,"tier":"medium","status":"scored","weekDelta":3,"history":[{"date":"2026-11-05","total":70},{"date":"2026-11-04","total":70},{"date":"2026-11-03","total":69},{"date":"2026-11-02","total":69},{"date":"2026-11-01","total":68},{"date":"2026-10-31","total":68},{"date":"2026-10-30","total":67},{"date":"2026-10-29","total":67},{"date":"2026-10-28","total":66}]},"categories":[{"name":"Supply Chain Security","score":100,"verdict":"pass","reasons":["No malware found by supply-chain analysis.","No known CVEs affecting this package version or its production dependencies.","No install/post-install scripts declared.","No production dependencies, so there is no dependency health to assess."],"codes":[{"code":"supplychain.malware_clean","args":{}},{"code":"cve.none","args":{}},{"code":"installscript.none","args":{}},{"code":"dephealth.no_dependencies","args":{"deps":"0","unhealthy":"0"}}]},{"name":"Provenance & Transparency","score":48,"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 7 days ago).","Publishes a security disclosure policy (SECURITY.md)."],"codes":[{"code":"provenance.repo_verified","args":{}},{"code":"provenance.none","args":{}},{"code":"license.osi","args":{"spdx":"MIT"}},{"code":"maintenance.recent","args":{"age_days":"7"}},{"code":"disclosure.present","args":{}}]},{"name":"Schema Quality & AI Usability","score":62,"verdict":"fail","reasons":["AI-judged instruction clarity (good).","Context-footprint check failed: tool/resource definitions use about 1538 tokens (~153/item across 10 items; 10 tools + 0 resources), over budget; trim descriptions and params.","Usage-examples check failed: none of the tools include examples."],"codes":[{"code":"schema.ai_quality","args":{"band":"good"}},{"code":"schema.footprint_heavy","args":{"avg":"153","items":"10","tools":"10","tokens":"1538","resources":"0"}},{"code":"schema.examples_absent","args":{}}]},{"name":"Stability & Change Management","score":27,"verdict":"partial","reasons":["Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses."],"codes":[{"code":"stability.building_history","args":{"days":"8"}}]},{"name":"Tool Coverage","score":91,"verdict":"partial","reasons":["100% of tools have a non-trivial description (not blank, and not just the tool's name).","74% of tool parameters carry a description."],"codes":[{"code":"toolquality.descriptions","args":{"pct":"100"}},{"code":"toolquality.param_docs","args":{"pct":"74"}}]},{"name":"Tool Safety","score":100,"verdict":"pass","reasons":["No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.","All 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.","An AI judge read all 11 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_declared","args":{"pct":"100","annotated":"1","destructive":"1"}},{"code":"toolsafety.manipulation_clean","args":{"units":"11","judged":"11"}}]},{"name":"Capabilities","score":60,"verdict":"fail","reasons":["Spec-recency check failed: implements MCP spec 2025-06-18; the latest is 2026-07-28."],"codes":[{"code":"protocol.outdated","args":{"latest":"2026-07-28","version":"2025-06-18"}}]}],"inconclusive":[],"malware":[],"components":[{"slug":"recovery-probe","type":"npm","identifier":"recovery-probe","withdrawn":false,"score":70,"current":true,"url":"https://verifymcp.io/servers/bojankovachki-recovery-probe/recovery-probe","markdownUrl":"https://verifymcp.io/servers/bojankovachki-recovery-probe/recovery-probe.md"}],"facts":[{"label":"Registry","value":"npm"},{"label":"Package","value":"recovery-probe"},{"label":"Version","value":"1.0.2"},{"label":"Transport","value":"stdio"}],"install":{"available":true,"bundleSha256":null},"tools":[{"name":"find_page_reads","title":"Find the reads behind a page","description":"Opens a page in headless Chromium and lists the JSON GET requests it makes while it loads. Use it to choose the endpoint for check_read_recovery. Only successful page fetch and XHR reads are seen; native, IPC and service-worker traffic is not.","inputs":[{"name":"durationMs","type":"integer","required":false,"description":"How long to watch after the page loads."},{"name":"storageState","type":"string","required":false,"description":"Playwright storage state file of a signed-in test account."},{"name":"url","type":"string","required":true,"description":"Page of a development or test app."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":110},{"name":"check_read_recovery","title":"Check that a page recovers when a read fails","description":"Loads the page healthy, then fails one GET endpoint with each fault kind and checks that the ready marker comes back: by itself (recovery \"automatic\") or after clicking retrySelector (\"retry\"). Returns an outcome per fault, why the healthy baseline failed if it did, the text the screen showed under a fault it did not recover from, and the report folder, which includes fix-brief.md and reproduce.mjs.","inputs":[{"name":"endpoint","type":"string","required":true,"description":"Origin and path of the GET read to fail, as find_page_reads lists it."},{"name":"faults","type":"array","required":false,"description":"Which faults to apply; all of http-error, connection-failure, invalid-json by default."},{"name":"readySelector","type":"string","required":true,"description":"CSS selector of the one element that is visible only once that read has rendered its data. It must match exactly one element: for a list, choose its container or a single item, not a selector every i…"},{"name":"readyText","type":"string","required":false,"description":"Text the ready element must contain."},{"name":"recovery","type":"string","required":false,"description":null},{"name":"retrySelector","type":"string","required":false,"description":"Required when recovery is \"retry\"."},{"name":"storageState","type":"string","required":false,"description":null},{"name":"timeoutMs","type":"integer","required":false,"description":null},{"name":"times","type":"integer","required":false,"description":"How many consecutive requests each fault fails."},{"name":"url","type":"string","required":true,"description":"Page of a development or test app."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":272},{"name":"start_network_faults","title":"Start a network fault proxy","description":"Starts a loopback HTTPS proxy for an app's own connections (an SDK, a main process, a CLI or a test run). Start the app or tests with the returned environment; connections pass until set_network_faults arms rules. Faults apply to whole connections per host: HTTPS stays end to end.","inputs":[{"name":"port","type":"integer","required":false,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":79},{"name":"set_network_faults","title":"Arm or remove network faults","description":"Replaces the armed rules, or removes them all with restore: true. Windows count from this call. Set dropOpen on a rule so clients that keep connections open have to reconnect.","inputs":[{"name":"restore","type":"boolean","required":false,"description":null},{"name":"rules","type":"array","required":false,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":61},{"name":"network_fault_summary","title":"Show what the network faults did","description":"Reports how many connections went through the proxy and, for the armed rules, how many each matched and faulted. A rule that faulted nothing means the app did not use the proxy or the host name is wrong.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":53},{"name":"stop_network_faults","title":"Stop the network fault proxy","description":"Removes every fault, closes the proxy and returns its final summary.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":23},{"name":"find_suspects","title":"Find failure handling that can lose data","description":"Reads JavaScript and TypeScript sources, without running them, for two patterns: UNKNOWN_AS_EMPTY (a failed or unexpected read becomes an empty collection, so \"unknown\" looks like \"none\") and FAILURE_ONLY_LOGGED (a read stores its data when it succeeds, but its failure is only logged). Each suspect names the read to fail and the check that proves or dismisses it. Use changedSince \"main\" to scan only what a branch changed. Needs TypeScript in the project.","inputs":[{"name":"changedSince","type":"string","required":false,"description":"Git reference, such as main: scan only the files changed since it, uncommitted and untracked ones included."},{"name":"includeTests","type":"boolean","required":false,"description":"Scan test files too."},{"name":"paths","type":"array","required":false,"description":"Files and directories to scan, relative to the working directory. Default: all of it."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":176},{"name":"compare_reports","title":"Compare reports from before and after a change","description":"Compares reports of the same check from before and after a change, such as main and a branch, and returns a verdict (IMPROVED, PARTLY_IMPROVED, REGRESSED, MIXED, UNCHANGED, INCONCLUSIVE or NOT_COMPARABLE), what happened to each problem, and a Markdown block for a pull request. A problem counts as gone only when a complete run after the change checked it, so a run that stopped early is never a fix. Give several reports per side for repeated runs.","inputs":[{"name":"after","type":"array","required":true,"description":"Reports of the same check from after the change."},{"name":"afterLabel","type":"string","required":false,"description":"Name for the after side, such as the branch."},{"name":"before","type":"array","required":true,"description":"Reports from before the change: report.json files or their folders."},{"name":"beforeLabel","type":"string","required":false,"description":"Name for the before side, such as main."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":184},{"name":"verify_change","title":"Verify a code change with before and after evidence","description":"Call with baseline true before changing the code, and without it before saying the change is done. The plan file lists the checks that prove the change. Verify reruns them, compares the runs with the baseline, and scans the lines changed since the plan base for suspects. VERIFIED needs every check improved or clean with complete runs on both sides, and no suspect on a changed line; otherwise the reasons say what to resolve. Do not call a change done while it is NOT_VERIFIED.","inputs":[{"name":"baseline","type":"boolean","required":false,"description":"Record the runs from before the change instead of verifying it."},{"name":"plan","type":"string","required":false,"description":"The plan file, relative to the working directory. Default: .recovery-probe/verify.json."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":150},{"name":"run_recovery_probe","title":"Run a Recovery Probe command","description":"Runs a Recovery Probe command that has no dedicated tool, such as check and discover for an Electron app or an attached browser, action, observe (with --steps, --network or --files), refresh, reads, windows, android --list or doctor (setup checks), and returns its exit code and output. Commands: check, discover, action, reads, windows, observe, refresh, android, doctor. Pass --json where the command supports it. See the package docs for each command's configuration.","inputs":[{"name":"args","type":"array","required":true,"description":"Command and arguments, for example [\"observe\", \"--config\", \"observe.json\", \"--json\"]."},{"name":"timeoutMs","type":"integer","required":false,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":145}],"toolsTruncatedAtCapture":false,"diagnostics":{"capturedAt":"2026-11-05T07:20:43.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":null,"reasonLabel":null,"discovery":null,"discoveryLabel":null,"sourceRepo":null,"attestationSkipped":null,"attestationSkippedLabel":null},"installScripts":[],"installScriptsTotal":null,"vulnerabilities":[],"vulnerabilitiesTotal":null,"dependencies":{"nodes":0,"partial":false,"deprecated":null,"stale":null,"noRepo":null}},"mismatches":[],"changelog":{"trackingSince":"2026-10-28","recent":[{"id":"chg_01a1a56e-7e3c-7ba5-bd91-4778518b4579","kind":"score.total_changed","summary":"Trust score (69 → 70)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-11-04","url":"https://verifymcp.io/servers/bojankovachki-recovery-probe/recovery-probe#chg-chg_01a1a56e-7e3c-7ba5-bd91-4778518b4579"},{"id":"chg_01a19b22-04b0-7726-beef-a83ebed50e6f","kind":"score.total_changed","summary":"Trust score (68 → 69)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-11-02","url":"https://verifymcp.io/servers/bojankovachki-recovery-probe/recovery-probe#chg-chg_01a19b22-04b0-7726-beef-a83ebed50e6f"},{"id":"chg_01a190d4-c900-73c4-9d8e-9eb7f8fc6ec5","kind":"score.total_changed","summary":"Trust score (67 → 68)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-10-31","url":"https://verifymcp.io/servers/bojankovachki-recovery-probe/recovery-probe#chg-chg_01a190d4-c900-73c4-9d8e-9eb7f8fc6ec5"},{"id":"chg_01a1868b-81ba-7ce8-b7be-8f771513910c","kind":"score.total_changed","summary":"Trust score (66 → 67)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-10-29","url":"https://verifymcp.io/servers/bojankovachki-recovery-probe/recovery-probe#chg-chg_01a1868b-81ba-7ce8-b7be-8f771513910c"},{"id":"chg_01a18307-a9e2-7be3-864d-0a164f55d6a4","kind":"score.first_scored","summary":"First indexed and scored","materiality":"functional","direction":"neutral","scoreDelta":null,"occurredOn":"2026-10-28","url":"https://verifymcp.io/servers/bojankovachki-recovery-probe/recovery-probe#chg-chg_01a18307-a9e2-7be3-864d-0a164f55d6a4"},{"id":"chg_01a18306-c7e6-7e59-9a11-3af53d63bf68","kind":"score.first_scored","summary":"First indexed and scored","materiality":"functional","direction":"neutral","scoreDelta":null,"occurredOn":"2026-10-28","url":"https://verifymcp.io/servers/bojankovachki-recovery-probe/recovery-probe#chg-chg_01a18306-c7e6-7e59-9a11-3af53d63bf68"}],"truncated":false,"feedUrl":"https://verifymcp.io/servers/bojankovachki-recovery-probe/recovery-probe/changelog.json"},"links":{"html":"https://verifymcp.io/servers/bojankovachki-recovery-probe/recovery-probe","markdown":"https://verifymcp.io/servers/bojankovachki-recovery-probe/recovery-probe.md","changelogJson":"https://verifymcp.io/servers/bojankovachki-recovery-probe/recovery-probe/changelog.json","changelogRss":"https://verifymcp.io/servers/bojankovachki-recovery-probe/recovery-probe.xml","external":[{"label":"npm package","href":"https://www.npmjs.com/package/recovery-probe"},{"label":"Socket report","href":"https://socket.dev/npm/package/recovery-probe"},{"label":"Repository","href":"https://github.com/BojanKovachki/recovery-probe"}]}}