Repository navigation
Releases
v0.5.0: CISA advisory evidence and triage corrections
CISA advisory evidence and triage corrections
- Preserve verbatim CSAF vulnerability references, render HTTP(S) references as Markdown links, and expose an unambiguous FIRST CVSS v4 vector alongside published scores (#57).
- Trim KEV and ICS vendor and product filters before matching and reject previously accepted padded one-character terms (#58).
- Omit
assignmentAgreesunless the KEV entry explicitly cites BOD 26-04 (#59). - Find republished ICS advisories by originating vendor ID and return distinct reference pairs, including separate CSAF and HTML links (#60).
- Add
detail: "full"to read uncapped RSS descriptions as literal text for items without an advisory ID and get lookup guidance for capped items with an ID (#61). - Describe variable historical KEV deadline gaps and point to actual RSS window dates (#62).
- Omit generic
titlefields from resource list entries so clients display distinct record names (#63). - Dependencies
better-sqlite3^13.0.3 → ^13.1.1 and@biomejs/biome2.6.6 → 2.6.7.
CHANGELOG v0.5.0 · release PR #64
v0.4.1: CISA triage and advisory lookup corrections
CISA triage and advisory lookup corrections
- Add opt-in
detail: "summary"to KEV search for the eleven triage fields shared with CVE status (#52). - Compare both the remediation day count and forensic-triage requirement for SSVC assignment agreement (#50).
- List indexed revisions with the same base ID when an exact advisory tool or resource lookup misses (#51).
- Point KEV and ICS search callers to the cursor on non-final pages and suggest a higher limit only below the maximum (#53).
- Echo all submitted SSVC IDs and scope SSVC and KEV absence notices to the processed IDs (#54).
- Normalize recognized SSVC decision values from upstream and cached records, and preserve evidence with guidance when an unsupported value prevents timeline computation (#55).
- Update the CISA cybersecurity guide to 1.1 with exposure and timeline reporting guidance.
- Propagate caller cancellation in Vulnrichment lookups and provide retry guidance without exposing upstream exception text.
- Preserve resource titles, advisory sync coordination, and MCPB skill loading across the framework update. Document JWT audience and issuer settings and raise the Bun minimum to 1.4.4.
- Update
@cyanheads/mcp-ts-core^0.13.18 → ^0.13.22 alongside XML parser and development dependencies.
CHANGELOG v0.4.1 · release PR #56
v0.4.0: CISA investigation guide and scoped advisory evidence
CISA investigation guide and scoped advisory evidence
- Publish the CISA cybersecurity guide as an MCP skill resource.
- Accept oversized reads within a 1,000-input ceiling, retaining workload caps and explicit batch remainders; expose a clamping off switch and normalization telemetry. (#41)
- Resolve grouped remediation applicability and preserve scoped flags and impact statements. (#43, #47)
- Size KEV cursor pages from the current request's limit. (#44)
- Retain advisory identity, source links, and attribution on outlines. (#45)
- Continue within the available feed window using GUID cursors and explicit unavailable-anchor guidance. (#46)
- Separate failed SSVC fetches from confirmed misses through outcomes, counts, and guidance. (#48)
- Add Agent Plugins manifests and skill validation, remove development files from MCPB bundles while retaining runtime scripts and native modules, and synchronize development references and checks.
@cyanheads/mcp-ts-core^0.13.15 → ^0.13.18zod^4.6.6 → ^4.6.7@biomejs/biome2.5.15 → 2.6.4@types/node26.6.5 → 26.6.6@vitest/coverage-istanbul5.0.3 → 5.0.5ignore^7.0.12 → ^7.0.14tsc-alias^1.9.7 → ^1.9.9vitest^5.0.3 → ^5.0.5- Bun package manager and container images 1.4.3 → 1.4.4
CHANGELOG v0.4.0 · release PR #49
v0.3.2: Complete CISA data and reliable refresh recovery
Complete CISA data and reliable refresh recovery
cisa_get_advisorykeeps relationship product definitions and addsproductIdsto select products by exact ID (#33, #40)- Impossible calendar dates (month 13, February 30, non-leap February 29, and similar) are rejected on all nine date filters across
cisa_search_kev,cisa_search_ics_advisories, andcisa_get_alerts(#38) - A malformed KEV feed is rejected whole instead of producing false
inKev: falseanswers; a failed refresh keeps the last valid snapshot (#35) cisa_get_alertsreportsfetchedAtandstale, and serves cached items with retry guidance when a refresh fails (#37)- A partial advisory-index refresh keeps applied rows readable, retries unresolved documents, and reports
partialstatus andfailedDocumentCount(#34) - Transient SQLite lock failures surface as retryable
mirror_busy(#28) mirror:refreshon a never-seeded index exits withmirror:initguidance before any request, and themirror:*scripts resolve imports in the npm package, bundle, and Docker image (#30)- stdin EOF during startup no longer strands a sync lease, and a first seed skipped under another process's lease retries in the background (#39)
- Advisory Markdown renders upstream text literally, so
<LABEL>placeholders stay visible (#36) - Test coverage thresholds pass without changes to thresholds or exclusions (#31); advisory index re-ingests once for the new content version; framework-skills resync
- deps:
@cyanheads/mcp-ts-core^0.13.14 → ^0.13.15,zod^4.6.5 → ^4.6.6 (+@types/node26.6.5, Bun 1.4.3)
CHANGELOG v0.3.2 · release PR #42
v0.3.1: mcp-ts-core 0.13.14: request IDs on errors, argument repair
mcp-ts-core 0.13.14: request IDs on errors, argument repair
- Error results carry
data.requestId, and a tool error's text endsrequest <id>(cyanheads/mcp-ts-core 0.13.10) - Tool arguments are repaired before validation: a numeric string for a number (
limit: "5"), a lone string for a list (cveIds: "CVE-2021-44228"), andnullfor an optional field (cyanheads/mcp-ts-core 0.13.14) - An ICS advisory index that cannot be opened fails naming only
csaf.sqlite3, never its directory (cyanheads/mcp-ts-core 0.13.12) server.jsonnpm entries run throughnpx, and the HTTP entry setsMCP_TRANSPORT_TYPE=http(cyanheads/mcp-ts-core 0.13.11)- The Docker image installs dependencies in a build-platform
depsstage (cyanheads/mcp-ts-core 0.13.10) and drops musl-only native packages (cyanheads/mcp-ts-core 0.13.11) - framework:
@cyanheads/mcp-ts-core^0.13.6→^0.13.14; deps:fast-xml-parser^5.11.1→^5.11.2,pino-pretty^13.1.3→^13.2.0; dev:@biomejs/biome2.5.14→2.5.15,@types/node26.6.2→26.6.4,@vitest/coverage-istanbul5.0.1→5.0.3,ignore^7.0.10→^7.0.12,tsc-alias^1.9.5→^1.9.7,vitest^5.0.1→^5.0.3
CHANGELOG v0.3.1 · release PR #32
v0.3.0: Per-user index path, refresh on every transport, ICS notices
Per-user index path, refresh on every transport, ICS notices
- The ICS advisory index defaults to the per-user cache directory instead of
<cwd>/.mirror/(breaking); the Docker image pins it to its.mirrorvolume (#11) - An index that cannot be opened fails the ICS surfaces with a non-retryable
mirror_unavailable, andcisa_list_referencetopicsourcessays why (#11) - The index refreshes at boot and on schedule on every transport, stdio included (breaking), seeding rather than refreshing an index that never synced, and processes sharing one index sync under a cross-process lease (#12)
cisa_get_advisorymisses report the index checkpoint and last sync, and flag an advisory that may be newer than the index (#12)- A refresh cron set to
offdisables its schedule; any other valuenode-cronrejects fails startup (breaking) (#24) - The
cisa_search_ics_advisorieszero-hit notice is computed from per-filter counts (#21) vendorandproductmatch labels with non-ASCII capitals and are capped at 512 characters (breaking) (#27)- ICS descriptions and reference topics drop corpus counts, with coverage notices following the index (#22);
nameContainsoncisa_search_kevspellsß,æ,øand kin the Latin-ASCII way (#25) - deps:
ignore^7.0.9→^7.0.10(dev); toolchain: Bun1.4.0→1.4.2;tscnow typechecks the mirror scripts
CHANGELOG v0.3.0 · release PR #29
v0.2.0: KEV summary projection, notes references, per-filter notices
KEV summary projection, notes references, per-filter notices
cisa_check_cve_statustakesdetail: "summary", the eleven triage fields per in-KEV record, so a 200-CVE batch stays compact (#9)- Every URL in a KEV entry's
notesbecomes a classifiedreferences[]entry (comma runs, URLs inside prose, a;inside a URL), so every entry now carries annvdreference (#15) - The
cisa_search_kevzero-hit notice is computed from per-filter counts: it names the filter that matches nothing and what dropping it restores, and stops blaming filters that match alone (#16) - Breaking: a
nameContainswith no letter a-z or digit 0-9 now failsempty_search_textinstead of returning zero results (#16) - Breaking: advertised
advisoryIdpatterns are canonical uppercase and flag-free. Uppercase-suffix IDs now validate under strict clients, and strict clients reject lowercase,.json-suffixed, or padded inputs before sending; the server still normalizes them (#20) cwe,cve, andcveIdPrefixfilters normalize case and whitespace (#17); anameContainsword lost to folding is named in a notice with the tokens searched (#23); descriptions no longer state KEV counts that drift with each release (#19)- deps:
@socketsecurity/bun-security-scanner^1.1.2 → ^1.1.3,@types/node26.6.1 → 26.6.2 (dev)
CHANGELOG v0.2.0 · release PR #26
v0.1.3: ICS search filters, full product index, per-CVE advisory reads
ICS search filters, full product index, per-CVE advisory reads
cwefilter oncisa_search_ics_advisoriesvia a newadvisory_cwesjunction table (#10)inKevfilter and per-resultkevCvesoncisa_search_ics_advisories, best-effort unlessinKevis set (#14)cvesinput oncisa_get_advisorynarrows thevulnerabilitiessection to named CVEs; both outline arms list the section's CVE IDs (#13)- Every advisory product row is now stored and indexed — the 200-row cap is gone (#6)
qwith no searchable text now throwsempty_search_textinstead of matching the whole corpus;vendor/productescape%and_so they match literally (#7)- Sector extraction resolves the short forms
Transportation,Water,Healthcare,Healthcare, Public Health, andHealth, Public Health(#8) - Ingest content is now versioned: an existing advisory index re-ingests itself in the background on the server's next start, no operator step needed
- deps:
fast-check(dev)^4.10.1→^4.10.2
CHANGELOG v0.1.3 · release PR #18
v0.1.2: Public hosted endpoint at cisa-cybersecurity.caseyjhand.com
Public hosted endpoint at cisa-cybersecurity.caseyjhand.com
server.jsonremotesdeclares the public Streamable HTTP endpoint, so registry clients can connect without installing the package- README carries the hosted endpoint link and a ready-to-paste
streamable-httpclient config alongside the stdio, npx, and Docker options
CHANGELOG v0.1.2 · release PR #5
v0.1.1: CISA KEV, SSVC, and the ICS advisory corpus over MCP
CISA KEV, SSVC, and the ICS advisory corpus over MCP
- KEV over MCP:
cisa_check_cve_status(200 CVE IDs per call from a cached snapshot) andcisa_search_kev(whole-snapshot filters, three-statedirective) cisa_get_ssvc: CISA's published decision points plus the BOD 26-04 Table 1 timeline they imply for a caller-suppliedassetExposure, reported beside CISA's own KEV due date- ICS advisory corpus back to 2010 as an embedded SQLite + FTS5 index, searched by
cisa_search_ics_advisoriesand read bycisa_get_advisory, withmirror:init/mirror:refresh/mirror:verifyfor out-of-band control cisa_get_alertsover the three publication feeds, andcisa_list_referencedecoding the vocabulary the rest of the surface takes as input- Resources
cisa://kev/{cveId}andcisa://advisory/{advisoryId} - Bounds on upstream input: per-source body ceilings, a 64 MiB tar-entry ceiling,
changes.csvsource-path validation, a cisa.gov host check onselfreferences, and a 512-character search-text cap - CVE IDs normalize before validation (#1); the advisory resource's outline notice names
cisa_get_advisory(#2);cisa_list_referencetopicsourcesreports index state rather than a filesystem path (#3) - Seven optional
CISA_*variables, Docker image, and.mcpbbundle - deps:
better-sqlite3^13.0.3,fast-xml-parser^5.11.1,node-cron^4.6.0
CHANGELOG v0.1.1 · release PR #4