[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6DAPADC0FX1PN5WF6N0DCXD":3,"skill-same:01M6DAPADC0FX1PN5WF6N0DCXD":114},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":34,"publishedAt":55,"linkOnly":56,"markdownContent":57,"markdownBody":58,"frontMatter":59,"refName":60,"commitSha":61,"skillDirectory":62,"forksCount":14,"repositoryHtmlUrl":63,"repositoryHomepageUrl":6,"ownerHtmlUrl":64,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":65,"install":66,"resources":79},"01M6DAPADC0FX1PN5WF6N0DCXD","tooluniverse-data-wrangling",null,"Universal data access reference for scientific research. Teaches how to download bulk data, parse any scientific file format (VCF, h5ad, mzML, PDB, FASTA, XPT, NIfTI, and 30+ more), paginate REST APIs, and handle authentication. Covers 24 domain API patterns across ALL life science data sources — genomics, proteomics, clinical, imaging, ecology, and more. Use this skill whenever you need to download raw data, parse a file format, access a bulk API, write a multi-step data retrieval workflow, or when a ToolUniverse tool returns metadata but you need the actual data. Also use when the data source has no ToolUniverse tool at all. Even if the user doesn't say \"data wrangling\" — if their task requires getting data from a scientific database or parsing a scientific file format, this is the skill to use.","Prekzursil\u002Fagent-skills-toolchain","Prekzursil","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F54636077?v=4","01M6DACZ1PCQHD99SCR1YXG28B","Andrei Mihai Visalon","01M6DACZ670WZF535V3WYYSS4Z",0,"MIT","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002F.agents\u002Flibrary\u002Fskills\u002Ftooluniverse-data-wrangling\u002FSKILL.md",[18,23,26,31],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000021","资料检索与研究",{"categoryNo":27,"categoryName":28,"taxonomyType":29,"taxonomyTypeDesc":30},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",{"categoryNo":32,"categoryName":33,"taxonomyType":29,"taxonomyTypeDesc":30},"01JBSEEDCAT000000000000033","数据分析师",[35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54],"tooluniverse data wrangling","data","wrangling","data wrangling","write","clinical","life","across","domain","but","patterns","workflow","returns","access","how","parsing","api","api patterns","database","authentication","2026-11-10 10:12:30",false,"---\nname: tooluniverse-data-wrangling\ndescription: Universal data access reference for scientific research. Teaches how to download bulk data, parse any scientific file format (VCF, h5ad, mzML, PDB, FASTA, XPT, NIfTI, and 30+ more), paginate REST APIs, and handle authentication. Covers 24 domain API patterns across ALL life science data sources — genomics, proteomics, clinical, imaging, ecology, and more. Use this skill whenever you need to download raw data, parse a file format, access a bulk API, write a multi-step data retrieval workflow, or when a ToolUniverse tool returns metadata but you need the actual data. Also use when the data source has no ToolUniverse tool at all. Even if the user doesn't say \"data wrangling\" — if their task requires getting data from a scientific database or parsing a scientific file format, this is the skill to use.\n---\n\n# Data Wrangling: Universal Access Patterns\n\nReference for downloading and parsing scientific data from any source. Write and run Python code via Bash for every step.\n\n## When to Use\n\n- ToolUniverse tool returned metadata\u002Fsearch results but you need **raw or bulk data**\n- Data is in a format tools don't parse (VCF, h5ad, BAM, SDF, GCT)\n- You need a **multi-step API workflow** (search -> filter -> download -> parse)\n- The data source has **no ToolUniverse tool** at all\n- You need **thousands of records**, not the 10-100 a tool returns\n\n## Decision: Tool vs Code\n\n| Situation | Use |\n|-----------|-----|\n| Single record lookup, simple search, \u003C100 results | ToolUniverse tool (`execute_tool`) |\n| Bulk download, custom filtering, format conversion | Write Python code |\n| Tool exists but returns truncated results | Write code using the same API the tool wraps |\n| No tool exists for this source | Write code directly |\n\n---\n\n## Section A: Format Cookbook\n\n### Tabular\n```python\nimport pandas as pd, io\n\ndf = pd.read_csv(\"data.csv\")                                # CSV\ndf = pd.read_csv(\"data.tsv\", sep=\"\\t\")                      # TSV\ndf = pd.read_sas(io.BytesIO(content), format=\"xport\")       # SAS Transport (XPT) — NHANES, CDC\ndf = pd.read_sas(\"data.sas7bdat\", format=\"sas7bdat\")        # SAS native\ndf = pd.read_stata(\"data.dta\")                               # Stata — ICPSR, HRS\ndf = pd.read_parquet(\"data.parquet\")                         # Parquet — MIMIC-IV\ndf = pd.read_excel(\"data.xlsx\")                              # Excel\ndf = pd.read_spss(\"data.sav\")                                # SPSS\ndf = pd.read_fwf(\"data.dat\")                                 # Fixed-width — legacy surveys\n```\n\n### Genomics\n```python\nfrom Bio import SeqIO\nrecords = list(SeqIO.parse(\"seqs.fasta\", \"fasta\"))           # FASTA\nrecords = list(SeqIO.parse(\"reads.fastq\", \"fastq\"))          # FASTQ\n\n# VCF (no cyvcf2 needed)\nvcf_lines = [l for l in open(\"vars.vcf\") if not l.startswith(\"##\")]\ndf = pd.read_csv(io.StringIO(\"\".join(vcf_lines)), sep=\"\\t\")\n\ndf = pd.read_csv(\"genes.gff3\", sep=\"\\t\", comment=\"#\",        # GFF\u002FGTF\n     names=[\"seqid\",\"source\",\"type\",\"start\",\"end\",\"score\",\"strand\",\"phase\",\"attrs\"])\ndf = pd.read_csv(\"regions.bed\", sep=\"\\t\", header=None,       # BED\n     names=[\"chrom\",\"start\",\"end\",\"name\",\"score\",\"strand\"])\n\nimport pysam                                                  # BAM (requires pysam)\nbam = pysam.AlignmentFile(\"aligned.bam\", \"rb\")\nfor read in bam.fetch(\"chr1\", 1000, 2000): print(read.query_name)\n```\n\n### Structural\n```python\nfrom Bio.PDB import PDBParser, MMCIFParser\nparser = PDBParser(QUIET=True)\nstructure = parser.get_structure(\"prot\", \"structure.pdb\")     # PDB\n\nparser = MMCIFParser(QUIET=True)\nstructure = parser.get_structure(\"prot\", \"structure.cif\")     # mmCIF\n\nfrom rdkit import Chem                                        # SDF\u002FMOL (requires rdkit)\nsupplier = Chem.SDMolSupplier(\"compounds.sdf\")\nmols = [m for m in supplier if m is not None]\n```\n\n### Omics Matrices\n```python\nimport anndata\nadata = anndata.read_h5ad(\"expression.h5ad\")                 # AnnData (scRNA-seq, spatial)\n\nimport scipy.io\nmat = scipy.io.mmread(\"matrix.mtx\")                          # 10X Genomics MTX\nbarcodes = pd.read_csv(\"barcodes.tsv\", header=None)[0].tolist()\nfeatures = pd.read_csv(\"features.tsv\", sep=\"\\t\", header=None)[1].tolist()\n\ndf = pd.read_csv(\"expression.gct\", sep=\"\\t\", skiprows=2)     # GCT (gene expression)\n\nimport loompy                                                 # Loom (legacy single-cell)\nds = loompy.connect(\"data.loom\")\n```\n\n### Mass Spectrometry & Flow Cytometry\n```python\nfrom pyteomics import mzml                                    # mzML (proteomics, requires pyteomics)\nspectra = list(mzml.read(\"spectra.mzML\"))\n\nimport fcsparser                                              # FCS (flow cytometry, requires fcsparser)\nmeta, data = fcsparser.parse(\"sample.fcs\", reformat_meta=True)\n```\n\n### Neuroimaging\n```python\nimport nibabel as nib                                         # NIfTI (requires nibabel)\nimg = nib.load(\"brain.nii.gz\")\ndata = img.get_fdata()  # 3D\u002F4D numpy array\n\n# DICOM (requires pydicom)\nimport pydicom\ndcm = pydicom.dcmread(\"scan.dcm\")\npixel_data = dcm.pixel_array\n```\n\n### Phylogenetics & Systems Biology\n```python\nfrom Bio import Phylo                                         # Newick\u002FNexus (BioPython)\ntree = Phylo.read(\"tree.nwk\", \"newick\")\ntree = Phylo.read(\"tree.nex\", \"nexus\")\n\nimport libsbml                                                # SBML (systems biology, requires python-libsbml)\nreader = libsbml.SBMLReader()\ndoc = reader.readSBML(\"model.xml\")\nmodel = doc.getModel()\n```\n\n### Serialized\n```python\nimport json, xml.etree.ElementTree as ET, h5py\n\ndata = json.load(open(\"data.json\"))                           # JSON\ndf = pd.read_json(\"records.json\")                             # JSON -> DataFrame\ntree = ET.parse(\"data.xml\"); root = tree.getroot()            # XML\nf = h5py.File(\"data.h5\", \"r\"); dataset = f[\"group\u002Fdata\"][:]   # HDF5\n```\n\n### Compressed\n```python\ndf = pd.read_csv(\"data.csv.gz\")                              # gzip (pandas auto-detects)\ndf = pd.read_csv(\"data.tsv.gz\", sep=\"\\t\")                    # gzip TSV\n\nimport zipfile\nwith zipfile.ZipFile(io.BytesIO(content)) as z:               # ZIP\n    df = pd.read_csv(z.open(z.namelist()[0]))\n\nimport tarfile\nwith tarfile.open(\"archive.tar.gz\") as t:                     # tar.gz\n    f = t.extractfile(t.getnames()[0])\n    df = pd.read_csv(f)\n```\n\n---\n\n## Section B: API Patterns by Domain\n\nEach category shows: which ToolUniverse tools exist, and how to go beyond them with direct API calls.\n\n### 1. NCBI E-utilities (Gene, Nucleotide, Protein, SRA, GEO)\nTools: `NCBI_search_gene`, `NCBI_search_nucleotide`, `SRA_search_runs`, `GEO_search_datasets`\n```python\nimport requests\nbase = \"https:\u002F\u002Feutils.ncbi.nlm.nih.gov\u002Fentrez\u002Feutils\"\n# Search -> get IDs -> fetch records in batches\nids = requests.get(f\"{base}\u002Fesearch.fcgi?db=gene&term=BRCA1+AND+human&retmax=500&retmode=json\").json()\nid_list = ids[\"esearchresult\"][\"idlist\"]\n# Fetch in batches of 500\nfor i in range(0, len(id_list), 500):\n    batch = \",\".join(id_list[i:i+500])\n    data = requests.get(f\"{base}\u002Fefetch.fcgi?db=gene&id={batch}&retmode=xml\").text\n```\n\n### 2. EBI APIs (UniProt, PDBe, ChEMBL, Ensembl, InterPro)\nTools: `UniProt_search`, `PDBe_*`, `ChEMBL_*`, `Ensembl_*`, `InterPro_*`\n```python\n# UniProt bulk TSV download with cursor pagination\nurl = \"https:\u002F\u002Frest.uniprot.org\u002Funiprotkb\u002Fsearch?query=organism_id:9606+AND+keyword:kinase&format=tsv&size=500\"\nall_rows = []\nwhile url:\n    resp = requests.get(url)\n    all_rows.append(resp.text)\n    url = resp.headers.get(\"Link\", \"\").split(\";\")[0].strip(\"\u003C>\") if \"Link\" in resp.headers else None\n```\n\n### 3. NCI GDC (TCGA\u002FTARGET Cancer Data)\nTools: `GDC_search_cases`, `GDC_list_files`, `GDC_get_clinical_data`\n```python\n# Bulk clinical data with filters\nfilters = {\"op\":\"and\",\"content\":[\n    {\"op\":\"=\",\"content\":{\"field\":\"project.project_id\",\"value\":\"TCGA-BRCA\"}},\n    {\"op\":\"=\",\"content\":{\"field\":\"demographic.vital_status\",\"value\":\"Dead\"}}\n]}\ncases = requests.post(\"https:\u002F\u002Fapi.gdc.cancer.gov\u002Fcases\", json={\n    \"filters\": filters, \"fields\": \"demographic.vital_status,diagnoses.days_to_death\",\n    \"size\": 1000, \"from\": 0\n}).json()[\"data\"][\"hits\"]\n```\n\n### 4. CDC Health Surveys (NHANES, BRFSS, WONDER)\nTools: `NHANES_download_and_parse`, `cdc_data_search_datasets`\n```python\n# Direct NHANES XPT download (any cycle, any component)\ncycle, component = \"2017-2018\", \"DEMO_J\"\nurl = f\"https:\u002F\u002Fwwwn.cdc.gov\u002FNchs\u002FData\u002FNhanes\u002FPublic\u002F2017\u002FDataFiles\u002F{component}.XPT\"\ndf = pd.read_sas(io.BytesIO(requests.get(url).content), format=\"xport\")\n```\n\n### 5. GWAS & Genetics (GWAS Catalog, gnomAD, ClinVar)\nTools: `gwas_search_associations`, `gnomAD_*`, `ClinVar_*`\n```python\n# GWAS Catalog full download (37MB TSV, all associations)\nurl = \"https:\u002F\u002Fwww.ebi.ac.uk\u002Fgwas\u002Fapi\u002Fsearch\u002Fdownloads\u002Falternative\"\ndf = pd.read_csv(url, sep=\"\\t\")\n# Filter locally\nhits = df[df[\"DISEASE\u002FTRAIT\"].str.contains(\"diabetes\", case=False, na=False)]\n```\n\n### 6. Chemical (PubChem, ChEMBL, KEGG)\nTools: `PubChem_*`, `ChEMBL_*`, `KEGG_*`\n```python\n# PubChem batch property retrieval (up to 100 CIDs at once)\ncids = \"2244,5988,3672\"  # aspirin, sucrose, ibuprofen\nurl = f\"https:\u002F\u002Fpubchem.ncbi.nlm.nih.gov\u002Frest\u002Fpug\u002Fcompound\u002Fcid\u002F{cids}\u002Fproperty\u002FMolecularWeight,XLogP,TPSA\u002FJSON\"\nprops = requests.get(url).json()[\"PropertyTable\"][\"Properties\"]\n```\n\n### 7. Expression (GEO, ArrayExpress, GTEx)\nTools: `GEO_search_datasets`, `ArrayExpress_search`\n```python\n# GEO series matrix direct download\ngeo_id = \"GSE12345\"\nurl = f\"https:\u002F\u002Fftp.ncbi.nlm.nih.gov\u002Fgeo\u002Fseries\u002F{geo_id[:5]}nnn\u002F{geo_id}\u002Fmatrix\u002F{geo_id}_series_matrix.txt.gz\"\ndf = pd.read_csv(url, sep=\"\\t\", comment=\"!\", index_col=0)\n\n# GTEx bulk expression (median TPM per tissue)\nurl = \"https:\u002F\u002Fstorage.googleapis.com\u002Fadult-gtex\u002Fbulk-gex\u002Fv8\u002Frna-seq\u002FGTEx_Analysis_2017-06-05_v8_RNASeQCv1.1.9_gene_median_tpm.gct.gz\"\ndf = pd.read_csv(url, sep=\"\\t\", skiprows=2)\n```\n\n### 8. Clinical (ClinicalTrials.gov, FDA\u002FOpenFDA, FAERS)\nTools: `search_clinical_trials`, `OpenFDA_*`\n```python\n# ClinicalTrials.gov v2 API with pagination\nall_studies = []\ntoken = None\nwhile True:\n    params = {\"query.cond\": \"lung cancer\", \"query.intr\": \"immunotherapy\", \"pageSize\": 100}\n    if token: params[\"pageToken\"] = token\n    resp = requests.get(\"https:\u002F\u002Fclinicaltrials.gov\u002Fapi\u002Fv2\u002Fstudies\", params=params).json()\n    all_studies.extend(resp.get(\"studies\", []))\n    token = resp.get(\"nextPageToken\")\n    if not token: break\n```\n\n### 9. Literature (PubMed, PMC, EuropePMC)\nTools: `PubMed_search_articles`, `EuropePMC_search_articles`\n```python\n# EuropePMC full-text search with cursor\ncursor = \"*\"\nall_results = []\nwhile cursor:\n    resp = requests.get(\"https:\u002F\u002Fwww.ebi.ac.uk\u002Feuropepmc\u002Fwebservices\u002Frest\u002Fsearch\",\n        params={\"query\": \"BRCA1 AND resistance\", \"format\": \"json\", \"pageSize\": 100, \"cursorMark\": cursor}).json()\n    all_results.extend(resp.get(\"resultList\", {}).get(\"result\", []))\n    cursor = resp.get(\"nextCursorMark\") if len(all_results) \u003C resp.get(\"hitCount\", 0) else None\n```\n\n### 10. Data Repositories (Zenodo, Figshare, Dryad, DataCite)\nTools: `DataCite_search_dois`, `Zenodo_search_records`, `Dryad_search_datasets`\n```python\n# Zenodo: search + download files\nrecord = requests.get(\"https:\u002F\u002Fzenodo.org\u002Fapi\u002Frecords\", params={\"q\": \"proteomics cancer\", \"size\": 5}).json()[\"hits\"][\"hits\"][0]\nfor f in record[\"files\"]:\n    content = requests.get(f[\"links\"][\"self\"]).content  # download each file\n```\n\n### 11-24. Specialized Domains\n\nFor these 14 additional domains, read [references\u002Fspecialized-domains.md](references\u002Fspecialized-domains.md) when you need the specific API pattern:\n\n| # | Domain | Key APIs\u002FTools | When to Read |\n|---|--------|---------------|--------------|\n| 11 | Proteomics | PRIDE, MassIVE, ProteomeXchange | Mass spec data download |\n| 12 | Metabolomics | MetaboLights, Metabolomics Workbench, HMDB | Metabolite\u002Fspectra data |\n| 13 | Microbiome | MGnify, GMREPO | Metagenome profiles |\n| 14 | Ecology | GBIF, iNaturalist, OBIS | Species occurrence data |\n| 15 | Model Organisms | FlyBase, WormBase, ZFIN, RGD | Gene data for non-human species |\n| 16 | Pathways & Networks | Reactome, STRING, BioGRID | Network\u002Fpathway export |\n| 17 | Ontologies | OLS, GO, HPO | Term hierarchy traversal |\n| 18 | Immunology | IEDB, VDJdb, ImmPort | Epitope\u002Freceptor data |\n| 19 | Drug & Pharma | PharmGKB, DGIdb, SIDER | Drug-gene interactions |\n| 20 | Imaging & Atlases | TCIA, HPA, Allen Brain Atlas | Imaging collections |\n| 21 | Protein Structure | RCSB PDB, AlphaFold | PDB\u002FCIF file download |\n| 22 | Clinical Genomics | ClinVar, ClinGen, CIViC | Variant interpretation bulk |\n| 23 | Single-Cell | cellxgene, ARCHS4 | scRNA-seq data portals |\n| 24 | Toxicology | CTD, EPA CompTox | Chemical-gene-disease |\n\n---\n\n## Section C: Restricted\u002FUncovered Data Sources\n\nThese sources require registration or have no ToolUniverse tool. For each, the table shows access requirements and how to get data programmatically once credentialed.\n\n**Note**: ToolUniverse has 2300+ tools — use `find_tools(\"your topic\")` to discover tools not listed above. Section B covers the most common API *patterns*; many more databases use the same patterns (e.g., all EBI databases follow the EBI REST pattern in #2).\n\n| Source | Access | Wait Time | Format | Contents |\n|--------|--------|-----------|--------|----------|\n| **UK Biobank** | Restricted (institutional) | 2-6 months | CSV\u002FBulk | 500K participants, genetics + imaging + health records |\n| **dbGaP** | Controlled (PI application) | 1-3 months | SRA\u002FVCF\u002Fphenotype | GWAS genotypes + phenotypes from thousands of studies |\n| **MIMIC-IV** | Credentialed (PhysioNet) | 1-2 weeks | CSV\u002FParquet | ICU clinical data, 300K+ admissions |\n| **ICPSR** | Registration | 1-3 days | Stata\u002FCSV | Social\u002Fhealth science archives (10K+ studies) |\n| **HRS** | Registration | 1-3 days | Stata | Health & Retirement Study, 20K+ older Americans, biennial |\n| **ELSA** | Registration | 1-3 days | Stata\u002FSPSS | English Longitudinal Study of Ageing |\n| **SHARE** | Registration | 1-2 weeks | Stata | Survey of Health, Ageing, Retirement in Europe (28 countries) |\n| **Materials Project** | Free API key | Instant | JSON | 150K+ computed materials properties |\n| **Human Cell Atlas** | Open | Instant | h5ad\u002Floom | Single-cell atlas across human tissues |\n| **ADNI** | Application | 1-2 months | DICOM\u002FCSV | Alzheimer's neuroimaging + biomarkers + cognition |\n| **OpenNeuro** | Open | Instant | NIfTI\u002FBIDS | 800+ neuroimaging datasets |\n| **CIBERSORTx** | Free registration | Instant | GCT\u002FTSV | Cell type deconvolution from bulk expression |\n| **FlowRepository** | Open | Instant | FCS | Flow cytometry experiments |\n| **SynBioHub** | Open | Instant | SBOL\u002FGenBank | Synthetic biology parts and designs |\n\nFor restricted sources: search literature (PubMed) for published analyses using that dataset. Papers cite their data source and often deposit derived data in public repositories (GEO, SRA, Zenodo).\n\n---\n\n## Section D: Universal Patterns\n\n### Pagination\n```python\n# Pattern 1: offset + limit (most REST APIs)\nall_records = []\noffset = 0\nwhile True:\n    resp = requests.get(f\"{api_url}?offset={offset}&limit=500\", timeout=30).json()\n    batch = resp.get(\"data\", resp.get(\"results\", resp.get(\"hits\", [])))\n    if not batch: break\n    all_records.extend(batch)\n    offset += len(batch)\n\n# Pattern 2: cursor\u002Ftoken (EuropePMC, ClinicalTrials.gov, UniProt)\ntoken = None\nwhile True:\n    params = {\"pageSize\": 100}\n    if token: params[\"pageToken\"] = token\n    resp = requests.get(api_url, params=params).json()\n    all_records.extend(resp[\"results\"])\n    token = resp.get(\"nextPageToken\")\n    if not token: break\n```\n\n### Rate Limiting & Retries\n```python\nimport time\ndef fetch_with_retry(url, max_retries=3, **kwargs):\n    for attempt in range(max_retries):\n        resp = requests.get(url, timeout=30, **kwargs)\n        if resp.status_code == 200: return resp\n        if resp.status_code == 429:  # rate limited\n            wait = int(resp.headers.get(\"Retry-After\", 2 ** attempt))\n            time.sleep(wait)\n        else:\n            time.sleep(2 ** attempt)\n    raise RuntimeError(f\"Failed after {max_retries} retries: {url}\")\n```\n\n### Authentication\n```python\nimport os\n# API key in header (most common)\nheaders = {\"Authorization\": f\"Bearer {os.environ.get('API_KEY', '')}\"}\n# API key as query param\nparams = {\"api_key\": os.environ.get(\"API_KEY\", \"\")}\n# No auth needed for most scientific APIs (NCBI, EBI, PubChem, GDC, CDC)\n```\n\n### Bulk Download with Streaming\n```python\ndef download_large_file(url, output_path):\n    with requests.get(url, stream=True, timeout=300) as r:\n        r.raise_for_status()\n        with open(output_path, \"wb\") as f:\n            for chunk in r.iter_content(chunk_size=8192):\n                f.write(chunk)\n```\n\n### Error Handling\n```python\nresp = requests.get(url, timeout=30)\nif resp.status_code != 200:\n    raise ValueError(f\"HTTP {resp.status_code}: {resp.text[:200]}\")\n# Guard against HTML error pages (CDC, NCBI return 200 with HTML for missing files)\nif resp.content[:5] in (b\"\u003C!DOC\", b\"\u003Chtml\"):\n    raise ValueError(f\"Server returned HTML error page for {url}\")\ndata = resp.json()  # raises JSONDecodeError if not valid JSON\n```\n","# Data Wrangling: Universal Access Patterns\n\nReference for downloading and parsing scientific data from any source. Write and run Python code via Bash for every step.\n\n## When to Use\n\n- ToolUniverse tool returned metadata\u002Fsearch results but you need **raw or bulk data**\n- Data is in a format tools don't parse (VCF, h5ad, BAM, SDF, GCT)\n- You need a **multi-step API workflow** (search -> filter -> download -> parse)\n- The data source has **no ToolUniverse tool** at all\n- You need **thousands of records**, not the 10-100 a tool returns\n\n## Decision: Tool vs Code\n\n| Situation | Use |\n|-----------|-----|\n| Single record lookup, simple search, \u003C100 results | ToolUniverse tool (`execute_tool`) |\n| Bulk download, custom filtering, format conversion | Write Python code |\n| Tool exists but returns truncated results | Write code using the same API the tool wraps |\n| No tool exists for this source | Write code directly |\n\n---\n\n## Section A: Format Cookbook\n\n### Tabular\n```python\nimport pandas as pd, io\n\ndf = pd.read_csv(\"data.csv\")                                # CSV\ndf = pd.read_csv(\"data.tsv\", sep=\"\\t\")                      # TSV\ndf = pd.read_sas(io.BytesIO(content), format=\"xport\")       # SAS Transport (XPT) — NHANES, CDC\ndf = pd.read_sas(\"data.sas7bdat\", format=\"sas7bdat\")        # SAS native\ndf = pd.read_stata(\"data.dta\")                               # Stata — ICPSR, HRS\ndf = pd.read_parquet(\"data.parquet\")                         # Parquet — MIMIC-IV\ndf = pd.read_excel(\"data.xlsx\")                              # Excel\ndf = pd.read_spss(\"data.sav\")                                # SPSS\ndf = pd.read_fwf(\"data.dat\")                                 # Fixed-width — legacy surveys\n```\n\n### Genomics\n```python\nfrom Bio import SeqIO\nrecords = list(SeqIO.parse(\"seqs.fasta\", \"fasta\"))           # FASTA\nrecords = list(SeqIO.parse(\"reads.fastq\", \"fastq\"))          # FASTQ\n\n# VCF (no cyvcf2 needed)\nvcf_lines = [l for l in open(\"vars.vcf\") if not l.startswith(\"##\")]\ndf = pd.read_csv(io.StringIO(\"\".join(vcf_lines)), sep=\"\\t\")\n\ndf = pd.read_csv(\"genes.gff3\", sep=\"\\t\", comment=\"#\",        # GFF\u002FGTF\n     names=[\"seqid\",\"source\",\"type\",\"start\",\"end\",\"score\",\"strand\",\"phase\",\"attrs\"])\ndf = pd.read_csv(\"regions.bed\", sep=\"\\t\", header=None,       # BED\n     names=[\"chrom\",\"start\",\"end\",\"name\",\"score\",\"strand\"])\n\nimport pysam                                                  # BAM (requires pysam)\nbam = pysam.AlignmentFile(\"aligned.bam\", \"rb\")\nfor read in bam.fetch(\"chr1\", 1000, 2000): print(read.query_name)\n```\n\n### Structural\n```python\nfrom Bio.PDB import PDBParser, MMCIFParser\nparser = PDBParser(QUIET=True)\nstructure = parser.get_structure(\"prot\", \"structure.pdb\")     # PDB\n\nparser = MMCIFParser(QUIET=True)\nstructure = parser.get_structure(\"prot\", \"structure.cif\")     # mmCIF\n\nfrom rdkit import Chem                                        # SDF\u002FMOL (requires rdkit)\nsupplier = Chem.SDMolSupplier(\"compounds.sdf\")\nmols = [m for m in supplier if m is not None]\n```\n\n### Omics Matrices\n```python\nimport anndata\nadata = anndata.read_h5ad(\"expression.h5ad\")                 # AnnData (scRNA-seq, spatial)\n\nimport scipy.io\nmat = scipy.io.mmread(\"matrix.mtx\")                          # 10X Genomics MTX\nbarcodes = pd.read_csv(\"barcodes.tsv\", header=None)[0].tolist()\nfeatures = pd.read_csv(\"features.tsv\", sep=\"\\t\", header=None)[1].tolist()\n\ndf = pd.read_csv(\"expression.gct\", sep=\"\\t\", skiprows=2)     # GCT (gene expression)\n\nimport loompy                                                 # Loom (legacy single-cell)\nds = loompy.connect(\"data.loom\")\n```\n\n### Mass Spectrometry & Flow Cytometry\n```python\nfrom pyteomics import mzml                                    # mzML (proteomics, requires pyteomics)\nspectra = list(mzml.read(\"spectra.mzML\"))\n\nimport fcsparser                                              # FCS (flow cytometry, requires fcsparser)\nmeta, data = fcsparser.parse(\"sample.fcs\", reformat_meta=True)\n```\n\n### Neuroimaging\n```python\nimport nibabel as nib                                         # NIfTI (requires nibabel)\nimg = nib.load(\"brain.nii.gz\")\ndata = img.get_fdata()  # 3D\u002F4D numpy array\n\n# DICOM (requires pydicom)\nimport pydicom\ndcm = pydicom.dcmread(\"scan.dcm\")\npixel_data = dcm.pixel_array\n```\n\n### Phylogenetics & Systems Biology\n```python\nfrom Bio import Phylo                                         # Newick\u002FNexus (BioPython)\ntree = Phylo.read(\"tree.nwk\", \"newick\")\ntree = Phylo.read(\"tree.nex\", \"nexus\")\n\nimport libsbml                                                # SBML (systems biology, requires python-libsbml)\nreader = libsbml.SBMLReader()\ndoc = reader.readSBML(\"model.xml\")\nmodel = doc.getModel()\n```\n\n### Serialized\n```python\nimport json, xml.etree.ElementTree as ET, h5py\n\ndata = json.load(open(\"data.json\"))                           # JSON\ndf = pd.read_json(\"records.json\")                             # JSON -> DataFrame\ntree = ET.parse(\"data.xml\"); root = tree.getroot()            # XML\nf = h5py.File(\"data.h5\", \"r\"); dataset = f[\"group\u002Fdata\"][:]   # HDF5\n```\n\n### Compressed\n```python\ndf = pd.read_csv(\"data.csv.gz\")                              # gzip (pandas auto-detects)\ndf = pd.read_csv(\"data.tsv.gz\", sep=\"\\t\")                    # gzip TSV\n\nimport zipfile\nwith zipfile.ZipFile(io.BytesIO(content)) as z:               # ZIP\n    df = pd.read_csv(z.open(z.namelist()[0]))\n\nimport tarfile\nwith tarfile.open(\"archive.tar.gz\") as t:                     # tar.gz\n    f = t.extractfile(t.getnames()[0])\n    df = pd.read_csv(f)\n```\n\n---\n\n## Section B: API Patterns by Domain\n\nEach category shows: which ToolUniverse tools exist, and how to go beyond them with direct API calls.\n\n### 1. NCBI E-utilities (Gene, Nucleotide, Protein, SRA, GEO)\nTools: `NCBI_search_gene`, `NCBI_search_nucleotide`, `SRA_search_runs`, `GEO_search_datasets`\n```python\nimport requests\nbase = \"https:\u002F\u002Feutils.ncbi.nlm.nih.gov\u002Fentrez\u002Feutils\"\n# Search -> get IDs -> fetch records in batches\nids = requests.get(f\"{base}\u002Fesearch.fcgi?db=gene&term=BRCA1+AND+human&retmax=500&retmode=json\").json()\nid_list = ids[\"esearchresult\"][\"idlist\"]\n# Fetch in batches of 500\nfor i in range(0, len(id_list), 500):\n    batch = \",\".join(id_list[i:i+500])\n    data = requests.get(f\"{base}\u002Fefetch.fcgi?db=gene&id={batch}&retmode=xml\").text\n```\n\n### 2. EBI APIs (UniProt, PDBe, ChEMBL, Ensembl, InterPro)\nTools: `UniProt_search`, `PDBe_*`, `ChEMBL_*`, `Ensembl_*`, `InterPro_*`\n```python\n# UniProt bulk TSV download with cursor pagination\nurl = \"https:\u002F\u002Frest.uniprot.org\u002Funiprotkb\u002Fsearch?query=organism_id:9606+AND+keyword:kinase&format=tsv&size=500\"\nall_rows = []\nwhile url:\n    resp = requests.get(url)\n    all_rows.append(resp.text)\n    url = resp.headers.get(\"Link\", \"\").split(\";\")[0].strip(\"\u003C>\") if \"Link\" in resp.headers else None\n```\n\n### 3. NCI GDC (TCGA\u002FTARGET Cancer Data)\nTools: `GDC_search_cases`, `GDC_list_files`, `GDC_get_clinical_data`\n```python\n# Bulk clinical data with filters\nfilters = {\"op\":\"and\",\"content\":[\n    {\"op\":\"=\",\"content\":{\"field\":\"project.project_id\",\"value\":\"TCGA-BRCA\"}},\n    {\"op\":\"=\",\"content\":{\"field\":\"demographic.vital_status\",\"value\":\"Dead\"}}\n]}\ncases = requests.post(\"https:\u002F\u002Fapi.gdc.cancer.gov\u002Fcases\", json={\n    \"filters\": filters, \"fields\": \"demographic.vital_status,diagnoses.days_to_death\",\n    \"size\": 1000, \"from\": 0\n}).json()[\"data\"][\"hits\"]\n```\n\n### 4. CDC Health Surveys (NHANES, BRFSS, WONDER)\nTools: `NHANES_download_and_parse`, `cdc_data_search_datasets`\n```python\n# Direct NHANES XPT download (any cycle, any component)\ncycle, component = \"2017-2018\", \"DEMO_J\"\nurl = f\"https:\u002F\u002Fwwwn.cdc.gov\u002FNchs\u002FData\u002FNhanes\u002FPublic\u002F2017\u002FDataFiles\u002F{component}.XPT\"\ndf = pd.read_sas(io.BytesIO(requests.get(url).content), format=\"xport\")\n```\n\n### 5. GWAS & Genetics (GWAS Catalog, gnomAD, ClinVar)\nTools: `gwas_search_associations`, `gnomAD_*`, `ClinVar_*`\n```python\n# GWAS Catalog full download (37MB TSV, all associations)\nurl = \"https:\u002F\u002Fwww.ebi.ac.uk\u002Fgwas\u002Fapi\u002Fsearch\u002Fdownloads\u002Falternative\"\ndf = pd.read_csv(url, sep=\"\\t\")\n# Filter locally\nhits = df[df[\"DISEASE\u002FTRAIT\"].str.contains(\"diabetes\", case=False, na=False)]\n```\n\n### 6. Chemical (PubChem, ChEMBL, KEGG)\nTools: `PubChem_*`, `ChEMBL_*`, `KEGG_*`\n```python\n# PubChem batch property retrieval (up to 100 CIDs at once)\ncids = \"2244,5988,3672\"  # aspirin, sucrose, ibuprofen\nurl = f\"https:\u002F\u002Fpubchem.ncbi.nlm.nih.gov\u002Frest\u002Fpug\u002Fcompound\u002Fcid\u002F{cids}\u002Fproperty\u002FMolecularWeight,XLogP,TPSA\u002FJSON\"\nprops = requests.get(url).json()[\"PropertyTable\"][\"Properties\"]\n```\n\n### 7. Expression (GEO, ArrayExpress, GTEx)\nTools: `GEO_search_datasets`, `ArrayExpress_search`\n```python\n# GEO series matrix direct download\ngeo_id = \"GSE12345\"\nurl = f\"https:\u002F\u002Fftp.ncbi.nlm.nih.gov\u002Fgeo\u002Fseries\u002F{geo_id[:5]}nnn\u002F{geo_id}\u002Fmatrix\u002F{geo_id}_series_matrix.txt.gz\"\ndf = pd.read_csv(url, sep=\"\\t\", comment=\"!\", index_col=0)\n\n# GTEx bulk expression (median TPM per tissue)\nurl = \"https:\u002F\u002Fstorage.googleapis.com\u002Fadult-gtex\u002Fbulk-gex\u002Fv8\u002Frna-seq\u002FGTEx_Analysis_2017-06-05_v8_RNASeQCv1.1.9_gene_median_tpm.gct.gz\"\ndf = pd.read_csv(url, sep=\"\\t\", skiprows=2)\n```\n\n### 8. Clinical (ClinicalTrials.gov, FDA\u002FOpenFDA, FAERS)\nTools: `search_clinical_trials`, `OpenFDA_*`\n```python\n# ClinicalTrials.gov v2 API with pagination\nall_studies = []\ntoken = None\nwhile True:\n    params = {\"query.cond\": \"lung cancer\", \"query.intr\": \"immunotherapy\", \"pageSize\": 100}\n    if token: params[\"pageToken\"] = token\n    resp = requests.get(\"https:\u002F\u002Fclinicaltrials.gov\u002Fapi\u002Fv2\u002Fstudies\", params=params).json()\n    all_studies.extend(resp.get(\"studies\", []))\n    token = resp.get(\"nextPageToken\")\n    if not token: break\n```\n\n### 9. Literature (PubMed, PMC, EuropePMC)\nTools: `PubMed_search_articles`, `EuropePMC_search_articles`\n```python\n# EuropePMC full-text search with cursor\ncursor = \"*\"\nall_results = []\nwhile cursor:\n    resp = requests.get(\"https:\u002F\u002Fwww.ebi.ac.uk\u002Feuropepmc\u002Fwebservices\u002Frest\u002Fsearch\",\n        params={\"query\": \"BRCA1 AND resistance\", \"format\": \"json\", \"pageSize\": 100, \"cursorMark\": cursor}).json()\n    all_results.extend(resp.get(\"resultList\", {}).get(\"result\", []))\n    cursor = resp.get(\"nextCursorMark\") if len(all_results) \u003C resp.get(\"hitCount\", 0) else None\n```\n\n### 10. Data Repositories (Zenodo, Figshare, Dryad, DataCite)\nTools: `DataCite_search_dois`, `Zenodo_search_records`, `Dryad_search_datasets`\n```python\n# Zenodo: search + download files\nrecord = requests.get(\"https:\u002F\u002Fzenodo.org\u002Fapi\u002Frecords\", params={\"q\": \"proteomics cancer\", \"size\": 5}).json()[\"hits\"][\"hits\"][0]\nfor f in record[\"files\"]:\n    content = requests.get(f[\"links\"][\"self\"]).content  # download each file\n```\n\n### 11-24. Specialized Domains\n\nFor these 14 additional domains, read [references\u002Fspecialized-domains.md](references\u002Fspecialized-domains.md) when you need the specific API pattern:\n\n| # | Domain | Key APIs\u002FTools | When to Read |\n|---|--------|---------------|--------------|\n| 11 | Proteomics | PRIDE, MassIVE, ProteomeXchange | Mass spec data download |\n| 12 | Metabolomics | MetaboLights, Metabolomics Workbench, HMDB | Metabolite\u002Fspectra data |\n| 13 | Microbiome | MGnify, GMREPO | Metagenome profiles |\n| 14 | Ecology | GBIF, iNaturalist, OBIS | Species occurrence data |\n| 15 | Model Organisms | FlyBase, WormBase, ZFIN, RGD | Gene data for non-human species |\n| 16 | Pathways & Networks | Reactome, STRING, BioGRID | Network\u002Fpathway export |\n| 17 | Ontologies | OLS, GO, HPO | Term hierarchy traversal |\n| 18 | Immunology | IEDB, VDJdb, ImmPort | Epitope\u002Freceptor data |\n| 19 | Drug & Pharma | PharmGKB, DGIdb, SIDER | Drug-gene interactions |\n| 20 | Imaging & Atlases | TCIA, HPA, Allen Brain Atlas | Imaging collections |\n| 21 | Protein Structure | RCSB PDB, AlphaFold | PDB\u002FCIF file download |\n| 22 | Clinical Genomics | ClinVar, ClinGen, CIViC | Variant interpretation bulk |\n| 23 | Single-Cell | cellxgene, ARCHS4 | scRNA-seq data portals |\n| 24 | Toxicology | CTD, EPA CompTox | Chemical-gene-disease |\n\n---\n\n## Section C: Restricted\u002FUncovered Data Sources\n\nThese sources require registration or have no ToolUniverse tool. For each, the table shows access requirements and how to get data programmatically once credentialed.\n\n**Note**: ToolUniverse has 2300+ tools — use `find_tools(\"your topic\")` to discover tools not listed above. Section B covers the most common API *patterns*; many more databases use the same patterns (e.g., all EBI databases follow the EBI REST pattern in #2).\n\n| Source | Access | Wait Time | Format | Contents |\n|--------|--------|-----------|--------|----------|\n| **UK Biobank** | Restricted (institutional) | 2-6 months | CSV\u002FBulk | 500K participants, genetics + imaging + health records |\n| **dbGaP** | Controlled (PI application) | 1-3 months | SRA\u002FVCF\u002Fphenotype | GWAS genotypes + phenotypes from thousands of studies |\n| **MIMIC-IV** | Credentialed (PhysioNet) | 1-2 weeks | CSV\u002FParquet | ICU clinical data, 300K+ admissions |\n| **ICPSR** | Registration | 1-3 days | Stata\u002FCSV | Social\u002Fhealth science archives (10K+ studies) |\n| **HRS** | Registration | 1-3 days | Stata | Health & Retirement Study, 20K+ older Americans, biennial |\n| **ELSA** | Registration | 1-3 days | Stata\u002FSPSS | English Longitudinal Study of Ageing |\n| **SHARE** | Registration | 1-2 weeks | Stata | Survey of Health, Ageing, Retirement in Europe (28 countries) |\n| **Materials Project** | Free API key | Instant | JSON | 150K+ computed materials properties |\n| **Human Cell Atlas** | Open | Instant | h5ad\u002Floom | Single-cell atlas across human tissues |\n| **ADNI** | Application | 1-2 months | DICOM\u002FCSV | Alzheimer's neuroimaging + biomarkers + cognition |\n| **OpenNeuro** | Open | Instant | NIfTI\u002FBIDS | 800+ neuroimaging datasets |\n| **CIBERSORTx** | Free registration | Instant | GCT\u002FTSV | Cell type deconvolution from bulk expression |\n| **FlowRepository** | Open | Instant | FCS | Flow cytometry experiments |\n| **SynBioHub** | Open | Instant | SBOL\u002FGenBank | Synthetic biology parts and designs |\n\nFor restricted sources: search literature (PubMed) for published analyses using that dataset. Papers cite their data source and often deposit derived data in public repositories (GEO, SRA, Zenodo).\n\n---\n\n## Section D: Universal Patterns\n\n### Pagination\n```python\n# Pattern 1: offset + limit (most REST APIs)\nall_records = []\noffset = 0\nwhile True:\n    resp = requests.get(f\"{api_url}?offset={offset}&limit=500\", timeout=30).json()\n    batch = resp.get(\"data\", resp.get(\"results\", resp.get(\"hits\", [])))\n    if not batch: break\n    all_records.extend(batch)\n    offset += len(batch)\n\n# Pattern 2: cursor\u002Ftoken (EuropePMC, ClinicalTrials.gov, UniProt)\ntoken = None\nwhile True:\n    params = {\"pageSize\": 100}\n    if token: params[\"pageToken\"] = token\n    resp = requests.get(api_url, params=params).json()\n    all_records.extend(resp[\"results\"])\n    token = resp.get(\"nextPageToken\")\n    if not token: break\n```\n\n### Rate Limiting & Retries\n```python\nimport time\ndef fetch_with_retry(url, max_retries=3, **kwargs):\n    for attempt in range(max_retries):\n        resp = requests.get(url, timeout=30, **kwargs)\n        if resp.status_code == 200: return resp\n        if resp.status_code == 429:  # rate limited\n            wait = int(resp.headers.get(\"Retry-After\", 2 ** attempt))\n            time.sleep(wait)\n        else:\n            time.sleep(2 ** attempt)\n    raise RuntimeError(f\"Failed after {max_retries} retries: {url}\")\n```\n\n### Authentication\n```python\nimport os\n# API key in header (most common)\nheaders = {\"Authorization\": f\"Bearer {os.environ.get('API_KEY', '')}\"}\n# API key as query param\nparams = {\"api_key\": os.environ.get(\"API_KEY\", \"\")}\n# No auth needed for most scientific APIs (NCBI, EBI, PubChem, GDC, CDC)\n```\n\n### Bulk Download with Streaming\n```python\ndef download_large_file(url, output_path):\n    with requests.get(url, stream=True, timeout=300) as r:\n        r.raise_for_status()\n        with open(output_path, \"wb\") as f:\n            for chunk in r.iter_content(chunk_size=8192):\n                f.write(chunk)\n```\n\n### Error Handling\n```python\nresp = requests.get(url, timeout=30)\nif resp.status_code != 200:\n    raise ValueError(f\"HTTP {resp.status_code}: {resp.text[:200]}\")\n# Guard against HTML error pages (CDC, NCBI return 200 with HTML for missing files)\nif resp.content[:5] in (b\"\u003C!DOC\", b\"\u003Chtml\"):\n    raise ValueError(f\"Server returned HTML error page for {url}\")\ndata = resp.json()  # raises JSONDecodeError if not valid JSON\n```\n",{"name":5,"description":7},"main","a298c929b6cbd662e1fce54302ce520d5ceea1a5",".agents\u002Flibrary\u002Fskills\u002Ftooluniverse-data-wrangling","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain","https:\u002F\u002Fgithub.com\u002FPrekzursil","2026-11-02 14:30:57",{"source":8,"skillName":5,"commands":67,"prompt":77,"zipAvailable":78},[68,71,74],{"tool":69,"command":70},"npx","npx skills add Prekzursil\u002Fagent-skills-toolchain --skill tooluniverse-data-wrangling",{"tool":72,"command":73},"bunx","bunx skills add Prekzursil\u002Fagent-skills-toolchain --skill tooluniverse-data-wrangling",{"tool":75,"command":76},"pnpm","pnpm dlx skills add Prekzursil\u002Fagent-skills-toolchain --skill tooluniverse-data-wrangling","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002F.agents\u002Flibrary\u002Fskills\u002Ftooluniverse-data-wrangling\u002FSKILL.md",true,[80,86,90,94,98,102,106,110],{"path":81,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":84,"sourceHtmlUrl":85},"evals\u002Fevals.json","REFERENCE","参考文档",1434,"https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002F.agents\u002Flibrary\u002Fskills\u002Ftooluniverse-data-wrangling\u002Fevals\u002Fevals.json",{"path":87,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":88,"sourceHtmlUrl":89},"references\u002Farchitecture.md",13122,"https:\u002F\u002Fgithub.com\u002Fxiaoyuge886\u002Fharness_assistance\u002Fblob\u002Frefactor\u002Funified-packaging\u002Fapps\u002Fagent-mesh\u002Fdata\u002Fplugins\u002Fgithub\u002FEveryInc-compound-engineering-plugin\u002Fplugins\u002Fcompound-engineering\u002Fskills\u002Fdhh-rails-style\u002Freferences\u002Farchitecture.md",{"path":91,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":92,"sourceHtmlUrl":93},"references\u002Fcontrollers.md",6395,"https:\u002F\u002Fgithub.com\u002Fxiaoyuge886\u002Fharness_assistance\u002Fblob\u002Frefactor\u002Funified-packaging\u002Fapps\u002Fagent-mesh\u002Fdata\u002Fplugins\u002Fgithub\u002FEveryInc-compound-engineering-plugin\u002Fplugins\u002Fcompound-engineering\u002Fskills\u002Fdhh-rails-style\u002Freferences\u002Fcontrollers.md",{"path":95,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":96,"sourceHtmlUrl":97},"references\u002Ffrontend.md",10691,"https:\u002F\u002Fgithub.com\u002Fxiaoyuge886\u002Fharness_assistance\u002Fblob\u002Frefactor\u002Funified-packaging\u002Fapps\u002Fagent-mesh\u002Fdata\u002Fplugins\u002Fgithub\u002FEveryInc-compound-engineering-plugin\u002Fplugins\u002Fcompound-engineering\u002Fskills\u002Fdhh-rails-style\u002Freferences\u002Ffrontend.md",{"path":99,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":100,"sourceHtmlUrl":101},"references\u002Fgems.md",5696,"https:\u002F\u002Fgithub.com\u002Fxiaoyuge886\u002Fharness_assistance\u002Fblob\u002Frefactor\u002Funified-packaging\u002Fapps\u002Fagent-mesh\u002Fdata\u002Fplugins\u002Fgithub\u002FEveryInc-compound-engineering-plugin\u002Fplugins\u002Fcompound-engineering\u002Fskills\u002Fdhh-rails-style\u002Freferences\u002Fgems.md",{"path":103,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":104,"sourceHtmlUrl":105},"references\u002Fmodels.md",7504,"https:\u002F\u002Fgithub.com\u002Fxiaoyuge886\u002Fharness_assistance\u002Fblob\u002Frefactor\u002Funified-packaging\u002Fapps\u002Fagent-mesh\u002Fdata\u002Fplugins\u002Fgithub\u002FEveryInc-compound-engineering-plugin\u002Fplugins\u002Fcompound-engineering\u002Fskills\u002Fdhh-rails-style\u002Freferences\u002Fmodels.md",{"path":107,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":108,"sourceHtmlUrl":109},"references\u002Fspecialized-domains.md",11054,"https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002F.agents\u002Flibrary\u002Fskills\u002Ftooluniverse-data-wrangling\u002Freferences\u002Fspecialized-domains.md",{"path":111,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":112,"sourceHtmlUrl":113},"references\u002Ftesting.md",7061,"https:\u002F\u002Fgithub.com\u002Fxiaoyuge886\u002Fharness_assistance\u002Fblob\u002Frefactor\u002Funified-packaging\u002Fapps\u002Fagent-mesh\u002Fdata\u002Fplugins\u002Fgithub\u002FEveryInc-compound-engineering-plugin\u002Fplugins\u002Fcompound-engineering\u002Fskills\u002Fdhh-rails-style\u002Freferences\u002Ftesting.md",[115,137,164,191,205,221],{"skillNo":116,"name":117,"nameZh":6,"description":118,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":119,"categories":120,"keywords":121,"publishedAt":55},"01M6DF7D7478R55P46REYH4QAC","clarify-requirements","Resolve genuine pre-execution ambiguity by scanning repo context, generating 1-6 grounded options, and asking 1-3 focused questions via AskUserQuestion. NOT for mid-task use (injection risk); NOT when the goal is already unambiguous; use to disambiguate vague prompts before any file edits.","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Fworkspace-hooks\u002Fskills\u002Fclarify-requirements\u002FSKILL.md",[],[122,123,124,125,126,127,128,129,130,131,132,133,134,135,136],"clarify requirements","clarify","requirements","risk","options","task","prompts","goal","scanning","use","context","repo","injection","execution","file",{"skillNo":138,"name":139,"nameZh":6,"description":140,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":141,"categories":142,"keywords":146,"publishedAt":55},"01M6DF79CA4BHJS66J8EZDBPWJ","openmm-md","Run FREE, open-source, Windows-native GPU molecular dynamics via the openmm-md MCP (OpenMM + CUDA on the local NVIDIA GPU). Use for protein \u002F protein-ligand MD when you want a free stack or are on Windows without a Schrodinger license. Covers the full workflow (prepare, solvate, minimize, equilibrate, production, analyze, mmgbsa) AND an honest decision guide vs Schrodinger Desmond, including how to run Desmond legitimately on Linux or a cloud GPU with a real license. This is a deliberately LESSER free alternative and does NOT replace the schrodinger MCP tools. Do NOT use it to pick a free tool when a validated FEP+, WaterMap, IFD-MD, or Prime MM-GBSA result is actually required.","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Fmcp\u002Fopenmm-md-mcp\u002Fskill\u002Fopenmm-md\u002FSKILL.md",[143],{"categoryNo":144,"categoryName":145,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[147,49,148,149,150,151,152,153,154,155,156,157,46,158,131,159,160,161,162,163],"openmm md","decision","pick","linux","analyze","tool","stack","open","NVIDIA","gpu","license","windows","free","molecular dynamics","local","do","MCP",{"skillNo":165,"name":166,"nameZh":6,"description":167,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":168,"categories":169,"keywords":176,"publishedAt":55},"01M6DF76C1MG85VEWP8VZCBNMN","visual-review","Take screenshots of web pages and UI using Playwright for visual review and iteration","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Feditor\u002Fmetaswarm\u002Fskills\u002Fvisual-review\u002FSKILL.md",[170,173],{"categoryNo":171,"categoryName":172,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000003","演示文稿",{"categoryNo":174,"categoryName":175,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",[177,178,179,180,181,182,183,184,185,186,49,187,188,189,190],"review","visual","visual review","pages","web","false","iteration","take","check","slides","ui","screenshot","playwright","screenshots",{"skillNo":192,"name":193,"nameZh":6,"description":194,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":195,"categories":196,"keywords":197,"publishedAt":55},"01M6DF73AQVCBZKEN0YXEX9FXP","status","Diagnostic status report — shows metaswarm installation state, project setup, and potential issues","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Feditor\u002Fmetaswarm\u002Fskills\u002Fstatus\u002FSKILL.md",[],[193,198,199,200,201,202,203,204],"setup","report","project","installation","project setup","issues","state",{"skillNo":206,"name":207,"nameZh":6,"description":208,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":209,"categories":210,"keywords":212,"publishedAt":55},"01M6DF6X6C2XB0P6GX76P7TTYV","start","Use when starting work on any task, when the user mentions metaswarm, or when the user wants to begin tracked development work","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Feditor\u002Fmetaswarm\u002Fskills\u002Fstart\u002FSKILL.md",[211],{"categoryNo":144,"categoryName":145,"taxonomyType":21,"taxonomyTypeDesc":22},[207,213,127,214,215,216,131,217,218,219,220],"start issue","issue","ready","work on issue","user","work","work on","development",{"skillNo":222,"name":198,"nameZh":6,"description":223,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":224,"categories":225,"keywords":226,"publishedAt":55},"01M6DF6QMJ9AJKFKHHKRT005PQ","Interactive project setup — detects your project, configures metaswarm, writes project-local files","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Feditor\u002Fmetaswarm\u002Fskills\u002Fsetup\u002FSKILL.md",[],[198,200,161,227,202,228],"files","interactive"]