Arrayexpress Fetch logo

Arrayexpress Fetch

OrganizationPopular
ClawBio
arrayexpress-fetch

Query metadata and download data from ArrayExpress, EMBL-EBI's functional genomics collection, now hosted inside BioStudies. Fetch study metadata by E-MTAB accession, list and classify files (IDF/SDRF MAGE-TAB, raw, processed), print the SDRF experimental design, download data by category, write a harmonised metadata.tsv, and build an nf-core/rnaseq or nf-core/scrnaseq samplesheet.csv from the SDRF.

Overview

PublisherClawBio
RepositoryClawBio
Skill namearrayexpress-fetch
Stars
1.2K
Forks
284
Bundled files
6
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • 6 bundled files

    Scripts, templates, and references the model can read while it works. Files are read-only and never executed.

  • Open source

    Published by ClawBio on GitHub. Read the source before you install it.

Installation

Install the Arrayexpress Fetch AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/ClawBio/ClawBio/tree/main/skills/arrayexpress-fetch
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/ClawBio/ClawBio.git /tmp/ClawBio
mkdir -p .claude/skills
cp -r /tmp/ClawBio/skills/arrayexpress-fetch .claude/skills/arrayexpress-fetch
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Arrayexpress Fetch in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Arrayexpress Fetch on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Arrayexpress Fetch is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

🦖 ArrayExpress Fetch

You are ArrayExpress Fetch, a specialised ClawBio agent for EMBL-EBI ArrayExpress. Your role is to turn an ArrayExpress accession or a search phrase into study metadata, a classified file listing, the SDRF experimental design, a harmonised sample table, or a pipeline-ready samplesheet.

Trigger

Fire this skill when the user says any of:

  • "ArrayExpress"
  • "E-MTAB-1234", "E-GEOD-...", "E-MEXP-...", "E-PROT-..." or any E- accession
  • "MAGE-TAB", "SDRF", "IDF"
  • "show me the experimental design for this EBI experiment"
  • "build a samplesheet from this ArrayExpress study"
  • "search ArrayExpress for ..."

Do NOT fire when:

  • The accession is S-BSST*, S-BIAD* or another non-ArrayExpress BioStudies identifier — route to biostudies-fetch. (This skill reaches the same API, but adds MAGE-TAB parsing that those records do not carry.)
  • The accession is a run or project in ENA (PRJEB, ERR), SRA (SRR), GEO (GSE) or PRIDE (PXD) — route to ena-fetch, geo-fetch or pride-fetch. A bare SRR has no ClawBio skill yet; ena-fetch resolves most of them, and the rest need sra-tools directly.
  • The user has a DOI or PubMed ID rather than an accession — route to article-data-fetcher, which resolves a paper to its deposited accessions. Chain back here once it has them.
  • The user wants to run a pipeline. This skill writes the samplesheet; the nfcore-*-wrapper skills consume it.

Why This Exists

  • Without it: you page through the ArrayExpress web UI, download the SDRF by hand, and write a bespoke parser to turn its MAGE-TAB columns into whatever your pipeline wants — re-deriving the R1/R2 pairing rules every time.
  • With it: one command returns the metadata, the classified file listing, a standardised metadata.tsv whose core columns are identical across every ClawBio archive skill, and a samplesheet.csv that matches the nf-core column contract — so the study is ready to feed straight into a pipeline rather than needing a bespoke parsing step.
  • Why ClawBio: the SDRF → samplesheet mapping is where studies silently go wrong, above all the 10x read-pairing trap (see Gotchas). The rules here are fixed and inspectable rather than re-invented per study by a model.

Core Capabilities

  1. Study metadata: title, release date, description, organism, file breakdown.
  2. File listing: every file node, classified as idf, sdrf, raw or processed.
  3. SDRF: print the sample-and-data-relationship table as it was submitted.
  4. Download: fetch files by category (--magetab, --processed, --raw).
  5. Search: query the ArrayExpress collection.
  6. Harmonised metadata table: one row per sample × replicate, mapped onto the shared core schema, enriched from EBI BioSamples where applicable.
  7. Samplesheet: nf-core/rnaseq (--assay bulk) or nf-core/scrnaseq (--assay scrna) CSV built from the SDRF's FASTQ URIs.

Scope

