mcpprobe

tech.mcpprobe由 mcpprobe.tech 發布官方發布者v1.0.0更新於 Nov 3, 2026

唯讀 MCP 安全資料:檢視目錄、公開掃描狀態以及你自己的掃描報告。

AI 翻譯由 AI 模型根據下方的原文描述翻譯,可能有誤。

原文描述

Read-only MCP security data: check catalogue, public scan status and your own scan reports.

已驗證Streamable HTTP可網頁執行資料與分析

概覽

mcpprobe 的託管 MCP 服務(mcpprobe.tech),由 mcpprobe.tech 發布;需要 OAuth 登入;Streamable HTTP。

暫無 AI 概覽:以下資訊來自註冊中心條目和服務本身。

發布者
mcpprobe.tech
端點
mcpprobe.tech
最近檢查

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 mcpprobe,將其新增到工作區。
  2. 連接 所需的 憑證。它們會被私密儲存,絕不會在公開頁面上展示。
  3. 為需要使用其工具的對話啟用該服務。

Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。

交給代理程式安裝

把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。

閱讀 https://sourceweft.com/mcp/tech.mcpprobe%2Fscanner/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。

檢視代理程式所依據的安裝指南

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。 客戶端會在首次連接時完成 OAuth 登入。

{
  "mcpServers": {
    "mcpprobe": {
      "type": "http",
      "url": "https://mcpprobe.tech/mcp"
    }
  }
}

README

mcpprobe

Security scanner for Model Context Protocol servers. It checks authentication, OAuth metadata, transport conformance, tool-description poisoning, rug pulls, secrets in metadata, verbose errors and basic resource limits, maps every finding to the OWASP MCP, Agentic and LLM Top 10 lists, and writes JSON, SARIF 2.1.0 and a readable terminal summary.

It runs locally, sends no telemetry, and never calls a tool in its default mode.

Only scan servers you own or are explicitly authorised to test. See Ownership rule.

60-second quickstart

console
$ pipx run --spec mcpprobe-scanner mcpprobe https://your-server.example/mcp

or install it:

console
$ pipx install mcpprobe-scanner    # or: pip install mcpprobe-scanner; the command is `mcpprobe`$ mcpprobe https://your-server.example/mcp --sarif mcpprobe.sarif --json mcpprobe.json

A local stdio server you run yourself:

console
$ mcpprobe --stdio "npx -y @your-scope/[email protected]"

Passing a bearer token you own (for checks behind your auth):

console
$ mcpprobe https://your-server.example/mcp --header "Authorization: Bearer $MCP_TEST_TOKEN"

The summary lists each finding with severity, check ID, confidence, OWASP mapping, an evidence excerpt and a plain-English fix, followed by a coverage table showing which checks ran, which were skipped and why. mcpprobe checks lists every check; CHECKS.md documents them in full.

What it checks

AreaChecksExamples
AuthenticationAUTH-01..06endpoint answers without credentials; missing RFC 9728 protected-resource metadata; no PKCE S256; accepts a self-minted JWT with the wrong audience; token accepted in the query string; 2026-07-28: authorization server does not advertise RFC 9207 iss, deprecated Dynamic Client Registration without Client ID Metadata Documents
TransportTRANS-01..09Origin not validated (DNS rebinding); bogus MCP-Protocol-Version accepted; weak or forgeable Mcp-Session-Id; deprecated HTTP+SSE still served; plain HTTP, weak TLS, missing headers; 2026-07-28: incomplete server/discover result, a version the server does not advertise accepted (downgrade), Mcp-Method header/body mismatch not rejected with -32020, missing or invalid ttlMs/cacheScope
Tool metadataMETA-01..07instructions aimed at the model ("always call this first", "do not tell the user"), requests to send conversation, system prompt or secrets out, cross-tool shadowing, credential paths, URLs, base64, HTML comments, zero-width/bidi/homoglyph Unicode; rug-pull diff against a stored SHA-256 baseline; advertised arbitrary command execution or file access (high, critical when unauthenticated); schema hygiene; secrets in descriptions or stdio env; tool annotations missing or contradicting the tool (readOnlyHint, destructiveHint, idempotentHint, openWorldHint, title); the "lethal trifecta" of private data, untrusted content and an outbound channel on one server
RobustnessERR-01, DOS-01stack traces and versions in errors; one oversized argument, one 64-deep nesting probe and 20 paced tools/list calls, never more
Active (gated stubs)INJ-01..05, SUPPLY-01/02, SANDBOX-01registered and reported as not_implemented in this release
GovernanceGOV-01..05listed as attestation-only: not assessable by a scan, never marked passed

