ontology-term-resolution

SAFE max severity MEDIUMSkillSpector Caution 36 registry K-Dense-AI last scanned 1 scan

Verdict safe, but 8 findings (7 medium, 1 low), mainly data exfiltration, unauthorized tool use. Most recent scan 2026-10-21.

Second scanner: NVIDIA SkillSpector

Independent static run, no language model, over the same files as the Cisco scan above. How the two scanners compare across the whole corpus: Two scanners, one corpus.

What this skill does

Resolves free-text scientific labels to ontology term IDs and validates existing CURIEs against the EBI Ontology Lookup Service (OLS4). Also looks up prefixes in Bioregistry, resolves compact identifiers via Identifiers.org, maps lab shorthand with ZOOMA, and builds Ontobee term pages. Use whenever an ontology identifier must be produced or checked - annotating tissue, cell type, disease, phenotype, assay, chemical, organism, sex, or developmental stage fields; preparing metadata for GEO, ENA, BioSamples, CELLxGENE, HCA, or ISA-Tab submission; auditing a metadata table of term IDs; checking…

Package
12 files, 108 KB
SKILL.md
1846 words, 12+ sections
Code
Python (7)
Allowed tools
Read Write Edit Bash
License
MIT
Compatibility
Requires Python 3.11+. Scripts use only the standard library - no third-party packages. Needs network access to https://www.ebi.ac.uk/ols4, https://bioregistry.io, https://resolver.api.identifiers.org, and https://www.ebi.ac.uk/spot/zooma (all public, no API key).

SKILL.md covers: Ontology Term Resolution · When to use · The rule · Which service · Resolve text to terms · one string, constrained to the ontology that should define it · a column of tissue names; anything not an exact hit is reported, not guessed · accept fuzzy fallbacks, then review the partial hits by hand · Validate existing IDs · id + label columns; catches IDs that exist but are labelled as something else · a tissue column must hold UBERON anatomical entities and nothing else · Check a prefix or compact identifier

Findings

MEDIUM Code makes network requests Unauthorized Tool Usestatic

Skill code makes network requests. While not controlled by allowed-tools, network access should be documented and justified in the skill description.

SKILL.md

Remediation: Document network usage in skill description or remove network operations if not needed
MEDIUM Outbound network request primitives that can transmit data externally Data Exfiltrationstatic

Pattern detected: urllib.request.Request(

scripts/id_client.py:68

request = urllib.request.Request(url, headers={"User-Agent": USER_AGENT, "Accept": "application/json"})
Remediation: Ensure network operations are necessary and document allowed destinations
MEDIUM Outbound network request primitives that can transmit data externally Data Exfiltrationstatic

Pattern detected: urllib.request.urlopen(

scripts/id_client.py:72

with urllib.request.urlopen(request, timeout=TIMEOUT) as response:
Remediation: Ensure network operations are necessary and document allowed destinations
MEDIUM Outbound network request primitives that can transmit data externally Data Exfiltrationstatic

Pattern detected: urllib.request.Request(

scripts/ols_client.py:79

request = urllib.request.Request(
Remediation: Ensure network operations are necessary and document allowed destinations
MEDIUM Outbound network request primitives that can transmit data externally Data Exfiltrationstatic

Pattern detected: urllib.request.urlopen(

scripts/ols_client.py:86

with urllib.request.urlopen(request, timeout=TIMEOUT) as response:
Remediation: Ensure network operations are necessary and document allowed destinations
MEDIUM Outbound network request primitives that can transmit data externally Data Exfiltrationstatic

Pattern detected: urllib.request.Request(

scripts/zooma_client.py:78

request = urllib.request.Request(url, headers={"User-Agent": USER_AGENT, "Accept": "application/json"})
Remediation: Ensure network operations are necessary and document allowed destinations
MEDIUM Outbound network request primitives that can transmit data externally Data Exfiltrationstatic

Pattern detected: urllib.request.urlopen(

scripts/zooma_client.py:83

with urllib.request.urlopen(request, timeout=TIMEOUT) as response:
Remediation: Ensure network operations are necessary and document allowed destinations
LOW Code uses search/grep patterns but Grep tool not in allowed-tools Unauthorized Tool Usestatic

Skill restricts tools to ['Read', 'Write', 'Edit', 'Bash'] but code uses regex search patterns

SKILL.md

Remediation: Add 'Grep' to allowed-tools or remove regex search operations

What is in the package

FileKindSize
SKILL.mddoc14 KB
references/companion-apis.mddoc9.4 KB
references/curation-rules.mddoc5.9 KB
references/ols4-api.mddoc7.5 KB
references/ontology-registry.mddoc6.1 KB
scripts/id_client.pyscript12 KB
scripts/lookup_prefix.pyscript6.3 KB
scripts/map_terms.pyscript7.3 KB
scripts/ols_client.pyscript15 KB
scripts/resolve_terms.pyscript8.3 KB
scripts/validate_terms.pyscript11 KB
scripts/zooma_client.pyscript5.2 KB

External hosts referenced

www.ebi.ac.uk github.com resolver.api.identifiers.org bioregistry.io purl.obolibrary.org ontobee.org www.orpha.net identifiers.org arxiv.org api.cellosaurus.org docs.identifiers.org doi.org export.arxiv.org

Hostnames that appear in the skill's files. Referencing a host is not a finding; compare against the findings above and the skill's stated purpose.

Package contents recorded 2026-10-22 at commit 593377bb0487. The scan above ran against the version current at scan time; the two can differ if the skill has since been updated.

What we checked

What we did not check

Sources