BioMCP
BioMCP is an MCP server for federated bioinformatics and biopharmaceutical database access, with optional local database and sandboxed analysis toolboxes.
Search and retrieve genes, associated diseases, drugs, trials, articles, and Reactome pathway enrichment.
Search and inspect variants, including OncoKB cancer annotations and variant-linked trials.
Search drugs and diseases, and find drugs or trials associated with them.
Federated literature search across PubMed, EuropePMC, Semantic Scholar, arXiv, PubTator, and LitSense; retrieve articles, preprint full text, and journal metrics.
Search and retrieve clinical trials, PDB structures, patents, GEO, SRA, GenBank/RefSeq, GTEx expression/eQTLs, and Ensembl annotations, homology, VEP consequences, and genomic regions.
Resolve concepts with
discoverand retrieve multiple entities in parallel withbatch_get.Optionally query MySQL/SQLite databases, run Bioconductor DESeq2/edgeR/limma in WebAssembly R, and run samtools/bedtools/bcftools analysis in WebAssembly.
Inspect and configure optional features via
biomcp_configure; environment-only secrets remain query-only and masked.
Provides access to biomedical literature through PubMed, enabling search and retrieval of articles, and citation data via the article_search and article_get tools.
Integrates with Semantic Scholar for federated literature search and citation analysis, supporting article search and citation graph data.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@BioMCPget info on BRCA1 gene"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
BioMCP

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.13Setup 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 |
| Search genes by symbol, name, or keyword with chromosome filter |
| 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 |
| Get diseases associated with a gene (DisGeNET / OpenTargets) |
| Find drugs targeting a gene (OpenTargets; envelope |
| Find clinical trials for a gene |
| Find articles about a gene (federated across PubMed, EuropePMC, Semantic Scholar, arXiv, PubTator, LitSense; envelope |
| Pathway enrichment analysis for a gene list (Reactome) |
Variant (4)
Tool | Description |
| Search variants by rsid, HGVS, gene, ClinVar significance, frequency, CADD |
| Get detailed variant info with optional sections (frequency, predictions, clinical; |
| Get OncoKB cancer variant annotations (requires |
| Find clinical trials for a variant |
Drug (3)
Tool | Description |
| Search drugs by name, mechanism, or keyword (envelope |
| 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) |
| Find clinical trials for a drug |
Disease (4)
Tool | Description |
| Search diseases by name, phenotype, or keyword (envelope |
| Get detailed disease info by ID (DOID, MONDO, OMIM, etc.) with optional sections (gene_associations, phenotypes, pathways) |
| Get drugs for a disease (OpenTargets; envelope |
| Get clinical trials for a disease (ClinicalTrials.gov; envelope |
Article (4)
Tool | Description |
| Federated literature search across PubMed, EuropePMC, Semantic Scholar, arXiv, PubTator, and LitSense with optional date range filtering; |
| Get detailed article info by identifier (PMID, PMCID, DOI, or bioRxiv/medRxiv preprint DOI) with optional sections: |
| 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 ( |
| 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 |
| Search clinical trials by condition, intervention, status, or phase. Cursor-based pagination via |
| Get detailed trial info by NCT ID with optional sections (eligibility, locations, outcomes) |
Utility (2)
Tool | Description |
| Free-text concept resolution across all entity types |
| Retrieve multiple entities in parallel |
Structural Biology (1)
Tool | Description |
| 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 |
| Search patents worldwide (US, EP, WO, JP, 100+ authorities) with assignee/inventor/CPC/status/date filters and relevance ranking ( |
| 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 |
| 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 |
| 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 ( |
SRA (2)
Tool | Description |
| 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 |
| 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 |
| Search NCBI nucleotide records (GenBank/RefSeq/INSDC) by plain terms, accession, or field syntax; results include accession.version, definition, length, organism, topology |
| Fetch a GenBank/RefSeq record as GenBank flat file or FASTA; whole records capped at 2 Mb — larger records require a |
| Map a GenBank/RefSeq accession to its NCBI Gene IDs (elink nuccore→gene) for bridging into gene tools |
GTEx (2)
Tool | Description |
| 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 |
| 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 |
| Resolve a gene in Ensembl terms for any of ~356 species: stable ID (+version), symbol, coordinates on the current assembly, canonical transcript; |
| Find orthologues/paralogues across species via Ensembl Compara — target stable IDs, taxonomy level, percent identity, sorted by identity; filter with |
| 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 |
| Query genes/transcripts/known variants in a genomic interval ( |
R Analysis (4, optional — ANALYSIS_R=1)
Tool | Description |
| 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 ( |
| Differential expression with edgeR — TMM normalization, empirical-Bayes dispersion, quasi-likelihood F-test ( |
| Differential expression with limma-voom — precision-weighted linear models with empirical-Bayes moderation; same input/output contract |
| 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 |
| 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 |
| 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 |
| Inspect a VCF/BCF: contigs, sample count and names, INFO/FORMAT field inventory from the header |
| 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 |
| Interval algebra on BED tracks (bedtools intersect/merge/subtract/coverage/jaccard/sort) with the streaming |
| 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 |
| Biowasm runtime report: pinned tool versions, asset cache state, engine status, retained artifacts, memory |
| 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 ( | Set | |
R analysis — Bioconductor differential expression ( | Set | |
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 |
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 |
Guided installation & client configuration (Claude Desktop, Claude Code, Codex, OpenCode) | |
Single source of truth for every environment variable | |
Database access feature guide | |
R analysis feature guide (Bioconductor in WebAssembly) | |
Biowasm analysis feature guide (samtools/bedtools/bcftools in WebAssembly) | |
Build, test, publish workflow | |
CI pipeline, Dependabot automation, auto-merge safety model | |
Full tool schemas (params, enums, defaults) | |
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 toolsarticle_getARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | 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") | |
| limit | No | Maximum items per section (e.g., 20 citations) | |
| sections | No | 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. | |
| citation_mode | No | 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. | fast |
| fulltext_output | No | 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. | |
| citation_direction | No | Citation direction: "forward" (articles citing this one), "backward" (references), "both" (default); honored for preprint PPR citations too — the skipped direction returns an empty array | both |
| fulltext_max_chars | No | 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. |
TDQS
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.
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.
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.
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.
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.
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_searchARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results to return. Applied to final deduplicated results, not per-source. Each source may fetch more internally before deduplication. | |
| query | Yes | 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. | |
| offset | No | 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 | |
| source | No | 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. | |
| dateRange | No | 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. |
TDQS
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.
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.
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.
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.
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.
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_getARead-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"
| Name | Required | Description | Default |
|---|---|---|---|
| inputs | Yes | List of entity requests |
TDQS
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.
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.
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.
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.
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.
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_configureADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| action | No | status = inspect (default, works with no other arguments); set = create/modify file parameters; reset = remove. | status |
| filter | No | For status: "file" | "env" | feature id | dotted-id prefix — returns detailed rows (effects, how-to-set). | |
| target | No | For reset: a feature id ("database" | "analysis_r" | "analysis_biowasm") removes the whole section, or a list of dotted file-param ids removes those keys. | |
| values | No | For 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_run | No | Validate and diff without writing (set/reset). | |
| confirm_sensitive | No | Required true when set/reset touches sensitive keys (connection targets, mirrors, credentials). |
TDQS
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.
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.
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.
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.
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.
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.
discoverARead-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")
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Free-text query (e.g., "BRAF V600E", "lung cancer", "imatinib") |
TDQS
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.
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.
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.
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.
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.
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_drugsARead-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)
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| disease_id | Yes | Disease ID |
TDQS
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.
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.
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.
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.
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.
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_getCRead-only
Get detailed disease information by ID
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| sections | No | Sections to include | |
| disease_id | Yes | Disease ID (e.g., "DOID:0060268", "MONDO:0007254", "OMIM:114480", or UMLS CUI "C0018794" — heart block, named via MedGen enrichment) |
TDQS
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.
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.
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.
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.
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.
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_searchARead-only
Search for diseases by name, phenotype, or keyword. Response is an envelope: { results, warnings?, errors? } (issue #130)
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results | |
| query | Yes | Disease name, phenotype, or keyword to search for | |
| offset | No | Result offset |
TDQS
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 genuine value beyond that by declaring the response envelope shape ({ results, warnings?, errors? }), which matters since there is no output schema. It stops short of describing ranking or result content.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences front-loaded with the core purpose and then the response shape. The trailing '(issue #130)' is internal issue-tracker noise that doesn't earn its place, a minor blemish.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only three-parameter search tool, the description plus a fully documented schema plus the disclosed envelope shape covers what an agent needs to invoke it correctly. Lacking only routing guidance relative to the many sibling search/get tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so query, limit, and offset are already fully documented with defaults and bounds. The description adds nothing beyond the schema for parameters, which is the expected baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Search for diseases') and enumerates the searchable facets (name, phenotype, keyword). It distinguishes itself from disease_get by the 'search' verb, though it doesn't explicitly say so.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus disease_get, gene_diseases, or other discovery tools. Usage is only implied by the verb 'search' and the mention of search facets.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
disease_trialsBRead-only
Get clinical trials for a disease. Response is an envelope: { results, warnings?, errors? } (issue #130)
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| disease_id | Yes | Disease ID |
TDQS
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.
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.
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.
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.
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.
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_getCRead-only
Get detailed drug information by name
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Drug name (e.g., "imatinib", "aspirin") | |
| limit | No | ||
| sections | No | 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) |
TDQS
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.
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.
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.
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.
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.
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_searchARead-only
Search for drugs by name or keyword (chemical identity: names, synonyms, and identifiers in ChEMBL/MyChem). This is NOT a mechanism or target search — MyChem has no mechanism text in this query, so "EGFR inhibitor"-style queries return nothing. For drugs targeting a gene/mechanism, use gene_drugs with the target gene symbol.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results | |
| query | Yes | 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 | |
| offset | No | Result offset |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description adds real behavioral context beyond that: mechanism-style queries return nothing because MyChem has no mechanism text, which prevents a common failure. It does not mention pagination behavior or result shape, so it falls short of 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: positive scope first, the negative constraint second, the alternative third. No filler, and the most important routing information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only open-world search with no output schema and fully documented params, the definition covers what an agent needs: correct input type, the failure mode to avoid, and the alternative tool. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so query, limit, and offset are all documented in the schema itself, and the description's note about chemical identity largely restates the query field. No extra syntax or format guidance beyond what the schema provides, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (search drugs) plus the scope (chemical identity: names, synonyms, identifiers in ChEMBL/MyChem), and explicitly names the sibling gene_drugs as the different tool. An agent can distinguish it from gene_drugs and drug_get without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when not to use it ('NOT a mechanism or target search') and gives the concrete alternative (gene_drugs with the target gene symbol) with example queries that select each path. This is textbook when/when-not/alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
drug_trialsBRead-only
Find clinical trials for a drug
| Name | Required | Description | Default |
|---|---|---|---|
| drug | Yes | Drug name |
TDQS
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.
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.
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.
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.
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.
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_consequenceARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max transcript consequences returned (sorted by impact severity) | |
| species | No | Species — 'human' (default), 'mouse', … | human |
| variant | Yes | HGVS notation (NM_004333:c.1799T>A) or dbSNP rsID (rs113488060) |
TDQS
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.
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.
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.
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.
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.
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_homologyARead-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?').
| Name | Required | Description | Default |
|---|---|---|---|
| gene | Yes | Gene symbol (BRAF) or Ensembl gene ID (ENSG00000157764) | |
| type | No | Homology type to fetch | orthologues |
| limit | No | Maximum homologies to return (sorted by percent identity) | |
| species | No | Source species — 'human' (default), 'mouse', … | human |
| target_taxon | No | Restrict results to a taxon ID, e.g. 10090 (Mus musculus) | |
| target_species | No | Restrict results to one species, e.g. 'mouse' |
TDQS
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.
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.
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.
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.
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.
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_lookupARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| expand | No | Include all transcripts with translation/protein IDs | |
| species | No | Species name or alias — 'human' (default), 'mouse', 'mus_musculus', 'rat', … | human |
| gene_or_id | Yes | HGNC symbol (BRAF) or Ensembl gene ID (ENSG00000157764, versioned or bare) |
TDQS
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.
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.
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.
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.
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.
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_regionARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum features returned | |
| region | Yes | Genomic region chr:start-end (1-based, GRCh38 for human) — e.g. 7:140450000-140480000 | |
| species | No | Species — 'human' (default), 'mouse', … | human |
| features | No | Feature types to include |
TDQS
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.
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.
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.
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.
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.
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_genesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| accession | Yes | GenBank/RefSeq accession, versioned or bare — e.g. NG_017013.2, NC_000023.11 |
TDQS
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.
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.
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.
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.
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.
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_getARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | Record format: genbank flat file (default) or fasta | genbank |
| strand | No | Strand: 1=plus (default), 2=minus (reverse slice; allows seq_start > seq_stop) | |
| seq_stop | No | Region stop (1-based, inclusive) | |
| accession | Yes | GenBank/RefSeq accession, versioned or bare — NC_000023.11, NG_017013.2, KJ668569.1, NC_000908.2 | |
| seq_start | No | Region start (1-based, inclusive) — required with seq_stop for records over 2 Mb | |
| sequence_output | No | 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 | |
| max_response_bytes | No | Hard cap on the raw NCBI response in characters (default 30,000,000) — oversized responses error instead of truncating |
TDQS
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.
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.
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.
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.
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.
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.
genbank_searchARead-only
Search NCBI nucleotide records (GenBank/RefSeq/INSDC).
Queries may be plain terms, an accession, or NCBI field syntax ("TP53[Gene Name] AND Homo sapiens[Organism]", "BRCA1[Gene Name]"). Results include accession.version, definition, length_bp, organism, and topology — chain accessions into genbank_get or genbank_genes.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results | |
| query | Yes | Nucleotide query, e.g. "TP53[Gene Name] AND Homo sapiens[Organism]" or an accession | |
| offset | No | Result offset for pagination | |
| organism | No | Filter by organism (e.g. "Homo sapiens") |
TDQS
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-corpus profile is covered. The description adds useful value by enumerating the returned fields (accession.version, definition, length_bp, organism, topology), but says nothing about result caps, pagination behavior, or rate limiting on an open-world NCBI endpoint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the resource and scope, then the query modes, then the return fields and handoff. No filler; every clause carries information an agent would act on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 listing the fields returned, and it closes the loop on pagination-adjacent workflow by pointing to genbank_get/genbank_genes. It could be more complete by noting the default result limit of 10 or that offset pages through a possibly large hit count.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so query, organism, limit, and offset are all documented in the schema itself, and the description's query-syntax examples largely duplicate the schema's own example. Baseline 3 is appropriate since the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Search NCBI nucleotide records') and scopes the corpus explicitly (GenBank/RefSeq/INSDC). It also names the downstream siblings (genbank_get, genbank_genes), so an agent can distinguish this from gene_search, variant_search, and sra_search 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete query-form guidance (plain terms, accession, or field syntax with worked examples) plus a next-step routing hint to genbank_get/genbank_genes. It lacks explicit negative guidance — nothing says when to prefer sra_search or gene_search instead — so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gene_articlesARead-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)
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | Yes | HGNC gene symbol |
TDQS
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.
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.
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.
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.
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.
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_diseasesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| symbol | Yes | HGNC gene symbol |
TDQS
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.
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.
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.
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.
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.
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_drugsARead-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)
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | Yes | HGNC gene symbol (e.g., "BRAF", "TP53") |
TDQS
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.
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.
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.
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.
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.
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_enrichARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| genes | Yes | List of HGNC gene symbols (minimum 3; duplicates and case variants are collapsed before submission) | |
| limit | No | Maximum pathways to return (1-100; Reactome reports up to ~100) |
TDQS
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.
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.
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.
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.
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.
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_getARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| smart | No | When 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. | |
| symbol | Yes | Official HGNC gene symbol (e.g., "BRAF", "TP53", "ERBB2"). Common aliases like "HER2" or "NEU" are NOT accepted unless smart=true is enabled. | |
| sections | No | Sections to include |
TDQS
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.
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.
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.
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.
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.
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_searchCRead-only
Search for genes by symbol, name, or keyword
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results | |
| query | Yes | Gene symbol, name, or keyword to search for | |
| offset | No | Result offset | |
| chromosome | No | Filter by chromosome: 1-22, X, Y, or M/MT (mitochondrial), with an optional "chr" prefix (e.g., "7", "chrX") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety and scope are covered externally. The description adds nothing beyond those hints — no note on matching behavior (fuzzy vs exact symbol match), result ordering, or how to page through large hit sets.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One compact sentence with the resource and match criteria front-loaded and no filler. It is appropriately sized, though its brevity edges into under-specification rather than pure efficiency.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only search with 100% schema coverage and no output schema, the definition is minimally sufficient to call the tool. It still omits result shape, whether paging is expected, and how matches are ranked, so an agent gets no help interpreting the response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters (query, chromosome, limit, offset) are already documented in the schema, and that sets the baseline at 3. The description only echoes the query parameter's three modes and ignores the chromosome filter, limit, and offset, adding no extra meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (search) and resource (genes) plus the match fields (symbol, name, keyword), so the operation is unambiguous. It does not distinguish itself from siblings like gene_get or gene_diseases, leaving the search-vs-lookup split to inference from the names.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says what can be searched but never when to pick this over gene_get (exact retrieval) or gene_enrich (set-based analysis). An agent must infer from the tool names that search is for discovery when no identifier is known.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gene_trialsARead-only
Find clinical trials for a gene
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | Yes | HGNC gene symbol |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| download | No | Download a supplementary file to a local temp path (prefers .gz/.csv/.txt, else the first listed) | |
| accession | Yes | GEO accession (GSE series, GSM sample, or GPL platform; GDS curated DataSets return structured guidance pointing at the underlying GSE/GSM) | |
| max_bytes | No | Size cap in bytes for the downloaded supplementary file (default 52428800 = 50 MB) |
TDQS
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.
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.
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.
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.
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.
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.
geo_searchARead-only
Search NCBI GEO (Gene Expression Omnibus) for functional genomics studies — expression microarrays, RNA-seq, and other high-throughput sequencing series.
Queries accept plain terms ("breast cancer RNA-seq", "melanoma single cell") or NCBI field syntax ("GSE183947[Accession]"). Every result carries accession (→ geo_get for full details), bioproject, and pubmed_ids (→ article_get). sra_project (→ sra_get) appears only when NCBI has linked the SRA study to the series — many newer series lack the link — so geo_get(accession) is the reliable route to SRA accessions (its sra field).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results | |
| query | Yes | Free-text GEO search terms, e.g. "breast cancer RNA-seq", "melanoma single cell" | |
| offset | No | Result offset for pagination | |
| organism | No | Filter by organism (e.g. "Homo sapiens", "Mus musculus") | |
| entry_type | No | GEO entry type — gse=study (default), gsm=sample, gpl=platform, gds=curated dataset |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, and the description adds valuable behavioral detail beyond that: every result carries accession, bioproject, and pubmed_ids, and sra_project appears only when NCBI has linked the SRA study. The caveat that geo_get is the reliable route to SRA accessions is especially useful and not conveyed by annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the primary purpose, then efficiently adds query syntax and downstream-routing details. Every sentence carries useful information, including the important conditional caveat about sra_project, with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Although there is no output schema, the description compensates by naming the key result fields and explaining the conditional sra_project behavior. It also routes agents to geo_get, article_get, and sra_get appropriately, making it complete enough to call and interpret the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all five parameters. The description adds meaningful query semantics by showing both plain-term and NCBI field-syntax forms, which goes beyond the schema’s free-text examples, though it does not add per-parameter details for organism or entry_type beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: searching NCBI GEO for functional genomics studies, with concrete scope including expression microarrays, RNA-seq, and high-throughput sequencing series. It also implicitly differentiates from geo_get by explaining that search results carry accessions that can be passed to geo_get for full details.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear usage context by explaining that queries accept plain terms or NCBI field syntax and by naming downstream tools for accessions, PubMed IDs, and SRA projects. It does not explicitly state when to prefer geo_search over sibling searches such as sra_search or genbank_search, so it falls short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gtex_eqtlARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| gene | Yes | HGNC symbol (TP53) or Ensembl gene ID (ENSG00000141510, versioned or bare) | |
| limit | No | Maximum associations to return | |
| tissue | Yes | GTEx tissueSiteDetailId — required, e.g. Whole_Blood |
TDQS
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.
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.
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.
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.
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.
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_expressionARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| gene | Yes | HGNC symbol (TP53) or Ensembl gene ID (ENSG00000141510, versioned or bare) | |
| limit | No | Maximum tissues to return (highest expression first) | |
| tissue | No | GTEx tissueSiteDetailId filter, e.g. Brain_Cortex, Whole_Blood |
TDQS
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.
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.
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.
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.
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.
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_metricsARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results for name searches (exact lookups return one) | |
| query | Yes | Journal name, NLM abbreviation (e.g. "N Engl J Med"), or ISSN (e.g. "0028-0836") |
TDQS
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.
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.
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.
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.
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.
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_getARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max entries per section array | |
| sections | No | Sections to include (default: core only) | |
| patent_id | Yes | Publication number, e.g. "US11027025B2" |
TDQS
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.
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.
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.
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.
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.
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.
patent_searchARead-only
Search patents worldwide (US, EP, WO, JP, and 100+ authorities). Quote exact multi-word concepts (e.g. "flow cytometry") to avoid off-topic matches. Backend characters: ppubs = USPTO Public Search full-text conceptual search (US only, keyless, relevance-ranked; default US backend) | ops = EPO OPS worldwide bibliographic search over titles/abstracts (needs EPO_OPS_CONSUMER_KEY/EPO_OPS_CONSUMER_SECRET) | uspto_odp = US application metadata, bibliographic only but inventor/CPC/continuity-rich (needs USPTO_API_KEY) | google_patents = worldwide best-effort (often unavailable). Auto mode queries worldwide + ppubs concurrently; if ppubs fails hard it falls back to uspto_odp once (noted in warnings). Per-backend failures and degradation notes are reported out of band in the response errors/warnings arrays — every element of patents is a real patent record and respects limit. Pass source to force a specific backend. Results are ranked by relevance by default (ppubs sort_by). Foundational prior art is auto-discovered via co-citation mining of the top results and returned in seminal_prior_art (surfaces seminal documents whose own vocabulary predates the query concept).
| Name | Required | Description | Default |
|---|---|---|---|
| cpc | No | Filter by CPC classification symbol (full symbol, e.g. "C12N15/11") | |
| limit | No | Maximum results | |
| query | Yes | Free-text query; quote exact multi-word concepts like "flow cytometry" for precise matching | |
| offset | No | Result offset for pagination | |
| source | No | Force a specific backend | |
| status | No | Filter by grant status | |
| seminal | No | Discover foundational prior art via co-citation analysis of the top results (default: true; adds ~5-30s; set false for the fastest bibliographic lookups) | |
| sort_by | No | Result ranking: "relevance" (default, conceptual match ranking) or "recency" (newest first). Currently affects the ppubs backend only | |
| assignee | No | Filter by assignee/applicant organization, e.g. "Novartis" | |
| inventor | No | Filter by inventor name | |
| date_range | No | Date range "YYYY-MM-DD/YYYY-MM-DD" (either side may be empty) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Consistent with readOnlyHint/openWorldHint and adds substantial context annotations cannot carry: per-backend auth requirements (EPO_OPS_CONSUMER_KEY, USPTO_API_KEY), the auto-mode concurrency and single-fallback-to-uspto_odp behavior, the fact that degradation surfaces in `errors`/`warnings` out of band, that every `patents` element is real and respects `limit`, and that seminal_prior_art is auto-mined from top-result co-citations. This is exactly the invisible behavior 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The backend inventory is a single pipe-delimited run-on with stacked parentheticals that is hard to parse, and the quoting advice is duplicated verbatim from the `query` schema description. It is front-loaded correctly and most sentences carry information, but the density costs readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having 11 parameters and no output schema, the description covers the response shape (patents, errors, warnings, seminal_prior_art), credential prerequisites, fallback behavior, and latency tradeoffs. An agent has everything needed to call this correctly and interpret partial results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description still adds real meaning beyond the schema by explaining what `source` selection implies (forced backend vs. auto) and that sort_by relevance ranking 'currently affects the ppubs backend only', which the enum alone does not convey. Filter parameters like cpc/assignee/date_range are left entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource+scope: 'Search patents worldwide (US, EP, WO, JP, and 100+ authorities)', and it further carves out what kind of search it is (full-text conceptual, bibliographic, prior-art discovery). Against sibling patent_get the search-vs-fetch distinction is unambiguous, so an agent can route without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operational guidance on backend choice: what each backend covers, what credentials it needs, what the default auto mode does, and 'Pass source to force a specific backend'. It also flags the seminal=true cost (~5-30s) and when to disable it. It stops short of naming an explicit alternative tool (e.g. patent_get for a known patent number), so it is not a full when/when-not treatment.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max search results | |
| query | No | Free-text search query to find PDB entries. Omit pdb_id when searching. | |
| format | No | File format: "cif" (mmCIF, recommended, always available) or "pdb" (legacy format, may not exist for some entries). Only used with download=true. | cif |
| offset | No | Search result offset | |
| pdb_id | No | PDB identifier (e.g., "1CRN", "4HHB"). Required for get/download. | |
| download | No | Save the structure file to disk and return the file path. Only used with pdb_id. | |
| sections | No | Metadata 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
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.
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.
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.
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.
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.
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_fulltextARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | bioRxiv/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 | |
| output | No | "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. | |
| version | No | Preprint version to fetch (default: latest). Pinned versions are served from cache with zero network when already fetched. | |
| fulltext_max_chars | No | Inline-mode only (output="inline"); default 40000. Ignored in file mode — files carry the complete text (2MB safety cap). |
TDQS
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.
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.
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.
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.
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.
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_getARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| accession | Yes | SRA accession: run (SRR/ERR/DRR), experiment (SRX/ERX/DRX), study (SRP/ERP/DRP), or sample (SRS/ERS/DRS), e.g. SRR14432476 |
TDQS
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.
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.
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.
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.
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.
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.
sra_searchARead-only
Search NCBI's Sequence Read Archive (SRA) for sequencing experiments and runs.
The query may be free text, an accession (SRP study, SRX experiment, SRR run, SRS sample), or NCBI field syntax ("RNA-SEQ AND Homo sapiens[Organism]"). Results list experiment/study/sample accessions (NCBI S…, European E…, or DDBJ D… prefixes — all resolvable by sra_get), organism, library strategy, run count, and first_run_accession for chaining into sra_get.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results | |
| query | Yes | 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]" | |
| offset | No | Result offset for pagination |
TDQS
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 enumerating exactly what is returned (experiment/study/sample accessions, organism, library strategy, run count, first_run_accession) and noting cross-database accession prefixes (SRA/ENA/DDBJ) are all resolvable downstream. Pagination behavior and empty-result handling are left to 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core purpose, followed by supported query forms and the return/result-chaining contract. Slight redundancy with the schema's query description, but no padding or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 of describing return content and does so concretely, including which fields enable chaining into sra_get. What remains unstated (pagination defaults, error/no-match behavior) is minor and largely covered by the schema parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the query, limit, and offset semantics are already documented in the schema. The description restates the query forms (free text, accession, field syntax), which adds only marginal meaning beyond the schema's own description of the same parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (search) and resource (NCBI SRA for sequencing experiments and runs) and explicitly distinguishes itself from the sibling sra_get by noting results are 'all resolvable by sra_get' and that first_run_accession is 'for chaining into sra_get'. An agent can differentiate it from geo_search or genbank_search by the resource named.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the accepted query forms (free text, accession, NCBI field syntax) and routes to sra_get for detail retrieval, which clarifies the search-then-fetch workflow. It stops short of explicit when-not-to-use guidance (e.g., preferring geo_search for GEO series or genbank_search for nucleotides), leaving that to inference from the resource name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
trial_getCRead-only
Get detailed trial information by NCT ID
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| nct_id | Yes | NCT ID (e.g., "NCT01234567") | |
| sections | No | Sections to include |
TDQS
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.
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.
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.
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.
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.
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.
trial_searchCRead-only
Search clinical trials by condition, intervention, or keyword
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results | |
| phase | No | 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 | |
| query | Yes | Condition, intervention, or keyword to search for | |
| status | No | Filter by status (Recruiting, Completed, etc.) | |
| page_token | No | Page token from previous response for pagination | |
| intervention_type | No | Filter by intervention type (Drug, Device, etc.); verifiable per row via the "interventions" strings ("TYPE: name") |
TDQS
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 what the schema states—no mention of result ordering, pagination behavior via page_token, or the size/nature of the underlying registry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single efficient sentence with no waste, and the core action is front-loaded. It is arguably clipped to the point of under-specification, but as a conciseness measure it is tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter search tool in a crowded sibling set with no output schema, the description is too thin: it omits pagination behavior, relative positioning versus the other trial tools, and any sense of result shape or scale. An agent can invoke it but has little help invoking it correctly among alternatives.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters including phase, status, intervention_type, and page_token are documented in the schema itself, some with verifiability notes. The description restates the query facets but adds no semantics beyond the schema, making the baseline 3 correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Search clinical trials") plus the searchable facets, so the basic operation is clear. However, with six sibling trial-related tools (trial_get, drug_trials, gene_trials, disease_trials, variant_trials, discover), the description gives no clue how this differs from them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no exclusions, and no named alternatives. An agent cannot tell from the description whether to use trial_search, trial_get, or the entity-scoped *_trials siblings for a given request.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
variant_getARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | 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) | |
| limit | No | ||
| sections | No | Sections to include: core, frequency, predictions, clinical, alphagenome_scores (currently unavailable — returns an error stub pending AlphaGenome gRPC reimplementation) |
TDQS
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.
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.
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.
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.
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.
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_oncokbBRead-only
Get OncoKB annotations for a variant in a cancer gene. Requires ONCOKB_TOKEN environment variable.
| Name | Required | Description | Default |
|---|---|---|---|
| gene | Yes | Gene symbol (e.g., BRAF, EGFR) | |
| protein_change | Yes | Protein change (e.g., V600E, L858R) |
TDQS
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.
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.
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.
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.
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.
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_searchARead-only
Search for variants. Use structured parameters for best results:
rsid: e.g. query="rs113488022"
HGVS: e.g. query="NM_004333.4:c.1799T>A"
Gene filter: e.g. gene="BRAF" with hgvsp="V600E" or consequence="missense"
ClinVar significance: e.g. significance="pathogenic" Do NOT use compound free-text like "BRAF V600E" — use separate gene and hgvsp parameters instead.
| Name | Required | Description | Default |
|---|---|---|---|
| gene | No | Filter by gene symbol (e.g., "BRAF"). Use together with hgvsp for protein change queries. | |
| rsid | No | dbSNP rsID | |
| hgvsc | No | cDNA change — bare c. notation (e.g., c.1799T>A) or full HGVS (e.g., NM_004333.4:c.1799T>A) | |
| hgvsp | No | Protein change (e.g., V600E). Use with gene parameter for compound queries. | |
| limit | No | Maximum results | |
| query | No | Variant query (rsid or HGVS notation). Avoid compound queries like "BRAF V600E" — use gene + hgvsp parameters instead. | |
| offset | No | Result offset | |
| min_cadd | No | Minimum CADD score; echoed per row as cadd_phred so the filter is verifiable from each result | |
| consequence | No | Variant consequence (e.g., missense, synonymous) | |
| significance | No | 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 | |
| max_frequency | No | Maximum allele frequency (0-1) |
TDQS
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 no behavior beyond invocation syntax: it says nothing about how many results are returned by default, whether zero filters means a broad scan, or how the score/frequency filters interact. With annotations carrying the read-only signal, a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded purpose sentence followed by a scannable four-bullet cheat sheet and a single prohibition. The bullets restate examples already present in the schema, which is mild redundancy, but every line is actionable and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Eleven parameters, all optional, no output schema, no required arguments. The description never says what happens when it is called with no filters at all, nor does it mention the limit cap of 50 that constrains result volume. For a wide, fully-optional search tool this leaves the agent guessing at default behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and every property already carries an example, so the schema does the heavy lifting and the baseline is 3. The description's examples duplicate rather than extend the schema (rs113488022, NM_004333.4:c.1799T>A, BRAF/V600E all appear verbatim in property descriptions), adding reinforcement but no new semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a specific verb+resource ("Search for variants"), which implicitly separates it from the sibling variant_get (fetch-one) and the annotation tools variant_oncokb/variant_trials. It stops short of explicitly naming those siblings or stating what a result row contains, so an agent must infer the search-vs-fetch boundary from the verb alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The bulleted examples give concrete, per-mode invocation patterns (rsid, HGVS, gene+hgvsp, significance) and the closing sentence is an explicit anti-pattern rule: do not use compound free-text, use gene + hgvsp instead. That is strong when-to-use guidance, but it never routes the agent to alternatives (e.g. use variant_get once you have an exact ID) or states preconditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
variant_trialsARead-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)
| Name | Required | Description | Default |
|---|---|---|---|
| variant | Yes | Variant ID (rsID, HGVS, or variant ID) |
TDQS
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.
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.
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.
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.
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.
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.
43 tool updates
v1.6.0-alpha.10- Changed
article_get1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
article_search2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / offset / maximumAdded value: +9007199254740991
- Changed
batch_get2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - removed
Input schema / properties / inputs / items / additionalPropertiesRemoved value: -false
- Changed
biomcp_configure2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / values / propertyNamesAdded value: +{ + "maxLength": 256, + "type": "string" +}
- Changed
discover1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
disease_drugs1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
disease_get1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
disease_search2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / offset / maximumAdded value: +9007199254740991
- Changed
disease_trials1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
drug_get1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
drug_search2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / offset / maximumAdded value: +9007199254740991
- Changed
drug_trials1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
ensembl_consequence1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
ensembl_homology3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / target_taxon / maximumAdded value: +9007199254740991 - added
Input schema / properties / target_taxon / minimumAdded value: +-9007199254740991
- Changed
ensembl_lookup1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
ensembl_region1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
genbank_genes1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
genbank_get7 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / max_response_bytes / maximumAdded value: +9007199254740991 - added
Input schema / properties / seq_start / maximumAdded value: +9007199254740991 - added
Input schema / properties / seq_stop / maximumAdded value: +9007199254740991 - added
Input schema / properties / strand / anyOfAdded value: +[ + { + "const": 1, + "type": "number" + }, + { + "const": 2, + "type": "number" + } +] - removed
Input schema / properties / strand / enumRemoved value: -[ - 1, - 2 -] - removed
Input schema / properties / strand / typeRemoved value: -"number"
- Changed
genbank_search2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / offset / maximumAdded value: +9007199254740991
- Changed
gene_articles1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
gene_diseases1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
gene_drugs1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
gene_enrich1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
gene_get1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
gene_search2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / offset / maximumAdded value: +9007199254740991
- Changed
gene_trials1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
geo_get2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / max_bytes / maximumAdded value: +9007199254740991
- Changed
geo_search2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / offset / maximumAdded value: +9007199254740991
- Changed
gtex_eqtl1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
gtex_expression1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Added
journal_metrics - Changed
patent_get1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
patent_search2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / offset / maximumAdded value: +9007199254740991
- Changed
pdb2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / offset / maximumAdded value: +9007199254740991
- Changed
preprint_fulltext2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / version / maximumAdded value: +9007199254740991
- Changed
sra_get1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
sra_search2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / offset / maximumAdded value: +9007199254740991
- Changed
trial_get1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
trial_search1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
variant_get1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
variant_oncokb1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
variant_search2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / offset / maximumAdded value: +9007199254740991
- Changed
variant_trials1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
32 tool updates
v1.6.0-alpha.7- Changed
article_get2 fields changed- added
Input schema / properties / id / minLengthAdded value: +1 - added
Input schema / properties / id / patternAdded value: +"^(?:\\d+|PMC\\d+(?:\\.\\d+)?|(?:doi:)?10\\.\\d{4,}\\/\\S+)$"
- Changed
batch_get1 field changed- added
Input schema / properties / inputs / items / properties / id / minLengthAdded value: +1
- Changed
disease_drugs1 field changed- added
Input schema / properties / disease_id / minLengthAdded value: +1
- Changed
disease_get1 field changed- added
Input schema / properties / disease_id / minLengthAdded value: +1
- Changed
disease_trials1 field changed- added
Input schema / properties / disease_id / minLengthAdded value: +1
- Changed
drug_get3 fields changed- added
Input schema / properties / name / minLengthAdded value: +1 - changed
Input schema / properties / sections / descriptionPrevious 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)" - changed
Input schema / properties / sections / items / enumPrevious 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" +]
- Changed
drug_trials1 field changed- added
Input schema / properties / drug / minLengthAdded value: +1
- Changed
ensembl_consequence1 field changed- added
Input schema / properties / variant / minLengthAdded value: +1
- Changed
ensembl_homology1 field changed- added
Input schema / properties / gene / minLengthAdded value: +1
- Changed
ensembl_lookup1 field changed- added
Input schema / properties / gene_or_id / minLengthAdded value: +1
- Changed
ensembl_region1 field changed- added
Input schema / properties / region / minLengthAdded value: +1
- Changed
genbank_genes2 fields changed- added
Input schema / properties / accession / minLengthAdded value: +1 - added
Input schema / properties / accession / patternAdded value: +"^[A-Z]{1,6}_?\\d+(?:\\.\\d+)?$"
- Changed
genbank_get3 fields changed- added
Input schema / properties / accession / minLengthAdded value: +1 - added
Input schema / properties / accession / patternAdded value: +"^[A-Z]{1,6}_?\\d+(?:\\.\\d+)?$" - added
Input schema / properties / sequence_outputAdded 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" +}
- Changed
gene_articles1 field changed- added
Input schema / properties / symbol / minLengthAdded value: +1
- Changed
gene_diseases1 field changed- added
Input schema / properties / symbol / minLengthAdded value: +1
- Changed
gene_drugs1 field changed- added
Input schema / properties / symbol / minLengthAdded value: +1
- Changed
gene_get1 field changed- added
Input schema / properties / symbol / minLengthAdded value: +1
- Changed
gene_trials1 field changed- added
Input schema / properties / symbol / minLengthAdded value: +1
- Changed
geo_get2 fields changed- changed
Input schema / properties / accession / descriptionPrevious 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)" - changed
Input schema / properties / download / descriptionPrevious 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)"
- Changed
gtex_eqtl2 fields changed- added
Input schema / properties / gene / minLengthAdded value: +1 - added
Input schema / properties / tissue / minLengthAdded value: +1
- Changed
gtex_expression1 field changed- added
Input schema / properties / gene / minLengthAdded value: +1
- Changed
patent_get2 fields changed- added
Input schema / properties / patent_id / minLengthAdded value: +1 - added
Input schema / properties / patent_id / patternAdded value: +"^[A-Z]{2}(?:RE|PP|H)?(?:[ /]*\\d){4,}[ /]*(?:[A-Z][ /]*\\d{0,2})?$"
- Changed
patent_search2 fields changed- changed
Input schema / properties / assignee / descriptionPrevious value: -"Filter by assignee/applicant organization, e.g. \"Moderna\""New value: +"Filter by assignee/applicant organization, e.g. \"Novartis\"" - changed
Input schema / properties / query / descriptionPrevious 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"
- Changed
preprint_fulltext2 fields changed- added
Input schema / properties / id / minLengthAdded value: +1 - added
Input schema / properties / id / patternAdded value: +"^10\\.1101\\/\\d{4}\\.\\d{2}\\.\\d{2}\\.\\d+$|^10\\.64898\\/\\S+$"
- Changed
sra_get3 fields changed- changed
Input schema / properties / accession / descriptionPrevious 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" - added
Input schema / properties / accession / minLengthAdded value: +1 - added
Input schema / properties / accession / patternAdded value: +"^[EDS]R[PXRS]\\d+$"
- Changed
sra_search1 field changed- changed
Input schema / properties / query / descriptionPrevious 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]\""
- Changed
trial_get2 fields changed- added
Input schema / properties / nct_id / minLengthAdded value: +1 - added
Input schema / properties / nct_id / patternAdded value: +"^NCT\\d{8}$"
- Changed
trial_search2 fields changed- changed
Input schema / properties / intervention_type / descriptionPrevious 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\")" - changed
Input schema / properties / phase / descriptionPrevious 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"
- Changed
variant_get1 field changed- added
Input schema / properties / id / minLengthAdded value: +1
- Changed
variant_oncokb2 fields changed- added
Input schema / properties / gene / minLengthAdded value: +1 - added
Input schema / properties / protein_change / minLengthAdded value: +1
- Changed
variant_search6 fields changed- added
Input schema / properties / gene / minLengthAdded value: +1 - added
Input schema / properties / hgvsc / minLengthAdded value: +1 - added
Input schema / properties / hgvsp / minLengthAdded value: +1 - changed
Input schema / properties / min_cadd / descriptionPrevious value: -"Minimum CADD score"New value: +"Minimum CADD score; echoed per row as cadd_phred so the filter is verifiable from each result" - added
Input schema / properties / query / minLengthAdded value: +1 - added
Input schema / properties / rsid / minLengthAdded value: +1
- Changed
variant_trials1 field changed- added
Input schema / properties / variant / minLengthAdded value: +1
5 tool updates
v1.6.0-alpha.3- Changed
article_search2 fields changed- changed
Input schema / properties / dateRange / descriptionPrevious 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." - changed
Input schema / properties / query / descriptionPrevious 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."
- Changed
disease_get1 field changed- changed
Input schema / properties / disease_id / descriptionPrevious 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)"
- Changed
genbank_get1 field changed- changed
Input schema / properties / accession / descriptionPrevious 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"
- Added
preprint_fulltext - Changed
variant_get1 field changed- changed
Input schema / properties / id / descriptionPrevious 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)"
6 tool updates
v1.6.0-alpha.2- Changed
disease_get1 field changed- changed
Input schema / properties / disease_id / descriptionPrevious value: -"Disease ID (e.g., \"DOID:0060268\", \"C0018794\")"New value: +"Disease ID (e.g., \"DOID:0060268\", \"MONDO:0007254\", \"OMIM:114480\", or UMLS CUI \"C0018794\")"
- Changed
drug_search1 field changed- changed
Input schema / properties / query / descriptionPrevious 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"
- Changed
gene_enrich3 fields changed- changed
Input schema / properties / genes / descriptionPrevious value: -"List of HGNC gene symbols"New value: +"List of HGNC gene symbols (minimum 3; duplicates and case variants are collapsed before submission)" - added
Input schema / properties / genes / minItemsAdded value: +3 - added
Input schema / properties / limitAdded value: +{ + "default": 30, + "description": "Maximum pathways to return (1-100; Reactome reports up to ~100)", + "maximum": 100, + "minimum": 1, + "type": "integer" +}
- Changed
gene_search1 field changed- changed
Input schema / properties / chromosome / descriptionPrevious 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\")"
- Changed
variant_get1 field changed- changed
Input schema / properties / id / descriptionPrevious 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)"
- Changed
variant_search2 fields changed- changed
Input schema / properties / hgvsc / descriptionPrevious 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)" - added
Input schema / properties / significance / descriptionAdded 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"
11 tool updates
v1.6.0-alpha.1- Changed
article_get5 fields changed- changed
Input schema / properties / citation_direction / descriptionPrevious 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" - added
Input schema / properties / fulltext_max_charsAdded 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" +} - added
Input schema / properties / fulltext_outputAdded 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" +} - changed
Input schema / properties / sections / descriptionPrevious 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." - changed
Input schema / properties / sections / items / enumPrevious value: -[ - "core", - "oa", - "annotations", - "graph", - "citation", - "all" -]New value: +[ + "core", + "oa", + "fulltext", + "annotations", + "graph", + "citation", + "all" +]
- Changed
article_search2 fields changed- changed
Input schema / properties / offset / descriptionPrevious 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" - added
Input schema / properties / query / minLengthAdded value: +1
- Changed
discover1 field changed- added
Input schema / properties / query / minLengthAdded value: +1
- Changed
disease_search1 field changed- added
Input schema / properties / query / minLengthAdded value: +1
- Changed
drug_search1 field changed- added
Input schema / properties / query / minLengthAdded value: +1
- Changed
genbank_search1 field changed- added
Input schema / properties / query / minLengthAdded value: +1
- Changed
gene_search1 field changed- added
Input schema / properties / query / minLengthAdded value: +1
- Changed
geo_search1 field changed- added
Input schema / properties / query / minLengthAdded value: +1
- Changed
patent_search1 field changed- added
Input schema / properties / query / minLengthAdded value: +1
- Changed
sra_search1 field changed- added
Input schema / properties / query / minLengthAdded value: +1
- Changed
trial_search1 field changed- added
Input schema / properties / query / minLengthAdded value: +1
2 tool updates
v1.5.0- Changed
article_get1 field changed- changed
Input schema / properties / id / descriptionPrevious 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\")"
- Changed
article_search4 fields changed- changed
Input schema / properties / dateRange / descriptionPrevious 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." - changed
Input schema / properties / offset / descriptionPrevious 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" - changed
Input schema / properties / source / descriptionPrevious 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." - changed
Input schema / properties / source / enumPrevious value: -[ - "pubmed", - "europepmc", - "semantic_scholar", - "pubtator", - "litsense" -]New value: +[ + "pubmed", + "europepmc", + "semantic_scholar", + "pubtator", + "litsense", + "preprint_only", + "arxiv" +]
1 tool update
v1.4.2- Changed
article_search2 fields changed- changed
Input schema / properties / offset / descriptionPrevious value: -"Result offset"New value: +"Result offset. EuropePMC windows are capped at 1000 rows; use narrower queries or another source for deeper results" - changed
Input schema / properties / query / descriptionPrevious 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\")"
1 tool update
v1.1.1- Changed
drug_get2 fields changed- changed
Input schema / properties / sections / descriptionPrevious value: -"Sections to include"New value: +"Sections to include (adverse_events = FDA FAERS adverse reactions ranked by report count; limit applies to reaction rows)" - changed
Input schema / properties / sections / items / enumPrevious 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" +]
1 tool update
v1.0.0- Added
biomcp_configure
22 tool updates
v0.7.1- Changed
article_get1 field changed- changed
Input schema / properties / citation_mode / descriptionPrevious 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."
- Changed
batch_get1 field changed- changed
Input schema / properties / inputs / items / properties / entity / enumPrevious value: -[ - "gene", - "variant", - "drug", - "disease", - "trial", - "article" -]New value: +[ + "gene", + "variant", + "drug", + "disease", + "trial", + "article", + "patent" +]
- Changed
disease_get1 field changed- changed
Input schema / properties / sections / items / enumPrevious value: -[ - "core", - "gene_associations", - "phenotypes", - "pathways", - "survival", - "all" -]New value: +[ + "core", + "gene_associations", + "phenotypes", + "pathways", + "all" +]
- Changed
disease_search1 field changed- removed
Input schema / properties / disease_typeRemoved value: -{ - "description": "Filter by disease type", - "type": "string" -}
- Changed
drug_search3 fields changed- removed
Input schema / properties / drug_typeRemoved value: -{ - "description": "Filter by drug type", - "type": "string" -} - changed
Input schema / properties / query / descriptionPrevious value: -"Drug name, mechanism, or keyword to search for"New value: +"Drug name, mechanism, or keyword to search" - removed
Input schema / properties / sourceRemoved value: -{ - "description": "Filter by source (mychem, chembl, openfda)", - "type": "string" -}
- Added
ensembl_consequence - Added
ensembl_homology - Added
ensembl_lookup - Added
ensembl_region - Added
genbank_genes - Added
genbank_get - Added
genbank_search - Changed
gene_search1 field changed- removed
Input schema / properties / gene_typeRemoved value: -{ - "description": "Filter by gene type", - "enum": [ - "protein-coding", - "ncRNA", - "pseudo" - ], - "type": "string" -}
- Added
geo_get - Added
geo_search - Added
gtex_eqtl - Added
gtex_expression - Added
patent_get - Added
patent_search - Added
sra_get - Added
sra_search - Changed
variant_get1 field changed- changed
Input schema / properties / sections / descriptionPrevious 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)"
25 tool updates
v0.1.8- First observed
article_get - First observed
article_search - First observed
batch_get - First observed
discover - First observed
disease_drugs - First observed
disease_get - First observed
disease_search - First observed
disease_trials - First observed
drug_get - First observed
drug_search - First observed
drug_trials - First observed
gene_articles - First observed
gene_diseases - First observed
gene_drugs - First observed
gene_enrich - First observed
gene_get - First observed
gene_search - First observed
gene_trials - First observed
pdb - First observed
trial_get - First observed
trial_search - First observed
variant_get - First observed
variant_oncokb - First observed
variant_search - First observed
variant_trials
TDQS
Scored across 43 tools
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.
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.
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.
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
Related MCP Connectors
MCP gateway federating 22 biomedical MCP servers behind one endpoint: gnomAD, ClinVar, HPO, VEP.
Auditable MCP server for PubMed, Europe PMC, ClinicalTrials.gov, and bioRxiv/medRxiv queries
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
MCP server for progressive tool usage at any scale (see https://klavis.ai)
Related MCP Servers
- AlicenseBqualityAmaintenanceAn MCP server that provides standardized access to biomedical knowledge bases and resources, enabling AI systems to retrieve verified information from sources like bioRxiv, EuropePMC, and various protein/gene databases.5231Apache 2.0
- AlicenseBqualityDmaintenanceThis 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.168MIT
- AlicenseNot gradedqualityCmaintenanceUnified MCP server providing AI-agent-ready access to AlphaFold, PubMed, ChEMBL, Ensembl, and 37+ scientific databases.MIT
- AlicenseAqualityAmaintenanceAn 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).2920MIT