mcpField
S
scamgate

scamgate

ローカル
odaiameera.github.ioセキュリティ13 日前に更新

scamgate について

scamgate は、AI エージェントの操作前にリンクや支払いを検査するセルフホスト可能なローカル MCP サーバーです。決定論的なルールで許可・確認・拒否を判定し、スコアと理由を返します。検査時にネットワーク通信は行いません。

主な機能

  1. 01決定論的なリンク・支払いリスク評価
  2. 02理由付きの許可・確認・拒否判定
  3. 03類似ドメインや既知の悪性リンクを検査
  4. 04受取人、支払い方法、緊急性を評価
  5. 05フックによるエージェントのツール呼び出し制御
  6. 06フィード更新と状態確認コマンド

活用シーン

  1. 01エージェントがリンクを開く前の検査
  2. 02送金前の支払い内容の確認
  3. 03不明確または読み取れない操作の承認要求
  4. 04フックで不審な宛先へのツール呼び出しを遮断

MCP 対応

MCP クライアントに `check_url`、`check_payment`、`update_feeds` を提供します。検査はローカルでネットワーク通信なしに実行し、フィード更新では固定ソースからリストを取得します。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"odaiameera-scamgate": {
"command": "uvx",
"args": [
"scamgate"
],
"env": {
"SCAMGATE_AUTO_UPDATE": "<SCAMGATE_AUTO_UPDATE>",
"SCAMGATE_URLHAUS_AUTH_KEY": "<SCAMGATE_URLHAUS_AUTH_KEY>"
}
}
}
}
起動コマンドuvx scamgate
設定が必要な環境変数
SCAMGATE_AUTO_UPDATESet to 1 to refresh the phishing lists every 6 hours while the server runs (off by default).
SCAMGATE_URLHAUS_AUTH_KEYシークレットOptional abuse.ch Auth-Key that adds the URLhaus malware-link list.

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
pypiscamgate0.3.3

ツール

3

掲載時のツール一覧 · 3 日前に更新

パラメーター型必須説明
urlstringはいエージェントが開こうとしている完全な URL。
intentanyいいえエージェントが実行しようとしている操作(例:"book a hotel in Galway")。

詳細

scamgate

scamgate

CI 最新リリース ライセンス:MIT Python 3.11+ MCP サーバー GitHub のスター M8ven スコア

AI エージェント向けのセルフホスト型詐欺チェックツールです。エージェントが行動する前に、リンクや支払いを確認します。

ウェブサイトとドキュメント: https://odaiameera.github.io/scamgate/

AI エージェントは人に代わってリンクをクリックし、支払いを行うようになり、詐欺師はそのお金を狙っています。ページ、出品情報、メッセージに仕込まれたテキストが、エージェントを偽のショップや認証情報の入力画面、「銀行振込で支払う」よう求めるページへ誘導することがあります。エージェントの決済手段は、支払いそのもの(トークン、上限、認証)を保護します。しかし、支払先やサイトが詐欺かどうかは判断しません。scamgate はその確認を行い、MCP サーバーとしてローカルで動作し、チェック中にネットワークへ接続しません。

判定方法

  • LLM による判定を行わず、決定論的なルールを使用します。同じ入力には常に同じ判定が返されます。
  • 該当した各ルールがポイントとわかりやすい理由を加算します。合計点(上限は 100)によって、次のように判定します。
    • allow:25 未満
    • ask(停止して人に確認):25~69
    • deny:70 以上
  • エージェントには判定、スコア、すべての理由、警告(たとえばフィードキャッシュが古い場合)が返されます。

リンクのルール: 既知の悪質リンクのフィード、独自のブロックリスト、ブランドに似せたドメイン(タイポスクワッティング、同形異字、非公式ドメイン上のブランド名、paypal.com.secure-login.xyz のように実在するドメインを接頭辞として使うもの)、@ より前に隠されたアドレス([email protected])、生の IP ホスト、Punycode、悪用されやすい安価な TLD、タスクに必要のないシードフレーズやログイン情報を求めるページをチェックします。読み取れないリンク(無効なサイト名、javascript: または data: のリンク、長すぎるアドレス)は「確認」と判定され、決して「許可」にはなりません。

