Orca Supply Chain Exposure Skill
Answers the question: "From this list of suspect packages, which are we actually running, where, and at what version?"
Replaces a manual sweep of inventory + SBOM queries with a single parallel check. Optimized for the moment after an MDR / vendor / news advisory lands and the team needs an exposure answer in minutes.
Usage
/orca-supply-chain-exposure @antv/util @antv/g2 @antv/g6 /orca-supply-chain-exposure log4j-core 2.14.1 /orca-supply-chain-exposure xz-utils 5.6.0,5.6.1
Or natural language:
- "are we exposed to the @antv npm attack?"
- "check these packages: react-devtools 4.28.0, axios 0.21.0"
- "any assets with xz-utils 5.6.x?"
- "supply chain check on this IOC list"
The user may paste a bullet list, a comma-separated list, or a table. Parse it.
Processing Logic
Step 1: Parse the package list
Build a normalized list of (package_name, suspected_versions[]). If the user only gave package names with no versions, treat any version found in the environment as a positive hit and rely on Orca's CVE data to confirm vulnerability.
Step 2: Run parallel exposure queries
For each package, run two queries in parallel:
Query A: Direct inventory lookup
discovery_search: search_phrase: "assets with package <name>" limit: 50
Query B: CVE-driven lookup (catches assets where Orca already flags the package as vulnerable)
discovery_search: search_phrase: "assets with vulnerable <name> package" limit: 50
Batching rule: Run all packages' Query A and Query B in parallel — one tool-call batch per package isn't enough, batch across packages. For 20 packages, that's 40 parallel discovery_search calls in one message.
Step 3: Match version ranges
For each asset returned, extract the installed version from the discovery_search response and compare against the user's suspected version list:
- Vulnerable Match: installed version is in the suspected range.
- Below Range: installed version is older than the vulnerable range (not affected).
- Above Range: installed version is newer (patched or unrelated).
- Unknown Version: discovery_search didn't return a version — flag and recommend a manual SBOM check in Orca UI.
Step 4: Enrich confirmed exposures
For assets with Vulnerable Match only (top 5 by environment importance), run in parallel:
get_asset_by_id: asset_id: <UUID>
get_asset_related_alerts_summary: asset_id: <UUID>
get_asset_crown_jewel_info: group_unique_id: <group_unique_id>
This adds prod/non-prod tag, exposure status, related CVEs Orca already raised, and crown-jewel status.
Step 5: Build the exposure table
Output is the table the on-call team needs to paste into a ticket or status update.
Proactive Remediation Behavior
CRITICAL: Never leave the user with just data. After the exposure table:
- Suggest the next action — "Patch
<package>on<asset>first because it's prod + internet-facing." - Offer remediation format selection — "I can generate the upgrade or removal manifest. Choose format: terraform | helm | ansible | cli | instructions | dockerfile-patch."
- For confirmed exposure on prod assets, auto-suggest snoozing alerts and opening an incident ticket.
When the user picks a format:
- Generate the upgrade / pin / removal config
- Write to
supplychain-fix-<package>.<ext> - Include the verification command (
npm ls <package>,pip show <package>, etc.) - Suggest the next package to fix
Output Format
Layer 1: Exposure Table
═══════════════════════════════════════════════════════════════════ SUPPLY CHAIN EXPOSURE CHECK <date> | <N> packages checked ═══════════════════════════════════════════════════════════════════ VERDICT: <one-liner — "1 confirmed exposure" / "no matches" / "3 vulnerable"> ┌─────────────────────────────────────────────────────────────────┐ │ PACKAGES CHECKED <N> │ │ CONFIRMED VULNERABLE <N> │ │ BELOW RANGE <N> │ │ NOT FOUND <N> │ │ ASSETS AFFECTED <N> (<M> prod, <K> non-prod) │ │ CROWN JEWELS AFFECTED <N> │ └─────────────────────────────────────────────────────────────────┘ EXPOSURE TABLE: Package Version in Env Vulnerable Range Status Assets ─────────────────────────────────────────────────────────────────────────────── <name> <ver> <range> VULNERABLE <count> <name> <ver> <range> Below Range <count> <name> — <range> Not Found 0 ... CONFIRMED EXPOSURES (act on these now): [!] <package>@<version> on <asset> (<type>, <prod/non-prod>) Crown jewel: YES/NO | Internet-facing: YES/NO | Related alerts: <N> Fix: upgrade to <safe version> OR remove if unused RECOMMENDED ACTION: Top priority: patch <package> on <asset> — <reason>. I can generate the fix right now. What format? terraform | helm | ansible | cli | dockerfile-patch | instructions | pulumi ═══════════════════════════════════════════════════════════════════ Or drill down: confirmed | unknown-version | not-found | by-asset | full ═══════════════════════════════════════════════════════════════════
Layer 2: Drill-Downs
"confirmed" — Confirmed vulnerable assets
─────────────────────────────────────────────────────────────────── CONFIRMED EXPOSURES ─────────────────────────────────────────────────────────────────── [!] <asset> (<type>) in <account> Package: <name>@<version> Vulnerable range: <range> Environment: <prod/staging/dev tag> Internet-facing: YES/NO Crown jewel: YES/NO Related Orca alerts: <N> (top: <alert title>) Upgrade path: <name>@<safe-version> [!] <asset> — ... ───────────────────────────────────────────────────────────────────
"unknown-version" — Assets where the version couldn't be determined
─────────────────────────────────────────────────────────────────── UNKNOWN VERSIONS — Manual SBOM Check Required ─────────────────────────────────────────────────────────────────── These assets have the package installed, but Orca's response didn't include a parseable version. Verify in Orca UI → Asset → SBOM: <asset> — <package> <asset> — <package> ... ───────────────────────────────────────────────────────────────────
"not-found" — Packages not present in the environment
─────────────────────────────────────────────────────────────────── NOT FOUND IN ENVIRONMENT ─────────────────────────────────────────────────────────────────── The following packages were not found on any monitored asset: • <package> (suspected versions: <range>) • <package> ... Caveat: a "not found" result means Orca's inventory has no match. Verify scanner coverage with /orca-account-health if accounts may be missing. ───────────────────────────────────────────────────────────────────
"by-asset" — Grouped by asset (useful for ticket assignment)
─────────────────────────────────────────────────────────────────── EXPOSURE BY ASSET ─────────────────────────────────────────────────────────────────── <asset> (<account>) • <package>@<version> — VULNERABLE • <package>@<version> — VULNERABLE • <package>@<version> — Below Range <asset> (<account>) • ... ───────────────────────────────────────────────────────────────────
"full" — Everything expanded
Edge Cases
No packages provided
⚠ No packages to check. Provide a package list: /orca-supply-chain-exposure <name1> <name2> ... /orca-supply-chain-exposure <name>@<version> Or paste a bullet list from your advisory.
All packages not found
✅ None of the <N> packages are present in the monitored environment. Caveats: • Verify Orca scanner coverage with /orca-account-health • Newly deployed assets may not have been scanned yet • Package may be installed under a different name (alias check recommended)
Discovery returned > 50 hits for a single package
⚠ <package> is on more than 50 assets — discovery_search is capped at 50. Showing top 50 by severity. For the full list: Open the app_url in the discovery_search response.
User provided versions but Orca returns no version data
Asset returned a hit for <package> but no version data. Manual verification needed in Orca UI → Asset → SBOM.
MCP Tools Used
Primary Tools
| Tool | Purpose | Parameter |
|---|---|---|
discovery_search | Find assets running a given package | search_phrase (NL), limit |
get_asset_by_id | Asset prod/non-prod tag and metadata | asset_id (UUID) |
get_asset_related_alerts_summary | Existing alerts on the affected asset | asset_id (UUID) |
get_asset_crown_jewel_info | Crown jewel status | group_unique_id |
Secondary Tools
| Tool | Purpose | When |
|---|---|---|
get_alert | Pull related CVE alert details | Drill-down into an existing Orca CVE alert for the package |
search_cdr_events | Recent activity from/to the affected asset | If user asks for activity context |
Parameter Notes
discovery_searchnatural-language phrasing matters: both"assets with package <name>"and"assets with vulnerable <name>"should run — each surfaces different data (inventory vs CVE-tagged).discovery_searchis capped at 50 results per call — the response includesapp_urlfor the full set; surface this when truncated.- The package-name string must match exactly what Orca indexes; common aliases (e.g.
log4j-corevslog4j) may need two queries.
Implementation Notes
- Parallelize across packages, not just across queries. For a 10-package advisory, the first batch should be ~20
discovery_searchcalls in one message. - Version match is the differentiator — without version comparison this is just a "package found anywhere" check. Always show the installed version and the suspected range side by side.
- "Below Range" is a real status, not a non-finding — call it out explicitly so the user sees that the check ran and the asset is verified safe.
- Crown jewel + internet-facing flag turns a generic "vulnerable" hit into a priority-1 incident. Always enrich confirmed exposures with these two fields.
- Link to other skills: suggest
/orca-impact-analysisfor fix consequences,/orca-alert-triagefor any related CVE alert,/orca-account-healthif "not found" results need a coverage sanity-check.