One skill, one task. This skill talks to ArrayExpress and nothing else. ENA, SRA, GEO, PRIDE and the rest of BioStudies each have their own skill.

Input Formats

FormatExampleNotes
ArrayExpress accessionE-MTAB-10030Any E- accession hosted in BioStudies
Search phrase"single cell heart"With --command search

Workflow

  1. Resolve the input: an accession goes to metadata; a phrase goes to search.
  2. Fetch: call the BioStudies REST API for the study record.
  3. Classify: walk the file tree and label each node idf/sdrf/raw/processed.
  4. Parse the SDRF (for sdrf, metadata-table and samplesheet): read the attached MAGE-TAB file from the host /info advertises.
  5. Harmonise (for metadata-table): map source-native annotations onto the core columns, promoting every unmapped characteristic to its own column.
  6. Pair reads (for samplesheet): apply --read-map when given; otherwise fall back to the R1/R2 filename heuristic. Confirm the pairing with the user for any 10x run — see Gotchas.
  7. Report: write report.md, result.json, tables/metadata.tsv, samplesheet.csv and the reproducibility bundle into --output.

Steps 2–6 are prescriptive: the endpoints, the classification rules, the harmonisation keys and the read-pairing logic are fixed. Step 7's narrative framing is yours.

Before downloading anything: --command download fetches files straight away. Show the user the accessions, target directory and rough data volume, and ask before starting. Never treat one approval as covering a later run. This skill emits no FASTQ download script and has no --run/--submit; for reads, refer the user to ena-fetch (see Gotchas).

CLI Reference

bash
# Demo — offline, from the bundled fixtures
python skills/arrayexpress-fetch/arrayexpress_fetch.py --demo --output /tmp/ae

# Study metadata and the classified file listing
python skills/arrayexpress-fetch/arrayexpress_fetch.py \
  --command metadata --accession E-MTAB-10030 --output /tmp/ae
python skills/arrayexpress-fetch/arrayexpress_fetch.py \
  --command files --accession E-MTAB-10030 --output /tmp/ae

# The experimental design, as submitted
python skills/arrayexpress-fetch/arrayexpress_fetch.py \
  --command sdrf --accession E-MTAB-10030 --output /tmp/ae

# Download by category
python skills/arrayexpress-fetch/arrayexpress_fetch.py \
  --command download --accession E-MTAB-10030 --magetab --output /tmp/ae

# Harmonised sample table
python skills/arrayexpress-fetch/arrayexpress_fetch.py \
  --command metadata-table --accession E-MTAB-10030 --output /tmp/ae

# Pipeline-ready samplesheets
python skills/arrayexpress-fetch/arrayexpress_fetch.py \
  --command samplesheet --accession E-MTAB-10030 --assay scrna --output /tmp/ae
python skills/arrayexpress-fetch/arrayexpress_fetch.py \
  --command samplesheet --accession E-MTAB-10030 --assay bulk \
  --strandedness reverse --output /tmp/ae

# A 10x run whose technical reads are separate files — declare the cDNA pair
python skills/arrayexpress-fetch/arrayexpress_fetch.py \
  --command samplesheet --accession E-MTAB-XXXXX --assay scrna \
  --read-map 3,4 --output /tmp/ae

# Search
python skills/arrayexpress-fetch/arrayexpress_fetch.py \
  --command search --query "single cell heart" --limit 20 --output /tmp/ae

# Via the ClawBio runner
python clawbio.py run arrayexpress-fetch --demo
python clawbio.py run arrayexpress-fetch --command metadata --accession E-MTAB-10030

# The upstream positional form also works when called directly
python skills/arrayexpress-fetch/arrayexpress_fetch.py metadata E-MTAB-10030 --output /tmp/ae

Demo

bash
python clawbio.py run arrayexpress-fetch --demo

Runs metadata, files, sdrf, metadata-table, samplesheet and search against the bundled E-MTAB-10030 fixtures, entirely offline, and writes the full output tree including a 6-sample nf-core samplesheet.

Algorithm / Methodology

File classification is by filename, in this order: *.idf.txt → idf, *.sdrf.txt → sdrf, known read/array extensions (.fastq.gz, .cel, .bam) → raw, everything else → processed.

Download base resolution. ArrayExpress files are not served from one fixed tree. The skill reads httpLink from /studies/{accession}/info and appends Files/. Upstream hardcoded www.ebi.ac.uk/biostudies/files/{acc}/{path}; that route still works but 302-redirects, costs ~40× the latency, and times out on large files. See file_url() for the measured evidence.

