mcpField
S
scamgate

scamgate

本地服务
odaiameera.github.io安全13 天前更新

关于 scamgate

scamgate 是可自托管的本地 MCP 服务,在 AI Agent 执行操作前检查链接和付款。它通过确定性规则给出允许、询问或拒绝的判定及评分理由,检查过程不发起网络请求。

主要功能

  1. 01基于确定性规则评估链接和付款风险
  2. 02提供允许、询问或拒绝判定及理由
  3. 03检查仿冒链接和已知恶意链接
  4. 04评估收款方、付款方式和紧迫性
  5. 05通过 Hook 拦截 Agent 工具调用
  6. 06提供信息源更新和状态命令

适用场景

  1. 01Agent 打开链接前进行检查
  2. 02汇款前审查付款信息
  3. 03对不确定或无法读取的操作要求批准
  4. 04通过 Hook 阻止可疑目标的工具调用

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是Agent 即将打开的完整 URL。
intentany否Agent 正在尝试执行的操作,例如 "book a hotel in Galway"。

详细介绍

scamgate

scamgate

持续集成 最新版本 许可证:MIT Python 3.11+ MCP 服务 GitHub 星标数 M8ven 评分

为 AI Agent 提供的可自托管诈骗检测工具:在 Agent 执行操作前验证链接和付款。

网站和文档: https://odaiameera.github.io/scamgate/

AI Agent 现在会替人点击链接和付款,诈骗者也盯上了这些钱财。植入网页、商品信息或消息中的文本可能会诱导 Agent 访问假商店、凭据输入页面,或提出“通过银行转账付款”的请求。Agent 付款渠道会保障付款本身(令牌、限额、身份验证),但不会判断收款方或网站是否涉嫌诈骗。scamgate 会进行这项检查,在本地作为 MCP 服务运行,检查期间不会发出网络请求。

判定方式

  • 使用确定性规则,不由大模型进行判断。相同输入始终会得到相同判定。
  • 每条触发的规则都会累加分数,并提供通俗易懂的原因。总分(最高为 100)决定结果:
    • 允许:低于 25
    • 询问(停止操作并向用户确认):25 到 69
    • 拒绝:70 或更高
  • Agent 会收到判定结果、分数、所有原因和任何警告(例如缓存的源数据已过期)。

链接规则: 已知恶意链接源、你自己的屏蔽列表、仿冒品牌的域名(拼写仿冒、同形异义字符、非官方域名中的品牌名称、作为前缀使用的真实域名,例如 paypal.com.secure-login.xyz)、藏在 @ 前面的地址([email protected])、原始 IP 主机、punycode、易遭滥用的廉价顶级域名,以及要求提供种子短语或与任务无关的登录信息的页面。无法读取的链接(无效的网站名称、javascript: 或 data: 链接、过长的地址)会触发询问:绝不会被允许。

付款规则: 新收款方同时附带紧急要求、银行信息变更、不可逆的付款方式(加密货币、礼品卡、向新收款方转账)、卖家坚持指定付款方式、超出预算、施压或要求保密的措辞,以及收款人验证结果。

快速开始

需要 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(通过标准输入输出运行 MCP),以及 hook、review、promote 和 record-payment(参见使用钩子强制执行)。

添加到你的 Agent

Claude Code 插件

这是在 Claude Code 中使用的最简单方式。安装一次即可添加强制执行钩子、check_url、check_payment 和 update_feeds 工具,并每 6 小时刷新一次钓鱼列表。它通过 uvx scamgate==0.3.3 从 PyPI 运行 scamgate,因此需要安装 uv,并且 Claude Code 版本需为 v2.1.295 或更高版本,确保无法启动的钩子会阻止调用,而不是放行。

/plugin install scamgate --marketplace odaiameera/scamgate

对于低于 2.1.275 的 Claude Code,请运行 /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"]

然后告诉 Agent:“打开任何链接前都调用 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 不接受任何参数:它每小时最多从固定来源下载一次默认列表,因此 Agent 可以请求刷新,但无法选择哪些内容进入缓存。

使用钩子强制执行

只有当 Agent 选择调用 MCP 工具时,这些工具才会生效,而提示词注入可以让它不调用。钩子将检查移入运行框架:Agent 无法跳过检查。