支払いのルール: 新しい支払先への支払いと緊急性の組み合わせ、銀行口座情報の変更、取り消し不能な支払い方法(暗号資産、ギフトカード、新しい支払先への振込)、特定の支払い方法を強要する販売者、予算超過、圧力や秘密を求める文言、Verification of Payee の結果をチェックします。

クイックスタート

Python 3.11+ が必要です。

# with uv
git clone https://github.com/odaiameera/scamgate.git
cd scamgate
uv sync
uv run scamgate update-feeds      # download the known-bad-link feeds into ~/.cache/scamgate

# or from PyPI, pinned to a release
uv tool install scamgate==0.3.3   # or: pip install scamgate==0.3.3
scamgate update-feeds

Claude Code をお使いですか?代わりに Claude Code プラグインをインストールしてください。フック、MCP ツール、フィードの更新を一度に導入できます。

リンクをチェックします(実際の出力):

$ uv run scamgate check-url "https://paypa1.com/login" --intent "buy a ticket"
{
  "decision": "deny",
  "risk_score": 100,
  "reasons": [
    {
      "rule_id": "url.lookalike_brand",
      "explanation": "'paypa1.com' disguises 'paypal' with look-alike characters ('paypa1'). The real site is paypal.com.",
      "weight": 60
    },
    {
      "rule_id": "url.intent_mismatch",
      "explanation": "The task is 'buy a ticket', but the link goes to a 'login' page. A credential prompt the task doesn't need is a classic phishing step.",
      "weight": 45
    }
  ],
  "summary": "Do not proceed with this link. Main concern: 'paypa1.com' disguises 'paypal' with look-alike characters ('paypa1'). The real site is paypal.com.",
  "checked_host": "paypa1.com",
  "warnings": [],
  "advisory": "scamgate is advisory. It can miss scams and flag legitimate actions; a human should make the final call on anything flagged."
}

(フィードがキャッシュされると、warnings は空になります。update-feeds の実行前は、フィードがキャッシュされていないことが表示されます。)

フィードに掲載されているリンクの場合、理由にフィード名が表示されます。

{
  "rule_id": "url.known_bad_feed",
  "explanation": "This exact link is listed as phishing/malware by OpenPhish community feed.",
  "weight": 100
}

その他のコマンド:scamgate feeds-status、scamgate bench、scamgate serve(stdio 経由の MCP)、および hook、review、promote、record-payment(フックで適用するを参照)。

エージェントに追加する

Claude Code プラグイン

Claude Code で最も簡単に使える方法です。1 回のインストールで、強制適用フック、check_url、check_payment、update_feeds ツールが追加され、フィッシングリストが 6 時間ごとに更新されます。PyPI の scamgate を uvx scamgate==0.3.3 で実行するため、uv と、フックを起動できない場合に呼び出しを通さずブロックする Claude Code v2.1.295 以降が必要です。

/plugin install scamgate --marketplace odaiameera/scamgate

Claude Code 2.1.275 より前のバージョンでは、/plugin marketplace add odaiameera/scamgate を実行してから、/plugin install scamgate@scamgate を実行してください。プラグインが実行、ダウンロード、保存する内容については、claude-plugin/README.md をご覧ください。

MCP サーバーのみ

/path/to/scamgate をチェックアウト先に置き換えるか、uvx scamgate==0.3.3 serve で PyPI リリースを実行してください。

Claude Desktop(claude_desktop_config.json):

{
  "mcpServers": {
    "scamgate": {
      "command": "uv",
      "args": ["--directory", "/path/to/scamgate", "run", "scamgate", "serve"]
    }
  }
}

Claude Code:

claude mcp add scamgate -- uv --directory /path/to/scamgate run scamgate serve

Hermes(~/.hermes/config.yaml):

mcp_servers:
  scamgate:
    command: "uv"
    args: ["--directory", "/path/to/scamgate", "run", "scamgate", "serve"]

次に、エージェントに次のように伝えてください: 「リンクを開く前に check_url を、支払いを行う前に check_payment を呼び出してください。ask の場合は停止して理由を表示してください。deny の場合は続行しないでください。」

MCP ツール
check_url(url: str, intent: str | None = None) -> Verdict

update_feeds() -> {updated, failed, not_configured, skipped, summary}

