Skip to main content
Glama

BioMCP

npm version downloads/mo downloads YTD commits/30d software DOI

BioMCP-TS architecture

Highlights

Democratizing agentic access to bioinformatics and biopharmaceutical databases and analyses.

  • Section-based federated access to 50+ bioinformatics, pharmaceutical, and patent databases

  • Optional toolboxes for local database curation and dependency-free analysis with Bioconductor and SAM/BED/BCFtools — no R installation, C toolchain, or containers

  • Concrete example vignettes, developed fully in the open

Related MCP server: PubMed Advanced MCP Server

Install

npx -y biomcp doctor   # diagnose a machine: Node gate, config health, feature gates, peer deps
npx biomcp             # zero-config stdio MCP server (this is what MCP clients run); Node >= 22.13

Setup is guided in docs/AGENT-INSTALL.md — a one-minute start, copy-paste config entries for Claude Desktop, Claude Code, Codex, and OpenCode (one canonical pinned command covering every feature), biomcp doctor as the single troubleshooting entry point, and agent-friendly paths for API keys and optional features.

Multiple agents on one machine: biomcp enforces arXiv's Terms-of-Use rate limit (1 request / 3 s) per process. When running multiple biomcp MCP instances on one machine (e.g., one stdio instance per agent), rate limits are not coordinated across processes, and arXiv's TOU applies to all your machines in aggregate. For multi-agent single-machine deployments, run a single shared biomcp serve daemon (see docs/SELF-HOSTING.md) so all agents share one process and one global rate limiter.

Available Tools

Full tool schemas (params, enums, defaults) live in src/server/README.md.

Gene (7)

Tool

Description

gene_search

Search genes by symbol, name, or keyword with chromosome filter

gene_get

Get detailed gene info by HGNC symbol with optional sections (core, pathways, protein, ontology, go, interactions, expression, protein_atlas, constraint, druggability, dosage_sensitivity, clinical_evidence, disease_associations, diseases, funding). Set smart=true to auto-resolve gene aliases (e.g., "HER2" → "ERBB2")

gene_diseases

Get diseases associated with a gene (DisGeNET / OpenTargets)

gene_drugs

Find drugs targeting a gene (OpenTargets; envelope { results, warnings?, errors? } — OpenTargets failures and unresolved genes ride in errors[], never as inline rows)

gene_trials

Find clinical trials for a gene

gene_articles

Find articles about a gene (federated across PubMed, EuropePMC, Semantic Scholar, arXiv, PubTator, LitSense; envelope { results, warnings?, errors? } — per-backend failures ride in errors)

gene_enrich

Pathway enrichment analysis for a gene list (Reactome)

Variant (4)

Tool

Description

variant_search

Search variants by rsid, HGVS, gene, ClinVar significance, frequency, CADD

variant_get

Get detailed variant info with optional sections (frequency, predictions, clinical; alphagenome_scores currently returns an unavailability error pending reimplementation)

variant_oncokb

Get OncoKB cancer variant annotations (requires ONCOKB_TOKEN)

variant_trials

Find clinical trials for a variant

Drug (3)

Tool

Description

drug_search

Search drugs by name, mechanism, or keyword (envelope { results, hint? } — when nothing matches, hint points mechanism/target queries at gene_drugs)

drug_get

Get detailed drug info with optional sections (us_regulatory, who_regulatory, safety, targets, indications, adverse_events — FDA FAERS reactions ranked by report count; WHO PQ listing lookup, ~650 global-health priority products)

drug_trials

Find clinical trials for a drug

Disease (4)

Tool

Description

disease_search

Search diseases by name, phenotype, or keyword (envelope { results, warnings?, errors? })

disease_get

Get detailed disease info by ID (DOID, MONDO, OMIM, etc.) with optional sections (gene_associations, phenotypes, pathways)

disease_drugs

Get drugs for a disease (OpenTargets; envelope { results, warnings?, errors? } — OpenTargets failures and unresolved diseases ride in errors[], never as inline rows)

disease_trials

Get clinical trials for a disease (ClinicalTrials.gov; envelope { results, warnings?, errors? })

Article (4)

Tool

Description

article_search

Federated literature search across PubMed, EuropePMC, Semantic Scholar, arXiv, PubTator, and LitSense with optional date range filtering; source: "preprint_only" switches to bioRxiv+medRxiv preprints only (abstracts, citation counts, date filtering). Result records carry journal_issn

article_get

Get detailed article info by identifier (PMID, PMCID, DOI, or bioRxiv/medRxiv preprint DOI) with optional sections: fulltext (the complete article text when freely readable in PMC/Europe PMC — open-access AND free-to-read articles; by default (fulltext_output="file") written to a server-side markdown file with the reply carrying file_path + an outline of headings with line numbers and char counts for selective Read/Grep, keeping body text out of the agent context; fulltext_output="inline" returns capped text sections via fulltext_max_chars, default 40000), oa (open-access/license metadata and links: status open_access/free_to_read/paywalled/not_in_pmc/unknown, license, pmc/pdf/doi links), annotations, graph (citation graph), citation (fast/full citation data; Europe PMC citations for preprints). all excludes fulltext. Preprint records include all versions, license, category, funders, JATS full-text URL (link only — use preprint_fulltext for the text), and published-version mapping. The record carries journal_issn

preprint_fulltext