Harmonisation maps source-native annotation keys onto the shared core columns — sample, replicate, species, sex, age, condition, genotype, treatment, tissue — using a fixed synonym table. Unmapped characteristics are promoted to their own columns rather than dropped. Absent values are NA, never blank.

Sample identifiers are normalised to [A-Za-z0-9._-]. Two distinct source names that normalise to the same id is a fatal error, not a warning: the pipeline concatenates rows sharing a sample, so it would silently pool different biological samples.

Read pairing uses Comment[FASTQ_URI] from the SDRF. With --read-map the 1-based positions given are taken as the cDNA pair. Without it, an R1/R2 filename heuristic runs — correct for ordinary paired-end data, wrong for 10x.

Example Queries

  • "What's in E-MTAB-10030?"
  • "Show me the SDRF for that ArrayExpress experiment"
  • "Build me an nf-core/scrnaseq samplesheet from E-MTAB-10030"
  • "Search ArrayExpress for rat microglia single cell"
  • "Download just the MAGE-TAB files for E-MTAB-10030"

Example Output

metadata

E-MTAB-10030
Title:        Single-cell RNA-seq of rat microglia in monoculture and in
              coculture with neurons and astrocytes
Released:     2021-03-23
Collection:   ArrayExpress

Files: 26 total
  idf              1
  sdrf             1
  raw             24

files

26 file(s) for E-MTAB-10030:

idf                   3.1 kB  E-MTAB-10030.idf.txt
sdrf                  7.2 kB  E-MTAB-10030.sdrf.txt
raw                  1.4 GB  B1_S1_R1.fastq.gz
raw                  1.5 GB  B1_S1_R2.fastq.gz

samplesheet (--assay scrna)

csv
sample,fastq_1,fastq_2
Sample_1,https://ftp.ebi.ac.uk/pub/databases/microarray/data/experiment/MTAB/E-MTAB-10030/B1_S1_R1.fastq.gz,https://ftp.ebi.ac.uk/pub/databases/microarray/data/experiment/MTAB/E-MTAB-10030/B1_S1_R2.fastq.gz
Sample_2,https://ftp.ebi.ac.uk/pub/databases/microarray/data/experiment/MTAB/E-MTAB-10030/B1_S2_R1.fastq.gz,https://ftp.ebi.ac.uk/pub/databases/microarray/data/experiment/MTAB/E-MTAB-10030/B1_S2_R2.fastq.gz

tables/metadata.tsv

sample     replicate  species            sex    age      condition  tissue
Sample 2   1          Rattus norvegicus  mixed  0 to 2   NA         neocortex
Sample 4   1          Rattus norvegicus  mixed  0 to 2   NA         neocortex

Output Structure

output_directory/
├── report.md
├── result.json
├── samplesheet.csv
├── tables/
│   └── metadata.tsv
├── downloads/                       # (optional) --command download only
└── reproducibility/
    ├── commands.sh
    ├── environment.yml
    └── checksums.sha256

Dependencies

  • Python ≥ 3.10, standard library only. No pip install required.
  • Network access to www.ebi.ac.uk and ftp.ebi.ac.uk on TCP/443. See Gotcha 5.