scamgate-hook(或 scamgate hook)从标准输入读取一个 JSON 格式的钩子事件,并输出一项判定。 它支持 Hermes shell 钩子和 Claude Code PreToolUse 钩子。

  • **链接:**会检查 Web、浏览器、媒体、终端、代码或未知 MCP 工具调用中的每个 URL,包括伪装形式(evilsh%6fp.com、http://3405803781)。deny 会阻止调用,ask 会将其提交给你审批。批量调用中只要有一个链接有问题,就会阻止整个批次。
  • **支付:**涉及资金转移的工具调用(钱包、银行或支付 MCP 工具,或任何参数中包含金额及 IBAN、钱包或账户的工具)都会接受与 check_payment 相同的检查,依据是你的收款方历史记录,而不是 Agent 的说法。deny 会阻止调用,ask 会将其提交给你。无法读取收款方或金额的支付、加密货币 CLI(cast send、bitcoin-cli sendtoaddress、solana transfer 等),以及对支付 API(Stripe、PayPal、Wise、Revolut Business 等)的写入调用,都会提交给你审批。每次审批仅适用于一个账户和一个金额。
  • **隐藏代码:**先解码或下载、再运行的代码(… | base64 -d | bash、exec(b64decode(…))、curl … | sh、powershell -enc)都会提交给你审批,无论是否包含网络关键词。
  • **隐藏目标地址:**如果 scamgate 无法读取某个网络操作,就会按命令逐条提交给你审批(curl https://example.org; curl "$URL" 仍会触发询问):变量、$(…)、拼接出的链接、经 base64/十六进制解码或反转的链接、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 会将其改为警告)。每次审批请求都会提及过期的信息源,并阻止调用。
  • **防篡改:**会阻止 Agent 写入 scamgate 自身的代码、状态和信息源缓存,以及钩子配置;涵盖 vim/ed/nano 等编辑器,以及 find -exec、rsync、patch。也会阻止撤销钩子、移除服务、提升规则、记录收款方或直接调用 scamgate 状态 API 的命令或代码。
  • **Agent 声明的理由只能增加风险。**系统会分别评估包含和不包含该理由的情况,并采用较高的风险分数。
  • **审批范围严格受限。**Hermes 会按 rule_key 记住“始终允许”;scamgate 的密钥包含主机和触发的规则(或隐藏命令的哈希值),因此一次“始终允许”无法预先批准其他目标地址。不过,对于预计不会重复的审批请求,请选择“一次”。
  • **失败时默认拒绝:**输入无效、输入超过 2 MB、嵌套过深或发生内部错误时,会阻止调用(退出码 2)。
  • **长命令仍能快速处理。**钩子只用一次线性扫描读取命令中的词(不使用 shlex),因此填充过长的命令也无法拖慢它:在一台 Windows 机器上,处理一条 2,000,000 个字符的带引号命令约需 5 秒,低于原先的 200 多秒。判定结果不变。
  • **永远不会说“允许”。**沉默表示“无异议”,因此它只会收紧 Agent 的权限,不会放宽权限。
流程

hook.handle() 是唯一的强制执行函数。shell 钩子和 Hermes 插件都会调用它。MCP 不会调用。

  1. wheel 安装的完整性检查。一旦不匹配,所有受保护的调用都会被拦截。可编辑安装和未打包安装会以 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 分别使用和不使用 Agent 的理由进行评分。取较高分,然后采用最严格的决策。目标地址无法读取时会询问。干净 URL 超过 20 个时会询问。
  7. 付款结果与通用网络询问结果打平时,付款结果优先。URL 拒绝仍优先于付款询问。
  8. 静默时输出 {};其他情况下输出 Hermes 的 block / approve,或 Claude 的 deny / ask。记录询问或拒绝。

rule_key 是主机名加规则 ID,或者不透明命令的哈希值。对一个主机的“始终允许”不适用于其他主机。

插件可以看到每个聊天会话的 /yolo 和 approvals.mode: off,并会将询问转为拦截,除非 when_approvals_off 设为 allow。Shell 钩子无法看到这些会话状态。在一台 Windows 机器上测得:每个 shell 钩子进程约需 0.5–0.7 秒,进程内约需 10 毫秒。这不是基准测试套件。

请求发出后,它无法看到重定向,也无法了解已编译二进制文件的行为,或未在调用中指定的脚本。同一用户身份下,Agent 以外的代码仍可读取签名密钥。详情:文档,运行机制。

Hermes(~/.hermes/config.yaml)。需要使用支持 "action": "approve" 的 Hermes 构建版本(旧版本会丢弃该值,导致所有询问都直接通过;已于 2026 年 9 月在 issue #92553 中修复)。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

注意:使用 shell 钩子时,/yolo 或 approvals.mode: off 会自动批准所有 scamgate 询问(拦截仍然有效)。下面的 Hermes 插件会改为拦截这些询问,除非设置 plugins.entries.scamgate.settings.when_approvals_off: allow。

Hermes 插件(推荐)。检查内容与 shell 钩子相同,在进程内运行,速度快约 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]), 而不是从源码检出目录运行:已安装的副本会在每次调用时,将自身文件与安装时记录的 哈希值进行比对;如果文件发生变化,就会阻止所有操作。源码检出目录没有可供比对的记录。

每次受控调用都会启动一个进程(在 Windows 上约需 0.7 秒)。不访问网络或不涉及 scamgate 文件的调用会直接通过。

查看、审核并提升信任级别

每次 ask 和 deny 都会记录到 $SCAMGATE_STATE_DIR(默认为 ~/.local/state/scamgate) 中,其中包含已脱敏的目标、触发的规则、评分、Agent 给出的理由(供你查看,并标记为 不可信;在评分中它只能增加风险),以及你随后是否允许其运行。

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 会要求确认;如果没有交互式终端,或在已知 Agent(Claude Code、Hermes、Codex)内部运行,则会拒绝执行,即使 Agent 直接导入 scamgate 的代码也是如此。每条例外规则都会使用状态目录中的密钥进行签名,因此,以其他方式写入文件的规则行都会被忽略。deny 会覆盖该主机及其子域名。allow 的适用范围很窄:它只会豁免一条规则对一个精确主机的限制,并且绝不会豁免已知恶意源、你的屏蔽列表、意图检查或你自己的拒绝规则,因此攻击者无法诱使防护机制信任整个域名。

收款方历史记录

check_payment 不会轻信 Agent 对 is_new_payee 的判断。它会在本地历史记录中查询你实际支付过的收款方(以加盐哈希存储,不记录姓名或账号)。它会标记:

  • 你以前支付过的收款方,这次使用了不同的账号(银行信息已变更);
  • 使用新账号的近似名称(例如 “Acme Trading Ltd”、“Acmee Ltd”,或 “Acme” 中使用了西里尔字母 “е”):这是典型的发票转账诈骗手法;
  • 你以前支付过的账号,这次使用了不同的名称;
  • Agent 将收款方称为“已知”,但没有支付记录的情况(会增加风险)。

只有你能在实际付款后添加记录,方式与添加例外规则相同:需要交互式终端、不能在 Agent 内运行,并且必须签名。如果历史记录的密钥或盐值丢失,所有收款方都会被视为新收款方且信息已变更,而不是悄无声息地忘记所有人。

scamgate record-payment --payee "Acme Ltd" --account IE29AIBK93115212345678
域名年龄(可选启用)

新域名是网店诈骗的重要信号(url.domain_age,域名注册未满 30 天时计 30 分)。查询域名年龄需要通过 RDAP 联系域名注册管理机构,这会让注册管理机构知道你在检查哪个网站,因此默认关闭,需由你选择启用:

SCAMGATE_RDAP行为
off(默认)不进行查询。该规则不会触发。
cache使用已缓存的域名年龄;绝不会联网。使用 scamgate domain-age HOST 填充缓存。
live查询未知域名(超时设为 3 秒),并将结果缓存一年(失败结果缓存 7 天)。

官方品牌域名、共享平台、IP 和 localhost 均不会被查询。注册管理机构信息来自 IANA 的 RDAP 引导列表,并缓存在 feed 缓存目录中。

已知恶意链接信息源

只有刷新信息源时才会访问网络: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 启动(除非关闭 auto_update_feeds,否则 Claude Code 插件会启用此功能)。只有列表超过 6 小时未更新时才会下载。否则,可通过 cron 刷新,例如每 6 小时一次:

0 */6 * * * cd /path/to/scamgate && uv run scamgate update-feeds >> ~/.cache/scamgate/update.log 2>&1
在 Hermes 插件中

插件会自行刷新默认信息源:Hermes 启动约两分钟后刷新一次,之后在 Hermes 运行期间每 6 小时刷新一次。无需设置 cron。缓存目录中的锁文件可确保同一时间只有一个 Hermes 进程进行下载。失败会记录日志,并保留旧列表。手动刷新:

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

Agent 可使用 scamgate_update_feeds 工具自行刷新过期列表。该工具不接受参数:它始终会从固定来源下载默认信息源并存入配置的缓存;如果最近一小时内已刷新,则不会执行任何操作。Agent 可以请求刷新,但不能选择下载内容或存放位置。通过命令行调用下载器并传入自定义参数的命令会被拦截,但仍可直接写入缓存目录。

将 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、短链接服务)。将这些主机整体标记为恶意会阻止正常网站。对于 rules.yaml 中 lists.feed_host_ignore 下的域名(及其子域名)和官方品牌域名,只有完全匹配的 URL 才会计入。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,它只会发出警告,而且必须由 Agent 调用。安装 钩子 才能强制执行。即便如此,它也只能看到工具调用:如果 Agent 通过重定向访问链接,或目标网址藏在变量中,就需要你批准,而不是进行检查。
  • 启发式规则会漏掉不符合规则的诈骗,有时也会将合法操作标记为风险。 应将 allow 理解为“没有已知风险信号”,而非“安全”。
  • 域名年龄检查需要主动启用(SCAMGATE_RDAP=cache 或 live,见下文),因为实时 查询会让域名注册机构知道你正在检查哪个网站。
  • 已知取舍:与长品牌名只差一个字母的词仍会触发询问(stripes.com 与 stripe)。向新收款方进行 银行转账时会询问(25),除非你的银行的收款方验证(Verification of Payee)已匹配 名称;向新收款方进行银行卡支付则不会。
  • 钩子看到的是工具调用的参数,而不是程序运行后执行的操作:如果本地脚本、 二进制文件或软件包安装脚本访问网络,除非命令行中能看出来,否则它无法检测到。解码或下载后再运行的代码 (base64 -d | bash、 exec(b64decode(…)、powershell -enc)会触发询问。
  • 品牌包涵盖约 50 个最常遭钓鱼的品牌,以及爱尔兰/英国的银行、快递公司和服务;你可以在 lists.brands 下添加自己的品牌。可注册域名使用精选的后缀列表 (国家二级域名和 github.io、vercel.app 等共享主机域名),而不是完整的 PSL。
  • 收款方历史记录只包含你通过 record-payment 记录过的收款方。scamgate 不会 验证 IBAN,也不会联系你的银行。
  • 防篡改机制会阻止 Agent 使用常规工具修改 scamgate、其状态和信息源缓存、其虚拟环境(新增 .pth 文件会导致完整性检查失败)、~/.claude(设置、钩子和 已安装的插件)、项目中的 .claude/settings*.json 以及 Hermes 配置,无论路径采用何种写法(~、$HOME、 通配符、cd + 相对路径、./、//、..)。只有指向文件夹本身的路径才会被视为目标:~/.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 插件的 Agent 命令,以及以裸模式启动 Claude(会跳过所有钩子)的命令,也会被阻止。但这不是沙箱:以你的身份运行的代码可以读取签名密钥并改写任何文件,也可以编写代码绕过模式匹配。要获得最强保护,请勿向 Agent 提供直接 Shell 访问权限;将 scamgate 安装到 Agent 用户无法写入的位置(由其他用户运行 uv tool install,或设为只读);对于 Claude Code,则将钩子放入托管设置,并启用 allowManagedHooksOnly。
  • Hermes 根据钩子的命令字符串而非文件哈希来信任钩子,因此无法发现已安装的 scamgate 被替换。完整性检查会检测已安装文件是否被修改。

免责声明: scamgate 不构成财务、法律或安全建议,也不能替代你银行的欺诈防范措施、收款方验证(Verification of Payee)或人工判断。

路线图

  • IBAN 校验和验证及收款人验证集成
  • 重定向后检查:重新检查浏览器实际跳转到的页面
  • 可选的本地模型,仅用于对模糊情况进行仲裁,绝不推翻硬性规则
  • 完整的公共后缀列表(可选,已缓存)
  • 基于真实欺诈类型的更多场景

贡献

欢迎提交问题和拉取请求,尤其是新规则、新场景(诈骗和合法场景)以及误报报告。请为每项规则更改附上测试或场景,并确保检查过程离线且结果确定。开始之前,请阅读 CONTRIBUTING.md,并通过私下渠道报告安全漏洞(SECURITY.md)。仓库规范请参阅 AGENTS.md。

感谢 @simin-yuan 的首批外部贡献:#20 中的报告,以及 #21 和 #22 中的修复,这些修复让钩子在处理长命令时保持线性复杂度。

许可证

MIT。不包含信息源数据,且这些数据仍受各提供方自身条款约束。

M8ven Score

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。