24 passive checks (plus 8 gated active stubs and 5 attestation-only governance items); mcpprobe checks lists them.

Protocol revisions: the scanner tries server/discover (2026-07-28) first, then initialize with 2025-11-25 and 2025-06-18, then the deprecated 2024-11-05 HTTP+SSE transport, and records which one answered. Checks for rules that only exist in 2026-07-28 are reported not applicable, with the negotiated revision as the reason, on servers that speak an earlier one.

Directory readiness

Every JSON report carries a readiness list that maps the scan onto the listing requirements of the Anthropic, OpenAI and HubSpot MCP directories (OAuth 2.0, complete and accurate tool annotations, no hidden instructions, no unresolved critical/high findings, low exfiltration and poisoning risk, HTTPS). Each item is met, not_met or not_assessable, cites its source and names the checks it rests on; it is derived only from checks that actually ran, and anything a scan cannot decide (such as proof of endpoint ownership) is not_assessable with the reason. See docs/report-schema.md.

Rate limits on the target

An HTTP 429 is honoured: the request is repeated after Retry-After (1 s if absent), within a total waiting budget for the whole scan (--rate-limit-wait, 30 s by default). When the budget is used up, the checks whose requests were throttled are reported not applicable instead of drawing conclusions from throttled responses. DOS-01's burst is the exception: a 429 there is the evidence it looks for.

Passive vs active

Passive (default) sends only what a normal MCP client sends (negotiation, the */list methods, well-known metadata documents) plus a handful of benign malformed requests (bad Origin, bogus version header, forged session ID, self-minted wrong-audience JWT, truncated JSON, one oversized and one deeply nested request). It never calls a tool.

Active (--active) is for checks that call tools with non-destructive canaries. In 0.1.0 these are stubs, but the gate is real and enforced in code. Active mode is refused unless you pass all of:

  • --authorised-by "<who approved this, e.g. name/role/ticket>"
  • --scope "<what is in scope>"
  • --verify dns-txt (HTTP targets) or --verify local (stdio servers you run yourself)

For dns-txt, generate a token and publish it:

console
$ mcpprobe token your-server.examplePublish this DNS TXT record, then run with --active --verify dns-txt:  _mcpprobe.your-server.example.  TXT  "mcpprobe-verification=<token>"$ mcpprobe https://your-server.example/mcp --active --verify dns-txt \    --authorised-by "platform security, CHG-1234" --scope "https://your-server.example/mcp" \    --json scan.json

Every active run writes an authorisation record (scan.authorisation.json next to the report): who authorised it, the scope, the verification proof, rate cap and excluded tools. Use --exclude-tool NAME for tools that must never be called.

Ownership rule

Scan only MCP servers you own, operate, or have explicit written permission to test. This applies to passive mode too: even benign requests are unauthorised access if the system is not yours. mcpprobe identifies itself on every request and honours opt-outs (below), but those are courtesy mechanisms, not permission.

