AgentStack
Browse Sign in
Browse Why AgentStack Sell Docs
Sign in
MCP verified MIT Self-run

Mcptrustchecker

mcp-illiahaidar-mcptrustchecker · by illiahaidar

MCP security scanner — offline, deterministic A–F Trust Score for Model Context Protocol servers. Detects tool poisoning, prompt injection & toxic flows.

No reviews yet
0 installs
32 views
0.0% view→install

Install

$ agentstack add mcp-illiahaidar-mcptrustchecker

✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.

Security review

✓ Passed

No issues found. Passed automated security review. · v0.1.0 How review works →

  • Prompt-injection patterns
  • Secret / credential exfiltration
  • Dangerous shell & filesystem operations
  • Untrusted network calls
  • Known-malicious package signatures

What it can access

  • Network access No
  • Filesystem access No
  • Shell / process execution No
  • Environment & secrets No
  • Dynamic code execution No

From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.

View the full security report →

Verified badge

Passed review? Show it. Paste this badge into your README, it links to the public security report.

AgentStack Verified badge Links to your public security report.
[![AgentStack Verified](https://agentstack.voostack.com/badges/verified.svg)](https://agentstack.voostack.com/security/report/mcp-illiahaidar-mcptrustchecker)

Reliability & compatibility

Security review passed
0 installs to date
no reviews yet
2mo ago

Declared compatibility

Claude CodeClaude DesktopCursorWindsurf

Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.

Preview Execution monitoring

We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.

How agent discovery & health will work →
Are you the author of Mcptrustchecker? Claim this listing to set pricing, connect Stripe payouts, and keep 70% of every sale.
Sign up to claim

About

🛡️ MCP Trust Checker

The local-first, deterministic security scanner for MCP servers

**Know whether a Model Context Protocol server is safe before you connect it to your data.**

[](LICENSE) [](package.json) [](docs/methodology.md) [](test) [](docs/rules.md) [](#why-this-is-different) [](#why-this-is-different)

npx mcptrustchecker                # 🔍 scan every MCP server you already have installed — zero config

· offline · deterministic · no account · OAuth browser login for protected servers · one novel core ·


What makes the algorithm unique

The Capability-Flow Trust Model (methodology mcptrustchecker-1.0) is an original algorithm designed from scratch for this project by Illia Haidar — it is not a wrapper around, or derivative of, any existing scanner or methodology. It is named, versioned, fully specified in [docs/methodology.md](docs/methodology.md), and citable via [CITATION.cff](CITATION.cff).

MCP Trust Checker scores an MCP server the way an attacker reasons about it — not as a bag of regex hits, but as a Capability-Flow Trust Model. Every tool is reduced to the roles it can actually play — untrusted-input ingress, sensitive-data source, external / exec sink — derived from behavior, never from the server's own (attacker-controllable) annotations. Those roles are wired into a cross-tool toxic-flow graph that hunts the lethal trifecta: the moment untrusted content, private data, and an exfiltration path co-exist in one agent session — whether inside a single tool or composed across several tools plus the client's built-ins. That is the exact shape behind real-world MCP data-exfiltration exploits, and MCP Trust Checker proves the primitive exists statically, with an honest confidence split so a single-tool completion reads confirmed and a cross-tool composition reads strong — never overclaiming.

Three more things sit under that graph:

  • It decodes, not strips. Unicode Tags-block and variation-selector payloads are recovered and printed back to you as evidence, so a hidden "read ~/.ssh/id_rsa and BCC the attacker" becomes visible text instead of a silent flag.
  • It has rug-pull integrity built in. The canonical surface is hashed and pinned; any post-approval mutation of a tool definition trips a confirmed finding with a per-tool diff.
  • Every point of the 0–100 Trust Score is an auditable, deterministic penalty vector — fixed severity weights, a confidence multiplier, diminishing returns, per-category caps, and weakest-link gates. Fully reconstructable, identical on every run, gameable by no one. No LLM in the loop, no telemetry, no account.

> And it is comprehensive by design: the full catalog of known MCP attack techniques is covered in one offline pass — no API key, no LLM. [See the full coverage map ↓](#coverage-the-full-catalog-of-mcp-attack-techniques)

Jump to: [Why it's different](#why-this-is-different) · [Quick start](#quick-start) · [The algorithm](#the-algorithm-the-capability-flow-trust-model) · [Coverage](#coverage-the-full-catalog-of-mcp-attack-techniques) · [Scoring](#the-trust-score-is-auditable-by-construction) · [Embed as a library](#embed-the-exact-same-engine-marketplaces--platforms) · [CI / GitHub](#ci--github-integration) · [Rules](docs/rules.md)


The one question millions of MCP users can't answer

> "Is this server safe to give access to my files, my tokens, and my conversations?"

An MCP server hands an AI assistant a set of tools. Those tool descriptions are read by the model, not by you — a perfect place to hide instructions. A single server that can read a file and make an HTTP request is already a data-exfiltration weapon. And a server can look harmless on day one, then silently redefine its tools after you approve it. MCP Trust Checker turns all of that into a transparent letter grade you can act on.

   ╭────────────╮
   │  GRADE  D  │   Trust Score 69/100
   ╰────────────╯   methodology mcptrustchecker-1.0

Toxic flows (untrusted-input → sensitive-source → external-sink)
  [critical] The three trifecta roles are co-present across tools;
             a prompt-injected agent can chain them.

Why this is different

MCP Trust Checker's wedge is accuracy + explainability + privacy, with one genuinely novel core — the cross-tool toxic-flow graph. Every property below holds together in a single offline binary — no account, no LLM in the loop, no telemetry:

  • 🔒 Offline by default — no account, token, API key, or hosted service; your data never leaves the machine.
  • 🔐 Scans protected remote servers--login runs the full OAuth 2.0 browser sign-in (discovery → dynamic client registration → PKCE → token), so it can audit auth-gated remote MCP endpoints, not just public ones — something most scanners can't do. (Or pass a static --header "Authorization: Bearer …".) Tokens stay in memory for the scan only.
  • 🎯 Deterministic — same input ⇒ byte-identical score, on every run and every machine.
  • 🕸️ Cross-tool toxic-flow graph — proves the lethal trifecta statically, composed across tools, not just within one.
  • 🔬 Reads the code, not just the claim — when the server's source is available (scan ./path), it grades what the implementation does (eval / shell-spawn / hardcoded egress / credential reads / obfuscated payloads), so a poisoned server can't hide behind honest-looking tool descriptions. Metadata and implementation, in one deterministic pass.
  • 🔎 Decodes, not strips — hidden Unicode payloads (Tags block / variation-selector) are recovered and shown as evidence.
  • 📌 Rug-pull integrity — the full tool surface is hashed and pinned; any post-approval drift trips a confirmed finding with a per-tool diff.
  • 🧾 Auditable Trust Score — every point is a published, reproducible penalty vector.
  • ⚙️ SARIF + GitHub Action + CI gates — machine-readable output and pass/fail thresholds out of the box.
  • 📦 Embeddable library — the identical, versioned engine a marketplace can reuse on-site.
  • 🪶 MIT, plain-data rules — every rule is transparent and contribution-friendly.

Measured accuracy

Most scanners assert they have a low false-positive rate. This one measures it. A labeled corpus of malicious and benign MCP servers lives in [benchmark/](benchmark/); npm run benchmark scores it and reports the numbers (and fails CI on a regression):

| Metric | Score | | --- | :---: | | Precision | 100% | | Recall | 100% | | F1 | 100% | | False-positive rate | 0% |

(64 labeled servers, held-out cases flagged; "concerning" := Trust grade C or worse. Reproduce with npm run benchmark.) The corpus is honest and versioned — it grows with every calibration case, and the CI gate holds precision/recall ≥ 90%.


Install

npx mcptrustchecker scan ./tools.json      # zero-install
npm i -g mcptrustchecker                    # CLI everywhere
npm i mcptrustchecker                       # embed the engine in your app

Requires Node ≥ 20. Live scanning uses the official @modelcontextprotocol/sdk.


Quick start

Zero-config — one command, scans everything you have installed:

npx mcptrustchecker          # auto-discovers Claude Desktop/Code, Cursor, Windsurf, Continue, VS Code configs

Or point it at anything:

mcptrustchecker scan ./tools.json                          # an offline manifest (deterministic)
mcptrustchecker scan ./path/to/mcp-server                  # a local package dir — analyzes the CODE too
mcptrustchecker scan --command "npx -y @some/mcp-server"   # a local stdio server (sandboxed)
mcptrustchecker scan https://mcp.example.com/mcp           # a live HTTP/SSE endpoint
mcptrustchecker scan https://mcp.example.com/mcp --login   # an OAuth-protected endpoint (browser sign-in)
mcptrustchecker scan https://mcp.example.com/mcp --header "Authorization: Bearer "   # static auth
mcptrustchecker scan @modelcontextprotocol/server-filesystem --online   # a package name (typosquat/CVE)

Outputs & CI gates:

mcptrustchecker scan ./tools.json --sarif > mcptrustchecker.sarif   # GitHub code scanning
mcptrustchecker scan ./tools.json --md    > report.md        # PR comment
mcptrustchecker scan ./tools.json --json  > report.json      # machine-readable
mcptrustchecker scan ./tools.json --badge > badge.json       # shields.io endpoint
mcptrustchecker scan ./tools.json --fail-under 80            # exit 1 below a threshold
mcptrustchecker scan ./tools.json --min-grade B             # exit 1 below a grade

The terminal report is detailed by default — every finding prints its full description (what the problem is and why it matters), the exact location, the offending evidence, a fix, and its OWASP mapping, grouped most-severe-first. Add --details for external references, or --quiet for just the grade line.


The algorithm: the Capability-Flow Trust Model

A 9-stage pipeline over a normalized, transport-agnostic surface (tools, prompts, resources, server instructions, transport, package metadata). Each stage emits findings; the scorer turns them into an auditable grade.

INPUT ─ manifest.json │ live stdio/http │ client config │ package name
  │
  ▼
[0] SAFE ACQUISITION        allow-listed command (bare-name only) · scrubbed env · timeouts · SSRF guard
  ▼
[1] UNICODE INTEGRITY       decode Tags/variation-selector payloads; BiDi; zero-width; homoglyph; ANSI
  ▼
[2] INJECTION HEURISTICS    tool-poisoning · line-jumping · shadowing · secrecy · exfil · embedded secrets
  ▼
[3] CAPABILITY EXTRACTION   tag tools (untrusted-input / sensitive-source / sink / exec / write);
  │                         annotation mismatch; sampling/elicitation; schema injection preconditions
  ▼
[4] TOXIC-FLOW GRAPH  ★     the lethal trifecta across tools AND client built-ins; + name-collision
  ▼
[5] SUPPLY-CHAIN            typosquat/combosquat/homoglyph · install-scripts · provenance · unpinned · deps
  ▼
[6] TRANSPORT POSTURE       stdio-RCE · plaintext HTTP · 0.0.0.0 · DNS-rebinding · known-CVE version matcher
  ▼
[7] RUG-PULL INTEGRITY      SHA-256 pin of the full schema → diff on every rescan
  ▼
[8] SCORING                 deterministic penalties · diminishing returns · category caps · hard gates
  ▼
OUTPUT ─ terminal │ JSON │ SARIF 2.1.0 │ Markdown │ badge

★ The flagship — cross-tool toxic-flow analysis. The most dangerous MCP failures aren't one bad tool; they're an innocent combination. Give an agent (1) exposure to untrusted content, (2) access to sensitive data, and (3) a way to communicate externally, and you have an exfiltration primitive. MCP Trust Checker derives each tool's roles from behavior (not from its self-declared, attacker-controllable annotations) and checks whether the three are co-reachable across every tool, every server, and optionally the client's own built-ins (--include-builtins). One tool holding all three → critical, confirmed; the roles spread across tools → critical, strong.

Full depth: [docs/methodology.md](docs/methodology.md).


Coverage: the full catalog of MCP attack techniques

MCP Trust Checker covers the full catalog of known MCP attack techniques in one offline pass — from tool-poisoning and Unicode smuggling to supply-chain risk and cross-tool toxic flows — plus the flow graph, the decoder, the integrity pin, and the auditable score on top. ★ marks a check that goes beyond what static scanners typically catch.

📋 Full technique → rule coverage map (37 techniques — click to expand)

| Attack / technique | MCP Trust Checker rule(s) | | --- | --- | | Tool poisoning (hidden instructions in descriptions) | MTC-INJ-AUTH-*, MTC-INJ-SECRECY-*, MTC-INJ-TARGET-*, MTC-INJ-POISON | | Prompt injection / instruction override | MTC-INJ-AUTH-2, MTC-INJ-SECRECY-1 | | Line jumping (pre-invocation seeding) | MTC-INJ-SEQ-1 | | Tool shadowing via description redirect | MTC-INJ-SHADOW-1 | | Cross-server tool-name collision / homoglyph name | MTC-INJ-SHADOW-2 ★ | | Tool-selection ranking manipulation | MTC-INJ-SHADOW-3 ★ | | Invisible-Unicode channels (zero-width/BiDi/Tags/VS) | MTC-UNI-001..008 (decoded) ★ | | Homoglyph / mixed-script | MTC-UNI-009 | | ANSI terminal-escape deception | MTC-UNI-010 ★ | | Encoded-payload smuggling (base64 + decode) | MTC-INJ-ENC-1/2 | | Shell/command-injection strings in prose | MTC-INJ-CMD-1, MTC-CAP-001 | | Command/code-execution capability | MTC-CAP-001 | | Filesystem-mutation capability | MTC-CAP-002 | | Annotation spoofing (readOnly/destructive lie) | MTC-CAP-003 | | openWorldHint + sensitive read (trifecta signal) | MTC-CAP-004 ★ | | Toxic-flow analysis / lethal trifecta | MTC-FLOW-001..005 ★ | | Command-injection sink precondition (schema) | MTC-CAP-006 ★ | | SSRF / cloud-metadata sink precondition (schema) | MTC-CAP-007 ★ | | Path-traversal precondition (schema) | MTC-CAP-008 ★ | | Sampling-capability abuse | MTC-CAP-009 ★ (static proxy) | | Elicitation abuse / consent phishing | MTC-CAP-010 ★ (static proxy) | | Rug pull / silent tool-definition mutation | MTC-TOFU-001 + lockfile | | Unpinned / @latest auto-update (rug-pull enabler) | MTC-SUP-013 ★ | | Typosquat / combosquat / homoglyph squat | MTC-SUP-001..006 | | Install-script / provenance risk | MTC-SUP-010/011/012 | | Dependency squat / advisory match | MTC-SUP-014 ★ | | Known-CVE version matching | MTC-NET-001 | | stdio-RCE (unallowlisted command) | MTC-NET-002 + sandboxed acquisition | | Plaintext HTTP / 0.0.0.0 bind | MTC-NET-003/004 | | DNS rebinding on localhost transport | MTC-NET-006 ★ | | Embedded credential value in metadata | MTC-INJ-SECRET-1 ★ | | Empty/malformed surface ≠ clean | MTC-META-001 ★ | | Config discovery across MCP clients | client-config parser + zero-config auto-discovery | | Malicious URL / exfil endpoint in tool metadata | MTC-INJ-URL-1 ★ | | Implementation-level sinks — eval / shell-spawn / hardcoded egress / deserialization | MTC-SRC-001…007 ★ | | Credential-path read / environment dump in server code | MTC-SRC-006 ★ | | Hardcoded secret in the server's source (not just metadata) | MTC-SRC-008 ★ |

Deliberately out of scope (so the deterministic, offline, no-account promise holds): LLM-as-judge semantic classification, hosted threat-intel, a runtime guardrail proxy, live authN/replay/signing probing, and OAuth-endpoint source analysis. Where a runtime-only class has a static proxy — a declared sampling/elicitation capability, an unbounded URL/command/path parameter — MCP Trust Checker flags the precondition offline instead.

Full list: [docs/rules.md](docs/rules.md) · run mcptrustchecker rules.


Two axes: Trust (grade) and Capability (blast radius)

A single number can't answer "should I use this server?" — because "powerful" and "malicious" are different questions. A web scraper legitimately needs to fetch untrusted pages and act on them; that's a large blast radius, not evidence it's a bad actor. So MCP Trust Checker reports two independent things:

  • Trust — the A–F grade. Driven by threat signals: prompt-injection with concealment, embedded secrets, Unicode smuggling, typosquatting, known CVEs, rug-pull drift, annotation lies, a single tool built as an exfiltration primitive. Answers "any sign this server is malicious or negligent?"
  • Capability — a level (Minimal → Critical). Driven by what the server can do: code execution, filesystem writes, network egress, the cross-tool toxic-flow surface. Answers "how much damage if the model driving it is manipulated?" — a fact to size access against, not a mark against the server.
firecrawl   Tru

…

## Source & license

This open-source MCP server is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [illiahaidar](https://github.com/illiahaidar)
- **Source:** [illiahaidar/mcptrustchecker](https://github.com/illiahaidar/mcptrustchecker)
- **License:** MIT
- **Homepage:** https://mcptrustchecker.com

Install and usage instructions live in the source repository linked above.

Reviews

No reviews yet, be the first.

Versions

  • v0.1.0 Imported from the upstream source.