Agent skill · research science · k-dense-ai
ontology-term-resolution
Resolve free-text scientific labels to ontology term IDs and validate existing CURIEs against the EBI Ontology Lookup Service (OLS4). 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 whether a term is obsolete and what replaced it; or mapping between ontologies. Triggers include "ontology term", "ontology ID", "CURIE", "controlled vocabulary", "UBERON", "CL:", "MONDO", "HPO", "EFO", "ChEBI", "NCBITaxon", "GO term", "PATO", "annotate this tissue/cell type/disease", and any request to emit or verify an identifier shaped like PREFIX:0001234.
Why this skill is useful
Adds scripts for resolving and validating ontology terms that are not commonly known or documented.
What it needs
Requires python installed locally. About 5k tokens when loaded. Last updated 2026-08-03. 32,849 stars on the source repository.
What this skill does
Ontology Term Resolution When to use Any time an ontology identifier is about to be written down or trusted: annotating a metadata column, filling a submission template, auditing a table someone else produced, or checking whether an ID in an old file is still current. The rule Never write an ontology ID from memory, and never accept one without checking it. Ontology IDs are memorable in form and arbitrary in detail. A plausible-looking UBERON:0002108 is a real term (small intestine) that is not the liver, and nothing downstream will catch the substitution — the ID is well-formed, the ontology is right, and the metadata is silently wrong. Reviewers cannot spot it either, which is why these errors persist into published datasets. Every ID this skill emits comes from a live OLS lookup. Every ID it is handed gets verified. Two directions Direction Script Question answered --- --- --- text → ID scripts/resolveterms.py What is the term for "left ventricle"? ID → verdict scripts/validateterms.py Is EFO:0001067 real, current, and labelled what this file claims? Both take single values or files, emit TSV or JSON, and need no packages beyond the standard library. Resolve text to terms The search escalates exact (label and synonym) → token → fulltext and stops at the first strategy that returns anything, reporting which one fired. --exact-only disables the ladder. --branch UBERON:0000465 restricts candidates to descendants of a term. Read matchtype before using a result. exactlabel and exactsynonym are safe; partial means OLS returned its best guess for a string that does not exist as written, and needs a human decision. unresolved is a legitimate output — see references/curation-rules.md for the normalisations worth retrying first. …
How to use it
Reference it in AdaL, Claude Code, Cursor or any coding agent — nothing to install:
@skills k-dense-ai/ontology-term-resolution