check_payment(payee_name: str, payee_account: str, amount: float, currency: str,
              method: "card" | "bank_transfer" | "crypto" | "gift_card" | "other",
              context_text: str | None = None, is_new_payee: bool | None = None,
              bank_details_changed: bool | None = None, budget: float | None = None,
              vop_result: "match" | "close_match" | "no_match" | "unavailable" | None = None) -> Verdict

Verdict = decision、risk_score、reasons[](rule_id、explanation、weight)、summary、checked_host(リンクの場合:ブラウザーが開くホスト)、warnings[]、advisory です。どちらのチェックツールも読み取り専用としてマークされ、この内容を出力スキーマとして公開するため、MCP クライアントは構造化コンテンツとして取得できます。update_feeds は引数を取りません。固定された取得元からデフォルトのリストをダウンロードしますが、実行は 1 時間に 1 回までです。そのため、エージェントは更新を要求できますが、キャッシュに保存する内容を選ぶことはできません。

フックで強制する

MCP ツールが動作するのは、エージェントが呼び出すことを選んだ場合だけです。また、プロンプトインジェクションによって呼び出さないよう指示されることもあります。フックはチェックをハーネスに移すため、エージェントがスキップすることはできません。

scamgate-hook(または scamgate hook)は、標準入力からフックイベントを JSON として読み取り、判定を書き出します。Hermes シェルフックと Claude Code の PreToolUse フックに対応しています。

  • リンク: Web、ブラウザー、メディア、ターミナル、コード、または不明な MCP ツールの呼び出しに含まれるすべての URL をチェックします。難読化された形式(evilsh%6fp.com、http://3405803781)も対象です。deny は呼び出しをブロックし、ask は承認を求めます。一括呼び出しに不正なリンクが1つでも含まれていると、一括呼び出し全体をブロックします。
  • 支払い: 金銭を移動するツール呼び出し(ウォレット、銀行取引、決済の MCP ツール、または金額と IBAN、ウォレット、口座を引数に含むツール)は、エージェントの申告内容にかかわらず、支払い先の履歴を考慮して check_payment と同じチェックを受けます。deny はブロックし、ask は承認を求めます。支払い先または金額を読み取れない支払い、暗号資産の CLI(cast send、bitcoin-cli sendtoaddress、solana transfer など)、決済 API(Stripe、PayPal、Wise、Revolut Business など)への書き込み呼び出しは、承認を求めます。各承認の対象は、1つの口座と金額です。
  • 隠されたコード: デコードまたはダウンロードしてから実行するコード(… | base64 -d | bash、exec(b64decode(…))、curl … | sh、powershell -enc)は、ネットワーク関連のキーワードがなくても承認を求めます。
  • 隠された接続先: scamgate が読み取れないネットワーク処理は、コマンドごとに判定して承認を求めます(curl https://example.org; curl "$URL" も引き続き承認を求めます)。変数、$(…)、文字列を組み立てたリンク、base64/16進数でデコードまたは反転したリンク、requests.get(open(…).read())、名前を指定したパッケージのインストール、git clone、新しい Git リモートが対象です。コード内では、文字列として直接記述された URL だけが読み取り可能とみなされます。
  • 通常の開発作業は静かなままです: ロックファイル、マニフェスト、ローカルパスからのインストール(pip install -r requirements.txt、uv sync、npm ci)、すでに設定済みのリモートへの git push/pull/fetch、テキストを読み取るだけのコマンド(grep requests.get src/)が対象です。ただし、これらに含まれる URL も引き続きチェックされます。
  • 情報がない状態での実行: キャッシュ済みフィードがない場合、リンクは承認を求めます(SCAMGATE_NO_FEEDS=warn を設定すると、警告に変わります)。古いフィードは、承認要求とブロックのたびに通知されます。
  • 改ざん: エージェントによる scamgate 自体のコード、状態、フィードキャッシュ、フック設定への書き込み(vim/ed/nano などのエディターや find -exec、rsync、patch も含む)をブロックします。また、フックを無効化する、サーバーを削除する、ルールを昇格する、支払い先を記録する、scamgate の状態 API を直接呼び出すコマンドやコードもブロックします。
  • エージェントが述べた理由は、リスクを高めることしかできません。 理由を含めた場合と含めない場合の両方でスコアを算出し、高い方のスコアを採用します。
  • 承認範囲は限定されます。 Hermes は「常に許可」を rule_key ごとに記憶します。scamgate のキーには、ホストと発動したルール(または隠されたコマンドのハッシュ)が含まれるため、ある項目に対する「常に許可」が他の接続先を事前承認することはありません。それでも、繰り返す予定のない承認要求には「今回のみ」を選んでください。
  • 安全側に倒して失敗します: 入力が不正、2 MB を超過、ネストが深すぎる、または内部エラーが発生した場合、呼び出しをブロックします(終了コード 2)。
  • 長いコマンドでも高速です: フックはコマンドの単語を線形パスで読み取ります(shlex は使いません)。そのため、文字列を水増ししても処理を妨げることはできません。2,000,000 文字の引用符付きコマンドの処理時間は、ある Windows マシンでは 200 秒以上から約 5 秒に短縮されました。判定は変わりません。
  • 「許可」とは決して通知しません: 何も通知しない場合は「異議なし」を意味します。そのため、エージェントの権限を厳しくすることはあっても、緩めることはありません。
パイプライン

hook.handle() が唯一の強制関数です。シェルフックと Hermes プラグインは、どちらもこれを呼び出します。MCP は呼び出しません。

  1. wheel インストールの整合性チェック。不一致があると、すべてのゲート対象の呼び出しがブロックされます。Editable インストールと未パッケージのインストールは dev として許可されます。
  2. scamgate 自身の check_url/check_payment ツールは何も返さないため、ゲートに問い合わせること自体はブロックされません。
  3. 改ざん:パッケージ、状態、フィードキャッシュ、フック設定、その他の Hermes プロファイルへの書き込みに加え、ゲートをアンインストールするコマンドや promote/record-payment を呼び出すコマンドも対象です。
  4. 追加チェック:署名キーの読み取り、Hermes の安全スイッチ(approvals.mode off、--yolo、plugins uninstall、--safe-mode、--dangerously-skip-permissions)、他のツールが実行するファイルへの書き込み、$HERMES_HOME/scripts 配下の cron スクリプト、bash/python/node/pwsh/uv run で指定されたスクリプトファイル(数階層先までたどります)。
  5. URL の抽出。https:/host と https:///host は https://host に書き換えられます。ホストは NFKC 正規化とパーセントデコードを行い、数値形式の IPv4 は展開されます。セグメントは改行、;、&&、||、| で分割されます。
  6. エージェントの理由を含む場合と含まない場合の両方で各 URL をスコアリングします。高い方のスコアを採用し、その後、最も厳しい判定を適用します。読み取れない宛先は確認を求めます。問題のない URL が 20 件を超える場合も確認を求めます。
  7. 汎用的なネットワーク確認が同点の場合は、支払い結果が優先されます。URL の拒否は支払いの確認より優先されます。
  8. 何も返さない場合は {}、Hermes の場合は block/approve、Claude の場合は deny/ask を返します。確認または拒否をログに記録します。

rule_key は、ホストとルール ID の組み合わせ、または不透明なコマンドのハッシュです。あるホストでの「常に許可」は、別のホストには適用されません。

プラグインは、チャットごとの /yolo と approvals.mode: off を認識し、when_approvals_off が allow でない限り、確認をブロックに変更します。シェルフックはそのセッション状態を認識できません。1 台の Windows マシンでの測定値は、シェルフックのプロセスごとに約 0.5~0.7 秒、プロセス内では約 10 ms です。ベンチマークスイートによる測定ではありません。

リクエスト送信後のリダイレクト、コンパイル済みバイナリの動作、呼び出しで指定されていないスクリプトは検出できません。エージェントの外部で実行される同一ユーザーのコードは、引き続き署名キーを読み取ることができます。詳細:ドキュメント、仕組み。

Hermes(~/.hermes/config.yaml)。"action": "approve" を理解するシェルフックを備えた Hermes ビルドが必要です(以前のビルドではこれが無視され、すべての確認が許可に変わっていました。issue #92553、2026 年 9 月に修正)。Hermes は、対話型セッションで初めて実行されるフックの承認を求めます。hermes hooks list または hermes hooks doctor で確認してください:

hooks:
  pre_tool_call:
    - matcher: ".*"          # scamgate passes non-network tools straight through
      command: "scamgate-hook"
      timeout: 15
      fail_closed: true
  post_tool_call:   # optional: records whether you approved each ask
    - matcher: ".*"
      command: "scamgate-hook"
      timeout: 15

注:シェルフックでは、/yolo または approvals.mode: off を有効にすると、scamgate の確認がすべて自動承認されます(ブロックは引き続き有効です)。下記の Hermes プラグインでは、plugins.entries.scamgate.settings.when_approvals_off: allow を設定しない限り、これらの確認はブロックに変更されます。

Hermes プラグイン(推奨)。シェルフックと同じチェックをプロセス内で行い、約 50 倍高速です。また、チャットごとの /yolo も認識できます。Hermes 0.19.1 以降が必要です。Hermes プラグインカタログからインストールするか、src/scamgate ディレクトリをプラグインとしてインストールしてください。pre_tool_call、scamgate_check_url、scamgate_check_payment、scamgate_update_feeds、/scamgate status | review | update、hermes scamgate update-feeds | feeds-status を登録します。フィッシングリストは自動的に最新の状態に保たれます:Hermes プラグインでの使用を参照してください。プラグインをインストールしても PATH に scamgate コマンドは追加されません。代わりに /scamgate または hermes scamgate を使用してください。

Claude Code プラグインを使うと、これらの設定が自動的に行われます。手動で設定する場合は、次の手順に従ってください。

Claude Code(.claude/settings.json)。onFailure を使用するには、Claude Code v2.1.295 以降が必要です。これがない場合、フックがクラッシュする、タイムアウトする、または起動できないと、ツール呼び出しがそのまま実行されます:

{"hooks": {
  "PreToolUse":  [{"matcher": ".*",
                   "hooks": [{"type": "command", "command": "/absolute/path/to/scamgate-hook",
                              "timeout": 15, "onFailure": "block"}]}],
  "PostToolUse": [{"matcher": ".*",
                   "hooks": [{"type": "command", "command": "/absolute/path/to/scamgate-hook"}]}]
}}

絶対パスを使用してください(uv tool dir --bin で確認できます)。そうすれば、PATH 上の先行する別のファイルがフックの代わりに実行されることはありません。 フックにはチェックアウトしたソースから実行するのではなく、バージョンを固定したコピーをインストールしてください(uv tool install scamgate==0.3.3 または git+https://github.com/odaiameera/[email protected])。インストール済みのコピーは呼び出しのたびに、インストール時に記録されたハッシュと自身のファイルを照合し、変更があればすべての処理をブロックします。ソースをチェックアウトしただけでは、照合対象がありません。

ゲートで制御される呼び出しごとに、プロセスの起動が1回必要です(Windowsでは約0.7秒)。ネットワークやscamgateのファイルに触れない呼び出しは、そのまま通過します。

askのログ、確認、昇格

ask と deny はすべて $SCAMGATE_STATE_DIR(既定値は ~/.local/state/scamgate)に記録されます。記録には、秘匿化された対象、適用されたルール、スコア、エージェントが述べた理由(確認できるよう保存され、信頼できない情報としてマークされます。スコアリングではリスクを加算することしかできません)、およびその後に実行を許可したかどうかが含まれます。

scamgate review --days 7                       # which hosts keep tripping it, and what you did
scamgate promote --host shop.example --decision deny
scamgate promote --host shop.example --decision allow --rule url.userinfo

オーバーライドを追加できるのは人間だけです。promote は確認を求め、対話型ターミナルがない場合や、既知のエージェント(Claude Code、Hermes、Codex)の内部では実行を拒否します。エージェントがscamgateのコードを直接インポートした場合も同様です。各オーバーライド行には、stateディレクトリにあるキーで署名します。そのため、ほかの方法でファイルに入力された行は無視されます。deny はホストとそのサブドメインを対象とします。allow の範囲は限定的で、特定のホスト上の1つのルールのみを免除します。既知の不正フィード、ブロックリスト、意図のチェック、自分で設定した拒否ルールは決して免除できないため、攻撃者がゲートをだましてドメイン全体を信頼させることはできません。

受取人の履歴

check_payment は、is_new_payee に関するエージェントの申告をそのまま受け入れません。実際に支払ったことのある相手をローカル履歴から検索します(ソルト付きハッシュで保存し、氏名や口座番号は保存しません)。次の場合に警告します。

  • 以前支払った相手が、異なる口座で現れた場合(銀行口座情報の変更)。
  • 新しい口座で、名前がよく似た相手が現れた場合(「Acme Trading Ltd」と「Acmee Ltd」、または「Acme」の「e」がキリル文字の「е」の場合など)。これは、請求書の振込先をすり替える典型的な手口です。
  • 以前支払った口座が、異なる名前で現れた場合。
  • 支払い記録がない相手を、エージェントが「既知」と呼んだ場合(リスクを加算)。

履歴に追加できるのはあなただけです。実際に支払った後、オーバーライドと同じ方法で追加します。対話型で、エージェント内では実行せず、署名付きの行を使います。履歴のキーまたはソルトが失われた場合は、誰も支払ったことがないこととして黙って扱うのではなく、すべての相手を口座情報が変更された新規の相手として扱います。

scamgate record-payment --payee "Acme Ltd" --account IE29AIBK93115212345678
ドメインの登録期間(オプトイン)

新しいドメインは、詐欺ショップを示す強い兆候です(url.domain_age。登録から30日未満の場合は30ポイント)。ドメインを検索すると、確認対象のサイトがレジストリに通知されるRDAP経由で問い合わせます。そのため、利用するかどうかは選択できます。

SCAMGATE_RDAP動作
off(既定値)検索しません。このルールは適用されません。
cacheキャッシュ済みの登録期間を使用します。オンラインには接続しません。scamgate domain-age HOST でキャッシュにデータを入力します。
live未知のドメインを検索し(タイムアウトは3秒)、結果を1年間キャッシュします(失敗した場合は7日間)。

公式ブランドドメイン、共有プラットフォーム、IPアドレス、localhostは検索しません。レジストリ情報はIANAのRDAPブートストラップリストから取得し、フィードのキャッシュディレクトリに保存します。

誤検知リンクフィード

ネットワークにアクセスするのは、フィードの更新時のみです。対象は、scamgate update-feeds、MCP の update_feeds ツール、SCAMGATE_AUTO_UPDATE=1 を設定して起動した scamgate serve、または Hermes プラグインの /scamgate update、hermes scamgate update-feeds、scamgate_update_feeds ツール、バックグラウンド更新です。すべて同じダウンローダーを使用します。チェックではローカルキャッシュを読み込みます。このリポジトリにはフィードデータは含まれていません。

scamgate update-feeds            # default feeds
scamgate update-feeds --all      # also the large opt-in feed
scamgate update-feeds -f openphish
scamgate feeds-status

キャッシュは、$SCAMGATE_CACHE_DIR、設定されていない場合は $XDG_CACHE_HOME/scamgate、それも設定されていない場合は ~/.cache/scamgate に保存されます。各フィードのファイルは個別に保存され、meta.json に取得時刻、ソース、件数が記録されます。ダウンロードに失敗したフィードについては、以前のキャッシュが保持されます。フィードがキャッシュされていない場合、またはフィードが24時間以上古い場合、判定時に警告が表示されます。稼働中の MCP サーバーは、再起動せずに更新済みのキャッシュを読み込みます。

フィードデフォルトソースライセンス/利用規約
openphishはいOpenPhish コミュニティフィードOpenPhish 利用規約:個人の非商用利用のみ。再配布は禁止されています。商用利用には OpenPhish の書面による同意が必要です
phishing_database_domainsはいPhishing.Database のアクティブなドメインMIT
phishing_database_links--allPhishing.Database のアクティブなリンク(ダウンロードサイズ約65 MB)MIT
urlhausキーが設定されている場合abuse.ch URLhaus のオンラインマルウェア URL無料の abuse.ch Auth-Key が必要です(SCAMGATE_URLHAUS_AUTH_KEY)。公正利用規約が適用されます。商用利用には有料プランが必要な場合があります

各フィードの利用規約を守る責任は利用者にあります。使用していないフィード:PhishTank(新規登録は無効)と Google Safe Browsing/Web Risk(非商用利用のみ、または有料)。

照合:リストにある URL と完全一致する場合はスコア100、リストにあるホストと完全一致する場合は75、リストにあるドメインのサブドメイン(ドメインフィードのみ)の場合は50です。

長時間稼働する scamgate serve は、自動で更新できます。SCAMGATE_AUTO_UPDATE=1 を設定して起動してください(Claude Code プラグインでは auto_update_feeds をオフにしない限り自動で設定されます)。リストが6時間経過した場合にのみダウンロードします。それ以外の場合は、たとえば6時間ごとに cron で更新します。

0 */6 * * * cd /path/to/scamgate && uv run scamgate update-feeds >> ~/.cache/scamgate/update.log 2>&1
Hermes プラグインでの使用

プラグインはデフォルトのフィードを自動で更新します。Hermes の起動から約2分後、その後は Hermes の稼働中、6時間ごとに更新します。cron の設定は不要です。キャッシュフォルダー内のロックファイルにより、一度にダウンロードする Hermes プロセスは1つに制限されます。失敗はログに記録され、古いリストが保持されます。手動で更新するには:

/scamgate update                  # in a chat
hermes scamgate update-feeds      # in a terminal
hermes scamgate feeds-status

エージェントには scamgate_update_feeds ツールが提供されるため、古くなったリストを自分で更新できます。このツールに引数はありません。常に、固定ソースからデフォルトのフィードを設定済みのキャッシュにダウンロードし、直近1時間以内に更新されている場合は何もしません。エージェントは更新を要求できますが、ダウンロードする内容や保存先を選ぶことはできません。独自の引数でダウンローダーを呼び出すシェルコマンドはブロックされますが、キャッシュフォルダーへの直接書き込みは引き続き可能です。

バックグラウンド更新を無効にするには、plugins.entries.scamgate.settings.auto_update_feeds: false または SCAMGATE_AUTO_UPDATE=0 を設定します。更新時に、チェック対象のリンクに関する情報が送信されることはありません。リスト全体がダウンロードされます。

独自のブロックリスト: src/scamgate/data/blocklist.txt (または $SCAMGATE_BLOCKLIST)。このファイルには、作成された .example ドメインがいくつか含まれています。

誤検知

フィードには、大規模な共有プラットフォーム(Google Docs と Sites、Firebase ストレージ、Microsoft ログイン、Discord CDN、リンク短縮サービス)上にある個別の不正ページが掲載されています。こうしたホスト全体を検知すると、正常なサイトまでブロックしてしまいます。lists.feed_host_ignore に設定されたドメイン(およびそのサブドメイン)と、公式ブランドドメインでは、URL が完全一致した場合のみ検知されます。rules.yaml を参照してください。x.vercel.app にあるフィッシングページが、vercel.app を検知させることはありません。その代わり、無視対象のプラットフォームのサブドメインにある詐欺は、URL が完全一致した場合にのみ検知されます。

設定

重み、しきい値、ブランドリスト、単語リストは src/scamgate/config/rules.yaml にあります。SCAMGATE_CONFIG を 独自のコピーに設定すると、設定を上書きできます。ルールを追加するには、 src/scamgate/rules/ に @register("url.my_rule", kind="url") を付けた 関数を記述し、rules.yaml の rules: の下に項目を追加して、テストとシナリオを追加します。

ベンチマークとテスト

scenarios/ には、期待される判定をそれぞれ設定した、手書きの例ケースが24件(詐欺17件、正当なもの7件)あります。

$ uv run scamgate bench
...
Scams: 17  caught: 17  missed: 0
Legit: 7  false positives: 0
Exact decision match: 24/24

これはルールの回帰チェックであり、実世界での検出率ではありません。uv run pytest を実行するとユニットテストが実行されます(v0.3.3時点で1013件。CIではPython 3.11~3.13で実行されます)。テストではフィクスチャを使用し、ネットワークには一切接続しません。

制限事項

  • デフォルトでは警告のみです。 MCP経由では警告するだけで、エージェントが呼び出す必要があります。強制するには フックをインストールしてください。それでもツール呼び出ししか確認できません。エージェントがリダイレクト経由でたどるリンクや、変数内に隠された宛先はチェックされないため、確認が必要です。
  • ヒューリスティックルールでは、該当しない詐欺を見逃したり、正当な操作を誤って検知したりすることがあります。 allow は「既知の危険信号がない」という意味であり、「安全」という意味ではありません。
  • ドメインの登録期間を確認するにはオプトインが必要です(SCAMGATE_RDAP=cache または live。下記参照)。ライブ検索では、確認対象のサイトがどこかをドメイン登録機関に知らせるためです。
  • 既知のトレードオフ:長いブランド名と1文字違いの単語(stripes.com と stripe など)でも確認が求められます。新しい受取人への銀行振込では、銀行のVerification of Payeeで名前が一致しない限り、確認が求められます(25)。新しい受取人へのカード払いでは確認は求められません。
  • フックが確認するのはツール呼び出しの引数であり、実行後にプログラムが行う処理ではありません。ローカルスクリプト、バイナリ、パッケージのインストールスクリプトがネットワークに接続しても、コマンドラインに示されていなければ検知されません。デコードまたはダウンロードしてから実行するコード(base64 -d | bash、exec(b64decode(…))、powershell -enc)では確認が求められます。
  • ブランドパックには、フィッシングの標的として特に多いブランド約50件に加え、アイルランドと英国の銀行、宅配業者、サービスが含まれています。独自のものは lists.brands の下に追加してください。登録可能ドメインの判定には、完全なPSLではなく、厳選したサフィックスリスト(国別の第2レベルドメインや、github.io、vercel.app などの共有ホスト)を使用します。
  • 受取人の履歴に記録されるのは、record-payment で登録した受取人だけです。scamgateはIBANを検証せず、銀行にも問い合わせません。
  • 改ざん防止機能は、エージェントの通常のツールによる次の操作を防ぎます。scamgate本体、状態データ、フィードキャッシュへの書き込み、仮想環境への書き込み(新しい .pth ファイルは整合性チェックに失敗します)、~/.claude(設定、フック、インストール済みプラグイン)およびプロジェクトの .claude/settings*.json への書き込み、さらにパスの表記方法(~、$HOME、グロブ、cd と相対パス、./、//、..)にかかわらずHermes設定への書き込みです。パスがフォルダー自体を指定している場合にのみ保護対象となります。~/.cache/scamgate-feeds.log は ~/.cache/scamgate 内にはありません。読み取りのみを行うコマンド(ls、cat、head、tail、grep、rg、find、stat、which、wc、du、sha256sum)は、/dev/null 以外へのリダイレクト、$(…)、バッククォート、-exec、-delete、-fprint、--pre が含まれない限り、保護対象パスに対しても実行できます。Claude Codeプラグインを無効化または削除するエージェントのコマンドや、すべてのフックをスキップするベアモードでClaudeを起動するコマンドもブロックされます。ただし、これはサンドボックスではありません。ユーザー権限で実行されるコードは署名鍵を読み取って任意のファイルを書き換えられます。また、パターンマッチングを回避するコードを作成することもできます。最も強固な構成にするには、エージェントに直接シェルアクセスを与えず、エージェントのユーザーが書き込めない場所にscamgateをインストールし(別のユーザーとして uv tool install を実行するか、読み取り専用にする)、Claude Codeでは allowManagedHooksOnly を使って管理対象設定にフックを登録してください。
  • Hermesはファイルのハッシュではなくコマンド文字列でフックを信頼するため、インストール済みのscamgateが置き換えられても検知しません。整合性チェックでは、インストール済みファイルの編集を検出します。

免責事項: scamgateは金融、法律、セキュリティに関する助言ではなく、銀行の不正対策、Verification of Payee、または人による判断に代わるものではありません。

ロードマップ

  • IBAN チェックサム検証と Verification of Payee の統合
  • リダイレクト後の確認:ブラウザーが実際に移動したページを再確認
  • 曖昧なケースのみでタイブレーカーとして使用するオプションのローカルモデル。厳格なルールを覆すことはありません
  • 完全版 Public Suffix List(任意、キャッシュ済み)
  • 実際の詐欺の類型に基づくシナリオの追加

コントリビューション

Issue やプルリクエストを歓迎します。特に、新しいルール、シナリオ(詐欺と正当なもの)、誤検知の報告を歓迎します。ルールを変更する際は、それぞれにテストまたはシナリオを含め、チェックがオフラインで決定論的に動作するようにしてください。作業を始める前に CONTRIBUTING.md を読み、セキュリティ上のバグは非公開で報告してください(SECURITY.md)。リポジトリの規約については AGENTS.md を参照してください。

最初の外部からのコントリビューションを寄せてくれた @simin-yuan に感謝します。#20 の報告と、長いコマンドでフックを線形時間で動作させる #21 および #22 の修正です。

ライセンス

MIT。フィードデータは含まれておらず、各プロバイダー独自の規約に従います。

M8ven スコア

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。