{"$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:00:45.014Z","url":"https://verifymcp.io/servers/heuristicolab-ctxfw/ctxfw","markdownUrl":"https://verifymcp.io/servers/heuristicolab-ctxfw/ctxfw.md","server":{"slug":"heuristicolab-ctxfw","name":"io.github.heuristicolab/ctxfw","registryName":"io.github.heuristicolab/ctxfw","description":"Zero-egress AI Agent Firewall: SARA prompt injection defense, AST context pruning & MCP governance.","registryStatus":"active","deletedAt":null,"statusMessage":null,"liveness":"live","publisher":{"class":"unknown","claimed":false}},"component":{"slug":"ctxfw","type":"pypi","identifier":"ctxfw","withdrawn":false,"url":"https://verifymcp.io/servers/heuristicolab-ctxfw/ctxfw","version":"4.1.1","transport":"stdio","scoredAt":"2026-11-05T03:04:07.606Z"},"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":54},{"date":"2026-11-02","total":69},{"date":"2026-11-01","total":68},{"date":"2026-10-31","total":53},{"date":"2026-10-30","total":53},{"date":"2026-10-29","total":67},{"date":"2026-10-28","total":67},{"date":"2026-10-27","total":66},{"date":"2026-10-26","total":66},{"date":"2026-10-25","total":65}]},"categories":[{"name":"Supply Chain Security","score":100,"verdict":"partial","reasons":["No malware found by supply-chain analysis.","No known CVEs affecting this package version or its production dependencies.","Runs hatchling.build at install time, a recognised build step with no custom scripting around it.","1 of 11 dependencies flagged as unhealthy."],"codes":[{"code":"supplychain.malware_clean","args":{}},{"code":"cve.none","args":{}},{"code":"installscript.allowlisted","args":{"tool":"hatchling.build","hooks":"build_backend"}},{"code":"dephealth.assessed","args":{"deps":"11","unhealthy":"1"}}]},{"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 (Apache-2.0).","Actively maintained (last published 10 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":"Apache-2.0"}},{"code":"maintenance.recent","args":{"age_days":"10"}},{"code":"disclosure.absent","args":{}}]},{"name":"Schema Quality & AI Usability","score":63,"verdict":"fail","reasons":["AI-judged instruction clarity (excellent).","Context-footprint check failed: tool/resource definitions use about 1186 tokens (~237/item across 5 items; 5 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":"excellent"}},{"code":"schema.footprint_heavy","args":{"avg":"237","items":"5","tools":"5","tokens":"1186","resources":"0"}},{"code":"schema.examples_absent","args":{}}]},{"name":"Stability & Change Management","score":37,"verdict":"partial","reasons":["Stability observed for 11 of 30 days with no destabilising changes; credit accrues until the full window elapses."],"codes":[{"code":"stability.building_history","args":{"days":"11"}}]},{"name":"Tool Coverage","score":100,"verdict":"pass","reasons":["100% of tools have a non-trivial description (not blank, and not just the tool's name).","100% of tool parameters carry a description.","Structured output schemas are declared (100% of tools); any adoption earns full credit."],"codes":[{"code":"toolquality.descriptions","args":{"pct":"100"}},{"code":"toolquality.param_docs","args":{"pct":"100"}},{"code":"toolquality.output_present","args":{"pct":"100"}}]},{"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 5 captured tool definition(s), and no name or description among them implies an irreversible operation.","An AI judge read all 6 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":"5"}},{"code":"toolsafety.manipulation_clean","args":{"units":"6","judged":"6"}}]},{"name":"Capabilities","score":20,"verdict":"fail","reasons":["Spec-recency check failed: implements MCP spec 2024-11-05; the latest is 2026-07-28."],"codes":[{"code":"protocol.outdated","args":{"latest":"2026-07-28","version":"2024-11-05"}}]}],"inconclusive":[],"malware":[],"components":[{"slug":"ctxfw","type":"pypi","identifier":"ctxfw","withdrawn":false,"score":70,"current":true,"url":"https://verifymcp.io/servers/heuristicolab-ctxfw/ctxfw","markdownUrl":"https://verifymcp.io/servers/heuristicolab-ctxfw/ctxfw.md"}],"facts":[{"label":"Registry","value":"pypi"},{"label":"Package","value":"ctxfw"},{"label":"Version","value":"4.1.1"},{"label":"Transport","value":"stdio"}],"install":{"available":true,"bundleSha256":null},"tools":[{"name":"prune_file","title":null,"description":"Extract semantic interfaces, types, pydantic models, sanitized raises, and signatures from a source file (`path`) at a given pruning `depth` ('full', 'interface', or 'nominal') and `language`, optionally stripping docstrings (`strip_docs`), while replacing procedural bodies with AST stubs. Use this when you only need to inspect contracts or APIs of an individual dependency without ingesting raw implementation code. For multi-module dependency graphs, use `resolve_context_bundle` instead. Does not modify files on disk (pure in-memory AST operation).","inputs":[{"name":"depth","type":"string","required":false,"description":"Pruning depth: 'full', 'interface', or 'nominal'"},{"name":"language","type":"string","required":false,"description":"Programming language (python, typescript, javascript, go, java)"},{"name":"path","type":"string","required":true,"description":"Absolute or relative path to the source file"},{"name":"strip_docs","type":"boolean","required":false,"description":"Whether to strip docstrings entirely"}],"outputs":[{"name":"content","type":"array","required":true,"description":"Semantic interface stubs extracted via in-memory Tree-Sitter AST"},{"name":"isError","type":"boolean","required":true,"description":"True if pruning encountered a fatal parsing or file resolution failure"}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":190},{"name":"resolve_context_bundle","title":null,"description":"Calculate topological dependency graph distances (D0 full `target_file`, D1 interface stubs, D2 nominal symbols) within `project_root` and compile a token-pruned Markdown context bundle, with optional reactive degradation via `breaker_state` and `session_id`. Use this as your primary context builder before editing a file in a multi-module project. For inspecting isolated files, use `prune_file` instead. Read-only operation.","inputs":[{"name":"breaker_state","type":"string","required":false,"description":"Optional circuit breaker state (CLOSED, TRIPPED, HALTED) or decision kind"},{"name":"project_root","type":"string","required":false,"description":"Root directory of the project. Defaults to target file's directory."},{"name":"session_id","type":"string","required":false,"description":"Session identifier (SES-...) to connect with TokenCast budget tracking"},{"name":"target_file","type":"string","required":true,"description":"Path to the active target file in editing (D0)"}],"outputs":[{"name":"content","type":"array","required":true,"description":"Compiled topological Markdown prompt context bundle"},{"name":"isError","type":"boolean","required":true,"description":"True if dependency resolution or file traversal failed"}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":183},{"name":"evaluate_spec_axioms","title":null,"description":"Evaluate an architectural specification brief (`brief_text`) against formal determinism rules, negative invariant floors ('never'/'shall never'), and the Axiom Completeness Index (ACI 1.0000). Use this during intake or planning phases before writing code. For verifying unified git diff patches, use `evaluate_patch` instead. Pure read-only analytical evaluation with no side effects.","inputs":[{"name":"brief_text","type":"string","required":true,"description":"Markdown content of the architectural intake brief to evaluate"}],"outputs":[{"name":"content","type":"array","required":true,"description":"JSON-serialized architectural determinism verification report"},{"name":"isError","type":"boolean","required":true,"description":"True if brief specification evaluation encountered an unhandled error"}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":102},{"name":"evaluate_patch","title":null,"description":"Verify a unified git diff patch (`diff_text`) against SWE-Gate architectural constraints (`max_cyclomatic_delta`, `forbid_type_ignores`, `disallowed_import_modules`) and functional test results (`tests_passed`, `tests_failed`, `functional_verdict`) before allowing merge. Appends immutable audit records (`EVL-...`) in SweGateStore and seals cryptographic blocks in TraceKitStore; use `query_audit_ledger` to retrieve or verify persisted records.","inputs":[{"name":"author_kind","type":"string","required":false,"description":"Patch author kind: 'AGENT' or 'HUMAN'"},{"name":"commit_sha","type":"string","required":false,"description":"40-character lowercase hex commit SHA"},{"name":"diff_size_bytes","type":"integer","required":false,"description":"Exact UTF-8 byte length of diff_text"},{"name":"diff_text","type":"string","required":true,"description":"Unified diff text of the candidate patch"},{"name":"disallowed_import_modules","type":"array","required":false,"description":"List of banned module names that the patch must not import"},{"name":"forbid_type_ignores","type":"boolean","required":false,"description":"Whether introducing '# type: ignore' is forbidden"},{"name":"functional_verdict","type":"string","required":false,"description":"Functional test suite verdict: 'PASSED' or 'FAILED'"},{"name":"max_cyclomatic_delta","type":"integer","required":false,"description":"Maximum allowed cyclomatic complexity delta"},{"name":"pr_id","type":"integer","required":false,"description":"Pull request identifier (>= 1)"},{"name":"repo_id","type":"string","required":false,"description":"Optional repository identifier (REPO-...)"},{"name":"repo_name","type":"string","required":false,"description":"Repository name (e.g. 'heuristico/ctxfw')"},{"name":"tests_failed","type":"integer","required":false,"description":"Count of failing functional tests"},{"name":"tests_passed","type":"integer","required":false,"description":"Count of passing functional tests"}],"outputs":[{"name":"content","type":"array","required":true,"description":"JSON-serialized SWE-Gate verification report or rejection message"},{"name":"isError","type":"boolean","required":true,"description":"True if the patch was rejected by SWE-Gate or failed validation"}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":332},{"name":"query_audit_ledger","title":null,"description":"Retrieve persisted SWE-Gate patch evaluation records and violation findings by `evaluation_id` (`EVL-...`), or verify and inspect cryptographic SHA-256 hash-chained audit sessions in TraceKitStore by `session_id` (`SES-...`) with optional block listing (`include_blocks`, `max_blocks`). Use this for forensic inspection and compliance verification after running `evaluate_patch` or context tools. Pure read-only query with zero ledger mutations.","inputs":[{"name":"evaluation_id","type":"string","required":false,"description":"SWE-Gate evaluation identifier (`EVL-<16 lowercase hex chars>`) returned by `evaluate_patch`"},{"name":"include_blocks","type":"boolean","required":false,"description":"Whether to include individual hash-chained audit block records when querying `session_id`"},{"name":"max_blocks","type":"integer","required":false,"description":"Maximum number of audit blocks to return when `include_blocks` is true (1 to 256)"},{"name":"session_id","type":"string","required":false,"description":"TraceKit session identifier (`SES-...`) to verify SHA-256 hash chain integrity and inspect blocks"}],"outputs":[{"name":"content","type":"array","required":true,"description":"JSON-serialized audit ledger query and cryptographic chain verification report"},{"name":"isError","type":"boolean","required":true,"description":"True if neither identifier was provided, parameters failed validation, or no matching audit record was found"}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":208}],"toolsTruncatedAtCapture":false,"diagnostics":{"capturedAt":"2026-11-05T03:04:07.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":[{"hook":"build_backend","tier":"allowlisted"}],"installScriptsTotal":null,"vulnerabilities":[],"vulnerabilitiesTotal":null,"dependencies":{"nodes":11,"partial":false,"deprecated":null,"stale":1,"noRepo":null}},"mismatches":[],"changelog":{"trackingSince":"2026-10-25","recent":[{"id":"chg_01a1a4b9-b5db-7466-a5a6-c6e98e48949d","kind":"check.reverified","summary":"Malware scan (unverified → pass)","materiality":"security","direction":"improvement","scoreDelta":null,"occurredOn":"2026-11-04","url":"https://verifymcp.io/servers/heuristicolab-ctxfw/ctxfw#chg-chg_01a1a4b9-b5db-7466-a5a6-c6e98e48949d"},{"id":"chg_01a1a4b9-b5dd-7573-ab0d-0c3694c9a788","kind":"score.total_changed","summary":"Trust score (54 → 70)","materiality":"functional","direction":"improvement","scoreDelta":16,"occurredOn":"2026-11-04","url":"https://verifymcp.io/servers/heuristicolab-ctxfw/ctxfw#chg-chg_01a1a4b9-b5dd-7573-ab0d-0c3694c9a788"},{"id":"chg_01a19f94-45f2-78ab-98b1-f32f5858b35e","kind":"check.unverifiable","summary":"Malware scan (pass → unverified)","materiality":"security","direction":"regression","scoreDelta":null,"occurredOn":"2026-11-03","url":"https://verifymcp.io/servers/heuristicolab-ctxfw/ctxfw#chg-chg_01a19f94-45f2-78ab-98b1-f32f5858b35e"},{"id":"chg_01a19f94-45f5-7991-9e14-007df109f1d2","kind":"score.total_changed","summary":"Trust score (69 → 54)","materiality":"functional","direction":"regression","scoreDelta":-15,"occurredOn":"2026-11-03","url":"https://verifymcp.io/servers/heuristicolab-ctxfw/ctxfw#chg-chg_01a19f94-45f5-7991-9e14-007df109f1d2"},{"id":"chg_01a19a8b-be73-70c2-9b4a-5145478d3c4d","kind":"score.total_changed","summary":"Trust score (68 → 69)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-11-02","url":"https://verifymcp.io/servers/heuristicolab-ctxfw/ctxfw#chg-chg_01a19a8b-be73-70c2-9b4a-5145478d3c4d"},{"id":"chg_01a19547-5589-79c3-b7ca-15da558420ad","kind":"check.reverified","summary":"Malware scan (unverified → pass)","materiality":"security","direction":"improvement","scoreDelta":null,"occurredOn":"2026-11-01","url":"https://verifymcp.io/servers/heuristicolab-ctxfw/ctxfw#chg-chg_01a19547-5589-79c3-b7ca-15da558420ad"},{"id":"chg_01a19547-558e-79b1-8d09-98d1cccea2e6","kind":"score.total_changed","summary":"Trust score (53 → 68)","materiality":"functional","direction":"improvement","scoreDelta":15,"occurredOn":"2026-11-01","url":"https://verifymcp.io/servers/heuristicolab-ctxfw/ctxfw#chg-chg_01a19547-558e-79b1-8d09-98d1cccea2e6"},{"id":"chg_01a18b08-708f-78b0-b9ae-f25a5454790d","kind":"check.unverifiable","summary":"Malware scan (pass → unverified)","materiality":"security","direction":"regression","scoreDelta":null,"occurredOn":"2026-10-30","url":"https://verifymcp.io/servers/heuristicolab-ctxfw/ctxfw#chg-chg_01a18b08-708f-78b0-b9ae-f25a5454790d"},{"id":"chg_01a18b08-7090-747d-a7c9-63540676f87d","kind":"score.total_changed","summary":"Trust score (67 → 53)","materiality":"functional","direction":"regression","scoreDelta":-14,"occurredOn":"2026-10-30","url":"https://verifymcp.io/servers/heuristicolab-ctxfw/ctxfw#chg-chg_01a18b08-7090-747d-a7c9-63540676f87d"},{"id":"chg_01a18014-4066-7f1f-a24e-2d888bb1b8ef","kind":"score.total_changed","summary":"Trust score (66 → 67)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-10-28","url":"https://verifymcp.io/servers/heuristicolab-ctxfw/ctxfw#chg-chg_01a18014-4066-7f1f-a24e-2d888bb1b8ef"},{"id":"chg_01a175c6-afdd-7e24-bafa-3c775ae498c1","kind":"score.total_changed","summary":"Trust score (65 → 66)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-10-26","url":"https://verifymcp.io/servers/heuristicolab-ctxfw/ctxfw#chg-chg_01a175c6-afdd-7e24-bafa-3c775ae498c1"},{"id":"chg_01a174a9-8749-78f1-8c6f-59a90604c9be","kind":"score.first_scored","summary":"First indexed and scored","materiality":"functional","direction":"neutral","scoreDelta":null,"occurredOn":"2026-10-25","url":"https://verifymcp.io/servers/heuristicolab-ctxfw/ctxfw#chg-chg_01a174a9-8749-78f1-8c6f-59a90604c9be"},{"id":"chg_01a174a8-33d3-7e0b-80b2-3ea04233ab5f","kind":"score.first_scored","summary":"First indexed and scored","materiality":"functional","direction":"neutral","scoreDelta":null,"occurredOn":"2026-10-25","url":"https://verifymcp.io/servers/heuristicolab-ctxfw/ctxfw#chg-chg_01a174a8-33d3-7e0b-80b2-3ea04233ab5f"}],"truncated":false,"feedUrl":"https://verifymcp.io/servers/heuristicolab-ctxfw/ctxfw/changelog.json"},"links":{"html":"https://verifymcp.io/servers/heuristicolab-ctxfw/ctxfw","markdown":"https://verifymcp.io/servers/heuristicolab-ctxfw/ctxfw.md","changelogJson":"https://verifymcp.io/servers/heuristicolab-ctxfw/ctxfw/changelog.json","changelogRss":"https://verifymcp.io/servers/heuristicolab-ctxfw/ctxfw.xml","external":[{"label":"PyPI project","href":"https://pypi.org/project/ctxfw/"},{"label":"Socket report","href":"https://socket.dev/pypi/package/ctxfw"},{"label":"Repository","href":"https://github.com/heuristicolab/ctxfw"}]}}