/bio-geo-data
<!--
$ npx -y skills add FreedomIntelligence/OpenClaw-Medical-Skills --skill bio-geo-data --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/bio-geo-data
Context preview
The summary Claude sees to decide when to auto-load this skill.
<!--
SKILL.md
bio-geo-data.SKILL.md<!--
COPYRIGHT NOTICE
This file is part of the "Universal Biomedical Skills" project.
Copyright (c) 2026 MD BABU MIA, PhD <md.babu.mia@mssm.edu>
All Rights Reserved.
#
This code is proprietary and confidential.
Unauthorized copying of this file, via any medium is strictly prohibited.
#
Provenance: Authenticated by MD BABU MIA
-->
--- name: bio-geo-data description: Query NCBI Gene Expression Omnibus (GEO) for expression datasets using Biopython Bio.Entrez. Use when finding microarray/RNA-seq datasets, downloading expression data, or linking GEO series to SRA runs. tool_type: python primary_tool: Bio.Entrez measurable_outcome: Execute skill workflow successfully with valid output within 15 minutes. allowed-tools:
- read_file
- run_shell_command
---
GEO Data
Query and access Gene Expression Omnibus datasets using Biopython's Entrez module.
Required Setup
from Bio import Entrez
Entrez.email = 'your.email@example.com' # Required by NCBI
Entrez.api_key = 'your_api_key' # Optional
GEO Database Types
| Database | db value | Description | |----------|----------|-------------| | GEO DataSets | `gds` | Curated datasets (GDS*) | | GEO Profiles | `geoprofiles` | Individual gene profiles |
**GEO Record Types:** | Prefix | Type | Description | |--------|------|-------------| | GSE | Series | Complete study/experiment | | GSM | Sample | Individual sample | | GPL | Platform | Array/sequencing platform | | GDS | DataSet | Curated, normalized dataset |
Searching GEO
Search GEO DataSets (GDS)
from Bio import Entrez
Entrez.email = 'your.email@example.com'
# Search curated datasets
handle = Entrez.esearch(db='gds', term='breast cancer AND Homo sapiens[orgn]', retmax=10)
record = Entrez.read(handle)
handle.close()
print(f"Found {record['Count']} datasets")
print(f"IDs: {record['IdList']}")Search GEO Series (GSE)
# Search GEO Series via gds database
# Use entry_type filter
handle = Entrez.esearch(db='gds', term='RNA-seq[title] AND human[orgn] AND gse[entry_type]', retmax=10)
record = Entrez.read(handle)
handle.close()
Common Search Fields
| Field | Description | Example | |-------|-------------|---------| | `[orgn]` | Organism | `human[orgn]` | | `[title]` | Dataset title | `breast cancer[title]` | | `[description]` | Description text | `stem cell[description]` | | `[platform]` | Platform GPL | `GPL570[platform]` | | `[entry_type]` | Record type | `gse[entry_type]`, `gds[entry_type]` | | `[gdstype]` | Study type | `expression profiling[gdstype]` | | `[pubmed]` | PubMed ID | `35412348[pubmed]` | | `[pdat]` | Publication date | `2024[pdat]` |
GDS Types
# Expression profiling by array
term = 'expression profiling by array[gdstype] AND cancer'
# RNA-seq expression
term = 'expression profiling by high throughput sequencing[gdstype]'
# ChIP-seq
term = 'genome binding/occupancy profiling[gdstype]'
Fetching GEO Information
Get GEO DataSet Summary
# Fetch summary for GDS records
handle = Entrez.esummary(db='gds', id='200024320')
record = Entrez.read(handle)
handle.close()
summary = record[0]
print(f"Accession: {summary['Accession']}")
print(f"Title: {summary['title']}")
print(f"Summary: {summary['summary'][:200]}...")
print(f"Organism: {summary['taxon']}")
print(f"Platform: {summary['GPL']}")
print(f"Samples: {summary['n_samples']}")Summary Fields
summary['Accession'] # GSE/GDS accession
summary['title'] # Dataset title
summary['summary'] # Description
summary['taxon'] # Organism
summary['GPL'] # Platform ID
summary['n_samples'] # Number of samples
summary['FTPLink'] # FTP download link
summary['PubMedIds'] # Associated publications
summary['gdsType'] # Dataset type
summary['ptechType'] # Platform technology
Code Patterns
Search and List GEO Series
from Bio import Entrez
Entrez.email = 'your.email@example.com'
def search_geo(term, entry_type='gse', max_results=20):
full_term = f'{term} AND {entry_type}[entry_type]'
handle = Entrez.esearch(db='gds', term=full_term, retmax=max_results)
search = Entrez.read(handle)
handle.close()
if not search['IdList']:
return []
handle = Entrez.esummary(db='gds', id=','.join(search['IdList']))
summaries = Entrez.read(handle)
handle.close()
results = []
for s in summaries:
results.append({
'accession': s['Accession'],
'title': s['title'],
'organism': s['taxon'],
'samples': s['n_samples'],
'platform': s['GPL']
})
return results
datasets = search_geo('breast cancer RNA-seq AND human[orgn]')
for ds in datasets:
print(f"{ds['accession']}: {ds['title'][:60]}... ({ds['samples']} samples)")Find RNA-Seq Datasets
def find_rnaseq_datasets(organism, keywords, max_results=20):
term = f'{keywords} AND {organism}[orgn] AND expression profiling by high throughput sequencing[gdstype] AND gse[entry_type]'
handle = Entrez.esearch(db='gds', term=term, retmax=max_results)
search = Entrez.read(handle)
handle.close()
if not search['IdList']:
return []
handle = Entrez.esummary(db='gds', id=','.join(search['IdList']))
summaries = Entrez.read(handle)
handle.close()
return summaries
datasets = find_rnaseq_datasets('Homo sapiens', 'COVID-19')
for ds in datasets:
print(f"{ds['Accession']}: {ds['n_samples']} samples - {ds['title'][:50]}...")Get GSE Download Link
def get_geo_ftp(gse_accession):
'''Get FTP download link for a GSE'''
handle = Entrez.esearch(db='gds', term=f'{gse_accession}[accn]')
search = Entrez.read(handle)
handle.close()
if not search['IdList']:
return None
handle = Entrez.esummary(db='gds', id=search['IdList'][0])
summary = Entrez.read(handle)[0]
handle.close()
returRead more
<!--
COPYRIGHT NOTICE
This file is part of the "Universal Biomedical Skills" project.
Copyright (c) 2026 MD BABU MIA, PhD <md.babu.mia@mssm.edu>
All Rights Reserved.
#
This code is proprietary and confidential.
Unauthorized copying of this file, via any medium is strictly prohibited.
#
Provenance: Authenticated by MD BABU MIA
-->
--- name: bio-geo-data description: Query NCBI Gene Expression Omnibus (GEO) for expression datasets using Biopython Bio.Entrez. Use when finding microarray/RNA-seq datasets, downloading expression data, or linking GEO series to SRA runs. tool_type: python primary_tool: Bio.Entrez measurable_outcome: Execute skill workflow successfully with valid output within 15 minutes. allowed-tools:
- read_file
- run_shell_command
---
GEO Data
Query and access Gene Expression Omnibus datasets using Biopython's Entrez module.
Required Setup
from Bio import Entrez Entrez.email = 'your.email@example.com' # Required by NCBI Entrez.api_key = 'your_api_key' # Optional
GEO Database Types
| Database | db value | Description | |----------|----------|-------------| | GEO DataSets | `gds` | Curated datasets (GDS*) | | GEO Profiles | `geoprofiles` | Individual gene profiles |
**GEO Record Types:** | Prefix | Type | Description | |--------|------|-------------| | GSE | Series | Complete study/experiment | | GSM | Sample | Individual sample | | GPL | Platform | Array/sequencing platform | | GDS | DataSet | Curated, normalized dataset |
Searching GEO
Search GEO DataSets (GDS)
from Bio import Entrez
Entrez.email = 'your.email@example.com'
# Search curated datasets
handle = Entrez.esearch(db='gds', term='breast cancer AND Homo sapiens[orgn]', retmax=10)
record = Entrez.read(handle)
handle.close()
print(f"Found {record['Count']} datasets")
print(f"IDs: {record['IdList']}")Search GEO Series (GSE)
# Search GEO Series via gds database # Use entry_type filter handle = Entrez.esearch(db='gds', term='RNA-seq[title] AND human[orgn] AND gse[entry_type]', retmax=10) record = Entrez.read(handle) handle.close()
Common Search Fields
| Field | Description | Example | |-------|-------------|---------| | `[orgn]` | Organism | `human[orgn]` | | `[title]` | Dataset title | `breast cancer[title]` | | `[description]` | Description text | `stem cell[description]` | | `[platform]` | Platform GPL | `GPL570[platform]` | | `[entry_type]` | Record type | `gse[entry_type]`, `gds[entry_type]` | | `[gdstype]` | Study type | `expression profiling[gdstype]` | | `[pubmed]` | PubMed ID | `35412348[pubmed]` | | `[pdat]` | Publication date | `2024[pdat]` |
GDS Types
# Expression profiling by array term = 'expression profiling by array[gdstype] AND cancer' # RNA-seq expression term = 'expression profiling by high throughput sequencing[gdstype]' # ChIP-seq term = 'genome binding/occupancy profiling[gdstype]'
Fetching GEO Information
Get GEO DataSet Summary
# Fetch summary for GDS records
handle = Entrez.esummary(db='gds', id='200024320')
record = Entrez.read(handle)
handle.close()
summary = record[0]
print(f"Accession: {summary['Accession']}")
print(f"Title: {summary['title']}")
print(f"Summary: {summary['summary'][:200]}...")
print(f"Organism: {summary['taxon']}")
print(f"Platform: {summary['GPL']}")
print(f"Samples: {summary['n_samples']}")Summary Fields
summary['Accession'] # GSE/GDS accession summary['title'] # Dataset title summary['summary'] # Description summary['taxon'] # Organism summary['GPL'] # Platform ID summary['n_samples'] # Number of samples summary['FTPLink'] # FTP download link summary['PubMedIds'] # Associated publications summary['gdsType'] # Dataset type summary['ptechType'] # Platform technology
Code Patterns
Search and List GEO Series
from Bio import Entrez
Entrez.email = 'your.email@example.com'
def search_geo(term, entry_type='gse', max_results=20):
full_term = f'{term} AND {entry_type}[entry_type]'
handle = Entrez.esearch(db='gds', term=full_term, retmax=max_results)
search = Entrez.read(handle)
handle.close()
if not search['IdList']:
return []
handle = Entrez.esummary(db='gds', id=','.join(search['IdList']))
summaries = Entrez.read(handle)
handle.close()
results = []
for s in summaries:
results.append({
'accession': s['Accession'],
'title': s['title'],
'organism': s['taxon'],
'samples': s['n_samples'],
'platform': s['GPL']
})
return results
datasets = search_geo('breast cancer RNA-seq AND human[orgn]')
for ds in datasets:
print(f"{ds['accession']}: {ds['title'][:60]}... ({ds['samples']} samples)")Find RNA-Seq Datasets
def find_rnaseq_datasets(organism, keywords, max_results=20):
term = f'{keywords} AND {organism}[orgn] AND expression profiling by high throughput sequencing[gdstype] AND gse[entry_type]'
handle = Entrez.esearch(db='gds', term=term, retmax=max_results)
search = Entrez.read(handle)
handle.close()
if not search['IdList']:
return []
handle = Entrez.esummary(db='gds', id=','.join(search['IdList']))
summaries = Entrez.read(handle)
handle.close()
return summaries
datasets = find_rnaseq_datasets('Homo sapiens', 'COVID-19')
for ds in datasets:
print(f"{ds['Accession']}: {ds['n_samples']} samples - {ds['title'][:50]}...")Get GSE Download Link
def get_geo_ftp(gse_accession):
'''Get FTP download link for a GSE'''
handle = Entrez.esearch(db='gds', term=f'{gse_accession}[accn]')
search = Entrez.read(handle)
handle.close()
if not search['IdList']:
return None
handle = Entrez.esummary(db='gds', id=search['IdList'][0])
summary = Entrez.read(handle)[0]
handle.close()
returThe largest open-source medical AI skill library for OpenClaw.
Other skills on openclaw-medical-skills.
adaptyv
Cloud laboratory platform for automated protein testing and validation. Use when designing proteins and needing experimental validation including binding…
adhd-daily-planner
Time-blind friendly planning, executive function support, and daily structure for ADHD brains. Specializes in realistic time estimation, dopamine-aware task…
aeon
This skill should be used for time series machine learning tasks including classification, regression, clustering, forecasting, anomaly detection,…
agent-browser
Browse the web for any task — research topics, read articles, interact with web apps, fill forms, take screenshots, extract data, and test web pages. Use…

