Threat Intel Toolkit
Draft · awaiting reviewClaude Code plugin with a subagent and two skills that triage IOCs and CVEs against free threat-intel feeds, without API keys.
For Threat intel enrichment, Vulnerability prioritizationWorks with Claude CodeMaintained kevinmhorvath, last push 2026-08-18
PluginA plugin bundles skills, commands, hooks or MCP servers for one AI client. by kevinmhorvath · read from the code at 8b5acb2 on 2026-10-21The date we last read the tool’s files. The code after “at” names the exact version (the git commit) we read; a newer version may differ. · Not run yet.Whether we have run the tool in our lab. “Did more than it said” means the run used rights its description does not name; “did no more than it said” means it stayed within them.
What the code shows, worst first. No run advice yet: the one word needs a read under the full rule.
Level 2. Files. The cache directory lies in the user's home, outside the working directory, and --report writes into any --out path.
Level 2. Execution. The subagent may use Bash without restriction, while the bundled scripts start no processes.
No evidence. Secrets. Unknown: the code reads no key or token, but the search patterns for secrets match one line in skills/threat-intel-lookup/SKILL.md, so a zero cannot be written. That never counts as zero.
Before first useSettings for your AI client that limit the tool to the rights its task needs; derived from the code unless marked tested. derived from the code, not tested
- Claude Code: permissions.allow: [Read, Grep, Bash(python3 skills/*)]; keep other Bash calls and Write on ask, and pass --out with a case folder.
What the code can reach, 0 to 3 per right; a dashed point means no evidence, never zero. The three readings
Is it for you?
- Made for
- Answer whether any reputable free feed flags an indicator, and how strongly, as a defensive triage aid.
- Rate how ready-made the public exploit material for a CVE is, so defenders and pentesters can prioritize.
- Build or refresh a local blocklist from free, key-free open-source feeds.
- Use it when
- Enrich a batch of IOCs pasted from a SIEM alert, firewall log, phishing email or incident timeline Threat intel enrichment
- Rate exploit maturity and in-the-wild status of CVEs during vulnerability triage, patch prioritization or pentest scoping Vulnerability prioritization
- Check a URL from a suspicious email, where a hit on the phishing-domain feed carries the most weight Email and phishing analysis
- Write a Markdown and CSV report of indicator verdicts for a ticket, IR timeline or client folder Alert triage
- Not for
- Meant for defensive prioritization; the author states it never contacts, scans or attacks an indicator.
- Does not write new exploit code, weaponize a PoC or give exploitation steps; it locates and rates already-public material.
- File hashes are out of scope, because the free hash feeds the author considered require an API key.
- You need
- Needs Python 3.8 or later; the scripts use the standard library and need no pip installs
- Installs as a plugin from the repository's own single-plugin marketplace (.claude-plugin/marketplace.json and .claude-plugin/plugin.json)
- ti.py needs network access to each feed URL to build its cache; each download uses urllib with a 90-second timeout
+2 more
Details: You need
Install
linked, not distributed: the Field Guide does not bundle agents or MCP serversUpstream
/plugin marketplace add kevinmhorvath/threat-intel-toolkit /plugin install threat-intel-toolkit@threat-intel-marketplace
Quoted from README.md#L84-85 at the pinned commit; a quotation, not a command to copy.
Run it with least privilege
- claude code
permissions.allow: [Read, Grep, Bash(python3 skills/*)]; keep other Bash calls and Write on ask, and pass --out with a case folder- note
derived from the code, not tested in the lab
derived, not tested: proposed from the code analysis
The record · every value with its evidence
What we checked, and what we found.
Profile read at commit 8b5acb2 on 2026-10-25: 59 facts, each with its quoted line confirmed by script; not installed, not run in the lab.Each fact was read from the tool's files at the checked version and links to the line it comes from. Where nothing was found, the page says so instead of assuming “none”.
Selected by criteria v0.1, approved by Ilja Schlak: awaiting approval. Each section opens with the answer; the file and line of every fact follow it.
What it can change the capability groups as upstream groups them, worst first
Changes, runs commands, according to the capabilities read.
The author states the plugin ships a subagent and two skills. README.md L5, README.md#L5 at the checked commit
| Group | What it covers | Effect | On by default |
|---|---|---|---|
| threat-intel-analyst | The threat-intel-analyst subagent is granted the Bash, Read, Write, Glob and Grep tools. threat-intel-analyst.md L12, agents/threat-intel-analyst.md#L12 at the checked commit | reads, changes, runs commands | yes |
| ti.py aggregate | ti.py aggregate downloads and normalizes the registry feeds into the local cache; --refresh forces re-download, --only and --exclude select feeds by key. ti.py L582-587, skills/threat-intel-lookup/scripts/ti.py#L582-587 at the checked commit | reads, changes | yes |
| ti.py lookup | ti.py lookup checks IPs, domains, URLs and CVEs (defanged accepted) against the cache; --json prints machine-readable output and --report writes Markdown and CSV files to --out. ti.py L589-594, skills/threat-intel-lookup/scripts/ti.py#L589-594 at the checked commit | reads, changes | yes |
| exploit-availability-check | exploit_check.py reports in-the-wild status and a public exploit maturity tier per CVE from CISA KEV, FIRST EPSS, Metasploit, Nuclei, Exploit-DB, nomi-sec and trickest. exploit_check.py L5-13, skills/exploit-availability-check/scripts/exploit_check.py#L5-13 at the checked commit | reads, changes | yes |
| ti.py feeds | ti.py feeds lists the curated feed registry. ti.py L579, skills/threat-intel-lookup/scripts/ti.py#L579 at the checked commit | reads | yes |
| healthcheck.py | One healthcheck.py per skill: the lookup one fetches and parses all 10 feeds; the exploit one checks that every source returns a known canary CVE (Log4Shell). README.md L100-106, README.md#L100-106 at the checked commit | reads | no, optional |
| Fallback (no shell) | Without a shell, the exploit skill tells the model to fetch EPSS, nomi-sec, trickest and Nuclei per CVE with its fetch tool and to WebSearch KEV, Metasploit and Exploit-DB. SKILL.md L52, skills/exploit-availability-check/SKILL.md#L52 at the checked commit | reads | no, optional |
Where it sends data and who can connect to it
9 outside connections found in the files read: CISA KEV and abuse.ch Feodo Tracker, blocklist.de and stamparm/ipsum, Emerging Threats and GreenSnow, Tor Project and SANS DShield, Spamhaus and Phishing.Database, FIRST EPSS (api.first.org), cisa.gov, GitHub and GitLab, nomi-sec and trickest PoC indexes, Client web search.
- CISA KEV and abuse.ch Feodo Tracker download, by default. ti.py downloads the CISA Known Exploited Vulnerabilities JSON and the abuse.ch Feodo Tracker IP blocklist during aggregate. ti.py L64-72, skills/threat-intel-lookup/scripts/ti.py#L64-72 at the checked commit
- blocklist.de and stamparm/ipsum download, by default. ti.py downloads the blocklist.de list and the stamparm/ipsum level 3 list from raw.githubusercontent.com during aggregate. ti.py L73-80, skills/threat-intel-lookup/scripts/ti.py#L73-80 at the checked commit
- Emerging Threats and GreenSnow download, by default. ti.py downloads the Emerging Threats compromised-IP list and the GreenSnow list during aggregate. ti.py L81-88, skills/threat-intel-lookup/scripts/ti.py#L81-88 at the checked commit
- Tor Project and SANS DShield download, by default. ti.py downloads the Tor Project exit list and the SANS DShield block list during aggregate. ti.py L89-97, skills/threat-intel-lookup/scripts/ti.py#L89-97 at the checked commit
- Spamhaus and Phishing.Database download, by default. ti.py downloads Spamhaus DROP netblocks and the Phishing.Database active phishing domains during aggregate. ti.py L98-106, skills/threat-intel-lookup/scripts/ti.py#L98-106 at the checked commit
- FIRST EPSS (api.first.org) vendor API, by default. exploit_check.py sends each CVE ID to the FIRST EPSS API and reads the exploitation probability. exploit_check.py L150-153, skills/exploit-availability-check/scripts/exploit_check.py#L150-153 at the checked commit
- cisa.gov, GitHub and GitLab download, by default. exploit_check.py downloads KEV from cisa.gov, Metasploit and Nuclei indexes from GitHub, and the Exploit-DB CSV from GitLab. exploit_check.py L33-38, skills/exploit-availability-check/scripts/exploit_check.py#L33-38 at the checked commit
- nomi-sec and trickest PoC indexes download, by default. exploit_check.py fetches nomi-sec and trickest PoC index files live for each CVE it assesses. exploit_check.py L16-17, skills/exploit-availability-check/scripts/exploit_check.py#L16-17 at the checked commit
- Client web search other, if you turn it on. For a vulnerability given by name, the exploit skill has the model run a WebSearch for the name plus CVE to find its CVE IDs. SKILL.md L31, skills/exploit-availability-check/SKILL.md#L31 at the checked commit
Listens for no connections in the files read.
Other connections not ruled out: read in the documentation and the cited code, not searched in full.
How it runs generated from the files read, never drawn by hand
A subagent routes indicators to two skills: threat-intel-lookup, whose stdlib-only script ti.py aggregates 10 free feeds into a local SQLite cache and looks indicators up in it, and exploit-availability-check, which rates a CVE via KEV, EPSS, Metasploit, Nuclei, Exploit-DB and PoC aggregators. README.md L7-15, README.md#L7-15 at the checked commit
Your AI client
Parts that live inside the AI client: skill instructions, client configuration.
- threat-intel-analyst subagent Subagent definition named threat-intel-analyst. threat-intel-analyst.md L2, agents/threat-intel-analyst.md#L2 at the checked commit
- Skills (SKILL.md) The threat-intel-lookup and exploit-availability-check skills, usable directly or orchestrated by the subagent. README.md L17-19, README.md#L17-19 at the checked commit
Your machine
Programs and files on the machine where you run the tool.
- ti.py Stdlib-only Python engine; keeps raw feed bodies under ~/.cache/ti-aggregator/raw with a TTL and the parsed data in ~/.cache/ti-aggregator/ti.db. ti.py L27-31, skills/threat-intel-lookup/scripts/ti.py#L27-31 at the checked commit
- exploit_check.py Python script that caches KEV, Metasploit, Nuclei and Exploit-DB locally and fetches EPSS, nomi-sec and trickest data live per CVE. exploit_check.py L15-17, skills/exploit-availability-check/scripts/exploit_check.py#L15-17 at the checked commit
Outside your machine
Remote services: vendor APIs, model providers, targets, telemetry endpoints. Data sent here leaves your machine.
- Indicator feeds Ten public feeds, among them CISA KEV, abuse.ch Feodo Tracker, Spamhaus DROP and Phishing.Database, supply indicator and CVE data. README.md L23-25, README.md#L23-25 at the checked commit
- Exploit sources CISA KEV, FIRST EPSS, Metasploit, Nuclei, Exploit-DB, nomi-sec and trickest supply exploit and in-the-wild data per CVE. SKILL.md L14-22, skills/exploit-availability-check/SKILL.md#L14-22 at the checked commit
The six rights, read three waysThe six rights a tool can take (files, network, execution, secrets, persistence, approval), each read three ways and rated 0 to 3. 0 never means safe; “?” means no evidence. what the author says, what the code shows, what one lab run showed
Level 2 (open), one right unknown, read from the code. Not run in our lab yet.
0 contained · 1 scoped · 2 open · 3 privileged · ? no evidence · 0 never means safe · zero means: none declared (Declared), none found (Code), none observed (Lab)
Author says: the evidence
- Files · 2SKILL.md L47 the author puts the indicator cache under ~/.cache, outside the working directory
- Network · 1README.md L116-117 the author states the toolkit only reports what public feeds say and never contacts an indicator
- Execution · 2threat-intel-analyst.md L12 the shipped subagent lists the Bash tool without restriction
- Secrets · 0plugin.json L4 the author states that no API keys are required
- Persistence · 1SKILL.md L36 the author declares a 24-hour feed cache under ~/.cache
Code shows: the evidence
- Files · 2ti.py L51 the cache directory lies in the user's home, outside the working directory, and --report writes into any --out path
- Network · 1ti.py L182-183 requests go only to the fixed feed registry, and indicators supplied by the user are never fetched
- Execution · 2threat-intel-analyst.md L12 the subagent may use Bash without restriction, while the bundled scripts start no processes
- Secrets · ?no evidence: the code reads no key or token, but the search patterns for secrets match one line in skills/threat-intel-lookup/SKILL.md, so a zero cannot be written
- Persistence · 1exploit_check.py L29 downloaded feeds stay in a cache under ~/.cache after the run
- Approval · 0none found: patterns hitl-v0.1 in 8 files at 8b5acb2
Valid for commit 8b5acb2 · checked 2026-10-21 · method reach-v0.1The published rules we follow: how tools are selected, how their rights are read and rated, how a lab run is done.
Limits and risks what the files say that fits nowhere else, and what this reading does not cover
- Indicator lookups read the local cache at ~/.cache/ti-aggregator/ti.db and do not go to the network. SKILL.md L47, skills/threat-intel-lookup/SKILL.md#L47 at the checked commit
- The subagent is granted Bash, Read, Write, Glob and Grep; its description asks the host to use it proactively when the user drops an IP, domain, URL or CVE, even without the words threat intel. threat-intel-analyst.md L4-12, agents/threat-intel-analyst.md#L4-12 at the checked commit
- The author states that a CLEAN verdict is never a safety guarantee. README.md L117, README.md#L117 at the checked commit
- blocklist.de and GreenSnow are in the default feed set but publish no formal licence; the README shows how to exclude them. README.md L50-52, README.md#L50-52 at the checked commit
- Before 1.1.0, when a source such as CISA KEV was unreachable and no local cache existed, exploit-availability-check reported it as not listed; since 1.1.0 such sources show as unknown. CHANGELOG.md L10-18, CHANGELOG.md#L10-18 at the checked commit
- The exploit skill tells the model to flag low-star GitHub PoC repos as possibly non-functional or malicious. SKILL.md L86, skills/exploit-availability-check/SKILL.md#L86 at the checked commit
- exploit_check.py does not query Packet Storm, CXSecurity or 0day.today, which the author says have no open data feed. SKILL.md L24, skills/exploit-availability-check/SKILL.md#L24 at the checked commit
- exploit_check.py takes every command-line argument that starts with CVE- as a CVE ID to assess. exploit_check.py L418, skills/exploit-availability-check/scripts/exploit_check.py#L418 at the checked commit
- The threat-intel-lookup skill triggers on its own whenever the user drops an IOC into the conversation. README.md L12, README.md#L12 at the checked commit
- When a feed download fails, ti.py reuses the previously cached copy of that feed and notes this on stderr. ti.py L189-193, skills/threat-intel-lookup/scripts/ti.py#L189-193 at the checked commit
- ti.py defines the User-Agent threat-intel-lookup/1.0 (+defensive-ioc-triage) for its feed requests. ti.py L55, skills/threat-intel-lookup/scripts/ti.py#L55 at the checked commit
- ti.py rates an indicator MALICIOUS when three or more feeds list it, SUSPICIOUS when one or two do and CLEAN when none does; a hit only on the Tor exit list gives CONTEXT and a CVE on CISA KEV gives EXPLOITED. ti.py L401-410, skills/threat-intel-lookup/scripts/ti.py#L401-410 at the checked commit
- Not covered: what it does at runtime. Other connections not ruled out: read in the documentation and the cited code, not searched in full.
What you need and what the documented installer does
| Kind | What |
|---|---|
| AI client | Claude Code |
| Runtime | Needs Python 3.8 or later; the scripts use the standard library and need no pip installs. README.md L70, README.md#L70 at the checked commit |
| Runtime | Installs as a plugin from the repository's own single-plugin marketplace (.claude-plugin/marketplace.json and .claude-plugin/plugin.json). README.md L80-81, README.md#L80-81 at the checked commit |
| Other | ti.py needs network access to each feed URL to build its cache; each download uses urllib with a 90-second timeout. ti.py L181-184, skills/threat-intel-lookup/scripts/ti.py#L181-184 at the checked commit |
| Other | The first exploit check downloads about 35 MB of feeds into ~/.cache/exploit-availability-check, kept for 24 hours. SKILL.md L36, skills/exploit-availability-check/SKILL.md#L36 at the checked commit |
| Other | Indicator lookups need a cache built first with ti.py aggregate, about 13 seconds for about 435k indicators. threat-intel-analyst.md L45-48, agents/threat-intel-analyst.md#L45-48 at the checked commit |
What the documented installer does
- Two Claude Code commands add the GitHub repository as the marketplace threat-intel-marketplace and install the threat-intel-toolkit plugin; the commands name no tag or commit. README.md L83-86, README.md#L83-86 at the checked commit
- The README also mentions sharing the folder as a zip file or installing a skill on its own. README.md L89-90, README.md#L89-90 at the checked commit
- The author also keeps a standalone exploit-availability-check skill; since 1.1.0 its exploit_check.py is byte-identical to the copy bundled in this toolkit. CHANGELOG.md L22-23, CHANGELOG.md#L22-23 at the checked commit
Lab runs one run is an observation, not a benchmark
About this entry
- Type
- Plugin · Defensive · works with Claude Code
- Source
- github.com/kevinmhorvath/threat-intel-toolkit · MIT · manifest
plugin.json - Version readThe install command installs exactly the version we checked (the pinned git commit), so what you get is what the card describes.
- 8b5acb2 · last upstream push 2026-08-18 · no release since the pinned commit
- In the catalog
- listed · added 2026-10-21 · last checked 2026-10-21 · next check 2027-01-19 · fresh
- ScannersA scan of the tool's files with a scanner for malicious patterns. “Pending” means it has not run yet.
- cisco-skill-scanner: not run, pending
- Changes
- none since the entry was added on 2026-10-21
Disagree?
Dispute a value with evidence (file, line, commit): write to hello@readbeforerun.ai. A dispute is checked against the pinned commit; a changed value is logged under Changes.
How this entry was checked, and how to cite it
Selected by the published criteria (method v0.1). What the author says comes only from author statements; what the code shows comes from the code and manifests at commit 8b5acb2, each with one evidence line. A “?” means no evidence, never zero; zero never means safe.
The descriptive profile (what it does, can do, how it runs, what it needs) was read through the same isolated pipeline at commit 8b5acb2 on 2026-10-25: one reader proposed every fact with a quoted line, a script confirmed each quoted line (59 of 59), and a second reader checked each sentence against its lines. Where nothing was found, the page says so instead of assuming “none”.
Known issues and limits: remote server-side behaviour stays “?”; the lab is not your production; static analysis can miss runtime behaviour.
Placement, badges or fast tracks are not for sale. The author is employed by an IT consultancy; the company has no influence on selection, execution or result.
Cite this:
Ilja Schlak. "Threat Intel Toolkit". Agentic Security Field Guide, checked 2026-10-21, method reach-v0.1. https://readbeforerun.ai/catalog/kevinmhorvath-threat-intel-toolkit/For maintainers
Badge for your README (reach ≥2 · not run yet):
[](https://readbeforerun.ai/catalog/kevinmhorvath-threat-intel-toolkit/)Dispute a value with evidence (file, line, commit): write to hello@readbeforerun.ai. A dispute is checked against the pinned commit; a changed value is logged under Changes.
Claim the entry with a fieldguide.yaml in your repository: planned.
Other tools for the same task
Tasks: Threat intel enrichment, Vulnerability prioritization. The task pages compare every tool side by side.- Code showsCrowdStrike Falcon MCP ServerDraft · awaiting review
MCP server that connects agents to the CrowdStrike Falcon platform: detections, threat intel, host management and response.
Can tunnel or exfiltrate · write outside the project · change config or install globally · Approval: no evidence · ran once, 2026-11-07: did more than it said · checked 2026-11-07
- Code showsTenable MSSP Portal MCP ServerDraft · awaiting review
MCP server that runs Tenable queries and hosted Hexa AI MCP tools across the child containers of a Tenable MSSP Portal.
Can add autostart, users or keys · read broad tokens or the environment · not run yet · checked 2026-10-21
- Code showsPurple AI MCP ServerDraft · awaiting review
Read-only MCP server for the SentinelOne Singularity platform: Purple AI, data-lake PowerQuery, alerts, vulnerabilities, misconfigurations and inventory.
Can tunnel or exfiltrate · add autostart, users or keys · read broad tokens or the environment · Approval: no evidence · not run yet · checked 2026-10-21