关于 isMalicious threat intelligence for AI agents
isMalicious MCP 服务为 AI Agent 提供威胁情报查询与内容扫描,适用于需要在访问链接或处理邮件前评估风险的场景。它涵盖指标信誉、CVE、提示注入和邮件扫描,并提供本地与远程连接方式。
主要功能
- 01查询 IP、域名、URL、文件哈希、邮箱和电话信誉
- 02扫描不可信文本中的提示注入
- 03查询 CVE 与近期漏洞
- 04扫描邮件中的钓鱼和恶意软件
- 05监控域名及依赖漏洞
适用场景
- 01Agent 使用外部链接前检查其信誉
- 02处理输入前筛查提示注入内容
- 03按 CVE 查询漏洞详情和利用情况
- 04检查邮件是否包含钓鱼或恶意软件
MCP 相关
该项目是 MCP 服务,向客户端提供威胁指标查询、CVE 检索、提示注入检测和邮件扫描等工具。可通过本地进程或 Streamable HTTP 远程端点连接。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://api.ismalicious.com/mcpclaude mcp add --transport http com-ismalicious https://api.ismalicious.com/mcp{"mcpServers":{"com-ismalicious":{"type":"http","url":"https://api.ismalicious.com/mcp"}}}在 Cursor 中打开{"servers":{"com-ismalicious":{"type":"http","url":"https://api.ismalicious.com/mcp"}}}在 VS Code 中打开{"mcpServers":{"com-ismalicious":{"type":"http","url":"https://api.ismalicious.com/mcp"}}}{"mcpServers":{"com-ismalicious":{"serverUrl":"https://api.ismalicious.com/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
https://api.ismalicious.com/mcp需要授权工具
1| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| string | 是 | 将拥有此密钥的电子邮件地址。 |
详细介绍
@ismalicious/mcp-server
一个零依赖的 Model Context Protocol 服务,为 AI Agent 提供 isMalicious 威胁情报:针对 IP 地址、域名、URL、文件哈希、电子邮件地址和 电话号码的信誉判定、CVE 目录、isinjected 门控工具(会在 Agent 对不可信内容采取行动前扫描其中的提示词注入),以及一个可读取整封电子邮件并检查其中网络钓鱼和恶意软件的扫描器。
安装
{
"mcpServers": {
"ismalicious": {
"command": "npx",
"args": ["-y", "@ismalicious/mcp-server"],
"env": {
"ISMALICIOUS_API_KEY": "your-api-key",
"ISMALICIOUS_API_SECRET": "your-api-secret"
}
}
}
}
密钥:https://ismalicious.com/app/account。可申请免费密钥。若没有这两个
变量,服务仍会启动,但只提供 bootstrap_key,用于通过电子邮件地址生成
免费密钥,并在当前会话中使用(见下文)。
注册表名称:com.ismalicious/mcp-server
(https://registry.modelcontextprotocol.io/v0/servers?search=ismalicious)。
远程(Streamable HTTP)
同一服务也运行在 https://api.ismalicious.com/mcp,供通过 URL 连接而非启动进程的客户端使用。每个请求都要发送一对密钥:
Authorization: Bearer <apiKey>:<apiSecret>
<apiKey>:<apiSecret> 的 base64 编码也可使用;也可以通过 X-API-KEY 请求头发送。Claude Code:
claude mcp add --transport http ismalicious https://api.ismalicious.com/mcp \
--header "Authorization: Bearer <apiKey>:<apiSecret>"
接受 JSON 配置项的客户端(Cursor 等):
{
"mcpServers": {
"ismalicious": {
"url": "https://api.ismalicious.com/mcp",
"headers": { "Authorization": "Bearer <apiKey>:<apiSecret>" }
}
}
}
与本地服务的区别:
- 没有
check_password_exposure。 它承诺密码不会离开你的设备;使用 HTTP 时,完整密码会发送到我们的服务器。需要使用本地服务来运行此工具。 - 没有
bootstrap_key。 请在 https://ismalicious.com/app/account 获取免费密钥。 - 列出工具无需密钥,调用工具需要密钥。 不提供密钥时,
initialize、tools/list和ping会正常响应(因此目录爬虫可以看到这些工具),但任何工具调用都会返回 401。若提供了密钥,服务会通过GET /gate/quota验证,不会产生费用;密钥无效时,任何请求都会返回 401;密钥有效时,5 分钟内不会再次验证。 - 无状态。 每个 POST 请求包含一条 JSON-RPC 消息(或一个最多包含 10 条消息的批次,按顺序执行,且最多包含一次
tools/call),并以application/json格式响应;没有会话,也没有 SSE 流(GET返回 405)。请求需要字符串或数字类型的id:若没有id,只会处理notifications/*,其他请求均会被丢弃且不作响应。没有密钥时,请求正文限制为 64 KiB。notifications/cancelled会在另一个请求中到达,不会取消任何操作;关闭连接会取消该连接承载的调用。ismalicious://quota资源会报告扫描用量,不会报告先前调用的请求头。 - 截止时间。
check_indicators的超时为 50 秒,而非 60 秒,以符合边缘服务本身的超时限制;其他工具保持原有超时。即使客户端不再等待,调用仍会计费,因此每次调用应为客户端至少设置 60 秒的超时(OpenSRE 的 MCP 网关需将timeout_seconds设为 90,因为其 30 秒默认值要同时覆盖工具列表会话和工具调用会话)。 - 计费规则相同。 每次工具调用的费用与本地调用相同;针对同一密钥的请求共用结果缓存(见延迟),因此在缓存有效期内重复调用仍免费。下方的环境变量不适用。
每个查询工具均为只读(readOnlyHint: true)。对于 OpenSRE MCP 网关这类仅允许未经确认运行认证只读工具的网关,以下九个远程工具符合条件:scan_before_use、check_url、check_indicator、get_cve、recent_cves、search_indicators、check_indicators、scan_email、exploited_cves。0.8.0 版本新增的三个漏洞监控工具会更改账户,并会对此作出说明(readOnlyHint: false、destructiveHint: false):watch_domain 和 watch_dependencies 会开始监控一个来源(idempotentHint: true:再次添加时会返回已监控的来源),ack_finding 会设置发现项的状态。
如需自行提供服务,@ismalicious/mcp-server/streamable-http 会导出 handleStreamableHttp(request, options),使用符合 Web 标准的 Request 和 Response。
工具
| 工具 | 它能回答什么 | 费用 |
|---|---|---|
scan_before_use | 对一段不可信文本进行提示词注入扫描和链接信誉检查。block | warn | allow。 | 1 次扫描 |
check_url | 在抓取之前检查单个 URL、域名或 IP 的信誉。block | warn | allow。 | 1 次扫描 |
check_indicator | 适用于任何单个指标的工具:IP、域名、URL、文件哈希(MD5、SHA-1、SHA-256)、电子邮件地址或电话号码,无论是否经过脱敏。返回 verdict(malicious/suspicious/clean/unknown — 电子邮件地址或电话号码绝不会判定为 clean)、可原样转述的 headline、recommendedAction(block/review/allow/unverified)、0–100 风险分数、引用的威胁阻止列表、最多三个证据 reasons、infrastructure(云、CDN、Tor 出口节点等)、首次/最近发现时间、网络、注册或文件背景信息。默认采用 fast 模式(不进行实时 DNS、WHOIS 或 OTX 调用;冷门哈希可能需要等待约 2.5 秒,由 CIRCL 查询)。小于 4 KB。 | 1 次请求 |
get_cve | 根据 ID 查询单个 CVE:描述、CVSS、EPSS、CISA KEV 状态和截止日期、已记录的利用证据(SSVC、Exploit-DB、Nuclei、MSRC)、受影响的软件包和修复版本(OSV.dev)、供应商公告(CSAF)及参考资料。未记录证据并不能证明没有利用行为。这是唯一的 CVE 查询途径。 | 1 次请求 |
recent_cves | 最新 CVE,可选 severity,最多 20 条。 | 1 次请求 |
search_indicators | 搜索语料库中与品牌或域名相似的域名——包括仿冒拼写、同形异义字符、其他 TLD 或主机,以及包含钓鱼词的组合——并按危险程度从高到低排列。total_hits 统计上游样本数量;已知有省略内容时,truncated 为 true,未知时为 null。后续可使用 check_indicators 查询判定结果。 | 在 api.ismalicious.com 上为 1 次请求;仅默认基础 URL 有突发请求限制 |
check_indicators | 一次调用最多检查 100 个、属于六种类型中任意类型的指标:每行返回 malicious、recommendedAction(block/escalate/review/monitor/allow/unverified)、风险、阻止列表数量、类别、lookupStatus 和 infrastructure。每个提交的唯一指标都会计为一次请求,包括 API 无法识别类型的行;SHA-512、TLSH 和 ssdeep 行会在本地拒绝,不产生费用。套餐批量上限分别为:Free 10、Basic 50、Pro 100。 | 每个指标 1 次请求 |
check_password_exposure | 检查密码或其 SHA-1、NTLM 哈希是否出现在已知泄露数据转储中(Have I Been Pwned 的 Pwned Passwords),并返回出现次数。密码会在本地进行哈希;只会发送哈希的前 5 个十六进制字符。 | 1 次请求 |
scan_email | 扫描单封电子邮件,检查是否存在钓鱼和恶意软件:可提供原始 eml 或解析后的 message。返回 verdict(malicious/suspicious/clean/inconclusive)、recommendedAction(quarantine/review/warn/deliver)、0–100 风险分数、可转述的 headline、最有力的 reasons、coverage.skipped。判定为 malicious 需要该邮件被列入数据集;判定为 clean 需要你自己的系统通过 DMARC,且数据集已知发件人域名信誉良好;deliver 绝不会放行被其他引擎拦截的邮件。对于原始邮件,也会读取附件结构;但不会运行附件或抓取链接。 | 每封邮件 1 次扫描 |
exploited_cves | 列出最近 days 天内有确证利用行为的 CVE(默认 7 天):confirmed(CISA KEV、CISA SSVC active,或两个独立目录确认)或 reported(一个目录确认);先列出已确证项,并附严重程度、CVSS、EPSS、首次和最近证据、KEV 日期、补丁、来源,以及本周与每项关联的指标(未知时不显示)。无需密钥即可使用。 | 使用密钥时每次请求 1 次;不使用密钥时受 IP 速率限制 |
watch_domain | 开始监控一个公开网站的漏洞:立即并每日读取其标头、生成器标签、带版本号的脚本和端口,并将每个带版本号的组件与 CVE 进行匹配。返回来源、组件,以及包含优先级和修复方案的未解决问题。 | 占用套餐的 1 个受监控来源 |
watch_dependencies | 根据项目的锁文件或 SBOM 文本开始漏洞监控(package-lock.json、composer.lock、requirements.txt、Gemfile.lock、Cargo.lock、CycloneDX JSON;最大 5 MiB)。根据版本将依赖项与 OSV 和 NVD 范围进行匹配;默认不包含开发依赖项。 | 占用套餐的 1 个受监控来源 |
ack_finding | 设置单个问题的状态:ACKNOWLEDGED、PATCHED、NOT_AFFECTED,或将其 SNOOZED 至指定日期(最长 90 天)。发生 KEV 或报告的利用行为时,问题会自动重新打开。 | — |
bootstrap_key | 仅在未配置密钥时使用:通过电子邮件获取免费密钥,每个 IP 每天限领一个。 | — |
默认搜索 API 会将裸关键词视为其 .com 域名(paypal → | ||
paypal.com),并最多返回 500 个已收录的相似域名。limit 只会缩小 | ||
| 该样本范围。只会返回已收录的域名,而且不会匹配隐藏在更长主机名中的名称,因此空结果并不能证明不存在相似域名。 | ||
MCP 结果将 total_hits_scope 标记为 upstream_sample。对于缺少完整性元数据的旧版或自定义 API 响应,truncated: null。 |
扫描和请求是两种计量单位:https://ismalicious.com/api-docs。
指标类型
check_indicator 和 check_indicators 会像 API 一样,在发起任何
请求之前对每个指标进行类型判定:
| 类型 | 识别为 |
|---|---|
| IP | IPv4、IPv6(包括 ::ffff:1.2.3.4 和 [2001:db8::1]),或 CIDR。 |
| URL | 包含协议(https://… 或拼写错误的 https:/…)以及由点分隔的域名或 IP 构成的主机,或者此类主机后跟 /。发送时会将协议和主机转换为小写,并去掉用户信息以及主机后的根点(evil.com./)。根据其主机进行判定。 |
| 文件哈希 | MD5(32 位十六进制)、SHA-1(40 位)或 SHA-256(64 位),可不带标签,也可带标签(sha256:…、SHA256: …、MD5=…)。imphash 是 32 个十六进制字符,会作为 MD5 查询。 |
| 电子邮件地址 | 一个 @,不含 / 或 ://(因此 http://user@host/ 仍会被视为 URL),域名包含两个或更多标签。会转换为小写。Name <user@host> 和 mailto:user@host?subject=… 会被解析为地址。 |
| 电话号码 | 仅包含数字、空格和 + - . ( ),如有 + 则必须位于开头,且包含 7 到 15 位数字。+… 和 00… 视为国际号码;国家号码(例如 06 12 34 56 78)需传入 country(ISO 3166-1 alpha-2);否则,10 位数字会被视为北美号码。 |
| 域名 | 由字母、数字、连字符和下划线组成的两个或更多标签(标签具有 punycode 形式时,也接受非 ASCII 字母),可带 :port,最多 253 个字符。采用允许列表:其他内容都不会作为域名发送。 |
每个值都会先进行 NFKC 规范化,因此 CJK 文本中的全角形式
(090−1234−5678、user@evil.com、evil.com)会被识别为对应的 ASCII
形式,表意文字句号(。)则会分隔标签。数字会先按排版形式解析,再应用电话号码规则,发送的也是这种形式:
不换行空格和窄空格会转换为空格,排版用破折号和减号会转换为 -,(+33) 6 … 会变为 +33 6 …,+44 (0)20 … 会去掉国内拨号用的 (0),030/1234567 会去掉斜杠,tel: 链接会去掉其 ;ext=… 参数,末尾分机号(x123、ext. 123)会被去掉。联系人链接会被解析为其包含的地址或号码,无论是否带有 //:mailto:、tel:、
sms:(以及其 ?body=…)、callto:,以及用户部分为号码时的 sip:。电子表格导出中的 =+1…、="+1…" 或 '+1… 也会如此处理。
并非以下类型的输入会在任何请求发出前被拒绝(invalid_params;在批次中,该行会带有 error,不会发送,也不会计费),且绝不会作为域名发送:@ 被电子邮件规则拒绝的地址("john doe"@example.com、user@localhost、[email protected]/),被电话号码规则拒绝的数字和分隔符(12345),用键盘字母写出的号码(+1-800-FLOWERS),主机名不是带点域名或 IP 的 URL(https://intranet/),以及其他任何非主机名的内容(localhost、*.evil.com、空格、引号或方括号)。若作为域名发送,这些输入返回的都是“未列出”,结果显示为 clean / allow。
经过混淆处理的输入会先还原,发送的是还原后的值:任何大小写形式的 hxxp(s)、[.] (.) {.} [dot]、[:]、[@] [at]、[/]、外围括号或引号、联系方案、地址周围的显示名称,以及末尾的句子标点。如果 input 与 indicator 的差异不止大小写,结果中会包含 input。
SHA-512、SHA-384、TLSH、ssdeep 以及其他长度为 32 个字符或更长的十六进制字符串,会在任何请求发出前被拒绝(invalid_params;在批次中,该行会带有 error,不会发送,也不会计费):API 仅索引 MD5、SHA-1 和 SHA-256。
电子邮件地址或电话号码的结果绝不会是 clean。API 的电子邮件和电话数据源只有少量信息,因此未被收录时结果是 unknown / unverified,并不代表安全。其判定依据是该地址或号码自身的收录情况;对于电子邮件地址,还会查看发送方域名。如果某个来源的置信度达到 70 或以上,或者两个相互独立的发布方均以 60 或以上的置信度给出一致结果,则该收录会使其判定为恶意;若仅有一个较低置信度的列表(消费者投诉号码数据源和唯一的地址黑名单均为 55),则会判定为可疑,因为此类列表中的显示来电号码或 From 地址经常是伪造的。对于电子邮件地址,若其域名为恶意域名且不是共享邮件服务提供商,则该地址会被判定为恶意;若域名存在威胁收录、属于一次性域名,或其 null MX 表明不接收邮件,则会被判定为可疑。所有信息均来自 API 的数据集和缓存的 DNS:只有 null MX 时,mx 才为 false;没有缓存的 DNS 答案,或缓存的答案未列出 MX 时,mx 为 null。早于电子邮件和电话支持版本的 API 服务端会将这些输入作为域名处理;此时结果为 unknown / unverified,并带有 note,绝不会是 clean / allow。
check_indicator 示例
{
"indicator": "45.148.10.242",
"type": "ip",
"verdict": "malicious",
"headline": "45.148.10.242 is flagged malicious by 7 sources (scanner); risk 78/100; seen from 2026-06-02 to 2026-09-01.",
"recommendedAction": "block",
"malicious": true,
"risk": { "score": 78, "level": "high" },
"reputation": {
"malicious": 7,
"suspicious": 0,
"harmless": 0,
"undetected": 0
},
"blocklist": {
"hits": 7,
"listed": true,
"sources": [{ "name": "…", "category": "ip" }]
},
"network": { "countryCode": "NL", "asn": "AS…", "org": "…" },
"flags": {
"delisted": false,
"knownGood": false,
"microsoftTenant": false,
"ransomware": false,
"relatedInfrastructure": true
},
"reportUrl": "https://ismalicious.com/report?query=45.148.10.242"
}
blocklist 仅统计威胁收录。threatClass 为 infrastructure、policy 或 allowlist 的收录——例如云服务提供商公布的地址范围、Tor 出口列表、广告拦截列表——说明的是实体是什么,或客户可能选择屏蔽什么,并不表示它攻击过任何人,因此绝不会影响判定结果。若存在此类收录,会在 infrastructure 下报告;没有时则不显示该字段:
{
"indicator": "13.107.6.152",
"type": "ip",
"verdict": "clean",
"headline": "13.107.6.152 is not listed by any threat source; known infrastructure: cloud, saas; risk 12/100.",
"recommendedAction": "allow",
"malicious": false,
"risk": { "score": 12, "level": "low" },
"blocklist": { "hits": 0, "listed": false, "sources": [] },
"infrastructure": {
"attributes": ["cloud", "saas"],
"sources": [
{
"name": "Azure IP Ranges",
"category": "infrastructure",
"threatClass": "infrastructure"
},
{
"name": "Microsoft 365 endpoints",
"category": "infrastructure",
"threatClass": "infrastructure"
}
]
},
"network": {
"countryCode": "US",
"asn": "AS8075",
"org": "Microsoft Azure Cloud (eastus2)"
},
"reportUrl": "https://ismalicious.com/report?query=13.107.6.152"
}
attributes 包含以下一项或多项:tor-exit、vpn、proxy、doh-resolver、dns-resolver、sinkhole、cloud、cdn、crawler、scanner、monitoring、disposable-email、dynamic-dns、url-shortener、bogon、saas、allowlist;之后也可能新增其他值。若某个指标既被蜜罐数据源收录,又位于云地址范围内,其判定仍以蜜罐结果为准。
电子邮件地址和电话号码示例
{
"indicator": "[email protected]",
"type": "email",
"verdict": "suspicious",
"headline": "[email protected] is listed by 1 threat source (spam, scam); the domain invoices-portal.example is not in our dataset; risk 50/100.",
"recommendedAction": "review",
"malicious": false,
"lookupStatus": "found",
"risk": {
"score": 50,
"level": "medium",
"summary": "[email protected] is on a low-confidence list: review before trusting it"
},
"reasons": [
"Address listed by 1 threat feed: Sefinek - Blacklisted Emails (spam, scam, abuse)",
"Highest source confidence 55/100: below 70, one list is not enough for a malicious verdict"
],
"categories": ["spam", "scam", "abuse"],
"blocklist": {
"hits": 1,
"listed": true,
"sources": [{ "name": "Sefinek - Blacklisted Emails", "category": "spam" }]
},
"timeline": { "firstSeen": "2026-09-01", "lastSeen": "2026-09-29" },
"email": {
"domain": "invoices-portal.example",
"disposable": false,
"freeProvider": false,
"mx": true,
"domainReputation": {
"lookupStatus": "unknown",
"malicious": false,
"blocklistHits": 0,
"sources": []
}
},
"flags": { "delisted": false },
"meta": { "enrichment": "fast", "processingMs": 2, "latencyMs": 41 }
}
使用 { "indicator": "06 12 34 56 78", "country": "FR" } 调用 check_indicator:
{
"indicator": "+33612345678",
"input": "06 12 34 56 78",
"type": "phone",
"verdict": "unknown",
"headline": "+33612345678 is not in any source we hold; absence is not evidence of safety.",
"recommendedAction": "unverified",
"malicious": false,
"lookupStatus": "unknown",
"risk": {
"summary": "No evidence about +33612345678: unverified, not a clean verdict"
},
"reasons": [
"No phone feed lists this number",
"Absence from our dataset is not evidence that the number is safe"
],
"blocklist": { "hits": 0, "listed": false, "sources": [] },
"phone": {
"e164": "+33612345678",
"countryCallingCode": "33",
"resolvedWith": "country"
},
"flags": { "delisted": false },
"meta": { "enrichment": "fast", "processingMs": 1, "latencyMs": 38 }
}
resolvedWith 的值为 e164(以 + 或 00 开头)、country(通过
country 解析)、nanp-guess(将 10 位数字视为北美号码)或 digits(无法
确定国家/地区;此时 e164 为 null)。
数据集已知的哈希还会包含 file(文件系列、文件类型、MIME 类型、
名称、大小、签名、标签、文件的其他摘要)和 lookupStatus;通过同一文件的
另一摘要找到的引用来源会标记为 via: "alias",通过已列出的范围找到的来源则
标记为 via: "cidr"。
如果 NSRL 已知某个哈希(flags.knownGood),但威胁拦截列表也将其列出,
结果会是 suspicious,并带有 recommendedAction: "review",而不会是 malicious /
block:NSRL 只能识别已知软件,不能为其背书;这两个来源意见不一,需要分析人员
判断。摘要会指出这一冲突(<sha256> is known software (NSRL), yet 2 sources list it; review before blocking.),而 blocklist 仍会列出引用来源。
check_indicators 会原样传递 API 返回的每行 recommendedAction;其行不包含 NSRL 标记。
check_indicators 按输入顺序返回各行。如果结果将超过
48 KB,就会从末尾开始删除整行,并通过 returned、omitted、truncated: true 和 note
说明这一情况;malicious 仍会统计所有行,并拆分为 maliciousReturned 和 maliciousOmitted。
search_indicators 的处理方式相同:当 indicators 超过 32 KB 时进行截断。
scan_email 示例
使用解析后的邮件调用 scan_email,邮件结构本身可疑(数据集中没有任何条目
列出其中内容,因此只会要求审核,不会隔离):
{
"message": {
"headers": [
{
"name": "From",
"value": "\"[email protected]\" <[email protected]>"
},
{ "name": "Reply-To", "value": "[email protected]" }
],
"subject": "Your account is limited",
"html": "<p>Confirm now: <a href=\"https://login.lookalike.test/verify\">www.paypal.com</a></p>"
}
}
{
"verdict": "suspicious",
"recommendedAction": "review",
"riskScore": 85,
"headline": "Review: The sender's domain imitates a well-known brand.",
"reasons": [
{
"code": "sender.brand_lookalike",
"severity": "high",
"summary": "The sender's domain imitates a well-known brand.",
"evidence": "paypal-secure[.]test pairs PayPal (paypal[.]com) with a word phishing uses"
},
{
"code": "headers.display_name_address",
"severity": "high",
"summary": "The display name shows one address while the message comes from another.",
"evidence": "[email protected] <[email protected]>"
},
{
"code": "link.anchor_mismatch",
"severity": "high",
"summary": "A link shows one site and opens another.",
"evidence": "shows paypal.com opens login[.]lookalike[.]test"
},
{
"code": "headers.display_name_brand",
"severity": "medium",
"summary": "The display name claims a well-known brand while the message comes from another domain.",
"evidence": "PayPal claimed, From noreply@paypal-secure[.]test"
},
{
"code": "headers.reply_to_freemail",
"severity": "medium",
"summary": "Replies go to a free mail address while the message claims a company domain.",
"evidence": "From [email protected] / Reply-To [email protected]"
},
{
"code": "sender.no_mail_authentication",
"severity": "low",
"summary": "The sender's domain publishes neither SPF nor DMARC: anyone can send as it.",
"evidence": "paypal-secure.test"
}
],
"sender": {
"address": "[email protected]",
"domain": "paypal-secure.test",
"displayName": "[email protected]",
"verdict": "unknown",
"replyTo": ["[email protected]"],
"posture": "F",
"spoofable": true
},
"authentication": {
"status": "unverified",
"hint": "No Authentication-Results header from a system you vouched for was read, so a message with nothing against it is inconclusive, never clean. Pass authservId (the id your receiving system writes in that header) or trustAuthenticationResults to let a DMARC pass count."
},
"links": {
"total": 1,
"flagged": [
{
"host": "login[.]lookalike[.]test",
"verdict": "unknown",
"flags": ["anchor_mismatch"],
"shownDomain": "paypal.com"
}
]
},
"attachments": {
"total": 0,
"unknown": 0,
"flagged": []
},
"injection": {
"score": 0
},
"coverage": {
"skipped": [
{
"check": "authentication",
"reason": "no Authentication-Results header from a system you vouched for (context.authservId or trustAuthenticationResults); SPF, DKIM and DMARC are not verified by this scan yet"
},
{
"check": "connecting_ip",
"reason": "no public address in the Received chain at or below the trusted boundary"
}
]
},
"meta": {
"apiLatencyMs": 2
}
}
判定、操作、评分和摘要均由 API 提供;服务只保留最重要的六条 reasons、带有
信号的链接和附件,以及未检查的内容,并将主机名写成解除链接的形式(evil[.]example),
以便将文本粘贴到工单或聊天中。除非你指定接收系统(authservId,即该系统写入
Authentication-Results 的 ID),或为所有此类标头背书(trustAuthenticationResults),否则
authentication.status 为 unverified:任何人都能在邮件中写入这类标头,因此
不会相信其他任何标头;如果没有这些信息,即使没有发现不利内容,邮件的结果也会是
inconclusive,而非 clean。即使提供了这些信息,也只有当发件人域名被数据集认定为
已建立域名(访问量排名前 100 000,且不是免费邮箱)时,结果才会是 clean:攻击者也会为
自己注册的域名发布 DMARC。
trustedHops 和 connectingIp 用于说明是哪台
服务器将邮件发送到你的服务器。以 eml 形式发送时,还会读取附件的结构,但绝不会运行附件
(attachments.flagged[].detectedType 和 flags:以文档名伪装的程序、Office 文件中的
宏和远程模板、压缩包中的风险条目或密码、PDF 操作、会重建文件的 HTML);附件中找到的
地址会作为链接进行查询(links.flagged[].origin: "attachment"),作为附件附加的邮件则会作为
独立邮件读取(origin: "attached_message")。以 message 形式发送时,附件只会以其摘要
和名称表示,coverage.skipped 会说明这一点。超过 10 MiB 的邮件会被拒绝(改为发送
message,并附上附件的摘要)。每封邮件消耗一次扫描额度,而非一次请求。
错误
每次失败都会返回 isError: true,且正文如下:
{
"error": "rate_limited",
"status": 429,
"message": "Rate limit exceeded",
"quota": {
"kind": "burst",
"limit": 60,
"remaining": 0,
"plan": "FREE",
"retry_after": 30,
"resets_at": "…"
},
"hint": "Wait 30s before retrying."
}
error 的值为 rate_limited、unauthorized、forbidden、not_found、
bad_request、upstream_error、timeout、network_error、invalid_params。
quota.kind 的值为 burst、monthly、daily、scans 或 issuance。401 错误会说明未配置密钥,还是已配置的密钥遭到拒绝。
monthly 或 scans 类型的拒绝会持续到 quota.resets_at(下个月 1 日
00:00 UTC):其 hint 会提示在此之前不要重试,并给出 API 正文提供的下一步操作,该操作也会通过 upgrade 块返回:
"upgrade": {
"primary": "upgrade",
"url": "https://ismalicious.com/subscribe/pro-monthly?promo=QUOTA10…",
"options": [
{ "plan": "BASIC_MONTHLY", "name": "Basic", "requests_per_month": 2000, "price_monthly_eur": 49, "url": "…" },
{ "plan": "PRO_MONTHLY", "name": "Pro", "requests_per_month": 10000, "price_monthly_eur": 99, "url": "…" }
],
"promo_code": "QUOTA10",
"upgrade_required": true
}
Free 账户遭到拒绝时会返回 options;根据其 plan 判断账户类型。Basic 账户会获得一个指向其账户页面的 url。primary: "contact"(Pro、Enterprise)指向 Enterprise 报价表单。billing_issue: true(同时 primary: "billing")表示付费订阅已暂停:结清款项即可,无需购买任何东西。
超时与取消
Gate 工具的超时时间为 15 s,check_indicator 为 25 s,CVE 工具为 10 s(包括 exploited_cves),search_indicators 为 20 s,check_indicators 为 60 s,check_password_exposure 为 10 s,scan_email 为 20 s,watch_domain 为 30 s,watch_dependencies 为 45 s,ack_finding 为 10 s,bootstrap_key 为 15 s。ISMALICIOUS_TIMEOUT_MS 会替换所有超时设置;ISMALICIOUS_TIMEOUT_<TOOL>_MS(例如
ISMALICIOUS_TIMEOUT_CHECK_INDICATOR_MS=3000)只设置一个工具的超时时间,且优先级更高。客户端发送的 notifications/cancelled 会中止 HTTP 调用;已取消的请求不会收到响应。
延迟
服务器自身为更快响应所做的优化:
fast富化是check_indicator的默认设置:API 使用缓存的情报作答,不会先调用实时上游服务。尚无缓存的特征会列在meta.pending中,并在后台获取;之后,只有当响应摘要提示几秒后重新检查一次时,才会进行检查;如果某项特征届时仍待处理,摘要会说明该特征不会返回(当前答案仍然有效;每次重新检查都会计费)。如果某个哈希没有任何来源的缓存,API 仍可能等待几秒,以从 CIRCL 获取信息后再作答。standard可能会在作答前调用 DNS、OTX 或 CIRCL。fast需要部署 2026-09-30 或更高版本的 API:较旧的服务器会将 IP、域名或 URL 的该设置按standard处理,但会在其缓存的哈希文档中存储enrichmentLevel: "fast",因此此版本需要跟在该部署之后。无论富化级别如何,电子邮件地址和电话号码都会使用缓存数据作答。- 连接复用:每种 scheme 使用一个 keep-alive 连接池(16 个套接字,空闲套接字保留 30 s),响应使用 gzip 或 brotli 压缩,因此在上次调用后几秒内发起的调用无需再次进行 TCP 和 TLS 握手。
initialize之后,如果设置了密钥,会通过一次未经身份验证的GET /health在首次工具调用前建立连接(设置ISMALICIOUS_PREWARM=0可跳过)。 - 结果缓存:相同调用——密钥、工具和规范化参数相同——会在 60 s(
check_indicator、check_indicators、check_url)、1 h(get_cve)、10 min (exploited_cves)或 5 min(recent_cves、search_indicators)内重放成功结果。列出待处理特征的结果绝不会重放:它提示的重新检查会发送到 API。重放不消耗请求次数,并会注明此情况(meta.cached、meta.ageSec或顶层_cache)。scan_before_use、scan_email、bootstrap_key、三种监控写入操作以及错误均不会缓存。ISMALICIOUS_CACHE_TTL_S可缩短缓存有效期,或设为0来禁用缓存。 - 共享调用:进行中的相同调用会共用一个请求,包括带有待处理特征的结果。一个去武装形式和一个普通形式的同一指标会视为同一次调用;但每个调用者仍会收到各自的
input。
check_indicator 结果中的 meta.latencyMs 是客户端测量的往返时间;meta.processingMs 是 API 自身的处理时间。
直接调用 API 主机
默认情况下,服务会调用 https://ismalicious.com/api,该地址会转发到
API。设置 ISMALICIOUS_API_BASE=https://api.ismalicious.com 可直接调用
API 主机并跳过这一跳。bootstrap_key 仍会发送到
https://ismalicious.com/api(该路由仅在那里存在;参见
ISMALICIOUS_WEB_BASE)。两者的计费方式相同:无论使用哪个基础地址,search_indicators
都会扣除月度配额中的 1 次请求。
资源
ismalicious://quota(application/json):来自
GET /gate/quota 的扫描计量信息,以及本会话上一次计费调用时看到的请求配额标头。
环境变量
| 变量 | 含义 |
|---|---|
ISMALICIOUS_API_KEY、ISMALICIOUS_API_SECRET | 密钥对;可选(不提供时使用引导模式)。 |
ISMALICIOUS_API_BASE | 默认为 https://ismalicious.com/api;https://api.ismalicious.com 会直接调用 API 主机(见上文)。 |
ISMALICIOUS_WEB_BASE | bootstrap_key 的基础地址。默认为 ISMALICIOUS_API_BASE;当其值为 https://api.ismalicious.com 时,默认为 https://ismalicious.com/api。 |
ISMALICIOUS_TIMEOUT_MS | 覆盖所有工具的超时时间。 |
ISMALICIOUS_TIMEOUT_<TOOL>_MS | 单个工具的超时时间,例如 ISMALICIOUS_TIMEOUT_CHECK_INDICATOR_MS;优先级高于 ISMALICIOUS_TIMEOUT_MS。 |
ISMALICIOUS_CACHE_TTL_S | 0 会关闭结果缓存;N 会将所有缓存的有效期限制为 N 秒(不会延长缓存有效期)。 |
ISMALICIOUS_PREWARM | 0(或 false、off、no)会跳过 initialize 后的连接预热。 |
NODE_USE_ENV_PROXY、HTTPS_PROXY、NO_PROXY | Node 的环境代理模式(NODE_USE_ENV_PROXY=1 或 --use-env-proxy):调用会通过代理进行,并在 Node 22.21+ / 24.5+ 上使用 Node 的连接池。关闭时,代理变量会被忽略,与 fetch 相同。 |
开发
npm install
npm run typecheck && npm test && npm run build
node scripts/check-version.mjs # versions and server.json shape
node scripts/smoke.mjs # stdio end-to-end against a stub API
版本仅在 src/version.ts 中声明一次;CHANGELOG.md 列出了变更内容。
此代码库镜像自 isMalicious monorepo 中的 packages/mcp-server,npm 和 MCP 注册表的版本均在该 monorepo 中发布。欢迎在此提交问题和拉取请求。
Dockerfile 是 Glama 用来构建并列出此服务的文件。它会设置一组
占位密钥,以便 tools/list 显示所有工具;可通过
docker run -i -e ISMALICIOUS_API_KEY=… -e ISMALICIOUS_API_SECRET=… 传入真实密钥对,或传入空值以使用引导模式。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。