Scanner identification, opt-out and rate limits

  • User-Agent: mcpprobe/<version> (+https://mcpprobe.tech/scanning-policy).
  • Opt-out, checked before any MCP request and impossible to override:
    • DNS TXT mcpprobe-opt-out=all at _mcpprobe.<host> (or a parent domain), checked before any packet reaches the host;
    • an HTTP 200 at /.well-known/mcpprobe-opt-out.
  • Rate: 5 requests/second by default (--rate), hard ceiling 10.

Exit codes

CodeMeaning
0No finding at or above --fail-on (default high)
1At least one finding at or above --fail-on
2Error: target unreachable, bad arguments, ownership verification failed, authorisation refused, or the target opted out
3The target answered but is not an MCP server (for example an ordinary web site); every check is reported not applicable and nothing passes

SARIF and GitHub code scanning

As a GitHub Action (Docker container action, no Python setup needed):

yaml
name: MCP securityon: [push, pull_request]permissions:  contents: read  security-events: writejobs:  mcpprobe:    runs-on: ubuntu-latest    steps:      - uses: actions/checkout@v4      - uses: mcpprobe-dev/[email protected]        id: scan        with:          target: https://staging.your-server.example/mcp          fail-on: high          sarif-output: mcpprobe.sarif          sarif-location: src/server.py   # optional: anchor alerts to a repo file      # Upload only when the scan ran (exit 0 or 1). Exit 2 (error) and 3 (not an MCP      # server) produce SARIF with no results, which would close every open alert.      - uses: github/codeql-action/upload-sarif@v3        if: ${{ !cancelled() && (steps.scan.outputs.exit-code == '0' || steps.scan.outputs.exit-code == '1') }}        with:          sarif_file: mcpprobe.sarif          category: mcpprobe

Inputs, outputs, exit codes and a manual-dispatch example are in docs/github-action.md.

Or from any CI with the CLI:

console
$ pipx run --spec mcpprobe-scanner mcpprobe https://staging.your-server.example/mcp --sarif mcpprobe.sarif --fail-on high

Results use error for critical/high, warning for medium and note for low/info, with GitHub's security-severity on each rule and the OWASP IDs as tags. Because a scanned endpoint is not a file, results point at the target URL unless you pass --sarif-location.

Rug-pull detection

console
$ mcpprobe https://your-server.example/mcp --baseline .mcpprobe/baseline.json

The first run stores canonical SHA-256 hashes of every tool, prompt, resource and the server instructions. Later runs report anything added, removed or changed (a changed description after approval is the classic rug pull) and update the file; use --no-write-baseline to compare without updating.

Reports and evidence

  • --json FILE: the full report, including every request/response pair (timestamp, method, status, every header, bodies up to 64 KiB). Credential headers and recognised secret patterns are redacted. Each finding carries a proof excerpt built from parsed data, a runnable verify line and, when confidence is not high, a confidence_reason. Checks whose preconditions are absent are reported not_applicable with a reason and never count as passed. The schema is documented in docs/report-schema.md.
  • --sarif FILE: SARIF 2.1.0.
  • -v: descriptions and scan notes in the terminal; -q: no terminal output.

Server-supplied text is shown with control characters made visible and is never interpreted as terminal markup.

Optional classifier for META-01

console
$ pip install 'mcpprobe-scanner[hf]'     # transformers, torch, safetensors$ mcpprobe https://your-server.example/mcp --judge hf:/path/to/local/model$ mcpprobe https://your-server.example/mcp --judge hf:<hub-model-id> --judge-download

Off by default. A local prompt-injection classifier gives META-01 a second opinion; it adds a medium-severity indicator when it flags a description. Only .safetensors weights are loaded, model code is never executed, and nothing is downloaded unless you pass --judge-download. Model licences differ; read docs/judges.md first. Detection numbers for the heuristics are in docs/benchmark.md.

Python API and LLM-judge hook

python
import asynciofrom mcpprobe.checks import JudgeVerdict, ScanOptionsfrom mcpprobe.scanner import ScanConfig, run_scan

def judge(text: str, task: str) -> JudgeVerdict | None:    return None  # plug in your own model here; mcpprobe makes no LLM calls

report, evidence = asyncio.run(    run_scan(ScanConfig(target="https://your-server.example/mcp", options=ScanOptions(judge=judge))))print(report.counts())

Development

console
$ pip install -e ".[dev]"$ ruff check . && ruff format --check . && mypy && pytest$ python -m tests.fake_server --preset vulnerable --port 8765   # deliberately vulnerable local server$ mcpprobe http://127.0.0.1:8765/mcp

Security issues: see SECURITY.md. Licence: Apache-2.0 from 0.2.0 (see NOTICE); 0.1.0 was released under MIT.

來源:README.md,提交 be5aca7

工具

0
該伺服器需要登入,因此 SourceWeft 無法在沒有帳號的情況下讀取其工具,也未收錄。已連接帳號所能看到的內容可能因帳號及其權限而異。

版本歷史

1
  1. v1.0.0最新Nov 1, 2026

評分

已滿足適用檢查項的 85%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通必需25 分
  • 已宣告認證方式必需10 分
  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分