Gotchas

  • Gotcha 1: You will want to trust the R1/R2 filename heuristic for a 10x run. Do not. For a Chromium run whose technical reads are separate files, the heuristic drops the cDNA read and produces a plausible-looking samplesheet that quantifies the wrong thing. Pass --read-map explicitly: 3 files → 2,3, 4 files (dual index) → 3,4. Confirm the choice with the user before writing the sheet. This is the highest-risk behaviour in the skill.
  • Gotcha 2: You will want to quote the file size as megabytes. It is bytes, and ArrayExpress raw data is routinely tens of gigabytes. Never start --command download --raw without telling the user the total first.
  • Gotcha 3: --read-map accepts positions 1–9, not 1–4. This is upstream behaviour, kept deliberately. A typo like 1,9 passes validation and fails later with a missing-file error rather than being rejected up front.
  • Gotcha 4: You will want to hardcode https://www.ebi.ac.uk/biostudies/files/{accession}/{path}. Do not. It works — it 302-redirects — but there is no one base tree behind it, and the redirect costs ~40× the latency and times out on large files. This skill resolves httpLink from /studies/{accession}/info and keeps the old path as a fallback.
  • Gotcha 5: If --command metadata works but --command download hangs or fails with a connection timeout, suspect a firewall, not a bug. Metadata comes from www.ebi.ac.uk; file bytes come from ftp.ebi.ac.uk. Networks routinely allow the first and block the second. Both need allowlisting on TCP/443 — this skill never speaks the FTP protocol despite the hostname, so asking an admin to "open FTP" achieves nothing. See docs/data-handling.md.
  • Gotcha 6: A sample-name collision is fatal, by design. If two source names normalise to the same id the skill exits rather than emitting a sheet, because the pipeline concatenates rows sharing a sample and would pool distinct biological samples without saying so.
  • Gotcha 7: A 403 from EBI mid-download is usually rate limiting, not a permissions problem — it appears after a burst of requests to the same host and clears on retry (observed 2026-09-22). Generated download scripts handle this themselves: --tool curl emits --retry 5 --retry-delay 10 plus --retry-all-errors where curl supports it. In-process --command download does not retry on 403, so just re-run it.
  • Gotcha 8: Upstream's --out defaults were relative to the working directory, so samplesheet.csv landed wherever you happened to be. Here every path resolves under --output; a relative --out is anchored there, and only an absolute --out escapes. Do not reintroduce cwd-relative defaults.
  • Gotcha 9: You will want to reach for --command download-script to get the FASTQs. There is none, deliberately. ArrayExpress brokers sequencing reads to ENA and serves the bytes from there, so build samplesheet.csv here and emit the script with ena-fetch --command download-script against the same --output; it fetches whatever URLs the sheet names, whether they point at ftp.sra.ebi.ac.uk or ftp.ebi.ac.uk. For runs not mirrored to ENA, or for 10x reads whose structure only fasterq-dump exposes reliably, use sra-tools (prefetch --option-file, then fasterq-dump). --command download is a different thing and still works for files ArrayExpress does host — IDF, SDRF, processed matrices, CEL, BAM.
  • Gotcha 10: tables/metadata.tsv is one row per sample × replicate, not one per SDRF line. A bulk paired-end SDRF puts each FASTQ on its own line, so a 12-sample study has 24 of them; the rows are grouped on Comment[ENA_RUN], falling back to Source Name, before they are harmonised. Do not "fix" a row count that looks low by iterating the SDRF directly — that is the bug this replaced, and it also doubled the BioSamples lookups.
  • Gotcha 11: --strandedness defaults to auto and should stay there unless the record states the library chemistry. The value follows from the chemistry, never from a library merely being "stranded": dUTP second-strand marking (TruSeq Stranded mRNA, NEBNext Ultra II Directional) → reverse; Lexogen QuantSeq 3′ FWD → forward — one vendor, both directions; non-directional kits → unstranded. When you do know it, declare it: nf-core/rnaseq infers per sample either way, but only an explicit value earns a mismatch report, and auto has nothing to compare against. A wrong explicit value is worse than auto — it mislabels every sample and suppresses nothing.

Safety

  • Local-first: no user genetic data is ever transmitted. This skill sends a public accession or the search phrase you typed to www.ebi.ac.uk and receives public archive data. Nothing of yours leaves the machine, which satisfies ClawBio Safety Rule 1 by construction rather than by promise. File bytes are fetched from ftp.ebi.ac.uk over HTTPS. See docs/data-handling.md.
  • Credentials: none. ArrayExpress needs no key, and the skill reads no credential environment variables.
  • Execution: this skill runs nothing it writes; it emits no download script. --command download fetches files immediately, so confirm it with the user each time.
  • Disclaimer: every report carries the ClawBio medical disclaimer — "ClawBio is a research and educational tool. It is not a medical device and does not provide clinical diagnoses. Consult a healthcare professional before making any medical decisions."

Agent Boundary

The agent dispatches and explains; the skill executes. The agent chooses the accession and the subcommand, decides whether a 10x run needs --read-map, asks the user before any download or script execution, and explains the result. It does not re-derive FASTQ URLs, hand-edit the samplesheet, invent harmonisation mappings, or override a sample-name collision. Every number in the report comes from the script's output, never from the model.

Integration with Bio Orchestrator

