Using seqout with LLMs
Quick setup
You can setup MCP in your AI agent of choice with this URL :
https://seqout.org/api/mcpThis can be done either by asking the agent to do it on your behalf or by editing the appropriate configuration file required by the agent.Claude
Add seqout as a custom connector from Claude Desktop. Open Settings → Connectors, then choose Add custom connector.Enter Seqout as the name and use this server URL:Follow the walkthrough below to finish connecting and choose which seqout tools Claude can use.Once configured, you'll be able to search and explore GEO, SRA, ENA, DRA, GEA, GSA & ArrayExpress datasets directly from Claude Desktop conversations.
https://seqout.org/api/mcp
Claude Code
claude mcp add --transport http seqout https://seqout.org/api/mcp
~/.claude.json by hand:"mcpServers": {
"seqout": {
"type": "http",
"url": "https://seqout.org/api/mcp"
}
}
Codex
codex mcp add seqout --url https://seqout.org/api/mcp
~/.codex/config.toml by hand:[mcp_servers.seqout]
url = "https://seqout.org/api/mcp"
Hermes
hermes mcp add seqout --url "https://seqout.org/api/mcp"
~/.hermes/config.yaml by hand:mcp_servers:
seqout:
url: "https://seqout.org/api/mcp"
Goose
goose configure # Add Extension → Remote Extension (Streamable HTTP)
~/.config/goose/config.yaml by hand:extensions:
seqout:
enabled: true
type: streamable_http
name: seqout
uri: https://seqout.org/api/mcp
timeout: 300
OpenClaw
openclaw mcp add seqout --url https://seqout.org/api/mcp --transport streamable-http
~/.openclaw/openclaw.json by hand:{
"mcp": {
"servers": {
"seqout": {
"url": "https://seqout.org/api/mcp",
"transport": "streamable-http"
}
}
}
}
Video demo with Claude Code
What the server exposes
bulk_project_samples_metadata— Return project title/description/overall_design/source plus flattened sample rows for project accessions (GSE, SRP, ERP, DRP).classify_accession— Pattern-match an accession and report which database family it belongs to and what entity it names (study/series/experiment/sample/run/bioproject). Format validation only — does not query the DB. Returns {valid: false} for unrecognized strings.convert_accession— Resolve any accession (run/sample/experiment/project, any archive) to its canonical project, then list linked projects in the other archives (GEO/SRA/ENA/ArrayExpress/GSA). Cross-database links are project-level; to reach runs/experiments/samples in a target archive, call /project/{study}/runs|experiments|samples on a returned project. Pass db= to also get a flat `targets` list for that archive.convert_accessions— Batch form of /convert/{accession}. POST {"accessions": [...], "db": "sra"}. Each input resolves to its project plus linked projects in other archives. Max 200 accessions per request.download_study_script— Return a bash script to download all runs in a study using the specified source: fastq (EBI FASTQ via wget; paired single-FASTQ runs are converted from SRA/SRA Lite with sracha), sra (SRA normalized via wget), sra_lite (SRA Lite via wget), s3 (AWS S3 via aws cli), or gcs (Google Cloud via gsutil).download_supplementary_script— Return a bash script to download all supplementary / processed data files for a GEO (GSE) or ArrayExpress (E-MTAB) project using curl.find_geo_series_samples— Look up one sample accession across every sample in a GEO series or ArrayExpress/GEA experiment, not just the page the grid has loaded. Backs the samples grid's accession filter on large series.find_publication— Reverse lookup from a publication (PMID or DOI) to every project linked to it across GEO, SRA, ArrayExpress, ENA, DRA, and GEA. Provide either pmid or doi as a query parameter. Each project carries `via`, naming the table the link came from — the inverse of how a project page resolves its publication. Returns {..publication fields.., projects: [{accession, source, title, summary, published_at, via, center_name, country_code}], total_projects}.find_study_experiments— Look up one experiment accession across every experiment in a study, not just the page the grid has loaded. Backs the experiments grid's accession filter so it stays correct on large studies.find_study_runs— Resolve the runs grid's column filters against every run in a study, not just the 500-run preview, so the filters stay correct on large studies. Returns up to 500 matches; `capped` is true when more exist.get_ae_experiment_samples— List all samples for an ArrayExpress experiment accession (E-XXXX-NNN).get_common_name_by_scientific_name— Return matching common names from the common_names table for a scientific name.get_common_names_by_scientific_names— Batch variant of /common-name: pass scientific_name repeatedly to resolve a whole list in one request. Missing names are simply absent from the result (no 404).get_country_accessions— Return distinct project accessions from unified_metadata for a given country, optionally filtered by organism and assay. Returns a plain newline-separated text list of accessions.get_country_pis— Return investigators for a whole country, ranked by project count descending -- this is the map sidebar's ranking and takes no topic. For any question that names a research topic ('single cell', 'CRISPR'), use `get_search_investigators` instead; do NOT pull this unfiltered list and filter it yourself. An investigator is any author of a project's linked publication, or a GEO/ArrayExpress contributor when the project has no linked PMID. Returns {pis, covered_projects, total, took_ms}.get_disease_aliases— GARD and NORD namesget_disease_facets— Study counts per disease category, clinical specialty and assay. Precomputed; the live join is ~80 s.get_disease_projects— One row per study with its per-sample rollup: title, organism, sample and cell counts, assay category, both sex measurements, the catalogue disease it matched and the MONDO ancestry the enrichment recorded. A null cell count means unmeasured, and blank ancestry means unrecorded. `has_fastq` and `has_sra` are NULL when the study is absent from the download-links table, which means unknown, not unavailable; filtering on them accepts only true for that reason. `inheritance` is the mode of inheritance from HPO and Orphanet, plus GARD's own where it publishes one; a disease can carry more than one, and 'Not applicable' means the disease has no Mendelian pattern rather than that nobody looked. `ancestries` is the submitter-reported ethnicity field verbatim, not inferred genetic ancestry, and is present on 13% of studies. `n_samples` counts the samples that matched this collection, not the study's total, so controls and out-of-scope samples are not in it. `total` is the filtered study count; `count` is this page. Filters take values from /disease/{collection}/facets and are rejected if the collection does not carry them. Sort with sort= and order=. `scope` defaults to human_primary (human material that is neither an immortalized line nor a derived model); use patient_derived_model, cell_line, or all to see what that excludes. Every row carries the full set of scope counters either way, so nothing is hidden.get_disease_summary— Corpus-wide totals for studies with at least one sample annotated with a disease in this collection, resolved through MONDO ids and their descendants. `rare` is NIH GARD, matched by exact MONDO xref; `nord` is NORD, matched by name and so a looser set.get_enriched_column— Return the most common values (with counts) for one enriched column (e.g. tissue, cell_type, disease, assay). Reads the enriched_column_top_values materialized view.get_enriched_crosstab— Return counts of one standardised column (breakdown) within each value of another (group) — e.g. group=organism&breakdown=tissue gives the tissues seen per organism, with a distinct-tissue count per organism. Both axes must be in the curated crosstab column set. Reads the enriched_crosstab materialized view.get_enriched_stats— Return how many projects and samples have AI-enriched ontology metadata, plus per-column fill count and distinct-value count. Reads the enriched_summary materialized view.get_experiment— Return experiment metadata (library, platform, instrument, parent study, linked samples) plus runs for an SRA or ENA experiment accession (SRX/ERX/DRX). Use /experiment/{accession}/runs to fetch just the runs.get_experiment_enriched— Return the ontology-enriched sample record(s) for a single SRA/ENA experiment (SRX/ERX/DRX), scoped from the parent study's enriched metadata. Same fields as /project/{accession}/enriched.get_experiment_metadata_rows— Return per-run JSON metadata rows for a single SRA/ENA experiment (SRX/ERX/DRX), in the same row format as /project/{accession}/metadata/rows but scoped to this experiment's runs.get_experiment_runs— Return run download links and layout for an SRX/ERX/DRX experiment.get_geo_series_samples— List all samples for a GEO series (GSE) or ArrayExpress experiment (E-XXXX-NNN).get_global_contribution_filters— Return distinct values for organism, assay_l1, and assay_l2 filters, ordered by count descending. When country is provided, counts are scoped to that country. Global and country-scoped results are cached for 7 days.get_global_contributions— Return aggregated project/experiment/sample counts per geographic location (latitude/longitude rounded to 2 decimal places) from the unified_metadata table. Includes source breakdown (GEO/SRA/ArrayExpress/ENA), city, country, and top 5 organisms per location. Unfiltered and filtered results are cached for 7 days.get_growth_stats— Return monthly counts of projects, experiments, or data volume per database. modes: projects (studies/series count), experiments (samples count), bases (nucleotide bases for ENA, FASTQ/SRA bytes for SRA). Counts are per-month (not cumulative). Returns {mode, series: {db: [{month, count}]}, took_ms}.get_last_updated— Return the date of the newest record in the index. With ?db=<source> (geo|sra|arrayexpress|ena|gsa|dra|gea) returns that source's latest date; without it, the overall maximum. Cached for 7 days. Returns {db, last_updated, by_source}.get_organism_growth— Return monthly and cumulative experiment/sample counts for a given organism across GEO, SRA, ArrayExpress, and ENA databases. The organism parameter should be a scientific name (e.g. 'Homo sapiens'). mode=absolute returns raw counts; mode=percentage returns the organism's share of total experiments per month per database. Returns {organism, mode, series: {db: [{month, count, cumulative}]}, took_ms}.get_organism_totals— Return total experiment/sample counts per organism across GEO, SRA, ArrayExpress, and ENA. Optionally filter by publication year range. Returns {organisms: [{organism, geo, sra, arrayexpress, ena, total}], year_from, year_to, total_organisms, took_ms}.get_platform_filters— Return available organisms, assays, and countries for a platform. Used to populate filter dropdowns in the sequencing technology stats card.get_platform_growth— Return monthly experiment or project counts for a sequencing platform. Optionally filter by instrument_model. Returns {platform, mode, series: {db: [{month, count, cumulative}]}, took_ms}.get_platform_instruments— Return instrument models for a platform with experiment counts.get_platform_totals— Return total experiment counts per sequencing platform across databases. Also available at /platforms.get_project— Return a GEO series (GSE), SRA study (SRP/DRP/ERP), ENA project (PRJ*), or ArrayExpress project (E-*) record by accession.get_project_cite— Return BibTeX citation(s) for a project accession. By default returns the original publication (smallest PMID). Use type=all to get BibTeX for every linked publication.get_project_enriched— Return structured metadata extracted by LLM with ontology mappings. Fields include tissue, cell_type, disease, assay, development_stage each with standardised ontology IDs (UBERON, CL, MONDO, EFO). Falls back to legacy enriched_samples if v4 data is unavailable. Use alongside metadata/rows when raw run/sample fields or FASTQ links are also needed.get_project_metadata— Return only title and description for a GEO series (GSE), SRA study (SRP/DRP/ERP), ENA project (PRJ*), or ArrayExpress experiment (E-*) accession.get_project_metadata_rows— Return paginated JSON metadata rows for a project. SRA/ENA studies return one row per run with experiment metadata, sample metadata, flattened sample_attribute:* columns, FASTQ/SRA download links, byte sizes, and MD5 fields. GEO and ArrayExpress projects return flattened sample rows. Prefer this structured JSON endpoint over CSV downloads for MCP use.get_project_overlap— Stats of how many projects each archive holds and how they intersectget_project_similar— Return the nearest studies to a project based on the precomputed 2D embedding (geo_series.neighbors / sra_studies.neighbors). Each result includes accession, distance, title, organisms, and source. Useful for 'find studies like X' / 'what else is similar to this dataset'.get_project_single_cell— Per-sample cell/gene counts joined to read-derived (preflightx) species, sex and assay calls and to viral/microbial presence flags. 404s when the study is not in the Pentimento.get_project_xref— Discover cross-references for a study across GEO, SRA, ArrayExpress and ENA by following cross-reference links, SRA aliases, and E-GEOD naming conventions. When a project has no direct link to a sequence-bearing study, this also resolves through its publication (PMID) and returns those with source='pmid' and a `via_pmid` field. Those are inferred from a shared paper, not declared cross-references, so present them as such -- a paper can cover several studies. Returns {accession: string, xref: [{accession, link_type, source, via_pmid?, title?}]}.get_run— Return FASTQ/SRA download links and layout for one run accession (SRR/ERR/DRR). fastq_ftp, fastq_bytes, and fastq_md5 are semicolon-joined for paired-end FASTQs. If a paired-layout run has one ENA FASTQ, fastq_is_interleaved is true and SRA/SRA Lite conversion should be used. Use get_run_checksums when you need parsed per-file FASTQ URLs, byte sizes, and MD5 checksums. Returns 404 if the run is unknown.get_run_checksums— Return per-file FASTQ and SRA download URLs with their byte size and MD5 checksum for a run accession (SRR/ERR/DRR), parsed into structured records so callers do not need to split semicolon-joined FASTQ fields. For paired-layout runs with one ENA FASTQ, flags indicate that SRA/SRA Lite conversion is required and which source should be used.get_run_enriched— Return the ontology-enriched sample record for a single run accession (SRR/ERR/DRR), resolved via run → experiment → sample. Same fields as /project/{accession}/enriched.get_run_metadata_rows— Return the single JSON metadata row for one run accession (SRR/ERR/DRR), in the same row format as /project/{accession}/metadata/rows.get_sample— Return an SRA/ENA sample (SRS/DRS/ERS/SAM*) by accession.get_sample_detail— Return full metadata for a sample or experiment accession (GSM, SRX/DRX/ERX, SRS/DRS/ERS, SAM*). Includes parent project metadata, sample attributes, experiment info, and run download links.get_sample_experiments— Return the SRA/ENA experiment accession(s) that reference a sample (SRS/ERS/DRS/SAM*). Inverse of /experiment/{accession}'s samples list.get_search_investigators— Rank the investigators behind an arbitrary full-text search, across GEO, SRA, ENA, ArrayExpress, GSA, DRA and GEA. Use this for 'who are the top people working on X' questions instead of searching and then looking up contributors project by project. Answers 'top researchers / scientists / PIs / labs working on X', optionally within one country. Prefer this over ranking people yourself from search results. PICK THE MODE FROM THE QUESTION'S WORDING. Use senior_only=false when it asks about 'researchers', 'scientists', 'authors', 'people' or 'who works on' -- this counts everyone who worked on the data. Use senior_only=true (the default) only when it explicitly asks for 'PIs', 'principal investigators', 'senior authors', 'labs' or 'who leads' -- this counts last authors, so lab members are excluded. The two modes give different people; do not present one as the other. `q` uses /search syntax. `country` must be a normalised name such as 'United States' or 'India', never a raw value like 'USA'. Counts already cover the complete match set, so never page results and tally them yourself; `limit` only truncates the returned list. `country` is where the project was deposited and `center_name` is its centre -- neither is the person's own affiliation, so name the centre rather than asserting someone's nationality. Counts are data deposits, not papers. Answer with the ranking itself; mention `covered_projects` only when it is small enough to make the ranking unreliable.get_source_totals— Return total project and sample counts for GEO, SRA, ArrayExpress, and ENA. Cached for 7 days. Returns {geo: {projects, samples}, sra: {...}, ...}.get_study_bams— Return direct download links for original submitted BAM files in an SRA study. BAM files are extracted from the ncbi_files JSONB column where supertype is 'Original'. Not all studies have BAM files — returns total_bams=0 when none exist.get_study_download_manifest— Return paginated JSON file entries for downloading an SRA/ENA study. This is the preferred MCP tool for complete per-file FASTQ retrieval. For paired-layout runs with one ENA FASTQ, mode=fastq returns an SRA/SRA Lite source plus sracha conversion command. Modes: fastq, sra, sra_lite, s3, or gcs. Each entry includes URL, target path, checksum/size when available, and run/experiment metadata.get_study_experiments— List all experiments for a study accession (SRP/DRP/ERP/PRJ*). For ENA (PRJ*), returns one row per experiment_accession (first run only).get_study_runs— Return FASTQ/SRA download links for runs in an SRA/ENA study. Returns summary statistics plus a preview of up to 500 runs; pass full=true for every run instead (used by the UI's link export). FASTQ fields are semicolon-joined for paired-end runs. If a paired-layout run has one ENA FASTQ, fastq_is_interleaved is true and SRA/SRA Lite conversion should be used. For complete paginated per-file entries, use get_study_download_manifest.get_study_samples— Return distinct samples referenced by any experiment in an SRA study (SRP/DRP/ERP). PRJ accessions are resolved to their SRA study first.get_supplementary_files— Return structured supplementary / processed data file links for a GEO (GSE) or ArrayExpress (E-*) project.list_centers— Return the top submission centers from sra_submissions + ena_studies, sorted by frequency. Use to discover values for search_structured(center=...).list_instrument_models— Return every instrument_model seen in sra_experiments with a count, sorted by frequency. Use to discover valid values for search_structured(instrument_model=...).list_journals— Return the top journals appearing in linked publications, sorted by frequency. Use to discover valid values for search_structured(journal=...).list_library_strategies— Return every library_strategy seen in sra_experiments with a count, sorted by frequency. Use to populate filter dropdowns or to discover valid values for search_structured(library_strategy=...).ontology_term— Look up one term in the ontology graph and return its source identifiers (xrefs), its MAPS_TO synonym cluster, and its hierarchy children. `max_hops` (default 2) bounds the synonym walk only — children are always the DIRECT children of the resulting synonym cluster, as the deep-dive explorer defines them. Set `children=false` to skip the children query entirely, which is much cheaper. xrefs are source CURIEs (UBERON:0002107, HGNC:5, MeSH:D008099, CVCL_0030) and are returned for the queried term, every synonym, and every child. Synonyms capped at 500 (synonym_total gives the true count), children at 300 (children_truncated flags the cap). 404 if the term is not in the graph.resolve_accession_project— Resolve a sample/experiment/run accession (GSM/SRS/DRS/ERS/SRX/ERX/DRX/SRR/ERR/DRR) to its parent project accession (GSE or SRP/DRP/ERP). A run resolves via its experiment.resolve_prj_project— Resolve a PRJ accession to its project accession. PRJNA checks GEO series then SRA studies; PRJEB/PRJDA checks SRA only.resolve_submission_studies— List the SRA/ENA/DDBJ studies (SRP/ERP/DRP) filed under a submission accession (SRA######, ERA######, DRA######). Usually one, sometimes many.search_all— Unified search across GEO, SRA, ENA, ArrayExpress, GSA, DDBJ DRA and DDBJ GEA. Optionally restrict by db=geo|sra|arrayexpress|ena|gsa|dra|gea. Optionally sort by sortby=citations|journal|year with order=desc(default)|asc. For default relevance sort, use cursor_rank + cursor_acc for pagination. For custom sortby, use cursor_sort + cursor_acc for pagination. Returns {results: object[], total: int, took_ms: float, next_cursor: {rank, accession} or {sort_value, accession} | null}.search_author_projects— Given a person's name, find every dataset they authored across all four databases. Matches the name (first + last, tolerant of middle initials) against publication author lists, then resolves the linked studies. Returns project rows compatible with the search result cards. Only studies linked to a PubMed publication are findable.search_by_author— Case-insensitive substring search across publication author lists, ranked by citation count. Each result is a publication (PMID, title, journal, DOI, authors, citation count) plus its linked dataset accessions across GEO, SRA, ArrayExpress, and ENA. Only studies with a linked PubMed publication are findable here.search_enriched_samples— Find SAMPLES matching ontology-enriched criteria across the whole corpus and return the sample accessions, not the studies containing them.search_expansion— Explain the synonym expansion that a plain-keyword search runs: per query term, the synonyms that actually reached the search, and how many that term has in total (they differ when the variant cap truncates the expansion). Structured/boolean queries are not expanded, so chunks is empty for them. Returns {query, structured, variants, variant_cap, chunks: [{term, synonyms, total}], took_ms}.search_highlight— Return the surface words in one project's title, summary and overall design that the query matched — stemmed, synonym-expanded and tokenised by the same Postgres text search the results came from. Intended for highlighting the query on a project page arrived at from a search. Returns {accession, query, words: [...], took_ms}.search_nl— Parse a plain-English query into structured filters (organism, library_strategy, source, date range) and run the structured search. Rule-based, deterministic, no LLM. Unrecognized words become the full-text query. The response echoes `parsed` so callers see exactly how the sentence was interpreted. Set dry_run=true to parse only. Example: 'human transcriptome data published between 2020 and 2022'.search_organisms— Search for organisms by partial name match (case-insensitive). Returns up to `limit` organisms sorted by total experiment count. Use this for typeahead/autocomplete in organism selectors.search_structured— Search across GEO, SRA, ArrayExpress, and ENA with structured filters (organism, library_strategy, platform, country, center, year range, journal, instrument_model, assay_l1/assay_l2, geo_* location fields, published_after/published_before (study release date), pub_date_after/pub_date_before (linked-paper publication date), multi_platform, and enriched sample filters sample_tissue/sample_disease/sample_cell_type) optionally combined with full-text search. At least one of q or a filter parameter is required. Use cursors (rank + accession) for pagination. Returns {results: object[], total: int, took_ms: float, next_cursor: {rank: float, accession: string} | null}.search_suggest— Return spelling correction suggestions for a query. Useful when a search returns 0 results due to typos.