On-demand bioRxiv/medRxiv preprint full text (JATS XML parsed to sections), by preprint DOI with optional version (default: latest). Strictly on-demand (never during search), downloads are paced (≥3 s spacing), cached per (doi, version) — JATS per version is immutable — and license-aware (cc_by → cc by + CC URL on every reply; the per-article license governs reuse). www.biorxiv.org rate-limits aggressively: on a 429/Cloudflare verdict all downloads pause ≥60 s (Retry-After honored) and calls during the cooldown get an honest rate_limited envelope with retry_after_sec; cached copies keep serving instantly. output="file" (default) writes a server-side markdown file (file_path + outline); output="inline" returns capped sections (fulltext_max_chars). Corpus-scale: use the bioRxiv/medRxiv monthly S3 buckets (https://www.biorxiv.org/tdm)

journal_metrics

OpenAlex journal quality metrics (2yr mean citedness — an open-access impact-factor alternative), h-index, quality lists; by name, NLM abbreviation, or ISSN

Trial (2)

Tool

Description

trial_search

Search clinical trials by condition, intervention, status, or phase. Cursor-based pagination via page_token

trial_get

Get detailed trial info by NCT ID with optional sections (eligibility, locations, outcomes)

Utility (2)

Tool

Description

discover

Free-text concept resolution across all entity types

batch_get

Retrieve multiple entities in parallel

Structural Biology (1)

Tool

Description

pdb

Search PDB structures, get entry metadata with optional sections (polymer entities, ligands, assembly, experiment, citation), and download structure files (mmCIF/PDB)

Patents (2)

Tool

Description

patent_search

Search patents worldwide (US, EP, WO, JP, 100+ authorities) with assignee/inventor/CPC/status/date filters and relevance ranking (sort_by). Quote exact multi-word concepts (e.g. "flow cytometry"). Foundational prior art is auto-discovered via co-citation mining (seminal_prior_art; disable with seminal: false). Default backends: USPTO Public Search full-text (US, keyless, relevance-ranked) + EPO OPS (worldwide, keyed); uspto_odp (US bibliographic metadata) and google_patents (best-effort) available via source

patent_get

Get patent details by publication number with sections: abstract, claims (US fulltext via USPTO Public Search; EP/WO via EPO OPS when configured, otherwise Google Patents pages), citations (forward + backward), family, classifications

GEO (2)

Tool

Description

geo_search

Search NCBI GEO for functional genomics studies (expression microarrays, RNA-seq, single-cell series) by entry type (GSE/GSM/GPL/GDS) and organism; results carry cross-links (bioproject, pubmed_ids; sra_project when NCBI links the SRA study — otherwise geo_get's sra field) for chaining

geo_get

Get the full SOFT record for a GEO series/sample/platform: summary, organisms, sample preview (≤20), supplementary file URLs, and cross-references; optionally download the first supplementary file. GDS curated DataSets return structured guidance ({ accession, guidance, see_also: { series, sample } }) pointing at the underlying GSE/GSM instead of a record

SRA (2)

Tool

Description

sra_search

Search NCBI's Sequence Read Archive for sequencing experiments and runs by free text, accession, or field syntax; returns experiment/study/sample accessions with library strategy and run counts

sra_get

Get full details for an SRA accession: run (SRR/ERR/DRR — instrument, spots, bases, size), experiment (SRX/ERX/DRX — library design), study (SRP/ERP/DRP — experiment list), or sample (SRS/ERS/DRS); NCBI SRA indexes NCBI, ENA, and DDBJ accessions alike

GenBank (3)

Tool

Description

genbank_search

Search NCBI nucleotide records (GenBank/RefSeq/INSDC) by plain terms, accession, or field syntax; results include accession.version, definition, length, organism, topology

genbank_get

Fetch a GenBank/RefSeq record as GenBank flat file or FASTA; whole records capped at 2 Mb — larger records require a seq_start/seq_stop region (up to 10 Mb, reverse-strand via strand=2)

genbank_genes

Map a GenBank/RefSeq accession to its NCBI Gene IDs (elink nuccore→gene) for bridging into gene tools

GTEx (2)

Tool

Description

gtex_expression

Get median gene expression across GTEx tissues (Analysis v10, 54 tissue sites, TPM, highest first); accepts HGNC symbol or Ensembl gene ID, with optional single-tissue filter

gtex_eqtl

Get significant cis-eQTL associations for a gene in a specific GTEx tissue (v10): variant_id, p_value, NES, slope, sorted by ascending p-value

Ensembl (4)

Tool

Description

ensembl_lookup

Resolve a gene in Ensembl terms for any of ~356 species: stable ID (+version), symbol, coordinates on the current assembly, canonical transcript; expand=true adds transcripts with translation/protein IDs

ensembl_homology

Find orthologues/paralogues across species via Ensembl Compara — target stable IDs, taxonomy level, percent identity, sorted by identity; filter with target_species/target_taxon

ensembl_consequence

Compute variant consequences on demand via Ensembl VEP for NOVEL variants and non-human species: most severe consequence, per-transcript effects (SIFT/PolyPhen), co-located ClinVar/COSMIC/gnomAD data. Known human variants get deeper pre-computed scores via variant_get; prefer HGVS input over rsIDs for precision

ensembl_region

Query genes/transcripts/known variants in a genomic interval (chr:start-end) on the current assembly — locus triage

R Analysis (4, optional — ANALYSIS_R=1)

Tool

Description

analysis_r_deseq2

Differential expression for RNA-seq counts with Bioconductor DESeq2 (negative binomial, independent filtering, optional LFC shrinkage) in sandboxed WebAssembly R. Inputs: integer count matrix + sample metadata + design formula; output: markdown table of top genes by adjusted p-value with summary (format="json", include_full=true for full base64(gzip(TSV)) table)

analysis_r_edger

Differential expression with edgeR — TMM normalization, empirical-Bayes dispersion, quasi-likelihood F-test (test="qlm") or 2-group exact test; same input/output contract

analysis_r_limma

Differential expression with limma-voom — precision-weighted linear models with empirical-Bayes moderation; same input/output contract

analysis_r_session_info

R runtime report: R/webR versions, installed package versions, memory, mirror endpoint — for diagnosing analysis issues

First use starts a ~1 GB WebAssembly R worker and downloads the wasm package bundle (~62 MB) from GitHub releases (cached). Requires webr installed next to biomcp. Guide: docs/R-ANALYSIS.md.

Biowasm Analysis (8, optional — ANALYSIS_BIOWASM=1)

Tool

Description

analysis_bam_summary

Inspect an alignment (SAM/BAM/CRAM): header contigs, sample/read groups, flagstat mapping metrics, per-contig counts via idxstats when indexed — "what's in this BAM?" before region work

analysis_bam_view_region

Reads, depth, pileup, or read extraction in a genomic region (samtools view/depth/mpileup); indexed sources use fast positional retrieval, indexless sources stream a BED filter (depth requires coordinate-sorted input and detects order violations), returning counts, coverage tables, SAM rows, or a BAM artifact

analysis_bcf_summary

Inspect a VCF/BCF: contigs, sample count and names, INFO/FORMAT field inventory from the header

analysis_bcf_view_region

Variants in a region as a narrow field projection (bcftools query): chosen columns, sample subsets, expression filters, variant types — or a sliced VCF.gz artifact

analysis_bed_op

Interval algebra on BED tracks (bedtools intersect/merge/subtract/coverage/jaccard/sort) with the streaming -sorted algorithm for sorted inputs

analysis_biowasm_convert

Format plumbing: SAM/BAM/CRAM via samtools view, VCF/BCF via bcftools view, VCF/BCF → TSV via bcftools query; results are artifact handles reusable as artifact_id

analysis_biowasm_session_info

Biowasm runtime report: pinned tool versions, asset cache state, engine status, retained artifacts, memory

analysis_biowasm_cli

Constrained escape hatch: an allowlisted samtools/bedtools/bcftools subcommand with schema-validated args (no shell, paths under /shared only)

First use downloads checksum-verified wasm assets (~4.5 MB, cached); no extra npm packages. Indexed sources answer region queries with fast positional retrieval (~0.2 % of file read); indexless sources fall back to streaming BED filters. Guide: docs/BIOWASM-ANALYSIS.md.

Citation Module

Citations federate 5 providers in fast (~4s) or full (~15-30s) mode. Forward citation lists come from Europe PMC, OpenCitations, and Semantic Scholar; Crossref supplies counts and backward references. Provider matrix and schema details: src/server/README.md.

Optional Features

Capabilities that ship with the package but stay inactive until enabled. Each links to its own guide:

Feature

Enable

Guide

Database access — read-only SQL tools (db_query, db_list_tables, db_describe_table) for MySQL and local-file SQLite

Set DB_TYPE (+ connection env vars); MySQL needs the mysql2 peer dep — use the pinned one-shot client command (see docs/DATABASE.md)

docs/DATABASE.md

R analysis — Bioconductor differential expression (analysis_r_deseq2, analysis_r_edger, analysis_r_limma, analysis_r_session_info) running DESeq2/edgeR/limma in sandboxed WebAssembly R; wasm packages download from GitHub releases at first use (~62 MB, cached; slow links: asset_timeout_ms or a self-fetched mirror_url)

Set ANALYSIS_R=1; needs the webr peer dep — use the pinned one-shot client command ["npx","-y","-p","biomcp@1.6","-p","webr@0.6","biomcp"] (all-features variant adds -p mysql2@3); expect ~1 GB RSS

docs/R-ANALYSIS.md

Biowasm analysis — samtools/bedtools/bcftools (BAM/BED/VCF) in sandboxed WebAssembly; streams/indexes real human-scale datasets (~300 MB BAM scans, region queries touch ~0.2 % of the file); assets ~4.5 MB cached at first use; no extra npm packages

Set ANALYSIS_BIOWASM=1

docs/BIOWASM-ANALYSIS.md

Instead of hand-editing env blocks, agents (and users) can self-serve through the always-available biomcp_configure tool: it reports every parameter's status/provenance, writes the .biomcp.json project config file for the optional features above (env vars keep precedence; env-only parameters are query-only and value-masked), validates changes, detects conflicts, checks peer-dependency prerequisites, and spells out the restart/verify steps. Details: docs/ENV-VARS.md → Project config file.

Documentation

Doc

Contents

docs/AGENT-INSTALL.md

Guided installation & client configuration (Claude Desktop, Claude Code, Codex, OpenCode)

docs/ENV-VARS.md

Single source of truth for every environment variable

docs/DATABASE.md

Database access feature guide

docs/R-ANALYSIS.md

R analysis feature guide (Bioconductor in WebAssembly)

docs/BIOWASM-ANALYSIS.md

Biowasm analysis feature guide (samtools/bedtools/bcftools in WebAssembly)

docs/DEVELOPMENT.md

Build, test, publish workflow

docs/development/CI.md

CI pipeline, Dependabot automation, auto-merge safety model

src/server/README.md

Full tool schemas (params, enums, defaults)

agent-test/README.md

User-agent E2E tests for the analysis tools

License

Licensed under the Apache License, Version 2.0. See NOTICE for attributions.

BioMCP-TS is adapted from the upstream BioMCP Rust project (MIT) with an agent-first development approach and enhancements — kudos to the original authors.

Available Tools

43 tools
article_getA
Read-only

Get article by PMID/PMCID/DOI. Section response keys differ from request names: "oa" is stored as sections.open_access, "graph" as sections.citation_graph. Preprint DOIs (bioRxiv/medRxiv, e.g. "10.1101/2025.03.05.641768" or new prefix "10.64898/...") return the preprint record: all versions, license, category, funders, JATS full-text URL, published-version mapping, and (with sections=["citation"]) Europe PMC preprint citations. Journal articles, sections=["fulltext"]: returns the ACTUAL full text when freely readable in PMC/Europe PMC (open-access AND free-to-read). fulltext.status is "available" or "unavailable"; when unavailable, fulltext.reason is one of paywalled | no_pmcid | no_machine_readable_xml | not_implemented_for_preprints | fetch_failed (with alternatives in links, e.g. doi_url); a transiently failed OA-status lookup counts as no status info, so a paywalled in-PMC article surfaces as fetch_failed until a retry reclassifies it as paywalled. The five-value open-access vocabulary — open_access | free_to_read | paywalled | not_in_pmc | unknown — is sections.open_access.status (request sections:["oa"]); fulltext.oa_status echoes it so paywalled vs not-in-PMC is visible without the oa section. Default (fulltext_output="file"): the complete text is written to a server-side markdown file and the reply carries file_path plus an outline with per-section line numbers and char counts — Read/Grep the file selectively instead of loading it into context. fulltext_output="inline" (use only if you cannot read server-side files): fulltext.sections is an ordered array of {heading, text, truncated} objects plus char_count/total_char_count/truncated/omitted_sections, capped by fulltext_max_chars. sections=["oa"] returns license/access metadata and links ONLY (pdf_url presence does not by itself mean the text is fetchable — use fulltext for content). "all" = oa+annotations+graph+citation WITHOUT fulltext (request ["fulltext"] separately). oa/fulltext do not apply to preprints (see the jatsxml_url link). Journal-article citation: fast mode (~4s, 4 providers, auto-fallback to PubMed) or full mode (~15-30s, all 5 providers incl. PubMed). Forward citation lists come from Europe PMC, Semantic Scholar, and OpenCitations; Crossref provides counts and references only.

NameRequiredDescriptionDefault
idYesArticle identifier: PMID (numeric, e.g. "12345"), PMCID (e.g. "PMC1234567"), DOI (e.g. "10.1038/s41586-021-03819-2"), or preprint DOI (e.g. "10.1101/2021.10.25.465764", "10.64898/2026.08.11.744243")
limitNoMaximum items per section (e.g., 20 citations)
sectionsNoSections to include. ["fulltext"] = the complete article text (written to a file by default; see fulltext_output). ["oa"] = license/access metadata and links. ["citation"] = citation data. ["all"] = oa+annotations+graph+citation — fulltext is NOT included; request ["fulltext"] separately.
citation_modeNoFast: Europe PMC, Semantic Scholar, OpenCitations, Crossref counts/references (~4s). Full: All 5 providers incl. PubMed (~15-30s). Fast mode auto-falls back to PubMed when other providers return no items.fast
fulltext_outputNoOutput mode for sections=["fulltext"]. "file" (default): complete text written to a server-side markdown file; the reply carries file_path + outline (headings with line numbers and char counts) — Read/Grep the file selectively. "inline": text returned inline, capped by fulltext_max_chars; use only if you cannot read server-side files.
citation_directionNoCitation direction: "forward" (articles citing this one), "backward" (references), "both" (default); honored for preprint PPR citations too — the skipped direction returns an empty arrayboth
fulltext_max_charsNoInline-mode only (fulltext_output="inline"); default 40000. Ignored in file mode — files carry the complete text (2MB safety cap). Truncation is flagged honestly with omitted section names.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare read-only and open-world; the description carries the rest: section key remapping (oa→sections.open_access), the fulltext.status/reason vocabulary with a named failure taxonomy, the transient-lookup caveat, per-mode latency for citation, and file-vs-inline output behavior. This is unusually rich disclosure of what happens on failure and why.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded, but the remainder is a single undifferentiated block mixing parameter interactions, response shapes, and rare failure modes. Most sentences carry information, yet the transient OA-status-lookup detail and repeated restatement of fulltext/oa behavior add density that slows an agent trying to extract the call decision.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-parameter tool with no output schema, the description supplies the return structure (file_path plus outline, fulltext.sections array, status/reason fields, links) and the failure paths an agent must handle. Nothing material needed to call it correctly appears to be missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds semantics the schema lacks: the response key difference for oa/graph, that fulltext_max_chars is ignored in file mode, and that citation_direction is honored for preprint citations. It stops short of explaining limit's per-section scoping beyond what the schema already says.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb and resource ('Get article by PMID/PMCID/DOI'), and the identifier set immediately separates it from query-based siblings like article_search and gene_articles. The subsequent text confirms this is the single-record fetch path, not a search.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit conditional guidance: use fulltext_output="inline" only if you cannot read server-side files, request ["fulltext"] separately because "all" excludes it, and oa/fulltext do not apply to preprints. It does not, however, route the agent between article_get and article_search/gene_articles, so the alternative-selection guidance is incomplete.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

article_searchA
Read-only

Search literature across multiple backends with federated search and deduplication. Response is an envelope: { results, warnings?, errors? } — per-source failures ride in errors (never as items inside results), degradation notes (e.g. PubMed dropping unrecognized query terms, LitSense relevance-floor drops) in warnings. LitSense rows carry the matched sentence plus PubMed-enriched title/metadata when available.

NameRequiredDescriptionDefault
limitNoMaximum results to return. Applied to final deduplicated results, not per-source. Each source may fetch more internally before deduplication.
queryYesSearch query (title, abstract, or keyword). Journal scoping (pubmed/europepmc): a trailing full journal name recognized from the bundled NLM title list is automatically rewritten to the NLM abbreviation (e.g. "... New England Journal of Medicine" → "N Engl J Med[Journal]" / JOURNAL:"N Engl J Med") and disclosed in response warnings; otherwise supply the NLM abbreviation (e.g. "N Engl J Med") or PubMed "Abbr[Journal]" field syntax — full journal names NOT recognized by the NLM list are not matched by PubMed/EuropePMC journal scoping.
offsetNoResult offset. EuropePMC and preprint_only windows are capped at 1000 rows; arXiv clamps the start offset so start + page size stays within its ~30000-result deep-paging ceiling (the API errors past it); use narrower queries or another source for deeper results
sourceNoSpecific source to search. "preprint_only" searches ONLY bioRxiv+medRxiv preprints (bioRxiv/medRxiv DOIs, abstracts, citation counts, via Europe PMC's preprint index); "arxiv" searches the arXiv preprint server (quotes, parentheses, and field prefixes like ti:/au: are stripped from the query for arXiv only). Default (unset) = federated journal-literature search across PubMed, EuropePMC, Semantic Scholar, arXiv, PubTator, LitSense; bioRxiv/medRxiv preprints are NOT included unless explicitly requested via preprint_only.
dateRangeNoDate range as YYYY-MM-DD/YYYY-MM-DD. Open-ended: "2020-01-01/" or "/2023-12-31". Only pubmed, europepmc, semantic_scholar, preprint_only, and arxiv support this. On pubmed, the upstream filter matches epub dates (pdat), so results are additionally post-filtered on the displayed publication date.

TDQS

A3.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnly/openWorld, so the description carries the real load and adds substantial context: the response is an envelope with results/warnings/errors, per-source failures never appear as items in results, and specific degradation modes are named (PubMed dropping unrecognized query terms, LitSense relevance-floor drops). It also discloses that LitSense rows are enriched with PubMed metadata, which an agent could not infer from the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the purpose before moving to response shape and then per-source failure semantics. The parentheticals are dense but each carries real information (specific degradation examples), with no filler sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description correctly compensates by documenting the envelope and error/warning channels, which is the highest-value gap to fill for a federated search. Parameters are fully covered by the schema; the only shortfall is the missing routing guidance relative to sibling retrieval tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the per-parameter docs (limit applied post-dedup, journal-name rewriting, offset caps, dateRange support matrix) are already thorough. The description adds only the LitSense row-shape detail and does not restate or extend the parameter meanings, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (search literature) plus a distinctive mechanism (federated search with deduplication across multiple backends), which separates it from article_get and preprint_fulltext. It never names a sibling or explicitly contrasts with single-article or gene-scoped retrieval tools, so the differentiation is implicit rather than stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies this is the broad multi-backend search entry point but never says when to prefer it over article_get, gene_articles, or preprint_fulltext, nor when to restrict to a single source. The source-selection guidance that does exist (preprint_only, arxiv behavior, default federated scope) lives entirely in the schema field descriptions, not the prose.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

batch_getA
Read-only

Get multiple entities in parallel. Article items return metadata (with inline abstract) by default; for full text pass sections:["fulltext"] on the item — PMC articles then return a small file handle (file_path + outline, never body text inline) while non-PMC articles return an explicit unavailable + reason. Nonexistent PMIDs yield a per-item error and the batch continues. For inline text use article_get with fulltext_output="inline"

NameRequiredDescriptionDefault
inputsYesList of entity requests

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond readOnlyHint, the description discloses the default return shape (metadata with inline abstract), the conditional behavior of sections:["fulltext"] per source (PMC returns a file handle with file_path + outline and never body text; non-PMC returns explicit unavailable plus a reason), and crucially the partial-failure contract — a bad PMID yields a per-item error while the batch continues. That error-isolation semantics is exactly the kind of behavior the annotation cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The default behavior is front-loaded and every clause carries operational information with no filler. The middle sentence is a long run-on that packs three conditional branches together, which slightly hurts scannability, but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a batched read tool with one nested parameter and no output schema, the description covers defaults, per-entity-type return differences, the fulltext escape hatch, and per-item error handling — enough for an agent to call it and interpret results without trial and error.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the nested item shape is fully specified, so the baseline is 3. The description earns above that by giving the only non-obvious value: sections:["fulltext"], including what that value does and how results differ for PMC vs non-PMC items — information the open-ended string array in the schema cannot supply.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence states a specific verb and resource (get multiple entities) plus the key differentiator 'in parallel', which separates it from the many singular *_get siblings. It further scopes behavior to article items, but never states the tool is *only* for articles — the entity enum in the schema carries that breadth, leaving the description's stated purpose narrower than the tool actually is.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives one explicit routing rule: for inline text use article_get with fulltext_output="inline", which directly resolves the most likely confusion. It does not, however, say when to prefer batch_get over the singular siblings (gene_get, drug_get, etc.) or whether there is any overhead tradeoff for small batches, so the general when-to-use guidance is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

biomcp_configureA
DestructiveIdempotent

Inspect and configure biomcp — unified observability and restricted controllability for every parameter.

What it covers: three optional feature groups (database, analysis_r, analysis_biowasm) whose knobs live in the .biomcp.json project config file (written by this tool, loaded at server startup — a restart applies changes), plus every environment-only parameter (API keys, proxy, security boundaries), which is query-only.

Actions:

  • status (default; call with {}): per-feature running state (with each feature's settable_keys), config file health, conflicts (e.g. an env var vetoing the file), pending-restart flags, dependency prerequisites, and parameter counts. The full parameter catalog is NOT inlined — use filter for detailed rows: 'file', 'env', a feature id ('analysis_r'), or a dotted-id prefix ('features.database').

  • set: create/modify file parameters in one atomic batch. Enable/disable is just features..enabled. null removes a key (restores default). Sensitive keys (connection targets, mirrors) require confirm_sensitive=true. Nothing is written when any key is invalid (dry_run=true validates and diffs without writing).

  • reset: remove a feature section (target: feature id) or specific keys (target: [dotted ids]).

Hard rules: environment parameters are never settable here (the response tells you how to set them in your client's env block); env var values are never displayed (masked: presence + fingerprint only); the file write is refused when the server's working directory is not a project root — the response then carries a paste-ready env block instead.

Examples: {"action":"status"} · {"action":"status","filter":"features.analysis_r"} · {"action":"set","values":{"features.analysis_biowasm.enabled":true}} · {"action":"set","values":{"features.database.enabled":true,"features.database.type":"sqlite","features.database.sqlite_path":["data/geo.db"]}} · {"action":"set","values":{"features.analysis_r.mirror_url":null}} · {"action":"reset","target":"analysis_r"}

Changes apply at server startup: finish dependency prerequisites first (see prerequisites in the response), then restart the client/session once, then re-call this tool with {} to verify running_now.

NameRequiredDescriptionDefault
actionNostatus = inspect (default, works with no other arguments); set = create/modify file parameters; reset = remove.status
filterNoFor status: "file" | "env" | feature id | dotted-id prefix — returns detailed rows (effects, how-to-set).
targetNoFor reset: a feature id ("database" | "analysis_r" | "analysis_biowasm") removes the whole section, or a list of dotted file-param ids removes those keys.
valuesNoFor set: {"<dotted file-param id>": <value|null>} — e.g. {"features.analysis_r.enabled": true}. null removes the key. Valid ids are listed by status.
dry_runNoValidate and diff without writing (set/reset).
confirm_sensitiveNoRequired true when set/reset touches sensitive keys (connection targets, mirrors, credentials).

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructive and non-read-only, and the description adds real beyond-schema behavior: writes are atomic, nothing is written if any key is invalid, null restores defaults, sensitive keys demand confirm_sensitive, env values are masked to presence+fingerprint, and the write is refused outside a project root. It doesn't state whether a reset of a feature section is recoverable, which is the one gap for a destructive tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with what it covers, then actions, hard rules and examples — a well-organized layout for a complex tool. The opening clause ('unified observability and restricted controllability') is jargon that carries no operational information, and the examples block is long relative to the rest.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, and the description compensates by describing the status response contents (settable_keys, config file health, conflicts, pending-restart flags, prerequisites). Combined with the restart workflow and error-path behavior, an agent has enough to call it correctly and interpret the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so per-parameter meaning is already documented; the description still adds value through worked examples, the null-removes-key convention, and the cross-parameter rule that confirm_sensitive is required when values touch connection targets or mirrors. The interaction with dry_run on both set and reset is clarified beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb pair (inspect/configure) and the exact resource (biomcp: three file-backed feature groups plus env-only parameters). The scope enumeration lets an agent distinguish it immediately from every sibling, which are all bio-data retrieval tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names each action and its trigger (status default with {}, set for atomic batch writes, reset for removals), states when to use filter instead of status, and excludes env parameters from set/reset. It also gives the operational sequence: finish prerequisites, restart once, re-call with {} to verify.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

discoverA
Read-only

Free-text concept resolution - find entities matching a free-text query. Prefers a candidate whose name/symbol exactly matches the query (case-insensitive), ranks those exact matches first across entity types, and demotes numbered susceptibility-locus labels (e.g. "lung cancer susceptibility 1") within each backend's candidates; each result's matched_on field reports why it was picked ("exact" or "first")

NameRequiredDescriptionDefault
queryYesFree-text query (e.g., "BRAF V600E", "lung cancer", "imatinib")

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint already covers safety, and the description adds real behavioral detail: exact-match preference, case-insensitivity, cross-entity-type ranking order, demotion of numbered susceptibility-locus labels, and matched_on values ('exact'/'first'). That is substantive beyond the annotation. It does not describe result ordering stability or limits, so not a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single tightly packed sentence that front-loads the core purpose before ranking nuance. No filler, and every clause carries behavioral information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description's explanation of the matched_on field is valuable and helps the agent interpret results. Remaining gaps (result volume, what entity fields are returned) are minor for a single-param read-only lookup.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

One parameter with 100% schema coverage, including examples in the schema, so baseline is 3. The description restates the concept of a free-text query but adds no syntax or format guidance beyond what the schema supplies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: resolves a free-text query to matching entities. The phrase 'across entity types' signals it is a cross-type resolver rather than a type-specific search, which distinguishes it implicitly from gene_search/disease_search, but no sibling is named.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by 'free-text concept resolution' and the multi-type ranking behavior, so an agent can infer it is for when the entity type is unknown. There is no explicit when-to-use or when-not clause, and no named alternative such as gene_search for type-specific lookups.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

disease_drugsA
Read-only

Get drugs for a disease via OpenTargets. Results are ranked by max clinical phase, then trial-report count, with salt forms collapsed. Response is an envelope: { results, warnings?, errors? } — OpenTargets failures and unresolved diseases ride in errors[] as { source, message, retryable? } instead of inline items (issue #130)

NameRequiredDescriptionDefault
limitNo
disease_idYesDisease ID

TDQS

A3.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well past the readOnly/openWorld annotations: it discloses the ranking order (max clinical phase, then trial-report count), that salt forms are collapsed, and the envelope shape with errors[] semantics including a retryable flag. That is exactly the kind of post-call behavior an agent cannot get from structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense and front-loaded: purpose first, then ranking, then response shape. Only the trailing '(issue #130)' tracker reference fails to earn its place as agent-facing information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the return-value burden and does so — envelope structure, ranking, and error taxonomy are all covered. What it omits is the per-drug result fields and any hint about valid disease ID namespaces, which matters because that is the required parameter.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50% (limit has no description at all) and the description never mentions limit or the expected disease_id format. It does add real signal about disease_id behavior — unresolved diseases land in errors[] rather than failing — which partially compensates but leaves the undocumented limit parameter unaddressed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — retrieve drugs associated with a disease — plus the upstream source (OpenTargets). The disease-scoped framing implicitly separates it from gene_drugs and drug_trials, though neither sibling is named.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied by the 'for a disease' scoping; there is no explicit when-to-use, when-not, or pointer to the adjacent gene_drugs / drug_trials / disease_get tools. An agent can guess the context but gets no routing help.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

disease_getC
Read-only

Get detailed disease information by ID

NameRequiredDescriptionDefault
limitNo
sectionsNoSections to include
disease_idYesDisease ID (e.g., "DOID:0060268", "MONDO:0007254", "OMIM:114480", or UMLS CUI "C0018794" — heart block, named via MedGen enrichment)

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds nothing beyond that: no mention of which sections are returned by default, whether missing IDs error or return empty, or that the response is compiled from external sources (open-world).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler. It is efficient, though the terseness borders on under-specification rather than tightness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description must carry the burden of explaining what 'detailed disease information' contains, and it does not — sections like gene_associations, phenotypes, and pathways go unmentioned. For a 3-parameter aggregation tool, this leaves the agent guessing about response contents and default scope.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67%, so disease_id is well documented in the schema with ID-format examples. However, the description says nothing about the 'sections' selector or the 'limit' cap, which are the two parameters most likely to change call behavior — it only restates the ID lookup.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Get') and resource ('detailed disease information') and the retrieval key ('by ID'). The 'by ID' phrasing implicitly separates it from disease_search, though no sibling is named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'by ID' hints that this is a lookup for a known identifier, but the description never says when to use this instead of disease_search or the related disease_drugs/disease_trials tools, nor what to do if only a name is known.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

disease_trialsB
Read-only

Get clinical trials for a disease. Response is an envelope: { results, warnings?, errors? } (issue #130)

NameRequiredDescriptionDefault
limitNo
disease_idYesDisease ID

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds real value by disclosing the response envelope shape (results, warnings, errors), but says nothing about pagination, truncation at the 50 limit, or ordering. The '(issue #130)' reference is internal noise rather than behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two compact sentences with the purpose front-loaded. The trailing issue-reference adds no value to an agent and is the only wasted token, keeping it just below 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description rightly explains the envelope return shape, which is the most important missing piece for a simple two-parameter read tool. It remains incomplete on the limit parameter's behavior and result ordering/pagination, which an agent needs to call it well.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 50%: disease_id's schema description is the tautological 'Disease ID', and limit has no description at all. The description repeats the disease scoping but explains nothing about the limit parameter's default of 20 or its 50 maximum, so it fails to compensate for the coverage gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get clinical trials') scoped to a disease, which naturally separates it from drug_trials and trial_search in the sibling list. It does not name those siblings explicitly, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied by the required disease_id parameter — an agent can infer 'use when you have a disease and want its trials.' There is no explicit statement of when to prefer trial_search or drug_trials instead, and no prerequisites or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

drug_getC
Read-only

Get detailed drug information by name

NameRequiredDescriptionDefault
nameYesDrug name (e.g., "imatinib", "aspirin")
limitNo
sectionsNoSections to include (adverse_events = FDA FAERS adverse reactions ranked by report count; limit applies to reaction rows; indications = OpenTargets indications ranked by max clinical phase descending, then trial-report count, then disease name; who_regulatory = WHO Prequalification listing only, ~650 global-health priority products — prequalified:false means not PQ-listed, not banned or unapproved anywhere; limit applies to product rows)

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds little beyond "detailed" — no mention of what sections or return shape to expect, and no pagination or open-world nuance of its own.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single tight sentence with no filler, front-loading the verb and resource. It is efficient but arguably over-terse for the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a get-by-name tool with no output schema, the description is thin and never mentions the selectable sections or return content, forcing the agent to read the schema. The schema's detailed sections field partly fills this, keeping it at minimal viable rather than inadequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67%: the schema richly documents name and sections, but limit is undocumented. The description adds no parameter meaning whatsoever, so it fails to compensate for the coverage gap and just leans on the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ("Get") and resource ("detailed drug information") with the input mode "by name," letting an agent distinguish it from drug_search at a high level. It does not explicitly name or contrast with any sibling, keeping it below the top mark.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description offers no guidance on when to use this versus drug_search or drug_trials, nor any prerequisite or exclusion. "By name" implies an identifier lookup but leaves the choice of tool to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

drug_trialsB
Read-only

Find clinical trials for a drug

NameRequiredDescriptionDefault
drugYesDrug name

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so safety is covered and the bar is lower. Beyond that the description adds nothing: no indication of return shape, result volume, pagination, or what identifier namespaces the drug must come from (e.g., must it match drug_search output).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One short, front-loaded clause with zero waste. It is efficient but borders on under-specification for a tool that has several look-alike siblings, so not a full 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple (one required param, read-only, no output schema), so little is needed, and the annotation plus schema cover the mechanics. Still missing is any hint of what the returned trials contain or how results are bounded, which an agent would want before calling.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

A single parameter with 100% schema description coverage, so the schema already carries the semantics; the description's 'for a drug' merely restates it. Baseline 3 applies since the schema does the heavy lifting and the description adds no format or naming guidance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (find) and resource (clinical trials) scoped to a drug, so the agent knows exactly what it retrieves. It does not differentiate from close siblings like gene_trials, disease_trials, variant_trials, or trial_search, leaving the agent to infer the distinction from parameter shape alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'for a drug' phrasing implies the use case (you have a drug identifier and want trials), but there are no explicit when-to-use rules, no named alternatives, and no exclusions against the four trial-adjacent siblings in the toolset.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ensembl_consequenceA
Read-only

Predict the functional consequence of a variant on demand via Ensembl VEP — works even for NOVEL variants absent from every database, and for non-human species.

Input forms: HGVS c./p./g. notation ("NM_004333:c.1799T>A", "NM_004333.6:c.1799T>A") or a dbSNP rsID ("rs113488060"). Prefer HGVS over rsIDs when both are available — rsIDs are resolved through dbSNP's coordinate mapping, which can yield less specific consequences. RefSeq accessions may carry a version ("NM_004333.6:c.1799T>A"); when the version is not carried by the current Ensembl release the call is retried against the bare accession and the result flags the reinterpretation in warnings. Per-species rules: the variant must be valid on a transcript of THAT species — RefSeq NM_ accessions work cross-species only when the transcript belongs to it (e.g. "NM_011640:c.100A>G" + species 'mouse' is mouse Trp53; a human NM_ fed to species 'mouse' fails). Ensembl transcript IDs (ENST…, ENSMUST…) are accepted for their own species, and c./p. positions must be in range for the transcript. Invalid input returns the upstream VEP error explaining what could not be mapped. Returns the most severe consequence plus per-transcript effects (impact, codon/amino-acid change, SIFT/PolyPhen where available) and co-located known variants (ClinVar/COSMIC IDs, gnomAD/1000G frequencies when present). For KNOWN human variants, variant_get additionally provides deep pre-computed scores (CADD, REVEL, AlphaMissense, ClinVar stars) — prefer it there.

NameRequiredDescriptionDefault
limitNoMax transcript consequences returned (sorted by impact severity)
speciesNoSpecies — 'human' (default), 'mouse', …human
variantYesHGVS notation (NM_004333:c.1799T>A) or dbSNP rsID (rs113488060)

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly and open-world, so safety is covered; the description adds genuine behavioral detail beyond that — automatic retry against the bare RefSeq accession when a version is stale, with the reinterpretation flagged in warnings, and invalid input surfacing the upstream VEP error explaining what could not be mapped. It also discloses the return payload (most severe consequence, per-transcript impact/codon change, SIFT/PolyPhen, co-located ClinVar/COSMIC/gnomAD data) with no output schema to do that work. Slightly short of a 5 only because rate limits or latency for on-demand VEP computation are not mentioned.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the capability that differentiates it, then organized into labeled input-forms / per-species / returns / alternative sections. Dense but every paragraph carries operational information; the parenthetical worked examples (mouse Trp53, human NM_ rejected by species 'mouse') are justified given how easy that misuse is.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

A three-parameter tool with no output schema, yet the description covers input syntax, species validity constraints, failure behavior, and the shape of the returned consequence data. Nothing an agent needs to invoke it correctly or interpret the response is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description goes well beyond the schema for the two non-trivial parameters: it enumerates accepted variant syntaxes (c./p./g. HGVS with or without version, rsID), gives concrete examples, and states the per-species validity rule that NM_ accessions only work when the transcript belongs to that species. The 'limit' parameter is left entirely to the schema, which is the only reason this is not a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (predict functional consequence) and resource (variant), and immediately scopes it with two differentiators no sibling claims: works on novel variants absent from any database, and works for non-human species. An agent can distinguish it from variant_get and variant_search from the first sentence alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit routing rules: prefer HGVS over rsIDs when both are available and explains why (dbSNP coordinate mapping yields less specific consequences); for known human variants prefer variant_get because it adds CADD/REVEL/AlphaMissense/ClinVar stars. Both the when-to-use and the when-to-use-something-else cases are named with reasons.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ensembl_homologyA
Read-only

Find orthologues or paralogues of a gene across species (Ensembl Compara) — the cross-species gene mapping source in biomcp.

Returns target stable IDs, gene symbols (when the assembly provides them, e.g. ARAF/RAF1 for BRAF paralogs), species, taxonomy level, and percent identity, sorted by identity. Accepts an HGNC symbol or Ensembl gene ID; scope to one species with target_species ('mouse') or target_taxon (10090). Use it for conservation questions ('is this gene conserved?', 'what is the mouse orthologue of BRAF?').

NameRequiredDescriptionDefault
geneYesGene symbol (BRAF) or Ensembl gene ID (ENSG00000157764)
typeNoHomology type to fetchorthologues
limitNoMaximum homologies to return (sorted by percent identity)
speciesNoSource species — 'human' (default), 'mouse', …human
target_taxonNoRestrict results to a taxon ID, e.g. 10090 (Mus musculus)
target_speciesNoRestrict results to one species, e.g. 'mouse'

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly and openWorld, so the description adds real value with return semantics: stable IDs, gene symbols when available, species, taxonomy level, percent identity, sorted by identity. It also notes the input form (HGNC symbol or Ensembl ID). No output schema exists, so this return-shape disclosure is the main behavioral signal, though pagination/truncation behavior at the limit cap isn't discussed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads purpose and the key differentiator before the return-field list and usage examples. Each sentence carries content, though the example parentheticals (ARAF/RAF1 for BRAF) are slightly verbose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only, six-parameter lookup with no output schema, the description covers purpose, input forms, scoping, and return fields, which is enough to call it correctly. It does not mention what happens on empty results or invalid species names, a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema coverage the baseline is 3, and the description still adds meaning beyond the schema: it explains the gene parameter accepts symbols or Ensembl IDs, demonstrates target_species ('mouse') and target_taxon (10090), and notes results are sorted by identity — clarifying how limit interacts with ordering.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Find orthologues or paralogues of a gene across species') and grounds it in the Ensembl Compara source, which separates it from the sibling ensembl_lookup/consequence/region tools that operate on a single gene or region. An agent can tell immediately what this returns: cross-species mappings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete trigger questions ('is this gene conserved?', 'what is the mouse orthologue of BRAF?') and explains how to narrow scope via target_species or target_taxon with an example value. It implies positioning ('the cross-species gene mapping source') without explicitly naming a sibling to use instead for within-species lookups.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ensembl_lookupA
Read-only

Resolve a gene in Ensembl terms for ANY Ensembl species (356 available): stable ID (ENSG…), symbol↔ID mapping, versioned identifier, canonical transcript, and coordinates on the current assembly (GRCh38 human, GRCm39 mouse, …). With expand=true, returns all transcripts with translation/protein IDs.

Accepts an HGNC symbol (BRAF) or Ensembl gene ID (ENSG00000157764, versioned or bare — versions are resolved to the current record). Species accepts scientific names or aliases ('homo_sapiens'/'human', 'mus_musculus'/'mouse'). For rich human gene annotation (summary, pathways, drugs, diseases) use gene_get instead — this tool is the identifier/structure authority.

NameRequiredDescriptionDefault
expandNoInclude all transcripts with translation/protein IDs
speciesNoSpecies name or alias — 'human' (default), 'mouse', 'mus_musculus', 'rat', …human
gene_or_idYesHGNC symbol (BRAF) or Ensembl gene ID (ENSG00000157764, versioned or bare)

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds meaningful behavior: 356 species, versioned IDs resolved to the current record, and expand returning all transcripts with translation/protein IDs. It does not describe error or ambiguity handling, so it falls short of the richest behavioral disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tightly written sentences, front-loaded with the core purpose, then input/species behavior, then the sibling-tool boundary. Parenthetical examples earn their place and no sentence is redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description still explains the key return content: stable ID, symbol↔ID mapping, canonical transcript, coordinates, and expanded transcripts with protein IDs. It is complete enough to call correctly, though it could say more about response shape or edge-case behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the schema already explains gene_or_id, species, and expand. The description still adds semantic value by clarifying that versioned and bare IDs are resolved to the current record and by giving species aliases across the 356-species scope.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Uses a specific verb and resource: 'Resolve a gene in Ensembl terms', then enumerates stable ID, symbol↔ID mapping, versioned identifiers, canonical transcript, and coordinates. It explicitly distinguishes itself from gene_get, so an agent can select it without opening sibling schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

States the exact use case (ANY Ensembl species), accepted inputs, species aliases, and the effect of expand=true. It also names the alternative gene_get for rich human annotation, making the boundary between the two tools explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ensembl_regionA
Read-only

Query what lives in a genomic interval on the current assembly (GRCh38 for human): genes/transcripts (stable IDs, symbols, biotypes) and known variants (rsIDs, alleles, consequence terms, clinical significance).

Ideal for locus triage — "what genes and known variants sit in this GWAS hit interval?". Genes/transcripts are always fetched for the FULL requested span, but variation density can reach ~100k variants in dense loci (which times out upstream), so when the span exceeds 50 kb variation is queried only for a 50 kb window centered on the region midpoint — the result echoes effective_variation_window (the coordinates actually queried for variation) and variation_truncated (names the dropped span) when this cap applies. To sweep variation across a large interval, issue adjacent region calls. Keep spans modest (<1 Mb recommended); output is capped at limit with a truncated marker. For sequence text use genbank_get; for entity-level annotation chain IDs into gene_get / variant_get.

NameRequiredDescriptionDefault
limitNoMaximum features returned
regionYesGenomic region chr:start-end (1-based, GRCh38 for human) — e.g. 7:140450000-140480000
speciesNoSpecies — 'human' (default), 'mouse', …human
featuresNoFeature types to include

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/openWorld, and the description goes further: it discloses the 50 kb variation window cap centered on midpoint, the echo fields effective_variation_window and variation_truncated, upstream timeout risk, and an output limit with truncation marker. This is unusually rich disclosure of behavior beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, then a clear layered structure (use case, cap behavior, limits, alternatives). Dense but every sentence carries information; the parenthetical field names are somewhat packed but earn their place. Slightly long for the tool's size.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, yet the description explains the notable return fields (effective_variation_window, variation_truncated, truncated marker), so an agent understands what it gets back. Combined with the cap and limit behavior, nothing essential for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds real semantics — the 50 kb cap applies to variation over the region span, and limit caps returned features with a truncated marker. It clarifies the region/cap interaction not spelled out in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('query what lives in') and resource (genomic interval) and enumerates the entities returned (genes/transcripts with IDs, symbols, biotypes; variants with rsIDs, alleles, consequence, clinical significance). It is immediately distinguishable from entity-level siblings like gene_get and variant_get, which it names.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit use case ('ideal for locus triage — what genes and known variants sit in this GWAS hit interval?'), explicit routing away to alternatives ('for sequence text use genbank_get; for entity-level annotation chain IDs into gene_get / variant_get'), and the alternative approach for large sweeps ('issue adjacent region calls').

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

genbank_genesA
Read-only

Map a GenBank/RefSeq nucleotide accession to its NCBI Gene IDs (elink nuccore→gene).

The returned gene_ids are NCBI Gene (entrezgene) IDs. gene_get takes an HGNC gene symbol, NOT a numeric entrez id, so an id must first be resolved to its symbol — gene_search result rows carry both symbol and entrez_id, so the id→symbol bridge exists via gene_search. Useful bridge from a sequence record to gene-level annotation.

NameRequiredDescriptionDefault
accessionYesGenBank/RefSeq accession, versioned or bare — e.g. NG_017013.2, NC_000023.11

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety and external-network profile is covered. The description still adds substantive value beyond that: it identifies the return values as NCBI entrezgene IDs (not symbols) and warns that they cannot be fed directly into gene_get, which prevents a real downstream misuse. It does not cover failure/empty-result behavior or rate limits, so not a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core mapping statement is front-loaded and the crucial caveat (numeric id ≠ symbol) follows immediately. The id→symbol bridge sentence is somewhat repetitive of the preceding sentence and could be tightened, but every element carries useful routing information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description correctly takes on the job of saying what comes back (a list of entrezgene IDs) and how to use it. What an agent still can't tell is cardinality or the behavior when an accession has no linked gene, which is a modest but real gap for a 1-param lookup.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter and schema description coverage is 100%, with the pattern and versioned/bare examples (NG_017013.2, NC_000023.11) already documented in the schema. The description adds no further parameter guidance, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource+mechanism: 'Map a GenBank/RefSeq nucleotide accession to its NCBI Gene IDs (elink nuccore→gene).' That distinguishes it from genbank_search/genbank_get (which retrieve records) and from gene_get/gene_search (which operate on symbols or gene queries), so an agent can route without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly frames the use case as a bridge from a sequence record to gene-level annotation, and names the downstream chain: gene_get takes a symbol not an entrez id, and gene_search rows carry both symbol and entrez_id, so the id→symbol bridge exists via gene_search. This is concrete when-to-use plus named alternatives rather than inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

genbank_getA
Read-only

Fetch a GenBank/RefSeq nucleotide record as text (GenBank flat file or FASTA).

Whole-record fetches are capped at 2,000,000 bp — larger records require a seq_start/seq_stop region (1-based, inclusive, up to 10 Mb span; set strand=2 for a reverse-strand slice where seq_start > seq_stop — the region field echoes the request as given, while NCBI's text shows complement(min..max)). Output: records up to 1,000 characters are returned inline (sequence_text with char_count/truncated). Anything larger defaults to file mode — the FULL text is written to a server-side cache file and the reply carries mode:"file", file_path, char_count, and total_char_count instead of sequence_text (never truncated); Read/Grep the file selectively. The cache is ephemeral (pruned after ~7 days / 500 files) and the path is server-local; re-call to regenerate. sequence_output:"inline" opts back into inline text capped at 200,000 characters — use it only if you cannot read server-side files.

NameRequiredDescriptionDefault
formatNoRecord format: genbank flat file (default) or fastagenbank
strandNoStrand: 1=plus (default), 2=minus (reverse slice; allows seq_start > seq_stop)
seq_stopNoRegion stop (1-based, inclusive)
accessionYesGenBank/RefSeq accession, versioned or bare — NC_000023.11, NG_017013.2, KJ668569.1, NC_000908.2
seq_startNoRegion start (1-based, inclusive) — required with seq_stop for records over 2 Mb
sequence_outputNoOutput mode: "file" (default) writes records over 1,000 characters whole to a server-side cache file and returns file_path + char counts (full data, never truncated); "inline" returns sequence_text inline, capped at 200,000 characters — use only if you cannot read server-side files
max_response_bytesNoHard cap on the raw NCBI response in characters (default 30,000,000) — oversized responses error instead of truncating

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the readOnly/openWorld annotations: discloses the 2 Mb whole-record cap, the 1,000-character inline threshold, file-mode caching with path/char counts, cache ephemerality (~7 days / 500 files), server-local path caveat, the 200,000-char inline cap, and that max_response_bytes errors rather than truncates.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and the size caps, and nearly every clause carries operational information. Some redundancy remains — the file/inline tradeoff is explained in the prose and again in the sequence_output schema description, which lengthens an already dense paragraph.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Seven parameters, two enums, and no output schema, so the description bears the full burden of describing returns — it does, enumerating sequence_text/char_count/truncated versus mode/file_path/char_count/total_char_count. An agent has everything needed to call and interpret results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, yet the description adds genuinely non-obvious semantics: the reverse-strand slice convention (strand=2 with seq_start > seq_stop), and the fact that the echoed region field preserves the request order while NCBI text renders complement(min..max). That resolves a real ambiguity the schema cannot express.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Fetch a GenBank/RefSeq nucleotide record as text', and names both output formats. The distinction from the sibling genbank_search (search vs. fetch by accession) is implied by the name and required accession parameter but never stated explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives conditional guidance for parameters — region required for records over 2 Mb, inline mode only if server-side files are unreadable — but never says when to choose this over genbank_search, sra_get, or ensembl_region. Usage must be inferred from the verb.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gene_articlesA
Read-only

Find articles about a gene. Response is an envelope: { results, warnings?, errors? } — per-backend failures ride in errors (never as items inside results), degradation notes in warnings (issue #130)

NameRequiredDescriptionDefault
symbolYesHGNC gene symbol

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=true; the description adds real value beyond that by spelling out the response envelope and, critically, that per-backend failures arrive in `errors` and never as items inside `results`, plus degradation notes in `warnings`. This is exactly the kind of non-obvious contract an agent needs to avoid misreading partial failures as empty results. No pagination or result-count guidance, keeping it from a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, purpose front-loaded, then the response contract. Every clause carries information. The trailing '(issue #130)' is internal tracking noise that adds nothing for an agent, a minor blemish.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description correctly shoulders the burden of explaining the return shape, including error and warning semantics. For a one-parameter read tool that is nearly complete; only result volume/pagination behavior is unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single `symbol` parameter is documented there as an HGNC gene symbol, so the schema does the work. The description adds no format, casing, or multi-symbol guidance beyond it. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Find articles about a gene.' An agent can immediately tell this is a gene-scoped article lookup, distinct from a generic article search. It stops short of naming the sibling (article_search) it should be weighed against, so it is clear but not fully differentiated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The gene-scoped framing implies when to use it — when you have a gene symbol and want literature — but there is no explicit when-to-use rule and no mention of article_search as the alternative for free-text or topic queries. Usage is inferable rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gene_diseasesA
Read-only

Get diseases associated with a gene. Requires DISGENET_API_KEY environment variable for DisGeNET data; falls back to OpenTargets gene-disease associations when unavailable.

NameRequiredDescriptionDefault
limitNo
symbolYesHGNC gene symbol

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so safety is covered. The description adds genuinely valuable behavioral context beyond that: a required DISGENET_API_KEY environment variable and a documented fallback to OpenTargets associations when it's absent, which tells the agent results may come from different sources.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, purpose front-loaded, and the environment/fallback caveat follows immediately. Nothing is redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description should hint at what is returned (disease names, association scores, sources), but it doesn't. The data-source fallback is well covered, but the undocumented 'limit' parameter and unstated return shape leave gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50%: 'symbol' is documented as an HGNC gene symbol in the schema, but 'limit' (default 10, max 50) is undocumented anywhere. The description adds no parameter-level detail, so it neither compensates for the gap nor harms; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (get diseases associated with a gene), which is unambiguous and distinguishable from gene_get or disease_search by direction of the lookup. It doesn't explicitly name a sibling to contrast with, but the scope is clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the use case (find diseases for a given gene) but gives no explicit when-to-use guidance, no exclusions, and doesn't point to alternatives like disease_search for the reverse lookup or gene_drugs for the drug angle. The API-key/fallback note is about data source, not tool selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gene_drugsA
Read-only

Find drugs targeting a gene. Results are ranked by max clinical phase, then trial-report count, with salt forms collapsed. Response is an envelope: { results, warnings?, errors? } — OpenTargets failures and unresolved genes ride in errors[] as { source, message, retryable? } instead of inline items (issues #130, #179)

NameRequiredDescriptionDefault
symbolYesHGNC gene symbol (e.g., "BRAF", "TP53")

TDQS

A3.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotation, the description discloses meaningful behavioral traits: ranking by max clinical phase then trial-report count, salt-form collapsing, and an envelope response with warnings and structured errors. It also explains how OpenTargets failures and unresolved genes appear in errors[] rather than inline results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded and the description is compact. However, the issue references "(#130, #179)" add internal noise that does not help an agent invoke the tool correctly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter read-only tool with no output schema, the description covers the important behavioral context: ranking, salt-form collapsing, and the response envelope with error semantics. It does not describe the fields of individual drug result items, leaving a minor gap in return-value detail.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the single symbol parameter is fully documented in the schema as an HGNC gene symbol. The description does not add meaning beyond that, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: "Find drugs targeting a gene." It is clear what the tool returns conceptually, but it does not explicitly differentiate this from sibling tools such as drug_search, gene_get, or gene_trials.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the use case of finding drugs for a gene, but it gives no explicit when-to-use guidance, exclusions, or alternatives. An agent must infer from the name and sibling list whether to call this versus gene_trials or drug_search.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gene_enrichA
Read-only

Perform pathway enrichment analysis for a gene list (Reactome over-representation). Requires at least 3 genes; the list is deduplicated (case-insensitive) before submission. Each pathway reports genes_overlap — the count of unique SUBMITTED genes Reactome matched there, resolved with one follow-up token lookup (Reactome's entity-level match count can exceed the gene count when one gene maps to multiple entities, e.g. a UniProt entry plus Ensembl gene/transcript). The reply also reports how many pathways Reactome found in total alongside the returned page. Typical completion is 15–45 s (the Reactome analysis takes 8–22 s per step across two sequential steps), with a worst case around 105 s including one retry per step; requires reachability of reactome.org, and clients whose request timeout is 60 s may need to raise it for large result follow-ups.

NameRequiredDescriptionDefault
genesYesList of HGNC gene symbols (minimum 3; duplicates and case variants are collapsed before submission)
limitNoMaximum pathways to return (1-100; Reactome reports up to ~100)

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the readOnlyHint annotation: discloses deduplication behavior, how genes_overlap is resolved via a follow-up entity lookup and why it can exceed the submitted gene count, expected latency (15–45 s, worst case ~105 s with retries), external reachability of reactome.org, and a concrete client-timeout caveat. This is exactly the operational context annotations cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose and hard requirement, then layers operational detail. It is long and somewhat run-on in the genes_overlap and timeout sentences, but nearly every clause carries useful information, so waste is minimal.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by explaining return semantics (genes_overlap count, total pathways found vs. returned page) and the two-step timing profile. An agent has enough to call it correctly and set expectations for latency and result interpretation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema already documents both parameters, including the min-3 rule, dedup behavior, and the 1–100 limit range. The description restates the gene-list constraints without adding new syntax or format guidance, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Perform pathway enrichment analysis for a gene list') and names the underlying method (Reactome over-representation), which distinguishes it from the many gene_* retrieval siblings like gene_diseases or gene_drugs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear preconditions for use — at least 3 genes, list deduplicated case-insensitively — and implies the scenario (you have a gene list and want pathways). It does not name an alternative tool or say when not to use it, so it stops short of the top score.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gene_getA
Read-only

Get detailed gene information by symbol. Response section keys mirror the requested section names: sections:["clinical_evidence"] returns sections.clinical_evidence, "protein_atlas" returns sections.protein_atlas, "dosage_sensitivity" returns sections.dosage_sensitivity, "disease_associations" returns sections.disease_associations — the legacy storage keys (civic, hpa, clingen, disgenet) never appear in responses.

NameRequiredDescriptionDefault
limitNo
smartNoWhen true, automatically resolves gene aliases and common names to the official HGNC symbol before lookup (e.g., "HER2" → "ERBB2"). Zero overhead when input is already a valid HGNC symbol.
symbolYesOfficial HGNC gene symbol (e.g., "BRAF", "TP53", "ERBB2"). Common aliases like "HER2" or "NEU" are NOT accepted unless smart=true is enabled.
sectionsNoSections to include

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the read-only/open-world safety profile, so the bar is lower, and the description clears it by disclosing real behavior: response section keys mirror requested section names and legacy storage keys (civic, hpa, clingen, disgenet) never appear. It omits other useful behavior — what happens for an unknown symbol, what limit constrains, and cost/latency of heavy sections like all.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first clause, and the second sentence carries the high-value key-mapping caveat. The mapping sentence is dense with repeated quoted examples and the "legacy storage keys never appear" clause is slightly verbose, but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description sensibly explains the response envelope's key structure, which is the most important return detail. However, for a 4-parameter lookup with a 16-value section enum it should also cover failure modes (invalid/unknown symbol), what limit governs, and how expensive "all" is.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 75% and symbol/smart are well documented there, but the sections param is described only as "Sections to include". The description adds the missing meaning by mapping section values to the exact response keys returned, which is information the schema does not provide. The limit parameter remains unexplained in both places.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Get detailed gene information by symbol") with the required key (symbol). It is clearly a single-entity lookup, but it never names the sibling it differs from (gene_search vs gene_get), so an agent must infer the distinction from naming convention alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: "by symbol" suggests you already have a valid HGNC symbol, and the note about legacy storage keys hints at the section-selection workflow. No explicit when-to-use/when-not-to-use guidance and no alternative tool (gene_search, gene_diseases, gene_drugs) is referenced, even though several siblings cover overlapping data.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gene_trialsA
Read-only

Find clinical trials for a gene

NameRequiredDescriptionDefault
symbolYesHGNC gene symbol

TDQS

A3.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already establishes that this is a safe read-only lookup, and the description does not contradict that. It adds no behavioral context beyond the annotation, such as result limits, data source, or whether the gene-to-trial association is direct or inferred.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence with no wasted text. It is appropriately sized for a simple one-parameter lookup tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a low-complexity, one-parameter read-only lookup, the description plus the fully documented schema and readOnlyHint are mostly sufficient. The main gap is that it does not clarify expected results or relationship to the broader trial_search family, but invocation is still clear.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the single parameter is documented as an HGNC gene symbol. The description's phrase 'for a gene' reinforces the parameter's purpose but adds no format or lookup details beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Find clinical trials,' scoped explicitly to 'a gene.' This distinguishes it from sibling tools such as drug_trials, disease_trials, and variant_trials by the entity the search is based on.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The scope implies that the tool should be used when looking up clinical trials associated with a gene. However, the description does not explicitly say when to prefer this over trial_search, drug_trials, disease_trials, or variant_trials, so routing remains partly inferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

geo_getA

Get the full SOFT record details for a GEO entry: series (GSE...), sample (GSM...), or platform (GPL...).

A series detail includes summary, organisms, platform_ids, a sample preview, supplementary file URLs, and cross-references for chaining: sra → sra_get(SRP.../SRR...), pubmed_ids → article_get, samples → geo_get(GSM...), platform_ids → geo_get(GPL...).

GDS accessions (curated DataSets, not served by SOFT) return structured guidance as data — { accession, guidance, see_also: { series: "GSE…", sample: "GSM…" } } — pointing at the underlying series/sample records; this is a successful result, not an error. Malformed accessions still fail at schema validation.

download=true additionally saves a supplementary file to a local temp path and returns its path, size, and source URL — the pick prefers .gz/.csv/.txt, else the first listed supplementary file (subject to max_bytes).

NameRequiredDescriptionDefault
downloadNoDownload a supplementary file to a local temp path (prefers .gz/.csv/.txt, else the first listed)
accessionYesGEO accession (GSE series, GSM sample, or GPL platform; GDS curated DataSets return structured guidance pointing at the underlying GSE/GSM)
max_bytesNoSize cap in bytes for the downloaded supplementary file (default 52428800 = 50 MB)

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false and openWorldHint=true; the description explains why a 'get' is not read-only — download=true writes a supplementary file to a local temp path and returns path/size/source URL. It also discloses the non-obvious GDS behavior (structured guidance returned as a successful result, not an error) and that malformed accessions fail schema validation, which is exactly the context an agent needs to interpret results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose in the first sentence, then chaining, then edge cases in descending priority — good ordering. The download paragraph duplicates the schema's file-preference wording and could be trimmed to a pointer.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description must describe returns and does so for series (summary, organisms, platform_ids, sample preview, supplementary URLs, cross-references), for GDS, and for download. Return shapes for GSM sample and GPL platform records are left unspecified, a minor but real gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the schema already documents the .gz/.csv/.txt preference and the max_bytes default, so the description largely restates structured data. It adds the 'subject to max_bytes' linkage between download and the size cap, but nothing beyond that; baseline 3 is appropriate when the schema carries the weight.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get the full SOFT record details for a GEO entry') and immediately enumerates the three accession families (GSE/GSM/GPL), which cleanly separates it from the geo_search sibling. An agent knows this is the record-fetch step, not the discovery step.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly maps returned cross-references to the follow-up tools (sra → sra_get, pubmed_ids → article_get, samples → geo_get(GSM...), platform_ids → geo_get(GPL...)), giving strong chaining context, and explains what happens with GDS accessions. It does not state the inverse condition (use geo_search first to obtain an accession), so the routing is clear but not fully bidirectional.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gtex_eqtlA
Read-only

Get significant cis-eQTL associations for a gene in a specific GTEx tissue (GTEx Analysis v10): variant_id, p_value, and NES (effect direction/size), sorted by ascending p-value.

tissue is a required GTEx tissueSiteDetailId (e.g. Whole_Blood, Brain_Cortex).

An empty associations list is a VALID scientific result — the gene was tested but has no significant cis-eQTLs in that tissue (not a lookup failure). In that case the result carries a note listing other tissues where significant eQTLs DO exist (or stating that none exist in any tissue).

NameRequiredDescriptionDefault
geneYesHGNC symbol (TP53) or Ensembl gene ID (ENSG00000141510, versioned or bare)
limitNoMaximum associations to return
tissueYesGTEx tissueSiteDetailId — required, e.g. Whole_Blood

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so safety is covered; the description adds genuinely new behavioral context beyond that — results are pre-filtered to significant associations, sorted ascending by p-value, and empty results carry an explanatory note rather than signaling failure. It does not mention the limit's truncation effects or pagination, but the value added is substantial.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short, front-loaded blocks: what it returns and how it's sorted first, required-parameter format second, and the empty-result caveat last. Every sentence carries operational value, with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the return-value burden and does so completely: named fields, sort order, and the meaning of an empty result plus its accompanying note. An agent has everything needed to call it and interpret the response.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so gene, tissue, and limit are already documented; the description only reinforces tissue examples and format. It adds marginal param meaning (significance filtering and ascending p-value ordering) rather than new per-parameter semantics, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Get significant cis-eQTL associations for a gene in a specific GTEx tissue') and enumerates the returned fields with a defined sort order. It is clearly distinguishable from sibling gtex_expression (expression levels) and from variant-level tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete usage context: tissue is required and must be a GTEx tissueSiteDetailId, with examples. It anticipates the main misread (empty list = valid negative result) and explains the fallback note. It does not explicitly route to an alternative tool (e.g., gtex_expression) when the goal is expression rather than eQTLs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gtex_expressionA
Read-only

Get median gene expression across GTEx tissues (GTEx Analysis v10, 54 tissue sites, TPM, sorted highest first).

Accepts an HGNC symbol (TP53) or Ensembl gene ID (ENSG00000141510, versioned or bare). Optionally filter to a single tissue via its tissueSiteDetailId (e.g. Brain_Cortex, Whole_Blood).

NameRequiredDescriptionDefault
geneYesHGNC symbol (TP53) or Ensembl gene ID (ENSG00000141510, versioned or bare)
limitNoMaximum tissues to return (highest expression first)
tissueNoGTEx tissueSiteDetailId filter, e.g. Brain_Cortex, Whole_Blood

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered; the description adds real context on top: dataset version (v10), 54 tissue sites, TPM normalization, and descending sort order. It stops short of noting that the default limit (20) truncates below the full 54 tissues or what occurs for an unknown gene/tissue.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, zero filler, with the core operation and dataset scope front-loaded and the input/optional-filter details second. Every clause (v10, 54 tissues, TPM, sort order) carries information an agent can act on.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description usefully characterizes the return (median TPM per tissue, ordered highest first). It is nearly complete for a read-only lookup, but omits how limit interacts with the 54-tissue ceiling and what the response looks like when a gene or tissue matches nothing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all three parameters are already documented in the schema, and the description largely restates them (gene formats, tissue example). It adds no semantics beyond the schema, such as case sensitivity for tissue IDs or how invalid tissue strings are handled, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get median gene expression across GTEx tissues') plus concrete dataset facts: GTEx Analysis v10, 54 tissue sites, TPM units, sorted highest first. That is enough to separate it from the only close sibling, gtex_eqtl, but the description never names that sibling or explicitly contrasts expression levels with eQTL associations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: accepts an HGNC symbol or Ensembl ID and optionally a tissueSiteDetailId filter. There is no statement about when to prefer this over gtex_eqtl, gene_get, or ensembl_lookup, and no guidance on behavior when a gene has no GTEx data.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

journal_metricsA
Read-only

Journal quality metrics — an open-access alternative to the Clarivate impact factor (IF). Returns the OpenAlex 2-year mean citedness score (an IF-style metric), h-index, i10-index, citation counts, open-access flag (is_oa), and quality-list tiers (e.g. medline, norway-2, jufo-3…). Accepts a journal name, NLM abbreviation (e.g. 'N Engl J Med'), or ISSN (e.g. '0028-0836'; article records carry journal_issn).

NameRequiredDescriptionDefault
limitNoMax results for name searches (exact lookups return one)
queryYesJournal name, NLM abbreviation (e.g. "N Engl J Med"), or ISSN (e.g. "0028-0836")

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint and openWorldHint; the description adds real behavioral context by enumerating the return payload (since there is no output schema) and noting that exact ISSN lookups collapse to a single result while name searches can return up to `limit`. It does not describe what happens on no-match or ambiguous name matches, which is the main remaining gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, both front-loaded: the first delivers purpose plus return shape, the second delivers accepted inputs plus the chaining hint. The long metric enumeration earns its space because there is no output schema to carry it.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the full burden of explaining returns and does so thoroughly, and both parameters are covered. It is not fully complete because match-ambiguity behavior and failure modes for an unrecognized journal are unstated, which matters for a read-only open-world lookup.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description genuinely adds meaning beyond the schema by noting that ISSNs live on article records (a data-source hint absent from the property description) and by clarifying the accepted identifier classes. The `limit` semantics are restated rather than extended, so it is not a full 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a precise verb+resource framing ('Journal quality metrics') and immediately enumerates what is returned: OpenAlex 2-year mean citedness, h-index, i10-index, citation counts, is_oa, and quality-list tiers. It also positions the tool relative to the well-known Clarivate impact factor, so an agent knows exactly what this produces and how it differs from a familiar alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a concrete workflow hint that no sibling tool offers: ISSN input can be sourced from 'article records carry journal_issn', which tells an agent how to chain this from article_search/article_get. What it does not do is state when-not to use it or name any sibling alternative, so it falls short of the full when/when-not/alternatives bar.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

patent_getA
Read-only

Get patent details by publication number (e.g. "US11027025B2", "EP3904939B1", "US20260240819A1"). Sections: abstract, claims (US fulltext via USPTO Public Search; EP/WO via EPO OPS when configured, otherwise Google Patents pages — see per-section source fields), citations (backward + forward), family, classifications. US claims may fall back to an unofficial Google Patents rendering when PPUBS is slow or unreachable — flagged in _warnings. Section failures are reported per section (inline error entry plus a _warnings note), never by failing the whole call.

NameRequiredDescriptionDefault
limitNoMax entries per section array
sectionsNoSections to include (default: core only)
patent_idYesPublication number, e.g. "US11027025B2"

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the readOnly/openWorld annotations: it enumerates available sections, names per-section data sources (USPTO PPUBS, EPO OPS, Google Patents), documents the claim-rendering fallback, explains _warnings flagging, and clarifies that section failures are reported inline rather than failing the whole call. This is exactly the behavioral context an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core action and examples, then layers on source/fallback detail. Dense but purposeful; the parenthetical source note and warning behavior each earn their place. Slightly heavy with nested parentheticals.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the burden and does so: it covers what sections return, how failures degrade gracefully, and how provenance is surfaced. An agent can call this correctly and interpret results without further documentation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds meaning by explaining what each requested section yields and that source provenance varies per section. It doesn't detail the limit parameter's per-array semantics, keeping it just short of the top.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Get) + resource (patent details) + lookup key (publication number) with concrete format examples. Clearly distinguishes this single-record retrieval from the sibling patent_search.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'by publication number' framing implies this is the detail-fetch step after finding an ID, but it never explicitly says to use patent_search first nor states any when-not conditions. Usage is inferable rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pdbA

Access the Protein Data Bank (RCSB PDB) for macromolecular structure data.

SEARCH: Provide "query" to find structures (e.g., "kinase inhibitor", "hemoglobin"). GET: Provide "pdb_id" to retrieve entry metadata with optional detail sections. Sections list per-entity records (polymer_entities, ligands, assembly); when some records fail while siblings succeed, each failure appears as an inline {_error} item AND the response carries a top-level "warnings" array naming the section and failed item. DOWNLOAD: Provide "pdb_id" + download=true to save the structure file and get the file path.

NameRequiredDescriptionDefault
limitNoMax search results
queryNoFree-text search query to find PDB entries. Omit pdb_id when searching.
formatNoFile format: "cif" (mmCIF, recommended, always available) or "pdb" (legacy format, may not exist for some entries). Only used with download=true.cif
offsetNoSearch result offset
pdb_idNoPDB identifier (e.g., "1CRN", "4HHB"). Required for get/download.
downloadNoSave the structure file to disk and return the file path. Only used with pdb_id.
sectionsNoMetadata sections: polymer_entities (chains and sequences), ligands (small molecules and ions), assembly (biological assembly), experiment (method, resolution), citation (publication). Use "all" for everything. Default: core summary only.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false and openWorldHint=true; the description is consistent with this by noting that download writes a file to disk and returns the path. It also adds genuine non-schema behavior: per-record {_error} items and a top-level warnings array when section records partially fail. Missing only auth/rate-limit info, which would push it to a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the tool's purpose, then cleanly segmented into SEARCH/GET/DOWNLOAD labels. The warnings sentence is dense but carries unique behavior, and there is no filler; slightly tightening the section-records clause would make it a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 7 optional parameters, no output schema, and only minimal annotations, the description does the heavy lifting needed for correct invocation: mode selection, file-writing behavior, and error/warning handling. Return-value detail is only partially covered for search results, keeping it just shy of a 5.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter (query, pdb_id, format, sections, limit, offset, download) is already documented in the schema. The description reinforces mode combinations (query omits pdb_id; sections list per-entity records) but adds no syntax or format detail beyond what the schema provides, so baseline 3 fits.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb/resource ('Access the Protein Data Bank for macromolecular structure data') and explicitly breaks the tool into three distinct operations (SEARCH, GET, DOWNLOAD). An agent can immediately tell what the tool does and which operation it needs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit mode-selection rules: use query to search, pdb_id to get metadata, pdb_id + download=true to save the file. The omission of a 'when not to use' or sibling comparison is minor since no other PDB tool exists in the sibling list, but the conditional guidance per mode is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

preprint_fulltextA
Read-only

On-demand bioRxiv/medRxiv preprint full text (JATS XML, parsed to sections). Input: a preprint DOI (e.g. "10.1101/2025.03.05.641768"), optional version (default: latest). Downloads are strictly on-demand (never run during search), paced, and cached per (doi, version) — JATS per version is immutable, so repeat calls are served from cache without re-downloading. www.biorxiv.org rate-limits aggressively: on a 429/Cloudflare verdict this tool pauses downloads for >=60s (Retry-After honored) and every call during the cooldown returns an honest unavailable/rate_limited envelope with retry_after_sec — cached copies are still served instantly. The per-article license (cc by, cc by-nc-nd, na, ...) rides on every reply and governs reuse; for corpus-scale text mining use the bioRxiv/medRxiv monthly S3 buckets (see https://www.biorxiv.org/tdm). Output "file" (default): complete text written to a server-side markdown file, reply carries file_path + outline (Read/Grep selectively); "inline": capped text sections (fulltext_max_chars, default 40000).

NameRequiredDescriptionDefault
idYesbioRxiv/medRxiv preprint DOI (e.g. "10.1101/2021.10.25.465764", "10.64898/2026.08.11.744243"); journal-article identifiers are rejected — use article_get for those
outputNo"file" (default): complete text in a server-side markdown file; the reply carries file_path + outline. "inline": text sections returned inline, capped by fulltext_max_chars.
versionNoPreprint version to fetch (default: latest). Pinned versions are served from cache with zero network when already fetched.
fulltext_max_charsNoInline-mode only (output="inline"); default 40000. Ignored in file mode — files carry the complete text (2MB safety cap).

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnly/openWorld, but the description adds substantial operational context: per-(doi,version) caching, immutability of JATS per version, aggressive rate limiting with >=60s cooldown, 429/Cloudflare handling, retry_after_sec envelopes, and per-article license carriage. This is exactly the kind of behavior an agent needs and cannot get from annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but front-loaded: purpose, input, on-demand policy, rate-limit behavior, license, output modes in a logical order. It is longer than strictly necessary — the rate-limit and caching points are each stated with some redundancy — but nearly every sentence carries operational value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no output schema, the description fully explains both return shapes (file_path + outline vs. capped inline sections) and the failure envelope. Combined with the four fully documented parameters, an agent has everything needed to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description goes further by explaining why version is cacheable (immutable JATS per version), that fulltext_max_chars is inline-only and ignored in file mode, and that pinned versions serve with zero network. Sibling-tool rejection of journal DOIs is also reinforced.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("preprint full text" from bioRxiv/medRxiv, JATS XML parsed to sections) and names the DOI input format. It is clearly distinguishable from article_get, which the schema explicitly routes journal-article identifiers to.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says downloads are strictly on-demand and never run during search, and redirects corpus-scale text mining to the bioRxiv/medRxiv S3 buckets. It does not, however, directly name the sibling to use for journal articles or for metadata-only lookups within the description text itself.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

sra_getA
Read-only

Get full details for an SRA accession indexed by NCBI: run (SRR/ERR/DRR — instrument, spots, bases, size), experiment (SRX/ERX/DRX — library design), study (SRP/ERP/DRP — experiment list), or sample (SRS/ERS/DRS). NCBI SRA indexes NCBI, European (ENA), and DDBJ submissions alike, so accessions returned by sra_search resolve here regardless of prefix.

Chain from geo_get (sra field) or sra_search (experiment_accession / first_run_accession).

NameRequiredDescriptionDefault
accessionYesSRA accession: run (SRR/ERR/DRR), experiment (SRX/ERX/DRX), study (SRP/ERP/DRP), or sample (SRS/ERS/DRS), e.g. SRR14432476

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds real value beyond that: it discloses that coverage spans NCBI, ENA, and DDBJ submissions and specifies the payload shape per accession type. It stops short of noting error behavior for unknown accessions or any rate/latency considerations, keeping it at 4 rather than 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short paragraphs with no filler: the capability and prefix taxonomy lead, and the chaining guidance follows. Every clause adds either scope, coverage, or routing information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With only one parameter, no output schema, and annotations covering safety, the description covers everything an agent needs: what accession to pass, where to obtain it, what each type returns, and cross-database prefix coverage. Nothing material is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and includes a regex plus example, so the schema already carries the syntax burden. The description goes further by mapping each prefix family (SRR/ERR/DRR, SRX/ERX/DRX, etc.) to the entity and returned content, giving the agent semantic meaning beyond the pattern.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Get full details for an SRA accession") and immediately enumerates the four accession classes (run/experiment/study/sample) plus what each yields, so an agent knows exactly what comes back before calling. It is clearly distinguished from sra_search (search) and geo_get (upstream source) by name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent: "Chain from geo_get (sra field) or sra_search (experiment_accession / first_run_accession)," naming the fields that supply the argument. It also preempts a likely failure mode by noting that ENA and DDBJ-prefixed accessions returned by sra_search resolve here, so the agent doesn't hesitate on non-SRR ids.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

trial_getC
Read-only

Get detailed trial information by NCT ID

NameRequiredDescriptionDefault
limitNo
nct_idYesNCT ID (e.g., "NCT01234567")
sectionsNoSections to include

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. Beyond that the description adds nothing: it does not say what 'detailed' means, that results can be scoped by the sections array, or how the limit parameter affects the response.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no waste, but the terseness comes at the cost of under-specification rather than efficiency.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description must convey what a 'detailed' result contains and how sections/limit shape it; it does neither. For a 3-parameter retrieval tool this leaves the agent guessing about response scope.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67%; nct_id and sections have inline descriptions but limit has none. The description mentions only nct_id and ignores the sections parameter, which materially changes what comes back (core/eligibility/locations/outcomes/all) — the most important parameter to explain is left to the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a clear verb (Get) and resource (detailed trial information) plus the lookup key (NCT ID). It does not distinguish itself from the sibling trial_search, which is presumably the search-based counterpart, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'by NCT ID' implies this is the keyed-lookup counterpart to trial_search, but the description never names the alternative or states when to prefer it. Usage is inferable rather than explicit, and no prerequisites are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

variant_getA
Read-only

Get detailed variant information with optional sections. Core data (id, gene, rsid, significance) is always returned at the top level. Use sections to request additional data. Response section keys mirror the requested section names: sections:["alphagenome_scores"] returns sections.alphagenome_scores — the legacy storage key (alphagenome) never appears in responses.

NameRequiredDescriptionDefault
idYesVariant ID (rsid e.g. rs113488022, HGVS e.g. NM_004333.4:c.1799T>A, ClinVar ID e.g. 13961 / clinvar_13961 / VCV0000013961). Multi-allelic rsIDs (one ClinVar allele per ALT, e.g. rs28934575): the top-level record is ONE allele, chosen by gnomad-availability — all alleles are returned under 'alleles' with a '_warning' naming the reflected allele; to select an exact allele use allele-qualified HGVS (e.g. NM_000546.5:c.733G>T), where the transcript version must match the indexed snpeff annotation (NM_000546.5 works; ClinVar's NM_000546.6 does not)
limitNo
sectionsNoSections to include: core, frequency, predictions, clinical, alphagenome_scores (currently unavailable — returns an error stub pending AlphaGenome gRPC reimplementation)

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, and the description adds real behavioral payload beyond them: the guaranteed top-level core fields, the key-mirroring rule for response sections, and the guarantee that the legacy 'alphagenome' key never surfaces. It omits the failure mode of the alphagenome_scores section and what limit actually constrains, but the response-shape disclosure is valuable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first sentence, followed by return-shape facts in a logical order with no filler. The final sentence on the legacy key is slightly niche but earns its place as an anti-confusion rule for agents parsing responses.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description does the needed work of describing the return envelope (core fields at top level, section keys mirroring requests). Combined with the thorough id schema and the safety annotations, an agent has enough to call it; only the unexplained limit parameter and the unmentioned error stub keep it short of full completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67%: id and sections are richly documented in the schema itself, so the description's main contribution is the section-name-to-response-key mapping, which is genuinely additive. The limit parameter has no description anywhere, and the description doesn't explain what it limits in a single-variant lookup, leaving a real semantic gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ("Get detailed variant information") and clarifies that core fields are always returned while others are opt-in. It clearly reads as a detail-fetch counterpart to variant_search, though it never names that sibling explicitly to differentiate the two.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Use sections to request additional data" gives guidance on how to widen the response, which implies the default lightweight path. However, there is no explicit when-to-use condition versus variant_search, no prerequisite notes, and no warning that one of the listed sections fails.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

variant_oncokbB
Read-only

Get OncoKB annotations for a variant in a cancer gene. Requires ONCOKB_TOKEN environment variable.

NameRequiredDescriptionDefault
geneYesGene symbol (e.g., BRAF, EGFR)
protein_changeYesProtein change (e.g., V600E, L858R)

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety and external-call behavior are covered. The description adds a genuinely useful operational prerequisite not present in structured fields – the ONCOKB_TOKEN environment variable – but says nothing about behavior when the token is missing, rate limits, or partial/absent annotations for a variant.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the purpose and followed by the prerequisite; nothing is padded. It is perhaps overly terse given the tool's domain complexity, but no sentence is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Inputs are fully covered by the schema and there is no output schema to explain, but the description gives no hint of what OncoKB annotations contain (e.g., oncogenicity, evidence level, therapies), which matters for an agent deciding whether this tool answers its question. Adequate but with a clear gap given the specialized data source.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with both 'gene' and 'protein_change' documented with examples (BRAF, V600E), so the schema carries the load. The description only restates the entities at a high level and adds no format or validation semantics beyond it – baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb+resource: 'Get OncoKB annotations for a variant in a cancer gene' clearly identifies the data source (OncoKB) and the input entity (variant), distinguishing it from generic siblings like variant_get or variant_search. It does not explicitly name the sibling it differs from, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to prefer this over variant_get, variant_search, or gene_get, nor any exclusion conditions. The only contextual hint is the phrase 'in a cancer gene', which implies oncology relevance but leaves the choice between siblings to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

variant_trialsA
Read-only

Find clinical trials for a variant. Response is an envelope: { results, warnings? } — when MyVariant.info ID resolution fails, a warning rides alongside the results (which then come from searching the raw identifier) so a backend failure never masquerades as "no trials exist"; retry may resolve BRAF V600E-style naming (issue #198)

NameRequiredDescriptionDefault
variantYesVariant ID (rsID, HGVS, or variant ID)

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=true, while the description adds meaningful behavior: the response envelope { results, warnings? }, warning propagation when MyVariant.info ID resolution fails, and retry guidance. It does not explain pagination or detailed result contents, but it substantially exceeds the annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded in the first sentence, followed by a compact response and failure-mode note. The second sentence is dense with nested clauses, but every part contributes useful behavioral context.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Because there is no output schema, the description must carry return-value context, and it does so with the envelope and warning explanation. For a simple one-parameter read tool this is nearly complete, though it still lacks explicit routing guidance among sibling trial tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the schema already documents the single 'variant' parameter as an rsID, HGVS, or variant ID. The description adds resolution-failure context and mentions BRAF V600E-style naming retry, but does not add new accepted formats beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Find clinical trials for a variant.' The variant scoping implicitly distinguishes it from gene_trials, disease_trials, and trial_search, but the description does not explicitly name those alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool versus sibling trial tools such as gene_trials, disease_trials, drug_trials, or trial_search. The retry note addresses failed ID resolution, not tool selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 43 tool updatesv1.6.0-alpha.10
    • Changedarticle_get1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedarticle_search2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / offset / maximum
        Added value: +9007199254740991
    • Changedbatch_get2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedInput schema / properties / inputs / items / additionalProperties
        Removed value: -false
    • Changedbiomcp_configure2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / values / propertyNames
        Added value: +{
        +  "maxLength": 256,
        +  "type": "string"
        +}
    • Changeddiscover1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changeddisease_drugs1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changeddisease_get1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changeddisease_search2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / offset / maximum
        Added value: +9007199254740991
    • Changeddisease_trials1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changeddrug_get1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changeddrug_search2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / offset / maximum
        Added value: +9007199254740991
    • Changeddrug_trials1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedensembl_consequence1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedensembl_homology3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / target_taxon / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / target_taxon / minimum
        Added value: +-9007199254740991
    • Changedensembl_lookup1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedensembl_region1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedgenbank_genes1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedgenbank_get7 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / max_response_bytes / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / seq_start / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / seq_stop / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / strand / anyOf
        Added value: +[
        +  {
        +    "const": 1,
        +    "type": "number"
        +  },
        +  {
        +    "const": 2,
        +    "type": "number"
        +  }
        +]
      • removedInput schema / properties / strand / enum
        Removed value: -[
        -  1,
        -  2
        -]
      • removedInput schema / properties / strand / type
        Removed value: -"number"
    • Changedgenbank_search2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / offset / maximum
        Added value: +9007199254740991
    • Changedgene_articles1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedgene_diseases1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedgene_drugs1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedgene_enrich1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedgene_get1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedgene_search2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / offset / maximum
        Added value: +9007199254740991
    • Changedgene_trials1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedgeo_get2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / max_bytes / maximum
        Added value: +9007199254740991
    • Changedgeo_search2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / offset / maximum
        Added value: +9007199254740991
    • Changedgtex_eqtl1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedgtex_expression1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Addedjournal_metrics
    • Changedpatent_get1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedpatent_search2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / offset / maximum
        Added value: +9007199254740991
    • Changedpdb2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / offset / maximum
        Added value: +9007199254740991
    • Changedpreprint_fulltext2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / version / maximum
        Added value: +9007199254740991
    • Changedsra_get1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedsra_search2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / offset / maximum
        Added value: +9007199254740991
    • Changedtrial_get1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedtrial_search1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedvariant_get1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedvariant_oncokb1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedvariant_search2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / offset / maximum
        Added value: +9007199254740991
    • Changedvariant_trials1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
  2. 32 tool updatesv1.6.0-alpha.7
    • Changedarticle_get2 fields changed
      • addedInput schema / properties / id / minLength
        Added value: +1
      • addedInput schema / properties / id / pattern
        Added value: +"^(?:\\d+|PMC\\d+(?:\\.\\d+)?|(?:doi:)?10\\.\\d{4,}\\/\\S+)$"
    • Changedbatch_get1 field changed
      • addedInput schema / properties / inputs / items / properties / id / minLength
        Added value: +1
    • Changeddisease_drugs1 field changed
      • addedInput schema / properties / disease_id / minLength
        Added value: +1
    • Changeddisease_get1 field changed
      • addedInput schema / properties / disease_id / minLength
        Added value: +1
    • Changeddisease_trials1 field changed
      • addedInput schema / properties / disease_id / minLength
        Added value: +1
    • Changeddrug_get3 fields changed
      • addedInput schema / properties / name / minLength
        Added value: +1
      • changedInput schema / properties / sections / description
        Previous value: -"Sections to include (adverse_events = FDA FAERS adverse reactions ranked by report count; limit applies to reaction rows)"New value: +"Sections to include (adverse_events = FDA FAERS adverse reactions ranked by report count; limit applies to reaction rows; indications = OpenTargets indications ranked by max clinical phase descending, then trial-report count, then disease name; who_regulatory = WHO Prequalification listing only, ~650 global-health priority products — prequalified:false means not PQ-listed, not banned or unapproved anywhere; limit applies to product rows)"
      • changedInput schema / properties / sections / items / enum
        Previous value: -[
        -  "core",
        -  "us_regulatory",
        -  "eu_regulatory",
        -  "who_regulatory",
        -  "safety",
        -  "targets",
        -  "indications",
        -  "adverse_events",
        -  "all"
        -]New value: +[
        +  "core",
        +  "us_regulatory",
        +  "who_regulatory",
        +  "safety",
        +  "targets",
        +  "indications",
        +  "adverse_events",
        +  "all"
        +]
    • Changeddrug_trials1 field changed
      • addedInput schema / properties / drug / minLength
        Added value: +1
    • Changedensembl_consequence1 field changed
      • addedInput schema / properties / variant / minLength
        Added value: +1
    • Changedensembl_homology1 field changed
      • addedInput schema / properties / gene / minLength
        Added value: +1
    • Changedensembl_lookup1 field changed
      • addedInput schema / properties / gene_or_id / minLength
        Added value: +1
    • Changedensembl_region1 field changed
      • addedInput schema / properties / region / minLength
        Added value: +1
    • Changedgenbank_genes2 fields changed
      • addedInput schema / properties / accession / minLength
        Added value: +1
      • addedInput schema / properties / accession / pattern
        Added value: +"^[A-Z]{1,6}_?\\d+(?:\\.\\d+)?$"
    • Changedgenbank_get3 fields changed
      • addedInput schema / properties / accession / minLength
        Added value: +1
      • addedInput schema / properties / accession / pattern
        Added value: +"^[A-Z]{1,6}_?\\d+(?:\\.\\d+)?$"
      • addedInput schema / properties / sequence_output
        Added value: +{
        +  "description": "Output mode: \"file\" (default) writes records over 1,000 characters whole to a server-side cache file and returns file_path + char counts (full data, never truncated); \"inline\" returns sequence_text inline, capped at 200,000 characters — use only if you cannot read server-side files",
        +  "enum": [
        +    "file",
        +    "inline"
        +  ],
        +  "type": "string"
        +}
    • Changedgene_articles1 field changed
      • addedInput schema / properties / symbol / minLength
        Added value: +1
    • Changedgene_diseases1 field changed
      • addedInput schema / properties / symbol / minLength
        Added value: +1
    • Changedgene_drugs1 field changed
      • addedInput schema / properties / symbol / minLength
        Added value: +1
    • Changedgene_get1 field changed
      • addedInput schema / properties / symbol / minLength
        Added value: +1
    • Changedgene_trials1 field changed
      • addedInput schema / properties / symbol / minLength
        Added value: +1
    • Changedgeo_get2 fields changed
      • changedInput schema / properties / accession / description
        Previous value: -"GEO accession (GSE series, GSM sample, or GPL platform; GDS curated DataSets return guidance pointing at the underlying GSE/GSM)"New value: +"GEO accession (GSE series, GSM sample, or GPL platform; GDS curated DataSets return structured guidance pointing at the underlying GSE/GSM)"
      • changedInput schema / properties / download / description
        Previous value: -"Download the first supplementary file (.gz) to a local temp path"New value: +"Download a supplementary file to a local temp path (prefers .gz/.csv/.txt, else the first listed)"
    • Changedgtex_eqtl2 fields changed
      • addedInput schema / properties / gene / minLength
        Added value: +1
      • addedInput schema / properties / tissue / minLength
        Added value: +1
    • Changedgtex_expression1 field changed
      • addedInput schema / properties / gene / minLength
        Added value: +1
    • Changedpatent_get2 fields changed
      • addedInput schema / properties / patent_id / minLength
        Added value: +1
      • addedInput schema / properties / patent_id / pattern
        Added value: +"^[A-Z]{2}(?:RE|PP|H)?(?:[ /]*\\d){4,}[ /]*(?:[A-Z][ /]*\\d{0,2})?$"
    • Changedpatent_search2 fields changed
      • changedInput schema / properties / assignee / description
        Previous value: -"Filter by assignee/applicant organization, e.g. \"Moderna\""New value: +"Filter by assignee/applicant organization, e.g. \"Novartis\""
      • changedInput schema / properties / query / description
        Previous value: -"Free-text query; quote exact multi-word concepts like \"mRNA display\" for precise matching"New value: +"Free-text query; quote exact multi-word concepts like \"flow cytometry\" for precise matching"
    • Changedpreprint_fulltext2 fields changed
      • addedInput schema / properties / id / minLength
        Added value: +1
      • addedInput schema / properties / id / pattern
        Added value: +"^10\\.1101\\/\\d{4}\\.\\d{2}\\.\\d{2}\\.\\d+$|^10\\.64898\\/\\S+$"
    • Changedsra_get3 fields changed
      • changedInput schema / properties / accession / description
        Previous value: -"NCBI SRA accession: SRP (study), SRX (experiment), SRR (run), or SRS (sample), e.g. SRR14432476"New value: +"SRA accession: run (SRR/ERR/DRR), experiment (SRX/ERX/DRX), study (SRP/ERP/DRP), or sample (SRS/ERS/DRS), e.g. SRR14432476"
      • addedInput schema / properties / accession / minLength
        Added value: +1
      • addedInput schema / properties / accession / pattern
        Added value: +"^[EDS]R[PXRS]\\d+$"
    • Changedsra_search1 field changed
      • changedInput schema / properties / query / description
        Previous value: -"Free text or accession — SRP study, SRX experiment, SRR run, SRS sample, or terms like \"RNA-SEQ AND Homo sapiens[Organism]\""New value: +"Free text or accession — SRP study, SRX experiment, SRR run, SRS sample (ENA/DDBJ ERP/ERX/DRP/DRX… counterparts also work), or terms like \"RNA-SEQ AND Homo sapiens[Organism]\""
    • Changedtrial_get2 fields changed
      • addedInput schema / properties / nct_id / minLength
        Added value: +1
      • addedInput schema / properties / nct_id / pattern
        Added value: +"^NCT\\d{8}$"
    • Changedtrial_search2 fields changed
      • changedInput schema / properties / intervention_type / description
        Previous value: -"Filter by intervention type (Drug, Device, etc.)"New value: +"Filter by intervention type (Drug, Device, etc.); verifiable per row via the \"interventions\" strings (\"TYPE: name\")"
      • changedInput schema / properties / phase / description
        Previous value: -"Filter by phase (Phase 1, Phase 2, etc.)"New value: +"Filter by phase (Phase 1, Phase 2, etc.). The matched phase(s) are echoed per row in the \"phase\" array (e.g. [\"PHASE1\",\"PHASE2\"]) so the filter is verifiable from each result"
    • Changedvariant_get1 field changed
      • addedInput schema / properties / id / minLength
        Added value: +1
    • Changedvariant_oncokb2 fields changed
      • addedInput schema / properties / gene / minLength
        Added value: +1
      • addedInput schema / properties / protein_change / minLength
        Added value: +1
    • Changedvariant_search6 fields changed
      • addedInput schema / properties / gene / minLength
        Added value: +1
      • addedInput schema / properties / hgvsc / minLength
        Added value: +1
      • addedInput schema / properties / hgvsp / minLength
        Added value: +1
      • changedInput schema / properties / min_cadd / description
        Previous value: -"Minimum CADD score"New value: +"Minimum CADD score; echoed per row as cadd_phred so the filter is verifiable from each result"
      • addedInput schema / properties / query / minLength
        Added value: +1
      • addedInput schema / properties / rsid / minLength
        Added value: +1
    • Changedvariant_trials1 field changed
      • addedInput schema / properties / variant / minLength
        Added value: +1
  3. 5 tool updatesv1.6.0-alpha.3
    • Changedarticle_search2 fields changed
      • changedInput schema / properties / dateRange / description
        Previous value: -"Date range as YYYY-MM-DD/YYYY-MM-DD. Open-ended: \"2020-01-01/\" or \"/2023-12-31\". Only pubmed, europepmc, semantic_scholar, preprint_only, and arxiv support this."New value: +"Date range as YYYY-MM-DD/YYYY-MM-DD. Open-ended: \"2020-01-01/\" or \"/2023-12-31\". Only pubmed, europepmc, semantic_scholar, preprint_only, and arxiv support this. On pubmed, the upstream filter matches epub dates (pdat), so results are additionally post-filtered on the displayed publication date."
      • changedInput schema / properties / query / description
        Previous value: -"Search query (title, abstract, or keyword). Journal scoping: PubMed matches full journal names and NLM abbreviations; EuropePMC JOURNAL:\"...\" filters require the NLM abbreviation (e.g. \"N Engl J Med\")"New value: +"Search query (title, abstract, or keyword). Journal scoping (pubmed/europepmc): a trailing full journal name recognized from the bundled NLM title list is automatically rewritten to the NLM abbreviation (e.g. \"... New England Journal of Medicine\" → \"N Engl J Med[Journal]\" / JOURNAL:\"N Engl J Med\") and disclosed in response warnings; otherwise supply the NLM abbreviation (e.g. \"N Engl J Med\") or PubMed \"Abbr[Journal]\" field syntax — full journal names NOT recognized by the NLM list are not matched by PubMed/EuropePMC journal scoping."
    • Changeddisease_get1 field changed
      • changedInput schema / properties / disease_id / description
        Previous value: -"Disease ID (e.g., \"DOID:0060268\", \"MONDO:0007254\", \"OMIM:114480\", or UMLS CUI \"C0018794\")"New value: +"Disease ID (e.g., \"DOID:0060268\", \"MONDO:0007254\", \"OMIM:114480\", or UMLS CUI \"C0018794\" — heart block, named via MedGen enrichment)"
    • Changedgenbank_get1 field changed
      • changedInput schema / properties / accession / description
        Previous value: -"GenBank/RefSeq accession, versioned or bare — NC_000023.11, NG_017013.2, KJ668569.2"New value: +"GenBank/RefSeq accession, versioned or bare — NC_000023.11, NG_017013.2, KJ668569.1, NC_000908.2"
    • Addedpreprint_fulltext
    • Changedvariant_get1 field changed
      • changedInput schema / properties / id / description
        Previous value: -"Variant ID (rsid e.g. rs113488022, HGVS e.g. NM_004333.4:c.1799T>A, ClinVar ID e.g. 13961 / clinvar_13961 / VCV0000013961)"New value: +"Variant ID (rsid e.g. rs113488022, HGVS e.g. NM_004333.4:c.1799T>A, ClinVar ID e.g. 13961 / clinvar_13961 / VCV0000013961). Multi-allelic rsIDs (one ClinVar allele per ALT, e.g. rs28934575): the top-level record is ONE allele, chosen by gnomad-availability — all alleles are returned under 'alleles' with a '_warning' naming the reflected allele; to select an exact allele use allele-qualified HGVS (e.g. NM_000546.5:c.733G>T), where the transcript version must match the indexed snpeff annotation (NM_000546.5 works; ClinVar's NM_000546.6 does not)"
  4. 6 tool updatesv1.6.0-alpha.2
    • Changeddisease_get1 field changed
      • changedInput schema / properties / disease_id / description
        Previous value: -"Disease ID (e.g., \"DOID:0060268\", \"C0018794\")"New value: +"Disease ID (e.g., \"DOID:0060268\", \"MONDO:0007254\", \"OMIM:114480\", or UMLS CUI \"C0018794\")"
    • Changeddrug_search1 field changed
      • changedInput schema / properties / query / description
        Previous value: -"Drug name, mechanism, or keyword to search"New value: +"Drug name or keyword (chemical identity, e.g. \"imatinib\"); for target/mechanism queries (e.g. \"EGFR inhibitor\") use gene_drugs with the gene symbol instead"
    • Changedgene_enrich3 fields changed
      • changedInput schema / properties / genes / description
        Previous value: -"List of HGNC gene symbols"New value: +"List of HGNC gene symbols (minimum 3; duplicates and case variants are collapsed before submission)"
      • addedInput schema / properties / genes / minItems
        Added value: +3
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 30,
        +  "description": "Maximum pathways to return (1-100; Reactome reports up to ~100)",
        +  "maximum": 100,
        +  "minimum": 1,
        +  "type": "integer"
        +}
    • Changedgene_search1 field changed
      • changedInput schema / properties / chromosome / description
        Previous value: -"Filter by chromosome (e.g., \"7\", \"X\")"New value: +"Filter by chromosome: 1-22, X, Y, or M/MT (mitochondrial), with an optional \"chr\" prefix (e.g., \"7\", \"chrX\")"
    • Changedvariant_get1 field changed
      • changedInput schema / properties / id / description
        Previous value: -"Variant ID (rsid, HGVS, or ClinVar ID)"New value: +"Variant ID (rsid e.g. rs113488022, HGVS e.g. NM_004333.4:c.1799T>A, ClinVar ID e.g. 13961 / clinvar_13961 / VCV0000013961)"
    • Changedvariant_search2 fields changed
      • changedInput schema / properties / hgvsc / description
        Previous value: -"cDNA change"New value: +"cDNA change — bare c. notation (e.g., c.1799T>A) or full HGVS (e.g., NM_004333.4:c.1799T>A)"
      • addedInput schema / properties / significance / description
        Added value: +"ClinVar significance category, matched exactly — records displayed as \"Pathogenic/Likely pathogenic\" match both pathogenic and likely_pathogenic; \"Conflicting interpretations of pathogenicity\" matches none of these"
  5. 11 tool updatesv1.6.0-alpha.1
    • Changedarticle_get5 fields changed
      • changedInput schema / properties / citation_direction / description
        Previous value: -"Citation direction: \"forward\" (articles citing this one), \"backward\" (references), \"both\" (default)"New value: +"Citation direction: \"forward\" (articles citing this one), \"backward\" (references), \"both\" (default); honored for preprint PPR citations too — the skipped direction returns an empty array"
      • addedInput schema / properties / fulltext_max_chars
        Added value: +{
        +  "description": "Inline-mode only (fulltext_output=\"inline\"); default 40000. Ignored in file mode — files carry the complete text (2MB safety cap). Truncation is flagged honestly with omitted section names.",
        +  "maximum": 200000,
        +  "minimum": 1000,
        +  "type": "integer"
        +}
      • addedInput schema / properties / fulltext_output
        Added value: +{
        +  "description": "Output mode for sections=[\"fulltext\"]. \"file\" (default): complete text written to a server-side markdown file; the reply carries file_path + outline (headings with line numbers and char counts) — Read/Grep the file selectively. \"inline\": text returned inline, capped by fulltext_max_chars; use only if you cannot read server-side files.",
        +  "enum": [
        +    "file",
        +    "inline"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / sections / description
        Previous value: -"Sections to include. Use [\"citation\"] for citation data, [\"all\"] for everything."New value: +"Sections to include. [\"fulltext\"] = the complete article text (written to a file by default; see fulltext_output). [\"oa\"] = license/access metadata and links. [\"citation\"] = citation data. [\"all\"] = oa+annotations+graph+citation — fulltext is NOT included; request [\"fulltext\"] separately."
      • changedInput schema / properties / sections / items / enum
        Previous value: -[
        -  "core",
        -  "oa",
        -  "annotations",
        -  "graph",
        -  "citation",
        -  "all"
        -]New value: +[
        +  "core",
        +  "oa",
        +  "fulltext",
        +  "annotations",
        +  "graph",
        +  "citation",
        +  "all"
        +]
    • Changedarticle_search2 fields changed
      • changedInput schema / properties / offset / description
        Previous value: -"Result offset. EuropePMC and preprint_only windows are capped at 1000 rows; use narrower queries or another source for deeper results"New value: +"Result offset. EuropePMC and preprint_only windows are capped at 1000 rows; arXiv clamps the start offset so start + page size stays within its ~30000-result deep-paging ceiling (the API errors past it); use narrower queries or another source for deeper results"
      • addedInput schema / properties / query / minLength
        Added value: +1
    • Changeddiscover1 field changed
      • addedInput schema / properties / query / minLength
        Added value: +1
    • Changeddisease_search1 field changed
      • addedInput schema / properties / query / minLength
        Added value: +1
    • Changeddrug_search1 field changed
      • addedInput schema / properties / query / minLength
        Added value: +1
    • Changedgenbank_search1 field changed
      • addedInput schema / properties / query / minLength
        Added value: +1
    • Changedgene_search1 field changed
      • addedInput schema / properties / query / minLength
        Added value: +1
    • Changedgeo_search1 field changed
      • addedInput schema / properties / query / minLength
        Added value: +1
    • Changedpatent_search1 field changed
      • addedInput schema / properties / query / minLength
        Added value: +1
    • Changedsra_search1 field changed
      • addedInput schema / properties / query / minLength
        Added value: +1
    • Changedtrial_search1 field changed
      • addedInput schema / properties / query / minLength
        Added value: +1
  6. 2 tool updatesv1.5.0
    • Changedarticle_get1 field changed
      • changedInput schema / properties / id / description
        Previous value: -"Article identifier: PMID (numeric, e.g. \"12345\"), PMCID (e.g. \"PMC1234567\"), or DOI (e.g. \"10.1038/s41586-021-03819-2\")"New value: +"Article identifier: PMID (numeric, e.g. \"12345\"), PMCID (e.g. \"PMC1234567\"), DOI (e.g. \"10.1038/s41586-021-03819-2\"), or preprint DOI (e.g. \"10.1101/2021.10.25.465764\", \"10.64898/2026.08.11.744243\")"
    • Changedarticle_search4 fields changed
      • changedInput schema / properties / dateRange / description
        Previous value: -"Date range as YYYY-MM-DD/YYYY-MM-DD. Open-ended: \"2020-01-01/\" or \"/2023-12-31\". Only pubmed, europepmc, semantic_scholar support this."New value: +"Date range as YYYY-MM-DD/YYYY-MM-DD. Open-ended: \"2020-01-01/\" or \"/2023-12-31\". Only pubmed, europepmc, semantic_scholar, preprint_only, and arxiv support this."
      • changedInput schema / properties / offset / description
        Previous value: -"Result offset. EuropePMC windows are capped at 1000 rows; use narrower queries or another source for deeper results"New value: +"Result offset. EuropePMC and preprint_only windows are capped at 1000 rows; use narrower queries or another source for deeper results"
      • changedInput schema / properties / source / description
        Previous value: -"Specific source to search"New value: +"Specific source to search. \"preprint_only\" searches ONLY bioRxiv+medRxiv preprints (bioRxiv/medRxiv DOIs, abstracts, citation counts, via Europe PMC's preprint index); \"arxiv\" searches the arXiv preprint server (quotes, parentheses, and field prefixes like ti:/au: are stripped from the query for arXiv only). Default (unset) = federated journal-literature search across PubMed, EuropePMC, Semantic Scholar, arXiv, PubTator, LitSense; bioRxiv/medRxiv preprints are NOT included unless explicitly requested via preprint_only."
      • changedInput schema / properties / source / enum
        Previous value: -[
        -  "pubmed",
        -  "europepmc",
        -  "semantic_scholar",
        -  "pubtator",
        -  "litsense"
        -]New value: +[
        +  "pubmed",
        +  "europepmc",
        +  "semantic_scholar",
        +  "pubtator",
        +  "litsense",
        +  "preprint_only",
        +  "arxiv"
        +]
  7. 1 tool updatev1.4.2
    • Changedarticle_search2 fields changed
      • changedInput schema / properties / offset / description
        Previous value: -"Result offset"New value: +"Result offset. EuropePMC windows are capped at 1000 rows; use narrower queries or another source for deeper results"
      • changedInput schema / properties / query / description
        Previous value: -"Search query (title, abstract, or keyword)"New value: +"Search query (title, abstract, or keyword). Journal scoping: PubMed matches full journal names and NLM abbreviations; EuropePMC JOURNAL:\"...\" filters require the NLM abbreviation (e.g. \"N Engl J Med\")"
  8. 1 tool updatev1.1.1
    • Changeddrug_get2 fields changed
      • changedInput schema / properties / sections / description
        Previous value: -"Sections to include"New value: +"Sections to include (adverse_events = FDA FAERS adverse reactions ranked by report count; limit applies to reaction rows)"
      • changedInput schema / properties / sections / items / enum
        Previous value: -[
        -  "core",
        -  "us_regulatory",
        -  "eu_regulatory",
        -  "who_regulatory",
        -  "safety",
        -  "targets",
        -  "indications",
        -  "all"
        -]New value: +[
        +  "core",
        +  "us_regulatory",
        +  "eu_regulatory",
        +  "who_regulatory",
        +  "safety",
        +  "targets",
        +  "indications",
        +  "adverse_events",
        +  "all"
        +]
  9. 1 tool updatev1.0.0
    • Addedbiomcp_configure
  10. 22 tool updatesv0.7.1
    • Changedarticle_get1 field changed
      • changedInput schema / properties / citation_mode / description
        Previous value: -"Fast: Europe PMC, Semantic Scholar, Crossref (~4s). Full: All 5 providers (~15-30s). Fast mode auto-falls back to PubMed when other providers return no items."New value: +"Fast: Europe PMC, Semantic Scholar, OpenCitations, Crossref counts/references (~4s). Full: All 5 providers incl. PubMed (~15-30s). Fast mode auto-falls back to PubMed when other providers return no items."
    • Changedbatch_get1 field changed
      • changedInput schema / properties / inputs / items / properties / entity / enum
        Previous value: -[
        -  "gene",
        -  "variant",
        -  "drug",
        -  "disease",
        -  "trial",
        -  "article"
        -]New value: +[
        +  "gene",
        +  "variant",
        +  "drug",
        +  "disease",
        +  "trial",
        +  "article",
        +  "patent"
        +]
    • Changeddisease_get1 field changed
      • changedInput schema / properties / sections / items / enum
        Previous value: -[
        -  "core",
        -  "gene_associations",
        -  "phenotypes",
        -  "pathways",
        -  "survival",
        -  "all"
        -]New value: +[
        +  "core",
        +  "gene_associations",
        +  "phenotypes",
        +  "pathways",
        +  "all"
        +]
    • Changeddisease_search1 field changed
      • removedInput schema / properties / disease_type
        Removed value: -{
        -  "description": "Filter by disease type",
        -  "type": "string"
        -}
    • Changeddrug_search3 fields changed
      • removedInput schema / properties / drug_type
        Removed value: -{
        -  "description": "Filter by drug type",
        -  "type": "string"
        -}
      • changedInput schema / properties / query / description
        Previous value: -"Drug name, mechanism, or keyword to search for"New value: +"Drug name, mechanism, or keyword to search"
      • removedInput schema / properties / source
        Removed value: -{
        -  "description": "Filter by source (mychem, chembl, openfda)",
        -  "type": "string"
        -}
    • Addedensembl_consequence
    • Addedensembl_homology
    • Addedensembl_lookup
    • Addedensembl_region
    • Addedgenbank_genes
    • Addedgenbank_get
    • Addedgenbank_search
    • Changedgene_search1 field changed
      • removedInput schema / properties / gene_type
        Removed value: -{
        -  "description": "Filter by gene type",
        -  "enum": [
        -    "protein-coding",
        -    "ncRNA",
        -    "pseudo"
        -  ],
        -  "type": "string"
        -}
    • Addedgeo_get
    • Addedgeo_search
    • Addedgtex_eqtl
    • Addedgtex_expression
    • Addedpatent_get
    • Addedpatent_search
    • Addedsra_get
    • Addedsra_search
    • Changedvariant_get1 field changed
      • changedInput schema / properties / sections / description
        Previous value: -"Sections to include: core, frequency, predictions, clinical, alphagenome_scores"New value: +"Sections to include: core, frequency, predictions, clinical, alphagenome_scores (currently unavailable — returns an error stub pending AlphaGenome gRPC reimplementation)"
  11. 25 tool updatesv0.1.8
    • First observedarticle_get
    • First observedarticle_search
    • First observedbatch_get
    • First observeddiscover
    • First observeddisease_drugs
    • First observeddisease_get
    • First observeddisease_search
    • First observeddisease_trials
    • First observeddrug_get
    • First observeddrug_search
    • First observeddrug_trials
    • First observedgene_articles
    • First observedgene_diseases
    • First observedgene_drugs
    • First observedgene_enrich
    • First observedgene_get
    • First observedgene_search
    • First observedgene_trials
    • First observedpdb
    • First observedtrial_get
    • First observedtrial_search
    • First observedvariant_get
    • First observedvariant_oncokb
    • First observedvariant_search
    • First observedvariant_trials

TDQS

A3.5/5.0

Scored across 43 tools

Disambiguation4/5

Most tools follow a clear entity+action split (gene_/variant_/drug_/disease_/article_/trial_/geo_/sra_/genbank_/patent_ + search/get), and descriptions actively steer agents apart (e.g. drug_search explicitly says it is not a target search, use gene_drugs; gene_get vs ensembl_lookup is carved out). A few overlaps remain that will cause misselection: five routes into clinical trials (drug_trials, gene_trials, variant_trials, disease_trials, trial_search), preprint_fulltext versus article_get on a preprint DOI, and discover versus the per-entity *_search tools. Batch_get also shadows every get tool.

Naming Consistency4/5

The dominant convention is consistent snake_case entity_verb (gene_search/gene_get, variant_trials, article_get, geo_search, patent_get), which makes the set predictable. Deviations exist: pdb is a bare noun doing search/get/download in one tool, discover and batch_get are generic verbs without an entity, and journal_metrics/gene_enrich are noun_verb or verb-only rather than entity_action.

Tool Count3/5

43 tools is heavy, but the breadth is genuine (genes, variants, drugs, diseases, trials, literature, patents, PDB, GEO/SRA/GenBank, GTEx, Ensembl, config), and most domains are well-scoped search/get pairs that earn their place. Still, several convenience wrappers (gene_articles, gene_diseases, gene_drugs, gene_trials, batch_get) could be folded into generic search tools, so the surface feels larger than strictly necessary.

Completeness4/5

Coverage of the bioinformatics domain is broad and lifecycle-complete for most entities: search+get for genes, variants, drugs, diseases, trials, articles, patents, sequences, structures, with rich cross-linking hints (sra→sra_get, geo→sra, genbank_genes→gene_search). Minor gaps: Reactome enrichment is the only pathway tool and has no reverse lookup, there is no protein/UniProt target tool separate from PDB, and no batch/list-upload path except the generic batch_get and gene_enrich gene lists.

Maintenance

ActivityActive
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    This MCP server provides 16 intelligent tools for searching, retrieving, and linking biomedical literature from PubMed and PMC. It enables LLM applications to perform complex queries, batch processing, and cross-database linking.
    16
    8
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    An MCP server that gives AI assistants access to biological and biomedical RDF databases via SPARQL at the RDF Portal, as well as selected REST APIs (NCBI E-utilities, UniProt, ChEMBL, PDB, Reactome, Rhea, MeSH, and more).
    29
    20
    MIT