
Ucsc Conservation And Tfbs
- 1.2k installs
- 2.6k repo stars
- Updated July 7, 2026
- google-deepmind/science-skills
ucsc-conservation-and-tfbs is a science agent skill that queries UCSC genome browser conservation tracks and transcription factor binding site data for developers running agentic genomics workflows.
About
ucsc-conservation-and-tfbs is a Google DeepMind science-skills package with 624 installs listed on skills.sh. The skill lets coding agents pull UCSC Genome Browser conservation tracks and transcription factor binding site (TFBS) data inside reproducible scientific workflows. Bioinformatics developers use it when variant interpretation, motif analysis, or comparative genomics needs authoritative track metadata without manually clicking the UCSC portal. The catalog entry ranks 8100 on skills.sh and ships from the google-deepmind/science-skills GitHub source for agent-driven genomic queries.
- Direct access to UCSC conservation scores and TFBS annotations via the UCSC Table Browser API
- Returns structured genomic interval data ready for downstream ML or analysis agents
- Supports conservation analysis across multiple vertebrate genomes
- Designed for integration with Claude Code, Cursor, and other coding agents
- 624 developers have installed this skill from the Google DeepMind science-skills collection
Ucsc Conservation And Tfbs by the numbers
- 1,232 all-time installs (skills.sh)
- +165 installs in the week ending Aug 5, 2026 (Skillselion tracking)
- Ranked #274 of 2,064 Data Science & ML skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/google-deepmind/science-skills --skill ucsc-conservation-and-tfbsAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 1.2k |
|---|---|
| repo stars | ★ 2.6k |
| Last updated | July 7, 2026 |
| Repository | google-deepmind/science-skills ↗ |
How do you query UCSC conservation tracks programmatically?
Query UCSC genome browser conservation tracks and transcription factor binding site data inside agentic scientific workflows.
Who is it for?
Bioinformatics developers building agentic pipelines that need UCSC conservation and TFBS data without manual browser exports.
Skip if: Teams doing clinical variant reporting that requires licensed proprietary annotation databases instead of UCSC public tracks.
When should I use this skill?
A developer asks to fetch UCSC conservation scores, TFBS overlaps, or genome-browser track data inside an agent run.
What you get
UCSC conservation track results, TFBS hit tables, and agent-ready genomic interval annotations for downstream analysis.
- Conservation track tables
- TFBS overlap annotations
By the numbers
- 624 installs listed on skills.sh
- Catalog rank 8100 on skills.sh
Files
Conservation Scores & TFBS Lookup (UCSC)
This skill provides access to evolutionary constraint scores and conserved elements from the UCSC Genome Browser. It retrieves scores from the PHAST package — specifically phastCons (identifying functional blocks) and phyloP (measuring individual site constraint) — calculated from multiple alignments.
Use this skill to determine if a non-coding variant hits a site that hasn't changed since a common ancestor (which is a strong signal for pathogenicity) or to find conservation peaks across a regulatory element.
Prerequisites
1. `uv`: Read the uv skill and follow its Setup instructions to ensure uv is installed and on PATH. 2. User Notification: If LICENSE_NOTIFICATION.txt does not already exist in this skill directory then (1) prominently notify the user to check the terms at https://genome.ucsc.edu/conditions.html and https://genome.ucsc.edu/goldenPath/help/api.html, then (2) create the file recording the notification text and timestamp.
Core Rules
- Use the Wrapper: ALWAYS execute the provided helper scripts to query the
database rather than accessing the database directly. The scripts automatically enforce the required rate limit gracefully.
- Large Output Handling: Always pass --output to redirect output to a
file. Parse it separately (using jq or your own code).
- Notification: If this skill is used, ensure this is mentioned in the
output.
Utility Scripts
This skill includes scripts to query different types of genomic data from UCSC:
1. `scripts/get_conservation.py`: For Evolutionary Conservation scores (phyloP, phastCons). 2. `scripts/get_tfbs.py`: For Transcription Factor Binding Sites (TFBS). 3. `scripts/list_tracks.py`: For listing available tracks based on search or group constraints.
Always use the hg38 genome assembly by default, unless the user has specified otherwise.
Fetching Conservation for Specific Variants
To get the evolutionary constraint at a single base, or a list of specific bases. This is optimal for single nucleotide variants (SNVs). phyloP is the best metric for individual bases.
uv run scripts/get_conservation.py --coordinates "chr1:215867804" "chr1:215867823" --output /tmp/cons_output.jsonFetching Regions and Conserved Elements
To identify "conservation peaks" across a non-coding regulatory element (like an enhancer) to see if an ISM-predicted importance peak aligns with evolutionary history. phastCons is best for functional windows due to HMM smoothing. The --conserved-elements flag will also retrieve predefined blocks under extreme constraint.
uv run scripts/get_conservation.py --coordinates "chr8:11748914-11749085" --conserved-elements --output /tmp/region_cons.jsonLineage-Specific Constraints
You can control the evolutionary depth using the --collection flag. The default (vertebrate) uses the 100-vertebrate Multiz alignment for both hg38 and hg19, matching the UCSC Genome Browser's default comparative genomics tracks.
hg38 Collections
- `vertebrate` (default): UCSC 100-vertebrate Multiz alignment. phyloP:
phyloP100way, phastCons: phastCons100way.
- `mammal`: Hiller Lab 470-way mammalian alignment. phyloP:
phyloP470wayBW, phastCons: phastCons470way.
- `primate`: UCSC 30-primate Multiz alignment. phyloP:
phyloP30way,
phastCons: phastCons30way.
hg19 Collections
- `vertebrate` (default): UCSC 100-vertebrate Multiz alignment. phyloP:
phyloP100way, phastCons: phastCons100way.
- `vertebrate46`: UCSC 46-vertebrate Multiz alignment (legacy). phyloP:
phyloP46wayAll, phastCons: phastCons46way.
- `mammal`: 46-way placental mammal subset. phyloP:
phyloP46wayPlacental, phastCons: phastCons46wayPlacental.
- `primate`: 46-way primate subset. phyloP:
phyloP46wayPrimates,
phastCons: phastCons46wayPrimates.
# hg38 mammal (Hiller 470-way)
uv run scripts/get_conservation.py --coordinates "chr5:1045330-1046172" --collection mammal --output /tmp/mammal_cons.json
# hg19 with legacy 46-vertebrate alignment
uv run scripts/get_conservation.py --coordinates "chr5:1045330-1046172" --genome hg19 --collection vertebrate46 --output /tmp/vert46_cons.jsonAnalyzing Evolutionary Acceleration
To analyze whether a specific locus is undergoing evolutionary acceleration (i.e. evolving more rapidly than the neutral drift baseline), use --analyze. This will compute scalar statistics (mean, min, max) for phyloP scores and provide a heuristic boolean is_accelerated to simplify your evaluation.
uv run scripts/get_conservation.py --coordinates "chr5:1045330-1046172" --analyze --output /tmp/accelerated_cons.jsonFetching Transcription Factor Binding Sites (TFBS)
To identify transcription factor binding sites for a given genomic interval. This is useful for interpreting non-coding variants that might disrupt TF binding.
Run scripts/get_tfbs.py with --coordinates and --tracks. You can query multiple tracks at once.
uv run scripts/get_tfbs.py --coordinates "chr11:1001000-1010000" --tracks encRegTfbsClustered --output /tmp/tfbs_encode.jsonJASPAR tracks may return very large result sets. Use --tf-filter to keep only items whose TFName field contains the given substring (case-insensitive):
uv run scripts/get_tfbs.py --coordinates "chr6:36670000-36690000" --tracks jaspar2024 --tf-filter TP53 --output /tmp/tp53_sites.jsonCommon Verified Tracks (hg38)
- ENCODE:
encRegTfbsClustered(TF Clusters) - JASPAR:
jaspar2026,jaspar2024(Predicted TFBS) - ReMap:
ReMapTFs(ChIP-seq Atlas)
[!CAUTION] Tracks likejasparorReMapwithout years are often "container"
tracks and will fail with a 400 error. Always use the specific subtrack name
(e.g., jaspar2026).Listing Available Tracks
To list available tracks (such as different versions of JASPAR, or purely to discover what tracks exist for a particular genome assembly):
uv run scripts/list_tracks.py --search "jaspar" --output /tmp/jaspar_tracks.jsonYou can also filter by functional group:
uv run scripts/list_tracks.py --group "regulation" --output /tmp/regulation_tracks.jsonAnti-Patterns
- DON'T query mammalian (
--collection mammal) constraint if you are
explicitly looking for deep evolutionary roots across all vertebrates. Use the default vertebrate collection.
- DON'T use this skill for determining the ancestral state reconstruction
of a nucleotide (this skill provides measures of how much sites have changed, not what the ancestral nucleotide was).
- DON'T assume low conservation strictly means neutral/useless sequence;
it could also reflect a high local mutation rate which conservation scores alone cannot distinguish.
- DON'T print output on standard out, or run cat on output to files. The
output is too large. Use jq or write your own code to parse the output files.
- DON'T use hg19 unless the user has explicitly asked for it. The default
should be to always use hg38.
# Copyright 2026 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Fetches Evolutionary Conservation scores from UCSC Database."""
# /// script
# requires-python = ">=3.10"
# dependencies = [
# "scienceskillscommon",
# ]
# [tool.uv.sources]
# scienceskillscommon = { path = "../../scienceskillscommon" }
# ///
import argparse
import json
import re
import sys
from typing import Any
from science_skills.skills.scienceskillscommon import http_client
UCSC_API_URL = "https://api.genome.ucsc.edu/getData/track"
CLIENT = http_client.HttpClient("https://api.genome.ucsc.edu/", qps=0.05)
def parse_coordinate(coord_str: str) -> tuple[str, int, int]:
"""Parses a coordinate string like 'chr1:100-200' or 'chr1:100'.
User-facing coordinates are 1-based (matching the UCSC Genome Browser
display). The UCSC REST API uses 0-based half-open coordinates, so we
convert by subtracting 1 from the start position.
"""
match = re.match(r"^(chr[0-9XYM]+|\w+):(\d+)(?:-(\d+))?$", coord_str)
if not match:
print(
f"Error: Invalid coordinate format '{coord_str}'. Expected"
" 'chr:start-end' or 'chr:pos'."
)
sys.exit(1)
chrom = match.group(1)
start_1based = int(match.group(2))
# Convert from 1-based to 0-based half-open for the UCSC API.
start = start_1based - 1
if match.group(3):
# End is already correct: 1-based inclusive end == 0-based half-open end.
end = int(match.group(3))
else:
# Single position: 1-based pos N -> 0-based [N-1, N).
end = start_1based
return chrom, start, end
def get_conservation_data(
chrom: str, start: int, end: int, track: str, genome: str = "hg38"
) -> dict[str, Any]:
"""Fetches track data for a given region."""
url = f"{UCSC_API_URL}?genome={genome}&track={track}&chrom={chrom}&start={start}&end={end}"
print(f"Requesting URL: {url}")
return CLIENT.fetch_json(url)
def merge_results(
coords: list[str],
collection: str,
fetch_conserved: bool,
genome: str,
analyze: bool,
) -> dict[str, dict[str, Any]]:
"""Main fetching and merging logic."""
if genome == "hg38":
if collection == "vertebrate":
# UCSC 100-vertebrate Multiz alignment (default comparative genomics
# track on the UCSC Genome Browser for hg38).
phylo_track = "phyloP100way"
phast_track = "phastCons100way"
elif collection == "mammal":
# Hiller Lab 470-way mammalian alignment.
phylo_track = "phyloP470wayBW"
phast_track = "phastCons470way"
elif collection == "primate":
# UCSC 30-primate Multiz alignment.
phylo_track = "phyloP30way"
phast_track = "phastCons30way"
else:
raise ValueError(
f"Unsupported collection: {collection} for hg38. Supported:"
" vertebrate (100-way, default), mammal (Hiller 470-way),"
" primate (30-way)."
)
elif genome == "hg19":
if collection == "vertebrate":
# UCSC 100-vertebrate Multiz alignment (default for hg19).
phylo_track = "phyloP100way"
phast_track = "phastCons100way"
elif collection == "vertebrate46":
# UCSC 46-vertebrate Multiz alignment (legacy hg19 track).
phylo_track = "phyloP46wayAll"
phast_track = "phastCons46way"
elif collection == "mammal":
# 46-way placental mammal subset.
phylo_track = "phyloP46wayPlacental"
phast_track = "phastCons46wayPlacental"
elif collection == "primate":
# 46-way primate subset.
phylo_track = "phyloP46wayPrimates"
phast_track = "phastCons46wayPrimates"
else:
raise ValueError(
f"Unsupported collection: {collection} for hg19. Supported:"
" vertebrate (100-way, default), vertebrate46 (46-way),"
" mammal (46-way placental), primate (46-way primates)."
)
else:
raise ValueError(
f"Unsupported genome: {genome}. Only hg38 and hg19 are supported."
)
tracks_to_fetch = [phylo_track, phast_track]
if fetch_conserved:
tracks_to_fetch.append(phast_track.replace("Cons", "ConsElements"))
# Note: 'haqer' and 'ucne' might exist depending on genome build,
# but we stick to the core phastConsElements for robustness here.
# Can add others if needed and verified exist.
results = {}
for coord in coords:
chrom, start, end = parse_coordinate(coord)
region_result = {"coordinate": f"{chrom}:{start}-{end}", "tracks": {}}
for track in tracks_to_fetch:
print(f"Fetching {track} for region {chrom}:{start}-{end}...")
data = get_conservation_data(chrom, start, end, track, genome=genome)
# Extract actual track data items from the JSON
# (which usually places them under the chromosome name key or similar)
track_items = data.get(chrom, [])
if not track_items and track in data:
# fallback for some tracks
track_items = data.get(track, [])
region_result["tracks"][track] = track_items
if analyze and track.startswith("phyloP"):
scores = [i.get("value") for i in track_items if i.get("value")]
if scores:
mean_score = sum(scores) / len(scores)
min_score = min(scores)
max_score = max(scores)
# Heuristic for acceleration: strong negative scores
is_accelerated = mean_score < -0.3 or min_score < -2.0
region_result["analysis"] = {
"track": track,
"mean_phyloP": round(mean_score, 4),
"min_phyloP": round(min_score, 4),
"max_phyloP": round(max_score, 4),
"is_accelerated": is_accelerated,
}
results[coord] = region_result
return results
def main():
parser = argparse.ArgumentParser(
description="Fetch Evolutionary Conservation scores from UCSC Database."
)
parser.add_argument(
"--coordinates",
required=True,
nargs="+",
help=(
"One or more genomic coordinates (e.g., 'chr1:100-200' or"
" 'chr1:100')."
),
)
parser.add_argument(
"--collection",
choices=["vertebrate", "mammal", "primate", "vertebrate46"],
default="vertebrate",
help=(
"Evolutionary depth of alignment. For hg38: vertebrate (100-way,"
" default), mammal (Hiller 470-way), primate (30-way). For hg19:"
" vertebrate (100-way, default), vertebrate46 (46-way legacy),"
" mammal (46-way placental), primate (46-way primates)."
),
)
parser.add_argument(
"--output",
required=True,
help="Filename where all successful output is written in JSON format.",
)
parser.add_argument(
"--conserved-elements",
action="store_true",
help="Also fetch predefined highly-conserved blocks within the region.",
)
parser.add_argument(
"--genome", default="hg38", help="Genome assembly. Defaults to hg38."
)
parser.add_argument(
"--analyze",
action="store_true",
help="Analyze phyloP scores for signals of evolutionary acceleration.",
)
args = parser.parse_args()
results = merge_results(
args.coordinates,
args.collection,
args.conserved_elements,
args.genome,
args.analyze,
)
# Dump final output to specified file
with open(args.output, "w") as f:
json.dump(results, f, indent=2)
if __name__ == "__main__":
main()
# Copyright 2026 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Fetches Transcription Factor Binding Sites (TFBS) from UCSC Database."""
# /// script
# requires-python = ">=3.10"
# dependencies = [
# "scienceskillscommon",
# ]
# [tool.uv.sources]
# scienceskillscommon = { path = "../../scienceskillscommon" }
# ///
import argparse
import json
import re
import sys
from typing import Any
from science_skills.skills.scienceskillscommon import http_client
UCSC_API_URL = "https://api.genome.ucsc.edu/getData/track"
api_client = http_client.HttpClient("https://api.genome.ucsc.edu/", qps=0.05)
def parse_coordinate(coord_str: str) -> tuple[str, int, int]:
"""Parses a coordinate string like 'chr1:100-200' or 'chr1:100'."""
match = re.match(r"^(chr[0-9XYM]+|\w+):(\d+)(?:-(\d+))?$", coord_str)
if not match:
print(
f"Error: Invalid coordinate format '{coord_str}'. Expected"
" 'chr:start-end' or 'chr:pos'."
)
sys.exit(1)
chrom = match.group(1)
start = int(match.group(2))
if match.group(3):
end = int(match.group(3))
else:
# If no end provided, assume a 1bp region (start and start+1)
end = start + 1
return chrom, start, end
def get_tfbs_data(
chrom: str, start: int, end: int, track: str, genome: str = "hg38"
) -> dict[str, Any]:
"""Fetches track data for a given region."""
url = f"{UCSC_API_URL}?genome={genome}&track={track}&chrom={chrom}&start={start}&end={end}"
print(f"Requesting URL: {url}")
return api_client.fetch_json(url)
def main():
parser = argparse.ArgumentParser(
description=(
"Fetch Transcription Factor Binding Sites (TFBS) from UCSC Database."
)
)
parser.add_argument(
"--coordinates",
required=True,
nargs="+",
help=(
"One or more genomic coordinates (e.g., 'chr1:100-200' or"
" 'chr1:100')."
),
)
parser.add_argument(
"--tracks",
required=True,
nargs="+",
help=(
"One or more track names or aliases (e.g., 'encRegTfbsClustered',"
" 'jaspar2026', 'ReMapTFs')."
),
)
parser.add_argument(
"--tf-filter",
default=None,
help=(
"Optional case-insensitive filter on the TFName field. Only items"
" whose TFName contains this substring are kept (e.g., 'TP53')."
),
)
parser.add_argument(
"--output",
required=True,
help="Filename where all successful output is written in JSON format.",
)
parser.add_argument(
"--genome", default="hg38", help="Genome assembly. Defaults to hg38."
)
args = parser.parse_args()
results = {}
for coord in args.coordinates:
chrom, start, end = parse_coordinate(coord)
region_result = {"coordinate": f"{chrom}:{start}-{end}", "tracks": {}}
for track in args.tracks:
print(f"Fetching {track} for region {chrom}:{start}-{end}...")
data = get_tfbs_data(chrom, start, end, track, genome=args.genome)
# Extract actual track data items from the JSON.
if "error" in data:
print(f"API Error for track '{track}': {data['error']}")
region_result["tracks"][track] = {"error": data["error"]}
continue
# Try both track name and chromosome as key
track_items = data.get(track, [])
if not track_items and chrom in data:
track_items = data.get(chrom, [])
# Fallback to look for ANY list that looks like data
if not track_items:
for k, v in data.items():
if isinstance(v, list) and k not in [
"downloadTime",
"downloadTimeStamp",
"dataTime",
"dataTimeStamp",
"genome",
"track",
"chrom",
"start",
"end",
]:
track_items = v
break
# Apply TF name filter if specified.
if args.tf_filter and track_items:
tf_filter_lower = args.tf_filter.lower()
filtered = [
item
for item in track_items
if tf_filter_lower in item.get("TFName", "").lower()
]
print(
f" Filtered {len(track_items)} items to {len(filtered)} matching"
f" TFName containing '{args.tf_filter}'."
)
track_items = filtered
region_result["tracks"][track] = track_items
results[coord] = region_result
# Dump final output to specified file
with open(args.output, "w") as f:
json.dump(results, f, indent=2)
print(f"Output written to {args.output}")
if __name__ == "__main__":
main()
# Copyright 2026 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Script to list available tracks from the UCSC Genome Database."""
# /// script
# requires-python = ">=3.10"
# dependencies = [
# "scienceskillscommon",
# ]
# [tool.uv.sources]
# scienceskillscommon = { path = "../../scienceskillscommon" }
# ///
import argparse
import json
import os
import sys
from typing import Any
from science_skills.skills.scienceskillscommon import http_client
UCSC_API_URL = "https://api.genome.ucsc.edu/list/tracks"
api_client = http_client.HttpClient("https://api.genome.ucsc.edu/", qps=0.05)
def flatten_tracks(track_dict: dict[str, Any]) -> list[dict[str, Any]]:
"""Flattens the deeply nested track structure into a list of tracks."""
tracks = []
def traverse(d: dict[str, Any]):
for key, value in d.items():
if not isinstance(value, dict):
continue
if key in (
"downloadTime",
"downloadTimeStamp",
"dataTime",
"dataTimeStamp",
):
continue
# If it's a track (has shortLabel or type)
if "shortLabel" in value:
tracks.append({
"track": key,
"shortLabel": value.get("shortLabel", ""),
"longLabel": value.get("longLabel", ""),
"group": value.get("group", ""),
"type": value.get("type", ""),
})
# Recurse for child tracks
traverse(value)
traverse(track_dict)
return tracks
def filter_tracks(
tracks: list[dict[str, Any]], search: str = None, group: str = None
) -> list[dict[str, Any]]:
"""Filters tracks based on search string and group."""
filtered = []
seen = set()
for track in tracks:
track_id = track["track"]
if track_id in seen:
continue
# Filter by group
if group and track["group"] and group.lower() not in track["group"].lower():
continue
# Filter by search term
if search:
s = search.lower()
if not (
s in track_id.lower()
or s in track["shortLabel"].lower()
or s in track["longLabel"].lower()
):
continue
filtered.append(track)
seen.add(track_id)
return filtered
def main():
parser = argparse.ArgumentParser(
description="List available tracks from UCSC."
)
parser.add_argument(
"--genome",
default="hg38",
help="Genome assembly to query (e.g., hg38, hg19). Defaults to hg38.",
)
parser.add_argument(
"--search",
help=(
"Substring to search for in trackName, shortLabel, or longLabel"
" (case-insensitive)."
),
)
parser.add_argument(
"--group",
help=(
"Substring to search for in track group (e.g., 'genes', 'regulation',"
" 'varRep'). Case-insensitive."
),
)
parser.add_argument(
"--output",
required=True,
help="Path where the output matches will be saved in JSON format.",
)
args = parser.parse_args()
url = f"{UCSC_API_URL}?genome={args.genome}"
print(f"Requesting URL: {url}")
data = api_client.fetch_json(url)
genome_data = data.get(args.genome, {})
if not genome_data:
print(f"No track data found for genome {args.genome}.")
sys.exit(1)
all_tracks = flatten_tracks(genome_data)
filtered_tracks = filter_tracks(all_tracks, args.search, args.group)
print(f"Found {len(filtered_tracks)} tracks matching criteria.")
# Dump output
out_dir = os.path.dirname(os.path.abspath(args.output))
if out_dir:
os.makedirs(out_dir, exist_ok=True)
with open(args.output, "w") as f:
json.dump(
{
"genome": args.genome,
"search": args.search,
"group": args.group,
"matchCount": len(filtered_tracks),
"tracks": filtered_tracks,
},
f,
indent=2,
)
if __name__ == "__main__":
main()
Related skills
How it compares
Pick ucsc-conservation-and-tfbs when UCSC public conservation and TFBS tracks are sufficient instead of building a custom Ensembl or gnomAD integration first.
FAQ
What genomic data does ucsc-conservation-and-tfbs fetch?
ucsc-conservation-and-tfbs fetches UCSC Genome Browser conservation tracks and transcription factor binding site (TFBS) records for agent workflows. Developers use it to annotate intervals with conservation scores and motif overlap evidence during bioinformatics analysis.
How popular is ucsc-conservation-and-tfbs on skills.sh?
ucsc-conservation-and-tfbs shows 624 installs on skills.sh with catalog rank 8100, sourced from google-deepmind/science-skills on GitHub. That count reflects community adoption of the UCSC query workflow among agent users.