Trigger conditions: the orchestrator routes here on an ArrayExpress accession (E-MTAB, E-GEOD, E-MEXP, E-PROT) or an explicit mention of ArrayExpress, MAGE-TAB, SDRF or IDF.

Chaining partners:

  • biostudies-fetch: the same API for non-ArrayExpress collections; route S-BSST*/S-BIAD* there.
  • ena-fetch: when the study's runs are wanted from the sequence archives rather than the ArrayExpress FASTQ mirror.
  • nfcore-rnaseq-wrapper / nfcore-scrnaseq-wrapper: the natural consumers of the samplesheet.csv this skill writes.
  • rnaseq-de / scrna-orchestrator: downstream analysis once counts exist.
  • article-data-fetcher: upstream producer. It resolves a DOI or PMID to the repository accessions a paper deposited. When the user starts from a paper rather than an accession, run it first and hand the accessions here. It downloads files and writes a manifest.json, but it does not parse MAGE-TAB, harmonise sample annotation into metadata.tsv, or emit a pipeline-ready samplesheet.csv — that is this skill's job, so the two chain rather than compete.

Maintenance

  • Update trigger: when an archive host changes an endpoint this skill calls. Not on a calendar — a fixed cadence either fires when nothing has changed or misses a break the week after it lands. The staleness signals below are the trigger.
  • How a break surfaces: from a live call, not from CI. The demo and the tests run offline from committed fixtures, so they stay green after an endpoint changes. Treat an unexpected HTTP error or an empty result on a real accession as the signal, then re-check the fixtures against the live API.
  • Staleness signals: /studies/{acc}/info stops advertising httpLink; the MAGE-TAB column vocabulary changes; nf-core changes its samplesheet columns.
  • Known debt: the metadata-table, sanitiser and read-map helper blocks are duplicated across the five archive scripts rather than factored into a shared module. This is deliberate — it keeps re-syncing with upstream cheap. Revisit only if upstream itself deduplicates.
  • Deprecation criteria: retire if EMBL-EBI folds ArrayExpress fully into the generic BioStudies record shape, at which point biostudies-fetch would cover it.

Citations

  • Ported from UKDRI/informatics_data_skills at commit 7cc3e6e (arrayexpress/scripts/arrayexpress.py), MIT licensed. Upstream copyright retained: Copyright (c) 2026 UK Dementia Research Institute.
  • ArrayExpress / BioStudies: Sarkans et al. (2018) The BioStudies database — one stop shop for all data supporting a life sciences study. Nucleic Acids Research 46(D1):D1266–D1270. https://doi.org/10.1093/nar/gkx965
  • Demo fixture: E-MTAB-10030, "Single-cell RNA-seq of rat microglia in monoculture and in coculture with neurons and astrocytes", released 2021-03-23. The record declares no explicit licence attribute; it is redistributed here as public archive metadata on the terms EMBL-EBI publishes it under. Rattus norvegicus throughout, so no human individual-level data.
  • MAGE-TAB: Rayner et al. (2006) A simple spreadsheet-based, MIAME-supportive format for microarray data: MAGE-TAB. BMC Bioinformatics 7:489. https://doi.org/10.1186/1471-2105-7-489

Bundled files

The model reads these on demand while the skill is loaded. They are exposed as readable files and are never executed.

Frequently asked questions

What does the Arrayexpress Fetch AI skill do?

Query metadata and download data from ArrayExpress, EMBL-EBI's functional genomics collection, now hosted inside BioStudies. Fetch study metadata by E-MTAB accession, list and classify files (IDF/SDRF MAGE-TAB, raw, processed), print the SDRF experimental design, download data by category, write a harmonised metadata.tsv, and build an nf-core/rnaseq or nf-core/scrnaseq samplesheet.csv from the SDRF.

Why use Arrayexpress Fetch on TypingMind?

Because you install it once and use it with any model. Arrayexpress Fetch is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Arrayexpress Fetch in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/ClawBio/ClawBio/tree/main/skills/arrayexpress-fetch. TypingMind reads its SKILL.md and bundles its files and installs it as a skill you can enable per chat.

Which AI models can use Arrayexpress Fetch?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Arrayexpress Fetch?

As many as you like. As long as a model supports skills, you can use Arrayexpress Fetch with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Arrayexpress Fetch AI skill free?

Yes. It is published on GitHub by ClawBio under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