[
  {
    "id": "europepmc",
    "displayName": "Europe PMC",
    "description": "Independent Europe PMC core literature search and abstracts.",
    "useWhen": "Use for direct Europe PMC Boolean/field/date literature search, actual available abstracts and explicit cursor pagination. No NCBI key is required. Use existing PubMed/PMC tools for full text; a link is not proof of retrieved full text.",
    "sources": [
      "Europe PMC"
    ],
    "termsUrl": "https://europepmc.org/RestfulWebService",
    "defaultEnabled": false,
    "requiresNcbi": false,
    "group": "directory",
    "tools": [
      {
        "id": "search_europepmc",
        "connector": "europepmc",
        "credentialKeys": [],
        "description": "Search Europe PMC directly using Boolean, field and date syntax. Returns core records including actual available abstracts and an explicit pagination cursor. Public: no NCBI key or contact email is required for this method. A full-text URL is not retrieved full text; follow PMC identifiers using the existing full-text tools.",
        "input": {
          "type": "object",
          "properties": {
            "query": {
              "type": "string",
              "minLength": 1,
              "maxLength": 12000
            },
            "page_size": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            },
            "cursor": {
              "type": "string",
              "minLength": 1,
              "maxLength": 4096,
              "default": "*"
            }
          },
          "required": [
            "query"
          ],
          "additionalProperties": false
        },
        "required": [
          "query"
        ],
        "exampleArgs": {
          "query": "TP53 AND liver fibrosis",
          "page_size": 5
        },
        "maxResponseBytes": 8000000,
        "returns": "{ source, source_url, retrieved_at, query, total_count, returned_count, records: [core records with id and optional abstractText/DOI/PMCID], cursor, next_cursor, continuation_available, pagination_note }. One page is not an exhaustive search; continuation does not guarantee a nonempty next page."
      }
    ]
  },
  {
    "id": "research-datasets",
    "displayName": "Research Datasets",
    "aliases": [
      "NHANES",
      "CHARLS",
      "CHNS",
      "SEER",
      "MIMIC",
      "eICU",
      "GBD"
    ],
    "description": "Official research-data access requirements and public file discovery.",
    "useWhen": "Use to discover public NHANES survey files or fixed MIMIC/eICU public demos, or to check official CHARLS/CHNS/SEER/GBD and other research-data access requirements. Metadata does not grant approval. There is no controlled-dataset login/download, local import, job service or analysis database; process acquired authorized files with existing analysis tools.",
    "sources": [
      "NHANES",
      "CHARLS",
      "CHNS",
      "SEER",
      "MIMIC",
      "eICU",
      "GBD"
    ],
    "termsUrl": "https://wwwn.cdc.gov/nchs/nhanes/",
    "defaultEnabled": false,
    "requiresNcbi": false,
    "group": "directory",
    "tools": [
      {
        "id": "get_dataset_access",
        "connector": "research-datasets",
        "credentialKeys": [],
        "description": "Read official access requirements and entry points for NHANES, CHARLS, CHNS, SEER, MIMIC, eICU, FAERS or GBD. This is declared guidance, not an account check, approval or a query of the source database. Recheck current official terms before acquisition.",
        "input": {
          "type": "object",
          "properties": {
            "dataset": {
              "type": "string",
              "enum": [
                "nhanes",
                "charls",
                "chns",
                "seer",
                "mimic",
                "eicu",
                "faers",
                "gbd"
              ]
            }
          },
          "required": [
            "dataset"
          ],
          "additionalProperties": false
        },
        "required": [
          "dataset"
        ],
        "exampleArgs": {
          "dataset": "seer"
        },
        "returns": "{ source, source_url, retrieved_at, dataset, portal, access_mode, guidance, authorization_verified: false, file_processing }. No account, download, persistence or approval is performed."
      },
      {
        "id": "list_nhanes_files",
        "connector": "research-datasets",
        "credentialKeys": [],
        "maxResponseBytes": 8000000,
        "description": "Discover official public NHANES XPT files for one survey cycle/component. Returns file and matching documentation links without downloading files. Rejects a changed/challenge page rather than treating it as an empty dataset.",
        "input": {
          "type": "object",
          "properties": {
            "cycle_begin_year": {
              "type": "integer",
              "minimum": 1999,
              "maximum": 2100
            },
            "component": {
              "type": "string",
              "enum": [
                "Demographics",
                "Dietary",
                "Examination",
                "Laboratory",
                "Questionnaire"
              ],
              "default": "Demographics"
            }
          },
          "required": [
            "cycle_begin_year"
          ],
          "additionalProperties": false
        },
        "required": [
          "cycle_begin_year"
        ],
        "exampleArgs": {
          "cycle_begin_year": 2017,
          "component": "Demographics"
        },
        "returns": "{ source, source_url, retrieved_at, cycle_begin_year, component, files: [{ filename, url, documentation_url }], note }. File availability does not validate variable definitions, survey weights or compatibility across cycles."
      },
      {
        "id": "list_physionet_demo_files",
        "connector": "research-datasets",
        "credentialKeys": [],
        "maxResponseBytes": 2000000,
        "description": "List files in the official MIMIC-IV 2.2 or eICU 2.0 public demo. Supports fixed demo locations only; this never probes credentialed projects, accepts arbitrary URLs or sends account credentials.",
        "input": {
          "type": "object",
          "properties": {
            "dataset": {
              "type": "string",
              "enum": [
                "mimic",
                "eicu"
              ]
            },
            "directory": {
              "type": "string",
              "enum": [
                "root",
                "hosp",
                "icu"
              ],
              "default": "root"
            }
          },
          "required": [
            "dataset"
          ],
          "additionalProperties": false
        },
        "required": [
          "dataset"
        ],
        "exampleArgs": {
          "dataset": "mimic",
          "directory": "hosp"
        },
        "returns": "{ source, source_url, retrieved_at, dataset, version, files: [{filename,url}], scope: \"public_demo\", full_data_authorized: false }. Empty/changed pages are errors, not evidence about full-data availability."
      }
    ]
  },
  {
    "id": "chea3",
    "displayName": "ChEA3",
    "description": "Transcription-factor enrichment rankings and official GMT library links.",
    "useWhen": "Use for ChEA3 transcription-factor enrichment from gene symbols or official GMT library discovery. Preserve per-library ranks and scoring context. The public API needs no key, does not report all recognized input genes, and ranks do not prove causality.",
    "sources": [
      "ChEA3"
    ],
    "termsUrl": "https://maayanlab.cloud/chea3/",
    "defaultEnabled": false,
    "requiresNcbi": false,
    "group": "featured",
    "tools": [
      {
        "id": "rank_transcription_factors",
        "connector": "chea3",
        "credentialKeys": [],
        "description": "Submit a public gene-symbol list to the official ChEA3 enrichment API. Returns each library ranking separately; ranks and scores are hypothesis evidence, not causal validation. The request is submitted once and does not identify all recognized input genes.",
        "input": {
          "type": "object",
          "properties": {
            "genes": {
              "type": "array",
              "minItems": 1,
              "maxItems": 2000,
              "items": {
                "type": "string",
                "pattern": "^[A-Za-z0-9_.-]{1,80}$"
              }
            },
            "query_name": {
              "type": "string",
              "minLength": 1,
              "maxLength": 100,
              "default": "query"
            },
            "top_n": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            }
          },
          "required": [
            "genes"
          ],
          "additionalProperties": false
        },
        "required": [
          "genes"
        ],
        "exampleArgs": {
          "genes": [
            "FOXM1",
            "SMAD9",
            "MYC",
            "SMAD3",
            "STAT1",
            "STAT3"
          ],
          "top_n": 5
        },
        "maxResponseBytes": 8000000,
        "returns": "{ source, source_url, retrieved_at, submitted_gene_count, recognized_gene_count: null, libraries: { library: { records, total_records, truncated } } }. Inputs are deduplicated without inventing recognized genes."
      },
      {
        "id": "list_gmt_libraries",
        "connector": "chea3",
        "credentialKeys": [],
        "maxResponseBytes": 2000000,
        "description": "Discover official ChEA3 GMT file links from its download page. Primary, additional and benchmarking libraries may differ; a downloadable library is not automatically the library used by an online result. No files are downloaded by this method.",
        "input": {
          "type": "object",
          "properties": {},
          "required": [],
          "additionalProperties": false
        },
        "exampleArgs": {},
        "returns": "{ source, source_url, retrieved_at, files: [{filename,url}] }. A changed/challenge page fails explicitly; a result is a file catalog, not a completed download."
      }
    ]
  },
  {
    "id": "biodbnet",
    "displayName": "bioDBnet",
    "description": "Identifier discovery, conversion, recognition, orthology and pathways.",
    "useWhen": "Use the official bioDBnet REST API for identifier-type discovery, supported output nodes, db2db conversion, dbFind recognition, dbOrtho mapping or pathway listing. Preserve ambiguous/unmapped outputs and provenance; no local table or Python environment is created.",
    "sources": [
      "bioDBnet"
    ],
    "termsUrl": "https://biodbnet-abcc.ncifcrf.gov/webServices/RestWebService.php",
    "defaultEnabled": false,
    "requiresNcbi": false,
    "group": "featured",
    "tools": [
      {
        "id": "list_input_types",
        "connector": "biodbnet",
        "credentialKeys": [],
        "description": "Call the official bioDBnet getinputs REST operation. Discover supported node names before conversion. Preserve unmapped inputs and multiple outputs; absence is not proof that no biological mapping exists.",
        "input": {
          "type": "object",
          "properties": {},
          "required": [],
          "additionalProperties": false
        },
        "required": [],
        "exampleArgs": {},
        "maxResponseBytes": 4000000,
        "returns": "{ source, source_url, retrieved_at, operation, result }. Full upstream JSON is retained within the bounded response budget. Upstream errors are errors; no local database, mapping inference or implicit selection of one output is performed."
      },
      {
        "id": "list_output_types",
        "connector": "biodbnet",
        "credentialKeys": [],
        "description": "Call the official bioDBnet getoutputsforinput REST operation. Discover supported node names before conversion. Preserve unmapped inputs and multiple outputs; absence is not proof that no biological mapping exists.",
        "input": {
          "type": "object",
          "properties": {
            "input_type": {
              "type": "string",
              "minLength": 1,
              "maxLength": 80,
              "pattern": "^[A-Za-z0-9 _-]+$"
            }
          },
          "required": [
            "input_type"
          ],
          "additionalProperties": false
        },
        "required": [
          "input_type"
        ],
        "exampleArgs": {
          "input_type": "genesymbol"
        },
        "maxResponseBytes": 4000000,
        "returns": "{ source, source_url, retrieved_at, operation, result }. Full upstream JSON is retained within the bounded response budget. Upstream errors are errors; no local database, mapping inference or implicit selection of one output is performed."
      },
      {
        "id": "convert_ids",
        "connector": "biodbnet",
        "credentialKeys": [],
        "description": "Call the official bioDBnet db2db REST operation. Discover supported node names before conversion. Preserve unmapped inputs and multiple outputs; absence is not proof that no biological mapping exists.",
        "input": {
          "type": "object",
          "properties": {
            "input_type": {
              "type": "string",
              "minLength": 1,
              "maxLength": 80,
              "pattern": "^[A-Za-z0-9 _-]+$"
            },
            "values": {
              "type": "array",
              "minItems": 1,
              "maxItems": 200,
              "items": {
                "type": "string",
                "minLength": 1,
                "maxLength": 120,
                "pattern": "^[^,\\r\\n]+$"
              }
            },
            "outputs": {
              "type": "array",
              "minItems": 1,
              "maxItems": 20,
              "items": {
                "type": "string",
                "minLength": 1,
                "maxLength": 80,
                "pattern": "^[A-Za-z0-9 _-]+$"
              }
            },
            "taxon_id": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100000000,
              "default": 9606
            }
          },
          "required": [
            "input_type",
            "values",
            "outputs"
          ],
          "additionalProperties": false
        },
        "required": [
          "input_type",
          "values",
          "outputs"
        ],
        "exampleArgs": {
          "input_type": "genesymbol",
          "values": [
            "TP53"
          ],
          "outputs": [
            "geneid"
          ],
          "taxon_id": 9606
        },
        "maxResponseBytes": 4000000,
        "returns": "{ source, source_url, retrieved_at, operation, result }. Full upstream JSON is retained within the bounded response budget. Upstream errors are errors; no local database, mapping inference or implicit selection of one output is performed."
      },
      {
        "id": "recognize_ids",
        "connector": "biodbnet",
        "credentialKeys": [],
        "description": "Call the official bioDBnet dbfind REST operation. Discover supported node names before conversion. Preserve unmapped inputs and multiple outputs; absence is not proof that no biological mapping exists.",
        "input": {
          "type": "object",
          "properties": {
            "values": {
              "type": "array",
              "minItems": 1,
              "maxItems": 200,
              "items": {
                "type": "string",
                "minLength": 1,
                "maxLength": 120,
                "pattern": "^[^,\\r\\n]+$"
              }
            },
            "output_type": {
              "type": "string",
              "minLength": 1,
              "maxLength": 80,
              "pattern": "^[A-Za-z0-9 _-]+$"
            },
            "taxon_id": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100000000,
              "default": 9606
            }
          },
          "required": [
            "values",
            "output_type"
          ],
          "additionalProperties": false
        },
        "required": [
          "values",
          "output_type"
        ],
        "exampleArgs": {
          "values": [
            "TP53"
          ],
          "output_type": "geneid"
        },
        "maxResponseBytes": 4000000,
        "returns": "{ source, source_url, retrieved_at, operation, result }. Full upstream JSON is retained within the bounded response budget. Upstream errors are errors; no local database, mapping inference or implicit selection of one output is performed."
      },
      {
        "id": "map_orthologs",
        "connector": "biodbnet",
        "credentialKeys": [],
        "description": "Call the official bioDBnet dbortho REST operation. Discover supported node names before conversion. Preserve unmapped inputs and multiple outputs; absence is not proof that no biological mapping exists.",
        "input": {
          "type": "object",
          "properties": {
            "input_type": {
              "type": "string",
              "minLength": 1,
              "maxLength": 80,
              "pattern": "^[A-Za-z0-9 _-]+$"
            },
            "values": {
              "type": "array",
              "minItems": 1,
              "maxItems": 200,
              "items": {
                "type": "string",
                "minLength": 1,
                "maxLength": 120,
                "pattern": "^[^,\\r\\n]+$"
              }
            },
            "input_taxon": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100000000,
              "default": 9606
            },
            "output_taxon": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100000000,
              "default": 10090
            },
            "output_type": {
              "type": "string",
              "minLength": 1,
              "maxLength": 80,
              "pattern": "^[A-Za-z0-9 _-]+$"
            }
          },
          "required": [
            "input_type",
            "values",
            "output_type"
          ],
          "additionalProperties": false
        },
        "required": [
          "input_type",
          "values",
          "output_type"
        ],
        "exampleArgs": {
          "input_type": "genesymbol",
          "values": [
            "TP53"
          ],
          "output_type": "genesymbol",
          "input_taxon": 9606,
          "output_taxon": 10090
        },
        "maxResponseBytes": 4000000,
        "returns": "{ source, source_url, retrieved_at, operation, result }. Full upstream JSON is retained within the bounded response budget. Upstream errors are errors; no local database, mapping inference or implicit selection of one output is performed."
      },
      {
        "id": "list_pathways",
        "connector": "biodbnet",
        "credentialKeys": [],
        "description": "Call the official bioDBnet getpathways REST operation. Discover supported node names before conversion. Preserve unmapped inputs and multiple outputs; absence is not proof that no biological mapping exists.",
        "input": {
          "type": "object",
          "properties": {
            "taxon_id": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100000000,
              "default": 9606
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "required": [],
        "exampleArgs": {
          "taxon_id": 9606
        },
        "maxResponseBytes": 4000000,
        "returns": "{ source, source_url, retrieved_at, operation, result }. Full upstream JSON is retained within the bounded response budget. Upstream errors are errors; no local database, mapping inference or implicit selection of one output is performed."
      }
    ]
  },
  {
    "id": "ctd",
    "displayName": "CTD",
    "description": "Official CTD public report entry points and access terms.",
    "useWhen": "Use to find official CTD chemical/gene/disease/pathway/exposure report URLs and terms. This is a maintained file catalog, not live verification, a web All query, a relationship-query API or an import service. Stop on official browser verification; retain CTD headers and citations in downstream analysis.",
    "sources": [
      "CTD"
    ],
    "termsUrl": "https://ctdbase.org/about/legal.jsp",
    "defaultEnabled": false,
    "requiresNcbi": false,
    "group": "directory",
    "tools": [
      {
        "id": "list_ctd_reports",
        "connector": "ctd",
        "credentialKeys": [],
        "description": "Return a maintained subset of official CTD public report entry points and source terms. This static catalog does not verify live availability or provide CTD web queries. Use the official page to obtain files; stop if human verification is required.",
        "input": {
          "type": "object",
          "properties": {},
          "required": [],
          "additionalProperties": false
        },
        "exampleArgs": {},
        "returns": "{ source, source_url, retrieved_at, live_verified: false, catalog_scope, files: [{filename,url}], terms_url, note }. Links may change; preserve CTD citation/license headers when processing acquired files."
      }
    ]
  },
  {
    "id": "tcia",
    "displayName": "TCIA",
    "aliases": [
      "TCIA",
      "Cancer Imaging Archive",
      "NBIA"
    ],
    "description": "Public cancer imaging collections and series metadata from TCIA.",
    "useWhen": "Use to discover public TCIA imaging collections by keyword, retrieve collection download requirements and licenses by exact short title, or inspect an existing DICOM SeriesInstanceUID. Returns metadata and download entrypoints, not images or restricted data.",
    "sources": [
      "TCIA",
      "NBIA"
    ],
    "termsUrl": "https://www.cancerimagingarchive.net/data-usage-policies-and-restrictions/",
    "defaultEnabled": false,
    "requiresNcbi": false,
    "group": "directory",
    "tools": [
      {
        "connector": "tcia",
        "credentialKeys": [],
        "maxResponseBytes": 2000000,
        "id": "search_collections",
        "description": "Search public TCIA collections by keyword, one page at a time. Includes cancer, modality, DOI and download requirements. Collection Manager and NBIA have different coverage. Download links may be Data Retriever manifests, not images. Does not download DICOM or access restricted data.",
        "input": {
          "type": "object",
          "properties": {
            "query": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200,
              "pattern": "\\S"
            },
            "page": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000
            },
            "page_size": {
              "type": "integer",
              "minimum": 1,
              "maximum": 20
            }
          },
          "required": [
            "query"
          ],
          "additionalProperties": false
        },
        "required": [
          "query"
        ],
        "exampleArgs": {
          "query": "LIDC-IDRI",
          "page_size": 5
        },
        "returns": "{ source_url, total, page, next_page, collections, records_truncated }. Selected metadata only; per-record details_truncated marks capped lists. Empty results do not prove absence outside TCIA."
      },
      {
        "connector": "tcia",
        "credentialKeys": [],
        "maxResponseBytes": 2000000,
        "id": "get_collection",
        "description": "Find one TCIA collection by exact short title returned by search_collections. Searches up to 20 candidates and verifies identity: the upstream include=id filter is unreliable. A null result with lookup_complete=false means refine the lookup, not absence. Returns license and downloader requirements; does not download files.",
        "input": {
          "type": "object",
          "properties": {
            "short_title": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200,
              "pattern": "\\S"
            }
          },
          "required": [
            "short_title"
          ],
          "additionalProperties": false
        },
        "required": [
          "short_title"
        ],
        "exampleArgs": {
          "short_title": "4D-Lung"
        },
        "returns": "{ source_url, collection: object|null, lookup_complete, candidates_total }. Exact case-insensitive short-title match; duplicate identities fail. Selected metadata only."
      },
      {
        "connector": "tcia",
        "credentialKeys": [],
        "maxResponseBytes": 2000000,
        "id": "get_series",
        "description": "Retrieve public NBIA metadata for an exact DICOM SeriesInstanceUID: collection, subject/study identity, modality, image count, byte size and license. Use an existing UID from TCIA; no broad enumeration or image download. This endpoint does not cover every TCIA collection.",
        "input": {
          "type": "object",
          "properties": {
            "series_uid": {
              "type": "string",
              "maxLength": 64,
              "pattern": "^[0-9]+(?:\\.[0-9]+)+$"
            }
          },
          "required": [
            "series_uid"
          ],
          "additionalProperties": false
        },
        "required": [
          "series_uid"
        ],
        "exampleArgs": {
          "series_uid": "1.3.6.1.4.1.14519.5.2.1.6834.5010.189721824525842725510380467695"
        },
        "returns": "{ source_url, series: object|null }. Empty NBIA response means no public record. Selected upstream fields retain original names and number strings."
      }
    ]
  },
  {
    "id": "kegg",
    "displayName": "KEGG",
    "aliases": [
      "KEGG"
    ],
    "description": "KEGG pathways, entries and gene mappings. Academic-use and licensing restrictions apply.",
    "useWhen": "Use for KEGG pathway, KO, compound and reaction summaries or gene-to-pathway/UniProt mappings. Public API is for eligible academic use only; non-academic use and service provision require appropriate licensing. Enabling this connector does not grant a license. For enrichment use the Genes connector.",
    "sources": [
      "KEGG"
    ],
    "termsUrl": "https://www.kegg.jp/kegg/legal.html",
    "defaultEnabled": false,
    "requiresNcbi": false,
    "group": "directory",
    "tools": [
      {
        "connector": "kegg",
        "credentialKeys": [],
        "maxResponseBytes": 2000000,
        "id": "search_entries",
        "description": "Search KEGG pathway, KO, compound or reaction names. Returns a capped list, not server-side pagination; narrow the query when truncated. Public KEGG API is for eligible academic use only; non-academic use and service provision require appropriate licensing. Enabling this connector does not grant a license.",
        "input": {
          "type": "object",
          "properties": {
            "database": {
              "type": "string",
              "enum": [
                "pathway",
                "ko",
                "compound",
                "reaction"
              ]
            },
            "query": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200,
              "pattern": "\\S"
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100
            }
          },
          "required": [
            "database",
            "query"
          ],
          "additionalProperties": false
        },
        "required": [
          "database",
          "query"
        ],
        "exampleArgs": {
          "database": "pathway",
          "query": "glycolysis"
        },
        "returns": "{ source_url, records:[{id,name}], returned, matched, truncated }. matched counts rows in the bounded upstream response, not a global total."
      },
      {
        "connector": "kegg",
        "credentialKeys": [],
        "maxResponseBytes": 2000000,
        "id": "get_entry",
        "description": "Read one KEGG pathway, KO, compound or reaction summary. Returns selected flatfile fields with explicit truncation; excludes bulk GENES, sequences and pathway images. HTTP 404 is not an empty record. Public KEGG API is for eligible academic use only; non-academic use and service provision require appropriate licensing. Enabling this connector does not grant a license.",
        "input": {
          "type": "object",
          "properties": {
            "id": {
              "type": "string",
              "pattern": "^(?:[KCR][0-9]{5}|(?:map|[a-z]{3,4})[0-9]{5})$"
            }
          },
          "required": [
            "id"
          ],
          "additionalProperties": false
        },
        "required": [
          "id"
        ],
        "exampleArgs": {
          "id": "hsa00010"
        },
        "returns": "{ source_url, id, fields, truncated, selected_fields_only:true }. fields contains at most 30 lines of 500 characters each per selected field. Unselected sections are intentionally omitted."
      },
      {
        "connector": "kegg",
        "credentialKeys": [],
        "maxResponseBytes": 2000000,
        "id": "map_gene",
        "description": "Map one organism-qualified KEGG gene to pathways or UniProt accessions. Preserves one-to-many matches; no automatic choice of a canonical protein. Results are capped without server-side pagination. Public KEGG API is for eligible academic use only; non-academic use and service provision require appropriate licensing. Enabling this connector does not grant a license.",
        "input": {
          "type": "object",
          "properties": {
            "gene": {
              "type": "string",
              "maxLength": 80,
              "pattern": "^[a-z][a-z0-9]{1,4}:[A-Za-z0-9_.-]+$"
            },
            "target": {
              "type": "string",
              "enum": [
                "pathway",
                "uniprot"
              ]
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100
            }
          },
          "required": [
            "gene",
            "target"
          ],
          "additionalProperties": false
        },
        "required": [
          "gene",
          "target"
        ],
        "exampleArgs": {
          "gene": "hsa:7157",
          "target": "uniprot"
        },
        "returns": "{ source_url, mappings:[{from,to}], matched, truncated }. Empty matches do not prove absence of biological relationships."
      }
    ]
  },
  {
    "id": "rxnorm",
    "displayName": "RxNorm / RxNav",
    "aliases": [
      "RxNorm",
      "RxNav",
      "RxCUI"
    ],
    "description": "Drug name resolution and concept properties from RxNorm.",
    "useWhen": "Use to resolve drug names to RxCUIs and retrieve active RxNorm concept names and term types.",
    "sources": [
      "RxNorm",
      "RxNav"
    ],
    "termsUrl": "https://lhncbc.nlm.nih.gov/RxNav/TermsofService.html",
    "defaultEnabled": false,
    "requiresNcbi": false,
    "group": "directory",
    "tools": [
      {
        "id": "resolve_name",
        "connector": "rxnorm",
        "credentialKeys": [],
        "maxResponseBytes": 2000000,
        "description": "Resolve a drug name to active RxNorm RxCUIs. Exact matching is the default; normalized matching can ignore salts and word order. Retains all ambiguous matches and does not establish clinical equivalence.",
        "input": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string",
              "minLength": 1,
              "maxLength": 300,
              "pattern": "\\S"
            },
            "search": {
              "type": "integer",
              "enum": [
                0,
                1,
                2
              ],
              "description": "0 exact (default), 1 normalized, 2 exact then normalized."
            }
          },
          "required": [
            "name"
          ],
          "additionalProperties": false
        },
        "required": [
          "name"
        ],
        "exampleArgs": {
          "name": "aspirin"
        },
        "returns": "{ source, source_url, search, rxcuis: string[] }. Empty array means no active match. No pagination; all returned identities are retained."
      },
      {
        "id": "get_concept",
        "connector": "rxnorm",
        "credentialKeys": [],
        "maxResponseBytes": 2000000,
        "description": "Retrieve active RxNorm concept properties by RxCUI: name, synonym, term type, language and suppression flag. An absent record is not proof that an identifier never existed.",
        "input": {
          "type": "object",
          "properties": {
            "rxcui": {
              "type": "string",
              "pattern": "^[0-9]{1,12}$"
            }
          },
          "required": [
            "rxcui"
          ],
          "additionalProperties": false
        },
        "required": [
          "rxcui"
        ],
        "exampleArgs": {
          "rxcui": "1191"
        },
        "returns": "{ source, source_url, rxcui, properties: { rxcui, name, tty, ... } | null }. Null means no active concept properties; historical identifiers are not automatically remapped."
      }
    ]
  },
  {
    "id": "dailymed",
    "displayName": "DailyMed",
    "aliases": [
      "DailyMed",
      "SPL history"
    ],
    "description": "Drug label identities and version history from DailyMed.",
    "useWhen": "Use to discover DailyMed Structured Product Labels by drug name and retrieve publication and version history by SPL SET ID.",
    "sources": [
      "DailyMed"
    ],
    "termsUrl": "https://dailymed.nlm.nih.gov/dailymed/about-dailymed.cfm",
    "defaultEnabled": false,
    "requiresNcbi": false,
    "group": "directory",
    "tools": [
      {
        "id": "search_labels",
        "connector": "dailymed",
        "credentialKeys": [],
        "maxResponseBytes": 2000000,
        "description": "Search DailyMed SPL label identities, titles, versions and publication dates by drug name, optionally narrowed to an RxCUI. Retrieves one metadata page; label presence does not establish FDA approval.",
        "input": {
          "type": "object",
          "properties": {
            "drug_name": {
              "type": "string",
              "minLength": 1,
              "maxLength": 300,
              "pattern": "\\S"
            },
            "rxcui": {
              "type": "string",
              "pattern": "^[0-9]{1,12}$"
            },
            "page": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100000,
              "default": 1
            },
            "page_size": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            }
          },
          "required": [
            "drug_name"
          ],
          "additionalProperties": false
        },
        "required": [
          "drug_name"
        ],
        "exampleArgs": {
          "drug_name": "aspirin",
          "page_size": 5
        },
        "returns": "{ source, source_url, api_version, metadata, data: [{ setid, title, spl_version, published_date }], next_page }. Explicit one-based pagination; null next_page ends the results. No full label or file download."
      },
      {
        "id": "get_label_history",
        "connector": "dailymed",
        "credentialKeys": [],
        "maxResponseBytes": 2000000,
        "description": "Retrieve one page of DailyMed SPL version history for an exact SET ID, preserving the label identity, title and publication dates. Does not download historical label content.",
        "input": {
          "type": "object",
          "properties": {
            "setid": {
              "type": "string",
              "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$"
            },
            "page": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100000,
              "default": 1
            },
            "page_size": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            }
          },
          "required": [
            "setid"
          ],
          "additionalProperties": false
        },
        "required": [
          "setid"
        ],
        "exampleArgs": {
          "setid": "9aa7140c-012c-4ea6-866d-4732e915dab6"
        },
        "returns": "{ source, source_url, api_version, metadata, data: { spl: { setid, title }, history: [{ spl_version, published_date }] }, next_page }. Explicit one-based pagination."
      }
    ]
  },
  {
    "id": "biosamples",
    "displayName": "BioSamples",
    "aliases": [
      "BioSamples",
      "EBI BioSamples"
    ],
    "description": "Public sample metadata and cross-references from BioSamples.",
    "useWhen": "Use to search public EMBL-EBI BioSamples records or retrieve sample characteristics, ontology terms, external references and provenance dates by accession.",
    "sources": [
      "EMBL-EBI BioSamples"
    ],
    "termsUrl": "https://www.ebi.ac.uk/about/terms-of-use",
    "defaultEnabled": false,
    "requiresNcbi": false,
    "group": "directory",
    "tools": [
      {
        "id": "search_samples",
        "connector": "biosamples",
        "credentialKeys": [],
        "maxResponseBytes": 2000000,
        "description": "Search public EMBL-EBI BioSamples metadata, one cursor page at a time. Retains characteristics, ontology terms, external references and release/update dates. Use the returned next_cursor with unchanged query and page_size; no automatic traversal.",
        "input": {
          "type": "object",
          "properties": {
            "query": {
              "type": "string",
              "minLength": 1,
              "maxLength": 500,
              "pattern": "\\S"
            },
            "page_size": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            },
            "cursor": {
              "type": "string",
              "minLength": 1,
              "maxLength": 2048,
              "pattern": "\\S"
            }
          },
          "required": [
            "query"
          ],
          "additionalProperties": false
        },
        "required": [
          "query"
        ],
        "exampleArgs": {
          "query": "leukaemia",
          "page_size": 5
        },
        "returns": "{ source, source_url, samples: [{ accession, name, characteristics, externalReferences, ... }], next_cursor: string | null }. Cursor comes from the upstream next link; null ends the results. No total count is inferred."
      },
      {
        "id": "get_sample",
        "connector": "biosamples",
        "credentialKeys": [],
        "maxResponseBytes": 2000000,
        "description": "Retrieve a public BioSamples record by accession, with default applied curations, characteristics, ontology terms, relationships, external references and provenance dates. Linked resources and files are not fetched.",
        "input": {
          "type": "object",
          "properties": {
            "accession": {
              "type": "string",
              "pattern": "^SAM[END][A-Z]?[0-9]{1,15}$"
            }
          },
          "required": [
            "accession"
          ],
          "additionalProperties": false
        },
        "required": [
          "accession"
        ],
        "exampleArgs": {
          "accession": "SAMD00023550"
        },
        "returns": "{ source, source_url, sample: { accession, name, ... } }. HTTP 404 means the public record is unavailable."
      }
    ]
  },
  {
    "id": "wikipathways",
    "displayName": "WikiPathways",
    "aliases": [
      "WikiPathways",
      "WP pathways"
    ],
    "description": "Pathway discovery, metadata and revisions from WikiPathways.",
    "useWhen": "Use to find WikiPathways by name and species or retrieve metadata, authors and revision dates by WP identifier.",
    "sources": [
      "WikiPathways"
    ],
    "termsUrl": "https://www.wikipathways.org/json/",
    "defaultEnabled": false,
    "requiresNcbi": false,
    "group": "directory",
    "tools": [
      {
        "id": "search_pathways",
        "connector": "wikipathways",
        "credentialKeys": [],
        "maxResponseBytes": 2000000,
        "description": "Find WikiPathways by case-insensitive name or WP identifier substring, optionally restricted to an exact scientific species name. Filters the current official listPathways JSON snapshot locally; this is not full-text or gene search.",
        "input": {
          "type": "object",
          "properties": {
            "query": {
              "type": "string",
              "minLength": 1,
              "maxLength": 300,
              "pattern": "\\S"
            },
            "species": {
              "type": "string",
              "minLength": 1,
              "maxLength": 100,
              "pattern": "\\S"
            },
            "offset": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100000,
              "default": 0
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            }
          },
          "required": [
            "query"
          ],
          "additionalProperties": false
        },
        "required": [
          "query"
        ],
        "exampleArgs": {
          "query": "glycolysis",
          "species": "Homo sapiens"
        },
        "returns": "{ source, source_url, pagination: \"local_snapshot\", total, offset, next_offset, pathways: [{ id, url, name, species, revision }] }. Stable ID sorting within each fetched snapshot; data can change between calls. Only the selected slice is returned."
      },
      {
        "id": "get_pathway",
        "connector": "wikipathways",
        "credentialKeys": [],
        "maxResponseBytes": 2000000,
        "description": "Retrieve one WikiPathways metadata record by WP identifier from the current getPathwayInfo JSON snapshot. Preserves species, revision, authors, source description and citations. Does not retrieve pathway graphs, gene mappings or historical revisions.",
        "input": {
          "type": "object",
          "properties": {
            "id": {
              "type": "string",
              "pattern": "^WP[0-9]{1,10}$"
            }
          },
          "required": [
            "id"
          ],
          "additionalProperties": false
        },
        "required": [
          "id"
        ],
        "exampleArgs": {
          "id": "WP534"
        },
        "returns": "{ source, source_url, pathway: { id, url, name, species, revision, authors, description, citedIn } | null }. Null means absent from the current snapshot. Descriptions may already be abbreviated by the source."
      }
    ]
  },
  {
    "id": "orphadata",
    "displayName": "Orphadata",
    "aliases": [
      "Orphanet",
      "ORPHAcode"
    ],
    "description": "Rare-disease genes, phenotypes and frequency evidence from Orphadata.",
    "useWhen": "Use for Orphanet rare-disease gene associations and HPO phenotype frequencies by ORPHAcode.",
    "sources": [
      "Orphadata",
      "Orphanet"
    ],
    "termsUrl": "https://www.orphadata.com/orphanet-scientific-knowledge/",
    "defaultEnabled": false,
    "requiresNcbi": false,
    "group": "directory",
    "tools": [
      {
        "id": "get_disease_genes",
        "connector": "orphadata",
        "credentialKeys": [],
        "maxResponseBytes": 2000000,
        "description": "Retrieve Orphadata rare-disease gene associations by ORPHAcode, including association type/status, validation sources and gene database mappings.",
        "input": {
          "type": "object",
          "properties": {
            "orphacode": {
              "type": "integer",
              "minimum": 1,
              "maximum": 2147483647
            }
          },
          "required": [
            "orphacode"
          ],
          "additionalProperties": false
        },
        "required": [
          "orphacode"
        ],
        "exampleArgs": {
          "orphacode": 166024
        },
        "returns": "{ source: \"Orphadata / Orphanet\", api_version: \"1.0.0\", source_url, data: { __count, __licence, results: { Date, ... } }, datasetCategory, ... }. Gene results contain DisorderGeneAssociation; phenotype results contain Disorder.HPODisorderAssociation with HPO and HPOFrequency. Retains dataset dates, validation and CC BY 4.0 attribution. Single disease, no pagination; HTTP 404 means no dataset record."
      },
      {
        "id": "get_disease_phenotypes",
        "connector": "orphadata",
        "credentialKeys": [],
        "maxResponseBytes": 2000000,
        "description": "Retrieve Orphadata rare-disease HPO phenotypes and frequency categories by ORPHAcode. Keeps diagnostic criteria and validation metadata; frequency categories are not patient-specific probabilities.",
        "input": {
          "type": "object",
          "properties": {
            "orphacode": {
              "type": "integer",
              "minimum": 1,
              "maximum": 2147483647
            }
          },
          "required": [
            "orphacode"
          ],
          "additionalProperties": false
        },
        "required": [
          "orphacode"
        ],
        "exampleArgs": {
          "orphacode": 58
        },
        "returns": "{ source: \"Orphadata / Orphanet\", api_version: \"1.0.0\", source_url, data: { __count, __licence, results: { Date, ... } }, datasetCategory, ... }. Gene results contain DisorderGeneAssociation; phenotype results contain Disorder.HPODisorderAssociation with HPO and HPOFrequency. Retains dataset dates, validation and CC BY 4.0 attribution. Single disease, no pagination; HTTP 404 means no dataset record."
      }
    ]
  },
  {
    "id": "encori",
    "displayName": "ENCORI",
    "aliases": [
      "starBase",
      "RNA interactome"
    ],
    "description": "RNA interactions, regulatory evidence and bulk datasets from ENCORI.",
    "useWhen": "Use for ENCORI (starBase) miRNA targets, RNA–RNA interactions, RBP targets and disease associations, ceRNA networks, RBP motif rankings, dataset binding sites, online reference tables, and bulk dataset discovery and downloads.",
    "sources": [
      "ENCORI"
    ],
    "termsUrl": "https://rnasysu.com/encori/",
    "requiresNcbi": false,
    "group": "featured",
    "tools": [
      {
        "connector": "encori",
        "credentialKeys": [],
        "id": "query_mirna_targets",
        "description": "Query official miRNA target evidence. Use mirna=all for unrestricted miRNA; preserve cell_type exactly. program is a comma-separated list of PITA, RNA22, miRmap, DIANA-microT, miRanda, PicTar or TargetScan, never all.",
        "input": {
          "type": "object",
          "properties": {
            "assembly": {
              "type": "string",
              "enum": [
                "hg38",
                "mm10"
              ]
            },
            "gene_type": {
              "type": "string",
              "enum": [
                "mRNA",
                "lncRNA",
                "pseudogene",
                "circRNA",
                "sncRNA"
              ]
            },
            "mirna": {
              "type": "string",
              "minLength": 1,
              "maxLength": 256,
              "pattern": "^[^\\r\\n\\u0000]*[^\\s\\u0000][^\\r\\n\\u0000]*$"
            },
            "clip_exp_num": {
              "type": "integer",
              "minimum": 0,
              "maximum": 999
            },
            "degra_exp_num": {
              "type": "integer",
              "minimum": 0,
              "maximum": 999
            },
            "pancancer_num": {
              "type": "integer",
              "minimum": 0,
              "maximum": 32
            },
            "program_num": {
              "type": "integer",
              "minimum": 1,
              "maximum": 7
            },
            "program": {
              "type": "string",
              "minLength": 1,
              "maxLength": 256,
              "pattern": "^[^\\r\\n\\u0000]*[^\\s\\u0000][^\\r\\n\\u0000]*$"
            },
            "target": {
              "type": "string",
              "minLength": 1,
              "maxLength": 256,
              "pattern": "^[^\\r\\n\\u0000]*[^\\s\\u0000][^\\r\\n\\u0000]*$"
            },
            "cell_type": {
              "type": "string",
              "minLength": 1,
              "maxLength": 256,
              "pattern": "^[^\\r\\n\\u0000]*[^\\s\\u0000][^\\r\\n\\u0000]*$"
            },
            "max_records": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200,
              "default": 20
            },
            "output_dir": {
              "type": [
                "string",
                "null"
              ],
              "minLength": 1,
              "maxLength": 4096
            }
          },
          "required": [
            "assembly",
            "gene_type",
            "mirna",
            "clip_exp_num",
            "degra_exp_num",
            "pancancer_num",
            "program_num",
            "program",
            "target",
            "cell_type"
          ],
          "additionalProperties": false
        },
        "returns": "{ ok, database, source_url, queried_at, query, columns, citation_lines, total_records, returned_records, is_complete, result_scope, completeness_note, records, raw_response_path, warnings }. On failure: { ok: false, database, source_url, queried_at, error: { code, message, retryable, status_code } }. Caller cancellation and service permission/schema errors propagate. Queries and reference calls have a 120-second total deadline including retries and waits, with a 45-second network idle timeout. The total deadline propagates as an error; increasing an outer execution timeout does not extend it. Counts describe this official response; records may be a preview. Raw response bytes are saved even when all rows are displayed. Never relax filters after zero results or infer full-result distributions from a preview.",
        "totalTimeoutMs": 120000,
        "exampleArgs": {
          "assembly": "hg38",
          "gene_type": "mRNA",
          "mirna": "all",
          "clip_exp_num": 1,
          "degra_exp_num": 0,
          "pancancer_num": 0,
          "program_num": 1,
          "program": "TargetScan",
          "target": "PDCD4",
          "cell_type": "HeLa",
          "max_records": 2
        }
      },
      {
        "connector": "encori",
        "credentialKeys": [],
        "id": "query_rna_rna_interactions",
        "description": "Query official RNA–RNA interactions. Use cell_type=all only when unrestricted; do not substitute another database.",
        "input": {
          "type": "object",
          "properties": {
            "assembly": {
              "type": "string",
              "enum": [
                "hg38",
                "mm10"
              ]
            },
            "gene_type": {
              "type": "string",
              "enum": [
                "mRNA",
                "lncRNA",
                "pseudogene",
                "sncRNA",
                "miRNA"
              ]
            },
            "rna": {
              "type": "string",
              "minLength": 1,
              "maxLength": 256,
              "pattern": "^[^\\r\\n\\u0000]*[^\\s\\u0000][^\\r\\n\\u0000]*$"
            },
            "inter_num": {
              "type": "integer",
              "minimum": 1,
              "maximum": 999
            },
            "exp_num": {
              "type": "integer",
              "minimum": 1,
              "maximum": 999
            },
            "cell_type": {
              "type": "string",
              "minLength": 1,
              "maxLength": 256,
              "pattern": "^[^\\r\\n\\u0000]*[^\\s\\u0000][^\\r\\n\\u0000]*$"
            },
            "max_records": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200,
              "default": 20
            },
            "output_dir": {
              "type": [
                "string",
                "null"
              ],
              "minLength": 1,
              "maxLength": 4096
            }
          },
          "required": [
            "assembly",
            "gene_type",
            "rna",
            "inter_num",
            "exp_num",
            "cell_type"
          ],
          "additionalProperties": false
        },
        "returns": "{ ok, database, source_url, queried_at, query, columns, citation_lines, total_records, returned_records, is_complete, result_scope, completeness_note, records, raw_response_path, warnings }. On failure: { ok: false, database, source_url, queried_at, error: { code, message, retryable, status_code } }. Caller cancellation and service permission/schema errors propagate. Queries and reference calls have a 120-second total deadline including retries and waits, with a 45-second network idle timeout. The total deadline propagates as an error; increasing an outer execution timeout does not extend it. Counts describe this official response; records may be a preview. Raw response bytes are saved even when all rows are displayed. Never relax filters after zero results or infer full-result distributions from a preview.",
        "totalTimeoutMs": 120000,
        "exampleArgs": {
          "assembly": "hg38",
          "gene_type": "mRNA",
          "rna": "TP53",
          "inter_num": 1,
          "exp_num": 1,
          "cell_type": "all",
          "max_records": 2
        }
      },
      {
        "connector": "encori",
        "credentialKeys": [],
        "id": "query_rbp_targets",
        "description": "Query official RBP target evidence. Use rbp=all for all RBPs; preserve cell_type and distinguish zero rows from request failure.",
        "input": {
          "type": "object",
          "properties": {
            "assembly": {
              "type": "string",
              "enum": [
                "hg38",
                "mm10",
                "dm6",
                "ce10",
                "sacCer3"
              ]
            },
            "gene_type": {
              "type": "string",
              "enum": [
                "mRNA",
                "lncRNA",
                "pseudogene",
                "circRNA",
                "sncRNA"
              ]
            },
            "rbp": {
              "type": "string",
              "minLength": 1,
              "maxLength": 256,
              "pattern": "^[^\\r\\n\\u0000]*[^\\s\\u0000][^\\r\\n\\u0000]*$"
            },
            "clip_exp_num": {
              "type": "integer",
              "minimum": 1,
              "maximum": 999
            },
            "pancancer_num": {
              "type": "integer",
              "minimum": 0,
              "maximum": 32
            },
            "target": {
              "type": "string",
              "minLength": 1,
              "maxLength": 256,
              "pattern": "^[^\\r\\n\\u0000]*[^\\s\\u0000][^\\r\\n\\u0000]*$"
            },
            "cell_type": {
              "type": "string",
              "minLength": 1,
              "maxLength": 256,
              "pattern": "^[^\\r\\n\\u0000]*[^\\s\\u0000][^\\r\\n\\u0000]*$"
            },
            "max_records": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200,
              "default": 20
            },
            "output_dir": {
              "type": [
                "string",
                "null"
              ],
              "minLength": 1,
              "maxLength": 4096
            }
          },
          "required": [
            "assembly",
            "gene_type",
            "rbp",
            "clip_exp_num",
            "pancancer_num",
            "target",
            "cell_type"
          ],
          "additionalProperties": false
        },
        "returns": "{ ok, database, source_url, queried_at, query, columns, citation_lines, total_records, returned_records, is_complete, result_scope, completeness_note, records, raw_response_path, warnings }. On failure: { ok: false, database, source_url, queried_at, error: { code, message, retryable, status_code } }. Caller cancellation and service permission/schema errors propagate. Queries and reference calls have a 120-second total deadline including retries and waits, with a 45-second network idle timeout. The total deadline propagates as an error; increasing an outer execution timeout does not extend it. Counts describe this official response; records may be a preview. Raw response bytes are saved even when all rows are displayed. Never relax filters after zero results or infer full-result distributions from a preview.",
        "totalTimeoutMs": 120000,
        "exampleArgs": {
          "assembly": "hg38",
          "gene_type": "mRNA",
          "rbp": "all",
          "clip_exp_num": 1,
          "pancancer_num": 0,
          "target": "TP53",
          "cell_type": "HeLa",
          "max_records": 2
        }
      },
      {
        "connector": "encori",
        "credentialKeys": [],
        "id": "query_cerna_network",
        "description": "Query official ceRNA networks. Use family=all when unrestricted. Preserve official P values and FDR; never infer missing family names from counts.",
        "input": {
          "type": "object",
          "properties": {
            "assembly": {
              "type": "string",
              "enum": [
                "hg38",
                "mm10"
              ]
            },
            "gene_type": {
              "type": "string",
              "enum": [
                "mRNA",
                "lncRNA",
                "pseudogene"
              ]
            },
            "cerna": {
              "type": "string",
              "minLength": 1,
              "maxLength": 256,
              "pattern": "^[^\\r\\n\\u0000]*[^\\s\\u0000][^\\r\\n\\u0000]*$"
            },
            "mirna_num": {
              "type": "integer",
              "minimum": 1,
              "maximum": 999
            },
            "family": {
              "type": "string",
              "minLength": 1,
              "maxLength": 256,
              "pattern": "^[^\\r\\n\\u0000]*[^\\s\\u0000][^\\r\\n\\u0000]*$"
            },
            "pval": {
              "type": "number",
              "minimum": 0,
              "maximum": 0.01
            },
            "fdr": {
              "type": "number",
              "minimum": 0,
              "maximum": 0.01
            },
            "pancancer_num": {
              "type": "integer",
              "minimum": 0,
              "maximum": 32
            },
            "max_records": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200,
              "default": 20
            },
            "output_dir": {
              "type": [
                "string",
                "null"
              ],
              "minLength": 1,
              "maxLength": 4096
            }
          },
          "required": [
            "assembly",
            "gene_type",
            "cerna",
            "mirna_num",
            "family",
            "pval",
            "fdr",
            "pancancer_num"
          ],
          "additionalProperties": false
        },
        "returns": "{ ok, database, source_url, queried_at, query, columns, citation_lines, total_records, returned_records, is_complete, result_scope, completeness_note, records, raw_response_path, warnings }. On failure: { ok: false, database, source_url, queried_at, error: { code, message, retryable, status_code } }. Caller cancellation and service permission/schema errors propagate. Queries and reference calls have a 120-second total deadline including retries and waits, with a 45-second network idle timeout. The total deadline propagates as an error; increasing an outer execution timeout does not extend it. Counts describe this official response; records may be a preview. Raw response bytes are saved even when all rows are displayed. Never relax filters after zero results or infer full-result distributions from a preview.",
        "totalTimeoutMs": 120000,
        "exampleArgs": {
          "assembly": "hg38",
          "gene_type": "mRNA",
          "cerna": "MYC",
          "mirna_num": 1,
          "family": "all",
          "pval": 0.01,
          "fdr": 0.01,
          "pancancer_num": 0,
          "max_records": 2
        }
      },
      {
        "connector": "encori",
        "credentialKeys": [],
        "id": "query_rbp_disease",
        "description": "Query official RBP disease evidence. Preserve tissue, disease and target filters without widening zero-result queries.",
        "input": {
          "type": "object",
          "properties": {
            "assembly": {
              "type": "string",
              "enum": [
                "hg38"
              ]
            },
            "rbp": {
              "type": "string",
              "minLength": 1,
              "maxLength": 256,
              "pattern": "^[^\\r\\n\\u0000]*[^\\s\\u0000][^\\r\\n\\u0000]*$"
            },
            "tissue": {
              "type": "string",
              "minLength": 1,
              "maxLength": 256,
              "pattern": "^[^\\r\\n\\u0000]*[^\\s\\u0000][^\\r\\n\\u0000]*$"
            },
            "disease": {
              "type": "string",
              "minLength": 1,
              "maxLength": 256,
              "pattern": "^[^\\r\\n\\u0000]*[^\\s\\u0000][^\\r\\n\\u0000]*$"
            },
            "target": {
              "type": "string",
              "minLength": 1,
              "maxLength": 256,
              "pattern": "^[^\\r\\n\\u0000]*[^\\s\\u0000][^\\r\\n\\u0000]*$"
            },
            "max_records": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200,
              "default": 20
            },
            "output_dir": {
              "type": [
                "string",
                "null"
              ],
              "minLength": 1,
              "maxLength": 4096
            }
          },
          "required": [
            "assembly",
            "rbp",
            "tissue",
            "disease",
            "target"
          ],
          "additionalProperties": false
        },
        "returns": "{ ok, database, source_url, queried_at, query, columns, citation_lines, total_records, returned_records, is_complete, result_scope, completeness_note, records, raw_response_path, warnings }. On failure: { ok: false, database, source_url, queried_at, error: { code, message, retryable, status_code } }. Caller cancellation and service permission/schema errors propagate. Queries and reference calls have a 120-second total deadline including retries and waits, with a 45-second network idle timeout. The total deadline propagates as an error; increasing an outer execution timeout does not extend it. Counts describe this official response; records may be a preview. Raw response bytes are saved even when all rows are displayed. Never relax filters after zero results or infer full-result distributions from a preview.",
        "totalTimeoutMs": 120000,
        "exampleArgs": {
          "assembly": "hg38",
          "rbp": "all",
          "tissue": "breast",
          "disease": "carcinoma",
          "target": "MYC",
          "max_records": 2
        }
      },
      {
        "connector": "encori",
        "credentialKeys": [],
        "id": "scan_rbp_motifs",
        "description": "Search official RBP motif rankings. Preserve order and scores. QueryMotif and IdentifiedMotif are independent fields; no reverse complement is performed or inferred.",
        "input": {
          "type": "object",
          "properties": {
            "assembly": {
              "type": "string",
              "enum": [
                "hg38",
                "mm10",
                "dm6",
                "ce10",
                "sacCer3"
              ]
            },
            "length": {
              "type": "string",
              "enum": [
                "short",
                "long"
              ]
            },
            "motif": {
              "type": "string",
              "minLength": 1,
              "maxLength": 64,
              "pattern": "^[ACGTUNRYKMSWBDHVacgtunrykmswbdhv]+$"
            },
            "rank_limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100
            },
            "max_records": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200,
              "default": 20
            },
            "output_dir": {
              "type": [
                "string",
                "null"
              ],
              "minLength": 1,
              "maxLength": 4096
            }
          },
          "required": [
            "assembly",
            "length",
            "motif",
            "rank_limit"
          ],
          "additionalProperties": false
        },
        "returns": "{ ok, database, source_url, queried_at, query, columns, citation_lines, total_records, returned_records, is_complete, result_scope, completeness_note, records, raw_response_path, warnings }. On failure: { ok: false, database, source_url, queried_at, error: { code, message, retryable, status_code } }. Caller cancellation and service permission/schema errors propagate. Queries and reference calls have a 120-second total deadline including retries and waits, with a 45-second network idle timeout. The total deadline propagates as an error; increasing an outer execution timeout does not extend it. Counts describe this official response; records may be a preview. Raw response bytes are saved even when all rows are displayed. Never relax filters after zero results or infer full-result distributions from a preview.",
        "totalTimeoutMs": 120000,
        "exampleArgs": {
          "assembly": "hg38",
          "length": "short",
          "motif": "UGCAUG",
          "rank_limit": 10,
          "max_records": 2
        }
      },
      {
        "connector": "encori",
        "credentialKeys": [],
        "id": "get_binding_sites",
        "description": "Retrieve official BED binding sites by dataset_id. Remove only known SQL prefixes from parsed records; retain exact raw bytes.",
        "input": {
          "type": "object",
          "properties": {
            "assembly": {
              "type": "string",
              "enum": [
                "hg38",
                "mm10",
                "dm6",
                "ce10",
                "sacCer3"
              ]
            },
            "dataset_id": {
              "type": "string",
              "minLength": 1,
              "maxLength": 64,
              "pattern": "^[^\\r\\n\\u0000]*[^\\s\\u0000][^\\r\\n\\u0000]*$"
            },
            "max_records": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000,
              "default": 100
            },
            "output_dir": {
              "type": [
                "string",
                "null"
              ],
              "minLength": 1,
              "maxLength": 4096
            }
          },
          "required": [
            "assembly",
            "dataset_id"
          ],
          "additionalProperties": false
        },
        "returns": "{ ok, database, source_url, queried_at, query, columns, citation_lines, total_records, returned_records, is_complete, result_scope, completeness_note, records, raw_response_path, warnings }. On failure: { ok: false, database, source_url, queried_at, error: { code, message, retryable, status_code } }. Caller cancellation and service permission/schema errors propagate. Queries and reference calls have a 120-second total deadline including retries and waits, with a 45-second network idle timeout. The total deadline propagates as an error; increasing an outer execution timeout does not extend it. Counts describe this official response; records may be a preview. Raw response bytes are saved even when all rows are displayed. Never relax filters after zero results or infer full-result distributions from a preview.",
        "totalTimeoutMs": 120000,
        "exampleArgs": {
          "assembly": "hg38",
          "dataset_id": "SBDH2131",
          "max_records": 2
        }
      },
      {
        "connector": "encori",
        "credentialKeys": [],
        "id": "get_reference_tables",
        "description": "List exact table names from the online official reference ZIP, or read one exact table_name such as reference_data/degradome_ref.txt. Fetches the ZIP anew on each call.",
        "input": {
          "type": "object",
          "properties": {
            "table_name": {
              "type": [
                "string",
                "null"
              ],
              "minLength": 1,
              "maxLength": 512,
              "pattern": "^[^\\r\\n\\u0000]*[^\\s\\u0000][^\\r\\n\\u0000]*$"
            },
            "max_records": {
              "type": "integer",
              "minimum": 1,
              "maximum": 500,
              "default": 50
            },
            "output_dir": {
              "type": [
                "string",
                "null"
              ],
              "minLength": 1,
              "maxLength": 4096
            }
          },
          "additionalProperties": false
        },
        "returns": "{ ok, database, source_url, queried_at, files, table_names, returned_files, selected_table, records, total_records, returned_records, is_complete, result_scope, raw_response_path, warnings, error }. Selected tables also include columns, citation_lines, completeness_note and saved_path. Listing reads metadata only and does not save or return table contents; raw_response_path is null. Complete selected tables return all rows without writing a file; raw_response_path and saved_path are null. Only a truncated table saves the full original bytes locally and returns both paths. Counts describe the selected official table; never infer full-result distributions from a preview. On failure: { ok: false, database, source_url, queried_at, error: { code, message, retryable, status_code } }. Caller cancellation and service permission/schema errors propagate. This call has a 120-second total deadline including retries and waits, with a 45-second network idle timeout. The total deadline propagates as an error; increasing an outer execution timeout does not extend it.",
        "exampleArgs": {
          "table_name": "reference_data/degradome_ref.txt",
          "max_records": 2
        },
        "totalTimeoutMs": 120000
      },
      {
        "connector": "encori",
        "credentialKeys": [],
        "id": "list_bulk_datasets",
        "description": "List the 24 documented official bulk dataset filenames. By default HEAD probes availability and byte sizes, without downloading data. Unchecked availability and size are null.",
        "input": {
          "type": "object",
          "properties": {
            "assembly": {
              "type": [
                "string",
                "null"
              ],
              "enum": [
                "hg38",
                "mm10",
                null
              ]
            },
            "data_type": {
              "type": [
                "string",
                "null"
              ],
              "enum": [
                "miRNA_mRNA",
                "miRNA_lncRNA",
                "miRNA_pseudogene",
                "miRNA_sncRNA",
                "miRNA_circRNA",
                "RNA_RNA",
                "RBP_mRNA",
                "RBP_lncRNA",
                "RBP_pseudogene",
                "RBP_sncRNA",
                "RBP_circRNA",
                "RBP_caRNA",
                null
              ]
            },
            "check_availability": {
              "type": "boolean",
              "default": true
            }
          },
          "additionalProperties": false
        },
        "returns": "{ ok, files: [{ filename, assembly, data_type, download_url, available, size_bytes, size_mib, etag, last_modified, accept_ranges, error? }], returned_files, warnings, error }. Per-file failures are preserved. size_mib uses 1024² bytes. This call has a 300-second total deadline including all HEAD probes, retries and waits, with a 45-second network idle timeout. The total deadline propagates as an error; increasing an outer execution timeout does not extend it.",
        "exampleArgs": {
          "assembly": "hg38",
          "data_type": "miRNA_mRNA"
        },
        "totalTimeoutMs": 300000
      },
      {
        "connector": "encori",
        "credentialKeys": [],
        "id": "download_bulk_dataset",
        "description": "Only when the user requests a download, stream one official bulk file to destination_dir on the computer running the caller. Never overwrite an existing file. Interrupted .part files resume on the same filename/directory only after identity and HTTP range validation. Validate size and gzip integrity before publication.",
        "input": {
          "type": "object",
          "properties": {
            "filename": {
              "type": "string",
              "enum": [
                "hg38.miRNA_mRNA.tar.gz",
                "hg38.miRNA_lncRNA.tar.gz",
                "hg38.miRNA_pseudogene.tar.gz",
                "hg38.miRNA_sncRNA.tar.gz",
                "hg38.miRNA_circRNA.tar.gz",
                "hg38.RNA_RNA.tar.gz",
                "hg38.RBP_mRNA.tar.gz",
                "hg38.RBP_lncRNA.tar.gz",
                "hg38.RBP_pseudogene.tar.gz",
                "hg38.RBP_sncRNA.tar.gz",
                "hg38.RBP_circRNA.tar.gz",
                "hg38.RBP_caRNA.tar.gz",
                "mm10.miRNA_mRNA.tar.gz",
                "mm10.miRNA_lncRNA.tar.gz",
                "mm10.miRNA_pseudogene.tar.gz",
                "mm10.miRNA_sncRNA.tar.gz",
                "mm10.miRNA_circRNA.tar.gz",
                "mm10.RNA_RNA.tar.gz",
                "mm10.RBP_mRNA.tar.gz",
                "mm10.RBP_lncRNA.tar.gz",
                "mm10.RBP_pseudogene.tar.gz",
                "mm10.RBP_sncRNA.tar.gz",
                "mm10.RBP_circRNA.tar.gz",
                "mm10.RBP_caRNA.tar.gz"
              ]
            },
            "destination_dir": {
              "type": [
                "string",
                "null"
              ],
              "minLength": 1,
              "maxLength": 4096
            }
          },
          "required": [
            "filename"
          ],
          "additionalProperties": false
        },
        "returns": "{ ok, source_url, saved_path, filename, size_bytes, size_mib, resumed, resumed_from_bytes, verified_gzip, warnings }. Success requires verified_gzip=true and an actual published file. This call has a 3600-second total deadline including metadata requests, transfer, retries, verification and publication, with a 45-second network idle timeout. The total deadline propagates as an error; increasing an outer execution timeout does not extend it. Interrupted transfers retain .part and .meta.json; call the same filename and destination_dir to resume after identity and range checks. A timeout before file publication is not success. Concurrent transfers of the same file in this process are rejected; process exit releases that guard.",
        "exampleArgs": {
          "filename": "hg38.miRNA_sncRNA.tar.gz",
          "destination_dir": "/absolute/path/to/output"
        },
        "totalTimeoutMs": 3600000
      }
    ]
  },
  {
    "id": "pdc",
    "displayName": "PDC",
    "aliases": [
      "Proteomic Data Commons",
      "CPTAC proteomics"
    ],
    "description": "Cancer proteomics studies, sample and aliquot mappings, and file discovery from PDC.",
    "useWhen": "Use for NCI Proteomic Data Commons (PDC) cancer proteomics and CPTAC study discovery: search study names and versions, inspect assay metadata, map aliquots to samples and cases, retrieve public case demographics and diagnosis metadata, and discover quantitative reports and supplementary files.",
    "sources": [
      "PDC"
    ],
    "termsUrl": "https://pdc.cancer.gov/pdc/data-use-guidelines",
    "requiresNcbi": false,
    "group": "directory",
    "tools": [
      {
        "connector": "pdc",
        "credentialKeys": [],
        "id": "pdc_search_studies",
        "description": "Search PDC study identifiers and version names in the public study catalog. Keyword matching is case-insensitive local substring matching, not disease/clinical filtering. Without a keyword, browse the catalog. All versions are retained.",
        "input": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "query": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200,
              "pattern": "\\S"
            },
            "offset": {
              "type": "integer",
              "minimum": 0,
              "maximum": 1000000,
              "default": 0
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            }
          }
        },
        "returns": "{ studies: [{ pdc_study_id, versions: [{ study_id, study_submitter_id, study_shortname, study_version, is_latest_version }] }], total, offset, limit, returned, next_offset, truncated, pagination_mode: \"local\", usage }. The upstream catalog has no pagination; this call fetches it within an 8 MiB response budget, sorts by PDC ID, filters locally and returns at most 100 studies. total counts matching studies, not versions. pdc_study_id selects the latest version; study_id is the UUID of a specific version. Use a returned study_id to pin subsequent calls. External reference IDs belong to the named resource; do not assume PDC and GDC UUIDs are interchangeable.",
        "exampleArgs": {
          "query": "CCRCC",
          "limit": 5
        },
        "maxResponseBytes": 8388608
      },
      {
        "connector": "pdc",
        "credentialKeys": [],
        "id": "pdc_get_study",
        "description": "Retrieve PDC study metadata, assay type, case/aliquot counts, file categories and available versions. pdc_study_id selects the latest version; study_id is the UUID of a specific version. Use a returned study_id to pin subsequent calls. External reference IDs belong to the named resource; do not assume PDC and GDC UUIDs are interchangeable.",
        "input": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "pdc_study_id": {
              "type": "string",
              "pattern": "^PDC[0-9]{6}$",
              "maxLength": 9
            },
            "study_id": {
              "type": "string",
              "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
              "maxLength": 36
            }
          },
          "oneOf": [
            {
              "properties": {
                "pdc_study_id": {
                  "type": "string",
                  "pattern": "^PDC[0-9]{6}$",
                  "maxLength": 9
                }
              },
              "required": [
                "pdc_study_id"
              ]
            },
            {
              "properties": {
                "study_id": {
                  "type": "string",
                  "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
                  "maxLength": 36
                }
              },
              "required": [
                "study_id"
              ]
            }
          ]
        },
        "returns": "{ studies: [{ study_id, pdc_study_id, study_submitter_id, study_name, study_description, program_name, project_name, disease_type, primary_site, analytical_fraction, experiment_type, cases_count, aliquots_count, filesCount }], catalog: [{ pdc_study_id, versions }], usage }. A missing study returns empty arrays. study_description may contain upstream HTML. Counts describe the selected version; catalog also includes other versions.",
        "exampleArgs": {
          "pdc_study_id": "PDC000127"
        },
        "maxResponseBytes": 8388608
      },
      {
        "connector": "pdc",
        "credentialKeys": [],
        "id": "pdc_list_biospecimens",
        "description": "Map PDC study aliquots to samples and cases, preserving submitter IDs, pool flags and external references for CPTAC multi-omics research. Each row is an aliquot association, not a unique patient. Use pagination_mode: upstream to traverse beyond the local mode's 1000-association upstream cap; upstream offsets and limits count cases. pdc_study_id selects the latest version; study_id is the UUID of a specific version. Use a returned study_id to pin subsequent calls. External reference IDs belong to the named resource; do not assume PDC and GDC UUIDs are interchangeable.",
        "input": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "pdc_study_id": {
              "type": "string",
              "pattern": "^PDC[0-9]{6}$",
              "maxLength": 9
            },
            "study_id": {
              "type": "string",
              "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
              "maxLength": 36
            },
            "offset": {
              "type": "integer",
              "minimum": 0,
              "maximum": 1000000,
              "default": 0
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            },
            "pagination_mode": {
              "type": "string",
              "enum": [
                "local",
                "upstream"
              ],
              "default": "local"
            }
          },
          "oneOf": [
            {
              "properties": {
                "pdc_study_id": {
                  "type": "string",
                  "pattern": "^PDC[0-9]{6}$",
                  "maxLength": 9
                }
              },
              "required": [
                "pdc_study_id"
              ]
            },
            {
              "properties": {
                "study_id": {
                  "type": "string",
                  "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
                  "maxLength": 36
                }
              },
              "required": [
                "study_id"
              ]
            }
          ]
        },
        "returns": "{ biospecimens: [{ aliquot_id, sample_id, case_id, aliquot_submitter_id, sample_submitter_id, case_submitter_id, aliquot_status, sample_status, case_status, project_name, sample_type, disease_type, primary_site, pool, taxon, externalReferences }], study_selector, total, available, upstream_limit_reached, offset, limit, returned, next_offset, truncated, pagination_mode, usage }. Default pagination_mode: local preserves association-row pagination: fetch biospecimenPerStudy within an 8 MiB response budget, sort by aliquot/sample/case IDs and page locally. available counts all received associations. Below the 1000-record upstream cap, total equals available. At or above the cap, total is null, upstream_limit_reached and truncated are true on every page because completeness is unknown, even for exactly 1000 associations. next_offset pages only the received records; null does not establish study completeness. With pagination_mode: upstream, fetch one paginatedCasesSamplesAliquots case page plus one lookahead case and flatten only the selected cases. Additional fields: { pagination_unit: \"case\", case_total, returned_cases, has_more, unavailable_fields }. offset, limit and next_offset count cases, while returned and available count associations in this page and can exceed limit. total is null because the association total is unknown; case_total is the upstream case count. sample_id and case_id come from parent nodes. case_status, project_name and taxon are null and listed in unavailable_fields because this endpoint does not supply them. No automatic full-study aggregation or data cache is introduced. Each call refetches upstream data; upstream does not guarantee stable ordering or a cross-page snapshot. Pinning study_id fixes the version, not a snapshot or duplicate-free enumeration. A GDC external reference is separate from the PDC case_id; preserve its resource and identifier. No clinical treatment or outcome data is returned.",
        "exampleArgs": {
          "pdc_study_id": "PDC000127",
          "pagination_mode": "upstream",
          "limit": 5
        },
        "maxResponseBytes": 8388608
      },
      {
        "connector": "pdc",
        "credentialKeys": [],
        "id": "pdc_list_clinical",
        "description": "Retrieve public PDC case demographics and diagnosis metadata, with available sample identifiers and named external references for linking to GDC. Values retain upstream types, nulls and obfuscation flags. pdc_study_id selects the latest version; study_id is the UUID of a specific version. Use a returned study_id to pin subsequent calls. External reference IDs belong to the named resource; do not assume PDC and GDC UUIDs are interchangeable.",
        "input": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "pdc_study_id": {
              "type": "string",
              "pattern": "^PDC[0-9]{6}$",
              "maxLength": 9
            },
            "study_id": {
              "type": "string",
              "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
              "maxLength": 36
            },
            "offset": {
              "type": "integer",
              "minimum": 0,
              "maximum": 1000000,
              "default": 0
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            }
          },
          "oneOf": [
            {
              "properties": {
                "pdc_study_id": {
                  "type": "string",
                  "pattern": "^PDC[0-9]{6}$",
                  "maxLength": 9
                }
              },
              "required": [
                "pdc_study_id"
              ]
            },
            {
              "properties": {
                "study_id": {
                  "type": "string",
                  "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
                  "maxLength": 36
                }
              },
              "required": [
                "study_id"
              ]
            }
          ]
        },
        "returns": "{ clinical: [{ case_id, case_submitter_id, status, disease_type, primary_site, ethnicity, gender, race, vital_status, age_at_index, age_is_obfuscated, primary_diagnosis, morphology, tumor_grade, tumor_stage, days_to_death, samples, externalReferences }], study_selector, offset, limit, returned, available, total: null, completeness: \"unknown\", next_offset, truncated, pagination_mode: \"local\", usage }. The public clinicalPerStudy endpoint has no offset/limit arguments. Fetches its response within an 8 MiB budget, sorts by case_id and pages received records locally. available counts received cases, not a verified full-study total. truncated only indicates that the local offset ceiling prevents paging more received records; false does not establish upstream completeness. next_offset: null does not prove completeness. Each call refetches data with no cross-page snapshot. Preserves upstream values without inferring survival, normalizing units or equating PDC and GDC UUIDs. age_at_index may be null; age_is_obfuscated may be a string such as \"false\", a boolean or null, and must not be interpreted using JavaScript truthiness. samples and externalReferences may be empty or unavailable; this does not establish that no corresponding samples or external data exist. Use pdc_list_biospecimens with the same pinned study_id and join by PDC case_id for sample mappings. Treatment, exposure and follow-up histories are not included. pdc_study_id selects the latest version; study_id is the UUID of a specific version. Use a returned study_id to pin subsequent calls. External reference IDs belong to the named resource; do not assume PDC and GDC UUIDs are interchangeable.",
        "exampleArgs": {
          "pdc_study_id": "PDC000127",
          "limit": 10
        },
        "maxResponseBytes": 8388608
      },
      {
        "connector": "pdc",
        "credentialKeys": [],
        "id": "pdc_list_files",
        "description": "Discover PDC study files, including quantitative reports (data_category: Protein Assembly) and publication supplements. Filters are passed to the official API. Returns metadata and storage paths, not file contents or download URLs. pdc_study_id selects the latest version; study_id is the UUID of a specific version. Use a returned study_id to pin subsequent calls. External reference IDs belong to the named resource; do not assume PDC and GDC UUIDs are interchangeable.",
        "input": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "pdc_study_id": {
              "type": "string",
              "pattern": "^PDC[0-9]{6}$",
              "maxLength": 9
            },
            "study_id": {
              "type": "string",
              "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
              "maxLength": 36
            },
            "offset": {
              "type": "integer",
              "minimum": 0,
              "maximum": 1000000,
              "default": 0
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            },
            "data_category": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200,
              "pattern": "\\S"
            },
            "file_type": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200,
              "pattern": "\\S"
            },
            "file_format": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200,
              "pattern": "\\S"
            },
            "file_name": {
              "type": "string",
              "minLength": 1,
              "maxLength": 500,
              "pattern": "\\S"
            }
          },
          "oneOf": [
            {
              "properties": {
                "pdc_study_id": {
                  "type": "string",
                  "pattern": "^PDC[0-9]{6}$",
                  "maxLength": 9
                }
              },
              "required": [
                "pdc_study_id"
              ]
            },
            {
              "properties": {
                "study_id": {
                  "type": "string",
                  "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
                  "maxLength": 36
                }
              },
              "required": [
                "study_id"
              ]
            }
          ]
        },
        "returns": "{ files: [{ study_id, pdc_study_id, study_submitter_id, study_name, file_id, file_name, file_submitter_id, file_type, md5sum, file_location, file_size, data_category, file_format }], offset, limit, returned, total: null, has_more, next_offset, truncated, pagination_mode: \"upstream\", usage }. file_size is the upstream byte-count string. file_location is a storage path, not an authorized download URL. Fetches limit + 1 records to determine has_more; no total is invented. A listed file is not evidence of download permission. Upstream does not guarantee stable ordering or a cross-page snapshot; pinning study_id fixes the version but does not guarantee duplicate-free or complete enumeration across calls.",
        "exampleArgs": {
          "pdc_study_id": "PDC000127",
          "data_category": "Protein Assembly",
          "limit": 10
        },
        "maxResponseBytes": 8388608
      }
    ]
  },
  {
    "id": "iedb",
    "displayName": "IEDB",
    "aliases": [
      "Immune Epitope Database",
      "immune epitopes",
      "immunology assays",
      "TCR",
      "BCR"
    ],
    "description": "Immune epitopes, T/B cell and MHC assays, TCR/BCR receptors, antigens and literature evidence from IEDB.",
    "useWhen": "Use for experimental immunology evidence in the Immune Epitope Database (IEDB): search epitopes, T cell responses, B cell antibody assays, MHC binding and ligand elution experiments, TCR/BCR receptor groups and CDR3 sequences, host species, antigen sources and references.",
    "sources": [
      "IEDB"
    ],
    "termsUrl": "https://www.iedb.org/",
    "requiresNcbi": false,
    "group": "directory",
    "tools": [
      {
        "id": "search_epitopes",
        "connector": "iedb",
        "credentialKeys": [],
        "description": "Search IEDB epitopes with epitope, host, antigen source, MHC and evidence filters. Aggregated filters can match different experiments in the same record; use assay searches to enforce co-occurrence in one experiment. At least one biological or evidence filter is required; limit and offset alone are not filters. Database observations, not predictions. Keep negative and missing results distinct. MHC ligand elution is not a binding affinity measurement; interpret response_measured, method and units together. Parent antigens are representative proteins and may not exactly match the curated antigen or epitope sequence. Use cross_references.parent_uniprot_accessions or curated_uniprot_accessions with genes/get_uniprot_entries (accessions); use cross_references.pdb_ids with structures/pdb_get_structures (pdb_ids). These are explicit upstream cross-references, not sequence-derived mappings.",
        "input": {
          "type": "object",
          "properties": {
            "epitope_id": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991,
              "description": "IEDB epitope structure_id, not a PDB structure identifier."
            },
            "reference_id": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991,
              "description": "IEDB reference_id, not a PMID."
            },
            "host_taxonomy_id": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991,
              "description": "NCBI taxon of the experimental host, including descendants (9606 for human)."
            },
            "source_taxonomy_id": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991,
              "description": "NCBI taxon of the epitope source organism, including descendants; distinct from host."
            },
            "antigen_iri": {
              "type": "string",
              "maxLength": 200,
              "pattern": "^[A-Za-z][A-Za-z0-9_]*:[A-Za-z0-9][A-Za-z0-9._:-]*(?![\\s\\S])",
              "description": "Exact parent antigen CURIE returned by IEDB, e.g. UNIPROT:P01012. Mutually exclusive with uniprot_accession."
            },
            "uniprot_accession": {
              "type": "string",
              "pattern": "^[A-Z0-9]{6}(?:[A-Z0-9]{4})?(?:-[1-9][0-9]*)?(?![\\s\\S])",
              "description": "Exact parent UniProt accession; no automatic isoform or alias conversion."
            },
            "mhc_allele": {
              "type": "string",
              "minLength": 1,
              "maxLength": 300,
              "pattern": "\\S",
              "description": "Exact IEDB allele name, e.g. HLA-A*02:01. The asterisk is literal."
            },
            "mhc_class": {
              "type": "string",
              "enum": [
                "I",
                "II"
              ]
            },
            "qualitative_measure": {
              "type": "string",
              "minLength": 1,
              "maxLength": 300,
              "pattern": "\\S",
              "description": "Exact IEDB result, e.g. Negative, Positive, Positive-High. No result filter by default."
            },
            "assay_iri": {
              "type": "string",
              "maxLength": 200,
              "pattern": "^[A-Za-z][A-Za-z0-9_]*:[A-Za-z0-9][A-Za-z0-9._:-]*(?![\\s\\S])",
              "description": "Assay ontology CURIE with descendants, e.g. OBI:0001489 for cellular MHC/mass spectrometry."
            },
            "pdb_id": {
              "type": "string",
              "pattern": "^[0-9][A-Za-z0-9]{3}(?![\\s\\S])",
              "description": "Experimental PDB cross-reference, not an IEDB epitope ID."
            },
            "sequence": {
              "type": "string",
              "pattern": "^[A-Za-z]+(?![\\s\\S])",
              "maxLength": 1000,
              "description": "Exact linear peptide sequence (case normalized). Not a similarity search."
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            },
            "offset": {
              "type": "integer",
              "minimum": 0,
              "maximum": 1000000,
              "default": 0
            }
          },
          "anyOf": [
            {
              "properties": {
                "epitope_id": {}
              },
              "required": [
                "epitope_id"
              ]
            },
            {
              "properties": {
                "reference_id": {}
              },
              "required": [
                "reference_id"
              ]
            },
            {
              "properties": {
                "host_taxonomy_id": {}
              },
              "required": [
                "host_taxonomy_id"
              ]
            },
            {
              "properties": {
                "source_taxonomy_id": {}
              },
              "required": [
                "source_taxonomy_id"
              ]
            },
            {
              "properties": {
                "antigen_iri": {}
              },
              "required": [
                "antigen_iri"
              ]
            },
            {
              "properties": {
                "uniprot_accession": {}
              },
              "required": [
                "uniprot_accession"
              ]
            },
            {
              "properties": {
                "mhc_allele": {}
              },
              "required": [
                "mhc_allele"
              ]
            },
            {
              "properties": {
                "mhc_class": {}
              },
              "required": [
                "mhc_class"
              ]
            },
            {
              "properties": {
                "qualitative_measure": {}
              },
              "required": [
                "qualitative_measure"
              ]
            },
            {
              "properties": {
                "assay_iri": {}
              },
              "required": [
                "assay_iri"
              ]
            },
            {
              "properties": {
                "pdb_id": {}
              },
              "required": [
                "pdb_id"
              ]
            },
            {
              "properties": {
                "sequence": {}
              },
              "required": [
                "sequence"
              ]
            }
          ],
          "additionalProperties": false,
          "not": {
            "properties": {
              "antigen_iri": {},
              "uniprot_accession": {}
            },
            "required": [
              "antigen_iri",
              "uniprot_accession"
            ]
          }
        },
        "returns": "{source,query_url,limit,offset,returned,has_more,next_offset,records:[{...IEDB fields,cross_references:{parent_uniprot_accessions,curated_uniprot_accessions,pdb_ids}}]}. Upstream nulls and evidence values are preserved; optional fields may be absent. No exact total is requested. Follow next_offset with identical filters; order is by the unique IEDB key. Empty results mean no match for these filters. No automatic page traversal, local cache or external connector calls.",
        "exampleArgs": {
          "epitope_id": 25750,
          "limit": 20
        }
      },
      {
        "id": "search_antigens",
        "connector": "iedb",
        "credentialKeys": [],
        "description": "Search IEDB antigens with epitope, host, antigen source, MHC and evidence filters. Aggregated filters can match different experiments in the same record; use assay searches to enforce co-occurrence in one experiment. At least one biological or evidence filter is required; limit and offset alone are not filters. Database observations, not predictions. Keep negative and missing results distinct. MHC ligand elution is not a binding affinity measurement; interpret response_measured, method and units together. Parent antigens are representative proteins and may not exactly match the curated antigen or epitope sequence. Use cross_references.parent_uniprot_accessions or curated_uniprot_accessions with genes/get_uniprot_entries (accessions); use cross_references.pdb_ids with structures/pdb_get_structures (pdb_ids). These are explicit upstream cross-references, not sequence-derived mappings.",
        "input": {
          "type": "object",
          "properties": {
            "epitope_id": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991,
              "description": "IEDB epitope structure_id, not a PDB structure identifier."
            },
            "reference_id": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991,
              "description": "IEDB reference_id, not a PMID."
            },
            "host_taxonomy_id": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991,
              "description": "NCBI taxon of the experimental host, including descendants (9606 for human)."
            },
            "source_taxonomy_id": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991,
              "description": "NCBI taxon of the epitope source organism, including descendants; distinct from host."
            },
            "antigen_iri": {
              "type": "string",
              "maxLength": 200,
              "pattern": "^[A-Za-z][A-Za-z0-9_]*:[A-Za-z0-9][A-Za-z0-9._:-]*(?![\\s\\S])",
              "description": "Exact parent antigen CURIE returned by IEDB, e.g. UNIPROT:P01012. Mutually exclusive with uniprot_accession."
            },
            "uniprot_accession": {
              "type": "string",
              "pattern": "^[A-Z0-9]{6}(?:[A-Z0-9]{4})?(?:-[1-9][0-9]*)?(?![\\s\\S])",
              "description": "Exact parent UniProt accession; no automatic isoform or alias conversion."
            },
            "mhc_allele": {
              "type": "string",
              "minLength": 1,
              "maxLength": 300,
              "pattern": "\\S",
              "description": "Exact IEDB allele name, e.g. HLA-A*02:01. The asterisk is literal."
            },
            "mhc_class": {
              "type": "string",
              "enum": [
                "I",
                "II"
              ]
            },
            "qualitative_measure": {
              "type": "string",
              "minLength": 1,
              "maxLength": 300,
              "pattern": "\\S",
              "description": "Exact IEDB result, e.g. Negative, Positive, Positive-High. No result filter by default."
            },
            "assay_iri": {
              "type": "string",
              "maxLength": 200,
              "pattern": "^[A-Za-z][A-Za-z0-9_]*:[A-Za-z0-9][A-Za-z0-9._:-]*(?![\\s\\S])",
              "description": "Assay ontology CURIE with descendants, e.g. OBI:0001489 for cellular MHC/mass spectrometry."
            },
            "pdb_id": {
              "type": "string",
              "pattern": "^[0-9][A-Za-z0-9]{3}(?![\\s\\S])",
              "description": "Experimental PDB cross-reference, not an IEDB epitope ID."
            },
            "antigen_name": {
              "type": "string",
              "minLength": 1,
              "maxLength": 300,
              "pattern": "\\S",
              "description": "Exact member of parent_source_antigen_names; use UniProt search to resolve protein names to accessions."
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            },
            "offset": {
              "type": "integer",
              "minimum": 0,
              "maximum": 1000000,
              "default": 0
            }
          },
          "anyOf": [
            {
              "properties": {
                "epitope_id": {}
              },
              "required": [
                "epitope_id"
              ]
            },
            {
              "properties": {
                "reference_id": {}
              },
              "required": [
                "reference_id"
              ]
            },
            {
              "properties": {
                "host_taxonomy_id": {}
              },
              "required": [
                "host_taxonomy_id"
              ]
            },
            {
              "properties": {
                "source_taxonomy_id": {}
              },
              "required": [
                "source_taxonomy_id"
              ]
            },
            {
              "properties": {
                "antigen_iri": {}
              },
              "required": [
                "antigen_iri"
              ]
            },
            {
              "properties": {
                "uniprot_accession": {}
              },
              "required": [
                "uniprot_accession"
              ]
            },
            {
              "properties": {
                "mhc_allele": {}
              },
              "required": [
                "mhc_allele"
              ]
            },
            {
              "properties": {
                "mhc_class": {}
              },
              "required": [
                "mhc_class"
              ]
            },
            {
              "properties": {
                "qualitative_measure": {}
              },
              "required": [
                "qualitative_measure"
              ]
            },
            {
              "properties": {
                "assay_iri": {}
              },
              "required": [
                "assay_iri"
              ]
            },
            {
              "properties": {
                "pdb_id": {}
              },
              "required": [
                "pdb_id"
              ]
            },
            {
              "properties": {
                "antigen_name": {}
              },
              "required": [
                "antigen_name"
              ]
            }
          ],
          "additionalProperties": false,
          "not": {
            "properties": {
              "antigen_iri": {},
              "uniprot_accession": {}
            },
            "required": [
              "antigen_iri",
              "uniprot_accession"
            ]
          }
        },
        "returns": "{source,query_url,limit,offset,returned,has_more,next_offset,records:[{...IEDB fields,cross_references:{parent_uniprot_accessions,curated_uniprot_accessions,pdb_ids}}]}. Upstream nulls and evidence values are preserved; optional fields may be absent. No exact total is requested. Follow next_offset with identical filters; order is by the unique IEDB key. Empty results mean no match for these filters. No automatic page traversal, local cache or external connector calls.",
        "exampleArgs": {
          "uniprot_accession": "P01012",
          "limit": 20
        }
      },
      {
        "id": "search_tcell_assays",
        "connector": "iedb",
        "credentialKeys": [],
        "description": "Search IEDB T cell experiments with host, source antigen, MHC and outcome filters. Includes tcell_export measurements, units, inequalities, methods, subject counts and publication locations. At least one biological or evidence filter is required; limit and offset alone are not filters. Database observations, not predictions. Keep negative and missing results distinct. MHC ligand elution is not a binding affinity measurement; interpret response_measured, method and units together. Parent antigens are representative proteins and may not exactly match the curated antigen or epitope sequence. Use cross_references.parent_uniprot_accessions or curated_uniprot_accessions with genes/get_uniprot_entries (accessions); use cross_references.pdb_ids with structures/pdb_get_structures (pdb_ids). These are explicit upstream cross-references, not sequence-derived mappings.",
        "input": {
          "type": "object",
          "properties": {
            "epitope_id": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991,
              "description": "IEDB epitope structure_id, not a PDB structure identifier."
            },
            "reference_id": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991,
              "description": "IEDB reference_id, not a PMID."
            },
            "host_taxonomy_id": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991,
              "description": "NCBI taxon of the experimental host, including descendants (9606 for human)."
            },
            "source_taxonomy_id": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991,
              "description": "NCBI taxon of the epitope source organism, including descendants; distinct from host."
            },
            "antigen_iri": {
              "type": "string",
              "maxLength": 200,
              "pattern": "^[A-Za-z][A-Za-z0-9_]*:[A-Za-z0-9][A-Za-z0-9._:-]*(?![\\s\\S])",
              "description": "Exact parent antigen CURIE returned by IEDB, e.g. UNIPROT:P01012. Mutually exclusive with uniprot_accession."
            },
            "uniprot_accession": {
              "type": "string",
              "pattern": "^[A-Z0-9]{6}(?:[A-Z0-9]{4})?(?:-[1-9][0-9]*)?(?![\\s\\S])",
              "description": "Exact parent UniProt accession; no automatic isoform or alias conversion."
            },
            "mhc_allele": {
              "type": "string",
              "minLength": 1,
              "maxLength": 300,
              "pattern": "\\S",
              "description": "Exact IEDB allele name, e.g. HLA-A*02:01. The asterisk is literal."
            },
            "mhc_class": {
              "type": "string",
              "enum": [
                "I",
                "II"
              ]
            },
            "qualitative_measure": {
              "type": "string",
              "minLength": 1,
              "maxLength": 300,
              "pattern": "\\S",
              "description": "Exact IEDB result, e.g. Negative, Positive, Positive-High. No result filter by default."
            },
            "assay_iri": {
              "type": "string",
              "maxLength": 200,
              "pattern": "^[A-Za-z][A-Za-z0-9_]*:[A-Za-z0-9][A-Za-z0-9._:-]*(?![\\s\\S])",
              "description": "Assay ontology CURIE with descendants, e.g. OBI:0001489 for cellular MHC/mass spectrometry."
            },
            "pdb_id": {
              "type": "string",
              "pattern": "^[0-9][A-Za-z0-9]{3}(?![\\s\\S])",
              "description": "Experimental PDB cross-reference, not an IEDB epitope ID."
            },
            "sequence": {
              "type": "string",
              "pattern": "^[A-Za-z]+(?![\\s\\S])",
              "maxLength": 1000,
              "description": "Exact linear peptide sequence (case normalized). Not a similarity search."
            },
            "assay_id": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991,
              "description": "IEDB tcell_id."
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            },
            "offset": {
              "type": "integer",
              "minimum": 0,
              "maximum": 1000000,
              "default": 0
            }
          },
          "anyOf": [
            {
              "properties": {
                "epitope_id": {}
              },
              "required": [
                "epitope_id"
              ]
            },
            {
              "properties": {
                "reference_id": {}
              },
              "required": [
                "reference_id"
              ]
            },
            {
              "properties": {
                "host_taxonomy_id": {}
              },
              "required": [
                "host_taxonomy_id"
              ]
            },
            {
              "properties": {
                "source_taxonomy_id": {}
              },
              "required": [
                "source_taxonomy_id"
              ]
            },
            {
              "properties": {
                "antigen_iri": {}
              },
              "required": [
                "antigen_iri"
              ]
            },
            {
              "properties": {
                "uniprot_accession": {}
              },
              "required": [
                "uniprot_accession"
              ]
            },
            {
              "properties": {
                "mhc_allele": {}
              },
              "required": [
                "mhc_allele"
              ]
            },
            {
              "properties": {
                "mhc_class": {}
              },
              "required": [
                "mhc_class"
              ]
            },
            {
              "properties": {
                "qualitative_measure": {}
              },
              "required": [
                "qualitative_measure"
              ]
            },
            {
              "properties": {
                "assay_iri": {}
              },
              "required": [
                "assay_iri"
              ]
            },
            {
              "properties": {
                "pdb_id": {}
              },
              "required": [
                "pdb_id"
              ]
            },
            {
              "properties": {
                "sequence": {}
              },
              "required": [
                "sequence"
              ]
            },
            {
              "properties": {
                "assay_id": {}
              },
              "required": [
                "assay_id"
              ]
            }
          ],
          "additionalProperties": false,
          "not": {
            "properties": {
              "antigen_iri": {},
              "uniprot_accession": {}
            },
            "required": [
              "antigen_iri",
              "uniprot_accession"
            ]
          }
        },
        "returns": "{source,query_url,limit,offset,returned,has_more,next_offset,records:[{...IEDB fields,tcell_export:[{assay__method,assay__response_measured,assay__quantitative_measurement,assay__measurement_inequality,assay__units,...}],cross_references:{parent_uniprot_accessions,curated_uniprot_accessions,pdb_ids}}]}. Upstream nulls and evidence values are preserved; optional fields may be absent. No exact total is requested. Follow next_offset with identical filters; order is by the unique IEDB key. Empty results mean no match for these filters. No automatic page traversal, local cache or external connector calls.",
        "exampleArgs": {
          "epitope_id": 25750,
          "limit": 20
        }
      },
      {
        "id": "search_bcell_assays",
        "connector": "iedb",
        "credentialKeys": [],
        "description": "Search IEDB B cell experiments with host, source antigen, MHC and outcome filters. Includes bcell_export measurements, units, inequalities, methods, subject counts and publication locations. At least one biological or evidence filter is required; limit and offset alone are not filters. Database observations, not predictions. Keep negative and missing results distinct. MHC ligand elution is not a binding affinity measurement; interpret response_measured, method and units together. Parent antigens are representative proteins and may not exactly match the curated antigen or epitope sequence. Use cross_references.parent_uniprot_accessions or curated_uniprot_accessions with genes/get_uniprot_entries (accessions); use cross_references.pdb_ids with structures/pdb_get_structures (pdb_ids). These are explicit upstream cross-references, not sequence-derived mappings.",
        "input": {
          "type": "object",
          "properties": {
            "epitope_id": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991,
              "description": "IEDB epitope structure_id, not a PDB structure identifier."
            },
            "reference_id": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991,
              "description": "IEDB reference_id, not a PMID."
            },
            "host_taxonomy_id": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991,
              "description": "NCBI taxon of the experimental host, including descendants (9606 for human)."
            },
            "source_taxonomy_id": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991,
              "description": "NCBI taxon of the epitope source organism, including descendants; distinct from host."
            },
            "antigen_iri": {
              "type": "string",
              "maxLength": 200,
              "pattern": "^[A-Za-z][A-Za-z0-9_]*:[A-Za-z0-9][A-Za-z0-9._:-]*(?![\\s\\S])",
              "description": "Exact parent antigen CURIE returned by IEDB, e.g. UNIPROT:P01012. Mutually exclusive with uniprot_accession."
            },
            "uniprot_accession": {
              "type": "string",
              "pattern": "^[A-Z0-9]{6}(?:[A-Z0-9]{4})?(?:-[1-9][0-9]*)?(?![\\s\\S])",
              "description": "Exact parent UniProt accession; no automatic isoform or alias conversion."
            },
            "mhc_allele": {
              "type": "string",
              "minLength": 1,
              "maxLength": 300,
              "pattern": "\\S",
              "description": "Exact IEDB allele name, e.g. HLA-A*02:01. The asterisk is literal."
            },
            "mhc_class": {
              "type": "string",
              "enum": [
                "I",
                "II"
              ]
            },
            "qualitative_measure": {
              "type": "string",
              "minLength": 1,
              "maxLength": 300,
              "pattern": "\\S",
              "description": "Exact IEDB result, e.g. Negative, Positive, Positive-High. No result filter by default."
            },
            "assay_iri": {
              "type": "string",
              "maxLength": 200,
              "pattern": "^[A-Za-z][A-Za-z0-9_]*:[A-Za-z0-9][A-Za-z0-9._:-]*(?![\\s\\S])",
              "description": "Assay ontology CURIE with descendants, e.g. OBI:0001489 for cellular MHC/mass spectrometry."
            },
            "pdb_id": {
              "type": "string",
              "pattern": "^[0-9][A-Za-z0-9]{3}(?![\\s\\S])",
              "description": "Experimental PDB cross-reference, not an IEDB epitope ID."
            },
            "sequence": {
              "type": "string",
              "pattern": "^[A-Za-z]+(?![\\s\\S])",
              "maxLength": 1000,
              "description": "Exact linear peptide sequence (case normalized). Not a similarity search."
            },
            "assay_id": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991,
              "description": "IEDB bcell_id."
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            },
            "offset": {
              "type": "integer",
              "minimum": 0,
              "maximum": 1000000,
              "default": 0
            }
          },
          "anyOf": [
            {
              "properties": {
                "epitope_id": {}
              },
              "required": [
                "epitope_id"
              ]
            },
            {
              "properties": {
                "reference_id": {}
              },
              "required": [
                "reference_id"
              ]
            },
            {
              "properties": {
                "host_taxonomy_id": {}
              },
              "required": [
                "host_taxonomy_id"
              ]
            },
            {
              "properties": {
                "source_taxonomy_id": {}
              },
              "required": [
                "source_taxonomy_id"
              ]
            },
            {
              "properties": {
                "antigen_iri": {}
              },
              "required": [
                "antigen_iri"
              ]
            },
            {
              "properties": {
                "uniprot_accession": {}
              },
              "required": [
                "uniprot_accession"
              ]
            },
            {
              "properties": {
                "mhc_allele": {}
              },
              "required": [
                "mhc_allele"
              ]
            },
            {
              "properties": {
                "mhc_class": {}
              },
              "required": [
                "mhc_class"
              ]
            },
            {
              "properties": {
                "qualitative_measure": {}
              },
              "required": [
                "qualitative_measure"
              ]
            },
            {
              "properties": {
                "assay_iri": {}
              },
              "required": [
                "assay_iri"
              ]
            },
            {
              "properties": {
                "pdb_id": {}
              },
              "required": [
                "pdb_id"
              ]
            },
            {
              "properties": {
                "sequence": {}
              },
              "required": [
                "sequence"
              ]
            },
            {
              "properties": {
                "assay_id": {}
              },
              "required": [
                "assay_id"
              ]
            }
          ],
          "additionalProperties": false,
          "not": {
            "properties": {
              "antigen_iri": {},
              "uniprot_accession": {}
            },
            "required": [
              "antigen_iri",
              "uniprot_accession"
            ]
          }
        },
        "returns": "{source,query_url,limit,offset,returned,has_more,next_offset,records:[{...IEDB fields,bcell_export:[{assay__method,assay__response_measured,assay__quantitative_measurement,assay__measurement_inequality,assay__units,...}],cross_references:{parent_uniprot_accessions,curated_uniprot_accessions,pdb_ids}}]}. Upstream nulls and evidence values are preserved; optional fields may be absent. No exact total is requested. Follow next_offset with identical filters; order is by the unique IEDB key. Empty results mean no match for these filters. No automatic page traversal, local cache or external connector calls.",
        "exampleArgs": {
          "epitope_id": 25750,
          "limit": 20
        }
      },
      {
        "id": "search_mhc_assays",
        "connector": "iedb",
        "credentialKeys": [],
        "description": "Search IEDB MHC binding and ligand elution experiments with host, source antigen, MHC and outcome filters. Includes mhc_export measurements, units, inequalities, methods, subject counts and publication locations. At least one biological or evidence filter is required; limit and offset alone are not filters. Database observations, not predictions. Keep negative and missing results distinct. MHC ligand elution is not a binding affinity measurement; interpret response_measured, method and units together. Parent antigens are representative proteins and may not exactly match the curated antigen or epitope sequence. Use cross_references.parent_uniprot_accessions or curated_uniprot_accessions with genes/get_uniprot_entries (accessions); use cross_references.pdb_ids with structures/pdb_get_structures (pdb_ids). These are explicit upstream cross-references, not sequence-derived mappings.",
        "input": {
          "type": "object",
          "properties": {
            "epitope_id": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991,
              "description": "IEDB epitope structure_id, not a PDB structure identifier."
            },
            "reference_id": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991,
              "description": "IEDB reference_id, not a PMID."
            },
            "host_taxonomy_id": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991,
              "description": "NCBI taxon of the experimental host, including descendants (9606 for human)."
            },
            "source_taxonomy_id": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991,
              "description": "NCBI taxon of the epitope source organism, including descendants; distinct from host."
            },
            "antigen_iri": {
              "type": "string",
              "maxLength": 200,
              "pattern": "^[A-Za-z][A-Za-z0-9_]*:[A-Za-z0-9][A-Za-z0-9._:-]*(?![\\s\\S])",
              "description": "Exact parent antigen CURIE returned by IEDB, e.g. UNIPROT:P01012. Mutually exclusive with uniprot_accession."
            },
            "uniprot_accession": {
              "type": "string",
              "pattern": "^[A-Z0-9]{6}(?:[A-Z0-9]{4})?(?:-[1-9][0-9]*)?(?![\\s\\S])",
              "description": "Exact parent UniProt accession; no automatic isoform or alias conversion."
            },
            "mhc_allele": {
              "type": "string",
              "minLength": 1,
              "maxLength": 300,
              "pattern": "\\S",
              "description": "Exact IEDB allele name, e.g. HLA-A*02:01. The asterisk is literal."
            },
            "mhc_class": {
              "type": "string",
              "enum": [
                "I",
                "II"
              ]
            },
            "qualitative_measure": {
              "type": "string",
              "minLength": 1,
              "maxLength": 300,
              "pattern": "\\S",
              "description": "Exact IEDB result, e.g. Negative, Positive, Positive-High. No result filter by default."
            },
            "assay_iri": {
              "type": "string",
              "maxLength": 200,
              "pattern": "^[A-Za-z][A-Za-z0-9_]*:[A-Za-z0-9][A-Za-z0-9._:-]*(?![\\s\\S])",
              "description": "Assay ontology CURIE with descendants, e.g. OBI:0001489 for cellular MHC/mass spectrometry."
            },
            "pdb_id": {
              "type": "string",
              "pattern": "^[0-9][A-Za-z0-9]{3}(?![\\s\\S])",
              "description": "Experimental PDB cross-reference, not an IEDB epitope ID."
            },
            "sequence": {
              "type": "string",
              "pattern": "^[A-Za-z]+(?![\\s\\S])",
              "maxLength": 1000,
              "description": "Exact linear peptide sequence (case normalized). Not a similarity search."
            },
            "assay_id": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991,
              "description": "IEDB elution_id."
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            },
            "offset": {
              "type": "integer",
              "minimum": 0,
              "maximum": 1000000,
              "default": 0
            }
          },
          "anyOf": [
            {
              "properties": {
                "epitope_id": {}
              },
              "required": [
                "epitope_id"
              ]
            },
            {
              "properties": {
                "reference_id": {}
              },
              "required": [
                "reference_id"
              ]
            },
            {
              "properties": {
                "host_taxonomy_id": {}
              },
              "required": [
                "host_taxonomy_id"
              ]
            },
            {
              "properties": {
                "source_taxonomy_id": {}
              },
              "required": [
                "source_taxonomy_id"
              ]
            },
            {
              "properties": {
                "antigen_iri": {}
              },
              "required": [
                "antigen_iri"
              ]
            },
            {
              "properties": {
                "uniprot_accession": {}
              },
              "required": [
                "uniprot_accession"
              ]
            },
            {
              "properties": {
                "mhc_allele": {}
              },
              "required": [
                "mhc_allele"
              ]
            },
            {
              "properties": {
                "mhc_class": {}
              },
              "required": [
                "mhc_class"
              ]
            },
            {
              "properties": {
                "qualitative_measure": {}
              },
              "required": [
                "qualitative_measure"
              ]
            },
            {
              "properties": {
                "assay_iri": {}
              },
              "required": [
                "assay_iri"
              ]
            },
            {
              "properties": {
                "pdb_id": {}
              },
              "required": [
                "pdb_id"
              ]
            },
            {
              "properties": {
                "sequence": {}
              },
              "required": [
                "sequence"
              ]
            },
            {
              "properties": {
                "assay_id": {}
              },
              "required": [
                "assay_id"
              ]
            }
          ],
          "additionalProperties": false,
          "not": {
            "properties": {
              "antigen_iri": {},
              "uniprot_accession": {}
            },
            "required": [
              "antigen_iri",
              "uniprot_accession"
            ]
          }
        },
        "returns": "{source,query_url,limit,offset,returned,has_more,next_offset,records:[{...IEDB fields,mhc_export:[{assay__method,assay__response_measured,assay__quantitative_measurement,assay__measurement_inequality,assay__units,...}],cross_references:{parent_uniprot_accessions,curated_uniprot_accessions,pdb_ids}}]}. Upstream nulls and evidence values are preserved; optional fields may be absent. No exact total is requested. Follow next_offset with identical filters; order is by the unique IEDB key. Empty results mean no match for these filters. No automatic page traversal, local cache or external connector calls.",
        "exampleArgs": {
          "epitope_id": 25750,
          "limit": 20
        }
      },
      {
        "id": "search_tcrs",
        "connector": "iedb",
        "credentialKeys": [],
        "description": "Search IEDB TCR receptor groups by epitope, receptor CDR3, host, antigen, MHC and literature evidence. The sequence filter matches epitope linear_sequences; chain1_cdr3 and chain2_cdr3 match receptor chain CDR3 sequences. Includes tcr_export records with chains, curated/calculated gene annotations and linked assays and references. Filters select receptor groups; embedded export records are not individually filtered by these criteria. Aggregated host and outcome filters can match different experiments in the same group. Receptor exports do not contain host or qualitative outcome fields. For experiment-level co-occurrence, follow the linked assay__iedb_ids and query search_tcell_assays, search_bcell_assays or search_mhc_assays with the corresponding assay_id and experimental filters. At least one biological or evidence filter is required; limit and offset alone are not filters. Database observations, not predictions. Keep negative and missing results distinct. MHC ligand elution is not a binding affinity measurement; interpret response_measured, method and units together. Parent antigens are representative proteins and may not exactly match the curated antigen or epitope sequence. Use cross_references.parent_uniprot_accessions or curated_uniprot_accessions with genes/get_uniprot_entries (accessions); use cross_references.pdb_ids with structures/pdb_get_structures (pdb_ids). These are explicit upstream cross-references, not sequence-derived mappings.",
        "input": {
          "type": "object",
          "properties": {
            "epitope_id": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991,
              "description": "IEDB epitope structure_id, not a PDB structure identifier."
            },
            "reference_id": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991,
              "description": "IEDB reference_id, not a PMID."
            },
            "host_taxonomy_id": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991,
              "description": "NCBI taxon of the experimental host, including descendants (9606 for human)."
            },
            "source_taxonomy_id": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991,
              "description": "NCBI taxon of the epitope source organism, including descendants; distinct from host."
            },
            "antigen_iri": {
              "type": "string",
              "maxLength": 200,
              "pattern": "^[A-Za-z][A-Za-z0-9_]*:[A-Za-z0-9][A-Za-z0-9._:-]*(?![\\s\\S])",
              "description": "Exact parent antigen CURIE returned by IEDB, e.g. UNIPROT:P01012. Mutually exclusive with uniprot_accession."
            },
            "uniprot_accession": {
              "type": "string",
              "pattern": "^[A-Z0-9]{6}(?:[A-Z0-9]{4})?(?:-[1-9][0-9]*)?(?![\\s\\S])",
              "description": "Exact parent UniProt accession; no automatic isoform or alias conversion."
            },
            "mhc_allele": {
              "type": "string",
              "minLength": 1,
              "maxLength": 300,
              "pattern": "\\S",
              "description": "Exact IEDB allele name, e.g. HLA-A*02:01. The asterisk is literal."
            },
            "mhc_class": {
              "type": "string",
              "enum": [
                "I",
                "II"
              ]
            },
            "qualitative_measure": {
              "type": "string",
              "minLength": 1,
              "maxLength": 300,
              "pattern": "\\S",
              "description": "Exact IEDB result, e.g. Negative, Positive, Positive-High. No result filter by default."
            },
            "assay_iri": {
              "type": "string",
              "maxLength": 200,
              "pattern": "^[A-Za-z][A-Za-z0-9_]*:[A-Za-z0-9][A-Za-z0-9._:-]*(?![\\s\\S])",
              "description": "Assay ontology CURIE with descendants, e.g. OBI:0001489 for cellular MHC/mass spectrometry."
            },
            "pdb_id": {
              "type": "string",
              "pattern": "^[0-9][A-Za-z0-9]{3}(?![\\s\\S])",
              "description": "Experimental PDB cross-reference, not an IEDB epitope ID."
            },
            "sequence": {
              "type": "string",
              "pattern": "^[A-Za-z]+(?![\\s\\S])",
              "maxLength": 1000,
              "description": "Exact linear epitope sequence (case normalized), not a receptor sequence."
            },
            "receptor_group_id": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991,
              "description": "IEDB receptor group identifier."
            },
            "chain1_cdr3": {
              "type": "string",
              "pattern": "^[A-Za-z]+(?![\\s\\S])",
              "maxLength": 1000,
              "description": "Exact receptor chain 1 CDR3 sequence (case normalized)."
            },
            "chain2_cdr3": {
              "type": "string",
              "pattern": "^[A-Za-z]+(?![\\s\\S])",
              "maxLength": 1000,
              "description": "Exact receptor chain 2 CDR3 sequence (case normalized)."
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            },
            "offset": {
              "type": "integer",
              "minimum": 0,
              "maximum": 1000000,
              "default": 0
            }
          },
          "anyOf": [
            {
              "properties": {
                "epitope_id": {}
              },
              "required": [
                "epitope_id"
              ]
            },
            {
              "properties": {
                "reference_id": {}
              },
              "required": [
                "reference_id"
              ]
            },
            {
              "properties": {
                "host_taxonomy_id": {}
              },
              "required": [
                "host_taxonomy_id"
              ]
            },
            {
              "properties": {
                "source_taxonomy_id": {}
              },
              "required": [
                "source_taxonomy_id"
              ]
            },
            {
              "properties": {
                "antigen_iri": {}
              },
              "required": [
                "antigen_iri"
              ]
            },
            {
              "properties": {
                "uniprot_accession": {}
              },
              "required": [
                "uniprot_accession"
              ]
            },
            {
              "properties": {
                "mhc_allele": {}
              },
              "required": [
                "mhc_allele"
              ]
            },
            {
              "properties": {
                "mhc_class": {}
              },
              "required": [
                "mhc_class"
              ]
            },
            {
              "properties": {
                "qualitative_measure": {}
              },
              "required": [
                "qualitative_measure"
              ]
            },
            {
              "properties": {
                "assay_iri": {}
              },
              "required": [
                "assay_iri"
              ]
            },
            {
              "properties": {
                "pdb_id": {}
              },
              "required": [
                "pdb_id"
              ]
            },
            {
              "properties": {
                "sequence": {}
              },
              "required": [
                "sequence"
              ]
            },
            {
              "properties": {
                "receptor_group_id": {}
              },
              "required": [
                "receptor_group_id"
              ]
            },
            {
              "properties": {
                "chain1_cdr3": {}
              },
              "required": [
                "chain1_cdr3"
              ]
            },
            {
              "properties": {
                "chain2_cdr3": {}
              },
              "required": [
                "chain2_cdr3"
              ]
            }
          ],
          "additionalProperties": false,
          "not": {
            "properties": {
              "antigen_iri": {},
              "uniprot_accession": {}
            },
            "required": [
              "antigen_iri",
              "uniprot_accession"
            ]
          }
        },
        "returns": "{source,query_url,limit,offset,returned,has_more,next_offset,records:[{...IEDB fields,tcr_export:[{receptor__iedb_receptor_id,reference__iedb_iri,epitope__iedb_iri,chain_1__cdr3_curated,chain_2__cdr3_curated,...}],cross_references:{parent_uniprot_accessions,curated_uniprot_accessions,pdb_ids}}]}. Upstream nulls and evidence values are preserved; optional fields may be absent. No exact total is requested. Follow next_offset with identical filters; order is by the unique IEDB key. Empty results mean no match for these filters. No automatic page traversal, local cache or external connector calls. Pagination fields (limit, offset, returned, has_more and next_offset) describe receptor groups only, not embedded export rows. Embedded export counts and completeness are not reported; has_more=false does not establish a complete evidence export.",
        "exampleArgs": {
          "epitope_id": 25750,
          "limit": 20
        }
      },
      {
        "id": "search_bcrs",
        "connector": "iedb",
        "credentialKeys": [],
        "description": "Search IEDB BCR receptor groups by epitope, receptor CDR3, host, antigen, MHC and literature evidence. The sequence filter matches epitope linear_sequences; chain1_cdr3 and chain2_cdr3 match receptor chain CDR3 sequences. Includes bcr_export records with chains, curated/calculated gene annotations and linked assays and references. Filters select receptor groups; embedded export records are not individually filtered by these criteria. Aggregated host and outcome filters can match different experiments in the same group. Receptor exports do not contain host or qualitative outcome fields. For experiment-level co-occurrence, follow the linked assay__iedb_ids and query search_tcell_assays, search_bcell_assays or search_mhc_assays with the corresponding assay_id and experimental filters. At least one biological or evidence filter is required; limit and offset alone are not filters. Database observations, not predictions. Keep negative and missing results distinct. MHC ligand elution is not a binding affinity measurement; interpret response_measured, method and units together. Parent antigens are representative proteins and may not exactly match the curated antigen or epitope sequence. Use cross_references.parent_uniprot_accessions or curated_uniprot_accessions with genes/get_uniprot_entries (accessions); use cross_references.pdb_ids with structures/pdb_get_structures (pdb_ids). These are explicit upstream cross-references, not sequence-derived mappings.",
        "input": {
          "type": "object",
          "properties": {
            "epitope_id": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991,
              "description": "IEDB epitope structure_id, not a PDB structure identifier."
            },
            "reference_id": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991,
              "description": "IEDB reference_id, not a PMID."
            },
            "host_taxonomy_id": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991,
              "description": "NCBI taxon of the experimental host, including descendants (9606 for human)."
            },
            "source_taxonomy_id": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991,
              "description": "NCBI taxon of the epitope source organism, including descendants; distinct from host."
            },
            "antigen_iri": {
              "type": "string",
              "maxLength": 200,
              "pattern": "^[A-Za-z][A-Za-z0-9_]*:[A-Za-z0-9][A-Za-z0-9._:-]*(?![\\s\\S])",
              "description": "Exact parent antigen CURIE returned by IEDB, e.g. UNIPROT:P01012. Mutually exclusive with uniprot_accession."
            },
            "uniprot_accession": {
              "type": "string",
              "pattern": "^[A-Z0-9]{6}(?:[A-Z0-9]{4})?(?:-[1-9][0-9]*)?(?![\\s\\S])",
              "description": "Exact parent UniProt accession; no automatic isoform or alias conversion."
            },
            "mhc_allele": {
              "type": "string",
              "minLength": 1,
              "maxLength": 300,
              "pattern": "\\S",
              "description": "Exact IEDB allele name, e.g. HLA-A*02:01. The asterisk is literal."
            },
            "mhc_class": {
              "type": "string",
              "enum": [
                "I",
                "II"
              ]
            },
            "qualitative_measure": {
              "type": "string",
              "minLength": 1,
              "maxLength": 300,
              "pattern": "\\S",
              "description": "Exact IEDB result, e.g. Negative, Positive, Positive-High. No result filter by default."
            },
            "assay_iri": {
              "type": "string",
              "maxLength": 200,
              "pattern": "^[A-Za-z][A-Za-z0-9_]*:[A-Za-z0-9][A-Za-z0-9._:-]*(?![\\s\\S])",
              "description": "Assay ontology CURIE with descendants, e.g. OBI:0001489 for cellular MHC/mass spectrometry."
            },
            "pdb_id": {
              "type": "string",
              "pattern": "^[0-9][A-Za-z0-9]{3}(?![\\s\\S])",
              "description": "Experimental PDB cross-reference, not an IEDB epitope ID."
            },
            "sequence": {
              "type": "string",
              "pattern": "^[A-Za-z]+(?![\\s\\S])",
              "maxLength": 1000,
              "description": "Exact linear epitope sequence (case normalized), not a receptor sequence."
            },
            "receptor_group_id": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991,
              "description": "IEDB receptor group identifier."
            },
            "chain1_cdr3": {
              "type": "string",
              "pattern": "^[A-Za-z]+(?![\\s\\S])",
              "maxLength": 1000,
              "description": "Exact receptor chain 1 CDR3 sequence (case normalized)."
            },
            "chain2_cdr3": {
              "type": "string",
              "pattern": "^[A-Za-z]+(?![\\s\\S])",
              "maxLength": 1000,
              "description": "Exact receptor chain 2 CDR3 sequence (case normalized)."
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            },
            "offset": {
              "type": "integer",
              "minimum": 0,
              "maximum": 1000000,
              "default": 0
            }
          },
          "anyOf": [
            {
              "properties": {
                "epitope_id": {}
              },
              "required": [
                "epitope_id"
              ]
            },
            {
              "properties": {
                "reference_id": {}
              },
              "required": [
                "reference_id"
              ]
            },
            {
              "properties": {
                "host_taxonomy_id": {}
              },
              "required": [
                "host_taxonomy_id"
              ]
            },
            {
              "properties": {
                "source_taxonomy_id": {}
              },
              "required": [
                "source_taxonomy_id"
              ]
            },
            {
              "properties": {
                "antigen_iri": {}
              },
              "required": [
                "antigen_iri"
              ]
            },
            {
              "properties": {
                "uniprot_accession": {}
              },
              "required": [
                "uniprot_accession"
              ]
            },
            {
              "properties": {
                "mhc_allele": {}
              },
              "required": [
                "mhc_allele"
              ]
            },
            {
              "properties": {
                "mhc_class": {}
              },
              "required": [
                "mhc_class"
              ]
            },
            {
              "properties": {
                "qualitative_measure": {}
              },
              "required": [
                "qualitative_measure"
              ]
            },
            {
              "properties": {
                "assay_iri": {}
              },
              "required": [
                "assay_iri"
              ]
            },
            {
              "properties": {
                "pdb_id": {}
              },
              "required": [
                "pdb_id"
              ]
            },
            {
              "properties": {
                "sequence": {}
              },
              "required": [
                "sequence"
              ]
            },
            {
              "properties": {
                "receptor_group_id": {}
              },
              "required": [
                "receptor_group_id"
              ]
            },
            {
              "properties": {
                "chain1_cdr3": {}
              },
              "required": [
                "chain1_cdr3"
              ]
            },
            {
              "properties": {
                "chain2_cdr3": {}
              },
              "required": [
                "chain2_cdr3"
              ]
            }
          ],
          "additionalProperties": false,
          "not": {
            "properties": {
              "antigen_iri": {},
              "uniprot_accession": {}
            },
            "required": [
              "antigen_iri",
              "uniprot_accession"
            ]
          }
        },
        "returns": "{source,query_url,limit,offset,returned,has_more,next_offset,records:[{...IEDB fields,bcr_export:[{receptor__iedb_receptor_id,reference__iedb_iri,epitope__iedb_iri,chain_1__cdr3_curated,chain_2__cdr3_curated,...}],cross_references:{parent_uniprot_accessions,curated_uniprot_accessions,pdb_ids}}]}. Upstream nulls and evidence values are preserved; optional fields may be absent. No exact total is requested. Follow next_offset with identical filters; order is by the unique IEDB key. Empty results mean no match for these filters. No automatic page traversal, local cache or external connector calls. Pagination fields (limit, offset, returned, has_more and next_offset) describe receptor groups only, not embedded export rows. Embedded export counts and completeness are not reported; has_more=false does not establish a complete evidence export.",
        "exampleArgs": {
          "epitope_id": 25750,
          "limit": 20
        }
      },
      {
        "id": "search_references",
        "connector": "iedb",
        "credentialKeys": [],
        "description": "Search IEDB references with epitope, host, antigen source, MHC and evidence filters. Aggregated filters can match different experiments in the same record; use assay searches to enforce co-occurrence in one experiment. At least one biological or evidence filter is required; limit and offset alone are not filters. Database observations, not predictions. Keep negative and missing results distinct. MHC ligand elution is not a binding affinity measurement; interpret response_measured, method and units together. Parent antigens are representative proteins and may not exactly match the curated antigen or epitope sequence. Use cross_references.parent_uniprot_accessions or curated_uniprot_accessions with genes/get_uniprot_entries (accessions); use cross_references.pdb_ids with structures/pdb_get_structures (pdb_ids). These are explicit upstream cross-references, not sequence-derived mappings.",
        "input": {
          "type": "object",
          "properties": {
            "epitope_id": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991,
              "description": "IEDB epitope structure_id, not a PDB structure identifier."
            },
            "reference_id": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991,
              "description": "IEDB reference_id, not a PMID."
            },
            "host_taxonomy_id": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991,
              "description": "NCBI taxon of the experimental host, including descendants (9606 for human)."
            },
            "source_taxonomy_id": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991,
              "description": "NCBI taxon of the epitope source organism, including descendants; distinct from host."
            },
            "antigen_iri": {
              "type": "string",
              "maxLength": 200,
              "pattern": "^[A-Za-z][A-Za-z0-9_]*:[A-Za-z0-9][A-Za-z0-9._:-]*(?![\\s\\S])",
              "description": "Exact parent antigen CURIE returned by IEDB, e.g. UNIPROT:P01012. Mutually exclusive with uniprot_accession."
            },
            "uniprot_accession": {
              "type": "string",
              "pattern": "^[A-Z0-9]{6}(?:[A-Z0-9]{4})?(?:-[1-9][0-9]*)?(?![\\s\\S])",
              "description": "Exact parent UniProt accession; no automatic isoform or alias conversion."
            },
            "mhc_allele": {
              "type": "string",
              "minLength": 1,
              "maxLength": 300,
              "pattern": "\\S",
              "description": "Exact IEDB allele name, e.g. HLA-A*02:01. The asterisk is literal."
            },
            "mhc_class": {
              "type": "string",
              "enum": [
                "I",
                "II"
              ]
            },
            "qualitative_measure": {
              "type": "string",
              "minLength": 1,
              "maxLength": 300,
              "pattern": "\\S",
              "description": "Exact IEDB result, e.g. Negative, Positive, Positive-High. No result filter by default."
            },
            "assay_iri": {
              "type": "string",
              "maxLength": 200,
              "pattern": "^[A-Za-z][A-Za-z0-9_]*:[A-Za-z0-9][A-Za-z0-9._:-]*(?![\\s\\S])",
              "description": "Assay ontology CURIE with descendants, e.g. OBI:0001489 for cellular MHC/mass spectrometry."
            },
            "pdb_id": {
              "type": "string",
              "pattern": "^[0-9][A-Za-z0-9]{3}(?![\\s\\S])",
              "description": "Experimental PDB cross-reference, not an IEDB epitope ID."
            },
            "pubmed_id": {
              "type": "string",
              "pattern": "^[1-9][0-9]*(?![\\s\\S])",
              "maxLength": 12
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            },
            "offset": {
              "type": "integer",
              "minimum": 0,
              "maximum": 1000000,
              "default": 0
            }
          },
          "anyOf": [
            {
              "properties": {
                "epitope_id": {}
              },
              "required": [
                "epitope_id"
              ]
            },
            {
              "properties": {
                "reference_id": {}
              },
              "required": [
                "reference_id"
              ]
            },
            {
              "properties": {
                "host_taxonomy_id": {}
              },
              "required": [
                "host_taxonomy_id"
              ]
            },
            {
              "properties": {
                "source_taxonomy_id": {}
              },
              "required": [
                "source_taxonomy_id"
              ]
            },
            {
              "properties": {
                "antigen_iri": {}
              },
              "required": [
                "antigen_iri"
              ]
            },
            {
              "properties": {
                "uniprot_accession": {}
              },
              "required": [
                "uniprot_accession"
              ]
            },
            {
              "properties": {
                "mhc_allele": {}
              },
              "required": [
                "mhc_allele"
              ]
            },
            {
              "properties": {
                "mhc_class": {}
              },
              "required": [
                "mhc_class"
              ]
            },
            {
              "properties": {
                "qualitative_measure": {}
              },
              "required": [
                "qualitative_measure"
              ]
            },
            {
              "properties": {
                "assay_iri": {}
              },
              "required": [
                "assay_iri"
              ]
            },
            {
              "properties": {
                "pdb_id": {}
              },
              "required": [
                "pdb_id"
              ]
            },
            {
              "properties": {
                "pubmed_id": {}
              },
              "required": [
                "pubmed_id"
              ]
            }
          ],
          "additionalProperties": false,
          "not": {
            "properties": {
              "antigen_iri": {},
              "uniprot_accession": {}
            },
            "required": [
              "antigen_iri",
              "uniprot_accession"
            ]
          }
        },
        "returns": "{source,query_url,limit,offset,returned,has_more,next_offset,records:[{...IEDB fields,cross_references:{parent_uniprot_accessions,curated_uniprot_accessions,pdb_ids}}]}. Upstream nulls and evidence values are preserved; optional fields may be absent. No exact total is requested. Follow next_offset with identical filters; order is by the unique IEDB key. Empty results mean no match for these filters. No automatic page traversal, local cache or external connector calls.",
        "exampleArgs": {
          "reference_id": 1023094,
          "limit": 20
        }
      }
    ]
  },
  {
    "id": "monarch",
    "displayName": "Monarch Initiative",
    "aliases": [
      "Monarch",
      "phenotype evidence",
      "disease phenotype associations"
    ],
    "description": "Disease and gene phenotype associations with evidence sources via Monarch Initiative.",
    "useWhen": "Use to query disease–phenotype or gene–phenotype associations for Monarch canonical CURIEs and inspect relation types, evidence codes, publications, provenance, negation and qualifiers.",
    "sources": [
      "Monarch Initiative"
    ],
    "termsUrl": "https://monarch-app.monarchinitiative.org/Licensing/",
    "requiresNcbi": false,
    "group": "directory",
    "tools": [
      {
        "id": "monarch_get_disease_phenotypes",
        "connector": "monarch",
        "credentialKeys": [],
        "description": "Retrieve disease–phenotype association evidence using Monarch canonical CURIEs, with relation/category, primary and aggregator sources, publications, evidence codes, negation, frequency, onset and disease context when supplied. Source database IDs and aliases are not automatically converted to Monarch canonical IDs and may return no matches. A zero total means no match for the supplied identifier and filters, not absence of phenotype evidence. Direct identifier matching is the default; direct does not mean experimentally proven. Inspect knowledge_level and agent_type for inferred associations. Missing evidence is not negative evidence. Use Genes & Ontologies for OLS term search and Alliance for model-organism records.",
        "input": {
          "type": "object",
          "properties": {
            "disease_id": {
              "type": "string",
              "pattern": "^[A-Za-z][A-Za-z0-9._-]*:[A-Za-z0-9][A-Za-z0-9._:-]*(?![\\s\\S])",
              "maxLength": 200,
              "description": "Monarch canonical disease CURIE, such as MONDO:0007947. Resolve names with existing gene/ontology tools and use the identifier indexed by Monarch; source database IDs and aliases are not automatically converted."
            },
            "phenotype_id": {
              "type": "string",
              "pattern": "^[A-Za-z][A-Za-z0-9._-]*:[A-Za-z0-9][A-Za-z0-9._:-]*(?![\\s\\S])",
              "maxLength": 200,
              "description": "Optional Monarch canonical phenotype CURIE, such as HP:0002107."
            },
            "primary_knowledge_source": {
              "type": "string",
              "pattern": "^[A-Za-z][A-Za-z0-9._-]*:[A-Za-z0-9][A-Za-z0-9._:-]*(?![\\s\\S])",
              "maxLength": 200,
              "description": "Optional source CURIE, such as infores:omim."
            },
            "direct": {
              "type": "boolean",
              "default": true,
              "description": "Match identifiers directly. Set false to include ontology descendants; inspect returned subjects and objects."
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            },
            "offset": {
              "type": "integer",
              "minimum": 0,
              "maximum": 1000000,
              "default": 0
            }
          },
          "required": [
            "disease_id"
          ],
          "additionalProperties": false
        },
        "required": [
          "disease_id"
        ],
        "returns": "{query:{subject,category,phenotype_id,primary_knowledge_source,direct},limit,offset,total,returned,next_offset,associations:[{id,subject,subject_label,object,object_label,category,predicate,original_predicate,knowledge_level,agent_type,primary_knowledge_source,aggregator_knowledge_source,provided_by,provided_by_link,publications,publications_links,has_evidence,has_evidence_links,evidence_count,negated,frequency_qualifier,onset_qualifier,disease_context_qualifier,...}]}. Optional evidence fields retain upstream nulls; evidence_count is not a confidence score.",
        "exampleArgs": {
          "disease_id": "MONDO:0007947",
          "limit": 20
        }
      },
      {
        "id": "monarch_get_gene_phenotypes",
        "connector": "monarch",
        "credentialKeys": [],
        "description": "Retrieve gene–phenotype association evidence using Monarch canonical CURIEs, with relation/category, primary and aggregator sources, publications, evidence codes, negation, frequency, onset and disease context when supplied. Source database IDs and aliases are not automatically converted to Monarch canonical IDs and may return no matches. A zero total means no match for the supplied identifier and filters, not absence of phenotype evidence. Direct identifier matching is the default; direct does not mean experimentally proven. Inspect knowledge_level and agent_type for inferred associations. Missing evidence is not negative evidence. Use Genes & Ontologies for OLS term search and Alliance for model-organism records.",
        "input": {
          "type": "object",
          "properties": {
            "gene_id": {
              "type": "string",
              "pattern": "^[A-Za-z][A-Za-z0-9._-]*:[A-Za-z0-9][A-Za-z0-9._:-]*(?![\\s\\S])",
              "maxLength": 200,
              "description": "Monarch canonical gene CURIE, such as HGNC:3603 for a human gene. Resolve names with existing gene/ontology tools and use the identifier indexed by Monarch; source database IDs and aliases are not automatically converted."
            },
            "phenotype_id": {
              "type": "string",
              "pattern": "^[A-Za-z][A-Za-z0-9._-]*:[A-Za-z0-9][A-Za-z0-9._:-]*(?![\\s\\S])",
              "maxLength": 200,
              "description": "Optional Monarch canonical phenotype CURIE, such as HP:0002107."
            },
            "primary_knowledge_source": {
              "type": "string",
              "pattern": "^[A-Za-z][A-Za-z0-9._-]*:[A-Za-z0-9][A-Za-z0-9._:-]*(?![\\s\\S])",
              "maxLength": 200,
              "description": "Optional source CURIE, such as infores:omim."
            },
            "direct": {
              "type": "boolean",
              "default": true,
              "description": "Match identifiers directly. Set false to include ontology descendants; inspect returned subjects and objects."
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            },
            "offset": {
              "type": "integer",
              "minimum": 0,
              "maximum": 1000000,
              "default": 0
            }
          },
          "required": [
            "gene_id"
          ],
          "additionalProperties": false
        },
        "required": [
          "gene_id"
        ],
        "returns": "{query:{subject,category,phenotype_id,primary_knowledge_source,direct},limit,offset,total,returned,next_offset,associations:[{id,subject,subject_label,object,object_label,category,predicate,original_predicate,knowledge_level,agent_type,primary_knowledge_source,aggregator_knowledge_source,provided_by,provided_by_link,publications,publications_links,has_evidence,has_evidence_links,evidence_count,negated,frequency_qualifier,onset_qualifier,disease_context_qualifier,...}]}. Optional evidence fields retain upstream nulls; evidence_count is not a confidence score.",
        "exampleArgs": {
          "gene_id": "HGNC:3603",
          "limit": 20
        }
      }
    ]
  },
  {
    "id": "alliance",
    "displayName": "Alliance Genome Resources",
    "aliases": [
      "Alliance",
      "AGR",
      "model organism genes",
      "model organism genomics"
    ],
    "description": "Model-organism and human gene knowledge via the Alliance of Genome Resources — gene summaries, orthology, disease models, phenotypes, alleles and expression.",
    "useWhen": "Use when you need cross-species model-organism gene knowledge from the Alliance of Genome Resources — search or summarize genes from human, mouse, rat, fly, worm, zebrafish, yeast and frog; retrieve orthologs, disease models, phenotype annotations, alleles/variants, or developmental and anatomical expression; or find genes associated with a Disease Ontology term.",
    "sources": [
      "Alliance of Genome Resources"
    ],
    "termsUrl": "https://www.alliancegenome.org/terms-of-use",
    "requiresNcbi": false,
    "group": "directory",
    "tools": [
      {
        "id": "alliance_get_gene",
        "connector": "alliance",
        "credentialKeys": [],
        "description": "Retrieve a model-organism or human gene summary from the Alliance of Genome Resources, including symbol, species, synopsis, genomic location and cross-references.",
        "input": {
          "type": "object",
          "properties": {
            "gene_id": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200
            }
          },
          "required": [
            "gene_id"
          ],
          "additionalProperties": false
        },
        "required": [
          "gene_id"
        ],
        "returns": "{query_gene_id, gene:{id,symbol,name,species,taxon_id,synopsis,synonyms,gene_type,genomic_location,cross_references}}",
        "exampleArgs": {
          "gene_id": "MGI:97490"
        }
      },
      {
        "id": "alliance_search_genes",
        "connector": "alliance",
        "credentialKeys": [],
        "description": "Search Alliance genes across human and model-organism databases by symbol, name or identifier.",
        "input": {
          "type": "object",
          "properties": {
            "query": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            },
            "page": {
              "type": "integer",
              "minimum": 1,
              "maximum": 10000,
              "default": 1
            }
          },
          "required": [
            "query"
          ],
          "additionalProperties": false
        },
        "required": [
          "query"
        ],
        "returns": "{query,page,limit,total,genes:[{id,symbol,name,species,...}],returned}",
        "exampleArgs": {
          "query": "pax6",
          "limit": 10
        }
      },
      {
        "id": "alliance_get_gene_orthologs",
        "connector": "alliance",
        "credentialKeys": [],
        "description": "Retrieve cross-species orthologs for an Alliance gene, with orthology stringency and prediction methods.",
        "input": {
          "type": "object",
          "properties": {
            "gene_id": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200
            },
            "stringency": {
              "type": "string",
              "enum": [
                "stringent",
                "moderate",
                "all"
              ],
              "default": "stringent"
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            },
            "page": {
              "type": "integer",
              "minimum": 1,
              "maximum": 10000,
              "default": 1
            }
          },
          "required": [
            "gene_id"
          ],
          "additionalProperties": false
        },
        "required": [
          "gene_id"
        ],
        "returns": "{query_gene_id,stringency,page,limit,total,orthologs:[...],returned}",
        "exampleArgs": {
          "gene_id": "HGNC:8620",
          "stringency": "stringent"
        }
      },
      {
        "id": "alliance_get_gene_disease_models",
        "connector": "alliance",
        "credentialKeys": [],
        "description": "Retrieve disease associations and model-organism disease models involving an Alliance gene.",
        "input": {
          "type": "object",
          "properties": {
            "gene_id": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            },
            "page": {
              "type": "integer",
              "minimum": 1,
              "maximum": 10000,
              "default": 1
            }
          },
          "required": [
            "gene_id"
          ],
          "additionalProperties": false
        },
        "required": [
          "gene_id"
        ],
        "returns": "{query_gene_id,page,limit,total,disease_models:[{model_id,model_name,diseases:[{disease_id,disease_name,association_type,...}],...}],returned}",
        "exampleArgs": {
          "gene_id": "MGI:97490"
        }
      },
      {
        "id": "alliance_get_gene_phenotypes",
        "connector": "alliance",
        "credentialKeys": [],
        "description": "Retrieve phenotype annotations for a gene across Alliance model organisms.",
        "input": {
          "type": "object",
          "properties": {
            "gene_id": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            },
            "page": {
              "type": "integer",
              "minimum": 1,
              "maximum": 10000,
              "default": 1
            }
          },
          "required": [
            "gene_id"
          ],
          "additionalProperties": false
        },
        "required": [
          "gene_id"
        ],
        "returns": "{query_gene_id,page,limit,total,phenotypes:[{gene_id,gene_symbol,phenotype_statement,...}],returned}",
        "exampleArgs": {
          "gene_id": "HGNC:6081",
          "limit": 20
        }
      },
      {
        "id": "alliance_get_gene_alleles",
        "connector": "alliance",
        "credentialKeys": [],
        "description": "Retrieve alleles and variants associated with an Alliance gene, including disease and phenotype flags.",
        "input": {
          "type": "object",
          "properties": {
            "gene_id": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            },
            "page": {
              "type": "integer",
              "minimum": 1,
              "maximum": 10000,
              "default": 1
            }
          },
          "required": [
            "gene_id"
          ],
          "additionalProperties": false
        },
        "required": [
          "gene_id"
        ],
        "returns": "{query_gene_id,page,limit,total,alleles:[{id,symbol,category,variants,...}],returned}",
        "exampleArgs": {
          "gene_id": "MGI:97490"
        }
      },
      {
        "id": "alliance_get_gene_expression",
        "connector": "alliance",
        "credentialKeys": [],
        "description": "Retrieve expression annotations for an Alliance gene, including developmental stage, anatomical location, provider and evidence.",
        "input": {
          "type": "object",
          "properties": {
            "gene_id": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            },
            "page": {
              "type": "integer",
              "minimum": 1,
              "maximum": 10000,
              "default": 1
            }
          },
          "required": [
            "gene_id"
          ],
          "additionalProperties": false
        },
        "required": [
          "gene_id"
        ],
        "returns": "{query_gene_id,page,limit,total,expression:[{stage,location,data_provider,reference,...}],returned}",
        "exampleArgs": {
          "gene_id": "ZFIN:ZDB-GENE-990415-8"
        }
      },
      {
        "id": "alliance_get_disease_genes",
        "connector": "alliance",
        "credentialKeys": [],
        "description": "Retrieve genes associated with a Disease Ontology term across Alliance human and model-organism data.",
        "input": {
          "type": "object",
          "properties": {
            "disease_id": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            },
            "page": {
              "type": "integer",
              "minimum": 1,
              "maximum": 10000,
              "default": 1
            }
          },
          "required": [
            "disease_id"
          ],
          "additionalProperties": false
        },
        "required": [
          "disease_id"
        ],
        "returns": "{query_disease_id,page,limit,total,genes:[{gene_id,gene_symbol,disease_id,disease_name,...}],returned}",
        "exampleArgs": {
          "disease_id": "DOID:162",
          "limit": 20
        }
      }
    ]
  },
  {
    "id": "chemistry",
    "displayName": "Chemistry",
    "description": "Small-molecule chemistry via PubChem, ChEBI, Rhea, BindingDB, LIPID MAPS and UniChem.",
    "useWhen": "Use when a question needs authoritative small-molecule chemistry data — PubChem compound properties (formula, weight, SMILES/InChI, IUPAC name), CID resolution and 2D similarity search, bioassay and GHS safety summaries; ChEBI ontology entities, roles and relations; Rhea enzyme reactions (by ChEBI participant, EC number, or equation text); BindingDB binding affinities (Ki/Kd/IC50/EC50) by protein target or compound; LIPID MAPS lipid classification and compound details by exact LMID or PubChem CID; or exact InChIKey/ChEMBL ID mapping to PubChem, ChEMBL and ChEBI through UniChem.",
    "sources": [
      "PubChem",
      "ChEBI",
      "Rhea",
      "BindingDB",
      "LIPID MAPS",
      "UniChem"
    ],
    "termsUrl": "https://www.ncbi.nlm.nih.gov/home/about/policies/",
    "requiresNcbi": false,
    "group": "featured",
    "tools": [
      {
        "connector": "chemistry",
        "id": "lipidmaps_get_compound",
        "credentialKeys": [],
        "maxResponseBytes": 100000,
        "totalTimeoutMs": 25000,
        "description": "Look up lipid classification and compound details in LIPID MAPS by one exact LMID or PubChem CID. Resolve names with PubChem first. Returns native structure identifiers and available database mappings; missing fields remain unknown. An LMID may describe a generic or incompletely specified structure, not a unique experimentally identified molecule. Preserve all returned matches rather than selecting the first. No name, formula, abbreviation, mass or bulk search. Data: LIPID MAPS, CC BY 4.0; retain attribution and record links.",
        "input": {
          "type": "object",
          "properties": {
            "id_type": {
              "type": "string",
              "enum": [
                "lm_id",
                "pubchem_cid"
              ]
            },
            "identifier": {
              "type": "string",
              "maxLength": 15,
              "description": "Exact LMID (e.g. LMFA01010001) or positive PubChem CID as a string."
            }
          },
          "required": [
            "id_type",
            "identifier"
          ],
          "additionalProperties": false,
          "allOf": [
            {
              "if": {
                "properties": {
                  "id_type": {
                    "const": "lm_id"
                  }
                }
              },
              "then": {
                "properties": {
                  "identifier": {
                    "type": "string",
                    "pattern": "^LM(?:FA|GL|GP|SP|ST|PR|SL|PK)[0-9]{4}(?:[0-9]{2})?[A-Z0-9]{4}$"
                  }
                }
              },
              "else": {
                "properties": {
                  "identifier": {
                    "type": "string",
                    "pattern": "^[1-9][0-9]{0,14}$"
                  }
                }
              }
            }
          ]
        },
        "required": [
          "id_type",
          "identifier"
        ],
        "exampleArgs": {
          "id_type": "lm_id",
          "identifier": "LMFA01010001"
        },
        "returns": "{ source:\"LIPID MAPS\", license:\"CC BY 4.0\", license_url, source_url, id_type, identifier, total_matches, records_truncated, records }. Up to 5 records with lm_id, record_url, classification (core, main_class, optional sub_class/class_level4), optional name/sys_name, formula, exactmass (upstream decimal string), abbreviations, InChI/InChIKey/SMILES and database IDs. Field names follow the upstream API; absent/null values are unknown. Empty records mean no database match, not biological absence. Oversized or inconsistent upstream data raises an error."
      },
      {
        "connector": "chemistry",
        "id": "unichem_map_compound",
        "credentialKeys": [],
        "maxResponseBytes": 1000000,
        "totalTimeoutMs": 25000,
        "description": "Map one exact full InChIKey or ChEMBL ID to PubChem, ChEMBL and ChEBI identifiers using UniChem. Resolve names with PubChem first. Preserves distinct matched structures and reports filtering and truncation. Mapping reflects UniChem indexed assignments, not verified current source records or biological equivalence. No name, similarity, connectivity, salt-component or batch search.",
        "input": {
          "type": "object",
          "properties": {
            "id_type": {
              "type": "string",
              "enum": [
                "inchikey",
                "chembl"
              ]
            },
            "identifier": {
              "type": "string",
              "maxLength": 27
            }
          },
          "required": [
            "id_type",
            "identifier"
          ],
          "additionalProperties": false,
          "allOf": [
            {
              "if": {
                "properties": {
                  "id_type": {
                    "const": "inchikey"
                  }
                }
              },
              "then": {
                "properties": {
                  "identifier": {
                    "type": "string",
                    "pattern": "^[A-Z]{14}-[A-Z]{10}-[A-Z]$"
                  }
                }
              },
              "else": {
                "properties": {
                  "identifier": {
                    "type": "string",
                    "pattern": "^CHEMBL[1-9][0-9]{0,14}$"
                  }
                }
              }
            }
          ]
        },
        "required": [
          "id_type",
          "identifier"
        ],
        "exampleArgs": {
          "id_type": "chembl",
          "identifier": "CHEMBL1089"
        },
        "returns": "{ source, source_url, id_type, identifier, target_sources, total_matches, records_truncated, records }. At most 5 structures, each with uci, standard_inchi_key, total_mappings, filtered_out_mappings, matching_mappings, mappings_truncated and up to 20 mappings { source, identifier, url }. Filtering to PubChem/ChEMBL/ChEBI is local after download. Empty records mean no UniChem match; an empty mappings list only means no mapping to these target sources. Never select a single structure from multiple matches implicitly."
      },
      {
        "id": "pubchem_search_compounds",
        "connector": "chemistry",
        "credentialKeys": [],
        "description": "Resolve a chemical identifier (name, SMILES, InChIKey, or CID) to PubChem CIDs, optionally with core computed properties for the top hits.",
        "input": {
          "type": "object",
          "properties": {
            "query": {
              "type": "string",
              "description": "Identifier matching `namespace`, e.g. \"aspirin\", a SMILES, or an InChIKey."
            },
            "namespace": {
              "type": "string",
              "enum": [
                "name",
                "smiles",
                "inchikey",
                "cid"
              ],
              "default": "name"
            },
            "max_cids": {
              "type": "integer",
              "default": 25,
              "minimum": 1,
              "maximum": 100
            },
            "with_properties": {
              "type": "boolean",
              "default": true
            }
          },
          "required": [
            "query"
          ]
        },
        "required": [
          "query"
        ],
        "returns": "`{ \"query\": str, \"namespace\": str, \"n_cids_total\": int, \"truncated\": bool, \"cids\": [int], \"properties\": [ {...} ] }` — `n_cids_total` is the full match count, `cids` capped at `max_cids`. `cids` is `[]` when nothing matches (not an error). `properties` rows use PubChem 2025 field names (CID, MolecularFormula, MolecularWeight, `SMILES` = isomeric, `ConnectivitySMILES` = stereo-stripped, InChI, InChIKey, IUPACName, XLogP, ExactMass, TPSA, Charge, H-bond/rotatable-bond/heavy-atom counts).",
        "exampleArgs": {
          "query": "aspirin",
          "max_cids": 25
        }
      },
      {
        "id": "pubchem_get_compounds",
        "connector": "chemistry",
        "credentialKeys": [],
        "description": "Full computed-property records for a batch of PubChem CIDs, with optional capped synonym lists.",
        "input": {
          "type": "object",
          "properties": {
            "cids": {
              "type": "array",
              "items": {
                "type": "integer"
              },
              "minItems": 1,
              "maxItems": 50
            },
            "include_synonyms": {
              "type": "boolean",
              "default": false
            },
            "max_synonyms": {
              "type": "integer",
              "default": 30
            }
          },
          "required": [
            "cids"
          ]
        },
        "required": [
          "cids"
        ],
        "returns": "`{ \"n_requested\": int, \"duplicates\": [int], \"records\": [ {...} ], \"not_found\": [int] }` — one record per distinct CID (repeats disclosed in `duplicates`, first-occurrence order). Each record carries CID, MolecularFormula, MolecularWeight, SMILES (isomeric), ConnectivitySMILES, InChI, InChIKey, IUPACName, XLogP, ExactMass, TPSA, Charge, HBondDonorCount, HBondAcceptorCount, RotatableBondCount, HeavyAtomCount — plus `synonyms`/`n_synonyms_total`/`synonyms_truncated` when `include_synonyms`. CIDs the API does not know appear in `not_found`.",
        "exampleArgs": {
          "cids": [
            2244,
            2519
          ],
          "include_synonyms": false
        }
      },
      {
        "id": "pubchem_similarity_search",
        "connector": "chemistry",
        "credentialKeys": [],
        "description": "2D Tanimoto similarity search over all of PubChem for a query SMILES (synchronous fastsimilarity_2d route, no job polling).",
        "input": {
          "type": "object",
          "properties": {
            "smiles": {
              "type": "string"
            },
            "threshold": {
              "type": "integer",
              "default": 90,
              "minimum": 1,
              "maximum": 100
            },
            "max_records": {
              "type": "integer",
              "default": 50,
              "minimum": 1,
              "maximum": 200
            },
            "with_properties": {
              "type": "boolean",
              "default": false
            }
          },
          "required": [
            "smiles"
          ]
        },
        "required": [
          "smiles"
        ],
        "returns": "`{ \"smiles\": str, \"threshold\": int, \"n_cids\": int, \"may_be_truncated\": bool, \"cids\": [int], \"properties\": [ {...} ] }` — CIDs in upstream relevance order (the query compound is usually first). `threshold` is percent Tanimoto. The API does not report an uncapped total, so `may_be_truncated` is true exactly when the cap was filled. `properties` (when `with_properties`) covers the first 10 hits.",
        "exampleArgs": {
          "smiles": "CC(=O)OC1=CC=CC=C1C(=O)O",
          "threshold": 90
        }
      },
      {
        "id": "pubchem_get_bioassay_summary",
        "connector": "chemistry",
        "credentialKeys": [],
        "description": "Bioassay activity summary for one PubChem compound — which assays tested it, against which targets, with what outcome and potency.",
        "input": {
          "type": "object",
          "properties": {
            "cid": {
              "type": "integer"
            },
            "active_only": {
              "type": "boolean",
              "default": false
            },
            "max_rows": {
              "type": "integer",
              "default": 100,
              "minimum": 1,
              "maximum": 1000
            }
          },
          "required": [
            "cid"
          ]
        },
        "required": [
          "cid"
        ],
        "returns": "`{ \"cid\": int, \"active_only\": bool, \"n_rows_total\": int, \"truncated\": bool, \"rows\": [ {...} ] }` — each row maps the upstream columns: AID, SID, CID, \"Activity Outcome\" (Active/Inactive/Unspecified/Inconclusive), \"Target Accession\", \"Target GeneID\", \"Activity Value [uM]\", \"Activity Name\", \"Assay Name\", \"Assay Type\", \"PubMed ID\". Filtering by `active_only` happens BEFORE the cap, so `n_rows_total` is the true (filtered) count. `rows` is `[]` for compounds with no assay data (not an error).",
        "exampleArgs": {
          "cid": 2244,
          "active_only": true
        }
      },
      {
        "id": "pubchem_get_safety",
        "connector": "chemistry",
        "credentialKeys": [],
        "description": "GHS safety classification for one PubChem compound (PUG-View 'GHS Classification' heading), aggregated across reporting sources.",
        "input": {
          "type": "object",
          "properties": {
            "cid": {
              "type": "integer"
            }
          },
          "required": [
            "cid"
          ]
        },
        "required": [
          "cid"
        ],
        "returns": "`{ \"cid\": int, \"found\": bool, \"ghs\": {...} | null }` — `ghs` is null when PubChem has no GHS section. Otherwise `{ cid, record_title, signals (e.g. [\"Danger\"]), pictograms (e.g. [\"Flammable\", \"Irritant\"]), hazard_statements (H-codes with occurrence percentages), precautionary_statement_codes, notes, n_source_references }`. Percentages in the hazard text show how many indexed sources report each hazard.",
        "exampleArgs": {
          "cid": 702
        }
      },
      {
        "id": "chebi_search",
        "connector": "chemistry",
        "credentialKeys": [],
        "description": "Full-text search over ChEBI entities (names, synonyms, formulae, InChIKeys).",
        "input": {
          "type": "object",
          "properties": {
            "term": {
              "type": "string"
            },
            "max_results": {
              "type": "integer",
              "default": 20,
              "minimum": 1,
              "maximum": 100
            },
            "page": {
              "type": "integer",
              "default": 1,
              "minimum": 1
            }
          },
          "required": [
            "term"
          ]
        },
        "required": [
          "term"
        ],
        "returns": "`{ \"term\": str, \"page\": int, \"size\": int, \"api_total\": int, \"number_pages\": int, \"results\": [ {...} ] }` — `api_total` is ChEBI's own hit count (further pages exist iff `api_total > page*size`). Each result: chebi_accession, name, definition, stars (3 = manually curated), formula, charge, mass, monoisotopic_mass, smiles, inchikey, relevance.",
        "exampleArgs": {
          "term": "caffeine",
          "max_results": 20
        }
      },
      {
        "id": "chebi_get_entity",
        "connector": "chemistry",
        "credentialKeys": [],
        "description": "Full ChEBI entity record: names, structure, chemical data, roles and cross-references.",
        "input": {
          "type": "object",
          "properties": {
            "chebi_id": {
              "type": "string"
            },
            "max_synonyms": {
              "type": "integer",
              "default": 30
            },
            "max_xrefs": {
              "type": "integer",
              "default": 50
            }
          },
          "required": [
            "chebi_id"
          ]
        },
        "required": [
          "chebi_id"
        ],
        "returns": "`{ chebi_accession, name, definition, stars, formula, charge, mass, monoisotopic_mass, smiles, inchi, inchikey, iupac_names, synonyms, n_synonyms_total, synonyms_truncated, secondary_ids, xrefs ({type, accession, source, url}), n_xrefs_total, xrefs_truncated, roles ({chebi_accession, name, definition}), modified_on, is_released }` — accepts `CHEBI:27732` or bare `27732`; secondary (merged) ids resolve to the primary record. Ontology parents/children live in `chebi_get_ontology`. Unknown ids throw a not-found error.",
        "exampleArgs": {
          "chebi_id": "CHEBI:27732"
        }
      },
      {
        "id": "chebi_get_ontology",
        "connector": "chemistry",
        "credentialKeys": [],
        "description": "Ontology relations of a ChEBI entity — what it IS (outgoing: is a / has role / conjugate acid...) and what points AT it (incoming: children/derivatives).",
        "input": {
          "type": "object",
          "properties": {
            "chebi_id": {
              "type": "string"
            },
            "relation_type": {
              "type": "string",
              "description": "Optional exact filter, e.g. \"is a\", \"has role\", \"has part\"."
            },
            "max_relations": {
              "type": "integer",
              "default": 100
            }
          },
          "required": [
            "chebi_id"
          ]
        },
        "required": [
          "chebi_id"
        ],
        "returns": "`{ chebi_accession, name, relation_type_filter, outgoing_relations, n_outgoing_total, outgoing_truncated, incoming_relations, n_incoming_total, incoming_truncated }` — each relation `{ relation_type, init_chebi_id, init_name, final_chebi_id, final_name }` reads \"init --relation--> final\" (for outgoing, init is this entity; for incoming, final is this entity). `max_relations` caps per direction.",
        "exampleArgs": {
          "chebi_id": "CHEBI:27732",
          "relation_type": "has role"
        }
      },
      {
        "id": "rhea_search_reactions",
        "connector": "chemistry",
        "credentialKeys": [],
        "description": "Search Rhea master reactions by equation text, participant ChEBI id, or EC number (query type auto-detected).",
        "input": {
          "type": "object",
          "properties": {
            "query": {
              "type": "string",
              "description": "A ChEBI id (participant), a full EC number (enzyme reactions), or free text matched against the equation."
            },
            "limit": {
              "type": "integer",
              "default": 50,
              "minimum": 1,
              "maximum": 500
            }
          },
          "required": [
            "query"
          ]
        },
        "required": [
          "query"
        ],
        "returns": "`{ \"query\": str, \"query_type\": \"chebi\"|\"ec\"|\"text\", \"api_total\": int, \"n_returned\": int, \"truncated\": bool, \"reactions\": [ { \"rhea_id\": str, \"equation\": str, \"status\": \"Approved\"|\"Preliminary\"|\"Obsolete\" } ] }` — reactions ordered by rhea_id; `api_total` (a companion COUNT query) is the true match count. A ChEBI id matches reactions with that participant; a full EC matches enzyme reactions (partial ECs like \"2.1.1.-\" are rejected); anything else is a case-insensitive substring match on equation text.",
        "exampleArgs": {
          "query": "caffeine",
          "limit": 50
        }
      },
      {
        "id": "rhea_get_reaction",
        "connector": "chemistry",
        "credentialKeys": [],
        "description": "Full record for one Rhea reaction: equation, participants with ChEBI ids and stoichiometry, EC links, direction family and literature.",
        "input": {
          "type": "object",
          "properties": {
            "rhea_id": {
              "type": "string"
            }
          },
          "required": [
            "rhea_id"
          ]
        },
        "required": [
          "rhea_id"
        ],
        "returns": "`{ rhea_id, equation, status, is_transport, is_chemically_balanced, ec_numbers, pubmed_ids, directional_reactions, bidirectional_reaction, left_side, right_side }` — each side lists participants `{ compound_accession, name, coefficient }` (coefficient \"1\", \"2\", ... or symbolic \"N\"/\"2n\"). Accepts `RHEA:10280` or bare `10280`; unknown ids throw a not-found error.",
        "exampleArgs": {
          "rhea_id": "10280"
        }
      },
      {
        "id": "bindingdb_ligands_by_target",
        "connector": "chemistry",
        "credentialKeys": [],
        "description": "Measured binding affinities (Ki/Kd/IC50/EC50) of all BindingDB ligands against one protein target, by UniProt accession.",
        "input": {
          "type": "object",
          "properties": {
            "uniprot": {
              "type": "string"
            },
            "affinity_cutoff_nm": {
              "type": "number",
              "default": 10000
            },
            "max_rows": {
              "type": "integer",
              "default": 100,
              "minimum": 1,
              "maximum": 1000
            }
          },
          "required": [
            "uniprot"
          ]
        },
        "required": [
          "uniprot"
        ],
        "returns": "`{ \"uniprot\": str, \"affinity_cutoff_nm\": num, \"n_rows_total\": int, \"truncated\": bool, \"rows\": [ { target_name, monomer_id, smiles, affinity_type, affinity, pmid, doi } ] }` — only measurements with value <= `affinity_cutoff_nm`. The full match set is downloaded and counted, so `n_rows_total` is the true count; rows are capped at `max_rows`, sorted by (affinity_type, numeric affinity ascending). `affinity` is a STRING (may carry `>`/`<`, in nM). No hits returns `n_rows_total=0`.",
        "exampleArgs": {
          "uniprot": "P00533",
          "affinity_cutoff_nm": 100
        }
      },
      {
        "id": "bindingdb_targets_by_compound",
        "connector": "chemistry",
        "credentialKeys": [],
        "description": "Protein targets with measured affinities for compounds 2D-similar to a query SMILES — \"what does this molecule (or its close analogs) bind?\".",
        "input": {
          "type": "object",
          "properties": {
            "smiles": {
              "type": "string"
            },
            "similarity": {
              "type": "number",
              "default": 0.85,
              "minimum": 0.5,
              "maximum": 1
            },
            "max_rows": {
              "type": "integer",
              "default": 100,
              "minimum": 1,
              "maximum": 1000
            }
          },
          "required": [
            "smiles"
          ]
        },
        "required": [
          "smiles"
        ],
        "returns": "`{ \"smiles\": str, \"similarity\": num, \"api_hit_count\": int, \"n_rows_total\": int, \"truncated\": bool, \"rows\": [ { monomer_id, smiles, ligand_name, target_name, species, affinity_type, affinity, tanimoto } ] }` — `smiles` per row is the matched analog. `api_hit_count` is the upstream matching-compound count (not row-for-row comparable with `n_rows_total`, which counts per-measurement rows). Rows capped at `max_rows`, sorted by (target_name, affinity_type, numeric affinity). `affinity` is a STRING (may carry `>`/`<`, in nM). No hits returns `n_rows_total=0`.",
        "exampleArgs": {
          "smiles": "CC(=O)OC1=CC=CC=C1C(=O)O",
          "similarity": 0.85
        }
      }
    ]
  },
  {
    "id": "literature",
    "displayName": "Literature Graph",
    "description": "Literature and research data via OpenAlex, arXiv, Crossref and DataCite.",
    "useWhen": "Use when exploring the scholarly literature graph — searching OpenAlex works/papers by topic with citation counts and authors, following a work’s citations or references, looking up authors (ORCID, h-index, institution) or a venue/journal, searching arXiv preprints, checking Crossref bibliographic metadata and deposited corrections/retractions, or discovering DataCite datasets/software and their publication relationships.",
    "sources": [
      "OpenAlex",
      "arXiv",
      "Crossref",
      "DataCite"
    ],
    "termsUrl": "https://docs.openalex.org/additional-help/terms",
    "requiresNcbi": false,
    "group": "featured",
    "tools": [
      {
        "id": "openalex_search_works",
        "connector": "literature",
        "credentialKeys": [
          "openAlexApiKey"
        ],
        "optionalCredential": {
          "id": "openalex",
          "key": "openAlexApiKey",
          "retryStatus": 429
        },
        "description": "Search OpenAlex scholarly works (all disciplines, ~250M records) with year/type/OA/venue filters. Args: query (free-text over title+abstract+fulltext; optional if a filter is set), year_from, year_to (inclusive years), work_type (article/review/preprint/book-chapter/dataset/dissertation), open_access_only, venue (S-id, openalex.org URL, ISSN, or a plain name resolved to the top sources hit — surfaced in venue_resolved; pass an exact ID to skip resolution), sort (relevance default / cited_by_count / publication_date), max_records (default 50, hard ceiling 500; pages of 200), include_abstracts (reconstructed from the inverted index, but ONLY for verified-open licenses — cc-by/cc-by-sa/cc0/public-domain; others get abstract=null + abstract_policy note + abstract_license; adds bulk). Returns {query, filters, sort, api_total, n_records_returned, records_truncated, records}; each record is the lean work shape (openalex_id, doi, pmid, title, publication_year/date, type, language, is_retracted, authors[...], source{...}, biblio, cited_by_count, fwci, referenced_works_count, open_access{...}, best_oa_pdf_url, primary_topic, keywords).",
        "input": {
          "type": "object",
          "properties": {
            "query": {
              "type": "string"
            },
            "year_from": {
              "type": "integer"
            },
            "year_to": {
              "type": "integer"
            },
            "work_type": {
              "type": "string"
            },
            "open_access_only": {
              "type": "boolean"
            },
            "venue": {
              "type": "string"
            },
            "sort": {
              "type": "string",
              "enum": [
                "relevance",
                "cited_by_count",
                "publication_date"
              ],
              "default": "relevance"
            },
            "max_records": {
              "type": "integer",
              "default": 50
            },
            "include_abstracts": {
              "type": "boolean",
              "default": false
            }
          }
        },
        "returns": "{query, filters (applied filter object), venue_resolved? , sort, api_total (meta.count), n_records_returned, records_truncated (api_total > returned), records[]} — each record the lean work shape.",
        "exampleArgs": {
          "query": "CRISPR base editing",
          "year_from": 2020,
          "open_access_only": true,
          "sort": "cited_by_count",
          "max_records": 25
        }
      },
      {
        "id": "openalex_get_work",
        "connector": "literature",
        "credentialKeys": [
          "openAlexApiKey"
        ],
        "optionalCredential": {
          "id": "openalex",
          "key": "openAlexApiKey",
          "retryStatus": 429
        },
        "description": "Fetch one OpenAlex work in full — metadata, abstract (reconstructed from the inverted index, license-gated as in openalex_search_works), OA locations, referenced_works (outgoing W-ids — hydrate with openalex_references) and counts_by_year. Args: work_id (W-id, openalex.org URL, bare DOI, or doi.org URL). DOI lookups resolve via the claimant filter; when several works share one DOI the most-cited is selected and doi_claimants + doi_resolution_note are included. Raises not-found for unknown IDs/DOIs.",
        "input": {
          "type": "object",
          "properties": {
            "work_id": {
              "type": "string"
            }
          },
          "required": [
            "work_id"
          ]
        },
        "required": [
          "work_id"
        ],
        "returns": "The lean work shape plus {abstract, abstract_license?, abstract_policy?, referenced_works (W-ids), counts_by_year, doi_claimants?, doi_resolution_note?}.",
        "exampleArgs": {
          "work_id": "W2741809807"
        }
      },
      {
        "id": "openalex_citations",
        "connector": "literature",
        "credentialKeys": [
          "openAlexApiKey"
        ],
        "optionalCredential": {
          "id": "openalex",
          "key": "openAlexApiKey",
          "retryStatus": 429
        },
        "description": "List works that CITE a given work (incoming citations) via OpenAlex's citation graph. Args: work_id (W-id/URL/DOI — DOIs cost one extra resolution request), sort (cited_by_count default / publication_date / relevance), max_records (default 50, ceiling 500), include_abstracts. Returns {work_id, api_total (the true citing-work count), n_records_returned, records_truncated, records} (lean work records).",
        "input": {
          "type": "object",
          "properties": {
            "work_id": {
              "type": "string"
            },
            "sort": {
              "type": "string",
              "enum": [
                "cited_by_count",
                "publication_date",
                "relevance"
              ],
              "default": "cited_by_count"
            },
            "max_records": {
              "type": "integer",
              "default": 50
            },
            "include_abstracts": {
              "type": "boolean",
              "default": false
            }
          },
          "required": [
            "work_id"
          ]
        },
        "required": [
          "work_id"
        ],
        "returns": "{work_id (resolved W-id), api_total, n_records_returned, records_truncated, records[], doi_claimants?, doi_resolution_note?}.",
        "exampleArgs": {
          "work_id": "W2741809807",
          "sort": "cited_by_count",
          "max_records": 50
        }
      },
      {
        "id": "openalex_references",
        "connector": "literature",
        "credentialKeys": [
          "openAlexApiKey"
        ],
        "optionalCredential": {
          "id": "openalex",
          "key": "openAlexApiKey",
          "retryStatus": 429
        },
        "description": "List the works a given work CITES (outgoing references), hydrated to full metadata in reference-list order. Args: work_id (W-id/URL/DOI), max_records (default 100, ceiling 500; hydration batched 50/request). Returns {work_id, n_references, n_records_returned, records_truncated, references_not_hydrated (IDs OpenAlex has no record for — never silently dropped), reference_ids (ALL outgoing W-ids), records}.",
        "input": {
          "type": "object",
          "properties": {
            "work_id": {
              "type": "string"
            },
            "max_records": {
              "type": "integer",
              "default": 100
            }
          },
          "required": [
            "work_id"
          ]
        },
        "required": [
          "work_id"
        ],
        "returns": "{work_id, n_references, n_records_returned, records_truncated, references_not_hydrated[], reference_ids[] (all outgoing W-ids, order preserved), records[]}.",
        "exampleArgs": {
          "work_id": "W2741809807",
          "max_records": 100
        }
      },
      {
        "id": "openalex_search_authors",
        "connector": "literature",
        "credentialKeys": [
          "openAlexApiKey"
        ],
        "optionalCredential": {
          "id": "openalex",
          "key": "openAlexApiKey",
          "retryStatus": 429
        },
        "description": "Search OpenAlex author profiles by name. Args: query (matches display name + alternatives; expect homonyms — check affiliations/topics/ORCID), max_records (default 25, ceiling 500). Returns {query, api_total, n_records_returned, records_truncated, records}; each record {author_id, name, orcid, works_count, cited_by_count, h_index, i10_index, affiliations[{institution, years}], last_known_institutions, top_topics}. Use author_id with openalex_get_author.",
        "input": {
          "type": "object",
          "properties": {
            "query": {
              "type": "string"
            },
            "max_records": {
              "type": "integer",
              "default": 25
            }
          },
          "required": [
            "query"
          ]
        },
        "required": [
          "query"
        ],
        "returns": "{query, api_total, n_records_returned, records_truncated, records[]} — each record the lean author shape.",
        "exampleArgs": {
          "query": "Jennifer Doudna",
          "max_records": 25
        }
      },
      {
        "id": "openalex_get_author",
        "connector": "literature",
        "credentialKeys": [
          "openAlexApiKey"
        ],
        "optionalCredential": {
          "id": "openalex",
          "key": "openAlexApiKey",
          "retryStatus": 429
        },
        "description": "Fetch one OpenAlex author profile plus their top-cited works. Args: author_id (A-id, openalex.org URL, or ORCID; CAVEAT: OpenAlex's ORCID pointer can resolve to a sparse duplicate — prefer the A-id from openalex_search_authors), works_sample (default 10, max 200; 0 skips the extra request). Returns the author record plus counts_by_year, top_works_total (true total works count) and top_works (lean work records by citations).",
        "input": {
          "type": "object",
          "properties": {
            "author_id": {
              "type": "string"
            },
            "works_sample": {
              "type": "integer",
              "default": 10
            }
          },
          "required": [
            "author_id"
          ]
        },
        "required": [
          "author_id"
        ],
        "returns": "The lean author shape plus {counts_by_year, top_works_total, top_works[] (lean work records by citations)}.",
        "exampleArgs": {
          "author_id": "A5023888391",
          "works_sample": 10
        }
      },
      {
        "id": "openalex_venue_info",
        "connector": "literature",
        "credentialKeys": [
          "openAlexApiKey"
        ],
        "optionalCredential": {
          "id": "openalex",
          "key": "openAlexApiKey",
          "retryStatus": 429
        },
        "description": "Look up journals/repositories ('sources') in OpenAlex — OA status, DOAJ listing, APC, citation metrics. Args: venue (exact S-id, openalex.org URL, or ISSN for a single record; anything else is a name search), max_records (default 10, ceiling 500; name-search only). Returns: exact -> one source record + counts_by_year; name search -> {query, api_total, n_records_returned, records_truncated, records}. Source record: {source_id, display_name, type, issn_l, issn, host_organization, country_code, homepage_url, is_oa, is_in_doaj, is_core, apc_usd, works_count, cited_by_count, h_index, two_year_mean_citedness, first/last_publication_year, top_topics}.",
        "input": {
          "type": "object",
          "properties": {
            "venue": {
              "type": "string"
            },
            "max_records": {
              "type": "integer",
              "default": 10
            }
          },
          "required": [
            "venue"
          ]
        },
        "required": [
          "venue"
        ],
        "returns": "Exact id -> the lean source shape plus {counts_by_year}. Name search -> {query, api_total, n_records_returned, records_truncated, records[]}.",
        "exampleArgs": {
          "venue": "Nature",
          "max_records": 10
        }
      },
      {
        "id": "arxiv_search",
        "connector": "literature",
        "credentialKeys": [],
        "description": "Search arXiv preprints (physics, math, CS, stats, q-bio, ...) via the official Atom API. Args: query (arXiv query string; plain terms search all fields, field prefixes ti:/au:/abs: and booleans AND/OR/ANDNOT work; optional if category or a date range is set), category (arXiv code AND-ed in, e.g. q-bio.GN, cs.LG, stat.ML), date_from / date_to (submission date YYYY-MM-DD, inclusive), start (0-based paging offset; the API paces ~3s between requests — page politely), max_results (default 25, max 100 per call), sort_by (relevance default / submittedDate / lastUpdatedDate), sort_order (descending default / ascending). Returns {search_query (the exact query sent), api_total (arXiv's total match count), start_index, n_records_returned, records_truncated, sort_by, sort_order, records}; each record {arxiv_id, version, id_versioned, title, abstract, authors, published, updated, primary_category, categories, doi, journal_ref, comment, abs_url, pdf_url}. doi/journal_ref appear only after journal publication. Malformed queries raise an error (arXiv's HTTP-200 error feed is detected, never returned as data).",
        "input": {
          "type": "object",
          "properties": {
            "query": {
              "type": "string"
            },
            "category": {
              "type": "string"
            },
            "date_from": {
              "type": "string"
            },
            "date_to": {
              "type": "string"
            },
            "start": {
              "type": "integer",
              "default": 0
            },
            "max_results": {
              "type": "integer",
              "default": 25
            },
            "sort_by": {
              "type": "string",
              "enum": [
                "relevance",
                "submittedDate",
                "lastUpdatedDate"
              ],
              "default": "relevance"
            },
            "sort_order": {
              "type": "string",
              "enum": [
                "descending",
                "ascending"
              ],
              "default": "descending"
            }
          },
          "required": []
        },
        "required": [],
        "returns": "`{ search_query, api_total, start_index, n_records_returned, records_truncated, sort_by, sort_order, records: [ { arxiv_id, version, id_versioned, title, abstract, authors, published, updated, primary_category, categories, doi, journal_ref, comment, abs_url, pdf_url } ] }` — `records_truncated` flags more matches beyond this page; `records` is `[]` when nothing matches.",
        "exampleArgs": {
          "query": "ti:transformer",
          "category": "cs.LG",
          "max_results": 10
        }
      },
      {
        "id": "arxiv_get_papers",
        "connector": "literature",
        "credentialKeys": [],
        "description": "Batch-fetch arXiv paper metadata (incl. abstracts) by ID — one paced request for up to 100 papers. Args: arxiv_ids (up to 100 IDs in any common form — 2103.14030, versioned 2103.14030v2, old-style q-bio/0601001, arXiv:-prefixed, or abs/pdf URLs; unversioned IDs resolve to the latest version). Returns {n_requested, n_found, duplicates (inputs that resolved to an already-returned paper), not_found (unknown AND malformed IDs — arXiv silently skips unknowns and rejects whole batches over malformed ones; this tool does neither), records} — records in requested order, same shape as arxiv_search records. Withdrawn papers still return metadata (check comment for withdrawal notes).",
        "input": {
          "type": "object",
          "properties": {
            "arxiv_ids": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          "required": [
            "arxiv_ids"
          ]
        },
        "required": [
          "arxiv_ids"
        ],
        "returns": "`{ n_requested, n_found, duplicates: [str], not_found: [str], records: [ ...same shape as arxiv_search records ] }` — `records` in requested (deduped) order; `not_found` lists requested ids with no matching record.",
        "exampleArgs": {
          "arxiv_ids": [
            "2103.14030",
            "1706.03762v5"
          ]
        }
      },
      {
        "id": "crossref_get_work",
        "connector": "literature",
        "credentialKeys": [],
        "description": "Retrieve publisher-deposited bibliographic metadata for a Crossref DOI. Accepts a bare DOI, doi: prefix or doi.org URL. No API key required. A DOI registered elsewhere may return HTTP 404; use datacite_get_record for DataCite DOIs.",
        "input": {
          "type": "object",
          "properties": {
            "doi": {
              "type": "string",
              "minLength": 1,
              "maxLength": 2048
            }
          },
          "required": [
            "doi"
          ],
          "additionalProperties": false
        },
        "returns": "{ doi, title:string[], authors:[...], publisher:string|null, type:string|null, published:object|null, container_title:string[], url:string|null, license:[...], source_url }. Optional upstream bibliographic fields are null or empty arrays, not inferred.",
        "exampleArgs": {
          "doi": "10.1038/nature12968"
        }
      },
      {
        "id": "crossref_get_updates",
        "connector": "literature",
        "credentialKeys": [],
        "description": "Check Crossref-deposited corrections, retractions and other update relationships for a DOI. updated_by points to notices updating this work; update_to points to works that this DOI updates. Preserves publisher/Retraction Watch source labels and other relation types. No API key required. An empty result is not evidence that a paper is reliable or has never been retracted.",
        "input": {
          "type": "object",
          "properties": {
            "doi": {
              "type": "string",
              "minLength": 1,
              "maxLength": 2048
            }
          },
          "required": [
            "doi"
          ],
          "additionalProperties": false
        },
        "returns": "{ doi, updated_by:[{DOI,type,source?,label?,updated?,...}], update_to:[{DOI,type,source?,label?,updated?,...}], relation:object, source_url, coverage_note }. Arrays contain only deposited metadata; retain duplicate DOI notices with different sources. Does not assign an inferred retraction status.",
        "exampleArgs": {
          "doi": "10.1038/nature12968"
        }
      },
      {
        "id": "datacite_search_records",
        "connector": "literature",
        "credentialKeys": [],
        "description": "Find public DataCite dataset/software DOI records by query and/or related DOI. query uses DataCite OpenSearch syntax; related_doi searches deposited links to a paper or other DOI; verify the exact identifier and relationship direction in related_identifiers. resource_type defaults to dataset; use software for code. Returns one bounded page (1-100 records, default 20); pass next_page with the same filters and page_size to continue. Page-number retrieval is limited to the first 10,000 records; narrow the query beyond that. Metadata and landing URLs do not guarantee downloadable files or reuse permission.",
        "input": {
          "type": "object",
          "properties": {
            "query": {
              "type": "string",
              "minLength": 1,
              "maxLength": 2000
            },
            "related_doi": {
              "type": "string",
              "minLength": 1,
              "maxLength": 2048
            },
            "resource_type": {
              "type": "string",
              "enum": [
                "dataset",
                "software"
              ],
              "default": "dataset"
            },
            "page_size": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            },
            "page": {
              "type": "integer",
              "minimum": 1,
              "maximum": 10000,
              "default": 1
            }
          },
          "anyOf": [
            {
              "properties": {
                "query": {}
              },
              "required": [
                "query"
              ]
            },
            {
              "properties": {
                "related_doi": {}
              },
              "required": [
                "related_doi"
              ]
            }
          ],
          "additionalProperties": false
        },
        "returns": "{ api_total, n_returned, page, page_size, next_page:number|null, records_truncated, records:[{ doi, titles:[{title,...}], creators:[{name?,...}], publisher:string|object|null, publication_year:number|null, resource_type:{resourceTypeGeneral?,...}, url:string|null, rights:[...], related_identifiers:[{relatedIdentifier?,relatedIdentifierType?,relationType?,...}], version:string|null }], source_url }. records_truncated compares this page to the total, including preceding pages. next_page=null at the end or the 10,000-record window; consult api_total and narrow the query if needed.",
        "exampleArgs": {
          "query": "climate",
          "resource_type": "dataset",
          "page_size": 5
        }
      },
      {
        "id": "datacite_get_record",
        "connector": "literature",
        "credentialKeys": [],
        "description": "Retrieve a public DataCite DOI record, including dataset/software identity, creators, rights, version, landing URL and registered publication/data relationships. Accepts a bare DOI, doi: prefix or doi.org URL. No API key required. Metadata does not guarantee access to files; HTTP 404 may mean the DOI is private, unknown or registered elsewhere.",
        "input": {
          "type": "object",
          "properties": {
            "doi": {
              "type": "string",
              "minLength": 1,
              "maxLength": 2048
            }
          },
          "required": [
            "doi"
          ],
          "additionalProperties": false
        },
        "returns": "{ record:{ doi, titles:[{title,...}], creators:[{name?,...}], publisher:string|object|null, publication_year:number|null, resource_type:{resourceTypeGeneral?,...}, url:string|null, rights:[...], related_identifiers:[{relatedIdentifier?,relatedIdentifierType?,relationType?,...}], version:string|null }, source_url }. Preserves upstream relatedIdentifierType and relationType; absent optional fields are null or empty arrays.",
        "exampleArgs": {
          "doi": "10.14454/qdd3-ps68"
        }
      }
    ]
  },
  {
    "id": "molecule",
    "displayName": "Molecule Viewer",
    "description": "Validate and normalize molecular structures with OpenChemLib.",
    "useWhen": "Use to validate or normalize SMILES and MDL molfiles and compute molecular formula, weight and heavy-atom count with OpenChemLib.",
    "sources": [
      "OpenChemLib"
    ],
    "requiresNcbi": false,
    "group": "featured",
    "tools": [
      {
        "id": "render_molecule",
        "connector": "molecule",
        "credentialKeys": [],
        "description": "Validate and normalize a 2D chemical structure with OpenChemLib. Pass a `smiles` string or a `molfile` (MDL molblock); returns a canonical molfile plus formula, molecular weight and heavy-atom count.",
        "input": {
          "type": "object",
          "properties": {
            "smiles": {
              "type": "string",
              "description": "A SMILES string, e.g. \"CC(=O)Oc1ccccc1C(=O)O\"."
            },
            "molfile": {
              "type": "string",
              "description": "An MDL molfile (V2000/V3000 molblock)."
            },
            "filename": {
              "type": "string",
              "description": "Optional base name for the saved artifact filename, e.g. \"aspirin\"."
            }
          }
        },
        "returns": "`{ \"valid\": bool, \"molfile\": str, \"smiles\": str, \"formula\": str, \"molecular_weight\": float, \"heavy_atom_count\": int, \"filename_suggestion\": str }` on success. On an unparseable structure: `{ \"valid\": false, \"error\": str }`. `molfile` is the canonical MDL molblock; `smiles` is the canonical SMILES; `molecular_weight` is the average (relative) weight; `heavy_atom_count` excludes implicit and explicit hydrogens, including hydrogen isotopes.",
        "exampleArgs": {
          "smiles": "CC(=O)Oc1ccccc1C(=O)O",
          "filename": "aspirin"
        }
      },
      {
        "id": "preview_molecule",
        "connector": "molecule",
        "credentialKeys": [],
        "description": "Validate a 2D chemical structure and open it in the preview panel in one call. Pass a `smiles` or a `molfile`; the structure is saved as a canonical .mol artifact this turn and rendered read-only with OpenChemLib. Returns the saved artifact id. Call it during an assistant turn (the file is attached to the current turn).",
        "input": {
          "type": "object",
          "properties": {
            "smiles": {
              "type": "string",
              "description": "A SMILES string, e.g. \"CC(=O)Oc1ccccc1C(=O)O\"."
            },
            "molfile": {
              "type": "string",
              "description": "An MDL molfile (V2000/V3000 molblock)."
            },
            "filename": {
              "type": "string",
              "description": "Optional base name for the saved artifact filename, e.g. \"aspirin\"."
            }
          }
        },
        "returns": "`{ \"valid\": bool, \"artifact_id\": str, \"version_id\": str, \"version_number\": int, \"filename\": str, \"smiles\": str, \"formula\": str, \"molecular_weight\": float, \"heavy_atom_count\": int }` on success. `artifact_id` identifies the stable Artifact lineage; `version_id` identifies the immutable saved Version. `heavy_atom_count` excludes implicit and explicit hydrogens, including hydrogen isotopes. On an unparseable structure: `{ \"valid\": false, \"error\": str }`. The saved .mol artifact opens automatically in the preview panel.",
        "exampleArgs": {
          "smiles": "CC(=O)Oc1ccccc1C(=O)O",
          "filename": "aspirin"
        },
        "example": "const result = await host.mcp(\"molecule\", \"preview_molecule\", {\"smiles\":\"CC(=O)Oc1ccccc1C(=O)O\",\"filename\":\"aspirin\"})"
      }
    ]
  },
  {
    "id": "pubmed",
    "displayName": "PubMed",
    "aliases": [
      "NCBI literature",
      "PMC",
      "Europe PMC",
      "PubTator 3"
    ],
    "description": "Biomedical literature via NCBI E-utilities, PMC, Europe PMC and PubTator 3 — search, metadata, citation lookup, full text and entity annotations.",
    "useWhen": "Use for PubTator 3 published-article entity annotations and entity/relation search, or to search the biomedical literature and retrieve article metadata (authors, abstract, DOIs, MeSH), find related/similar articles, resolve citations to PMIDs, convert between PMID/PMCID/DOI, fetch open-access full text from PubMed Central, or check copyright/license status.",
    "sources": [
      "PubMed",
      "PMC",
      "Europe PMC",
      "PubTator 3"
    ],
    "termsUrl": "https://www.ncbi.nlm.nih.gov/home/about/policies/",
    "requiresNcbi": true,
    "group": "directory",
    "tools": [
      {
        "id": "get_pubtator_annotations",
        "connector": "pubmed",
        "credentialKeys": [],
        "maxResponseBytes": 2000000,
        "description": "Export PubTator 3 BioC JSON entity and relation annotations for published PubMed articles (title/abstract). Keeps passage text, offsets, normalized IDs and relations. Does not submit raw text.",
        "input": {
          "type": "object",
          "properties": {
            "pmids": {
              "type": "array",
              "minItems": 1,
              "maxItems": 10,
              "uniqueItems": true,
              "items": {
                "type": "string",
                "pattern": "^[1-9][0-9]{0,8}$"
              }
            }
          },
          "required": [
            "pmids"
          ],
          "additionalProperties": false
        },
        "required": [
          "pmids"
        ],
        "exampleArgs": {
          "pmids": [
            "29355051"
          ]
        },
        "returns": "{ source: \"PubTator 3\", source_url, requested_pmids, missing_pmids, PubTator3: [{ id, passages: [{ offset, text, annotations, relations?, ... }], relations?, ... }] }. Missing IDs mean no annotation was returned, not absence of entities. Preserve BioC offsets and cite the original publication; article text retains its original rights."
      },
      {
        "id": "search_pubtator",
        "connector": "pubmed",
        "credentialKeys": [],
        "maxResponseBytes": 2000000,
        "description": "Search one page of PubTator 3 publications by text, entity IDs or relations (e.g. relations:ANY|@CHEMICAL_Doxorubicin|@DISEASE_Neoplasms). Automated relations are research evidence, not clinical conclusions.",
        "input": {
          "type": "object",
          "properties": {
            "query": {
              "type": "string",
              "minLength": 1,
              "maxLength": 1000,
              "pattern": "\\S"
            },
            "page": {
              "type": "integer",
              "minimum": 1,
              "maximum": 10000,
              "default": 1
            }
          },
          "required": [
            "query"
          ],
          "additionalProperties": false
        },
        "required": [
          "query"
        ],
        "exampleArgs": {
          "query": "relations:ANY|@CHEMICAL_Doxorubicin|@DISEASE_Neoplasms",
          "page": 1
        },
        "returns": "{ source: \"PubTator 3\", source_url, results: [{ pmid, title?, text_hl?, citations?, ... }], current, page_size, count, total_pages, next_page, ... }. Server controls page size; fetch subsequent pages explicitly. Publication citations and search evidence are retained."
      },
      {
        "id": "search_articles",
        "connector": "pubmed",
        "credentialKeys": [
          "ncbiEmail",
          "ncbiApiKey"
        ],
        "description": "Search PubMed (biomedical & life-sciences literature via NCBI esearch) for articles matching a query. Returns the total match count plus a page of PMIDs. Supports PubMed field tags ([Title], [Author], [Journal], [MeSH Terms], ...), Boolean operators, date filtering and sort. PubMed does not index physics / CS / math / pure-chemistry papers.",
        "input": {
          "type": "object",
          "properties": {
            "query": {
              "type": "string",
              "description": "PubMed query (keywords, field tags, Boolean)."
            },
            "max_results": {
              "type": "integer",
              "default": 20
            },
            "retstart": {
              "type": "integer",
              "default": 0
            },
            "sort": {
              "type": "string",
              "enum": [
                "relevance",
                "pub_date",
                "author",
                "journal_name",
                "title"
              ]
            },
            "date_from": {
              "type": "string",
              "description": "YYYY, YYYY/MM or YYYY/MM/DD."
            },
            "date_to": {
              "type": "string",
              "description": "YYYY, YYYY/MM or YYYY/MM/DD."
            },
            "datetype": {
              "type": "string",
              "enum": [
                "pdat",
                "edat",
                "mdat"
              ],
              "default": "pdat"
            }
          },
          "required": [
            "query"
          ]
        },
        "required": [
          "query"
        ],
        "returns": "`{ \"pmids\": [str], \"total_count\": int, \"returned_count\": int, \"query\": str, \"query_translation\": str|null, \"has_more\": bool }` — `pmids` is one page (`max_results`, default 20) starting at `retstart`; `total_count` is the full PubMed match count. Feed PMIDs to `get_article_metadata`.",
        "exampleArgs": {
          "query": "CRISPR gene editing",
          "max_results": 10
        }
      },
      {
        "id": "get_article_metadata",
        "connector": "pubmed",
        "credentialKeys": [
          "ncbiEmail",
          "ncbiApiKey"
        ],
        "description": "Retrieve detailed article metadata from PubMed by PMID (bulk, via efetch): identifiers (pmid/pmc/doi), title, abstract, journal, authors with affiliations, publication date, MeSH terms, article types, language and citation. On every use, cite PubMed and include the returned article DOIs (identifiers.doi) as links.",
        "input": {
          "type": "object",
          "properties": {
            "pmids": {
              "type": [
                "string",
                "array"
              ],
              "items": {
                "type": "string"
              },
              "description": "One PubMed ID or a list."
            }
          },
          "required": [
            "pmids"
          ]
        },
        "required": [
          "pmids"
        ],
        "returns": "`{ \"articles\": [ { \"identifiers\": {\"pmid\",\"pmc\"?,\"doi\"?}, \"title\", \"abstract\", \"doi\"?, \"journal\": {\"title\",\"iso_abbreviation\"}, \"authors\": [{\"last_name\"?,\"fore_name\"?,\"initials\"?,\"collective_name\"?,\"affiliations\":[str]}], \"publication_date\": {\"year\"?,\"month\"?,\"day\"?}, \"mesh_terms\": [str], \"article_types\": [str], \"language\", \"citation\": {\"volume\"?,\"issue\"?,\"pages\"?} } ], \"count\": int, \"important_legal_notice\": str }` — one article per requested PMID present in PubMed (input order).",
        "exampleArgs": {
          "pmids": [
            "35486828",
            "33264437"
          ]
        }
      },
      {
        "id": "find_related_articles",
        "connector": "pubmed",
        "credentialKeys": [
          "ncbiEmail",
          "ncbiApiKey"
        ],
        "description": "Find related PubMed content for one or more source PMIDs via NCBI elink. `pubmed_pubmed` (default) returns similar articles ranked by word-weighted similarity of titles/abstracts/MeSH (NOT citations); `pubmed_pmc` returns full-text PMC links; `pubmed_gene`/`pubmed_protein`/`pubmed_nucleotide` return linked sequence/gene records.",
        "input": {
          "type": "object",
          "properties": {
            "pmids": {
              "type": [
                "string",
                "array"
              ],
              "items": {
                "type": "string"
              }
            },
            "link_type": {
              "type": "string",
              "enum": [
                "pubmed_pubmed",
                "pubmed_pmc",
                "pubmed_nucleotide",
                "pubmed_protein",
                "pubmed_gene"
              ],
              "default": "pubmed_pubmed"
            },
            "max_results": {
              "type": "integer",
              "description": "Cap linked ids per linkset."
            }
          },
          "required": [
            "pmids"
          ]
        },
        "required": [
          "pmids"
        ],
        "returns": "`{ \"linksets\": [ { \"dbfrom\": \"pubmed\", \"ids\": [str], \"linksetdbs\": [ { \"dbto\": str, \"linkname\": str, \"links\": [str] } ] } ] }` — one linkset per input PMID; `links` are related ids, relevance-ranked for `pubmed_pubmed`, truncated to `max_results` when given.",
        "exampleArgs": {
          "pmids": [
            "35486828"
          ],
          "link_type": "pubmed_pubmed"
        }
      },
      {
        "id": "lookup_article_by_citation",
        "connector": "pubmed",
        "credentialKeys": [
          "ncbiEmail",
          "ncbiApiKey"
        ],
        "description": "Resolve bibliographic citations to PMIDs via NCBI ecitmatch. Each citation supplies some of {journal, year, volume, first_page, author, key}; provide 2-3+ fields for reliable matching. Use when you have a reference list and need PMIDs.",
        "input": {
          "type": "object",
          "properties": {
            "citations": {
              "type": "array",
              "items": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "journal": {
                    "type": "string"
                  },
                  "year": {
                    "type": "integer"
                  },
                  "volume": {
                    "type": "string"
                  },
                  "first_page": {
                    "type": "string"
                  },
                  "author": {
                    "type": "string"
                  },
                  "key": {
                    "type": "string",
                    "description": "Optional caller-side tracking id."
                  }
                }
              }
            }
          },
          "required": [
            "citations"
          ]
        },
        "required": [
          "citations"
        ],
        "returns": "`{ \"citations\": [ { \"journal\", \"year\", \"volume\", \"first_page\", \"author\", \"pmid\": str|null, \"key\": str, \"status\"?: \"not_found\"|\"ambiguous\"|..., \"detail\"? } ] }` — one entry per input citation (order preserved); `pmid` is set on a unique match, otherwise `status`/`detail` explain why.",
        "exampleArgs": {
          "citations": [
            {
              "journal": "Science",
              "year": 1987,
              "volume": "235",
              "first_page": "182",
              "author": "Palmenberg AC"
            }
          ]
        }
      },
      {
        "id": "convert_article_ids",
        "connector": "pubmed",
        "credentialKeys": [
          "ncbiEmail",
          "ncbiApiKey"
        ],
        "description": "Convert between PMID, PMCID and DOI via the NCBI/PMC ID Converter. Homogeneous input ids per call (set `id_type` to match). Commonly used to check whether a PMID has a PMCID (i.e. full text in PMC) before calling get_full_text_article.",
        "input": {
          "type": "object",
          "properties": {
            "ids": {
              "type": [
                "string",
                "array"
              ],
              "items": {
                "type": "string"
              }
            },
            "id_type": {
              "type": "string",
              "enum": [
                "pmid",
                "pmcid",
                "doi"
              ],
              "default": "pmid"
            }
          },
          "required": [
            "ids"
          ]
        },
        "required": [
          "ids"
        ],
        "returns": "`{ \"status\": \"ok\", \"response-date\": str, \"request\": {...}, \"records\": [ { \"pmcid\": str|null, \"pmid\": str|null, \"doi\": str|null, \"requested-id\": str, \"status\"?: \"error\", \"errmsg\"? } ] }` — one record per input id (order preserved); missing identifiers are explicit null. `status=\"error\"` with \"not found in PMC\" is the normal outcome for a PMID with no PMC deposit.",
        "exampleArgs": {
          "ids": [
            "PMC9046468"
          ],
          "id_type": "pmcid"
        }
      },
      {
        "id": "get_full_text_article",
        "connector": "pubmed",
        "credentialKeys": [
          "ncbiEmail",
          "ncbiApiKey"
        ],
        "description": "Retrieve open-access full text from PubMed Central via Europe PMC by PMC id (\"PMC12345\" or \"12345\"). Returns structured section text plus the license; when full text is unavailable the reason is reported explicitly (fulltext_status). Only OA-subset articles have retrievable full text. On every use, cite PubMed and include the returned article DOIs as links.",
        "input": {
          "type": "object",
          "properties": {
            "pmc_ids": {
              "type": [
                "string",
                "array"
              ],
              "items": {
                "type": "string"
              },
              "description": "One PMC ID or a list (max 20)."
            }
          },
          "required": [
            "pmc_ids"
          ]
        },
        "required": [
          "pmc_ids"
        ],
        "returns": "`{ \"important_legal_notice\": str, \"articles\": [ { \"identifiers\": {\"pmcid\"?,\"pmid\"?,\"doi\"?}, \"title\", \"full_text\": str, \"license\"?, \"doi\"?, \"abstract\"?, \"fulltext_status\"?: str, \"detail\"? } ], \"count\": int }` — `full_text` is the section text joined by blank lines; `fulltext_status` (present when not \"retrieved\") is one of not_open_access / no_pmcid / xml_not_available / not_found / invalid_id.",
        "exampleArgs": {
          "pmc_ids": [
            "PMC9046468"
          ]
        }
      },
      {
        "id": "get_copyright_status",
        "connector": "pubmed",
        "credentialKeys": [
          "ncbiEmail",
          "ncbiApiKey"
        ],
        "description": "Report copyright and license status per PMID by combining PubMed CopyrightInformation, the PMC ID Converter (PMID -> PMCID/DOI), and the PMC <permissions> block (license type, ALI license URL, copyright statement/year). Use to check open-access reuse rights before reproducing content.",
        "input": {
          "type": "object",
          "properties": {
            "pmids": {
              "type": [
                "string",
                "array"
              ],
              "items": {
                "type": "string"
              }
            }
          },
          "required": [
            "pmids"
          ]
        },
        "required": [
          "pmids"
        ],
        "returns": "`{ \"results\": [ { \"pmid\", \"pmc_id\": str|null, \"copyright\": {\"statement\",\"year\",\"holder\"}, \"license\": {\"type\",\"url\",\"is_open_access\"}, \"source\": \"pmc\"|\"pubmed\"|\"not_available\", \"checked_sources\": [str], \"available_at\": {\"pubmed_url\",\"pmc_url\"?,\"doi_url\"?} } ], \"count\": int, \"summary\": {\"total_checked\",\"found_in_pubmed\",\"found_in_pmc\",\"not_found\",\"open_access_count\"} }` — one result per input PMID.",
        "exampleArgs": {
          "pmids": [
            "35891187",
            "34375400"
          ]
        }
      }
    ]
  },
  {
    "id": "genes",
    "displayName": "Genes & Ontologies",
    "aliases": [
      "HGNC",
      "MyGene",
      "mygene.info",
      "UniProt",
      "gene information",
      "gene annotation"
    ],
    "description": "Gene/protein identity, ontology terms and gene-set enrichment — HGNC, mygene.info, UniProt, OLS4 ontologies, GO annotations, Reactome pathways, g:Profiler and Enrichr.",
    "useWhen": "Use for HGNC service/field metadata, official file discovery, exact human gene names and alias/historical-symbol resolution, or to resolve gene symbols/identifiers (mygene.info), discover UniProt proteins by gene name, protein name, organism or reviewed status, fetch UniProt records or sequences by accession, map batches of UniProt identifiers, look up or search ontology terms (EFO, GO, CL, ChEBI, MONDO via OLS4), retrieve GO annotations for a protein (QuickGO), map genes to Reactome pathways, run cross-database GO/pathway enrichment with an explicit organism, background gene set and multiple-testing correction, or query Enrichr libraries for transcription-factor, perturbation, drug, disease, tissue and cell-type enrichment.",
    "sources": [
      "HGNC",
      "MyGene",
      "UniProt",
      "OLS",
      "QuickGO",
      "Reactome",
      "g:Profiler",
      "Enrichr"
    ],
    "termsUrl": "https://www.uniprot.org/help/license",
    "requiresNcbi": false,
    "group": "featured",
    "tools": [
      {
        "id": "query_genes",
        "connector": "genes",
        "credentialKeys": [],
        "description": "Resolve gene identifiers/symbols via mygene.info (batched, up to 1000 terms/request). Use this to map gene symbols to Ensembl gene IDs, Entrez IDs, names, and any other mygene.info field — or the reverse (set `scopes` to the namespace of your input terms, e.g. \"entrezgene\", \"ensembl.gene\", \"symbol,alias\"). Args: terms (query terms, e.g. [\"TP53\",\"BRCA1\"]; terms containing commas are not supported); scopes (comma-separated identifier namespaces to match terms against); fields (comma-separated mygene fields to return, or \"all\"); species (common name \"human\"/\"mouse\" or NCBI taxid). Returns {n_input, n_records, not_found, records}. A term matching several genes yields several records (each carries its `query`). Records are deterministically ordered (input order, then _id).",
        "input": {
          "type": "object",
          "properties": {
            "terms": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "scopes": {
              "type": "string"
            },
            "fields": {
              "type": "string",
              "default": "symbol,name,taxid,entrezgene,ensembl.gene"
            },
            "species": {
              "type": "string"
            }
          },
          "required": [
            "terms"
          ]
        },
        "required": [
          "terms"
        ],
        "returns": "{n_input, n_records, not_found:[terms with no match], records:[mygene hit objects, each with `query`, `_id` and the requested fields]} — records ordered by input position of `query`, then `_id`.",
        "exampleArgs": {
          "terms": [
            "TP53",
            "BRCA1"
          ],
          "scopes": "symbol,alias",
          "fields": "symbol,name,entrezgene,ensembl.gene",
          "species": "human"
        }
      },
      {
        "id": "list_ontologies",
        "connector": "genes",
        "credentialKeys": [],
        "description": "List ontologies in the EBI Ontology Lookup Service (OLS4). With `ontology_ids` (e.g. [\"efo\",\"cl\",\"chebi\",\"go\",\"mondo\"]): fetch structured metadata records for just those ontologies; unknown IDs are reported in `not_found`. Without: the complete OLS4 catalogue (~250 ontologies, paginated fully and count-verified). Returns: {records:[{ontology_id, title, version, status, num_terms, ...}], not_found:[...]} for an ID list, or {records:[...], total_elements, complete} for the full catalogue.",
        "input": {
          "type": "object",
          "properties": {
            "ontology_ids": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          }
        },
        "returns": "ID list -> {records:[{ontology_id, title, version, status, num_terms, num_properties, num_individuals, preferred_prefix, description, namespace}], not_found:[...]}; full catalogue -> {records:[...], total_elements, complete}.",
        "exampleArgs": {
          "ontology_ids": [
            "efo",
            "go",
            "mondo"
          ]
        }
      },
      {
        "id": "search_ontology_terms",
        "connector": "genes",
        "credentialKeys": [],
        "description": "Search ontology terms by label/synonym across one or more OLS4 ontologies. Typical uses: find an EFO ID for a disease name (ontologies=[\"efo\"]), Cell Ontology terms for a cell type ([\"cl\"]), ChEBI terms for a chemical ([\"chebi\"]), GO terms by name ([\"go\"]) — or search all ontologies at once. Args: query (term label, synonym, or identifier); ontologies (lowercase IDs to restrict to; None searches every ontology); exact (whole-string match); include_obsolete (default False); max_results (ranked by OLS relevance). Returns {query, total_found, n_returned, truncated, terms:[{curie, iri, label, short_form, ontology, description, type, is_defining_ontology}]}.",
        "input": {
          "type": "object",
          "properties": {
            "query": {
              "type": "string"
            },
            "ontologies": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "exact": {
              "type": "boolean",
              "default": false
            },
            "include_obsolete": {
              "type": "boolean",
              "default": false
            },
            "max_results": {
              "type": "integer",
              "default": 20
            }
          },
          "required": [
            "query"
          ]
        },
        "required": [
          "query"
        ],
        "returns": "{query, total_found (numFound), n_returned, truncated (total_found > n_returned), terms:[{curie, iri, label, short_form, ontology, description, type, is_defining_ontology}]}.",
        "exampleArgs": {
          "query": "asthma",
          "ontologies": [
            "efo"
          ],
          "max_results": 20
        }
      },
      {
        "id": "get_ontology_term",
        "connector": "genes",
        "credentialKeys": [],
        "description": "Fetch one ontology term's details, or its complete related-term set. With `relation=None`: full term record (label, synonyms, description, obsolete flag, direct parents). With a relation: the COMPLETE, fully paginated set of related terms — e.g. relation=\"hierarchicalChildren\" for direct children incl. part_of etc., \"descendants\"/\"hierarchicalDescendants\" for the whole subtree, \"ancestors\"/\"hierarchicalAncestors\", \"parents\", \"children\". Retrieval is count-verified against the API's own total. Args: ontology (lowercase, e.g. \"efo\",\"go\",\"cl\",\"chebi\"); term_id (CURIE \"EFO:0000305\"/\"GO:0006281\" or full IRI); relation (None or one of the listed); include_parents (include direct parent refs when relation is None). Returns: relation=None {curie, iri, label, ontology, short_form, synonyms, description, is_obsolete, has_children, parents}; otherwise {root, relation, total_elements, term_count, terms:[...]}.",
        "input": {
          "type": "object",
          "properties": {
            "ontology": {
              "type": "string"
            },
            "term_id": {
              "type": "string"
            },
            "relation": {
              "type": "string",
              "enum": [
                "parents",
                "children",
                "ancestors",
                "descendants",
                "hierarchicalParents",
                "hierarchicalChildren",
                "hierarchicalAncestors",
                "hierarchicalDescendants"
              ]
            },
            "include_parents": {
              "type": "boolean",
              "default": false
            }
          },
          "required": [
            "ontology",
            "term_id"
          ]
        },
        "required": [
          "ontology",
          "term_id"
        ],
        "returns": "relation=None -> {curie, iri, label, ontology, short_form, synonyms, description, is_obsolete, has_children, parents?}; with a relation -> {root, relation, total_elements, term_count, terms:[{curie, iri, label, short_form, ontology, has_children}]}.",
        "exampleArgs": {
          "ontology": "go",
          "term_id": "GO:0006281",
          "relation": "children"
        }
      },
      {
        "id": "get_go_annotations",
        "connector": "genes",
        "credentialKeys": [],
        "description": "Retrieve GO annotations for a UniProt gene product from QuickGO (complete, count-verified). Args: uniprot_accession (e.g. \"P04637\", prefix optional); aspect (omit for all aspects, or one of biological_process/molecular_function/cellular_component); evidence (None/all, a preset \"experimental_manual\"=manually-assigned experimental evidence, \"automatic_iea\"=electronic/IEA, or an explicit ECO code like \"ECO:0000314\"; three-letter GO evidence codes like IDA/IEA are NOT accepted — QuickGO silently ignores goEvidence, filter must use ECO codes); taxon_id (optional NCBI taxon, e.g. 9606); include_term_names (hydrate each record with GO term name/aspect/obsolete via one batched ontology lookup); max_records (cap on records; full set still retrieved and summarized; `truncated` flags the cap). Returns {gene_product, total_annotations, n_records, complete, truncated, distinct_go_ids (across ALL annotations), records:[{go_id, go_aspect, qualifier, go_evidence, eco_id, reference, assigned_by, date, ...}]}.",
        "input": {
          "type": "object",
          "properties": {
            "uniprot_accession": {
              "type": "string"
            },
            "aspect": {
              "type": "string",
              "enum": [
                "biological_process",
                "molecular_function",
                "cellular_component"
              ],
              "description": "Restrict to one GO aspect; omit for all aspects."
            },
            "evidence": {
              "type": "string",
              "description": "Evidence filter: a preset (\"experimental_manual\" = manually-assigned experimental, \"automatic_iea\" = electronic/IEA) or an explicit ECO code (e.g. \"ECO:0000314\"); omit for all. Three-letter GO codes (IDA/IEA) are not accepted — filter by ECO code."
            },
            "taxon_id": {
              "type": "integer"
            },
            "include_term_names": {
              "type": "boolean",
              "default": false
            },
            "max_records": {
              "type": "integer",
              "default": 200
            }
          },
          "required": [
            "uniprot_accession"
          ]
        },
        "required": [
          "uniprot_accession"
        ],
        "returns": "{gene_product, total_annotations (numberOfHits), n_records, complete (full set retrieved), truncated (records capped), distinct_go_ids:[...], records:[{go_id, go_aspect, qualifier, go_evidence, eco_id, reference, assigned_by, date, taxon_id, symbol, with_from, go_name?, go_obsolete?}]}.",
        "exampleArgs": {
          "uniprot_accession": "P04637",
          "aspect": "molecular_function",
          "evidence": "experimental_manual"
        }
      },
      {
        "id": "search_uniprot_entries",
        "connector": "genes",
        "credentialKeys": [],
        "description": "Discover active UniProtKB protein entries by exact gene name (including synonyms), protein-name phrase and/or exact organism_id (NCBI taxonomy ID, not descendants). At least one of these filters is required; supplied filters are combined with AND. Optional reviewed=true selects Swiss-Prot, false selects TrEMBL; omitting it includes both. No organism or reviewed default. Text uses UniProt tokenized phrase matching, not arbitrary substring matching or raw query syntax; quotes, backslashes, wildcards and control characters are rejected. Returns one bounded page in accession order, not a complete protein set. For the next page, pass next_cursor as cursor with identical filters and page_size. Cursors are opaque, not offsets or durable snapshots; restart if UniProt rejects a stale cursor.",
        "input": {
          "type": "object",
          "properties": {
            "gene": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200,
              "pattern": "^(?=[\\s\\S]*\\S)[^\"\\\\*?\\u0000-\\u001f\\u007f]+$"
            },
            "protein_name": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200,
              "pattern": "^(?=[\\s\\S]*\\S)[^\"\\\\*?\\u0000-\\u001f\\u007f]+$"
            },
            "organism_id": {
              "type": "integer",
              "minimum": 1,
              "maximum": 2147483647
            },
            "reviewed": {
              "type": "boolean"
            },
            "page_size": {
              "type": "integer",
              "minimum": 1,
              "maximum": 500,
              "default": 25
            },
            "cursor": {
              "type": "string",
              "minLength": 1,
              "maxLength": 4096,
              "pattern": "^[^\\s\\u0000-\\u001f\\u007f]+$"
            }
          },
          "anyOf": [
            {
              "properties": {
                "gene": {}
              },
              "required": [
                "gene"
              ]
            },
            {
              "properties": {
                "protein_name": {}
              },
              "required": [
                "protein_name"
              ]
            },
            {
              "properties": {
                "organism_id": {}
              },
              "required": [
                "organism_id"
              ]
            }
          ],
          "additionalProperties": false
        },
        "returns": "{filters:{gene:string|null,protein_name:string|null,organism_id:number|null,reviewed:boolean|null},query,page_size,n_records,total_results:number|null,has_more,next_cursor:string|null,release:string|null,records:[{accession,entry_name:string|null,reviewed:boolean,protein_names:string[],gene_names:string[],organism_id:number|null,organism_name:string|null,length:number|null}]}. total_results and release come from upstream headers, or null if absent; n_records is only this page. protein_names contains top-level recommended, submitted and alternative full names; gene_names includes names, synonyms and locus/ORF names, with duplicates removed. Missing names are empty arrays, not proof that a protein lacks a name/gene. length is amino-acid count; sequences and full annotations are not returned. Pass accession values to get_uniprot_entries for fields, FASTA or full text. No automatic page traversal or local result cache.",
        "exampleArgs": {
          "gene": "TP53",
          "organism_id": 9606,
          "reviewed": true,
          "page_size": 25
        }
      },
      {
        "id": "get_uniprot_entries",
        "connector": "genes",
        "credentialKeys": [],
        "description": "Fetch UniProtKB records for a list of primary or secondary accessions (batched OR-queries first; unresolved aliases use a direct per-accession fallback). Three modes: `fields` given → token-lean tabular retrieval of just those UniProt fields (e.g. [\"accession\",\"id\",\"protein_name\",\"gene_names\",\"organism_name\",\"length\",\"sequence\"]); `format` is ignored. format=\"fasta\" → per-accession FASTA sequences. format=\"txt\" → per-accession full UniProt flat-file text (complete annotation; can be very large — prefer `fields`). Args: accessions (e.g. [\"P04637\",\"P38398\"]); format (\"fasta\"/\"txt\", ignored when `fields` given); fields (optional UniProt REST field names for tabular mode). Returns: fields mode {accessions, fields, n_records, records:[{<column>:value}]}; fasta/txt mode {accessions, format, n_found, missing, records:{accession:text}} — `missing` lists accessions UniProt returned no record for.",
        "input": {
          "type": "object",
          "properties": {
            "accessions": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "format": {
              "type": "string",
              "enum": [
                "fasta",
                "txt"
              ]
            },
            "fields": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          "required": [
            "accessions"
          ]
        },
        "required": [
          "accessions"
        ],
        "returns": "fields mode {accessions, fields, n_records, records:[{<column>:value}]} (columns are the UniProt TSV headers); fasta/txt mode {accessions, format, n_found, missing:[...], records:{accession:text}}.",
        "exampleArgs": {
          "accessions": [
            "P04637",
            "P38398"
          ],
          "fields": [
            "accession",
            "id",
            "protein_name",
            "gene_names",
            "organism_name",
            "length"
          ]
        }
      },
      {
        "id": "submit_uniprot_id_mapping",
        "connector": "genes",
        "credentialKeys": [],
        "description": "Submit up to 100,000 identifiers for UniProt batch ID mapping. from_db/to_db are exact UniProt API database names (e.g. Gene_Name, GeneID, Ensembl, RefSeq_Protein, UniProtKB_AC-ID -> UniProtKB; UniProtKB_AC-ID -> Ensembl or GeneID). Valid pairs are defined by https://rest.uniprot.org/configure/idmapping/fields; unsupported pairs fail upstream. taxon_id is optional only for Gene_Name; specify it to disambiguate species. IDs must be individual strings without whitespace or separators; case and versions are preserved, exact duplicates submitted once. Pass accessions from search_uniprot_entries as ids with from_db=UniProtKB_AC-ID. Sends one POST, never automatically retries or polls. Save job_id, then use get_uniprot_id_mapping_status and get_uniprot_id_mapping_results. UniProt expires results after up to 7 days; cancellation or app shutdown stops local requests, not the remote job. No local job cache or remote cancellation/deletion API is provided. If submission loses its response, a job may exist; do not blindly resubmit.",
        "input": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "from_db": {
              "type": "string",
              "minLength": 1,
              "maxLength": 100,
              "pattern": "^[A-Za-z][A-Za-z0-9_-]*$"
            },
            "to_db": {
              "type": "string",
              "minLength": 1,
              "maxLength": 100,
              "pattern": "^[A-Za-z][A-Za-z0-9_-]*$"
            },
            "ids": {
              "type": "array",
              "minItems": 1,
              "maxItems": 100000,
              "items": {
                "type": "string",
                "minLength": 1,
                "maxLength": 200,
                "pattern": "^[^,;\\s\\u0000-\\u001f\\u007f]+$"
              }
            },
            "taxon_id": {
              "type": "integer",
              "minimum": 1,
              "maximum": 2147483647
            }
          },
          "required": [
            "from_db",
            "to_db",
            "ids"
          ],
          "if": {
            "properties": {
              "taxon_id": {}
            },
            "required": [
              "taxon_id"
            ]
          },
          "then": {
            "properties": {
              "from_db": {
                "const": "Gene_Name"
              }
            }
          }
        },
        "required": [
          "from_db",
          "to_db",
          "ids"
        ],
        "returns": "{job_id,from_db,to_db,taxon_id:number|null,n_input,n_submitted,n_duplicates_removed}. Submission is not completion; retain the exact job_id to resume after a restart.",
        "exampleArgs": {
          "from_db": "Gene_Name",
          "to_db": "UniProtKB",
          "ids": [
            "TP53",
            "BRCA1"
          ],
          "taxon_id": 9606
        }
      },
      {
        "id": "get_uniprot_id_mapping_status",
        "connector": "genes",
        "credentialKeys": [],
        "description": "Check an existing UniProt ID mapping job once. NEW/RUNNING means poll this tool later (at least 3 seconds apart); FINISHED means fetch all pages with get_uniprot_id_mapping_results. Upstream ERROR is normalized to FAILED, a terminal job failure, not unmatched IDs. HTTP 400/500 job failures are read without automatic retries; other HTTP failures (including unknown/expired jobs) propagate. Does not submit a new job or automatically poll.",
        "input": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "job_id": {
              "type": "string",
              "minLength": 1,
              "maxLength": 100,
              "pattern": "^[A-Za-z0-9_-]+$"
            }
          },
          "required": [
            "job_id"
          ]
        },
        "required": [
          "job_id"
        ],
        "returns": "{job_id,status:\"NEW\"|\"RUNNING\"|\"FINISHED\"|\"FAILED\",ready:boolean,messages:string[]}. Upstream errors are preserved in messages as \"[code] message\"; FAILED may have no details. A completed status response may redirect to a result page; its rows are not returned here. Retrieve results separately to collect mapping pairs and failed_ids.",
        "exampleArgs": {
          "job_id": "ecuuh9h0Md"
        }
      },
      {
        "id": "get_uniprot_id_mapping_results",
        "connector": "genes",
        "credentialKeys": [],
        "description": "Fetch one page of compact UniProt ID mapping pairs for a finished job. Repeat with next_cursor and identical job_id/page_size until has_more=false; cursors are opaque, not offsets or durable snapshots. Every from/to row is retained, including one-to-many mappings. Merge pairs by from across ALL pages before interpreting multiplicity; a source can span pages. Collect the union of failed_ids reported across pages; never infer unmatched IDs from absence on a page. UniProtKB target IDs can be passed to get_uniprot_entries for annotations or sequences.",
        "input": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "job_id": {
              "type": "string",
              "minLength": 1,
              "maxLength": 100,
              "pattern": "^[A-Za-z0-9_-]+$"
            },
            "page_size": {
              "type": "integer",
              "minimum": 1,
              "maximum": 500,
              "default": 100
            },
            "cursor": {
              "type": "string",
              "minLength": 1,
              "maxLength": 4096,
              "pattern": "^[^\\s\\u0000-\\u001f\\u007f]+$"
            }
          },
          "required": [
            "job_id"
          ]
        },
        "required": [
          "job_id"
        ],
        "returns": "{job_id,page_size,n_records,total_results:number|null,has_more,next_cursor:string|null,records:[{from,to}],failed_ids:string[],one_to_many_in_page:[{from,to:string[]}]}. total_results is the upstream count of mapping rows, not matched input IDs; null if absent. failed_ids contains only upstream-reported misses on this page (empty if omitted). one_to_many_in_page lists sources with multiple distinct targets on this page only; an empty list does not establish one-to-one mapping across the job. No automatic traversal or truncation.",
        "exampleArgs": {
          "job_id": "ecuuh9h0Md",
          "page_size": 100
        }
      },
      {
        "id": "map_reactome_pathways",
        "connector": "genes",
        "credentialKeys": [],
        "description": "Map gene symbols or UniProt accessions to Reactome pathways in the requested species, without projecting identifiers to human (AnalysisService token workflow). Args: identifiers (gene symbols if id_type=\"symbol\", UniProt accessions if \"uniprot\"; no duplicates); id_type (\"symbol\"/\"uniprot\"); species (default \"Homo sapiens\"); resource (AnalysisService molecule-resource view \"TOTAL\" default; \"UNIPROT\" restricts to protein-level mappings); include_disease (service default True); compact (True → per-identifier low-level pathways only {stId,name,species} + reactome release version; False → full deterministic result: per-identifier complete pathway sets with entity/reaction statistics (p-values, FDR, found/total) and batch summary incl. identifiers_not_found). Returns: compact {tool, reactome_version, id_type, species, n_input, genes:{identifier:{found, n_lowlevel_pathways, pathways}}}; full adds per-pathway statistics and batch_summary. found/n_found indicate identifier recognition by Reactome, not pathway membership in the requested species; found=true with zero pathways is valid. Compact mode contains only low-level pathways.",
        "input": {
          "type": "object",
          "properties": {
            "identifiers": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "id_type": {
              "type": "string",
              "enum": [
                "symbol",
                "uniprot"
              ]
            },
            "species": {
              "type": "string",
              "default": "Homo sapiens",
              "description": "Supported scientific names (surrounding whitespace is trimmed): Homo sapiens, Bos taurus, Caenorhabditis elegans, Canis familiaris, Danio rerio, Dictyostelium discoideum, Drosophila melanogaster, Gallus gallus, Mus musculus, Mycobacterium tuberculosis, Plasmodium falciparum, Rattus norvegicus, Saccharomyces cerevisiae, Schizosaccharomyces pombe, Sus scrofa, Xenopus tropicalis. Unsupported or empty names are rejected."
            },
            "resource": {
              "type": "string",
              "default": "TOTAL"
            },
            "include_disease": {
              "type": "boolean",
              "default": true
            },
            "compact": {
              "type": "boolean",
              "default": true
            }
          },
          "required": [
            "identifiers",
            "id_type"
          ]
        },
        "required": [
          "identifiers",
          "id_type"
        ],
        "returns": "compact {tool, reactome_version, id_type, species, resource, include_disease, n_input, genes:{identifier:{found, n_lowlevel_pathways, pathways:[{stId,name,species}]}}}; full replaces each pathways[] with full stats {stId,name,species,low_level,in_disease,entities:{total,found,ratio,p_value,fdr},reactions:{total,found,ratio}} and adds batch_summary {n_input, n_found, n_not_found, identifiers_not_found, distinct_lowlevel_pathways, batch_pathways_found}. found and batch_summary.n_found report identifier recognition, not a guarantee of pathways in the requested species; inspect pathway counts separately.",
        "exampleArgs": {
          "identifiers": [
            "TP53",
            "EGFR",
            "BRCA1"
          ],
          "id_type": "symbol"
        }
      },
      {
        "id": "list_enrichment_sources",
        "connector": "genes",
        "credentialKeys": [],
        "description": "List the g:Profiler enrichment sources and their current data versions for one organism. Sources are organism-dependent and include namespaces such as GO:BP, GO:MF, GO:CC, KEGG, Reactome, and WikiPathways when available. g:Profiler stores limited query metadata for service operation; this read-only lookup does not submit a gene list.",
        "input": {
          "type": "object",
          "properties": {
            "organism": {
              "type": "string",
              "minLength": 1,
              "maxLength": 64,
              "pattern": "^[a-z][a-z0-9_]*$"
            }
          },
          "required": [
            "organism"
          ],
          "additionalProperties": false
        },
        "required": [
          "organism"
        ],
        "returns": "{organism, display_name, scientific_name, taxonomy_id, version, gprofiler_version, sources:[{id,name,version}], nonnumeric_namespaces, numeric_namespaces}",
        "exampleArgs": {
          "organism": "hsapiens"
        }
      },
      {
        "id": "enrich_gene_set",
        "connector": "genes",
        "credentialKeys": [],
        "description": "Run g:Profiler g:GOSt enrichment for a gene set across GO, Reactome, KEGG, WikiPathways, and other organism-supported sources. Supports an explicit organism, custom statistical background, under-representation testing, and g:Profiler multiple-testing correction. Unmapped, ambiguous, and duplicate identifiers are returned in metadata instead of being silently discarded.",
        "input": {
          "type": "object",
          "properties": {
            "genes": {
              "type": "array",
              "items": {
                "type": "string",
                "minLength": 1
              },
              "minItems": 1,
              "maxItems": 5000
            },
            "organism": {
              "type": "string",
              "minLength": 1,
              "maxLength": 64,
              "pattern": "^[a-z][a-z0-9_]*$"
            },
            "sources": {
              "type": "array",
              "items": {
                "type": "string",
                "minLength": 1
              },
              "maxItems": 100
            },
            "background_genes": {
              "type": "array",
              "items": {
                "type": "string",
                "minLength": 1
              },
              "minItems": 1,
              "maxItems": 20000
            },
            "domain_scope": {
              "type": "string",
              "enum": [
                "annotated",
                "known",
                "custom",
                "custom_annotated"
              ]
            },
            "correction_method": {
              "type": "string",
              "enum": [
                "g_SCS",
                "bonferroni",
                "fdr"
              ],
              "default": "g_SCS"
            },
            "user_threshold": {
              "type": "number",
              "exclusiveMinimum": 0,
              "maximum": 1
            },
            "all_results": {
              "type": "boolean",
              "default": false
            },
            "ordered": {
              "type": "boolean",
              "default": false
            },
            "measure_underrepresentation": {
              "type": "boolean",
              "default": false
            },
            "no_iea": {
              "type": "boolean",
              "default": false
            },
            "no_evidences": {
              "type": "boolean",
              "default": false
            },
            "numeric_ns": {
              "type": "string",
              "minLength": 1,
              "maxLength": 64
            }
          },
          "required": [
            "genes",
            "organism"
          ],
          "additionalProperties": false
        },
        "required": [
          "genes",
          "organism"
        ],
        "returns": "{tool, organism, n_input, n_mapped (mapped input identifiers), n_unmapped, input_genes, mapped_genes, unmapped_genes, ambiguous_genes, duplicate_genes, background_size (submitted background length), domain_scope, sources (requested source IDs; [] means all available sources), correction_method, n_results, results:[{source,native,name,p_value,significant,intersection_size,term_size,query_size,effective_domain_size,precision,recall,intersections}], meta (actual sources are in meta.query_metadata.sources)}",
        "exampleArgs": {
          "genes": [
            "TP53",
            "EGFR",
            "BRCA1"
          ],
          "organism": "hsapiens",
          "sources": [
            "GO:BP",
            "REAC"
          ],
          "correction_method": "fdr"
        }
      },
      {
        "id": "list_enrichr_libraries",
        "connector": "genes",
        "credentialKeys": [],
        "description": "List the current Enrichr gene-set libraries and their coverage statistics for one supported Enrichr deployment. The human deployment covers human and mouse libraries; other supported organisms use their dedicated deployments. Use this before enrich_gene_set_enrichr to select libraries for transcription-factor, perturbation, drug, disease, tissue, or cell-type analysis.",
        "input": {
          "type": "object",
          "properties": {
            "organism": {
              "type": "string",
              "enum": [
                "human",
                "fly",
                "yeast",
                "worm",
                "fish"
              ],
              "default": "human"
            }
          },
          "additionalProperties": false
        },
        "required": [],
        "returns": "{organism, n_libraries, libraries:[{name,gene_coverage,genes_per_term,num_terms,link,category_id,appyter}]}",
        "exampleArgs": {
          "organism": "human"
        },
        "totalTimeoutMs": 30000
      },
      {
        "id": "enrich_gene_set_enrichr",
        "connector": "genes",
        "credentialKeys": [],
        "description": "Run Enrichr enrichment for gene symbols or identifiers accepted by selected Enrichr libraries. This complements g:Profiler with transcription-factor, perturbation, drug, disease, tissue, and cell-type libraries. A custom background uses the Speedrichr API and is currently supported only for the human deployment. Enrichr does not report unmapped identifiers, so mapping_status is always not_reported_by_enrichr. Gene lists are submitted to the external Enrichr service; uploads are temporary external side effects and are not automatically rolled back if a later library request fails.",
        "input": {
          "type": "object",
          "properties": {
            "genes": {
              "type": "array",
              "items": {
                "type": "string",
                "minLength": 1
              },
              "minItems": 1,
              "maxItems": 5000
            },
            "libraries": {
              "type": "array",
              "items": {
                "type": "string",
                "minLength": 1
              },
              "minItems": 1,
              "maxItems": 10
            },
            "background_genes": {
              "type": "array",
              "items": {
                "type": "string",
                "minLength": 1
              },
              "minItems": 1,
              "maxItems": 20000
            },
            "organism": {
              "type": "string",
              "enum": [
                "human",
                "fly",
                "yeast",
                "worm",
                "fish"
              ],
              "default": "human"
            },
            "description": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200
            },
            "max_results": {
              "type": "integer",
              "minimum": 1,
              "maximum": 500,
              "default": 100
            }
          },
          "required": [
            "genes",
            "libraries"
          ],
          "additionalProperties": false
        },
        "required": [
          "genes",
          "libraries"
        ],
        "returns": "{tool, organism, mapping_status, n_input, n_unique_input, duplicate_genes, background_size, user_list_id, short_id, background_id, libraries:[{name,n_results,n_total_results,truncated,results:[{rank,term,p_value,odds_ratio:number|\"Infinity\"|\"-Infinity\"|\"NaN\"|null,combined_score,overlapping_genes,adjusted_p_value,old_p_value,old_adjusted_p_value}]}]}",
        "exampleArgs": {
          "genes": [
            "TP53",
            "EGFR",
            "BRCA1"
          ],
          "libraries": [
            "ChEA_2022",
            "LINCS_L1000_Chem_Pert_up"
          ]
        },
        "totalTimeoutMs": 120000,
        "maxResponseBytes": 4000000
      },
      {
        "id": "get_hgnc_gene",
        "connector": "genes",
        "credentialKeys": [],
        "description": "Fetch human gene nomenclature by exact HGNC symbol. Retains approved/withdrawn status, names, aliases, cross-references and modification dates.",
        "input": {
          "type": "object",
          "properties": {
            "symbol": {
              "type": "string",
              "minLength": 1,
              "maxLength": 100,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_.@()+-]*$"
            }
          },
          "required": [
            "symbol"
          ],
          "additionalProperties": false
        },
        "required": [
          "symbol"
        ],
        "exampleArgs": {
          "symbol": "BRCA1"
        },
        "maxResponseBytes": 2000000,
        "returns": "{ source: \"HGNC\", source_url, responseHeader, response: { numFound, docs: [{ hgnc_id, symbol, name, status, alias_symbol?, prev_symbol?, date_modified?, ... }] }. Exact lookup, no pagination; empty docs means no match. Cite HGNC and retain record status."
      },
      {
        "id": "resolve_hgnc_alias",
        "connector": "genes",
        "credentialKeys": [],
        "description": "Resolve an exact human gene alias symbol through HGNC. Returns every matching gene; never silently chooses among ambiguous aliases. Use get_hgnc_gene for approved symbols.",
        "input": {
          "type": "object",
          "properties": {
            "symbol": {
              "type": "string",
              "minLength": 1,
              "maxLength": 100,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_.@()+-]*$"
            }
          },
          "required": [
            "symbol"
          ],
          "additionalProperties": false
        },
        "required": [
          "symbol"
        ],
        "exampleArgs": {
          "symbol": "P53"
        },
        "maxResponseBytes": 2000000,
        "returns": "{ source: \"HGNC\", source_url, responseHeader, response: { numFound, docs: [{ hgnc_id, symbol, name, status, alias_symbol?, prev_symbol?, date_modified?, ... }] }. Exact lookup, no pagination; empty docs means no match. Cite HGNC and retain record status."
      },
      {
        "id": "get_hgnc_service_info",
        "connector": "genes",
        "credentialKeys": [],
        "maxResponseBytes": 2000000,
        "description": "Read official HGNC REST service metadata, searchable fields and stored fields. Shares request admission with the existing HGNC lookups; no key is required.",
        "input": {
          "type": "object",
          "properties": {},
          "required": [],
          "additionalProperties": false
        },
        "exampleArgs": {},
        "returns": "{ source, source_url, retrieved_at, service }. Field lists describe this service, not sample-level gene availability."
      },
      {
        "id": "query_hgnc_field",
        "connector": "genes",
        "credentialKeys": [],
        "maxResponseBytes": 2000000,
        "description": "Fetch or search a documented HGNC field, including historical symbols and external identifiers. Search returns indexed identifiers; fetch returns stored records. Preserve ambiguous matches and approved/withdrawn status instead of silently selecting one gene.",
        "input": {
          "type": "object",
          "properties": {
            "mode": {
              "type": "string",
              "enum": [
                "fetch",
                "search"
              ],
              "default": "fetch"
            },
            "field": {
              "type": "string",
              "enum": [
                "symbol",
                "alias_symbol",
                "prev_symbol",
                "name",
                "hgnc_id",
                "entrez_id",
                "ensembl_gene_id"
              ]
            },
            "value": {
              "type": "string",
              "minLength": 1,
              "maxLength": 300
            },
            "max_rows": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            }
          },
          "required": [
            "field",
            "value"
          ],
          "additionalProperties": false
        },
        "required": [
          "field",
          "value"
        ],
        "exampleArgs": {
          "field": "entrez_id",
          "value": "7157",
          "mode": "fetch"
        },
        "returns": "{ source, source_url, retrieved_at, mode, num_found, records, truncated }. A preview is not the complete match set; zero matches only describes the supplied field/value."
      },
      {
        "id": "list_hgnc_files",
        "connector": "genes",
        "credentialKeys": [],
        "maxResponseBytes": 2000000,
        "description": "List official HGNC public-bucket objects, sizes, identity/checksum metadata and page token. This only discovers download URLs; it does not download files or create local state. ETag is not a SHA256 checksum.",
        "input": {
          "type": "object",
          "properties": {
            "prefix": {
              "type": "string",
              "pattern": "^hgnc/[A-Za-z0-9_./-]*$",
              "maxLength": 200,
              "default": "hgnc/tsv/tsv/"
            },
            "cursor": {
              "type": "string",
              "maxLength": 4096,
              "default": ""
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "exampleArgs": {
          "prefix": "hgnc/tsv/tsv/",
          "limit": 5
        },
        "returns": "{ source, source_url, retrieved_at, files: [{filename,url,bytes,etag,md5_base64,updated}], next_cursor, checksum_note }. A file link or declared upstream checksum is not evidence of a completed or verified download."
      }
    ]
  },
  {
    "id": "pathway-commons",
    "displayName": "Pathway Commons",
    "aliases": [
      "Pathway Commons",
      "PC2",
      "BioPAX pathways",
      "pathway network"
    ],
    "description": "Integrated pathway and molecular interaction network queries via the Pathway Commons PC2 v14 REST API, including Reactome-filtered pathways, gene neighborhoods, paths between gene sets, and BioPAX/GSEA/SIF exports.",
    "useWhen": "Use for Pathway Commons BioPAX discovery and network analysis — search pathways, genes, proteins, and interactions; find top-level pathways; query a gene neighborhood, paths between source genes, directed paths from source to target genes, or common streams; and export pathway subsets as BioPAX, JSON-LD, GSEA GMT, SIF, TXT, or SBGN. Use datasource filters such as Reactome when a cross-source pathway view is needed; use the Protein Annotation connector for STRING-specific networks.",
    "sources": [
      "Pathway Commons",
      "Reactome"
    ],
    "termsUrl": "https://www.pathwaycommons.org/pc2/",
    "requiresNcbi": false,
    "group": "featured",
    "tools": [
      {
        "id": "pathway_commons_search",
        "connector": "pathway-commons",
        "credentialKeys": [],
        "description": "Search the Pathway Commons BioPAX model by gene/protein/pathway keyword or Lucene query. Results include BioPAX class, URI, source databases, organism, and pathway metadata. Use the returned URI as input to graph or export queries.",
        "input": {
          "type": "object",
          "properties": {
            "q": {
              "type": "string",
              "minLength": 1,
              "maxLength": 512
            },
            "type": {
              "type": "string",
              "minLength": 1,
              "maxLength": 64
            },
            "organism": {
              "type": "array",
              "items": {
                "type": "string",
                "minLength": 1
              },
              "maxItems": 20
            },
            "datasource": {
              "type": "array",
              "items": {
                "type": "string",
                "minLength": 1
              },
              "maxItems": 20
            },
            "page": {
              "type": "integer",
              "minimum": 0,
              "maximum": 10000,
              "default": 0
            }
          },
          "required": [
            "q"
          ],
          "additionalProperties": false
        },
        "required": [
          "q"
        ],
        "returns": "{tool, query, page, total_hits, page_size, results:[{uri,biopax_class,name,data_sources,organisms,pathways,excerpt,n_participants,n_processes}]}",
        "exampleArgs": {
          "q": "TP53",
          "type": "ProteinReference",
          "organism": [
            "9606"
          ]
        }
      },
      {
        "id": "pathway_commons_top_pathways",
        "connector": "pathway-commons",
        "credentialKeys": [],
        "description": "Find top-level pathways in Pathway Commons matching a keyword or Lucene query, optionally restricted to a species or source such as Reactome.",
        "input": {
          "type": "object",
          "properties": {
            "q": {
              "type": "string",
              "minLength": 1,
              "maxLength": 512
            },
            "organism": {
              "type": "array",
              "items": {
                "type": "string",
                "minLength": 1
              },
              "maxItems": 20
            },
            "datasource": {
              "type": "array",
              "items": {
                "type": "string",
                "minLength": 1
              },
              "maxItems": 20
            }
          },
          "required": [
            "q"
          ],
          "additionalProperties": false
        },
        "required": [
          "q"
        ],
        "returns": "{tool, query, total_hits, results:[{uri,name,data_sources,organisms,n_participants,n_processes}]}",
        "exampleArgs": {
          "q": "insulin",
          "datasource": [
            "reactome"
          ],
          "organism": [
            "9606"
          ]
        }
      },
      {
        "id": "pathway_commons_graph",
        "connector": "pathway-commons",
        "credentialKeys": [],
        "description": "Run a Pathway Commons BioPAX graph query for a gene neighborhood, paths between gene sets, directed paths from sources to targets, or a common upstream/downstream stream. SIF results are normalized as interaction records, TXT results include edge and node records, and GSEA/BioPAX/SBGN exports remain available as text.",
        "input": {
          "type": "object",
          "properties": {
            "source": {
              "type": "array",
              "items": {
                "type": "string",
                "minLength": 1
              },
              "minItems": 1,
              "maxItems": 100
            },
            "target": {
              "type": "array",
              "items": {
                "type": "string",
                "minLength": 1
              },
              "minItems": 1,
              "maxItems": 100
            },
            "kind": {
              "type": "string",
              "enum": [
                "NEIGHBORHOOD",
                "PATHSBETWEEN",
                "PATHSFROMTO",
                "COMMONSTREAM"
              ],
              "default": "NEIGHBORHOOD"
            },
            "format": {
              "type": "string",
              "enum": [
                "BIOPAX",
                "SIF",
                "TXT",
                "GSEA",
                "SBGN",
                "JSONLD"
              ],
              "default": "SIF"
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 10,
              "default": 1
            },
            "direction": {
              "type": "string",
              "enum": [
                "UPSTREAM",
                "DOWNSTREAM",
                "BOTHSTREAM",
                "UNDIRECTED"
              ]
            },
            "limit_type": {
              "type": "string",
              "enum": [
                "NORMAL",
                "SHORTEST_PLUS_K"
              ],
              "default": "NORMAL"
            },
            "pattern": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "CONTROLS_STATE_CHANGE_OF",
                  "CONTROLS_TRANSPORT_OF",
                  "CONTROLS_PHOSPHORYLATION_OF",
                  "CONTROLS_EXPRESSION_OF",
                  "CATALYSIS_PRECEDES",
                  "IN_COMPLEX_WITH",
                  "INTERACTS_WITH",
                  "NEIGHBOR_OF",
                  "CONSUMPTION_CONTROLLED_BY",
                  "CONTROLS_PRODUCTION_OF",
                  "CONTROLS_TRANSPORT_OF_CHEMICAL",
                  "CHEMICAL_AFFECTS",
                  "REACTS_WITH",
                  "USED_TO_PRODUCE"
                ]
              },
              "maxItems": 14
            },
            "organism": {
              "type": "array",
              "items": {
                "type": "string",
                "minLength": 1
              },
              "maxItems": 20
            },
            "datasource": {
              "type": "array",
              "items": {
                "type": "string",
                "minLength": 1
              },
              "maxItems": 20
            },
            "subpathways": {
              "type": "boolean",
              "default": false
            }
          },
          "required": [
            "source"
          ],
          "additionalProperties": false
        },
        "required": [
          "source"
        ],
        "totalTimeoutMs": 45000,
        "maxResponseBytes": 4000000,
        "returns": "{tool,kind,format,source,target?,n_records?,records?,n_nodes?,nodes?,n_gene_sets?,content?}; format SIF/TXT returns normalized records, TXT also returns node attributes, and GSEA/BIOPAX/SBGN returns export content.",
        "exampleArgs": {
          "kind": "NEIGHBORHOOD",
          "source": [
            "TP53"
          ],
          "format": "SIF",
          "pattern": [
            "INTERACTS_WITH"
          ]
        }
      },
      {
        "id": "pathway_commons_export",
        "connector": "pathway-commons",
        "credentialKeys": [],
        "description": "Fetch a BioPAX sub-model for one or more Pathway Commons IDs/URIs and export it as BioPAX, GSEA GMT, JSON-LD, SIF, TXT, or SBGN. Use a URI returned by search/top_pathways for precise pathway export.",
        "input": {
          "type": "object",
          "properties": {
            "uri": {
              "type": "array",
              "items": {
                "type": "string",
                "minLength": 1
              },
              "minItems": 1,
              "maxItems": 100
            },
            "format": {
              "type": "string",
              "enum": [
                "BIOPAX",
                "SIF",
                "TXT",
                "GSEA",
                "SBGN",
                "JSONLD"
              ],
              "default": "BIOPAX"
            },
            "pattern": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "CONTROLS_STATE_CHANGE_OF",
                  "CONTROLS_TRANSPORT_OF",
                  "CONTROLS_PHOSPHORYLATION_OF",
                  "CONTROLS_EXPRESSION_OF",
                  "CATALYSIS_PRECEDES",
                  "IN_COMPLEX_WITH",
                  "INTERACTS_WITH",
                  "NEIGHBOR_OF",
                  "CONSUMPTION_CONTROLLED_BY",
                  "CONTROLS_PRODUCTION_OF",
                  "CONTROLS_TRANSPORT_OF_CHEMICAL",
                  "CHEMICAL_AFFECTS",
                  "REACTS_WITH",
                  "USED_TO_PRODUCE"
                ]
              },
              "maxItems": 14
            },
            "subpathways": {
              "type": "boolean",
              "default": false
            }
          },
          "required": [
            "uri"
          ],
          "additionalProperties": false
        },
        "required": [
          "uri"
        ],
        "totalTimeoutMs": 45000,
        "maxResponseBytes": 4000000,
        "returns": "{tool,format,uri,n_records?,records?,n_nodes?,nodes?,n_gene_sets?,content?}; TXT includes edge and node records, and GSEA content is a GMT export string.",
        "exampleArgs": {
          "uri": [
            "R-HSA-201451"
          ],
          "format": "GSEA"
        }
      }
    ]
  },
  {
    "id": "genomes",
    "displayName": "Genomes",
    "description": "Genome annotation, taxon and assembly identity, sequence aliases, variants, homology, sequence, similarity search, multiple sequence alignment and browser tracks — NCBI Datasets/BLAST, EMBL-EBI Clustal Omega, Ensembl REST and the UCSC Genome Browser.",
    "useWhen": "Use when you need to resolve species or taxon names, validate a versioned NCBI genome assembly and sequence aliases, identify an unknown nucleotide or protein sequence with an asynchronous NCBI BLAST search, align three or more uniquely named FASTA protein/DNA/RNA records with EMBL-EBI Clustal Omega and retrieve a downloadable alignment file, retrieve Ensembl gene/transcript annotation, cross-references, VEP variant consequences, orthologues/paralogues, sequence, or region overlaps — or UCSC Genome Browser tracks, track data, conservation scores, TFBS clusters and chromosome sizes.",
    "sources": [
      "NCBI Datasets",
      "NCBI BLAST",
      "EMBL-EBI Job Dispatcher",
      "Ensembl",
      "UCSC"
    ],
    "termsUrl": "https://www.ensembl.org/info/about/legal/disclaimer.html",
    "requiresNcbi": false,
    "group": "featured",
    "tools": [
      {
        "id": "blast_submit",
        "connector": "genomes",
        "credentialKeys": [
          "ncbiEmail",
          "ncbiApiKey"
        ],
        "description": "Submit one nucleotide or protein sequence to the public NCBI BLAST service for asynchronous similarity search. Set molecule_type explicitly because a protein made only of A/C/G/T is otherwise ambiguous. Returns a RID and the server estimate; call blast_status no more often than once per minute, then blast_results after READY. The sequence is sent to NCBI and is not cached locally; a lost submit response raises blast_submission_unknown and must not be retried automatically. Space all BLAST requests by at least 10 seconds and all requests for the same RID by at least 60 seconds. Keep the RID to resume after restart. NCBI generally retains results for 36 hours; this is not a deletion guarantee. Cancellation, app exit and uninstall stop local requests only; this API has no documented remote cancel/delete operation. No job registry or result cache is added; normal conversation/notebook persistence may retain inputs and outputs.",
        "input": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "sequence": {
              "type": "string",
              "minLength": 1,
              "maxLength": 100000
            },
            "molecule_type": {
              "type": "string",
              "enum": [
                "nucleotide",
                "protein"
              ]
            },
            "database": {
              "type": "string",
              "enum": [
                "nt",
                "core_nt",
                "refseq_rna",
                "nr",
                "refseq_protein",
                "swissprot"
              ],
              "description": "Requested database, not a guarantee of the effective search database. NCBI may automatically switch nt to core_nt; inspect the completed report for the database actually searched."
            },
            "evalue": {
              "type": "number",
              "exclusiveMinimum": 0,
              "maximum": 1000
            },
            "hitlist_size": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100
            },
            "megablast": {
              "type": "boolean"
            }
          },
          "required": [
            "sequence",
            "molecule_type"
          ]
        },
        "required": [
          "sequence",
          "molecule_type"
        ],
        "returns": "{rid, rtoe_seconds, poll_after_seconds, program, requested_database, molecule_type, sequence_length} — requested_database is the submitted value; NCBI may switch nt to core_nt. The completed report identifies the actual database. Keep rid and wait at least 60 seconds before checking status. Throws blast_submission_unknown if dispatch may have succeeded without a usable receipt.",
        "exampleArgs": {
          "sequence": "ATGCGTACGTAGCTAG",
          "molecule_type": "nucleotide",
          "database": "nt"
        },
        "totalTimeoutMs": 35000,
        "maxResponseBytes": 262144
      },
      {
        "id": "blast_status",
        "connector": "genomes",
        "credentialKeys": [
          "ncbiEmail",
          "ncbiApiKey"
        ],
        "description": "Check one NCBI BLAST RID once. This is a single SearchInfo request and never polls or waits; respect NCBI guidance to wait at least 60 seconds between checks. Returns WAITING, READY, FAILED, or UNKNOWN (unknown or expired RID). Space all BLAST requests by at least 10 seconds and same-RID requests, including results retrieval, by at least 60 seconds.",
        "input": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "rid": {
              "type": "string",
              "minLength": 1,
              "maxLength": 128
            }
          },
          "required": [
            "rid"
          ]
        },
        "required": [
          "rid"
        ],
        "returns": "{rid, status, ready, retry_after_seconds?}",
        "exampleArgs": {
          "rid": "AYEFB4DT014"
        },
        "totalTimeoutMs": 30000,
        "maxResponseBytes": 262144
      },
      {
        "id": "blast_results",
        "connector": "genomes",
        "credentialKeys": [
          "ncbiEmail",
          "ncbiApiKey"
        ],
        "description": "Fetch bounded results for an NCBI BLAST RID. It makes one request and returns ready=false when the job is still waiting; choose json2, xml2, text, or tabular output after blast_status reports READY. Results are capped at 2 MiB and returned verbatim. tabular means NCBI Text + ALIGNMENT_VIEW=Tabular, which may include HTML comments, PRE tags and report headers; it is not pure TSV or CSV. Wait at least 60 seconds after the last request for this RID, including blast_status. No automatic retries.",
        "input": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "rid": {
              "type": "string",
              "minLength": 1,
              "maxLength": 128
            },
            "format": {
              "type": "string",
              "enum": [
                "json2",
                "xml2",
                "text",
                "tabular"
              ]
            }
          },
          "required": [
            "rid"
          ]
        },
        "required": [
          "rid"
        ],
        "returns": "{rid, status, ready, format, results?} — results is a bounded verbatim string; tabular is an NCBI text report, not pure TSV/CSV.",
        "exampleArgs": {
          "rid": "AYEFB4DT014",
          "format": "json2"
        },
        "totalTimeoutMs": 30000,
        "maxResponseBytes": 2097152
      },
      {
        "id": "clustalo_submit",
        "connector": "genomes",
        "credentialKeys": [
          "ncbiEmail",
          "ncbiApiKey"
        ],
        "description": "Submit three or more protein, DNA or RNA sequences to EMBL-EBI Job Dispatcher Clustal Omega for asynchronous multiple sequence alignment. Input must be uniquely named FASTA records; the service accepts at most 4000 sequences or 4 MiB. Returns a job_id; keep it and call clustalo_status before clustalo_results. The connector requests clustal_num by default, a Clustal alignment with position numbers, suitable for inspecting conserved sites and downstream evolutionary analysis. EMBL-EBI requests a valid contact email. Provide a contact email in credentials.ncbiEmail. A lost submit response may represent an accepted remote job; do not resubmit automatically. EMBL-EBI stores results for a limited provider-controlled period (documented as up to one week); this is not an app-owned deletion guarantee. Keep the job_id to resume after restart. This connector adds no job registry, result cache or automatic resubmission, and cancellation/app exit only stop local requests. The sequence is sent to EMBL-EBI. Respect EMBL-EBI fair-use guidance: submit no more than 30 jobs in a batch and wait for processing/results before submitting more; this connector does not enforce cross-call throttling. See https://www.ebi.ac.uk/jdispatcher/docs/webservices/ for the official API contract.",
        "input": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "sequence": {
              "type": "string",
              "minLength": 1,
              "maxLength": 4194304,
              "description": "Three or more uniquely named FASTA records."
            },
            "stype": {
              "type": "string",
              "enum": [
                "protein",
                "dna",
                "rna"
              ]
            },
            "outfmt": {
              "type": "string",
              "enum": [
                "clustal_num"
              ]
            },
            "title": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200
            },
            "dealign": {
              "type": "boolean"
            },
            "order": {
              "type": "string",
              "enum": [
                "aligned",
                "input"
              ]
            }
          },
          "required": [
            "sequence",
            "stype"
          ]
        },
        "required": [
          "sequence",
          "stype"
        ],
        "returns": "{job_id, status:\"QUEUED\", ready:false, sequence_count, sequence_type, requested_format, poll_after_seconds}. Retain job_id to resume after restart; submission is not completion.",
        "exampleArgs": {
          "sequence": ">human\nMKT\n>mouse\nMRT\n>rat\nMRT\n",
          "stype": "protein"
        },
        "totalTimeoutMs": 35000,
        "maxResponseBytes": 262144
      },
      {
        "id": "clustalo_status",
        "connector": "genomes",
        "credentialKeys": [
          "ncbiEmail",
          "ncbiApiKey"
        ],
        "description": "Check one EMBL-EBI Clustal Omega job once. This is a single status request and never polls or waits; call it again after at least 10 seconds until FINISHED, ERROR, FAILURE or NOT_FOUND. Keep the job_id when resuming after a restart.",
        "input": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "job_id": {
              "type": "string",
              "minLength": 1,
              "maxLength": 128
            }
          },
          "required": [
            "job_id"
          ]
        },
        "required": [
          "job_id"
        ],
        "returns": "{job_id,status,ready,retry_after_seconds?}",
        "exampleArgs": {
          "job_id": "clustalo-I20240923-000000-0000-0000000-p1m"
        },
        "totalTimeoutMs": 30000,
        "maxResponseBytes": 262144
      },
      {
        "id": "clustalo_results",
        "connector": "genomes",
        "credentialKeys": [
          "ncbiEmail",
          "ncbiApiKey"
        ],
        "description": "Fetch one bounded Clustal Omega clustal_num alignment file for a FINISHED job. Pass the same outfmt returned by clustalo_submit; this tool makes one result request and returns the alignment content plus a filename suggestion. If the provider still reports QUEUED or RUNNING, it returns ready:false with a retry hint; provider failures are errors and retain the job_id for diagnosis. Results are capped at 8 MiB and are returned verbatim so the caller can save the content as an alignment file for conserved-site inspection or downstream phylogenetic analysis. No automatic retries. EMBL-EBI stores results for a limited provider-controlled period (documented as up to one week); this is not an app-owned deletion guarantee. Keep the job_id to resume after restart. This connector adds no job registry, result cache or automatic resubmission, and cancellation/app exit only stop local requests. The sequence is sent to EMBL-EBI. Respect EMBL-EBI fair-use guidance: submit no more than 30 jobs in a batch and wait for processing/results before submitting more; this connector does not enforce cross-call throttling.",
        "input": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "job_id": {
              "type": "string",
              "minLength": 1,
              "maxLength": 128
            },
            "outfmt": {
              "type": "string",
              "enum": [
                "clustal_num"
              ],
              "description": "Must match the requested_format returned by clustalo_submit."
            }
          },
          "required": [
            "job_id",
            "outfmt"
          ]
        },
        "required": [
          "job_id",
          "outfmt"
        ],
        "returns": "{job_id,status,ready,format,filename?,size_bytes?,alignment?,retry_after_seconds?} — alignment is the verbatim output file content when ready:true.",
        "exampleArgs": {
          "job_id": "clustalo-I20240923-000000-0000-0000000-p1m",
          "outfmt": "clustal_num"
        },
        "totalTimeoutMs": 30000,
        "maxResponseBytes": 8388608
      },
      {
        "id": "ensembl_ld_pairwise",
        "connector": "genomes",
        "credentialKeys": [],
        "description": "Query linkage disequilibrium (r² and D′) between two variant IDs, such as GWAS Catalog rsIDs, in an explicitly selected population. The caller must supply the full population name in population_name (e.g. 1000GENOMES:phase_3:KHV); this tool does not discover populations or infer ancestry. species defaults to homo_sapiens. Returns upstream variant identities and numeric r2/d_prime without significance or causality inference. High LD does not establish causality. Empty results mean no LD data returned, not zero LD; invalid IDs/populations and service failures remain errors. Reference metadata includes the population, known panel, query URL and retrieval time; assembly/release are null because the LD endpoint does not report them.",
        "input": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "variant_id1": {
              "type": "string",
              "minLength": 1,
              "pattern": "\\S"
            },
            "variant_id2": {
              "type": "string",
              "minLength": 1,
              "pattern": "\\S"
            },
            "population_name": {
              "type": "string",
              "minLength": 1,
              "pattern": "\\S"
            },
            "species": {
              "type": "string",
              "minLength": 1,
              "pattern": "\\S",
              "default": "homo_sapiens"
            }
          },
          "required": [
            "variant_id1",
            "variant_id2",
            "population_name"
          ]
        },
        "required": [
          "variant_id1",
          "variant_id2",
          "population_name"
        ],
        "returns": "{variant_id1, variant_id2, species, population_name, reference_data, interpretation, n_pairs, pairs:[{variation1, variation2, population_name, r2, d_prime}]} — r2/d_prime are numbers; n_pairs=0 means unavailable, not zero LD.",
        "exampleArgs": {
          "variant_id1": "rs6792369",
          "variant_id2": "rs1042779",
          "population_name": "1000GENOMES:phase_3:KHV"
        }
      },
      {
        "id": "ensembl_ld_proxies",
        "connector": "genomes",
        "credentialKeys": [],
        "description": "Find nearby variants in LD with a variant ID (e.g. a GWAS rsID) in a required population_name such as 1000GENOMES:phase_3:KHV. species defaults to homo_sapiens. min_r2 defaults to 0.8; min_d_prime defaults to 0; both are inclusive thresholds in [0,1]. window_size is the total width of the centered Ensembl window in kb (integer 1–500, default 500, approximately 250 kb on each side at the default); max_records caps output (integer 1–1000, default 100) and does not limit upstream computation or download size. Results are sorted by r2 descending, then d_prime descending and variant ID, before capping. Coordinates/annotations are upstream attributes. Report the population and reference_data with results. High LD does not establish causality or functional equivalence. Empty results mean no qualifying data returned, not zero LD. Errors remain errors; assembly/release are not reported by this endpoint and remain null. The caller must supply the full population name; this tool does not discover populations or infer ancestry.",
        "input": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "variant_id": {
              "type": "string",
              "minLength": 1,
              "pattern": "\\S"
            },
            "population_name": {
              "type": "string",
              "minLength": 1,
              "pattern": "\\S"
            },
            "species": {
              "type": "string",
              "minLength": 1,
              "pattern": "\\S",
              "default": "homo_sapiens"
            },
            "min_r2": {
              "type": "number",
              "minimum": 0,
              "maximum": 1,
              "default": 0.8
            },
            "min_d_prime": {
              "type": "number",
              "minimum": 0,
              "maximum": 1,
              "default": 0
            },
            "window_size": {
              "type": "integer",
              "minimum": 1,
              "maximum": 500,
              "default": 500
            },
            "max_records": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000,
              "default": 100
            }
          },
          "required": [
            "variant_id",
            "population_name"
          ]
        },
        "required": [
          "variant_id",
          "population_name"
        ],
        "returns": "{variant_id, species, population_name, min_r2, min_d_prime, window_size, reference_data, interpretation, n_proxies, returned, truncated, proxies:[{variation, population_name, r2, d_prime, chr, start, end, strand, consequence_type, clinical_significance}]} — n_proxies counts qualifying non-self rows before the output cap, not all variants in the window; coordinates are 1-based inclusive.",
        "exampleArgs": {
          "variant_id": "rs1042779",
          "population_name": "1000GENOMES:phase_3:KHV",
          "min_r2": 0.8,
          "window_size": 500,
          "max_records": 100
        }
      },
      {
        "id": "ensembl_lookup",
        "connector": "genomes",
        "credentialKeys": [],
        "description": "Look up genes, transcripts, or proteins by stable ID, or genes by symbol. query accepts ENS IDs (versioned allowed), FlyBase/WormBase/yeast IDs, or symbols such as BRAF. query_type: auto (default) tries ID first, then symbol only on explicit absence unless the input is a canonical ENS/LRG ID; id uses only ID lookup; symbol uses only symbol lookup without version normalization. species applies only to symbol lookup (default homo_sapiens) and is not inferred. expand includes transcripts, exons and translations (default false). Invalid requests and service failures raise errors.",
        "input": {
          "type": "object",
          "properties": {
            "query": {
              "type": "string"
            },
            "query_type": {
              "type": "string",
              "enum": [
                "auto",
                "id",
                "symbol"
              ],
              "default": "auto"
            },
            "species": {
              "type": "string",
              "default": "homo_sapiens"
            },
            "expand": {
              "type": "boolean",
              "default": false
            }
          },
          "required": [
            "query"
          ]
        },
        "required": [
          "query"
        ],
        "returns": "{found, query, species, record} — species is the upstream record species on success, otherwise the requested/default species; record is the upstream lookup dict (1-based inclusive coords) or null when nothing matches.",
        "exampleArgs": {
          "query": "BRAF",
          "query_type": "symbol"
        }
      },
      {
        "id": "ensembl_xrefs",
        "connector": "genomes",
        "credentialKeys": [],
        "description": "External cross-references of an Ensembl stable ID — the bridge from Ensembl gene/transcript IDs to HGNC, NCBI (EntrezGene), UniProt, OMIM, RefSeq, Expression Atlas and others. Args: stable_id (ENSG.../ENST..., versioned accepted); external_db (optional exact upstream database-name filter, e.g. HGNC, EntrezGene, Uniprot_gn, MIM_GENE, RefSeq_mRNA; omit for all). Returns {stable_id, external_db, n_xrefs, xrefs} — the COMPLETE list (never truncated), sorted by (dbname, primary_id); each row {dbname, db_display_name, primary_id, display_id, description, synonyms, info_type}. Unknown IDs return n_xrefs:0.",
        "input": {
          "type": "object",
          "properties": {
            "stable_id": {
              "type": "string"
            },
            "external_db": {
              "type": "string"
            }
          },
          "required": [
            "stable_id"
          ]
        },
        "required": [
          "stable_id"
        ],
        "returns": "{stable_id, external_db, n_xrefs, xrefs:[{dbname, db_display_name, primary_id, display_id, description, synonyms, info_type}]} sorted by (dbname, primary_id); unknown id -> n_xrefs:0.",
        "exampleArgs": {
          "stable_id": "ENSG00000157764",
          "external_db": "HGNC"
        }
      },
      {
        "id": "ensembl_vep_variant",
        "connector": "genomes",
        "credentialKeys": [],
        "description": "Predict variant consequences with Ensembl VEP — most-severe-first summary of the (often huge) per-transcript consequence list. Without hgvs_notation, variant_id takes precedence and region/allele/allele_orientation are ignored. Otherwise, supply hgvs_notation or both region and allele. HGVS must not be combined with variant_id, region, allele, or allele_orientation. hgvs_notation accepts genomic, coding, or protein HGVS (e.g. ENST00000366667:c.803C>T); reference versions are passed unchanged. HGVS uses the current species assembly from rest.ensembl.org (no assembly selection or liftover); assembly_name reports the resolved assembly. HGVS requests include hgvs=1 and transcript_version=1: transcript_id is versioned, hgvsc/hgvsp are retained when available. Input reference versions are not verified: version_validation is unchecked. Each HGVS result preserves input_reference_annotations from the complete upstream transcript list independently of max_consequences. matched means exact reference identity excluding the version suffix, not validated parsing or a version match; unknown means no comparable annotation (including unmapped gene symbols or genomic references). HGVS alleles retain the upstream strand, including negative strand; no region normalization is applied. allele does not filter results from the ID route. Args: variant_id (dbSNP rsID rs7412, COSMIC COSV..., or HGMD ID); region (1-based inclusive chrom:start-end on the current species assembly, GRCh38 for human, e.g. 7:140753336-140753336; SNV start==end; insertion start=end+1; explicit strand suffix :1/:-1 accepted; coordinates always refer to the reference genome, including on the negative strand); allele (A/C/G/T replacement sequence, or - for deletion; upstream symbolic alleles INS/DUP/DEL/TDUP are accepted in forward orientation); allele_orientation (forward by default, preserving existing calls: allele is on the reference forward strand regardless of the region suffix; region opts into interpreting allele on the region strand, so :-1 reverse-complements sequence alleles before querying; symbolic alleles on a negative region require forward orientation). Every region request is sent on the forward strand; region results are forward-oriented. A negative-strand gene does not require negative-strand input; species (default homo_sapiens); max_consequences (cap on returned per-transcript rows, default 25; full count in n_transcript_consequences, rows kept are most severe HIGH>MODERATE>LOW>MODIFIER; transcript_consequences_truncated flags the cap). Returns {query, n_results, results:[{input, assembly_name, seq_region_name, start, end, strand, allele_string, most_severe_consequence, genes:[{gene_id, gene_symbol, worst_impact, n_transcripts}], n_transcript_consequences, transcript_consequences_truncated, transcript_consequences:[...], n_regulatory_feature_consequences, n_motif_feature_consequences, colocated_variants:[...]}]}. Each transcript consequence retains variant_allele. n_transcripts counts distinct non-empty transcript IDs per gene across the full list; worst_impact spans all returned upstream alleles, while n_transcript_consequences counts rows. HGVS parsing errors retain the upstream reason; unknown rsIDs raise with the upstream message.",
        "input": {
          "type": "object",
          "properties": {
            "variant_id": {
              "type": "string"
            },
            "hgvs_notation": {
              "type": "string",
              "minLength": 1,
              "pattern": "\\S",
              "description": "HGVS expression, e.g. ENST00000366667.6:c.803C>T; passed unchanged to Ensembl."
            },
            "region": {
              "type": "string"
            },
            "allele": {
              "type": "string"
            },
            "allele_orientation": {
              "type": "string",
              "enum": [
                "forward",
                "region"
              ],
              "default": "forward",
              "description": "Region route only: forward preserves existing allele semantics; region interprets allele on the region strand (:-1 reverse-complements sequence alleles)."
            },
            "species": {
              "type": "string",
              "default": "homo_sapiens"
            },
            "max_consequences": {
              "type": "integer",
              "default": 25
            }
          }
        },
        "returns": "{query, n_results, results[], normalization?} — each result the most-severe-first VEP summary. Region calls add normalization: {original:{region,allele,allele_orientation}, forward:{region,allele}, reverse_complemented}; coordinates are not lifted or reversed. query retains the original input. Region results use forward-strand alleles; HGVS results retain upstream strand and versioned transcript_id, hgvsc/hgvsp when available. HGVS calls add hgvs_reference:{requested, version_validation:\"unchecked\", note}. Each HGVS result adds input_reference_annotations:{status:\"matched\"|\"unknown\", annotations:[{transcript_id,hgvsc,hgvsp,variant_allele}]} from the full upstream list, unaffected by max_consequences. These are annotation versions, not proof of the parsing reference version. ID and HGVS calls omit normalization.",
        "exampleArgs": {
          "variant_id": "rs7412",
          "max_consequences": 25
        }
      },
      {
        "id": "ensembl_homology",
        "connector": "genomes",
        "credentialKeys": [],
        "description": "Orthologues or paralogues of a gene from Ensembl Compara (condensed rows — no alignments/sequences). Args: gene_symbol (resolved to a stable ID in `species` first; pass exactly one of gene_symbol/gene_id); gene_id (ENSG...); homology_type (orthologues default/paralogues/projections); target_species (restrict to one species); target_taxon (NCBI taxon subtree, e.g. 9443 Primates; combinable with target_species, OR semantics); species (source species, default homo_sapiens); max_homologies (row cap default 200; n_total carries the complete count, homologies_truncated flags the cap). Returns {gene_id, gene_symbol, species, homology_type, target_species, target_taxon, n_total, homologies_truncated, homologies}; rows sorted by (species,id) {type, species, id, protein_id, taxonomy_level, method_link_type}. Quirk: the /homology/symbol route stalls — this tool always resolves symbols itself and queries by stable ID.",
        "input": {
          "type": "object",
          "properties": {
            "gene_symbol": {
              "type": "string"
            },
            "gene_id": {
              "type": "string"
            },
            "homology_type": {
              "type": "string",
              "enum": [
                "orthologues",
                "paralogues",
                "projections"
              ],
              "default": "orthologues"
            },
            "target_species": {
              "type": "string"
            },
            "target_taxon": {
              "type": "integer"
            },
            "species": {
              "type": "string",
              "default": "homo_sapiens"
            },
            "max_homologies": {
              "type": "integer",
              "default": 200
            }
          }
        },
        "returns": "{gene_id, gene_symbol, species, homology_type, target_species, target_taxon, n_total, homologies_truncated, homologies:[{type, species, id, protein_id, taxonomy_level, method_link_type}]} sorted by (species,id).",
        "exampleArgs": {
          "gene_symbol": "BRAF",
          "target_species": "mus_musculus"
        }
      },
      {
        "id": "ensembl_sequence",
        "connector": "genomes",
        "credentialKeys": [],
        "description": "Fetch sequence from Ensembl — by stable ID (gene/transcript/protein) or by genomic region. Pass EITHER stable_id OR region. Args: stable_id (ENSG.../ENST.../ENSP..., versioned accepted); region (1-based inclusive chrom:start..end or chrom:start-end, GRCh38 for human, max 10Mb); species (for region route, default homo_sapiens; ignored for stable IDs); seq_type (ID route: genomic default/cdna/cds/protein; ignored for regions which always return genomic). This tool returns one sequence: for gene-level cdna/cds/protein requests that resolve to multiple sequences, specify a transcript/protein stable ID instead; max_bytes (payload guard default 400000 — larger sequences have `seq` omitted; length/sha256/metadata always returned; re-call with larger max_bytes for full text). Returns {found, query, seq_type, id, description, molecule, length, sha256, seq} — length in the unit implied by molecule (bases for dna, residues for protein); seq replaced by seq_omitted when capped; found:false with null fields only when Ensembl explicitly reports the requested stable ID as not found; multiple-sequence requests, incompatible sequence types, and other upstream failures raise errors.",
        "input": {
          "type": "object",
          "properties": {
            "stable_id": {
              "type": "string"
            },
            "region": {
              "type": "string"
            },
            "species": {
              "type": "string",
              "default": "homo_sapiens"
            },
            "seq_type": {
              "type": "string",
              "enum": [
                "genomic",
                "cdna",
                "cds",
                "protein"
              ],
              "default": "genomic"
            },
            "max_bytes": {
              "type": "integer",
              "default": 400000
            }
          }
        },
        "returns": "{found, query, seq_type, id, description, molecule, length, sha256, seq} — seq replaced by seq_omitted:true when byte length exceeds max_bytes; found:false with null fields only for an explicit upstream ID-not-found response; other failures raise errors.",
        "exampleArgs": {
          "stable_id": "ENSP00000288602",
          "seq_type": "protein"
        }
      },
      {
        "id": "ensembl_overlap_region",
        "connector": "genomes",
        "credentialKeys": [],
        "description": "List Ensembl features overlapping a genomic region — genes, transcripts, regulatory features (enhancers/promoters), repeats, variants, karyotype bands. Args: region (1-based inclusive chrom:start-end GRCh38, e.g. 7:140719327-140925199; upstream rejects spans >5Mb — split larger); feature (gene default/transcript/exon/cds/regulatory/motif/repeat/variation/structural_variation/band/simple/misc); species (default homo_sapiens); max_features (row cap default 500; n_total carries the complete overlap count, features_truncated flags the cap). Returns {region, species, feature, n_total, features_truncated, features} sorted by (start,id). Row shape varies — genes {id, external_name, biotype, description, start, end, strand, canonical_transcript, ...}; regulatory {id, description, start, end, extended_start/end, ...}. Empty regions return n_total:0.",
        "input": {
          "type": "object",
          "properties": {
            "region": {
              "type": "string"
            },
            "feature": {
              "type": "string",
              "enum": [
                "gene",
                "transcript",
                "exon",
                "cds",
                "regulatory",
                "motif",
                "repeat",
                "variation",
                "structural_variation",
                "band",
                "simple",
                "misc"
              ],
              "default": "gene"
            },
            "species": {
              "type": "string",
              "default": "homo_sapiens"
            },
            "max_features": {
              "type": "integer",
              "default": 500
            }
          },
          "required": [
            "region"
          ]
        },
        "required": [
          "region"
        ],
        "returns": "{region, species, feature, n_total, features_truncated, features[]} sorted by (start,id); row shape varies by feature type. Empty regions return n_total:0.",
        "exampleArgs": {
          "region": "7:140719327-140925199",
          "feature": "gene"
        }
      },
      {
        "id": "ncbi_resolve_taxon",
        "connector": "genomes",
        "credentialKeys": [],
        "description": "Resolve a species or taxon name to NCBI Taxonomy identifiers. Accepts a scientific/common name or numeric TaxID; returns every upstream match so ambiguous names are not silently assigned to the first result.",
        "input": {
          "type": "object",
          "properties": {
            "query": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200
            },
            "max_matches": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            }
          },
          "required": [
            "query"
          ],
          "additionalProperties": false
        },
        "returns": "{query, n_matches, ambiguous, matches_truncated, matches:[{tax_id, scientific_name, common_name, rank}]}",
        "exampleArgs": {
          "query": "human"
        }
      },
      {
        "id": "ncbi_get_assembly_info",
        "connector": "genomes",
        "credentialKeys": [],
        "description": "Return the exact NCBI genome assembly identity for a versioned GCF/GCA accession, including taxon, assembly name, UCSC synonym, status, and paired RefSeq/GenBank accession. Versionless accessions are rejected to prevent reproducibility and species-compatibility errors.",
        "input": {
          "type": "object",
          "properties": {
            "assembly_accession": {
              "type": "string",
              "pattern": "^GC[AF]_[0-9]{9}\\.[0-9]+$"
            }
          },
          "required": [
            "assembly_accession"
          ],
          "additionalProperties": false
        },
        "returns": "{accession, current_accession, paired_accession, tax_id, organism_name, common_name, assembly_name, synonym, assembly_level, assembly_status, assembly_type, refseq_category, release_date, paired_assembly}",
        "exampleArgs": {
          "assembly_accession": "GCF_000001405.40"
        }
      },
      {
        "id": "ncbi_get_sequence_aliases",
        "connector": "genomes",
        "credentialKeys": [],
        "description": "List sequence names and exact UCSC/RefSeq/GenBank aliases for one versioned NCBI assembly. Optionally resolve one sequence name; ambiguous shared chromosome labels are retained as multiple matches instead of choosing an alt or unlocalized scaffold. Results are a bounded prefix controlled by max_sequences (default 200); use a larger cap when the full assembly report is needed.",
        "input": {
          "type": "object",
          "properties": {
            "assembly_accession": {
              "type": "string",
              "pattern": "^GC[AF]_[0-9]{9}\\.[0-9]+$"
            },
            "sequence": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200
            },
            "max_sequences": {
              "type": "integer",
              "minimum": 1,
              "maximum": 5000,
              "default": 200
            }
          },
          "required": [
            "assembly_accession"
          ],
          "additionalProperties": false
        },
        "returns": "{assembly_accession, n_sequences, upstream_total_count, n_matches, n_returned, matches_truncated, sequences:[{assembly_accession, chr_name, ucsc_style_name, sequence_name, refseq_accession, genbank_accession, length, assembly_unit, assigned_molecule_location_type, role}]}",
        "exampleArgs": {
          "assembly_accession": "GCF_000001405.40",
          "sequence": "chr1"
        }
      },
      {
        "id": "ucsc_list_tracks",
        "connector": "genomes",
        "credentialKeys": [],
        "description": "List data tracks available in a UCSC Genome Browser assembly (leaf tracks only — the queryable ones), optionally filtered. Args: genome (hg38 default/hg19/mm39/danRer11/... ~220 assemblies); filter_text (case-insensitive substring over name/short/long label, e.g. phyloP, TFBS, ClinVar; omit to list everything — hg38 has ~24k leaf tracks, you almost always want a filter); max_tracks (row cap default 200; n_total carries the full match count, tracks_truncated flags the cap). Returns {genome, filter_text, n_total, tracks_truncated, tracks} sorted by track name; each row {track, short_label, long_label, type, group, parent}. Use `track` with ucsc_track_data. Quirk: first call per genome downloads the full ~17MB listing and caches it for the process.",
        "input": {
          "type": "object",
          "properties": {
            "genome": {
              "type": "string",
              "default": "hg38"
            },
            "filter_text": {
              "type": "string"
            },
            "max_tracks": {
              "type": "integer",
              "default": 200
            }
          }
        },
        "returns": "{genome, filter_text, n_total, tracks_truncated, tracks:[{track, short_label, long_label, type, group, parent}]} — leaf tracks only, sorted by track name; n_total is the full match count, tracks_truncated flags the max_tracks cap.",
        "exampleArgs": {
          "genome": "hg38",
          "filter_text": "phyloP",
          "max_tracks": 50
        }
      },
      {
        "id": "ucsc_track_data",
        "connector": "genomes",
        "credentialKeys": [],
        "description": "Fetch raw rows of any UCSC Genome Browser track in a region — the generic escape hatch behind ucsc_conservation / ucsc_tfbs_clusters (gene tracks, ClinVar, GWAS catalog, CpG islands, repeats, ...). Args: track (name from ucsc_list_tracks, e.g. knownGene, cpgIslandExt, clinvarMain); chrom (chr-prefixed, chr7/chrX — UCSC requires the prefix); start (0-based half-open; an Ensembl 1-based start is start-1 here); end (exclusive); genome (default hg38); max_rows (API maxItemsOutput, default 1000; truncated reflects the API's own maxItemsLimit flag). Returns {genome, track, chrom, start, end, track_type, items_returned, truncated, rows} — rows in upstream shape (BED-like {chrom, chromStart, chromEnd, name, score, ...}; wiggle {start, end, value}). Unknown tracks raise. Quirk: for some huge tracks the API caps output itself and points at dataDownloadUrl — echoed when present.",
        "input": {
          "type": "object",
          "properties": {
            "track": {
              "type": "string"
            },
            "chrom": {
              "type": "string"
            },
            "start": {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            },
            "end": {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            },
            "genome": {
              "type": "string",
              "default": "hg38"
            },
            "max_rows": {
              "type": "integer",
              "default": 1000
            }
          },
          "required": [
            "track",
            "chrom",
            "start",
            "end"
          ]
        },
        "required": [
          "track",
          "chrom",
          "start",
          "end"
        ],
        "returns": "{genome, track, chrom, start, end, track_type, items_returned, truncated, rows, dataDownloadUrl?} — rows in the upstream shape; truncated reflects the API maxItemsLimit flag; dataDownloadUrl echoed when the API caps a huge track itself.",
        "exampleArgs": {
          "track": "cpgIslandExt",
          "chrom": "chr7",
          "start": 140700000,
          "end": 140800000,
          "genome": "hg38"
        }
      },
      {
        "id": "ucsc_conservation",
        "connector": "genomes",
        "credentialKeys": [],
        "description": "Evolutionary conservation summary for a region from UCSC phyloP / phastCons tracks (base-wise scores over multi-species alignments). Args: chrom (chr-prefixed); start (0-based half-open); end (exclusive; span capped at 100000 bp — split larger); genome (default hg38); track (optional; defaults: hg19 phyloP100wayAll, hg38 phyloP100way, mm10 phyloP60wayAll, mm39 phyloP35way; other genomes retain the phyloP100way fallback, which may not exist — specify a score track from ucsc_list_tracks when needed; positive=conserved, negative=fast-evolving; alternatives hg38 phastCons100way, phyloP30way, phastCons30way, phyloP447way, phyloP470way; hg19 phastCons100way); include_values (also return per-base {start,end,value} rows capped at max_values, values_truncated flags the cap; default false = summary only); max_values (per-base cap default 2000). Returns {genome, track, chrom, start, end, span_bp, n_bases_covered, coverage_fraction, mean, min, max} (+values, values_truncated when requested). Stats weighted by each row's base span, clipped to window; uncovered bases lower coverage_fraction, not zero-scored. Non-score tracks raise; an upstream-truncated row list also raises.",
        "input": {
          "type": "object",
          "properties": {
            "chrom": {
              "type": "string"
            },
            "start": {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            },
            "end": {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            },
            "genome": {
              "type": "string",
              "default": "hg38"
            },
            "track": {
              "type": "string"
            },
            "include_values": {
              "type": "boolean",
              "default": false
            },
            "max_values": {
              "type": "integer",
              "default": 2000
            }
          },
          "required": [
            "chrom",
            "start",
            "end"
          ]
        },
        "required": [
          "chrom",
          "start",
          "end"
        ],
        "returns": "{genome, track, chrom, start, end, span_bp, n_bases_covered, coverage_fraction, mean, min, max, values?, values_truncated?} — stats are base-span-weighted and clipped to the window; uncovered bases lower coverage_fraction rather than count as zero.",
        "exampleArgs": {
          "chrom": "chr7",
          "start": 140753330,
          "end": 140753380,
          "track": "phyloP100way"
        }
      },
      {
        "id": "ucsc_tfbs_clusters",
        "connector": "genomes",
        "credentialKeys": [],
        "description": "ENCODE transcription-factor binding site clusters overlapping a region (ChIP-seq peak clusters across hundreds of cell types) — which TFs bind where. Args: chrom (chr-prefixed); start (0-based half-open); end (exclusive); genome (hg38 default track encRegTfbsClustered ENCODE 3, or hg19 wgEncodeRegTfbsClusteredV3; other assemblies raise); max_rows (API maxItemsOutput default 1000; truncated reflects maxItemsLimit). Returns {genome, track, chrom, start, end, items_returned, truncated, n_factors, factors, clusters} — clusters sorted by (chromStart,name) {name (TF symbol e.g. CTCF), chrom, chromStart, chromEnd, score (0-1000), sourceCount (supporting experiments)}; factors is the distinct TF list. Score>=~600 and high sourceCount ~ robust binding.",
        "input": {
          "type": "object",
          "properties": {
            "chrom": {
              "type": "string"
            },
            "start": {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            },
            "end": {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            },
            "genome": {
              "type": "string",
              "default": "hg38"
            },
            "max_rows": {
              "type": "integer",
              "default": 1000
            }
          },
          "required": [
            "chrom",
            "start",
            "end"
          ]
        },
        "required": [
          "chrom",
          "start",
          "end"
        ],
        "returns": "{genome, track, chrom, start, end, items_returned, truncated, n_factors, factors:[...], clusters:[{name, chrom, chromStart, chromEnd, score, sourceCount}]} — clusters sorted by (chromStart,name); factors is the distinct TF list.",
        "exampleArgs": {
          "chrom": "chr7",
          "start": 140699000,
          "end": 140760000,
          "genome": "hg38"
        }
      },
      {
        "id": "ucsc_chrom_sizes",
        "connector": "genomes",
        "credentialKeys": [],
        "description": "Chromosome/contig names and sizes of a UCSC assembly — for validating coordinates and iterating regions. Args: genome (default hg38); filter_text (case-insensitive substring on the name, e.g. chr1; omit for all — hg38 has 711 sequences, mostly alt/random/unplaced; primary chromosomes sort first); max_chroms (row cap default 100; n_total carries the full post-filter count, chroms_truncated flags the cap). Returns {genome, filter_text, chrom_count (assembly-wide from the API), n_total, chroms_truncated, chromosomes:[{name, size_bp}]} sorted by size descending.",
        "input": {
          "type": "object",
          "properties": {
            "genome": {
              "type": "string",
              "default": "hg38"
            },
            "filter_text": {
              "type": "string"
            },
            "max_chroms": {
              "type": "integer",
              "default": 100
            }
          }
        },
        "returns": "{genome, filter_text, chrom_count, n_total, chroms_truncated, chromosomes:[{name, size_bp}]} — chrom_count is the assembly-wide total from the API; n_total is the post-filter count; sorted by size descending.",
        "exampleArgs": {
          "genome": "hg38",
          "filter_text": "chr1",
          "max_chroms": 25
        }
      }
    ]
  },
  {
    "id": "variants",
    "displayName": "Variants",
    "aliases": [
      "gnomAD",
      "ClinVar",
      "dbSNP",
      "MaveDB",
      "MAVE",
      "genetic variant"
    ],
    "description": "Genetic variants — gnomAD frequencies and constraint, ClinVar, dbSNP, and MaveDB functional scores, mappings and experiments.",
    "useWhen": "Use when you need genetic-variant data — gnomAD population allele frequencies, gene constraint (pLI/LOEUF), structural or mitochondrial variants, and build liftover; ClinVar clinical significance (gnomAD mirror or direct NCBI search/records by accession or rsID); dbSNP RefSNP records and region lookups; or MaveDB multiplexed assays of variant effect (MAVE), score set search and metadata, CSV functional scores, existing GA4GH VRS variant mappings, and experiments.",
    "sources": [
      "gnomAD",
      "ClinVar",
      "dbSNP",
      "MaveDB"
    ],
    "termsUrl": "https://www.ncbi.nlm.nih.gov/clinvar/docs/maintenance_use/",
    "requiresNcbi": true,
    "group": "featured",
    "tools": [
      {
        "id": "get_variant",
        "connector": "variants",
        "credentialKeys": [],
        "description": "Look up one gnomAD short variant by ID and return overall exome/genome frequencies. `variant_id` is `chrom-pos-ref-alt` on the dataset's reference build (GRCh38 for r3/r4, GRCh37 for r2.1/ExAC), e.g. `19-44908822-C-T` (APOE rs7412); use `search_variants` to resolve an rsID first. Set `include_populations: true` when ancestry-specific counts/frequencies are needed for an individual variant. Retain the dataset, allele counts and quality filters when interpreting frequencies; rarity alone does not establish pathogenicity or an ACMG criterion.",
        "input": {
          "type": "object",
          "properties": {
            "variant_id": {
              "type": "string"
            },
            "dataset": {
              "type": "string",
              "enum": [
                "gnomad_r4",
                "gnomad_r4_non_ukb",
                "gnomad_r3",
                "gnomad_r3_controls_and_biobanks",
                "gnomad_r3_non_cancer",
                "gnomad_r3_non_neuro",
                "gnomad_r3_non_topmed",
                "gnomad_r3_non_v2",
                "gnomad_r2_1",
                "gnomad_r2_1_controls",
                "gnomad_r2_1_non_cancer",
                "gnomad_r2_1_non_neuro",
                "gnomad_r2_1_non_topmed",
                "exac"
              ],
              "default": "gnomad_r4"
            },
            "include_populations": {
              "type": "boolean",
              "default": false,
              "description": "Include population counts and derived allele frequencies for this variant"
            }
          },
          "required": [
            "variant_id"
          ]
        },
        "required": [
          "variant_id"
        ],
        "returns": "`{ found: bool, variant_id: str, dataset: str, variant: null | { variant_id, dataset, reference_genome, chrom, pos, ref, alt, rsids: [str], exome: { ac, an, af, homozygote_count, hemizygote_count, filters, populations?: null | [{ id, ac, an, af, homozygote_count, hemizygote_count }] }|null, genome: {...}|null } }`. `exome`/`genome` are null where the dataset has no such call set (e.g. r3 is genome-only). `populations` is omitted by default; when requested, null means unavailable and [] means an empty upstream list (null rows are omitted). Rows are sorted by the original ID (e.g. eas, nfe); IDs vary by dataset and may include overlapping sex strata and hgdp:/1kg: groups, so do not sum rows. Population af is ac/an without rounding, or null for missing/invalid counts or an=0; ac=0 with an>0 yields af=0. These are observed frequencies, not filtering allele frequencies or combined exome/genome frequencies.",
        "exampleArgs": {
          "variant_id": "19-44908822-C-T",
          "dataset": "gnomad_r4"
        }
      },
      {
        "id": "search_variants",
        "connector": "variants",
        "credentialKeys": [],
        "description": "Search gnomAD for variant IDs matching a query string (an rsID like `rs7412`, a variant ID, or a prefix). Use this to resolve rsIDs to `chrom-pos-ref-alt` IDs for `get_variant`.",
        "input": {
          "type": "object",
          "properties": {
            "query": {
              "type": "string"
            },
            "dataset": {
              "type": "string",
              "enum": [
                "gnomad_r4",
                "gnomad_r4_non_ukb",
                "gnomad_r3",
                "gnomad_r3_controls_and_biobanks",
                "gnomad_r3_non_cancer",
                "gnomad_r3_non_neuro",
                "gnomad_r3_non_topmed",
                "gnomad_r3_non_v2",
                "gnomad_r2_1",
                "gnomad_r2_1_controls",
                "gnomad_r2_1_non_cancer",
                "gnomad_r2_1_non_neuro",
                "gnomad_r2_1_non_topmed",
                "exac"
              ],
              "default": "gnomad_r4"
            }
          },
          "required": [
            "query"
          ]
        },
        "required": [
          "query"
        ],
        "returns": "`{ query: str, dataset: str, n_matches: int, variant_ids: [str] }` — `variant_ids` sorted. Empty list when nothing matches.",
        "exampleArgs": {
          "query": "rs7412",
          "dataset": "gnomad_r4"
        }
      },
      {
        "id": "gene_variants",
        "connector": "variants",
        "credentialKeys": [],
        "description": "List ALL gnomAD short variants in a gene. Gene bounds and variant coordinates use the dataset reference build (GRCh37 for r2.1/ExAC, GRCh38 for r3/r4). The complete listing can contain thousands of rows for large genes. Pass exactly one of `gene_symbol` (HGNC symbol, e.g. `APOE`) or `gene_id` (Ensembl gene ID, e.g. `ENSG00000130203`).",
        "input": {
          "type": "object",
          "properties": {
            "gene_symbol": {
              "type": "string"
            },
            "gene_id": {
              "type": "string"
            },
            "dataset": {
              "type": "string",
              "enum": [
                "gnomad_r4",
                "gnomad_r4_non_ukb",
                "gnomad_r3",
                "gnomad_r3_controls_and_biobanks",
                "gnomad_r3_non_cancer",
                "gnomad_r3_non_neuro",
                "gnomad_r3_non_topmed",
                "gnomad_r3_non_v2",
                "gnomad_r2_1",
                "gnomad_r2_1_controls",
                "gnomad_r2_1_non_cancer",
                "gnomad_r2_1_non_neuro",
                "gnomad_r2_1_non_topmed",
                "exac"
              ],
              "default": "gnomad_r4"
            }
          }
        },
        "returns": "`{ gene_id: str|null, symbol: str, chrom: str, start: int, stop: int, dataset: str, n_variants: int, variants: [ { variant_id, pos, ref, alt, rsids: [str], exome: { ac, an, af }|null, genome: {...}|null } ] }`, rows sorted by (pos, variant_id). Unknown gene returns `gene_id: null`, an echoed `gene_query`, and an empty `variants` list.",
        "exampleArgs": {
          "gene_symbol": "APOE",
          "dataset": "gnomad_r4"
        }
      },
      {
        "id": "gene_constraint",
        "connector": "variants",
        "credentialKeys": [],
        "description": "gnomAD gene constraint metrics: pLI, observed/expected LoF-missense-synonymous counts with oe ratios + 90% CI bounds, and per-class z-scores. Use to judge a gene's intolerance to loss-of-function (pLI >= 0.9 or oe_lof_upper (LOEUF) < 0.6 ~ LoF-intolerant). Pass exactly one of `gene_symbol` (e.g. `TP53`) or `gene_id`.",
        "input": {
          "type": "object",
          "properties": {
            "gene_symbol": {
              "type": "string"
            },
            "gene_id": {
              "type": "string"
            }
          }
        },
        "returns": "`{ found: bool, gene_id: str|null, symbol: str, canonical_transcript_id: str, chrom: str, start: int, stop: int, strand: str, constraint: { exp_lof, obs_lof, oe_lof, oe_lof_lower, oe_lof_upper, exp_mis, obs_mis, oe_mis, oe_mis_lower, oe_mis_upper, exp_syn, obs_syn, oe_syn, oe_syn_lower, oe_syn_upper, pli, lof_z, mis_z, syn_z }|null }`. Unknown gene returns `found: false`, an echoed `gene_query`, and `constraint: null`.",
        "exampleArgs": {
          "gene_symbol": "TP53"
        }
      },
      {
        "id": "region_variants",
        "connector": "variants",
        "credentialKeys": [],
        "description": "List ALL gnomAD short variants in a genomic region (max 1 Mb — split larger regions into consecutive windows). `chrom` is a chromosome name without `chr` prefix (`1`-`22`, `X`, `Y`); `start`/`stop` are 1-based inclusive and `stop - start` must be <= 1,000,000. The dataset determines the reference build of the coordinates (GRCh37 for r2.1/ExAC, GRCh38 for r3/r4); input coordinates must already use that build, with no automatic liftover.",
        "input": {
          "type": "object",
          "properties": {
            "chrom": {
              "type": "string",
              "description": "Chromosome 1-22, X, or Y; an optional chr prefix and lowercase x/y are accepted"
            },
            "start": {
              "type": "integer",
              "minimum": 1,
              "maximum": 999999999
            },
            "stop": {
              "type": "integer",
              "minimum": 1,
              "maximum": 999999999
            },
            "dataset": {
              "type": "string",
              "enum": [
                "gnomad_r4",
                "gnomad_r4_non_ukb",
                "gnomad_r3",
                "gnomad_r3_controls_and_biobanks",
                "gnomad_r3_non_cancer",
                "gnomad_r3_non_neuro",
                "gnomad_r3_non_topmed",
                "gnomad_r3_non_v2",
                "gnomad_r2_1",
                "gnomad_r2_1_controls",
                "gnomad_r2_1_non_cancer",
                "gnomad_r2_1_non_neuro",
                "gnomad_r2_1_non_topmed",
                "exac"
              ],
              "default": "gnomad_r4"
            }
          },
          "required": [
            "chrom",
            "start",
            "stop"
          ]
        },
        "required": [
          "chrom",
          "start",
          "stop"
        ],
        "returns": "`{ chrom: str, start: int, stop: int, dataset: str, n_variants: int, variants: [...] }` with the same lean variant rows as `gene_variants`, sorted by (pos, variant_id).",
        "exampleArgs": {
          "chrom": "1",
          "start": 55039475,
          "stop": 55064852,
          "dataset": "gnomad_r4"
        }
      },
      {
        "id": "liftover_variant",
        "connector": "variants",
        "credentialKeys": [],
        "description": "Map a variant ID between reference builds (GRCh37 <-> GRCh38) using gnomAD's liftover table. `variant_id` is `chrom-pos-ref-alt` on `source_build`. The route is directional: a GRCh38 ID passed with `source_build=GRCh37` returns zero results, not an error.",
        "input": {
          "type": "object",
          "properties": {
            "variant_id": {
              "type": "string"
            },
            "source_build": {
              "type": "string",
              "enum": [
                "GRCh37",
                "GRCh38"
              ],
              "default": "GRCh37"
            }
          },
          "required": [
            "variant_id"
          ]
        },
        "required": [
          "variant_id"
        ],
        "returns": "`{ source_variant_id: str, source_build: str, n_results: int, results: [ { source: { variant_id, reference_genome }, liftover: { variant_id, reference_genome }, datasets: [str] } ] }`, sorted by liftover variant_id. `n_results: 0` when the ID does not lift over in that direction.",
        "exampleArgs": {
          "variant_id": "1-55516888-G-GA",
          "source_build": "GRCh37"
        }
      },
      {
        "id": "clinvar_variants",
        "connector": "variants",
        "credentialKeys": [],
        "description": "List ClinVar variants in a gene as mirrored by gnomAD, with clinical significance, review status and gold stars. The output pins gnomAD's ClinVar snapshot via `clinvar_release_date`. Pass exactly one of `gene_symbol` (e.g. `BRCA1`) or `gene_id`.",
        "input": {
          "type": "object",
          "properties": {
            "gene_symbol": {
              "type": "string"
            },
            "gene_id": {
              "type": "string"
            }
          }
        },
        "returns": "`{ gene_id: str|null, symbol: str, clinvar_release_date: str, n_variants: int, variants: [ { variant_id, clinvar_variation_id, clinical_significance, gold_stars, review_status, major_consequence, pos, transcript_id, in_gnomad } ] }`, sorted by (pos, variant_id). Unknown gene returns `gene_id: null`, an echoed `gene_query`, and an empty `variants` list.",
        "exampleArgs": {
          "gene_symbol": "BRCA1"
        }
      },
      {
        "id": "structural_variants",
        "connector": "variants",
        "credentialKeys": [],
        "description": "List gnomAD structural variants (deletions, duplications, insertions, inversions, CNVs...) overlapping a gene. Pass exactly one of `gene_symbol` (e.g. `TP53`) or `gene_id`. `dataset` is an SV pin — `gnomad_sv_r4` (default, GRCh38) or `gnomad_sv_r2_1` (GRCh37); SV IDs are release-specific.",
        "input": {
          "type": "object",
          "properties": {
            "gene_symbol": {
              "type": "string"
            },
            "gene_id": {
              "type": "string"
            },
            "dataset": {
              "type": "string",
              "enum": [
                "gnomad_sv_r4",
                "gnomad_sv_r2_1"
              ],
              "default": "gnomad_sv_r4"
            }
          }
        },
        "returns": "`{ gene_id: str|null, symbol: str, dataset: str, n_variants: int, variants: [...] }`; rows carry SV `variant_id`, `type`, position/length, allele counts/frequencies, `filters`, and per-gene `consequence`/`major_consequence`, sorted by variant_id. Unknown gene returns `gene_id: null`, an echoed `gene_query`, and an empty list.",
        "exampleArgs": {
          "gene_symbol": "TP53",
          "dataset": "gnomad_sv_r4"
        }
      },
      {
        "id": "get_structural_variant",
        "connector": "variants",
        "credentialKeys": [],
        "description": "Look up one gnomAD structural variant by its release-specific SV ID (e.g. `DEL_CHR17_599B1512` in gnomad_sv_r4). IDs do NOT carry across releases — `dataset` (`gnomad_sv_r4` default, or `gnomad_sv_r2_1`) must match the release the ID came from.",
        "input": {
          "type": "object",
          "properties": {
            "sv_id": {
              "type": "string"
            },
            "dataset": {
              "type": "string",
              "enum": [
                "gnomad_sv_r4",
                "gnomad_sv_r2_1"
              ],
              "default": "gnomad_sv_r4"
            }
          },
          "required": [
            "sv_id"
          ]
        },
        "required": [
          "sv_id"
        ],
        "returns": "`{ found: bool, sv_id: str, dataset: str, structural_variant: null | { variant_id, chrom, pos, end, chrom2, pos2, type, length, ac, an, af, homozygote_count, hemizygote_count, filters, qual, consequences: [ { consequence, genes: [str] } ], algorithms: [str], evidence: [str], dataset } }`. Null when not found.",
        "exampleArgs": {
          "sv_id": "DEL_CHR17_A5250EA9",
          "dataset": "gnomad_sv_r4"
        }
      },
      {
        "id": "mitochondrial_variants",
        "connector": "variants",
        "credentialKeys": [],
        "description": "List gnomAD mitochondrial variants with heteroplasmy-aware counts (`ac_het`, `ac_hom`, `max_heteroplasmy`) for a mitochondrial gene OR a chrM coordinate window. The mitochondrial callset is available only through the GRCh38 gnomAD r3/r4 dataset pins: use dataset `gnomad_r3` or `gnomad_r4`. Pass a gene (`gene_symbol` like `MT-TL1`, or `gene_id`) OR a region (`region_start` + `region_stop`), not both.",
        "input": {
          "type": "object",
          "properties": {
            "gene_symbol": {
              "type": "string"
            },
            "gene_id": {
              "type": "string"
            },
            "region_start": {
              "type": "integer",
              "minimum": 1,
              "maximum": 999999999
            },
            "region_stop": {
              "type": "integer",
              "minimum": 1,
              "maximum": 999999999
            },
            "dataset": {
              "type": "string",
              "enum": [
                "gnomad_r4",
                "gnomad_r3"
              ],
              "default": "gnomad_r4"
            }
          }
        },
        "returns": "`{ gene_id+symbol | region: \"M:start-stop\", dataset: str, n_variants: int, variants: [ { variant_id, pos, ac_het, ac_hom, an, max_heteroplasmy, filters } ] }`, sorted by (pos, variant_id). Unknown gene returns `gene_id: null`, an echoed `gene_query`, and an empty list.",
        "exampleArgs": {
          "gene_symbol": "MT-TL1",
          "dataset": "gnomad_r4"
        }
      },
      {
        "id": "clinvar_search",
        "connector": "variants",
        "credentialKeys": [
          "ncbiEmail",
          "ncbiApiKey"
        ],
        "description": "Search ClinVar directly (live NCBI, not gnomAD's snapshot) and return matching variation records with clinical significance, review status and gold stars. Requires a contact email (credentials.ncbiEmail) per NCBI E-utilities usage policy. Args: query (a ClinVar Entrez query — free text like \"TP53 R175H\" or an HGVS string works, and fielded terms compose with AND/OR/NOT, e.g. BRCA1[gene], pathogenic[CLIN_SIG], \"Lynch syndrome\"[dis], single_nucleotide_variant[Type of variation]; an rsID also works but clinvar_variant_by_rsid returns fuller records), max_records (page cap 1-200, default 50). The match TOTAL is always reported; when total > max_records the list is a capped prefix (ClinVar relevance/recency order) and truncated is true. NCBI E-utilities intermittently return HTTP 500 under load — retry once a few seconds later if that surfaces.",
        "input": {
          "type": "object",
          "properties": {
            "query": {
              "type": "string"
            },
            "max_records": {
              "type": "integer",
              "default": 50
            }
          },
          "required": [
            "query"
          ]
        },
        "required": [
          "query"
        ],
        "returns": "`{ term, total, n_returned, truncated, missing_uids, records }` — `total` is the true ClinVar match count (may exceed the returned list); `truncated` flags a capped page; `missing_uids` lists matched IDs whose summary doc NCBI dropped (rare, transient — distinct from truncation; retry to recover). Each record: `{ variation_id, accession (VCV), accession_version, title, obj_type, variant_type, canonical_spdi, cdna_change, protein_change, rsids, other_xrefs, genes, molecular_consequences, locations (GRCh38+GRCh37), allele_frequencies, germline_classification, clinical_impact_classification, oncogenicity_classification (each: description, review_status, gold_stars 0-4, last_evaluated, fda_recognized_database, conditions with ontology xrefs; null when ClinVar has no classification on that axis), n_submissions (SCV count), supporting_submissions }`. When no contact email is set, returns `{ error: \"contact_email_required\", message }` instead.",
        "exampleArgs": {
          "query": "BRCA1 pathogenic[CLIN_SIG]",
          "max_records": 50
        }
      },
      {
        "id": "clinvar_get_records",
        "connector": "variants",
        "credentialKeys": [
          "ncbiEmail",
          "ncbiApiKey"
        ],
        "description": "Fetch full ClinVar records for a batch of VCV/RCV accessions or bare variation IDs. Requires a contact email (credentials.ncbiEmail) per NCBI E-utilities usage policy. Args: accessions (up to 50 identifiers, mixed forms accepted — VCV000045122 (versioned VCV000045122.3 ok; resolved locally, free), RCV000019428 (each RCV costs one extra esearch), or a bare ClinVar variation ID (45122). rsIDs are rejected — use clinvar_variant_by_rsid. An RCV (one variant-condition pair) resolves to its parent VCV variation record). Never silently drops an input.",
        "input": {
          "type": "object",
          "properties": {
            "accessions": {
              "type": [
                "string",
                "array"
              ],
              "items": {
                "type": "string"
              }
            }
          },
          "required": [
            "accessions"
          ]
        },
        "required": [
          "accessions"
        ],
        "returns": "`{ n_requested, n_unique, n_duplicate_skipped, records, not_found, missing_uids, not_processed }`. Records carry the full shape documented in `clinvar_search` plus `requested_as` (which input(s) mapped to the record), sorted by variation_id. `not_found` lists unknown accessions (definitive absence — RCVs that esearch proves unknown); `missing_uids` lists inputs whose summary NCBI dropped or error-flagged (for a just-resolved RCV this is a transient drop — the record EXISTS, retry; for a VCV/numeric input it is a transient drop OR a nonexistent id — retry to disambiguate, never conclude absence from one call); `not_processed` lists RCVs skipped because the per-call time budget ran out (re-request just those — VCV/numeric inputs always resolve, they never land there). When no contact email is set, returns `{ error: \"contact_email_required\", message }` instead.",
        "exampleArgs": {
          "accessions": [
            "VCV000045122",
            "RCV000019428",
            "45123"
          ]
        }
      },
      {
        "id": "clinvar_get_submissions",
        "connector": "variants",
        "credentialKeys": [
          "ncbiEmail",
          "ncbiApiKey"
        ],
        "description": "Fetch individual SCV submission evidence from official ClinVar VCV XML. Requires the same contact email as clinvar_search. Pass accession: a VCV accession (optional .version is honored) or a positive variation ID. Unversioned input retrieves the latest VCV. RCV, SCV and rsIDs are not accepted. Returns submitted classifications separately for germline, somatic clinical impact and oncogenicity, conditions, submitter, evaluation date, assertion methods, public classification comments, observed evidence and citations where provided. Missing source fields stay null/empty. Compare submissions within the same classification type and condition; this tool does not infer conflicts. max_submissions sets page size (1-200, default 200); offset defaults to 0. For later pages, pass the returned next_page arguments, which pin the VCV version; offset > 0 requires a versioned VCV. Each page re-fetches the complete XML; there is no result cache. Included records contain indirect references rather than direct SCV evidence. Duplicate SCVs retain the highest version present in the requested snapshot.",
        "input": {
          "type": "object",
          "properties": {
            "accession": {
              "type": "string"
            },
            "max_submissions": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200,
              "default": 200
            },
            "offset": {
              "type": "integer",
              "minimum": 0,
              "default": 0
            }
          },
          "required": [
            "accession"
          ]
        },
        "required": [
          "accession"
        ],
        "returns": "`{ requested_as, variation_id, accession, accession_version, record_status, record_type, direct_evidence_available, missing_record, n_submissions, n_duplicate_skipped, n_returned, offset, truncated, next_page, submissions }`. Each submission has `{ accession, version, accession_version, submitter: { name, org_id, category }, record_status, contributes_to_aggregate_classification, last_evaluated, review_status, classifications: [{ type, description, assertion_type, clinical_significance, drug }], conditions: [{ type, names, xrefs }], multiple_condition_explanation, assertion_methods (description, citations, xrefs, comments), classification_explanation, classification_comments, submission_comments, observed_in (origins, methods, descriptions, evidence with source attributes/citations/xrefs/comments, functional_data with effect/consequences/result/external_link), citations }`. Included records return record_type: \"included\", direct_evidence_available: false, submissions: [], referenced_submissions and classified_variations; submission counts and pagination are omitted because no direct evidence is provided. Classification type no_classification preserves explicit NoClassification values. The aggregate-contribution flag is boolean|null. Comment arrays preserve { type, text }, including FlaggedComment, without inferring its meaning. Missing classification blocks or included-record reference lists throw. Citations preserve source IDs, URLs and text; assertion-method citations are also attached to their method. Empty upstream XML returns `{ requested_as, missing_record: true, submissions: [] }`, not definitive absence. Upstream errors, malformed XML and accession/version mismatches throw. Missing contact email returns `{ error: \"contact_email_required\", message }`.",
        "exampleArgs": {
          "accession": "VCV000045122"
        }
      },
      {
        "id": "clinvar_variant_by_rsid",
        "connector": "variants",
        "credentialKeys": [
          "ncbiEmail",
          "ncbiApiKey"
        ],
        "description": "All ClinVar variation records that reference a dbSNP rsID, with full classifications (an rsID can map to several VCVs — one per alternate allele, e.g. rs121913529 covers KRAS G12D/G12V/G12A). Requires a contact email (credentials.ncbiEmail) per NCBI E-utilities usage policy. Args: rsid (dbSNP reference SNP ID, e.g. rs7412; case-insensitive, must match rs<digits>), max_records (cap 1-200, default 50). total always carries the true match count and truncated flags a capped listing; total == 0 means ClinVar has no record for the rsID.",
        "input": {
          "type": "object",
          "properties": {
            "rsid": {
              "type": "string",
              "description": "dbSNP rsID, e.g. rs7412 (case-insensitive)."
            },
            "max_records": {
              "type": "integer",
              "default": 50
            }
          },
          "required": [
            "rsid"
          ]
        },
        "required": [
          "rsid"
        ],
        "returns": "`{ rsid, total, n_returned, truncated, missing_uids, records }` with the full record shape documented in `clinvar_search` (review status, gold stars, last-evaluated dates, SCV counts — the fields gnomAD’s ClinVar mirror lacks). Records come in ClinVar relevance order; `missing_uids` lists matches whose summary NCBI dropped (transient). `total == 0` means ClinVar has no record for the rsID. When no contact email is set, returns `{ error: \"contact_email_required\", message }` instead.",
        "exampleArgs": {
          "rsid": "rs121913529",
          "max_records": 50
        }
      },
      {
        "id": "dbsnp_get_rsids",
        "connector": "variants",
        "credentialKeys": [
          "ncbiEmail",
          "ncbiApiKey"
        ],
        "description": "Canonical dbSNP RefSNP records for a batch of rsIDs: GRCh38+GRCh37 placements, alleles, gene context, per-study allele frequencies, and ClinVar cross-references. Requires a contact email (credentials.ncbiEmail) per NCBI E-utilities usage policy; without one the tool returns {error: 'contact_email_required', message}. Args: rsids (up to 20 rs<digits>, case-insensitive) — each costs one paced NCBI Variation Services request, so large batches take ~1 s per rsID. Returns {n_requested, records, not_found (rs numbers dbSNP doesn't know), not_processed (rsIDs skipped when the wall-clock budget ran out — re-request just those)}. Each record: {rsid, status, create_date, last_update_date, last_update_build_id, n_citations, citations_pmids (capped at 20; citations_truncated flags the cap), variant_type, mane_select_ids, placements, alleles}. status is 'live', 'merged' (record instead carries merged_into — re-query those rsIDs) or 'no_data' (withdrawn/unsupported). placements give 1-based chromosome coordinates with ref/alts per assembly (GRCh38 first, is_primary true); an empty string in alts denotes a deletion allele. Each alt-allele entry: {allele, ref, spdi (0-based interbase), hgvs, frequencies: [{study, study_version, allele_count, total_count, af}] (ALFA, 1000Genomes, TOPMED, gnomAD...), clinvar: [{rcv_accession, clinical_significances, review_status, last_evaluated_date, disease_names}], genes: [{symbol, gene_id, name, orientation, consequences (SO terms), mane_select: [{transcript_hgvs, protein_spdi}]}]}.",
        "input": {
          "type": "object",
          "properties": {
            "rsids": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "description": "Up to 20 rsIDs (rs<digits>, case-insensitive), e.g. [\"rs7412\", \"rs429358\"]."
            }
          },
          "required": [
            "rsids"
          ]
        },
        "required": [
          "rsids"
        ],
        "returns": "`{ n_requested: int, records: [ { rsid, status ('live'|'merged'|'no_data'), create_date, last_update_date, last_update_build_id, n_citations, citations_pmids, citations_truncated, merged_into?, variant_type?, mane_select_ids?, placements?: [{assembly, assembly_full, seq_id, chrom, position, ref, alts, is_primary}], alleles?: [{allele, ref, spdi, hgvs, frequencies, clinvar, genes}] } ], not_found: [str], not_processed: [str] }` — not_found are rs numbers dbSNP doesn't know; not_processed are rsIDs skipped when the time budget ran out. Empty/blank input yields all-empty lists (never an error).",
        "exampleArgs": {
          "rsids": [
            "rs7412",
            "rs429358"
          ]
        }
      },
      {
        "id": "dbsnp_search_by_region",
        "connector": "variants",
        "credentialKeys": [
          "ncbiEmail",
          "ncbiApiKey"
        ],
        "description": "List dbSNP rsIDs in a genomic window (esearch db=snp positional index — NCBI Variation Services has no region endpoint). Requires a contact email (credentials.ncbiEmail) per NCBI E-utilities usage policy; without one the tool returns {error: 'contact_email_required', message}. Args: chrom (1-22, X, Y or MT; 'chr' prefix tolerated), start (1-based inclusive), stop (inclusive; span capped at 1 Mb — split larger regions into consecutive windows; dense regions hold many thousands of rsIDs per kb, so keep windows small or raise max_rsids), assembly (which positional index — 'GRCh38' default -> [CPOS], or 'GRCh37' -> [CPOS_GRCH37]; coordinates must be on the chosen assembly), max_rsids (listing cap 1-1000, default 200). Returns {chrom, start, stop, assembly, term (the exact Entrez query used), total (the API's own count), n_returned, truncated, rsids}. truncated is true when total > n_returned — the list is then a prefix in Entrez default order (descending rs number), never a silent truncation. Feed rsIDs (<= 20 at a time) to dbsnp_get_rsids for full records.",
        "input": {
          "type": "object",
          "properties": {
            "chrom": {
              "type": "string",
              "description": "Chromosome 1-22, X, Y or MT ('chr' prefix tolerated)."
            },
            "start": {
              "type": "integer",
              "description": "Window start, 1-based inclusive."
            },
            "stop": {
              "type": "integer",
              "description": "Window end, inclusive; span capped at 1 Mb."
            },
            "assembly": {
              "type": "string",
              "enum": [
                "GRCh38",
                "GRCh37"
              ],
              "default": "GRCh38"
            },
            "max_rsids": {
              "type": "integer",
              "default": 200
            }
          },
          "required": [
            "chrom",
            "start",
            "stop"
          ]
        },
        "required": [
          "chrom",
          "start",
          "stop"
        ],
        "returns": "`{ chrom: str, start: int, stop: int, assembly: str, term: str, total: int, n_returned: int, truncated: bool, rsids: [str] }` — total is esearch's own match count; truncated is true when total > n_returned (rsids is then a capped prefix in descending-rs-number order).",
        "exampleArgs": {
          "chrom": "19",
          "start": 44905000,
          "stop": 44910000,
          "assembly": "GRCh38"
        }
      },
      {
        "id": "mavedb_search_score_sets",
        "connector": "variants",
        "credentialKeys": [],
        "description": "Search public MaveDB multiplexed assays of variant effect (MAVE) score sets by text, such as a gene symbol, protein or assay. No API key or contact email is required. Returns one page with the upstream total when known; functional scores are assay-specific and are not clinical classifications or population frequencies.",
        "input": {
          "type": "object",
          "properties": {
            "text": {
              "type": "string",
              "minLength": 1,
              "maxLength": 1000,
              "pattern": "\\S"
            },
            "offset": {
              "type": "integer",
              "minimum": 0,
              "maximum": 1000000000,
              "default": 0
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            }
          },
          "required": [
            "text"
          ],
          "additionalProperties": false
        },
        "required": [
          "text"
        ],
        "returns": "`{ text, offset, limit, total: number|null, next_offset: number|null, score_sets: [...] }`. Score set records retain upstream fields (urn, title, targetGenes, experiment, numVariants and publication metadata). An empty first page returns total=0. An empty page at offset>0 returns total=null (unknown) and next_offset=null: upstream may report the offset instead of the actual total. No extra count request is made.",
        "exampleArgs": {
          "text": "BRCA1",
          "limit": 20
        }
      },
      {
        "id": "mavedb_get_score_set",
        "connector": "variants",
        "credentialKeys": [],
        "description": "Retrieve a published MaveDB score set by URN, including targets, assay metadata, license, publications and experiment relationships. Includes official full CSV and mapped-variant download URLs for manual download by the user. Read the assay methods and score calibration before interpreting functional effects.",
        "input": {
          "type": "object",
          "properties": {
            "urn": {
              "type": "string",
              "pattern": "^urn:mavedb:[0-9]{8}-(?:[a-z]+|0)-[1-9][0-9]*$"
            }
          },
          "required": [
            "urn"
          ],
          "additionalProperties": false
        },
        "required": [
          "urn"
        ],
        "returns": "`{ urn, score_set: {...}, scores_download_url, mapped_variants_download_url }`. The complete upstream score set is preserved. Unavailable/private resources and HTTP errors propagate as errors.",
        "exampleArgs": {
          "urn": "urn:mavedb:00000003-a-1"
        }
      },
      {
        "id": "mavedb_download_scores",
        "connector": "variants",
        "credentialKeys": [],
        "description": "Download a CSV page of MaveDB variant scores (default 1000 rows, maximum 10000). Uses start/limit, not offset. Returns original CSV text, including all score columns and NA values, for local storage by the caller; this tool does not write a local file. Also returns the unpaginated official download URL for manual download by the user. Use numVariants from mavedb_get_score_set to plan pages; a page is not the full dataset.",
        "input": {
          "type": "object",
          "properties": {
            "urn": {
              "type": "string",
              "pattern": "^urn:mavedb:[0-9]{8}-(?:[a-z]+|0)-[1-9][0-9]*$"
            },
            "start": {
              "type": "integer",
              "minimum": 0,
              "maximum": 1000000000,
              "default": 0
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 10000,
              "default": 1000
            }
          },
          "required": [
            "urn"
          ],
          "additionalProperties": false
        },
        "required": [
          "urn"
        ],
        "returns": "`{ urn, start, limit, format: \"csv\", content: string, url, download_url }`. Content is the unchanged upstream CSV page; start/limit describe the request, not an inferred returned row count. No score normalization or clinical interpretation is performed.",
        "exampleArgs": {
          "urn": "urn:mavedb:00000003-a-1",
          "start": 0,
          "limit": 1000
        }
      },
      {
        "id": "mavedb_get_mapped_variants",
        "connector": "variants",
        "credentialKeys": [],
        "description": "Retrieve existing MaveDB variant mappings for a published score set, including GA4GH VRS preMapped/postMapped objects, reference sequence identifiers, VRS version and mapping errors. This reads mappings already computed by MaveDB; it does not submit variants or perform liftover. The upstream endpoint is unpaginated and the shared 64 MiB response limit applies. For larger datasets, offer the official URL from mavedb_get_score_set for manual download by the user. HTTP 404 can mean no mapping records exist, not only that the score set URN is unavailable. Returned records may include failed mappings.",
        "input": {
          "type": "object",
          "properties": {
            "urn": {
              "type": "string",
              "pattern": "^urn:mavedb:[0-9]{8}-(?:[a-z]+|0)-[1-9][0-9]*$"
            }
          },
          "required": [
            "urn"
          ],
          "additionalProperties": false
        },
        "required": [
          "urn"
        ],
        "returns": "`{ urn, download_url, mapped_variants: [...] }`. All upstream mapping fields, null mappings, current flags and errorMessage values are preserved. HTTP failures are errors, not empty results.",
        "exampleArgs": {
          "urn": "urn:mavedb:00000003-a-1"
        }
      },
      {
        "id": "mavedb_get_experiment",
        "connector": "variants",
        "credentialKeys": [],
        "description": "Retrieve a public MaveDB experiment by experiment URN (without the score set suffix), including methods, publications, experiment set and scoreSetUrns. Supports the special -0 meta-analysis experiment as well as letter-indexed experiments. No authentication is required.",
        "input": {
          "type": "object",
          "properties": {
            "urn": {
              "type": "string",
              "pattern": "^urn:mavedb:[0-9]{8}-(?:[a-z]+|0)$"
            }
          },
          "required": [
            "urn"
          ],
          "additionalProperties": false
        },
        "required": [
          "urn"
        ],
        "returns": "`{ urn, experiment: {...} }` with complete upstream experiment metadata. HTTP errors propagate.",
        "exampleArgs": {
          "urn": "urn:mavedb:00000003-a"
        }
      },
      {
        "id": "mavedb_get_experiment_score_sets",
        "connector": "variants",
        "credentialKeys": [],
        "description": "List the score sets visible to a public reader of a MaveDB experiment. The upstream endpoint filters by visibility and supersession chains, so this is not a complete version history. It returns the selected list without pagination. HTTP 404 can mean no associated score sets are available, not only that the experiment URN is unavailable. Use the returned score set URNs to retrieve functional scores or mappings.",
        "input": {
          "type": "object",
          "properties": {
            "urn": {
              "type": "string",
              "pattern": "^urn:mavedb:[0-9]{8}-(?:[a-z]+|0)$"
            }
          },
          "required": [
            "urn"
          ],
          "additionalProperties": false
        },
        "required": [
          "urn"
        ],
        "returns": "`{ urn, score_sets: [...] }` preserving full records from the upstream visible, supersession-filtered list. HTTP failures, including no-associated-score-sets 404 responses, propagate as errors rather than empty lists.",
        "exampleArgs": {
          "urn": "urn:mavedb:00000003-a"
        }
      }
    ]
  },
  {
    "id": "clinical-trials",
    "displayName": "Clinical Trials",
    "description": "Clinical trials from ClinicalTrials.gov — search, details, sponsors, investigators, endpoints, and eligibility.",
    "useWhen": "Use for ClinicalTrials.gov: search trials by condition/intervention/sponsor/location/status/phase, fetch full details by NCT id, find trials by sponsor, discover investigators and sites, analyze trial endpoints, or find candidate trials by eligibility criteria.",
    "sources": [
      "ClinicalTrials.gov"
    ],
    "termsUrl": "https://clinicaltrials.gov/about-site/terms-conditions",
    "requiresNcbi": false,
    "group": "directory",
    "tools": [
      {
        "id": "search_trials",
        "connector": "clinical-trials",
        "credentialKeys": [],
        "description": "PRIMARY search over ClinicalTrials.gov. Filter by condition, intervention, sponsor, location, status (e.g. [\"RECRUITING\"]), phase ([\"PHASE1\"..\"PHASE4\"]) and study_type. condition/intervention/sponsor/location accept Essie query syntax (boolean AND/OR/NOT, \"quoted phrases\", grouping, automatic synonyms). Page with page_token; set count_total for the total match count. advanced_query merges a raw Essie expression into filter.advanced.",
        "input": {
          "type": "object",
          "properties": {
            "condition": {
              "type": "string"
            },
            "intervention": {
              "type": "string"
            },
            "sponsor": {
              "type": "string"
            },
            "location": {
              "type": "string"
            },
            "status": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "NOT_YET_RECRUITING",
                  "RECRUITING",
                  "ENROLLING_BY_INVITATION",
                  "ACTIVE_NOT_RECRUITING",
                  "COMPLETED",
                  "SUSPENDED",
                  "TERMINATED",
                  "WITHDRAWN",
                  "AVAILABLE",
                  "NO_LONGER_AVAILABLE",
                  "TEMPORARILY_NOT_AVAILABLE",
                  "APPROVED_FOR_MARKETING",
                  "WITHHELD",
                  "UNKNOWN"
                ]
              }
            },
            "phase": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "EARLY_PHASE1",
                  "PHASE1",
                  "PHASE2",
                  "PHASE3",
                  "PHASE4",
                  "NA"
                ]
              }
            },
            "study_type": {
              "type": "string",
              "enum": [
                "INTERVENTIONAL",
                "OBSERVATIONAL",
                "EXPANDED_ACCESS"
              ]
            },
            "advanced_query": {
              "type": "string"
            },
            "page_size": {
              "type": "integer",
              "default": 10,
              "minimum": 1,
              "maximum": 1000
            },
            "page_token": {
              "type": "string"
            },
            "count_total": {
              "type": "boolean",
              "default": false
            }
          }
        },
        "returns": "`{ count, total (only when count_total, else null), next_page_token, items: [ { nct_id, title, status, phase (array|null), conditions, interventions, sponsor, enrollment, start_date, primary_completion_date, locations_count, study_type } ] }`.",
        "exampleArgs": {
          "condition": "lung cancer",
          "status": [
            "RECRUITING"
          ],
          "phase": [
            "PHASE3"
          ],
          "count_total": true,
          "page_size": 10
        }
      },
      {
        "id": "get_trial_details",
        "connector": "clinical-trials",
        "credentialKeys": [],
        "description": "Get comprehensive details for one trial by NCT id (format \"NCT\" + 8 digits; a bare number is prefixed, case-insensitive). Returns full eligibility criteria, study design, primary/secondary/other endpoints, all locations, sponsor and collaborators, dates, enrollment, and a results link.",
        "input": {
          "type": "object",
          "properties": {
            "nct_id": {
              "type": "string"
            }
          },
          "required": [
            "nct_id"
          ]
        },
        "required": [
          "nct_id"
        ],
        "returns": "Found: `{ found: true, trial: { nct_id, title, brief_title, acronym, status, phase, study_type, conditions, interventions, sponsor, collaborators, enrollment, start_date, primary_completion_date, completion_date, brief_summary, detailed_description, eligibility_criteria, minimum_age, maximum_age, sex, healthy_volunteers (\"Yes\"/\"No\"), primary_outcomes, secondary_outcomes, other_outcomes, locations, url, has_results } }`. Missing/invalid id: `{ found: false, nct_id, error }`.",
        "exampleArgs": {
          "nct_id": "NCT03661411"
        }
      },
      {
        "id": "get_trial_results",
        "connector": "clinical-trials",
        "credentialKeys": [],
        "description": "Read posted trial results by NCT id (case-insensitive; bare 8 digits accepted). Returns actual outcome measurements, group-specific counts and denominators, units, statistical analyses, participant flow, baseline characteristics, adverse events and reporting caveats from resultsSection. Nested fields retain the official API camelCase names and hierarchy. Resolve groupId/groupIds only against the groups in the same module or outcome; do not join them to protocol arms or other modules. Missing data does not mean zero events or no treatment effect.",
        "input": {
          "type": "object",
          "properties": {
            "nct_id": {
              "type": "string"
            }
          },
          "required": [
            "nct_id"
          ]
        },
        "required": [
          "nct_id"
        ],
        "returns": "Found: `{ found: true, nct_id, title, url, has_results (API flag; null if unknown), results_section (unaltered API resultsSection; null if absent) }`. results_section may contain participantFlowModule, baselineCharacteristicsModule, outcomeMeasuresModule (outcomeMeasures with type, title, timeFrame, unitOfMeasure, groups, denoms, classes and analyses), adverseEventsModule and moreInfoModule. Preserve analysis populations, dispersion/precision, confidence intervals, p-values and event assessment/time-frame context as reported; values may be strings or nonnumeric. has_results=false means no posted results, not a missing trial. Missing modules remain absent and do not imply zero. Missing/invalid id: `{ found: false, nct_id, error }`.",
        "exampleArgs": {
          "nct_id": "NCT04280705"
        }
      },
      {
        "id": "search_by_sponsor",
        "connector": "clinical-trials",
        "credentialKeys": [],
        "description": "Find trials sponsored by a company or organization (partial name match, e.g. \"Pfizer\" matches \"Pfizer Inc\"). Optionally narrow by condition, phase and status. Set count_total for the total number of trials by the sponsor. Page with page_token.",
        "input": {
          "type": "object",
          "properties": {
            "sponsor_name": {
              "type": "string"
            },
            "condition": {
              "type": "string"
            },
            "phase": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "EARLY_PHASE1",
                  "PHASE1",
                  "PHASE2",
                  "PHASE3",
                  "PHASE4",
                  "NA"
                ]
              }
            },
            "status": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "NOT_YET_RECRUITING",
                  "RECRUITING",
                  "ENROLLING_BY_INVITATION",
                  "ACTIVE_NOT_RECRUITING",
                  "COMPLETED",
                  "SUSPENDED",
                  "TERMINATED",
                  "WITHDRAWN",
                  "AVAILABLE",
                  "NO_LONGER_AVAILABLE",
                  "TEMPORARILY_NOT_AVAILABLE",
                  "APPROVED_FOR_MARKETING",
                  "WITHHELD",
                  "UNKNOWN"
                ]
              }
            },
            "page_size": {
              "type": "integer",
              "default": 10,
              "minimum": 1,
              "maximum": 1000
            },
            "page_token": {
              "type": "string"
            },
            "count_total": {
              "type": "boolean",
              "default": false
            }
          },
          "required": [
            "sponsor_name"
          ]
        },
        "required": [
          "sponsor_name"
        ],
        "returns": "Same shape as search_trials: `{ count, total, next_page_token, items: [ trial summaries ] }`.",
        "exampleArgs": {
          "sponsor_name": "Pfizer",
          "phase": [
            "PHASE3"
          ],
          "count_total": true
        }
      },
      {
        "id": "search_investigators",
        "connector": "clinical-trials",
        "credentialKeys": [],
        "description": "Find principal investigators and research sites by condition, institution, location or investigator_name. institution filters on the site facility and takes precedence over location; investigator_name searches OverallOfficialName and ResponsiblePartyInvestigatorFullName. Returns site contacts (names, roles, affiliations, facilities, cities) with their trial NCT ids. page_size caps how many trials are scanned.",
        "input": {
          "type": "object",
          "properties": {
            "condition": {
              "type": "string"
            },
            "institution": {
              "type": "string"
            },
            "location": {
              "type": "string"
            },
            "investigator_name": {
              "type": "string"
            },
            "status": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "NOT_YET_RECRUITING",
                  "RECRUITING",
                  "ENROLLING_BY_INVITATION",
                  "ACTIVE_NOT_RECRUITING",
                  "COMPLETED",
                  "SUSPENDED",
                  "TERMINATED",
                  "WITHDRAWN",
                  "AVAILABLE",
                  "NO_LONGER_AVAILABLE",
                  "TEMPORARILY_NOT_AVAILABLE",
                  "APPROVED_FOR_MARKETING",
                  "WITHHELD",
                  "UNKNOWN"
                ]
              }
            },
            "page_size": {
              "type": "integer",
              "default": 20,
              "minimum": 1,
              "maximum": 1000
            }
          }
        },
        "returns": "`{ count, trials_analyzed, investigators: [ { name, role, affiliation, facility, location, nct_id, study_title, condition } ] }`. Deduplicated per trial by (name, role, nct_id).",
        "exampleArgs": {
          "condition": "Alzheimer",
          "institution": "Mayo Clinic",
          "page_size": 20
        }
      },
      {
        "id": "analyze_endpoints",
        "connector": "clinical-trials",
        "credentialKeys": [],
        "description": "Analyze primary/secondary/other outcome measures (endpoints). Provide ONLY nct_id (single-trial mode) OR condition (aggregate mode across trials); if both are given, nct_id takes precedence. Aggregate mode may be narrowed by phase and start_date_after (YYYY-MM-DD) and scans up to page_size trials. Returns the endpoint lists plus the most common measure names across the analyzed trials.",
        "input": {
          "type": "object",
          "properties": {
            "nct_id": {
              "type": "string"
            },
            "condition": {
              "type": "string"
            },
            "phase": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "EARLY_PHASE1",
                  "PHASE1",
                  "PHASE2",
                  "PHASE3",
                  "PHASE4",
                  "NA"
                ]
              }
            },
            "start_date_after": {
              "type": "string"
            },
            "page_size": {
              "type": "integer",
              "default": 50,
              "minimum": 1,
              "maximum": 1000
            }
          }
        },
        "returns": "`{ trials_analyzed, nct_id (or null), condition (or null), primary_endpoints, secondary_endpoints, other_endpoints, common_measures: [str] }`. Each endpoint is `{ measure, time_frame, description, type }`; common_measures is the 20 most frequent measure names.",
        "exampleArgs": {
          "nct_id": "NCT03661411"
        }
      },
      {
        "id": "search_by_eligibility",
        "connector": "clinical-trials",
        "credentialKeys": [],
        "description": "Patient-trial matching. DEFAULTS to RECRUITING trials unless status is set. Supply either min_age or max_age for one patient age (\"65 Years\", \"6 Months\"); both trial age bounds are checked. If both are supplied, the trial must admit the entire patient age interval. Missing trial age bounds are unrestricted. sex MALE/FEMALE includes all-comer trials; ALL or omitted sex applies no sex filter. eligibility_keywords searches the inclusion/exclusion criteria text (e.g. \"HbA1c > 8\", \"BRCA mutation\", \"ECOG 0-1\"). At least one of condition, eligibility_keywords, min_age, max_age or sex is required. Page with page_token.",
        "input": {
          "type": "object",
          "properties": {
            "condition": {
              "type": "string"
            },
            "eligibility_keywords": {
              "type": "string"
            },
            "min_age": {
              "type": "string"
            },
            "max_age": {
              "type": "string"
            },
            "sex": {
              "type": "string",
              "enum": [
                "ALL",
                "MALE",
                "FEMALE"
              ]
            },
            "status": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "NOT_YET_RECRUITING",
                  "RECRUITING",
                  "ENROLLING_BY_INVITATION",
                  "ACTIVE_NOT_RECRUITING",
                  "COMPLETED",
                  "SUSPENDED",
                  "TERMINATED",
                  "WITHDRAWN",
                  "AVAILABLE",
                  "NO_LONGER_AVAILABLE",
                  "TEMPORARILY_NOT_AVAILABLE",
                  "APPROVED_FOR_MARKETING",
                  "WITHHELD",
                  "UNKNOWN"
                ]
              }
            },
            "page_size": {
              "type": "integer",
              "default": 10,
              "minimum": 1,
              "maximum": 1000
            },
            "page_token": {
              "type": "string"
            }
          }
        },
        "returns": "Same shape as search_trials, with minimum_age, maximum_age and sex (string|null) added to each summary: `{ count, total (always null — count_total is not exposed here), next_page_token, items: [ trial summaries with eligibility bounds ] }`. Null age bounds mean no registered limit on that side. Review get_trial_details for the full eligibility criteria.",
        "exampleArgs": {
          "condition": "diabetes",
          "min_age": "65 Years",
          "sex": "FEMALE"
        }
      }
    ]
  },
  {
    "id": "clinical-genomics",
    "displayName": "Clinical Genomics",
    "aliases": [
      "DGIdb",
      "ClinGen",
      "CIViC",
      "Open Targets",
      "ClinPGx",
      "pharmacogenomics"
    ],
    "description": "Clinical genomics knowledge bases: DGIdb gene–drug interactions, ClinGen curations, CIViC clinical evidence, the Open Targets Platform, and ClinPGx pharmacogenomics.",
    "useWhen": "Use for DGIdb gene–drug interactions with source evidence, or clinical interpretation of genes, variants, or pharmacogenomics — ClinGen gene-disease validity, dosage sensitivity, clinical actionability, and expert-panel (VCEP) variant pathogenicity classifications; CIViC clinical evidence, assertions, molecular profiles, diseases, and therapies for a gene or variant in cancer; Open Targets target-disease association scores, a disease's known drugs/associated targets, a drug's mechanism of action, and arbitrary Open Targets GraphQL; or ClinPGx drug-gene-variant clinical annotations, dosing guidelines, regulatory labels, variant frequencies, and evidence levels.",
    "sources": [
      "ClinGen",
      "CIViC",
      "Open Targets",
      "ClinPGx",
      "DGIdb"
    ],
    "termsUrl": "https://platform-docs.opentargets.org/licence",
    "requiresNcbi": false,
    "group": "featured",
    "tools": [
      {
        "id": "get_dgidb_gene_drugs",
        "connector": "clinical-genomics",
        "credentialKeys": [],
        "maxResponseBytes": 2000000,
        "description": "Query DGIdb drug–gene interactions by gene name. One matching record per page, with full interaction sources, source versions, licenses, types, attributes and publication evidence. Names can match multiple records; follow next_cursor explicitly.",
        "input": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200,
              "pattern": "\\S"
            },
            "after": {
              "type": "string",
              "minLength": 1,
              "maxLength": 500
            }
          },
          "required": [
            "name"
          ],
          "additionalProperties": false
        },
        "required": [
          "name"
        ],
        "exampleArgs": {
          "name": "BRAF"
        },
        "returns": "{ source: \"DGIdb\", source_url, nodes: [{ name, conceptId, interactions: [{ gene|drug, interactionScore, interactionTypes, interactionAttributes, publications, sources }] }], pageInfo, next_cursor }. Interactions within each node are unpaginated upstream; oversized replies fail explicitly. Aggregated evidence is not clinical advice. Cite DGIdb and individual sources; source-specific reuse terms apply."
      },
      {
        "id": "get_dgidb_drug_genes",
        "connector": "clinical-genomics",
        "credentialKeys": [],
        "maxResponseBytes": 2000000,
        "description": "Query DGIdb drug–gene interactions by drug name. One matching record per page, with full interaction sources, source versions, licenses, types, attributes and publication evidence. Names can match multiple records; follow next_cursor explicitly.",
        "input": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200,
              "pattern": "\\S"
            },
            "after": {
              "type": "string",
              "minLength": 1,
              "maxLength": 500
            }
          },
          "required": [
            "name"
          ],
          "additionalProperties": false
        },
        "required": [
          "name"
        ],
        "exampleArgs": {
          "name": "IMATINIB"
        },
        "returns": "{ source: \"DGIdb\", source_url, nodes: [{ name, conceptId, interactions: [{ gene|drug, interactionScore, interactionTypes, interactionAttributes, publications, sources }] }], pageInfo, next_cursor }. Interactions within each node are unpaginated upstream; oversized replies fail explicitly. Aggregated evidence is not clinical advice. Cite DGIdb and individual sources; source-specific reuse terms apply."
      },
      {
        "id": "clingen_gene_validity",
        "connector": "clinical-genomics",
        "credentialKeys": [],
        "description": "ClinGen gene-disease validity curations (how strong the evidence is that variation in a gene causes a disease: Definitive/Strong/Moderate/Limited/Disputed/Refuted/No Known Disease Relationship). Omit gene to list all 3,600+ curations.",
        "input": {
          "type": "object",
          "properties": {
            "gene": {
              "type": "string"
            }
          }
        },
        "returns": "`{ \"total\": int, \"records\": [ { \"gene_symbol\": str, \"hgnc_id\": str, \"disease_label\": str, \"mondo_id\": str, \"moi\": str, \"sop\": str, \"classification\": str, \"expert_panel\": str, \"affiliate_id\": str, \"animal_model_only\": bool, \"assertion_id\": str } ], \"source\": str }` — records filtered to the gene (exact, case-insensitive) or the full table when gene is omitted.",
        "exampleArgs": {
          "gene": "BRCA2"
        }
      },
      {
        "id": "clingen_dosage_sensitivity",
        "connector": "clinical-genomics",
        "credentialKeys": [],
        "description": "ClinGen dosage sensitivity curations: haploinsufficiency and triplosensitivity assertions for genes (and optionally ISCA genomic/CNV regions). A gene symbol or an ISCA region id filters exactly; omit for the full table.",
        "input": {
          "type": "object",
          "properties": {
            "gene": {
              "type": "string"
            },
            "include_regions": {
              "type": "boolean",
              "default": false
            }
          }
        },
        "returns": "`{ \"total\": int, \"records\": [ { \"record_type\": \"gene\"|\"region\", \"symbol\": str, \"id\": str, \"cytoband\": str, \"grch37\": str, \"grch38\": str, \"haploinsufficiency\": { \"code\": str, \"label\": str }|null, \"triplosensitivity\": {...}|null, \"haplo_disease\": str, \"haplo_mondo\": str, \"triplo_disease\": str, \"triplo_mondo\": str, \"omim\": str, \"morbid\": str } ], \"source\": str }`.",
        "exampleArgs": {
          "gene": "TP53"
        }
      },
      {
        "id": "clingen_actionability",
        "connector": "clinical-genomics",
        "credentialKeys": [],
        "description": "ClinGen clinical actionability curations: for disorders associated with a gene, whether early intervention in pre-symptomatic carriers is actionable (intervention/outcome pairs with severity, likelihood, effectiveness, nature-of-intervention component scores and the total score). Gene filter matches any member of multi-gene topics.",
        "input": {
          "type": "object",
          "properties": {
            "gene": {
              "type": "string"
            },
            "context": {
              "type": "string",
              "enum": [
                "adult",
                "pediatric",
                "both"
              ],
              "default": "both"
            }
          }
        },
        "returns": "`{ \"adult\"?: { \"total\": int, \"records\": [...] }, \"pediatric\"?: { \"total\": int, \"records\": [...] }, \"source\": str }` — one block per requested context; each record has doc_id, genes, disease, outcome, intervention, severity, likelihood, nature_of_intervention, effectiveness, overall_score, release/release_date.",
        "exampleArgs": {
          "gene": "BRCA1",
          "context": "adult"
        }
      },
      {
        "id": "clingen_variant_classifications",
        "connector": "clinical-genomics",
        "credentialKeys": [],
        "description": "ClinGen Evidence Repository (ERepo) expert-panel variant pathogenicity classifications (VCEP interpretations under ACMG criteria). Provide EXACTLY ONE of gene (HGNC symbol), caid (ClinGen canonical allele id, e.g. CA114360), or hgvs (e.g. NM_000277.2:c.1222C>T). Complete retrieval (matchLimit=none).",
        "input": {
          "type": "object",
          "properties": {
            "gene": {
              "type": "string"
            },
            "caid": {
              "type": "string"
            },
            "hgvs": {
              "type": "string"
            }
          }
        },
        "returns": "`{ \"total\": int, \"records\": [ { \"interpretation_id\": str, \"uuid\": str, \"caid\": str, \"clinvar_variation_id\": str, \"gene_symbol\": str, \"gene_ncbi_id\": str, \"condition_id\": str, \"condition_label\": str, \"hgvs\": [str], \"evidence_links\": [str], \"published_date\": str, \"guidelines\": [ { \"guideline\": str, \"guideline_id\": str, \"outcome\": str, \"agents\": [ { \"agent_id\": str, \"affiliation\": str, \"outcome\": str, \"evidence_codes_met\": [str], \"evidence_codes_not_met\": [str] } ] } ] } ], \"query\": { <gene|caid|hgvs>: str }, \"source\": str }`.",
        "exampleArgs": {
          "gene": "BRCA1"
        }
      },
      {
        "id": "civic_search_genes",
        "connector": "clinical-genomics",
        "credentialKeys": [],
        "description": "Find CIViC gene records by exact Entrez symbol (e.g. \"BRAF\"). Fully paginated, count-verified. Use the returned CIViC gene id with civic_gene_variants.",
        "input": {
          "type": "object",
          "properties": {
            "entrez_symbol": {
              "type": "string"
            }
          },
          "required": [
            "entrez_symbol"
          ]
        },
        "required": [
          "entrez_symbol"
        ],
        "returns": "`{ \"total_count\": int, \"pages_fetched\": int, \"records\": [ { \"id\": int, \"name\": str, \"entrezId\": int, \"fullName\": str, \"featureAliases\": [str], \"description\": str, \"link\": str } ], \"query\": { \"mode\": \"search_genes\", \"entrez_symbol\": str } }`.",
        "exampleArgs": {
          "entrez_symbol": "BRAF"
        }
      },
      {
        "id": "civic_gene_variants",
        "connector": "clinical-genomics",
        "credentialKeys": [],
        "description": "All variants of one CIViC gene (by CIViC gene id), fully paginated — complete even for genes with hundreds of variants. Sorted by variant id.",
        "input": {
          "type": "object",
          "properties": {
            "gene_id": {
              "type": "integer"
            }
          },
          "required": [
            "gene_id"
          ]
        },
        "required": [
          "gene_id"
        ],
        "returns": "`{ \"total_count\": int, \"pages_fetched\": int, \"records\": [ { \"id\": int, \"name\": str, \"link\": str, \"variantAliases\": [str], \"variantTypes\": [{ \"id\": int, \"name\": str, \"soid\": str }], \"feature\": { \"id\": int, \"name\": str }, \"singleVariantMolecularProfileId\": int, \"alleleRegistryId\"?: str, \"clinvarIds\"?: [str], \"hgvsDescriptions\"?: [str], \"coordinates\"?: {...} } ], \"query\": {...} }`.",
        "exampleArgs": {
          "gene_id": 5
        }
      },
      {
        "id": "civic_get_variant",
        "connector": "clinical-genomics",
        "credentialKeys": [],
        "description": "One CIViC variant by its CIViC variant id (aliases, variant types, feature/gene linkage, coordinates for gene variants). Returns found=false if absent.",
        "input": {
          "type": "object",
          "properties": {
            "variant_id": {
              "type": "integer"
            }
          },
          "required": [
            "variant_id"
          ]
        },
        "required": [
          "variant_id"
        ],
        "returns": "`{ \"query\": { \"mode\": \"variant\", \"id\": int }, \"found\": bool, \"record\": { \"id\": int, \"name\": str, \"variantTypes\": [...], \"feature\": {...}, \"coordinates\"?: {...}, ... }|null }`.",
        "exampleArgs": {
          "variant_id": 12
        }
      },
      {
        "id": "civic_search_variants",
        "connector": "clinical-genomics",
        "credentialKeys": [],
        "description": "Search CIViC variants by name substring (e.g. \"V600\"), optionally scoped to a CIViC gene id. Fully paginated; sorted by variant id.",
        "input": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string"
            },
            "gene_id": {
              "type": "integer"
            }
          },
          "required": [
            "name"
          ]
        },
        "required": [
          "name"
        ],
        "returns": "`{ \"total_count\": int, \"pages_fetched\": int, \"records\": [ <variant record> ], \"query\": { \"mode\": \"search_variants\", \"name\": str, \"gene_id\": int|null } }`.",
        "exampleArgs": {
          "name": "V600",
          "gene_id": 5
        }
      },
      {
        "id": "civic_get_evidence_item",
        "connector": "clinical-genomics",
        "credentialKeys": [],
        "description": "One CIViC evidence item by id: clinical significance of a molecular profile in a disease/therapy context (evidence level A-E, type, direction, significance, rating, disease, therapies, source). Returns found=false if absent.",
        "input": {
          "type": "object",
          "properties": {
            "evidence_id": {
              "type": "integer"
            }
          },
          "required": [
            "evidence_id"
          ]
        },
        "required": [
          "evidence_id"
        ],
        "returns": "`{ \"query\": { \"mode\": \"evidenceItem\", \"id\": int }, \"found\": bool, \"record\": { \"id\": int, \"evidenceLevel\": str, \"evidenceType\": str, \"evidenceDirection\": str, \"significance\": str, \"evidenceRating\": int, \"disease\": {...}, \"therapies\": [...], \"molecularProfile\": {...}, \"source\": {...}, ... }|null }`.",
        "exampleArgs": {
          "evidence_id": 1409
        }
      },
      {
        "id": "civic_search_evidence",
        "connector": "clinical-genomics",
        "credentialKeys": [],
        "description": "Search CIViC evidence items by any combination of filters; fully paginated, count-verified, sorted by ascending evidence id. Enum filters take CIViC GraphQL enum values verbatim (evidence_level \"A\"..\"E\"; evidence_type PREDICTIVE|PROGNOSTIC|DIAGNOSTIC|PREDISPOSING|ONCOGENIC|FUNCTIONAL; evidence_direction SUPPORTS|DOES_NOT_SUPPORT; status ACCEPTED|SUBMITTED|REJECTED|ALL). Provide at least one filter — no filters walks the entire 10k+ corpus.",
        "input": {
          "type": "object",
          "properties": {
            "disease_name": {
              "type": "string"
            },
            "therapy_name": {
              "type": "string"
            },
            "evidence_level": {
              "type": "string"
            },
            "evidence_type": {
              "type": "string"
            },
            "evidence_direction": {
              "type": "string"
            },
            "significance": {
              "type": "string"
            },
            "variant_origin": {
              "type": "string"
            },
            "evidence_rating": {
              "type": "integer"
            },
            "status": {
              "type": "string"
            },
            "molecular_profile_name": {
              "type": "string"
            },
            "molecular_profile_id": {
              "type": "integer"
            },
            "variant_id": {
              "type": "integer"
            },
            "disease_id": {
              "type": "integer"
            },
            "therapy_id": {
              "type": "integer"
            },
            "phenotype_id": {
              "type": "integer"
            },
            "source_id": {
              "type": "integer"
            },
            "assertion_id": {
              "type": "integer"
            }
          }
        },
        "returns": "`{ \"total_count\": int, \"pages_fetched\": int, \"records\": [ <evidence record> ], \"query\": { \"mode\": \"search_evidence\", \"filters\": {...} } }` — records sorted by ascending evidence id.",
        "exampleArgs": {
          "disease_name": "melanoma",
          "evidence_level": "A"
        }
      },
      {
        "id": "civic_get_assertion",
        "connector": "clinical-genomics",
        "credentialKeys": [],
        "description": "One CIViC assertion by id: an expert-curated summary claim (AMP/ASCO/CAP tier, ACMG/ClinGen codes, FDA companion-test flags) aggregating evidence for a molecular profile in a disease/therapy context. Returns found=false if absent.",
        "input": {
          "type": "object",
          "properties": {
            "assertion_id": {
              "type": "integer"
            }
          },
          "required": [
            "assertion_id"
          ]
        },
        "required": [
          "assertion_id"
        ],
        "returns": "`{ \"query\": { \"mode\": \"assertion\", \"id\": int }, \"found\": bool, \"record\": { \"id\": int, \"assertionType\": str, \"assertionDirection\": str, \"significance\": str, \"ampLevel\": str, \"summary\": str, \"acmgCodes\": [...], \"clingenCodes\": [...], \"disease\": {...}, \"therapies\": [...], \"evidenceItemsCount\": int, ... }|null }`.",
        "exampleArgs": {
          "assertion_id": 7
        }
      },
      {
        "id": "civic_search_assertions",
        "connector": "clinical-genomics",
        "credentialKeys": [],
        "description": "Search CIViC assertions by any combination of filters; fully paginated, count-verified, sorted by ascending assertion id. assertion_type PREDICTIVE|PROGNOSTIC|DIAGNOSTIC|PREDISPOSING|ONCOGENIC; assertion_direction SUPPORTS|DOES_NOT_SUPPORT; amp_level e.g. TIER_I_LEVEL_A; status ACCEPTED|SUBMITTED|REJECTED|ALL. No filters walks the full corpus.",
        "input": {
          "type": "object",
          "properties": {
            "disease_name": {
              "type": "string"
            },
            "therapy_name": {
              "type": "string"
            },
            "assertion_type": {
              "type": "string"
            },
            "assertion_direction": {
              "type": "string"
            },
            "significance": {
              "type": "string"
            },
            "amp_level": {
              "type": "string"
            },
            "status": {
              "type": "string"
            },
            "molecular_profile_name": {
              "type": "string"
            },
            "molecular_profile_id": {
              "type": "integer"
            },
            "variant_id": {
              "type": "integer"
            },
            "variant_name": {
              "type": "string"
            },
            "disease_id": {
              "type": "integer"
            },
            "therapy_id": {
              "type": "integer"
            },
            "phenotype_id": {
              "type": "integer"
            },
            "evidence_id": {
              "type": "integer"
            },
            "summary": {
              "type": "string"
            }
          }
        },
        "returns": "`{ \"total_count\": int, \"pages_fetched\": int, \"records\": [ <assertion record> ], \"query\": { \"mode\": \"search_assertions\", \"filters\": {...} } }` — records sorted by ascending assertion id.",
        "exampleArgs": {
          "disease_name": "melanoma"
        }
      },
      {
        "id": "civic_get_molecular_profile",
        "connector": "clinical-genomics",
        "credentialKeys": [],
        "description": "One CIViC molecular profile by id (variant combination that evidence/assertions attach to), incl. parsed name, score, and component variants. Returns found=false if absent.",
        "input": {
          "type": "object",
          "properties": {
            "mp_id": {
              "type": "integer"
            }
          },
          "required": [
            "mp_id"
          ]
        },
        "required": [
          "mp_id"
        ],
        "returns": "`{ \"query\": { \"mode\": \"molecularProfile\", \"id\": int }, \"found\": bool, \"record\": { \"id\": int, \"name\": str, \"rawName\": str, \"molecularProfileScore\": float, \"isComplex\": bool, \"isMultiVariant\": bool, \"molecularProfileAliases\": [str], \"variants\": [{ \"id\": int, \"name\": str, \"feature\": {...} }], \"evidenceCountsByStatus\": {...} }|null }`.",
        "exampleArgs": {
          "mp_id": 12
        }
      },
      {
        "id": "civic_search_molecular_profiles",
        "connector": "clinical-genomics",
        "credentialKeys": [],
        "description": "Search CIViC molecular profiles by name substring (e.g. \"BRAF V600E\"). Fully paginated; sorted by id.",
        "input": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string"
            }
          },
          "required": [
            "name"
          ]
        },
        "required": [
          "name"
        ],
        "returns": "`{ \"total_count\": int, \"pages_fetched\": int, \"records\": [ <molecular profile record> ], \"query\": { \"mode\": \"search_molecular_profiles\", \"name\": str } }`.",
        "exampleArgs": {
          "name": "BRAF V600E"
        }
      },
      {
        "id": "civic_search_diseases",
        "connector": "clinical-genomics",
        "credentialKeys": [],
        "description": "Search CIViC disease records by name substring (e.g. \"melanoma\"). Returns DOIDs + display names; fully paginated; sorted by id.",
        "input": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string"
            }
          },
          "required": [
            "name"
          ]
        },
        "required": [
          "name"
        ],
        "returns": "`{ \"total_count\": int, \"pages_fetched\": int, \"records\": [ { \"id\": int, \"name\": str, \"displayName\": str, \"doid\": str, \"diseaseUrl\": str, \"diseaseAliases\": [str], \"link\": str } ], \"query\": { \"mode\": \"search_diseases\", \"name\": str } }`.",
        "exampleArgs": {
          "name": "melanoma"
        }
      },
      {
        "id": "civic_search_therapies",
        "connector": "clinical-genomics",
        "credentialKeys": [],
        "description": "Search CIViC therapy records by name substring (e.g. \"vemurafenib\"). Returns NCIt ids + names; fully paginated; sorted by id.",
        "input": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string"
            }
          },
          "required": [
            "name"
          ]
        },
        "required": [
          "name"
        ],
        "returns": "`{ \"total_count\": int, \"pages_fetched\": int, \"records\": [ { \"id\": int, \"name\": str, \"ncitId\": str, \"therapyUrl\": str, \"therapyAliases\": [str], \"link\": str } ], \"query\": { \"mode\": \"search_therapies\", \"name\": str } }`.",
        "exampleArgs": {
          "name": "vemurafenib"
        }
      },
      {
        "id": "open_targets_graphql",
        "connector": "clinical-genomics",
        "credentialKeys": [],
        "description": "Run an arbitrary GraphQL query against the Open Targets Platform API (targets, diseases, drugs, target-disease association scores, evidence, tractability, safety, known drugs). Introspection queries work for schema discovery. Note knownDrugs was renamed to drugAndClinicalCandidates upstream.",
        "input": {
          "type": "object",
          "properties": {
            "query": {
              "type": "string"
            },
            "variables": {
              "type": "object"
            }
          },
          "required": [
            "query"
          ]
        },
        "required": [
          "query"
        ],
        "returns": "`{ \"data\": {...}|null, \"attempts\": int, \"errors\"?: [ { \"message\": str } ] }` — the raw GraphQL data payload; transient HTTP-200 \"Internal server error\" responses are retried up to 3 attempts before being surfaced in errors.",
        "exampleArgs": {
          "query": "query($id: String!){ target(ensemblId: $id){ approvedSymbol associatedDiseases{ count } } }",
          "variables": {
            "id": "ENSG00000157764"
          }
        }
      },
      {
        "id": "open_targets_disease_drugs",
        "connector": "clinical-genomics",
        "credentialKeys": [],
        "description": "Known/investigational drugs for a disease (Open Targets Platform) — wraps Disease.drugAndClinicalCandidates. efo_id is a disease ontology id (EFO/MONDO/etc., e.g. \"MONDO_0004992\").",
        "input": {
          "type": "object",
          "properties": {
            "efo_id": {
              "type": "string"
            },
            "size": {
              "type": "integer",
              "default": 25
            }
          },
          "required": [
            "efo_id"
          ]
        },
        "required": [
          "efo_id"
        ],
        "returns": "`{ \"id\": str, \"name\": str, \"drugAndClinicalCandidates\": { \"count\": int, \"rows\": [ { \"id\": str, \"maxClinicalStage\": str, \"drug\": { \"id\": str, \"name\": str, \"drugType\": str } } ] } }` (rows capped at `size`, default 25), or `{ \"errors\": [...] }` on GraphQL error / unknown id.",
        "exampleArgs": {
          "efo_id": "MONDO_0004992",
          "size": 25
        }
      },
      {
        "id": "open_targets_disease_targets",
        "connector": "clinical-genomics",
        "credentialKeys": [],
        "description": "Top associated targets for a disease, ranked by Open Targets overall association score — wraps Disease.associatedTargets. efo_id is a disease ontology id (EFO/MONDO/etc.).",
        "input": {
          "type": "object",
          "properties": {
            "efo_id": {
              "type": "string"
            },
            "size": {
              "type": "integer",
              "default": 25
            }
          },
          "required": [
            "efo_id"
          ]
        },
        "required": [
          "efo_id"
        ],
        "returns": "`{ \"id\": str, \"name\": str, \"associatedTargets\": { \"count\": int, \"rows\": [ { \"score\": float, \"target\": { \"id\": str, \"approvedSymbol\": str } } ] } }` (up to `size` rows, default 25), or `{ \"errors\": [...] }` on GraphQL error / unknown id.",
        "exampleArgs": {
          "efo_id": "MONDO_0004992",
          "size": 25
        }
      },
      {
        "id": "open_targets_drug",
        "connector": "clinical-genomics",
        "credentialKeys": [],
        "description": "Drug details by ChEMBL id (Open Targets Platform) — name, type, maximum clinical stage, and mechanisms of action (target + action type). chembl_id e.g. \"CHEMBL1201583\".",
        "input": {
          "type": "object",
          "properties": {
            "chembl_id": {
              "type": "string"
            }
          },
          "required": [
            "chembl_id"
          ]
        },
        "required": [
          "chembl_id"
        ],
        "returns": "`{ \"id\": str, \"name\": str, \"drugType\": str, \"maximumClinicalStage\": str, \"mechanismsOfAction\": { \"rows\": [ { \"mechanismOfAction\": str, \"actionType\": str, \"targets\": [ { \"id\": str, \"approvedSymbol\": str } ] } ] } }`, or `{ \"errors\": [...] }` on GraphQL error / unknown id.",
        "exampleArgs": {
          "chembl_id": "CHEMBL1201583"
        }
      },
      {
        "id": "clinpgx_search_chemicals",
        "connector": "clinical-genomics",
        "credentialKeys": [],
        "description": "Resolve ClinPGx drug/chemical records by ClinPGx accession id or name before querying pharmacogenomic annotations.",
        "input": {
          "type": "object",
          "properties": {
            "accessionId": {
              "type": "string",
              "minLength": 1,
              "pattern": "\\S"
            },
            "name": {
              "type": "string",
              "minLength": 1,
              "pattern": "\\S"
            },
            "view": {
              "type": "string",
              "enum": [
                "min",
                "base",
                "max"
              ],
              "default": "base"
            }
          },
          "anyOf": [
            {
              "properties": {
                "accessionId": {}
              },
              "required": [
                "accessionId"
              ]
            },
            {
              "properties": {
                "name": {}
              },
              "required": [
                "name"
              ]
            }
          ],
          "additionalProperties": false
        },
        "returns": "`ClinPGx Chemical` JSON array/object with drug names, identifiers, and cross references.",
        "exampleArgs": {
          "name": "warfarin",
          "view": "max"
        }
      },
      {
        "id": "clinpgx_search_genes",
        "connector": "clinical-genomics",
        "credentialKeys": [],
        "description": "Resolve ClinPGx gene records by ClinPGx accession id or HGNC symbol before querying pharmacogenomic annotations.",
        "input": {
          "type": "object",
          "properties": {
            "accessionId": {
              "type": "string",
              "minLength": 1,
              "pattern": "\\S"
            },
            "symbol": {
              "type": "string",
              "minLength": 1,
              "pattern": "\\S"
            },
            "view": {
              "type": "string",
              "enum": [
                "min",
                "base",
                "max"
              ],
              "default": "base"
            }
          },
          "anyOf": [
            {
              "properties": {
                "accessionId": {}
              },
              "required": [
                "accessionId"
              ]
            },
            {
              "properties": {
                "symbol": {}
              },
              "required": [
                "symbol"
              ]
            }
          ],
          "additionalProperties": false
        },
        "returns": "`ClinPGx Gene` JSON array/object with gene symbols, identifiers, and cross references.",
        "exampleArgs": {
          "symbol": "VKORC1",
          "view": "max"
        }
      },
      {
        "id": "clinpgx_search_summary_annotations",
        "connector": "clinical-genomics",
        "credentialKeys": [],
        "description": "Search ClinPGx clinical annotations linking a drug, gene, and variant. Supports CPIC-style evidence levels 1A, 1B, 2A, 2B, 3, and 4.",
        "input": {
          "type": "object",
          "properties": {
            "id": {
              "type": "string",
              "minLength": 1,
              "pattern": "\\S"
            },
            "relatedChemicals.accessionId": {
              "type": "string",
              "minLength": 1,
              "pattern": "\\S"
            },
            "relatedChemicals.name": {
              "type": "string",
              "minLength": 1,
              "pattern": "\\S"
            },
            "location.genes.symbol": {
              "type": "string",
              "minLength": 1,
              "pattern": "\\S"
            },
            "location.fingerprint": {
              "type": "string",
              "minLength": 1,
              "pattern": "\\S"
            },
            "view": {
              "type": "string",
              "enum": [
                "min",
                "base",
                "max"
              ],
              "default": "base"
            },
            "levelOfEvidence.term": {
              "type": "string",
              "enum": [
                "1A",
                "1B",
                "2A",
                "2B",
                "3",
                "4"
              ]
            }
          },
          "anyOf": [
            {
              "properties": {
                "relatedChemicals.accessionId": {}
              },
              "required": [
                "relatedChemicals.accessionId"
              ]
            },
            {
              "properties": {
                "relatedChemicals.name": {}
              },
              "required": [
                "relatedChemicals.name"
              ]
            },
            {
              "properties": {
                "location.genes.symbol": {}
              },
              "required": [
                "location.genes.symbol"
              ]
            },
            {
              "properties": {
                "location.fingerprint": {}
              },
              "required": [
                "location.fingerprint"
              ]
            },
            {
              "properties": {
                "id": {}
              },
              "required": [
                "id"
              ]
            }
          ],
          "additionalProperties": false
        },
        "returns": "`ClinPGx summaryAnnotation` JSON array/object with drug, gene, variant, phenotype, and level-of-evidence fields.",
        "exampleArgs": {
          "relatedChemicals.name": "warfarin",
          "location.genes.symbol": "VKORC1",
          "levelOfEvidence.term": "1A",
          "view": "max"
        }
      },
      {
        "id": "clinpgx_get_summary_annotation",
        "connector": "clinical-genomics",
        "credentialKeys": [],
        "description": "Retrieve one ClinPGx clinical annotation by its numeric ClinPGx record id, including linked drug, gene, variant, phenotype, and evidence level.",
        "input": {
          "type": "object",
          "properties": {
            "id": {
              "type": "number",
              "minimum": 1
            },
            "view": {
              "type": "string",
              "enum": [
                "min",
                "base",
                "max"
              ],
              "default": "base"
            }
          },
          "required": [
            "id"
          ],
          "additionalProperties": false
        },
        "required": [
          "id"
        ],
        "returns": "`ClinPGx summaryAnnotation` object.",
        "exampleArgs": {
          "id": 655385012,
          "view": "max"
        }
      },
      {
        "id": "clinpgx_search_variant_annotations",
        "connector": "clinical-genomics",
        "credentialKeys": [],
        "description": "Search ClinPGx variant annotations by gene symbol or variant fingerprint (commonly an rsID).",
        "input": {
          "type": "object",
          "properties": {
            "location.genes.symbol": {
              "type": "string",
              "minLength": 1,
              "pattern": "\\S"
            },
            "location.fingerprint": {
              "type": "string",
              "minLength": 1,
              "pattern": "\\S"
            },
            "view": {
              "type": "string",
              "enum": [
                "min",
                "base",
                "max"
              ],
              "default": "base"
            }
          },
          "anyOf": [
            {
              "properties": {
                "location.genes.symbol": {}
              },
              "required": [
                "location.genes.symbol"
              ]
            },
            {
              "properties": {
                "location.fingerprint": {}
              },
              "required": [
                "location.fingerprint"
              ]
            }
          ],
          "additionalProperties": false
        },
        "returns": "`ClinPGx variantAnnotation` JSON array/object with variant-level pharmacogenomic annotations.",
        "exampleArgs": {
          "location.fingerprint": "rs1799853",
          "view": "max"
        }
      },
      {
        "id": "clinpgx_search_guideline_annotations",
        "connector": "clinical-genomics",
        "credentialKeys": [],
        "description": "Search ClinPGx pharmacogenomic dosing guideline annotations from CPIC, DPWG, or PharmGKB/PRO.",
        "input": {
          "type": "object",
          "properties": {
            "source": {
              "type": "string",
              "enum": [
                "cpic",
                "dpwg",
                "pro"
              ]
            },
            "relatedChemicals.accessionId": {
              "type": "string",
              "minLength": 1,
              "pattern": "\\S"
            },
            "relatedGenes.accessionId": {
              "type": "string",
              "minLength": 1,
              "pattern": "\\S"
            },
            "view": {
              "type": "string",
              "enum": [
                "min",
                "base",
                "max"
              ],
              "default": "base"
            }
          },
          "anyOf": [
            {
              "properties": {
                "source": {}
              },
              "required": [
                "source"
              ]
            },
            {
              "properties": {
                "relatedChemicals.accessionId": {}
              },
              "required": [
                "relatedChemicals.accessionId"
              ]
            },
            {
              "properties": {
                "relatedGenes.accessionId": {}
              },
              "required": [
                "relatedGenes.accessionId"
              ]
            }
          ],
          "additionalProperties": false
        },
        "returns": "`ClinPGx guidelineAnnotation` JSON array/object with source, drug, gene, recommendation, and strength fields.",
        "exampleArgs": {
          "source": "cpic",
          "relatedGenes.accessionId": "PA267",
          "view": "max"
        }
      },
      {
        "id": "clinpgx_search_drug_labels",
        "connector": "clinical-genomics",
        "credentialKeys": [],
        "description": "Search ClinPGx regulatory pharmacogenomic drug labels from FDA, EMA, PMDA, or Health Canada.",
        "input": {
          "type": "object",
          "properties": {
            "source": {
              "type": "string",
              "enum": [
                "fda",
                "ema",
                "pmda",
                "hcsc"
              ]
            },
            "relatedChemicals.accessionId": {
              "type": "string",
              "minLength": 1,
              "pattern": "\\S"
            },
            "relatedChemicals.name": {
              "type": "string",
              "minLength": 1,
              "pattern": "\\S"
            },
            "relatedGenes.accessionId": {
              "type": "string",
              "minLength": 1,
              "pattern": "\\S"
            },
            "relatedGenes.symbol": {
              "type": "string",
              "minLength": 1,
              "pattern": "\\S"
            },
            "view": {
              "type": "string",
              "enum": [
                "min",
                "base",
                "max"
              ],
              "default": "base"
            }
          },
          "anyOf": [
            {
              "properties": {
                "source": {}
              },
              "required": [
                "source"
              ]
            },
            {
              "properties": {
                "relatedChemicals.accessionId": {}
              },
              "required": [
                "relatedChemicals.accessionId"
              ]
            },
            {
              "properties": {
                "relatedChemicals.name": {}
              },
              "required": [
                "relatedChemicals.name"
              ]
            },
            {
              "properties": {
                "relatedGenes.accessionId": {}
              },
              "required": [
                "relatedGenes.accessionId"
              ]
            },
            {
              "properties": {
                "relatedGenes.symbol": {}
              },
              "required": [
                "relatedGenes.symbol"
              ]
            }
          ],
          "additionalProperties": false
        },
        "returns": "`ClinPGx label` JSON array/object with regulatory label text and linked drug/gene records.",
        "exampleArgs": {
          "source": "fda",
          "relatedChemicals.name": "clopidogrel",
          "view": "max"
        }
      },
      {
        "id": "clinpgx_search_variants",
        "connector": "clinical-genomics",
        "credentialKeys": [],
        "description": "Resolve ClinPGx pharmacogenomic variants by dbSNP rsID or another variant symbol.",
        "input": {
          "type": "object",
          "properties": {
            "symbol": {
              "type": "string",
              "minLength": 1,
              "pattern": "\\S"
            },
            "view": {
              "type": "string",
              "enum": [
                "min",
                "base",
                "max"
              ],
              "default": "base"
            }
          },
          "required": [
            "symbol"
          ],
          "additionalProperties": false
        },
        "required": [
          "symbol"
        ],
        "returns": "`ClinPGx variant` JSON array/object with variant identifiers, fingerprints, genes, and alleles.",
        "exampleArgs": {
          "symbol": "rs1799853",
          "view": "max"
        }
      },
      {
        "id": "clinpgx_get_variant_frequency",
        "connector": "clinical-genomics",
        "credentialKeys": [],
        "description": "Retrieve population variant frequencies reported by ClinPGx for a variant fingerprint such as an rsID.",
        "input": {
          "type": "object",
          "properties": {
            "fp": {
              "type": "string",
              "minLength": 1,
              "pattern": "\\S"
            }
          },
          "required": [
            "fp"
          ],
          "additionalProperties": false
        },
        "required": [
          "fp"
        ],
        "returns": "`ClinPGx variantFrequency` JSON array of population/resource frequency records.",
        "exampleArgs": {
          "fp": "rs1799853"
        }
      },
      {
        "id": "clinpgx_get_drug_gene_variant",
        "connector": "clinical-genomics",
        "credentialKeys": [],
        "description": "Query a pairwise ClinPGx connection between two objects (for example, a drug and a gene) using the shared connection report; provide one identifier for each object. Use summary annotations for a drug-gene-variant clinical annotation.",
        "input": {
          "type": "object",
          "properties": {
            "object1Id": {
              "type": "string",
              "minLength": 1,
              "pattern": "\\S"
            },
            "object1Name": {
              "type": "string",
              "minLength": 1,
              "pattern": "\\S"
            },
            "object1Type": {
              "type": "string",
              "minLength": 1,
              "pattern": "\\S"
            },
            "object2Id": {
              "type": "string",
              "minLength": 1,
              "pattern": "\\S"
            },
            "object2Name": {
              "type": "string",
              "minLength": 1,
              "pattern": "\\S"
            },
            "object2Type": {
              "type": "string",
              "minLength": 1,
              "pattern": "\\S"
            },
            "view": {
              "type": "string",
              "enum": [
                "min",
                "base",
                "max"
              ],
              "default": "base"
            }
          },
          "allOf": [
            {
              "anyOf": [
                {
                  "properties": {
                    "object1Id": {}
                  },
                  "required": [
                    "object1Id"
                  ]
                },
                {
                  "properties": {
                    "object1Name": {}
                  },
                  "required": [
                    "object1Name"
                  ]
                },
                {
                  "properties": {
                    "object1Type": {}
                  },
                  "required": [
                    "object1Type"
                  ]
                }
              ]
            },
            {
              "anyOf": [
                {
                  "properties": {
                    "object2Id": {}
                  },
                  "required": [
                    "object2Id"
                  ]
                },
                {
                  "properties": {
                    "object2Name": {}
                  },
                  "required": [
                    "object2Name"
                  ]
                },
                {
                  "properties": {
                    "object2Type": {}
                  },
                  "required": [
                    "object2Type"
                  ]
                }
              ]
            }
          ],
          "additionalProperties": false
        },
        "returns": "`ClinPGx connection` JSON array/object containing relationships between two pharmacogenomic objects.",
        "exampleArgs": {
          "object1Name": "warfarin",
          "object1Type": "chemical",
          "object2Name": "VKORC1",
          "object2Type": "gene",
          "view": "max"
        }
      }
    ]
  },
  {
    "id": "structures",
    "displayName": "Structures & Interactions",
    "description": "Structures and molecular interactions — PDB structures and PDBe validation, AlphaFold predictions, EMDB cryo-EM entries, Complex Portal complexes, IntAct interaction networks, and OmniPath directed regulation.",
    "useWhen": "Use when you need a macromolecular 3D structure or a molecular interaction — experimental PDB entries (search, 3D chain similarity, summaries, polymer entities, ligands), PDBe quality summaries and validation statistics with experimental-method context, AlphaFold predicted models, EMDB cryo-EM metadata/validation, curated Complex Portal complexes, IntAct binary interactions and networks, or bounded upstream/downstream signed human protein regulation with OmniPath (query by UniProt accession; mixed-context evidence, not tissue-specific causal proof).",
    "sources": [
      "PDB",
      "PDBe",
      "AlphaFold",
      "EMDB",
      "Complex Portal",
      "IntAct",
      "OmniPath"
    ],
    "termsUrl": "https://www.rcsb.org/pages/usage-policy",
    "requiresNcbi": false,
    "group": "featured",
    "tools": [
      {
        "id": "emdb_get_entries",
        "connector": "structures",
        "credentialKeys": [],
        "description": "Fetch structured metadata records for EMDB cryo-EM 3D map entries. Accepts accessions as 'EMD-1234', 'emd-1234' or '1234'. Each record carries title, structure determination method (singleParticle / helical / tomography / subtomogramAveraging / electronCrystallography), resolution in Angstrom (null for entries with no reported resolution, e.g. raw tomograms) and the resolution method, deposition/release dates, sample and macromolecule/supramolecule names, fitted PDB model IDs (empty list when no model is fitted), primary citation (journal, year, first author, DOI, PMID), map dimensions and voxel size, and status. Obsolete entries report is_obsolete=true plus superseded_by accessions. Unknown accessions come back as {\"emdb_id\", \"error\": \"not_found\"} — never silently dropped. Metadata only; map volumes are never downloaded.",
        "input": {
          "type": "object",
          "properties": {
            "emdb_ids": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          "required": [
            "emdb_ids"
          ]
        },
        "required": [
          "emdb_ids"
        ],
        "returns": "{n_requested, records:[{emdb_id, title, status, is_obsolete, superseded_by, obsolete_date, method, aggregation_state, resolution_angstrom, resolution_method, deposition_date, header_release_date, map_release_date, update_date, sample_name, macromolecule_names, supramolecule_names, fitted_pdb_ids, has_fitted_model, citation:{title, journal, year, published, doi, pmid, first_author, author_count}, map:{file, size_kbytes, dimensions:{col,row,sec}, voxel_size_angstrom:{x,y,z:{value,units}}}} | {emdb_id, error:\"not_found\"}]}.",
        "exampleArgs": {
          "emdb_ids": [
            "EMD-11638",
            "emd-3061",
            "1234"
          ]
        }
      },
      {
        "id": "emdb_search_entries",
        "connector": "structures",
        "credentialKeys": [],
        "description": "Search EMDB with a Solr-style query; complete paged retrieval of compact rows. Query examples: 'title:\"apoferritin\" AND resolution:[0 TO 1.5]', 'structure_determination_method:\"singleParticle\"', 'current_status:\"REL\" AND release_date:[2024-01-01T00:00:00Z TO *]'. Args: query (Solr query string); max_rows (row cap, default 1000). Returns num_found_released (the API's own released-entry count from the facet route — ground truth), rows_retrieved, rows_by_status (REL vs OBS — the search route returns obsolete entries too but they are NOT counted as released), released_complete (true iff every released match was retrieved; false means max_rows truncated the sweep or the counts disagree), and records: compact per-entry rows (emdb_id, title, resolution, structure_determination_method, current_status, release_date, fitted_pdbs) sorted by EMD accession.",
        "input": {
          "type": "object",
          "properties": {
            "query": {
              "type": "string"
            },
            "max_rows": {
              "type": "integer",
              "default": 1000
            }
          },
          "required": [
            "query"
          ]
        },
        "required": [
          "query"
        ],
        "returns": "{query, num_found_released (facet-route released count), rows_retrieved (REL+OBS, deduped), rows_by_status (e.g. {\"OBS\":19,\"REL\":890}), released_complete, records:[{emdb_id, title, resolution, structure_determination_method, fitted_pdbs, current_status, release_date}], max_rows}.",
        "exampleArgs": {
          "query": "title:\"apoferritin\" AND resolution:[0 TO 1.5]",
          "max_rows": 500
        }
      },
      {
        "id": "emdb_get_entry_section",
        "connector": "structures",
        "credentialKeys": [],
        "description": "Fetch one detailed metadata section for EMDB entries. Sections: 'publications' — primary citation with complete ordered author list, auxiliary citations, external references (PMID/DOI/ISSN/CSD); 'map' — file, format, data type, dimensions, voxel spacing, origin, axis order, cell, voxel statistics, contour levels, symmetry; 'sample' — per-macromolecule records (type, molecular weight, copies, EC number, source organism + NCBI taxid, sequence cross-refs) and per-supramolecule records; 'imaging' — microscope, voltage, electron source, detector, dose, imaging modes, defocus range, magnification, Cs, cryogen, grid/buffer/vitrification conditions (one record per microscopy session — entries can carry several). Args: emdb_ids (accession list, any of EMD-1234/emd-1234/1234); section (one of publications/map/sample/imaging). Unknown accessions are reported with \"error\": \"not_found\". Use emdb_get_entries first when you only need the headline record.",
        "input": {
          "type": "object",
          "properties": {
            "emdb_ids": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "section": {
              "type": "string",
              "enum": [
                "publications",
                "map",
                "sample",
                "imaging"
              ]
            }
          },
          "required": [
            "emdb_ids",
            "section"
          ]
        },
        "required": [
          "emdb_ids",
          "section"
        ],
        "returns": "{n_requested, section, records:[<section record> | {emdb_id, error:\"not_found\"}]}. Section record shapes: publications -> {emdb_id, primary_citation, secondary_citations}; map -> {emdb_id, file, format, dimensions, pixel_spacing_angstrom, cell, statistics, contour_levels, space_group, ...}; sample -> {emdb_id, name, macromolecules[...], supramolecules[...]}; imaging -> {emdb_id, method, microscopy[...], specimen_preparations[...]}.",
        "exampleArgs": {
          "emdb_ids": [
            "EMD-11638"
          ],
          "section": "imaging"
        }
      },
      {
        "id": "emdb_get_validation",
        "connector": "structures",
        "credentialKeys": [],
        "description": "Fetch numeric validation-analysis metrics for EMDB entries. Per entry (from the EMDB /analysis route): Q-score, atom inclusion, recommended/predicted/rawmap contour levels, model/mask volumes, model-map ratio, surface metrics — where the validation pipeline has computed them. available_blocks lists every block the validation service returned; sparse payloads (tomograms, model-free or historical entries) yield explicit nulls. Entries with no validation analysis report has_validation_analysis=false — never silently dropped.",
        "input": {
          "type": "object",
          "properties": {
            "emdb_ids": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          "required": [
            "emdb_ids"
          ]
        },
        "required": [
          "emdb_ids"
        ],
        "returns": "{n_requested, records:[{emdb_id, has_validation_analysis, resolution_angstrom, qscore_average, atom_inclusion_average, available_blocks:[...], recommended_contour_level, predicated_contour_level, rawmap_contour_level, model_map_ratio, model_volume, mask_volume, surfaces, surface_ratio, feature_assessment, relion_mask_coverage}]} — scalar blocks are the raw numeric objects or null; unknown accessions get has_validation_analysis=false + error:\"not_found\".",
        "exampleArgs": {
          "emdb_ids": [
            "EMD-11638",
            "EMD-3061"
          ]
        }
      },
      {
        "id": "complexportal_get_complexes",
        "connector": "structures",
        "credentialKeys": [],
        "description": "Fetch curated Complex Portal records by CPX accession. Each record: complex AC, recommended/systematic names + synonyms, species and taxid, participant list with stoichiometry (min/max copies), biological role and interactor type, evidence ECO code, GO annotations, and cross-references — the manually curated description of a stable macromolecular complex. Records come back in input order; unknown accessions are listed in `not_found` rather than silently dropped. For binary interaction *evidence* (who binds whom in which experiment) use the intact_* tools instead.",
        "input": {
          "type": "object",
          "properties": {
            "complex_acs": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          "required": [
            "complex_acs"
          ]
        },
        "required": [
          "complex_acs"
        ],
        "returns": "{n_requested, records:[{complex_ac, intact_ac, name, systematic_name, synonyms:[...], species_name, taxid, predicted_complex, evidence:{eco_code, description, confidence_score}, participants:[{identifier, name, description, interactor_type, interactor_type_mi, biological_role, biological_role_mi, stoichiometry_min, stoichiometry_max, stoichiometry_raw}], go_annotations:[{go_id, aspect, term}], cross_references:[{database, identifier, qualifier, description}], functions:[...], complex_assemblies:[...], release_dates:[...]}], not_found:[...]}. Records preserve the de-duplicated input order.",
        "exampleArgs": {
          "complex_acs": [
            "CPX-2158",
            "CPX-2419"
          ]
        }
      },
      {
        "id": "complexportal_search_by_participant",
        "connector": "structures",
        "credentialKeys": [],
        "description": "Search Complex Portal for complexes containing a molecule. `accession` is a participant accession — UniProt (e.g. 'P04637'), ChEBI, or RNAcentral. With participants_only=true (default) the search is field-qualified (pxref:<accession>) so only complexes that actually contain the molecule as a curated participant are returned; with false the bare accession is matched as free text too (descriptions, names), which over-reports but can catch mentions. All result pages are retrieved and the row count is verified against the service-reported total (total_reported == total_retrieved, or the call fails loudly). Hits are compact records (complex_ac, name, species, interactors) sorted by complex accession; fetch full detail with complexportal_get_complexes.",
        "input": {
          "type": "object",
          "properties": {
            "accession": {
              "type": "string"
            },
            "participants_only": {
              "type": "boolean",
              "default": true
            }
          },
          "required": [
            "accession"
          ]
        },
        "required": [
          "accession"
        ],
        "returns": "{query_accession, solr_query, total_reported, total_retrieved, complexes:[{complex_ac, name, species_name, taxid, predicted_complex, interactors:[{identifier, name, interactor_type, stoichiometry_raw}]}]}. complexes are sorted by CPX accession (numeric); total_reported == total_retrieved is enforced or the call throws.",
        "exampleArgs": {
          "accession": "P69905",
          "participants_only": true
        }
      },
      {
        "id": "intact_fetch_interactions",
        "connector": "structures",
        "credentialKeys": [],
        "description": "Retrieve ALL IntAct binary interactions matching a query, MI-score filtered. `query` is a UniProt accession (e.g. 'P04637'), gene symbol, free text, or any IntAct Solr query. Retrieval is a complete paginated sweep verified against the server-reported total (n_records == total_elements, or the call FAILS LOUDLY — silent truncation is impossible). min_mi_score/max_mi_score filter server-side on the IntAct MI confidence score (0.45 is a common medium-confidence floor); interactor_species filters by species name or taxid (e.g. [\"Homo sapiens\"] or [\"9606\"]). Records are slim and structured: interactor pair (IntAct ACs, database identifiers, molecule names, species/taxids), interaction type, detection method (+MI id), experimental roles, host organism, MI score, PubMed id, first author, source database — sorted by DESCENDING MI score. Output lists at most max_records_returned records (records_truncated=true when the full verified sweep was larger; n_records always reports the true total). Large queries (e.g. CFTR ~10k interactions) take a while — narrow with min_mi_score or species when possible.",
        "input": {
          "type": "object",
          "properties": {
            "query": {
              "type": "string"
            },
            "min_mi_score": {
              "type": "number",
              "default": 0
            },
            "max_mi_score": {
              "type": "number",
              "default": 1
            },
            "interactor_species": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "max_records_returned": {
              "type": "integer",
              "default": 500
            }
          },
          "required": [
            "query"
          ]
        },
        "required": [
          "query"
        ],
        "returns": "`{ query, min_mi_score, max_mi_score, total_elements, n_records, records_truncated, n_records_returned, records: [{ interaction_ac, binary_interaction_id, ac_a, ac_b, id_a, id_b, id_a_database, id_b_database, molecule_a, molecule_b, species_a, species_b, taxid_a, taxid_b, interaction_type, interaction_type_mi, detection_method, detection_method_mi, experimental_role_a, experimental_role_b, host_organism, expansion_method, mi_score, negative, pubmed_id, first_author, source_database }] }`. `n_records` is the true count-verified total; `records` is capped at max_records_returned (records_truncated=true when the sweep was larger), sorted by descending mi_score. `records` is `[]` when nothing matches. Throws when the sweep count fails to verify.",
        "exampleArgs": {
          "query": "P04637",
          "min_mi_score": 0.45,
          "interactor_species": [
            "Homo sapiens"
          ],
          "max_records_returned": 200
        }
      },
      {
        "id": "intact_get_interactor",
        "connector": "structures",
        "credentialKeys": [],
        "description": "Resolve a molecule to its IntAct interactor record(s). `query` is a UniProt accession, gene symbol, or IntAct interactor AC (e.g. 'EBI-7090529'). Returns ALL matching interactor records with an explicit n_matches — a UniProt accession can resolve to the canonical protein plus chain/isoform interactors, and this tool never silently picks one. Each record: interactor_ac, preferred_identifier, name, species, taxid, interactor_type, and the interaction_count seen by IntAct (useful for sizing an intact_fetch_interactions sweep).",
        "input": {
          "type": "object",
          "properties": {
            "query": {
              "type": "string"
            }
          },
          "required": [
            "query"
          ]
        },
        "required": [
          "query"
        ],
        "returns": "`{ query, n_matches, interactors: [{ interactor_ac, preferred_identifier, name, species, taxid, interactor_type, interaction_count }] }` — all matches, sorted by interactor_ac. `interactors` is `[]` and `n_matches` is 0 when nothing resolves.",
        "exampleArgs": {
          "query": "P04637"
        }
      },
      {
        "id": "intact_get_interaction_details",
        "connector": "structures",
        "credentialKeys": [],
        "description": "Full curated detail for ONE IntAct interaction AC (e.g. 'EBI-15635490'). Returns interaction type, host organism, detection method, publication, cross-references, annotations, kinetic/affinity parameters and confidences, plus per-participant records (identifier, species, biological and experimental role, participant detection methods) unless include_participants=false. Get interaction ACs from intact_fetch_interactions records (the interaction_ac field). Unknown ACs return { interaction_ac, error: 'not_found' }.",
        "input": {
          "type": "object",
          "properties": {
            "interaction_ac": {
              "type": "string"
            },
            "include_participants": {
              "type": "boolean",
              "default": true
            }
          },
          "required": [
            "interaction_ac"
          ]
        },
        "required": [
          "interaction_ac"
        ],
        "returns": "`{ interaction_ac, short_label, type: {name, mi}, detection_method: {name, mi}, host_organism, negative, publication: {pubmed_id, title, journal, publication_date, authors}, xrefs: [{database, database_mi, identifier, qualifier}], annotations: [{topic, topic_mi, description}], parameters, confidences, participants?: [{participant_ac, short_label, identifier, identifier_database, description, type, species, taxid, biological_role, experimental_role, detection_methods}], n_participants? }`. Unknown AC -> `{ interaction_ac, error: 'not_found' }`.",
        "exampleArgs": {
          "interaction_ac": "EBI-15635490",
          "include_participants": true
        }
      },
      {
        "id": "intact_build_network",
        "connector": "structures",
        "credentialKeys": [],
        "description": "Build a depth-1 IntAct interaction network around seed proteins. `seed_accessions` are UniProt accessions. Step 1: a complete, count-verified MI-score-filtered interaction sweep per seed. Step 2: the partners of every seed edge plus the seeds form the node set. Step 3: partner-partner edges are only discoverable by querying the partners themselves, so up to max_interactors_expanded partners are queried (most-connected first, ties by identifier) and edges with BOTH endpoints inside the node set are kept. The expansion block reports exactly which partners were / were not expanded (expansion.complete=false means more partner-partner edges may exist). Output: nodes, edges (with MI score, detection method, PubMed id), per-seed sweep stats. Keep seeds few and min_mi_score >= 0.45 — every expansion is a full paginated sweep.",
        "input": {
          "type": "object",
          "properties": {
            "seed_accessions": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "min_mi_score": {
              "type": "number",
              "default": 0.45
            },
            "max_interactors_expanded": {
              "type": "integer",
              "default": 25
            },
            "interactor_species": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          "required": [
            "seed_accessions"
          ]
        },
        "required": [
          "seed_accessions"
        ],
        "returns": "`{ seeds, min_mi_score, n_nodes, nodes: [id...], n_edges, edges: [slim_record + {origin}], seed_sweeps: {seed: {total_elements, n_records}}, expansion: {max_interactors_expanded, n_partners, expanded: [id...], not_expanded: [id...], complete} }`. `nodes` are sorted identifiers; `edges` are sorted by descending mi_score; `expansion.complete=false` means partner-partner edges beyond the cap may exist.",
        "exampleArgs": {
          "seed_accessions": [
            "P04637",
            "Q00987"
          ],
          "min_mi_score": 0.45,
          "max_interactors_expanded": 25
        }
      },
      {
        "connector": "structures",
        "id": "omnipath_query_regulation",
        "credentialKeys": [],
        "maxResponseBytes": 2000000,
        "description": "Query directed, signed human protein regulation from OmniPath. Provide one canonical human UniProt accession (resolve names with the Genes connector first). Partner nodes may be proteins or native COMPLEX: identifiers; never expand complexes into inferred pairwise edges. upstream returns sources regulating the queried target; downstream returns targets regulated by the queried source. Both stimulation and inhibition can be true: preserve conflicting evidence and separate consensus flags. Uses the omnipath dataset and the upstream commercial license filter; original resource terms still apply. Relations and citations aggregate multiple sources and biological contexts, not tissue-specific causal proof. Results use upstream order, not confidence ranking; limited results are not the complete network. No pagination or bulk download.",
        "input": {
          "type": "object",
          "properties": {
            "accession": {
              "type": "string",
              "pattern": "^(?:[OPQ][0-9][A-Z0-9]{3}[0-9]|[A-NR-Z][0-9](?:[A-Z][A-Z0-9]{2}[0-9]){1,2})$"
            },
            "direction": {
              "type": "string",
              "enum": [
                "upstream",
                "downstream"
              ]
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50,
              "default": 10
            }
          },
          "required": [
            "accession",
            "direction"
          ],
          "additionalProperties": false
        },
        "required": [
          "accession",
          "direction"
        ],
        "exampleArgs": {
          "accession": "P00533",
          "direction": "upstream",
          "limit": 10
        },
        "returns": "{ source_url, accession, direction, organism:9606, license_filter:\"commercial\", returned, records_truncated, records }. Each record preserves source/target identifiers (UniProt or native COMPLEX: accessions), gene symbols, direction/sign/consensus booleans, up to 10 source names and 10 source-qualified reference strings, source_count, reference_count and evidence_truncated. Counts describe each edge's upstream evidence, not independent studies. No global result total. Empty records mean no matching curated signed human relations, not biological absence."
      },
      {
        "id": "pdb_search_structures",
        "connector": "structures",
        "credentialKeys": [],
        "description": "Search RCSB PDB entries by attribute filters; paged, capped + flagged. All filters AND together; at least one is required. `text` is a full-text relevance query ('p53 DNA binding domain'); `organism` is an exact source-organism lineage name ('Homo sapiens' — matches at any lineage level, so 'Eukaryota' works too); `taxonomy_id` an NCBI taxid (9606); `uniprot_accession` finds entries whose polymer entities map to that UniProt ('P04637' -> every p53 structure); `experimental_method` is the PDB vocabulary ('X-RAY DIFFRACTION', 'ELECTRON MICROSCOPY', 'SOLUTION NMR', ... — case-insensitive, unknown values error with the full list); `max_resolution_angstrom` keeps entries at or below that resolution; `ligand_comp_id` requires a bound nonpolymer component by chem-comp id ('ZN', 'ATP', 'HEM'). include_computed_models=true adds computed structure models (e.g. AlphaFold) to the default experimental-only results. Returns total_count (the API's own match total — ground truth), n_retrieved, truncated (true iff total_count > n_retrieved; max_rows, 1..1000, caps retrieval), and records [{pdb_id, score}] in relevance order. Identifiers only — chain to pdb_get_structures for metadata.",
        "input": {
          "type": "object",
          "properties": {
            "text": {
              "type": "string"
            },
            "organism": {
              "type": "string"
            },
            "taxonomy_id": {
              "type": "integer"
            },
            "uniprot_accession": {
              "type": "string"
            },
            "experimental_method": {
              "type": "string"
            },
            "max_resolution_angstrom": {
              "type": "number"
            },
            "ligand_comp_id": {
              "type": "string"
            },
            "include_computed_models": {
              "type": "boolean",
              "default": false
            },
            "max_rows": {
              "type": "integer",
              "default": 100
            }
          }
        },
        "returns": "{total_count (API match total), n_retrieved, truncated (total_count > n_retrieved), max_rows, records:[{pdb_id, score}]} in relevance order; records is [] when nothing matches.",
        "exampleArgs": {
          "uniprot_accession": "P04637",
          "experimental_method": "X-RAY DIFFRACTION",
          "max_rows": 50
        }
      },
      {
        "id": "pdb_search_sequence",
        "connector": "structures",
        "credentialKeys": [],
        "description": "Find experimental PDB protein entities from one ungapped protein sequence (25..10000 amino acids, raw or single-record FASTA; whitespace and lowercase accepted). Sequence similarity uses RCSB MMseqs2 sequence identity: identity_cutoff is a fraction 0..1, not a percentage; evalue_cutoff is the maximum E-value. min_query_coverage (0..1) filters each alignment locally using (query_end - query_beg + 1) / input sequence length; a hit needs one alignment meeting the cutoff, and only qualifying alignments are returned. This is sequence coverage, not experimentally resolved residue coverage. Scans at most max_candidates (default 100, max 1000) upstream hits in relevance order, then returns at most max_rows (default 10, max 25) entities with chain IDs and match metrics. total_count is the upstream total BEFORE coverage filtering; n_matched counts qualifying entities only among scanned candidates. truncated means more upstream candidates or qualifying records remain. Increase max_candidates to examine lower-ranked hits. Chain IDs list all deposited copies of the matching entity: asym_ids are label IDs, auth_asym_ids are author IDs. Metadata 404s retain the match with metadata_error=not_found and null chain IDs. Relevance score is not sequence identity. Experimental structures only; chain to pdb_get_structures for entry metadata. No coordinate files are downloaded.",
        "input": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "sequence": {
              "type": "string",
              "minLength": 25,
              "maxLength": 50000
            },
            "identity_cutoff": {
              "type": "number",
              "minimum": 0,
              "maximum": 1,
              "default": 0.3
            },
            "evalue_cutoff": {
              "type": "number",
              "exclusiveMinimum": 0,
              "default": 0.1
            },
            "min_query_coverage": {
              "type": "number",
              "minimum": 0,
              "maximum": 1,
              "default": 0
            },
            "max_candidates": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000,
              "default": 100
            },
            "max_rows": {
              "type": "integer",
              "minimum": 1,
              "maximum": 25,
              "default": 10
            }
          },
          "required": [
            "sequence"
          ]
        },
        "required": [
          "sequence"
        ],
        "returns": "{query_length, identity_cutoff, evalue_cutoff, min_query_coverage, total_count (before coverage filtering), n_scanned, n_matched (within scanned candidates), n_returned, max_candidates, max_rows, truncated, records:[{rcsb_id, pdb_id, entity_id, score, description, asym_ids, auth_asym_ids, sequence_length, matches:[{sequence_identity, evalue, bitscore, alignment_length, mismatches, gaps_opened, query_beg, query_end, subject_beg, subject_end, query_coverage}]}]}. Coordinates are 1-based inclusive. Unavailable optional match metrics are null; unknown coverage never passes a positive cutoff. Malformed required metrics or entity metadata cause an error. metadata_error=\"not_found\" marks missing entity metadata. Empty search returns records:[].",
        "exampleArgs": {
          "sequence": "MTEYKLVVVGAGGVGKSALTIQLIQNHFVDEYDPTIEDSYRKQV",
          "identity_cutoff": 0.9,
          "min_query_coverage": 0.8,
          "max_rows": 10
        }
      },
      {
        "id": "pdb_get_structures",
        "connector": "structures",
        "credentialKeys": [],
        "description": "Fetch entry-level summaries for PDB entries (batch, max 25 ids). Accepts 4-character PDB ids in any case ('1tup' == '1TUP'; duplicates are de-duplicated). Each record: title, experimental methods, resolution in Angstrom (null for methods without one, e.g. NMR), determination methodology (experimental vs computational), deposit/release/revision dates and status, molecular weight (kDa), assembly and entity counts (protein/DNA/RNA polymer + nonpolymer), bound ligand chem-comp ids, polymer/nonpolymer entity id lists (inputs for pdb_get_entities / pdb_get_ligands), and the primary citation (title, journal, year, authors, PubMed id, DOI). Unknown ids come back as {\"pdb_id\", \"error\": \"not_found\"} — never silently dropped. Metadata only; coordinate files are never downloaded.",
        "input": {
          "type": "object",
          "properties": {
            "pdb_ids": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          "required": [
            "pdb_ids"
          ]
        },
        "required": [
          "pdb_ids"
        ],
        "returns": "{n_requested, n_unique, n_blank_skipped, n_duplicate_skipped, records:[{pdb_id, title, experimental_methods, resolution_angstrom, ..., polymer_entity_ids, nonpolymer_entity_ids, citation} | {pdb_id, error:\"not_found\"}]}.",
        "exampleArgs": {
          "pdb_ids": [
            "1TUP",
            "1tup",
            "6XYZ"
          ]
        }
      },
      {
        "id": "pdb_get_entities",
        "connector": "structures",
        "credentialKeys": [],
        "description": "Polymer entity details for one PDB entry, incl. UniProt mappings. With entity_ids=null every polymer entity of the entry is fetched, capped at 25 with truncated=true and n_polymer_entities reporting the entry's true count (large assemblies like ribosomes carry 50+ — get the full id list from pdb_get_structures' polymer_entity_ids and page with explicit subsets like [\"26\", \"27\"]); with an explicit entity_ids subset the entry total is not fetched, so n_polymer_entities is null; an explicit entity_ids list larger than 25 errors. Each record: description, polymer type (Protein / DNA / RNA), sequence length, mutation count, deposited copies, chain ids (asym + author), source organisms with taxids, UniProt accessions with per-entity sequence coverage (SIFTS), and UniProt-aligned regions (entity-seq vs reference-seq coordinates). Unknown entity ids are listed in not_found; an unknown entry id errors. include_sequences=true adds the canonical one-letter sequence per entity; if the combined sequences exceed max_bytes (default 400000) they are omitted and sequences_omitted explains why — metadata always survives.",
        "input": {
          "type": "object",
          "properties": {
            "pdb_id": {
              "type": "string"
            },
            "entity_ids": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "include_sequences": {
              "type": "boolean",
              "default": false
            },
            "max_bytes": {
              "type": "integer",
              "default": 400000
            }
          },
          "required": [
            "pdb_id"
          ]
        },
        "required": [
          "pdb_id"
        ],
        "returns": "{pdb_id, n_polymer_entities (entry total when entity_ids=null, else null), polymer_entity_ids, truncated, records:[{rcsb_id, entity_id, description, polymer_type, sequence_length, source_organisms, uniprot_ids, reference_sequence_identifiers, uniprot_aligned_regions, sequence?}], not_found:[...], sequences_omitted?}.",
        "exampleArgs": {
          "pdb_id": "1TUP",
          "include_sequences": true
        }
      },
      {
        "id": "pdb_get_ligands",
        "connector": "structures",
        "credentialKeys": [],
        "description": "Bound ligands (nonpolymer components) of one PDB entry, with chemistry. Walks the entry's nonpolymer entities and resolves each chemical component: per ligand — entity id, chem-comp id ('ZN', 'ATP'), description, deposited copy count, author chain ids, and a chem_comp block (name, formula, formula weight, formal charge, component type, InChIKey, stereo SMILES). Waters are not nonpolymer entities in the PDB data model and never appear. Entries with no ligands return ligands: []. n_nonpolymer_entities is the entry's true count; truncated=true when it exceeds max_ligands (clamped to 1..25, which bounds the request budget) — never silently dropped. Entities/components the data API no longer serves are reported inline with \"error\": \"not_found\" (partial results, not an aborted call). An unknown entry id errors.",
        "input": {
          "type": "object",
          "properties": {
            "pdb_id": {
              "type": "string"
            },
            "max_ligands": {
              "type": "integer",
              "default": 25
            }
          },
          "required": [
            "pdb_id"
          ]
        },
        "required": [
          "pdb_id"
        ],
        "returns": "{pdb_id, n_nonpolymer_entities (entry total), n_returned, truncated, ligands:[{entity_id, comp_id, description, n_copies_deposited, auth_asym_ids, chem_comp:{name, formula, formula_weight, inchikey, smiles, ...} | {comp_id, error:\"not_found\"} | null} | {entity_id, comp_id:null, error:\"not_found\", chem_comp:null}]}.",
        "exampleArgs": {
          "pdb_id": "1TUP"
        }
      },
      {
        "id": "pdb_search_structure_similarity",
        "connector": "structures",
        "credentialKeys": [],
        "description": "Find experimental PDB protein chains similar in 3D to one deposited PDB chain using the RCSB structure-informed embedding search with global matching, predicted TM-score cutoff 0.8 and 10,000 candidates. Supply a four-character PDB ID and label_asym_id (RCSB/mmCIF chain ID, not the author chain ID; available from pdb_get_entities). Returns top ranked chain identifiers and upstream scores; the query chain may appear among hits. No coordinate upload, structural alignment, RMSD or locally computed TM-score.",
        "input": {
          "type": "object",
          "properties": {
            "pdb_id": {
              "type": "string",
              "pattern": "^[1-9][A-Za-z0-9]{3}$"
            },
            "label_asym_id": {
              "type": "string",
              "minLength": 1,
              "maxLength": 16,
              "pattern": "^[A-Za-z0-9]+$"
            },
            "max_rows": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50,
              "default": 10
            }
          },
          "required": [
            "pdb_id",
            "label_asym_id"
          ],
          "additionalProperties": false
        },
        "required": [
          "pdb_id",
          "label_asym_id"
        ],
        "exampleArgs": {
          "pdb_id": "1CLL",
          "label_asym_id": "A",
          "max_rows": 10
        },
        "totalTimeoutMs": 25000,
        "maxResponseBytes": 500000,
        "returns": "{source, source_url, query:{pdb_id,label_asym_id,similarity_type,ptmscore_cutoff,number_of_candidates}, total_count, n_returned, truncated, score_note, records:[{identifier,pdb_id,label_asym_id,relevance_score,raw_structure_score}]}. Scores are upstream ranking values, not sequence identity or proof of equivalent function. total_count is the upstream hit count within the candidate/score limits, not an exhaustive count of all PDB chains; truncated means additional hits exist. HTTP 204 means no hits; an invalid/unsupported query chain remains an upstream error."
      },
      {
        "connector": "structures",
        "id": "pdbe_get_validation",
        "credentialKeys": [],
        "maxResponseBytes": 100000,
        "totalTimeoutMs": 25000,
        "description": "Get PDBe quality scores and key validation statistics for one experimental PDB entry. Includes the experimental method. Preserve null metrics and unknown experimental-data availability; missing metrics are not zero or evidence of poor quality. Scores are upstream summaries, not a universal ranking across experimental methods. No predicted models or residue-level reports.",
        "input": {
          "type": "object",
          "properties": {
            "pdb_id": {
              "type": "string",
              "pattern": "^[1-9][A-Za-z0-9]{3}$",
              "maxLength": 4
            }
          },
          "required": [
            "pdb_id"
          ],
          "additionalProperties": false
        },
        "required": [
          "pdb_id"
        ],
        "exampleArgs": {
          "pdb_id": "1cbs"
        },
        "returns": "{ source, pdb_id, source_url, entry_found, entry, quality_scores, validation_stats, source_urls }. entry contains title and experimental_method. A confirmed absent entry has entry_found:false and null data; an existing entry can have null quality_scores or validation_stats when that report is unavailable. Preserve upstream score names, nulls, unknown availability and string percentages. Transport and malformed-response errors are not reported as missing data."
      },
      {
        "id": "alphafold_get_prediction",
        "connector": "structures",
        "credentialKeys": [],
        "description": "AlphaFold DB predicted-structure metadata for one UniProt accession. Returns has_model, n_models and per-model records. A single accession can carry several models (canonical + isoforms like 'P04637-9', and community providers beyond the Google DeepMind monomer pipeline — provider_id / tool_used identify them). Each model: entry id, UniProt annotation (id, description, gene, organism, taxid, reviewed flags), sequence coordinates and length, global pLDDT (global_plddt, 0-100) plus the fraction of residues per pLDDT confidence bin (very_low <50, low 50-70, confident 70-90, very_high >90), model version info and creation date, and download URLs (cif/bcif/pdb coordinates, PAE JSON + image, per-residue pLDDT JSON, MSA, AlphaMissense CSV where available) — URLs only, payloads are never downloaded; fetch them yourself if needed. Accessions without a prediction return has_model=false (not an error); malformed identifiers return an explicit `error` field. include_sequence=true adds the model sequence (protein one-letter).",
        "input": {
          "type": "object",
          "properties": {
            "uniprot_accession": {
              "type": "string"
            },
            "include_sequence": {
              "type": "boolean",
              "default": false
            }
          },
          "required": [
            "uniprot_accession"
          ]
        },
        "required": [
          "uniprot_accession"
        ],
        "returns": "`{ uniprot_accession, has_model, n_models, models:[{ model_entity_id, entry_id, provider_id, tool_used, uniprot_accession, uniprot_id, uniprot_description, gene, organism_scientific_name, tax_id, is_uniprot_reviewed, is_reference_proteome, is_complex, sequence_length, uniprot_start, uniprot_end, global_plddt, fraction_plddt:{very_low, low, confident, very_high}, latest_version, all_versions, model_created_date, urls:{cif, bcif, pdb, pae_image, pae_json, plddt_json, msa, alphamissense_csv}, sequence? }] }`. No prediction -> `{ uniprot_accession, has_model:false, n_models:0, models:[] }`; malformed accession -> same shape plus an `error` field. `urls` only carries the keys the API supplied.",
        "exampleArgs": {
          "uniprot_accession": "P04637"
        }
      },
      {
        "id": "alphafold_check_coverage",
        "connector": "structures",
        "credentialKeys": [],
        "description": "Batch AlphaFold DB coverage check (max 40 unique UniProt accessions). Blank entries and duplicates are stripped before the batch cap applies, and disclosed: n_requested == n_unique + n_blank_skipped + n_duplicate_skipped always reconciles. One compact record per unique accession, in input order: has_model, n_models, and the primary (first-listed) model's model_entity_id, latest_version, global_plddt and sequence_length. Accessions with no prediction report has_model=false; malformed ones carry an explicit `error` field — never silently dropped. Use to triage which proteins of a set have usable predicted structures before pulling full records with alphafold_get_prediction.",
        "input": {
          "type": "object",
          "properties": {
            "uniprot_accessions": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          "required": [
            "uniprot_accessions"
          ]
        },
        "required": [
          "uniprot_accessions"
        ],
        "returns": "`{ n_requested, n_unique, n_blank_skipped, n_duplicate_skipped, not_processed:[...], records:[{ uniprot_accession, has_model, n_models?, model_entity_id?, latest_version?, global_plddt?, sequence_length? }] }`. n_requested == n_unique + n_blank_skipped + n_duplicate_skipped. No-prediction records carry `has_model:false`; malformed ones add an `error` field. `not_processed` holds accessions dropped for the per-call time budget.",
        "exampleArgs": {
          "uniprot_accessions": [
            "P04637",
            "P38398",
            "Q9Y6K9"
          ]
        }
      }
    ]
  },
  {
    "id": "chembl",
    "displayName": "ChEMBL",
    "description": "Bioactive compounds, drugs, targets, bioactivity, and mechanisms via the ChEMBL REST API.",
    "useWhen": "Use for ChEMBL medicinal-chemistry data — search compounds by name, ChEMBL id, or molecular structure (similarity/substructure); find drugs by therapeutic indication with approval and withdrawal flags; get calculated molecular properties for drug-likeness assessment; retrieve bioactivity measurements (IC50, Ki, EC50, pChEMBL) for compound-target pairs; look up mechanism of action; or search biological targets by gene symbol, name, organism, or type.",
    "sources": [
      "ChEMBL"
    ],
    "termsUrl": "https://chembl.gitbook.io/chembl-interface-documentation/about",
    "requiresNcbi": false,
    "group": "directory",
    "tools": [
      {
        "id": "compound_search",
        "connector": "chembl",
        "credentialKeys": [],
        "description": "Search ChEMBL chemical compounds by name (default), ChEMBL id, or molecular structure. By name: case-insensitive synonym substring match (falls back to a preferred-name match). By chembl_id: direct record lookup. By smiles: Tanimoto similarity search when similarity_threshold is set, else a substructure search (structure walks are capped and disclose walk_truncated/upstream_total). Optional max_phase filters by clinical stage. Pass at least one of name, chembl_id, or smiles. Use drug_search instead when searching by therapeutic indication.",
        "input": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "name": {
              "type": "string",
              "description": "Compound name or synonym (case-insensitive substring). Primary search criterion."
            },
            "chembl_id": {
              "type": "string",
              "description": "ChEMBL identifier, e.g. 'CHEMBL25' for aspirin."
            },
            "smiles": {
              "type": "string",
              "description": "SMILES structure for similarity/substructure search."
            },
            "similarity_threshold": {
              "type": "integer",
              "minimum": 70,
              "maximum": 100,
              "description": "Similarity cutoff % (70-100). Only with smiles; omit for a substructure search."
            },
            "max_phase": {
              "type": "integer",
              "enum": [
                0,
                1,
                2,
                3,
                4
              ],
              "description": "Filter by clinical phase. 4 = approved."
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000,
              "default": 20
            }
          }
        },
        "returns": "`{ count, total (verified upstream total_count), truncated, compounds: [ { molecule_chembl_id, pref_name, molecule_type, max_phase, first_approval, oral, parenteral, topical, black_box_warning, therapeutic_flag, natural_product, withdrawn_flag, molecule_properties: { alogp, aromatic_rings, full_mwt, hba, hbd, heavy_atoms, psa, rtb, ro3_pass, num_ro5_violations, qed_weighted, molecular_formula, mw_freebase, np_likeness_score, med_chem_friendly, molecular_species }, smiles, inchi, inchi_key, synonyms: [str], chirality, score, atc_classifications, molecule_hierarchy, ... } ] }`. Structure searches may add `walk_truncated` + `upstream_total`.",
        "exampleArgs": {
          "name": "aspirin",
          "limit": 5
        }
      },
      {
        "id": "drug_search",
        "connector": "chembl",
        "credentialKeys": [],
        "description": "Search approved drugs and clinical candidates by therapeutic indication (EFO term, partial match). Joins drug_indication rows to distinct parent molecules, then to molecule records and withdrawal/black-box warnings. only_approved restricts to phase 4. Optional post-filters molecule_chembl_id, drug_name (preferred-name substring), and max_phase (>=) narrow the joined set. Use compound_search for name/id/structure lookups.",
        "input": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "indication": {
              "type": "string",
              "description": "Disease indication, e.g. 'hypertension', 'cancer'. Primary search criterion."
            },
            "drug_name": {
              "type": "string",
              "description": "Filter joined drugs by preferred-name substring."
            },
            "molecule_chembl_id": {
              "type": "string",
              "description": "Filter joined drugs to this parent molecule id."
            },
            "max_phase": {
              "type": "integer",
              "enum": [
                0,
                1,
                2,
                3,
                4
              ],
              "description": "Keep drugs whose max_phase is >= this value."
            },
            "only_approved": {
              "type": "boolean",
              "default": false,
              "description": "Only approved drugs (phase 4)."
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000,
              "default": 20
            }
          },
          "required": [
            "indication"
          ]
        },
        "required": [
          "indication"
        ],
        "returns": "`{ count, total (distinct parents, or filtered count when a post-filter is set), truncated, indication_query: { term, match_field, only_approved }, total_indication_rows, drugs: [ { molecule_chembl_id, pref_name, molecule_type, max_phase, first_approval, oral, parenteral, therapeutic_flag, black_box_warning (0/1), topical (0/1), withdrawn_flag, molecule_properties, molecule_structures, molecule_synonyms, best_phase_for_ind, efo_terms: [str], indication_rows: [drugind_id], warning_summary: [ { warning_type, warning_class, warning_country, warning_year } ], ... } ] }`.",
        "exampleArgs": {
          "indication": "hypertension",
          "only_approved": true,
          "limit": 10
        }
      },
      {
        "id": "get_admet",
        "connector": "chembl",
        "credentialKeys": [],
        "description": "Retrieve ChEMBL calculated molecular properties for drug-likeness / ADMET assessment of one molecule (ALogP, molecular weight, PSA, HBA/HBD, rotatable bonds, aromatic rings, heavy atoms, Rule-of-5 violations, Rule-of-3 pass, QED, molecular formula). These are computed from structure, not experimental measurements.",
        "input": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "molecule_chembl_id": {
              "type": "string",
              "description": "ChEMBL molecule id, e.g. 'CHEMBL941'. Use compound_search first if you only have a name."
            }
          },
          "required": [
            "molecule_chembl_id"
          ]
        },
        "required": [
          "molecule_chembl_id"
        ],
        "returns": "`{ found: bool, properties: { molecule_chembl_id, alogp, molecular_weight, mw_freebase, psa, hba, hbd, rtb, aromatic_rings, heavy_atoms, num_ro5_violations, ro3_pass, qed_weighted, molecular_formula } | null, message? }`. When the id is unknown, `found` is false, `properties` null, and `message` explains.",
        "exampleArgs": {
          "molecule_chembl_id": "CHEMBL25"
        }
      },
      {
        "id": "get_assay",
        "connector": "chembl",
        "credentialKeys": [],
        "description": "Retrieve one ChEMBL assay by assay_chembl_id from a bioactivity record. Returns experimental description, assay type and format, organism, cell/tissue context, assay parameters, assigned target and target-assignment confidence. Confidence describes target assignment, not measurement quality; compare assay conditions before combining IC50/Ki values. Use get_bioactivity with the same assay_chembl_id to retrieve its measurements.",
        "input": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "assay_chembl_id": {
              "type": "string",
              "minLength": 1,
              "pattern": "^CHEMBL[0-9]+$",
              "description": "ChEMBL assay id, e.g. 'CHEMBL1217643'."
            }
          },
          "required": [
            "assay_chembl_id"
          ]
        },
        "required": [
          "assay_chembl_id"
        ],
        "returns": "`{ found: bool, assay: { assay_chembl_id, description, assay_type, assay_type_description, assay_category, assay_test_type, bao_format, bao_label, assay_organism, assay_tax_id, assay_strain, assay_cell_type, cell_chembl_id, assay_tissue, tissue_chembl_id, assay_subcellular_fraction, target_chembl_id, confidence_score, confidence_description, relationship_type, relationship_description, assay_parameters, assay_classifications, variant_sequence, document_chembl_id, src_id, src_assay_id } | null, message? }`. Missing scalar fields are null and missing lists are empty. Unknown IDs return found:false only for a valid empty assay list; request failures and malformed or mismatched responses throw.",
        "exampleArgs": {
          "assay_chembl_id": "CHEMBL1217643"
        }
      },
      {
        "id": "get_bioactivity",
        "connector": "chembl",
        "credentialKeys": [],
        "description": "Retrieve ChEMBL bioactivity measurements (IC50, Ki, Kd, EC50, ...) for compound-target interactions. Filter by molecule_chembl_id, target_chembl_id, and/or assay_chembl_id, activity_type (standard_type), a pChEMBL floor (min_pchembl), a standard_value range (min_value/max_value), and unit (standard_units). Returns one page ordered by activity_id with a page-local most-potent summary. Pass next_offset as offset with the same filters to continue beyond 1,000 records; stop when has_more is false. Use get_assay to inspect experimental context before comparing measurements.",
        "input": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "molecule_chembl_id": {
              "type": "string",
              "description": "ChEMBL molecule id, e.g. 'CHEMBL25'."
            },
            "target_chembl_id": {
              "type": "string",
              "description": "ChEMBL target id, e.g. 'CHEMBL240' (hERG)."
            },
            "assay_chembl_id": {
              "type": "string",
              "minLength": 1,
              "pattern": "^CHEMBL[0-9]+$",
              "description": "Filter measurements by ChEMBL assay id; may be combined with other filters."
            },
            "activity_type": {
              "type": "string",
              "enum": [
                "IC50",
                "EC50",
                "Ki",
                "Kd",
                "AC50",
                "GI50",
                "ED50",
                "Potency"
              ],
              "description": "standard_type to filter on."
            },
            "min_pchembl": {
              "type": "number",
              "minimum": 0,
              "maximum": 14,
              "description": "Minimum pChEMBL value."
            },
            "min_value": {
              "type": "number",
              "description": "Minimum standard_value (in unit)."
            },
            "max_value": {
              "type": "number",
              "description": "Maximum standard_value (in unit)."
            },
            "unit": {
              "type": "string",
              "enum": [
                "nM",
                "uM",
                "mM",
                "pM",
                "M"
              ],
              "description": "standard_units filter."
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000,
              "default": 20
            },
            "offset": {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991,
              "default": 0,
              "description": "Zero-based result offset. Use next_offset from the previous page."
            }
          }
        },
        "returns": "`{ count, total (upstream total_count, or current-page count when total_count is absent; the fallback is not a verified total), truncated (this page contains fewer records than total, including on later pages), offset, limit, has_more, next_offset (null at the end), summary (this page only), activities: [ { activity_id, molecule_chembl_id, target_chembl_id, target_pref_name, standard_type, standard_relation, standard_value, standard_units, pchembl_value, assay_chembl_id, assay_type, ligand_efficiency, document_chembl_id, ... 45 keys } ] }`. Missing continuation evidence or inconsistent pagination metadata throws rather than reporting completion.",
        "exampleArgs": {
          "molecule_chembl_id": "CHEMBL25",
          "activity_type": "IC50",
          "limit": 10
        }
      },
      {
        "id": "get_mechanism",
        "connector": "chembl",
        "credentialKeys": [],
        "description": "Retrieve ChEMBL mechanism-of-action records for approved drugs and clinical candidates. Filter by molecule_chembl_id, target_chembl_id, and/or action_type. When a molecule id yields nothing, retries against the parent molecule so salt-form ids resolve. Returns one page ordered by mec_id with an action-type summary.",
        "input": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "molecule_chembl_id": {
              "type": "string",
              "description": "ChEMBL molecule id, e.g. 'CHEMBL25'."
            },
            "target_chembl_id": {
              "type": "string",
              "description": "ChEMBL target id, e.g. 'CHEMBL1824'."
            },
            "action_type": {
              "type": "string",
              "enum": [
                "INHIBITOR",
                "AGONIST",
                "ANTAGONIST",
                "BLOCKER",
                "MODULATOR",
                "OPENER",
                "ACTIVATOR",
                "POSITIVE ALLOSTERIC MODULATOR",
                "NEGATIVE ALLOSTERIC MODULATOR",
                "PARTIAL AGONIST",
                "INVERSE AGONIST"
              ],
              "description": "Mechanism action type."
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000,
              "default": 20
            }
          }
        },
        "returns": "`{ count, total, truncated, summary, mechanisms: [ { mec_id, molecule_chembl_id, mechanism_of_action, target_chembl_id, action_type, direct_interaction (bool), disease_efficacy (bool), mechanism_comment, binding_site_comment, selectivity_comment, molecular_mechanism, max_phase, parent_molecule_chembl_id, mechanism_refs, ... } ] }`.",
        "exampleArgs": {
          "molecule_chembl_id": "CHEMBL25"
        }
      },
      {
        "id": "target_search",
        "connector": "chembl",
        "credentialKeys": [],
        "description": "Search ChEMBL biological targets (proteins, complexes, families, organisms). Filter by target_chembl_id, gene_symbol (exact component-synonym match), target_name (preferred-name substring), organism (substring), and/or target_type. Each result carries its components with UniProt accessions, a gene_symbol, and bounded cross-reference lists.",
        "input": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "target_name": {
              "type": "string",
              "description": "Target name / partial name, e.g. 'kinase'."
            },
            "gene_symbol": {
              "type": "string",
              "description": "Gene symbol (exact), e.g. 'EGFR', 'BRAF'."
            },
            "target_chembl_id": {
              "type": "string",
              "description": "ChEMBL target id, e.g. 'CHEMBL203'."
            },
            "organism": {
              "type": "string",
              "description": "Organism, e.g. 'Homo sapiens'."
            },
            "target_type": {
              "type": "string",
              "enum": [
                "SINGLE PROTEIN",
                "PROTEIN COMPLEX",
                "PROTEIN FAMILY",
                "ORGANISM",
                "TISSUE",
                "CELL-LINE",
                "NUCLEIC-ACID",
                "SUBCELLULAR"
              ],
              "description": "Target type filter."
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000,
              "default": 20
            }
          }
        },
        "returns": "`{ count, total (verified upstream total_count), truncated, targets: [ { target_chembl_id, pref_name, target_type, organism, tax_id, species_group_flag, cross_references, score, components: [ { component_id, component_type, accession, component_description, gene_symbol, relationship, target_component_xrefs: [ { xref_id, xref_name, xref_src_db, xref_src_url } ], xrefs_truncated_from? } ] } ] }`.",
        "exampleArgs": {
          "gene_symbol": "EGFR",
          "organism": "Homo sapiens",
          "limit": 5
        }
      }
    ]
  },
  {
    "id": "biorxiv",
    "displayName": "bioRxiv",
    "description": "bioRxiv/medRxiv preprints — search by date/category, metadata by DOI, journal-publication links, funder listings, and platform statistics.",
    "useWhen": "Use when working with bioRxiv or medRxiv preprints — searching by date range and category (no keyword search), fetching full metadata for a DOI, finding which preprints were published in journals (optionally by publisher DOI prefix), listing preprints by funder (ROR id), or reporting submission/usage statistics over time.",
    "sources": [
      "bioRxiv",
      "medRxiv",
      "ROR"
    ],
    "termsUrl": "https://www.biorxiv.org/about/FAQ",
    "requiresNcbi": false,
    "group": "directory",
    "tools": [
      {
        "id": "get_categories",
        "connector": "biorxiv",
        "credentialKeys": [],
        "description": "List all 27 bioRxiv subject categories and their API-compatible slugs (e.g. \"cancer biology\" -> \"cancer_biology\"). Use before search_preprints to discover valid category values.",
        "input": {
          "type": "object",
          "properties": {}
        },
        "returns": "`{ \"success\": true, \"categories\": [ { \"name\": str, \"api_format\": str, \"description\": null } ], \"error\": null }` — 27 entries.",
        "exampleArgs": {}
      },
      {
        "id": "search_preprints",
        "connector": "biorxiv",
        "credentialKeys": [],
        "description": "Search bioRxiv/medRxiv preprints by date and (optionally) category. Use exactly ONE search method: date_from+date_to, recent_days (last N days), or recent_count (N most recent within a 90-day window); with none, the last 60 days. There is NO keyword/text search. cursor paginates. Returns DOI, title, authors, date, category, version, and a 200-char abstract preview.",
        "input": {
          "type": "object",
          "properties": {
            "server": {
              "type": "string",
              "enum": [
                "biorxiv",
                "medrxiv"
              ],
              "default": "biorxiv",
              "description": "'biorxiv' (biological sciences) or 'medrxiv' (medical sciences)"
            },
            "category": {
              "type": "string",
              "enum": [
                "animal behavior and cognition",
                "biochemistry",
                "bioengineering",
                "bioinformatics",
                "biophysics",
                "cancer biology",
                "cell biology",
                "clinical trials",
                "developmental biology",
                "ecology",
                "epidemiology",
                "evolutionary biology",
                "genetics",
                "genomics",
                "immunology",
                "microbiology",
                "molecular biology",
                "neuroscience",
                "paleontology",
                "pathology",
                "pharmacology and toxicology",
                "physiology",
                "plant biology",
                "scientific communication and education",
                "synthetic biology",
                "systems biology",
                "zoology"
              ],
              "description": "Subject category to filter by (see get_categories)"
            },
            "date_from": {
              "type": "string",
              "description": "Start date YYYY-MM-DD (use with date_to)"
            },
            "date_to": {
              "type": "string",
              "description": "End date YYYY-MM-DD (use with date_from)"
            },
            "recent_days": {
              "type": "integer",
              "minimum": 1,
              "description": "Preprints from the last N days"
            },
            "recent_count": {
              "type": "integer",
              "minimum": 1,
              "description": "N most recent within a ~90-day window"
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 10
            },
            "cursor": {
              "type": "integer",
              "minimum": 0,
              "default": 0
            }
          }
        },
        "returns": "`{ \"success\": bool, \"results\": [ { \"doi\", \"title\", \"authors\", \"date\", \"category\", \"version\", \"abstract_preview\" } ], \"cursor\": int, \"count\": int, \"total\": int|null, \"error\": null }`. `total` is the window total (null when the route reports none).",
        "exampleArgs": {
          "recent_days": 30,
          "category": "neuroscience",
          "limit": 20
        }
      },
      {
        "id": "get_preprint",
        "connector": "biorxiv",
        "credentialKeys": [],
        "description": "Get complete metadata for one preprint by DOI (bare \"10.1101/...\" or a full https://doi.org/ URL). Uses the latest version. Returns title, authors, corresponding author + institution, full abstract, category, license, version, JATS XML, funding, published journal DOI (if linked), PDF and web URLs, and version count. Preprints are NOT peer-reviewed.",
        "input": {
          "type": "object",
          "properties": {
            "doi": {
              "type": "string",
              "description": "Preprint DOI, e.g. \"10.1101/339747\""
            },
            "server": {
              "type": "string",
              "enum": [
                "biorxiv",
                "medrxiv"
              ],
              "default": "biorxiv",
              "description": "'biorxiv' (biological sciences) or 'medrxiv' (medical sciences)"
            }
          },
          "required": [
            "doi"
          ]
        },
        "returns": "`{ \"success\": bool, \"preprint\": { \"doi\", \"title\", \"authors\", \"author_corresponding\", \"author_corresponding_institution\", \"date\", \"version\", \"type\", \"category\", \"license\", \"abstract\", \"jatsxml\", \"funding\", \"published_doi\", \"server\", \"pdf_url\", \"web_url\", \"n_versions\" }, \"error\": str|null }`. On an unknown DOI: `success:false`, `preprint:null`, `error` set.",
        "exampleArgs": {
          "doi": "10.1101/339747"
        }
      },
      {
        "id": "search_published_preprints",
        "connector": "biorxiv",
        "credentialKeys": [],
        "description": "Find preprints that were later published in peer-reviewed journals (preprint -> journal-article links). Same ONE-OF search methods as search_preprints (date_from+date_to / recent_days / recent_count). include_details=false returns a compact summary. publisher filters by journal DOI prefix (e.g. \"10.1038\" for Nature) via the bioRxiv-only /publisher route.",
        "input": {
          "type": "object",
          "properties": {
            "server": {
              "type": "string",
              "enum": [
                "biorxiv",
                "medrxiv"
              ],
              "default": "biorxiv",
              "description": "'biorxiv' (biological sciences) or 'medrxiv' (medical sciences)"
            },
            "publisher": {
              "type": "string",
              "description": "Publisher DOI prefix, e.g. \"10.1038\" (bioRxiv only)"
            },
            "include_details": {
              "type": "boolean",
              "default": true
            },
            "date_from": {
              "type": "string",
              "description": "Start date YYYY-MM-DD (use with date_to)"
            },
            "date_to": {
              "type": "string",
              "description": "End date YYYY-MM-DD (use with date_from)"
            },
            "recent_days": {
              "type": "integer",
              "minimum": 1
            },
            "recent_count": {
              "type": "integer",
              "minimum": 1
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 10
            },
            "cursor": {
              "type": "integer",
              "minimum": 0,
              "default": 0
            }
          }
        },
        "returns": "`{ \"success\": bool, \"results\": [ { \"biorxiv_doi\", ...link fields } ], \"cursor\": int, \"count\": int, \"total\": int|null, \"error\": null }`. With include_details each result carries every upstream field (published_doi, published_journal, preprint_title, dates, etc.); with include_details=false, only the summary subset.",
        "exampleArgs": {
          "publisher": "10.1038",
          "date_from": "2024-01-01",
          "date_to": "2024-01-05",
          "limit": 10
        }
      },
      {
        "id": "search_by_funder",
        "connector": "biorxiv",
        "credentialKeys": [],
        "description": "Find preprints acknowledging a funder, identified by ROR id (9-char, e.g. \"021nxhr62\" for NIH; a full https://ror.org/ URL is also accepted). Requires an explicit date_from + date_to; funder metadata begins 2025-04-10. Optional category filter. cursor paginates. Same compact result shape as search_preprints.",
        "input": {
          "type": "object",
          "properties": {
            "funder_ror_id": {
              "type": "string",
              "description": "Funder ROR id, e.g. \"021nxhr62\" (NIH)"
            },
            "date_from": {
              "type": "string",
              "description": "Start date YYYY-MM-DD (>= 2025-04-10)"
            },
            "date_to": {
              "type": "string",
              "description": "End date YYYY-MM-DD"
            },
            "server": {
              "type": "string",
              "enum": [
                "biorxiv",
                "medrxiv"
              ],
              "default": "biorxiv",
              "description": "'biorxiv' (biological sciences) or 'medrxiv' (medical sciences)"
            },
            "category": {
              "type": "string",
              "enum": [
                "animal behavior and cognition",
                "biochemistry",
                "bioengineering",
                "bioinformatics",
                "biophysics",
                "cancer biology",
                "cell biology",
                "clinical trials",
                "developmental biology",
                "ecology",
                "epidemiology",
                "evolutionary biology",
                "genetics",
                "genomics",
                "immunology",
                "microbiology",
                "molecular biology",
                "neuroscience",
                "paleontology",
                "pathology",
                "pharmacology and toxicology",
                "physiology",
                "plant biology",
                "scientific communication and education",
                "synthetic biology",
                "systems biology",
                "zoology"
              ],
              "description": "Subject category to filter by (see get_categories)"
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 10
            },
            "cursor": {
              "type": "integer",
              "minimum": 0,
              "default": 0
            }
          },
          "required": [
            "funder_ror_id",
            "date_from",
            "date_to"
          ]
        },
        "returns": "`{ \"success\": bool, \"results\": [ { \"doi\", \"title\", \"authors\", \"date\", \"category\", \"version\", \"abstract_preview\" } ], \"cursor\": int, \"count\": int, \"total\": int|null, \"error\": null }`. The funder route reports no total, so `total` is null when results exist; page with cursor until count < limit.",
        "exampleArgs": {
          "funder_ror_id": "021nxhr62",
          "date_from": "2025-04-10",
          "date_to": "2025-05-10",
          "limit": 10
        }
      },
      {
        "id": "get_content_statistics",
        "connector": "biorxiv",
        "credentialKeys": [],
        "description": "bioRxiv submission statistics over all history — new vs revised paper counts per period, with running cumulative totals. interval is \"monthly\" (default) or \"yearly\".",
        "input": {
          "type": "object",
          "properties": {
            "interval": {
              "type": "string",
              "enum": [
                "monthly",
                "yearly"
              ],
              "default": "monthly"
            }
          }
        },
        "returns": "`{ \"success\": bool, \"results\": [ { \"month\"|\"year\", \"new_papers\", \"new_papers_cumulative\", \"revised_papers\", \"revised_papers_cumulative\" } ], \"error\": null }`. Monthly rows carry \"month\" (YYYY-MM); yearly rows carry \"year\".",
        "exampleArgs": {
          "interval": "yearly"
        }
      },
      {
        "id": "get_usage_statistics",
        "connector": "biorxiv",
        "credentialKeys": [],
        "description": "bioRxiv usage/engagement statistics over all history — abstract views, full-text views, and PDF downloads per period, with running cumulative totals. interval is \"monthly\" (default) or \"yearly\".",
        "input": {
          "type": "object",
          "properties": {
            "interval": {
              "type": "string",
              "enum": [
                "monthly",
                "yearly"
              ],
              "default": "monthly"
            }
          }
        },
        "returns": "`{ \"success\": bool, \"results\": [ { \"month\"|\"year\", \"abstract_views\", \"full_text_views\", \"pdf_downloads\", \"abstract_cumulative\", \"full_text_cumulative\", \"pdf_cumulative\" } ], \"error\": null }`. Monthly rows carry \"month\" (YYYY-MM); yearly rows carry \"year\".",
        "exampleArgs": {
          "interval": "yearly"
        }
      }
    ]
  },
  {
    "id": "drug-regulatory",
    "displayName": "Drug Regulatory",
    "description": "FDA drug applications, labels, adverse-event reports, recalls and corpus statistics via openFDA.",
    "useWhen": "Use when you need FDA drug regulatory and safety data — searching or fetching Drugs@FDA applications (NDA/ANDA/BLA) by brand, generic, ingredient, sponsor, marketing status, or pharmacologic class; aggregate/corpus statistics; generic equivalents of a brand; product label (SPL) sections such as indications and boxed warnings; FAERS adverse-event reports and reaction/drug aggregations; official openFDA bulk drug/event partition discovery, or drug product enforcement and recall reports.",
    "sources": [
      "openFDA"
    ],
    "termsUrl": "https://open.fda.gov/terms/",
    "requiresNcbi": false,
    "group": "featured",
    "tools": [
      {
        "id": "list_faers_bulk_files",
        "connector": "drug-regulatory",
        "credentialKeys": [],
        "description": "Read the official openFDA drug/event bulk JSON partition manifest. Files remain at their official URLs; no file download, local job or analysis database is created. Reports are not incidence estimates.",
        "input": {
          "type": "object",
          "properties": {
            "offset": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100000,
              "default": 0
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200,
              "default": 20
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "exampleArgs": {
          "offset": 0,
          "limit": 5
        },
        "maxResponseBytes": 8000000,
        "returns": "{ source, source_url, retrieved_at, total_files, returned_count, files, offset, next_offset }. Entries retain official size/record metadata. This is openFDA bulk JSON, not quarterly ASCII; deduplication and analysis are separate."
      },
      {
        "id": "search_drug_applications",
        "connector": "drug-regulatory",
        "credentialKeys": [],
        "description": "Search Drugs@FDA applications (NDA/ANDA/BLA) by any combination of exact-phrase filters (brand, generic, active_ingredient, sponsor, marketing_status, dosage_form, route, pharm_class). generic and pharm_class query the harmonized openfda block (absent on older applications, so silently skipped there). A broad search returns the first max_records with the true total and truncated=true; to page beyond ~26,000 records, narrow with submission_date_from/to.",
        "input": {
          "type": "object",
          "properties": {
            "brand": {
              "type": "string"
            },
            "generic": {
              "type": "string"
            },
            "active_ingredient": {
              "type": "string"
            },
            "sponsor": {
              "type": "string"
            },
            "marketing_status": {
              "type": "string",
              "enum": [
                "Prescription",
                "Over-the-counter",
                "Discontinued",
                "None (Tentative Approval)"
              ]
            },
            "dosage_form": {
              "type": "string"
            },
            "route": {
              "type": "string"
            },
            "pharm_class": {
              "type": "string"
            },
            "pharm_class_type": {
              "type": "string",
              "enum": [
                "epc",
                "moa",
                "cs",
                "pe"
              ],
              "description": "Which openFDA pharmacologic-class facet `pharm_class` matches: epc (established pharmacologic class), moa (mechanism of action), cs (chemical/structural class), pe (physiologic effect)."
            },
            "search_type": {
              "type": "string",
              "enum": [
                "and",
                "or"
              ],
              "default": "and",
              "description": "How to combine the mapped filters: \"and\" (default) or \"or\"."
            },
            "submission_date_from": {
              "type": "string",
              "description": "Earliest submission date (inclusive), YYYY-MM-DD; ANDed onto the query."
            },
            "submission_date_to": {
              "type": "string",
              "description": "Latest submission date (inclusive), YYYY-MM-DD; ANDed onto the query."
            },
            "raw_search": {
              "type": "string",
              "description": "Verbatim openFDA Lucene query; when set, overrides every mapped filter above."
            },
            "max_records": {
              "type": "integer",
              "default": 50
            }
          }
        },
        "returns": "`{ total (API meta count), n_returned, truncated, last_updated, records: [ { application_number, sponsor_name, products: [...], submissions: [...], openfda_generic_name, openfda_pharm_class_epc, openfda_pharm_class_moa, openfda_pharm_class_cs, openfda_pharm_class_pe, openfda_substance_name, openfda_route, openfda_manufacturer_name, openfda_product_type } ] }`. `truncated` is true when fewer than `total` records were returned.",
        "exampleArgs": {
          "generic": "ATORVASTATIN CALCIUM",
          "marketing_status": "Prescription",
          "max_records": 25
        }
      },
      {
        "id": "get_drug_application",
        "connector": "drug-regulatory",
        "credentialKeys": [],
        "description": "Fetch one Drugs@FDA application by its number (e.g. \"NDA020702\", \"ANDA076543\", \"BLA125514\"). Returns the full record — sponsor, products (brand, active ingredients + strengths, dosage form, route, marketing status, TE code), complete submissions history, and harmonized openfda fields when present.",
        "input": {
          "type": "object",
          "properties": {
            "application_number": {
              "type": "string"
            }
          },
          "required": [
            "application_number"
          ]
        },
        "required": [
          "application_number"
        ],
        "returns": "`{ application_number, found (bool), record }`. `record` is the full Drugs@FDA application object (sponsor_name, products, submissions, openfda); it is null and `found` false when the number does not exist.",
        "exampleArgs": {
          "application_number": "NDA020702"
        }
      },
      {
        "id": "count_drug_applications",
        "connector": "drug-regulatory",
        "credentialKeys": [],
        "description": "Aggregate Drugs@FDA bucket counts over one field, optionally narrowed by the same filters as search_drug_applications. count_field accepts friendly names (sponsor_name, application_number, dosage_form, route, marketing_status, te_code, pharm_class_epc/moa/cs/pe) or a raw openFDA field path (append .exact yourself for analyzed fields).",
        "input": {
          "type": "object",
          "properties": {
            "count_field": {
              "type": "string",
              "description": "Field to bucket on — a friendly name (sponsor_name, application_number, dosage_form, route, marketing_status, te_code, pharm_class_epc/moa/cs/pe) or a raw openFDA field path."
            },
            "brand": {
              "type": "string"
            },
            "generic": {
              "type": "string"
            },
            "active_ingredient": {
              "type": "string"
            },
            "sponsor": {
              "type": "string"
            },
            "marketing_status": {
              "type": "string"
            },
            "dosage_form": {
              "type": "string"
            },
            "route": {
              "type": "string"
            },
            "pharm_class": {
              "type": "string"
            },
            "pharm_class_type": {
              "type": "string",
              "enum": [
                "epc",
                "moa",
                "cs",
                "pe"
              ],
              "description": "Which openFDA pharmacologic-class facet `pharm_class` matches: epc (established pharmacologic class), moa (mechanism of action), cs (chemical/structural class), pe (physiologic effect)."
            },
            "search_type": {
              "type": "string",
              "enum": [
                "and",
                "or"
              ],
              "default": "and",
              "description": "How to combine the mapped filters: \"and\" (default) or \"or\"."
            },
            "submission_date_from": {
              "type": "string",
              "description": "Earliest submission date (inclusive), YYYY-MM-DD; ANDed onto the query."
            },
            "submission_date_to": {
              "type": "string",
              "description": "Latest submission date (inclusive), YYYY-MM-DD; ANDed onto the query."
            },
            "raw_search": {
              "type": "string",
              "description": "Verbatim openFDA Lucene query; when set, overrides every mapped filter above."
            },
            "max_buckets": {
              "type": "integer",
              "default": 100
            }
          },
          "required": [
            "count_field"
          ]
        },
        "required": [
          "count_field"
        ],
        "returns": "`{ count_field, api_field (resolved openFDA path), n_buckets, bucket_sum, buckets: [ { term, count } ] }` — buckets are descending by count.",
        "exampleArgs": {
          "count_field": "marketing_status"
        }
      },
      {
        "id": "get_drug_statistics",
        "connector": "drug-regulatory",
        "credentialKeys": [],
        "description": "Corpus-level Drugs@FDA statistics in one call — total applications, marketing-status split, top dosage forms and routes (with distinct counts), and top sponsors by application count.",
        "input": {
          "type": "object",
          "properties": {}
        },
        "returns": "`{ total_applications, last_updated, marketing_status: [ { term, count } ], dosage_form_top (top 25), dosage_form_distinct, route_top (top 25), route_distinct, sponsor_top (top 25 by application count) }`.",
        "exampleArgs": {}
      },
      {
        "id": "list_pharmacologic_classes",
        "connector": "drug-regulatory",
        "credentialKeys": [],
        "description": "Enumerate pharmacologic classes with their application counts, counted over the harmonized openfda.pharm_class_<type> block. Counts reflect only applications carrying that block.",
        "input": {
          "type": "object",
          "properties": {
            "class_type": {
              "type": "string",
              "enum": [
                "epc",
                "moa",
                "cs",
                "pe"
              ],
              "default": "epc",
              "description": "Pharmacologic-class facet to enumerate: epc (established pharmacologic class), moa (mechanism of action), cs (chemical/structural class), pe (physiologic effect)."
            },
            "max_buckets": {
              "type": "integer",
              "default": 100
            }
          }
        },
        "returns": "`{ class_type, n_classes, classes: [ { term, count } ] }` — classes descending by count.",
        "exampleArgs": {
          "class_type": "epc",
          "max_buckets": 50
        }
      },
      {
        "id": "get_generic_equivalents",
        "connector": "drug-regulatory",
        "credentialKeys": [],
        "description": "Find generic equivalents of a brand drug: resolve the brand to its reference application(s), extract the exact active-ingredient name set(s), then return every Drugs@FDA application with a product whose active-ingredient set matches (including TE codes and marketing status).",
        "input": {
          "type": "object",
          "properties": {
            "brand": {
              "type": "string"
            }
          },
          "required": [
            "brand"
          ]
        },
        "required": [
          "brand"
        ],
        "returns": "`{ brand, reference_applications: [appnums], active_ingredient_sets: [[names]], equivalents: [ full application records ] }`.",
        "exampleArgs": {
          "brand": "Lipitor"
        }
      },
      {
        "id": "search_drug_labels",
        "connector": "drug-regulatory",
        "credentialKeys": [],
        "description": "Retrieve FDA drug product labels (SPL) by ingredient/name/route with targeted section extraction. Filters (active_ingredient, generic_name, brand_name, route, product_type) hit the openfda label block; set exact to query the non-analyzed .exact variants. Pass sections to extract raw openFDA label sections instead of the default structured record. raw_search is mutually exclusive with the mapped filters.",
        "input": {
          "type": "object",
          "properties": {
            "active_ingredient": {
              "type": "string"
            },
            "generic_name": {
              "type": "string"
            },
            "brand_name": {
              "type": "string"
            },
            "route": {
              "type": "string"
            },
            "product_type": {
              "type": "string",
              "enum": [
                "HUMAN PRESCRIPTION DRUG",
                "HUMAN OTC DRUG"
              ]
            },
            "exact": {
              "type": "boolean",
              "default": false,
              "description": "Query the non-analyzed `.exact` field variants (exact match instead of tokenized)."
            },
            "raw_search": {
              "type": "string",
              "description": "Verbatim openFDA Lucene query; when set, overrides every mapped filter above."
            },
            "sections": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "description": "openFDA label section names to extract (e.g. [\"boxed_warning\", \"warnings\"]); returns raw section text instead of the default structured record."
            },
            "max_records": {
              "type": "integer",
              "default": 25
            }
          }
        },
        "returns": "Default: `{ search, total (API count), n_returned, truncated, records: [ { identification: { set_id, spl_version, effective_time, brand_name, generic_name, substance_name, manufacturer, route, product_type, application_number }, has_boxed_warning, warning_sections: [str], indications_and_usage } ] }`. When `sections` is given, each record is `{ set_id, brand_name, generic_name, sections: { <name>: text } }`.",
        "exampleArgs": {
          "brand_name": "Tylenol",
          "max_records": 5
        }
      },
      {
        "id": "search_drug_adverse_events",
        "connector": "drug-regulatory",
        "credentialKeys": [],
        "description": "Search FAERS reports by reported drug_name (medicinalproduct), harmonized brand/generic/ingredient, reaction, seriousness (1=serious, 2=non-serious), country or initial/latest receipt date. Dates always constrain other filters; raw_search replaces mapped filters but retains dates. Reports can list multiple drugs and reactions and do not establish causation or incidence. Results are capped at 26000; narrow filters for larger cohorts.",
        "input": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "drug_name": {
              "type": "string"
            },
            "brand_name": {
              "type": "string"
            },
            "generic_name": {
              "type": "string"
            },
            "ingredient": {
              "type": "string"
            },
            "reaction": {
              "type": "string"
            },
            "country": {
              "type": "string"
            },
            "serious": {
              "type": "string"
            },
            "received_date_from": {
              "type": "string"
            },
            "received_date_to": {
              "type": "string"
            },
            "receipt_date_from": {
              "type": "string"
            },
            "receipt_date_to": {
              "type": "string"
            },
            "search_type": {
              "type": "string",
              "enum": [
                "and",
                "or"
              ],
              "default": "and"
            },
            "raw_search": {
              "type": "string"
            },
            "sort": {
              "type": "string",
              "description": "openFDA sort expression, e.g. receivedate:desc"
            },
            "max_records": {
              "type": "integer",
              "minimum": 1,
              "maximum": 26000,
              "default": 25
            }
          }
        },
        "returns": "`{ search, total, n_returned, truncated, records: [raw FAERS reports] }` — records are the openFDA adverse-event objects; a 404 zero-hit search returns an empty result.",
        "exampleArgs": {
          "drug_name": "LIPITOR",
          "reaction": "headache",
          "max_records": 10
        }
      },
      {
        "id": "count_drug_adverse_events",
        "connector": "drug-regulatory",
        "credentialKeys": [],
        "description": "Aggregate matching FAERS reports by reaction, drug, outcome, country or receipt date. Counts reflect reports, not incidence or causation; multi-valued buckets overlap and their sum is not a unique report total. Date fields return time/count instead of term/count. raw_search retains date constraints.",
        "input": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "count_field": {
              "type": "string",
              "description": "Friendly field (reaction, drug_name, generic_name, outcome, country, serious, received_date, receipt_date) or a raw openFDA field path."
            },
            "drug_name": {
              "type": "string"
            },
            "brand_name": {
              "type": "string"
            },
            "generic_name": {
              "type": "string"
            },
            "ingredient": {
              "type": "string"
            },
            "reaction": {
              "type": "string"
            },
            "country": {
              "type": "string"
            },
            "serious": {
              "type": "string"
            },
            "received_date_from": {
              "type": "string"
            },
            "received_date_to": {
              "type": "string"
            },
            "receipt_date_from": {
              "type": "string"
            },
            "receipt_date_to": {
              "type": "string"
            },
            "search_type": {
              "type": "string",
              "enum": [
                "and",
                "or"
              ],
              "default": "and"
            },
            "raw_search": {
              "type": "string"
            },
            "max_buckets": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000,
              "default": 100
            }
          },
          "required": [
            "count_field"
          ]
        },
        "required": [
          "count_field"
        ],
        "returns": "`{ count_field, api_field, n_buckets, bucket_sum, buckets: [{ term?, time?, count }] }` — term counts return the top max_buckets, not an exhaustive distribution; dates return a time series. Bucket sums need not equal unique report totals.",
        "exampleArgs": {
          "count_field": "reaction",
          "drug_name": "LIPITOR"
        }
      },
      {
        "id": "search_drug_recalls",
        "connector": "drug-regulatory",
        "credentialKeys": [],
        "description": "Search FDA drug enforcement reports (product recalls) from openFDA by firm, product, recall reason, classification, status, location, or report date.",
        "input": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "recalling_firm": {
              "type": "string"
            },
            "product_description": {
              "type": "string"
            },
            "reason_for_recall": {
              "type": "string"
            },
            "status": {
              "type": "string"
            },
            "classification": {
              "type": "string"
            },
            "city": {
              "type": "string"
            },
            "state": {
              "type": "string"
            },
            "country": {
              "type": "string"
            },
            "report_date_from": {
              "type": "string"
            },
            "report_date_to": {
              "type": "string"
            },
            "search_type": {
              "type": "string",
              "enum": [
                "and",
                "or"
              ],
              "default": "and"
            },
            "raw_search": {
              "type": "string"
            },
            "sort": {
              "type": "string",
              "description": "openFDA sort expression, e.g. report_date:desc"
            },
            "max_records": {
              "type": "integer",
              "minimum": 1,
              "maximum": 26000,
              "default": 25
            }
          }
        },
        "returns": "`{ search, total, n_returned, truncated, records: [raw drug enforcement reports] }` — a 404 zero-hit search returns an empty result.",
        "exampleArgs": {
          "reason_for_recall": "contamination",
          "max_records": 10
        }
      }
    ]
  },
  {
    "id": "human-genetics",
    "displayName": "Human Genetics",
    "description": "Human genetic association evidence — GWAS Catalog, eQTL Catalogue, and PheWeb PheWAS portals (FinnGen, BioBank Japan).",
    "useWhen": "Use when you need human genetic-association evidence — GWAS Catalog associations/studies/traits for a variant, gene or trait; eQTL Catalogue molecular-QTL datasets and associations; or PheWAS scans (variant- or gene-level) from FinnGen and BioBank Japan PheWeb portals.",
    "sources": [
      "GWAS Catalog",
      "eQTL Catalogue",
      "PheWeb"
    ],
    "termsUrl": "https://www.ebi.ac.uk/gwas/docs/about",
    "requiresNcbi": false,
    "group": "featured",
    "tools": [
      {
        "id": "gwas_associations_for_variant",
        "connector": "human-genetics",
        "credentialKeys": [],
        "description": "GWAS Catalog associations reported for one variant (rsID), most significant first. Args: rs_id (dbSNP rsID e.g. rs7412 APOE or rs699 AGT; must be the catalog's current rsID — merged/retired IDs may return zero rows rather than an error); max_records (output cap default 500; trait-hub variants can carry 1000+ associations; rows are server-sorted by p-value ascending, so a capped result is the top-signal prefix). Returns {rs_id, api_total, returned, truncated, associations}. api_total is the catalog's own total; truncated flags a capped fetch. Each association row: {association_id, p_value, pvalue_mantissa, pvalue_exponent, pvalue_description, or_value, beta, ci_lower, ci_upper, range, risk_frequency, snp_effect_alleles, rs_ids, locations, mapped_genes, efo_traits:[{efo_id, efo_trait}], bg_efo_traits, reported_trait, multi_snp_haplotype, snp_interaction, study_accession_id, pubmed_id, first_author}. or_value and beta are mutually exclusive per row (binary vs quantitative); p_value of 0.0 means p < ~1e-308 (use mantissa/exponent).",
        "input": {
          "type": "object",
          "properties": {
            "rs_id": {
              "type": "string",
              "description": "dbSNP rsID, e.g. rs7412"
            },
            "max_records": {
              "type": "integer",
              "default": 500
            }
          },
          "required": [
            "rs_id"
          ]
        },
        "required": [
          "rs_id"
        ],
        "returns": "{rs_id, api_total (page.totalElements), returned, truncated (api_total > returned), associations[]} — each row the shared association shape.",
        "exampleArgs": {
          "rs_id": "rs7412",
          "max_records": 100
        }
      },
      {
        "id": "gwas_associations_for_gene",
        "connector": "human-genetics",
        "credentialKeys": [],
        "description": "GWAS Catalog associations whose variants are MAPPED to a gene (catalog's Ensembl pipeline mapping, not author-reported), most significant first. Args: gene_symbol (HGNC symbol, exact match, e.g. PCSK9, APOE; case-sensitive upstream — pass canonical uppercase; intergenic variants map to flanking genes, so rows may sit outside the gene body); max_records (cap default 500; rows server-sorted by p-value ascending). Returns {gene_symbol, api_total, returned, truncated, associations} with the same row shape as gwas_associations_for_variant. A nonexistent symbol returns api_total=0, not an error.",
        "input": {
          "type": "object",
          "properties": {
            "gene_symbol": {
              "type": "string",
              "description": "HGNC gene symbol, exact match, e.g. PCSK9"
            },
            "max_records": {
              "type": "integer",
              "default": 500
            }
          },
          "required": [
            "gene_symbol"
          ]
        },
        "required": [
          "gene_symbol"
        ],
        "returns": "{gene_symbol, api_total, returned, truncated, associations[]} — the shared association row shape.",
        "exampleArgs": {
          "gene_symbol": "PCSK9",
          "max_records": 100
        }
      },
      {
        "id": "gwas_associations_for_trait",
        "connector": "human-genetics",
        "credentialKeys": [],
        "description": "GWAS Catalog associations annotated to one EFO trait, most significant first. Args: efo_id (ontology term short form as used by the catalog, e.g. MONDO_0005010, EFO_0004340, HP_0003124; the catalog migrated many historical EFO ids to MONDO/HP — resolve current ids with gwas_search_traits first; pass exactly one of efo_id/efo_trait); efo_trait (exact trait LABEL alternative); max_records (cap default 500; rows p-value ascending). Returns {efo_id|efo_trait, api_total, returned, truncated, associations} with the same row shape as gwas_associations_for_variant. An unknown id/label returns api_total=0, not an error.",
        "input": {
          "type": "object",
          "properties": {
            "efo_id": {
              "type": "string",
              "description": "EFO/MONDO/HP short form, e.g. MONDO_0005010"
            },
            "efo_trait": {
              "type": "string",
              "description": "Exact trait label alternative"
            },
            "max_records": {
              "type": "integer",
              "default": 500
            }
          }
        },
        "returns": "{efo_id|efo_trait, api_total, returned, truncated, associations[]} — the shared association row shape.",
        "exampleArgs": {
          "efo_id": "MONDO_0005010",
          "max_records": 100
        }
      },
      {
        "id": "gwas_search_traits",
        "connector": "human-genetics",
        "credentialKeys": [],
        "description": "Search GWAS Catalog EFO trait annotations by label substring — the entry point for resolving a disease/phenotype name to the ontology ids that gwas_associations_for_trait / gwas_search_studies take. Args: query (case-insensitive substring of the trait label, e.g. \"coronary\" matches coronary artery disorder MONDO_0005010 etc.; the catalog mixes EFO, MONDO, HP and OBA ids — don't assume an EFO_ prefix); max_records (cap default 500). Returns {query, api_total, returned, truncated, efo_traits}; each row {efo_id, efo_trait, uri} sorted by label. Count-verified against the catalog's own total when not capped.",
        "input": {
          "type": "object",
          "properties": {
            "query": {
              "type": "string",
              "description": "Trait label substring, e.g. coronary"
            },
            "max_records": {
              "type": "integer",
              "default": 500
            }
          },
          "required": [
            "query"
          ]
        },
        "required": [
          "query"
        ],
        "returns": "{query, api_total, returned, truncated, efo_traits:[{efo_id, efo_trait, uri}]}.",
        "exampleArgs": {
          "query": "coronary",
          "max_records": 50
        }
      },
      {
        "id": "gwas_search_studies",
        "connector": "human-genetics",
        "credentialKeys": [],
        "description": "Search GWAS Catalog studies by trait annotation or publication. Args: efo_id (ontology short form, e.g. MONDO_0005010, resolve via gwas_search_traits; filters combine AND — usually pass one); efo_trait (exact trait label alternative); pubmed_id (PubMed ID of the study's publication, e.g. 38714703); max_records (cap default 500). Returns {filters, api_total, returned, truncated, studies}; each study row {accession_id, disease_trait, efo_traits, bg_efo_traits, pubmed_id, initial_sample_size, replication_sample_size, discovery_ancestry, replication_ancestry, genotyping_technologies, platforms, cohort, full_summary_stats_available, imputed, gxe, gxg}. Count-verified against the catalog total when not capped. At least one filter is required (the unfiltered catalog is ~90k studies).",
        "input": {
          "type": "object",
          "properties": {
            "efo_id": {
              "type": "string",
              "description": "EFO/MONDO/HP short form"
            },
            "efo_trait": {
              "type": "string",
              "description": "Exact trait label"
            },
            "pubmed_id": {
              "type": "string",
              "description": "PubMed ID, e.g. 38714703"
            },
            "max_records": {
              "type": "integer",
              "default": 500
            }
          }
        },
        "returns": "{filters, api_total, returned, truncated, studies[]} — each study the lean study shape.",
        "exampleArgs": {
          "efo_id": "MONDO_0005010",
          "max_records": 50
        }
      },
      {
        "id": "gwas_get_study",
        "connector": "human-genetics",
        "credentialKeys": [],
        "description": "Fetch one GWAS Catalog study by its GCST accession. Args: accession_id (study accession, e.g. GCST90841394; listed in every association row as study_accession_id and in study search results). Returns {found, accession_id, study} where study is the same row shape as gwas_search_studies (null when the accession is unknown).",
        "input": {
          "type": "object",
          "properties": {
            "accession_id": {
              "type": "string",
              "description": "Study accession, e.g. GCST90841394"
            }
          },
          "required": [
            "accession_id"
          ]
        },
        "required": [
          "accession_id"
        ],
        "returns": "{found, accession_id, study} — study is the lean study shape, null when unknown.",
        "exampleArgs": {
          "accession_id": "GCST90841394"
        }
      },
      {
        "id": "gwas_get_variant",
        "connector": "human-genetics",
        "credentialKeys": [],
        "description": "Fetch one GWAS Catalog variant record (position, mapped genes, consequence) by rsID — lighter than pulling its associations. Args: rs_id (dbSNP rsID e.g. rs7412). Returns {found, rs_id, variant}; variant is {rs_id, merged, functional_class, most_severe_consequence, alleles (e.g. \"C/T (forward)\"), mapped_genes, locations:[{chromosome, position, region}], last_update_date} — positions GRCh38 — or null when the rsID is not in the catalog. merged=1 means the rsID was merged into another record upstream.",
        "input": {
          "type": "object",
          "properties": {
            "rs_id": {
              "type": "string",
              "description": "dbSNP rsID, e.g. rs7412"
            }
          },
          "required": [
            "rs_id"
          ]
        },
        "required": [
          "rs_id"
        ],
        "returns": "{found, rs_id, variant} — variant is the lean variant shape, null when not in catalog.",
        "exampleArgs": {
          "rs_id": "rs7412"
        }
      },
      {
        "id": "gwas_get_summary_statistics",
        "connector": "human-genetics",
        "credentialKeys": [],
        "description": "Inspect the complete GWAS Catalog summary-statistics package for one GCST accession without downloading the potentially huge data files. Returns found=false when the accession has no FTP directory; otherwise returns the HTTPS FTP directory, original and harmonised file listings, parsed -meta.yaml records, the genome assemblies and harmonisation references declared by those records, and the current GWAS-SSF standard column definitions. The column definitions describe the standard, not an observed header from a compressed data file. Use the returned file URLs to download a selected full dataset. Args: accession_id (GCST accession, e.g. GCST90000123); metadata_file (optional exact YAML filename to limit metadata parsing and both reference summaries; the file listing remains complete). The FTP directory is derived from the accession’s thousand-study bucket; malformed YAML or an unreadable existing directory remains an upstream error.",
        "input": {
          "type": "object",
          "properties": {
            "accession_id": {
              "type": "string",
              "description": "GWAS Catalog accession, e.g. GCST90000123"
            },
            "metadata_file": {
              "type": "string",
              "minLength": 1,
              "description": "Optional exact YAML filename from the directory listing. Restricts metadata and both reference summaries to matching records; files remains the complete listing."
            }
          },
          "required": [
            "accession_id"
          ]
        },
        "required": [
          "accession_id"
        ],
        "returns": "{found, accession_id, directory_url, files[], metadata[], reference_genomes[], harmonisation_references[], column_definitions[], column_definitions_source} — found=false means no FTP directory exists: files, metadata, reference_genomes and harmonisation_references are empty, while column_definitions and column_definitions_source are retained. Otherwise files include scope (original|harmonised), kind, name and URL; metadata contains parsed YAML objects, and both reference summaries are derived only from those returned records. Each alternative_group in the standard column definitions requires at least one member, although individual members have required=false.",
        "exampleArgs": {
          "accession_id": "GCST90000123"
        }
      },
      {
        "id": "eqtl_list_datasets",
        "connector": "human-genetics",
        "credentialKeys": [],
        "description": "List eQTL Catalogue datasets (one dataset = one study x tissue/cell type x quantification method). Args: study_label (exact study name, e.g. GTEx, Alasoo_2018, BLUEPRINT); tissue_label (exact tissue/cell-type label, e.g. liver, macrophage, LCL — lowercase in the catalogue); quant_method (ge=gene expression, exon, tx, txrev, microarray, leafcutter, aptamer=plasma protein; for conventional gene-level eQTLs use ge); max_records (cap default 1000; the full unfiltered catalogue is ~760 datasets). Returns {filters, returned, truncated, datasets} sorted by dataset_id; each {dataset_id (QTD...), study_id (QTS...), study_label, sample_group, tissue_id, tissue_label, condition_label, quant_method, sample_size}. The API publishes no total count; truncated=false proves the listing is complete.",
        "input": {
          "type": "object",
          "properties": {
            "study_label": {
              "type": "string"
            },
            "tissue_label": {
              "type": "string"
            },
            "quant_method": {
              "type": "string"
            },
            "max_records": {
              "type": "integer",
              "default": 1000
            }
          }
        },
        "returns": "{filters (applied filter object), returned, truncated (returned == cap; a short page proves the listing complete), datasets:[{dataset_id, study_id, study_label, sample_group, tissue_id, tissue_label, condition_label, quant_method, sample_size}]} sorted by dataset_id.",
        "exampleArgs": {
          "study_label": "Alasoo_2018",
          "quant_method": "ge"
        }
      },
      {
        "id": "eqtl_associations",
        "connector": "human-genetics",
        "credentialKeys": [],
        "description": "Molecular-QTL association rows from one eQTL Catalogue dataset, filtered by gene, variant or region. Args: dataset_id (QTD accession from eqtl_list_datasets, e.g. QTD000266); gene_id (unversioned Ensembl gene ID e.g. ENSG00000130203 APOE; at least one of gene_id/rsid/variant/pos is required); rsid (dbSNP rsID); variant (eQTL Catalogue variant string chr19_44908822_C_T, chr-prefixed underscore GRCh38); pos (genomic window chromosome:start-end GRCh38 no chr prefix, e.g. 19:44900000-44920000); nlog10p_min (significance floor: only rows with -log10(p) >= this, applied upstream); max_records (cap default 1000 = one page). Returns {dataset_id, filters, returned, truncated, associations}; each row {molecular_trait_id, gene_id, variant, rsid, chromosome, position, ref, alt, type, beta, se, pvalue, nlog10p, maf, ac, an, r2, median_tpm}. Rows cover ONLY the cis window the dataset tested (±1 Mb of each gene); empty means \"not tested / not present\". No total count is published: truncated=false proves exhaustion, truncated=true means the cap was hit.",
        "input": {
          "type": "object",
          "properties": {
            "dataset_id": {
              "type": "string"
            },
            "gene_id": {
              "type": "string"
            },
            "rsid": {
              "type": "string"
            },
            "variant": {
              "type": "string"
            },
            "pos": {
              "type": "string"
            },
            "nlog10p_min": {
              "type": "number"
            },
            "max_records": {
              "type": "integer",
              "default": 1000
            }
          },
          "required": [
            "dataset_id"
          ]
        },
        "required": [
          "dataset_id"
        ],
        "returns": "{dataset_id, filters (applied filter object incl. nlog10p_min), returned, truncated (returned == cap), associations:[{molecular_trait_id, gene_id, variant, rsid, chromosome, position, ref, alt, type, beta, se, pvalue, nlog10p, maf, ac, an, r2, median_tpm}]}.",
        "exampleArgs": {
          "dataset_id": "QTD000266",
          "gene_id": "ENSG00000130203",
          "nlog10p_min": 2
        }
      },
      {
        "id": "phewas_instances",
        "connector": "human-genetics",
        "credentialKeys": [],
        "description": "List the public PheWeb PheWAS portals this server can query, with genome build and capability registry. Returns {instances:{key:{label, base_url, genome_build, capabilities, notes}}}. capabilities name the endpoints each instance exposes: variant (phewas_variant), gene (phewas_finngen_gene), phenotypes (phewas_list_phenotypes), autocomplete (phewas_search_phenotypes). NOTE the build split: FinnGen R12 variant IDs are GRCh38; BioBank Japan (pheweb.jp) is GRCh37/hg19 — liftover coordinates before cross-querying.",
        "input": {
          "type": "object",
          "properties": {}
        },
        "returns": "{instances:{key:{label, base_url, genome_build, capabilities, notes}}}.",
        "exampleArgs": {}
      },
      {
        "id": "phewas_variant",
        "connector": "human-genetics",
        "credentialKeys": [],
        "description": "PheWAS for one variant: its association statistics against every phenotype in a biobank PheWeb portal, most significant first. Args: instance (finngen FinnGen R12 GRCh38, or bbj BioBank Japan GRCh37; variant coords MUST be on the instance's build); variant (chrom-pos-ref-alt, :/_ separators and chr prefix tolerated, e.g. 19-44908822-C-T APOE rs7412 GRCh38/finngen or 1-55505647-G-T PCSK9 rs11591147 GRCh37/bbj); max_phenos (cap default 200; FinnGen returns ~2470 rows; sorted by p-value ascending before capping). Returns {instance, genome_build, variant, variant_meta, total, returned, truncated, phenotypes}; variant_meta {chrom, pos, ref, alt, rsids, nearest_genes, gnomad (FinnGen only)}. Each phenotype row {phenocode, phenostring, category, pval, mlogp, beta, sebeta, af|maf, maf_case, maf_control, n_cases, n_controls, n_samples} (unpublished fields null; BBJ rows have af, FinnGen rows have maf triplets + mlogp). Unknown variants raise a not-found error.",
        "input": {
          "type": "object",
          "properties": {
            "instance": {
              "type": "string",
              "enum": [
                "finngen",
                "bbj"
              ]
            },
            "variant": {
              "type": "string"
            },
            "max_phenos": {
              "type": "integer",
              "default": 200
            }
          },
          "required": [
            "instance",
            "variant"
          ]
        },
        "required": [
          "instance",
          "variant"
        ],
        "returns": "{instance, genome_build, variant (normalized chrom-pos-ref-alt), variant_meta{chrom, pos, ref, alt, rsids[], nearest_genes[], gnomad|null}, total, returned, truncated, phenotypes[]}.",
        "exampleArgs": {
          "instance": "finngen",
          "variant": "19-44908822-C-T",
          "max_phenos": 50
        }
      },
      {
        "id": "phewas_finngen_gene",
        "connector": "human-genetics",
        "credentialKeys": [],
        "description": "Gene-level PheWAS from FinnGen R12: for every disease endpoint, the best-associated variant in the gene region, most significant first. Args: gene_symbol (HGNC symbol e.g. PCSK9, APOE; unknown symbols raise a not-found error); max_phenos (cap default 200; FinnGen has ~2470 endpoints, one row each; sorted by p-value ascending before capping). Returns {instance:\"finngen\", genome_build:\"GRCh38\", gene_symbol, total, returned, truncated, phenotypes}; each row is the phewas_variant row shape plus variant:{chrom, pos, ref, alt, varid, rsids} — the top variant for that endpoint in this gene's region (region != gene body; PheWeb pads gene boundaries). Most rows are null results (pval~1) — the per-endpoint BEST variant is still reported; filter by pval yourself for significant hits.",
        "input": {
          "type": "object",
          "properties": {
            "gene_symbol": {
              "type": "string"
            },
            "max_phenos": {
              "type": "integer",
              "default": 200
            }
          },
          "required": [
            "gene_symbol"
          ]
        },
        "required": [
          "gene_symbol"
        ],
        "returns": "{instance:\"finngen\", genome_build:\"GRCh38\", gene_symbol, total, returned, truncated, phenotypes[<phewas_variant row> + variant:{chrom, pos, ref, alt, varid, rsids[]}]}.",
        "exampleArgs": {
          "gene_symbol": "PCSK9",
          "max_phenos": 50
        }
      },
      {
        "id": "phewas_list_phenotypes",
        "connector": "human-genetics",
        "credentialKeys": [],
        "description": "Complete phenotype (disease endpoint) catalogue of a PheWeb instance, with case/control counts. Args: instance (currently only finngen exposes this endpoint; BBJ does not — use phewas_search_phenotypes there); max_records (cap default 3000 > FinnGen's ~2470 endpoints, so the default returns the complete catalogue). Returns {instance, total, returned, truncated, phenotypes} sorted by phenocode; each row {phenocode (e.g. \"T2D\"), phenostring, category, num_cases, num_controls, num_gw_significant (count of genome-wide-significant loci for that endpoint)}.",
        "input": {
          "type": "object",
          "properties": {
            "instance": {
              "type": "string",
              "enum": [
                "finngen"
              ],
              "default": "finngen"
            },
            "max_records": {
              "type": "integer",
              "default": 3000
            }
          }
        },
        "returns": "{instance, total, returned, truncated, phenotypes[{phenocode, phenostring, category, num_cases, num_controls, num_gw_significant}]} sorted by phenocode.",
        "exampleArgs": {
          "instance": "finngen",
          "max_records": 3000
        }
      },
      {
        "id": "phewas_search_phenotypes",
        "connector": "human-genetics",
        "credentialKeys": [],
        "description": "Search a PheWeb instance's phenotypes (and entities) by name — the entry point for resolving a disease name to a phenocode. Args: query (free-text phenotype query e.g. \"diabetes\", \"asthma\"; matches phenotype names/codes; some instances also match gene names and rsIDs); instance (finngen default or bbj — both expose autocomplete); max_records (cap default 500; autocomplete responses are short lists, rarely capped). Returns {instance, query, total, returned, truncated, matches}; each match {display, phenocode, url}. Use the phenocode with phewas_list_phenotypes rows or the instance website; BBJ display strings embed the code in parentheses.",
        "input": {
          "type": "object",
          "properties": {
            "query": {
              "type": "string"
            },
            "instance": {
              "type": "string",
              "enum": [
                "finngen",
                "bbj"
              ],
              "default": "finngen"
            },
            "max_records": {
              "type": "integer",
              "default": 500
            }
          },
          "required": [
            "query"
          ]
        },
        "required": [
          "query"
        ],
        "returns": "{instance, query, total, returned, truncated, matches[{display, phenocode, url}]}.",
        "exampleArgs": {
          "query": "diabetes",
          "instance": "finngen"
        }
      }
    ]
  },
  {
    "id": "expression",
    "displayName": "Expression",
    "aliases": [
      "Bgee",
      "Bgee expression",
      "cross-species expression",
      "normal tissue expression"
    ],
    "description": "Human and cross-species normal tissue expression via GTEx and Bgee.",
    "useWhen": "Use for tissue expression and eQTL evidence — GTEx tissue sites, dataset releases, versioned GENCODE resolution, median or per-sample TPM, top-expressed genes, donor metadata, and cis-eQTLs; or Bgee healthy wild-type expression across animal species, present/absent calls and scores for a gene, bounded SPARQL lookup constrained by gene/species/tissue, and official expression-call or processed-value download links.",
    "sources": [
      "GTEx",
      "Bgee"
    ],
    "termsUrl": "https://www.bgee.org/about/terms-and-conditions",
    "requiresNcbi": false,
    "group": "featured",
    "tools": [
      {
        "id": "gtex_tissue_sites",
        "connector": "expression",
        "credentialKeys": [],
        "description": "List all tissue sites with metadata for a pinned GTEx release (54 in gtex_v8): sample counts, eGene/sGene counts, colour codes, and UBERON ontology ids.",
        "input": {
          "type": "object",
          "properties": {
            "dataset_id": {
              "type": "string",
              "default": "gtex_v8"
            }
          }
        },
        "returns": "`{ \"total\": int, \"tissues\": [ { \"tissue_site_detail_id\": str, \"tissue_site_detail\": str, \"tissue_site\": str, \"abbreviation\": str, \"color_hex\": str, \"color_rgb\": str, \"egene_count\": int, \"sgene_count\": int, \"expressed_gene_count\": int, \"rnaseq_sample_count\": int, \"eqtl_sample_count\": int, \"ontology_id\": str } ] }` — `total` is the API-verified row count (54 for gtex_v8).",
        "exampleArgs": {
          "dataset_id": "gtex_v8"
        }
      },
      {
        "id": "gtex_dataset_info",
        "connector": "expression",
        "credentialKeys": [],
        "description": "List all GTEx dataset releases with metadata: datasetId, GENCODE version, genome build, dbSNP build, and sample/subject/tissue counts.",
        "input": {
          "type": "object",
          "properties": {
            "dataset_id": {
              "type": "string"
            },
            "organization_name": {
              "type": "string"
            }
          }
        },
        "returns": "`[ { \"dataset_id\": str, \"display_name\": str, \"gencode_version\": str, \"genome_build\": str, \"dbsnp_build\": int, \"organization\": str, \"rnaseq_sample_count\": int, \"rnaseq_and_genotype_sample_count\": int, \"subject_count\": int, \"eqtl_subject_count\": int, \"eqtl_tissue_count\": int, \"tissue_count\": int, \"description\": str } ]` — one row per release (e.g. gtex_v7, gtex_v8).",
        "exampleArgs": {}
      },
      {
        "id": "gtex_sample_info",
        "connector": "expression",
        "credentialKeys": [],
        "description": "Sample and donor metadata for a pinned GTEx release, optionally filtered by tissue_site_detail_id, data_type (e.g. RNASEQ, WGS), or subject_id. Paged and count-verified; an unfiltered call matches tens of thousands of samples, so filter or set max_samples.",
        "input": {
          "type": "object",
          "properties": {
            "tissue_site_detail_id": {
              "type": "string"
            },
            "data_type": {
              "type": "string"
            },
            "subject_id": {
              "type": "string"
            },
            "max_samples": {
              "type": "integer"
            },
            "dataset_id": {
              "type": "string",
              "default": "gtex_v8"
            }
          }
        },
        "returns": "`{ \"total\": int, \"returned\": int, \"truncated\": bool, \"samples\": [ { \"sample_id\": str, \"subject_id\": str, \"tissue_site_detail_id\": str, \"tissue_site_detail\": str, \"data_type\": str, \"sex\": str, \"age_bracket\": str, \"hardy_scale\": int, \"ischemic_time\": int, \"rin\": float, \"autolysis_score\": int, \"pathology_notes\": str, \"uberon_id\": str } ] }` — `total` is the API-verified match count; `truncated` is true when capped by max_samples.",
        "exampleArgs": {
          "tissue_site_detail_id": "Liver",
          "data_type": "RNASEQ",
          "max_samples": 100
        }
      },
      {
        "id": "gtex_resolve_genes",
        "connector": "expression",
        "credentialKeys": [],
        "description": "Resolve gene symbols or unversioned Ensembl ids to versioned GENCODE ids for a pinned release, e.g. GAPDH -> ENSG00000111640.14. Feed the ids to the expression / eQTL tools.",
        "input": {
          "type": "object",
          "properties": {
            "genes": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "dataset_id": {
              "type": "string",
              "default": "gtex_v8"
            }
          },
          "required": [
            "genes"
          ]
        },
        "required": [
          "genes"
        ],
        "returns": "`{ \"total\": int, \"genes\": [ { \"gene_symbol\": str, \"gencode_id\": str, \"ensembl_id\": str, \"gencode_version\": str, \"genome_build\": str, \"chromosome\": str, \"start\": int, \"end\": int, \"strand\": str, \"entrez_gene_id\": int, \"gene_type\": str, \"description\": str } ] }` — one record per matched reference gene; unmatched inputs are simply absent.",
        "exampleArgs": {
          "genes": [
            "GAPDH",
            "BRCA2"
          ]
        }
      },
      {
        "id": "gtex_median_expression",
        "connector": "expression",
        "credentialKeys": [],
        "description": "Median gene expression (TPM) for one or more VERSIONED GENCODE ids across tissues (omit tissues for all). Paged and count-verified over (gene, tissue) rows.",
        "input": {
          "type": "object",
          "properties": {
            "gencode_ids": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "tissue_site_detail_ids": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "dataset_id": {
              "type": "string",
              "default": "gtex_v8"
            }
          },
          "required": [
            "gencode_ids"
          ]
        },
        "required": [
          "gencode_ids"
        ],
        "returns": "`{ \"total\": int, \"returned\": int, \"rows\": [ { \"gencode_id\": str, \"gene_symbol\": str, \"tissue_site_detail_id\": str, \"median_tpm\": float, \"unit\": str } ] }` — one row per (gene, tissue); `total` is the API-verified row count.",
        "exampleArgs": {
          "gencode_ids": [
            "ENSG00000111640.14"
          ]
        }
      },
      {
        "id": "gtex_expression_summary",
        "connector": "expression",
        "credentialKeys": [],
        "description": "Summarize a gene’s expression across ALL tissues ranked by descending median TPM. Accepts a symbol or Ensembl id and auto-resolves it to a versioned GENCODE id first.",
        "input": {
          "type": "object",
          "properties": {
            "gene": {
              "type": "string"
            },
            "dataset_id": {
              "type": "string",
              "default": "gtex_v8"
            }
          },
          "required": [
            "gene"
          ]
        },
        "required": [
          "gene"
        ],
        "returns": "`{ \"gene\": { gene reference record }, \"total_tissues\": int, \"tissues\": [ { \"tissue_site_detail_id\": str, \"median_tpm\": float, \"unit\": str } ] }` — tissues sorted by descending median TPM. Raises if the gene is not in the GTEx reference.",
        "exampleArgs": {
          "gene": "GAPDH"
        }
      },
      {
        "id": "gtex_gene_expression",
        "connector": "expression",
        "credentialKeys": [],
        "description": "Sample-level (not aggregated) expression TPM arrays for one VERSIONED GENCODE id, per tissue (omit tissues for all). Returns the full per-sample TPM array and n_samples for each tissue.",
        "input": {
          "type": "object",
          "properties": {
            "gencode_id": {
              "type": "string"
            },
            "tissue_site_detail_ids": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "dataset_id": {
              "type": "string",
              "default": "gtex_v8"
            }
          },
          "required": [
            "gencode_id"
          ]
        },
        "required": [
          "gencode_id"
        ],
        "returns": "`[ { \"tissue_site_detail_id\": str, \"gencode_id\": str, \"gene_symbol\": str, \"unit\": str, \"n_samples\": int, \"expression\": [float] } ]` — one entry per tissue; `expression` is the raw per-sample TPM array.",
        "exampleArgs": {
          "gencode_id": "ENSG00000111640.14",
          "tissue_site_detail_ids": [
            "Whole_Blood"
          ]
        }
      },
      {
        "id": "gtex_top_expressed_genes",
        "connector": "expression",
        "credentialKeys": [],
        "description": "Top-n genes by median TPM in one tissue, using the API-side ranking. filter_mt_gene (default true) drops mitochondrial genes from the ranking.",
        "input": {
          "type": "object",
          "properties": {
            "tissue_site_detail_id": {
              "type": "string"
            },
            "n": {
              "type": "integer",
              "default": 100
            },
            "filter_mt_gene": {
              "type": "boolean",
              "default": true
            },
            "dataset_id": {
              "type": "string",
              "default": "gtex_v8"
            }
          },
          "required": [
            "tissue_site_detail_id"
          ]
        },
        "required": [
          "tissue_site_detail_id"
        ],
        "returns": "`{ \"tissue_site_detail_id\": str, \"total_genes_in_ranking\": int, \"returned\": int, \"genes\": [ { \"gencode_id\": str, \"gene_symbol\": str, \"median_tpm\": float, \"unit\": str } ] }` — genes in rank order; `total_genes_in_ranking` is the full ranking size (~56k).",
        "exampleArgs": {
          "tissue_site_detail_id": "Whole_Blood",
          "n": 20
        }
      },
      {
        "id": "gtex_eqtl_genes",
        "connector": "expression",
        "credentialKeys": [],
        "description": "All eGenes (genes with ≥1 significant cis-eQTL) for a tissue. Walked page-by-page and count-verified (e.g. Pancreas gtex_v8 = 9,660). max_genes caps how many rows are returned.",
        "input": {
          "type": "object",
          "properties": {
            "tissue_site_detail_id": {
              "type": "string"
            },
            "max_genes": {
              "type": "integer"
            },
            "dataset_id": {
              "type": "string",
              "default": "gtex_v8"
            }
          },
          "required": [
            "tissue_site_detail_id"
          ]
        },
        "required": [
          "tissue_site_detail_id"
        ],
        "returns": "`{ \"total\": int, \"returned\": int, \"truncated\": bool, \"genes\": [ { \"gencode_id\": str, \"gene_symbol\": str, \"empirical_p_value\": float, \"p_value\": float, \"p_value_threshold\": float, \"q_value\": float, \"log2_allelic_fold_change\": float } ] }` — `total` is exact even when truncated by max_genes.",
        "exampleArgs": {
          "tissue_site_detail_id": "Pancreas",
          "max_genes": 100
        }
      },
      {
        "id": "gtex_single_tissue_eqtls",
        "connector": "expression",
        "credentialKeys": [],
        "description": "Significant single-tissue cis-eQTL associations for a gene and/or a variant (precomputed). Provide gencode_id and/or variant_id; tissue_site_detail_id optionally narrows. Paged and count-verified.",
        "input": {
          "type": "object",
          "properties": {
            "gencode_id": {
              "type": "string"
            },
            "variant_id": {
              "type": "string"
            },
            "tissue_site_detail_id": {
              "type": "string"
            },
            "max_results": {
              "type": "integer"
            },
            "dataset_id": {
              "type": "string",
              "default": "gtex_v8"
            }
          }
        },
        "returns": "`{ \"total\": int, \"returned\": int, \"truncated\": bool, \"eqtls\": [ { \"gencode_id\": str, \"gene_symbol\": str, \"variant_id\": str, \"snp_id\": str, \"chromosome\": str, \"pos\": int, \"tissue_site_detail_id\": str, \"p_value\": float, \"nes\": float } ] }` — precomputed significant associations.",
        "exampleArgs": {
          "gencode_id": "ENSG00000111640.14"
        }
      },
      {
        "id": "gtex_multi_tissue_eqtls",
        "connector": "expression",
        "credentialKeys": [],
        "description": "Multi-tissue cis-eQTL meta-analysis (METASOFT) for a VERSIONED GENCODE id. variant_id optionally narrows to one variant. Returns per-variant rows with per-tissue m-values, NES, p-values, and SEs.",
        "input": {
          "type": "object",
          "properties": {
            "gencode_id": {
              "type": "string"
            },
            "variant_id": {
              "type": "string"
            },
            "dataset_id": {
              "type": "string",
              "default": "gtex_v8"
            }
          },
          "required": [
            "gencode_id"
          ]
        },
        "required": [
          "gencode_id"
        ],
        "returns": "`{ \"total\": int, \"returned\": int, \"variants\": [ { \"gencode_id\": str, \"variant_id\": str, \"meta_p\": float, \"tissues\": { <tissue_site_detail_id>: { \"m_value\": float, \"nes\": float, \"p_value\": float, \"se\": float } } } ] }` — one row per variant tested for the gene; `total` is the variant count.",
        "exampleArgs": {
          "gencode_id": "ENSG00000111640.14"
        }
      },
      {
        "id": "gtex_calculate_eqtl",
        "connector": "expression",
        "credentialKeys": [],
        "description": "Calculate an eQTL on the fly for any gene-variant pair in one tissue, including non-significant pairs. Returns p-value, NES, t-statistic, MAF, and the per-sample genotype/expression arrays.",
        "input": {
          "type": "object",
          "properties": {
            "gencode_id": {
              "type": "string"
            },
            "variant_id": {
              "type": "string"
            },
            "tissue_site_detail_id": {
              "type": "string"
            },
            "dataset_id": {
              "type": "string",
              "default": "gtex_v8"
            }
          },
          "required": [
            "gencode_id",
            "variant_id",
            "tissue_site_detail_id"
          ]
        },
        "required": [
          "gencode_id",
          "variant_id",
          "tissue_site_detail_id"
        ],
        "returns": "`{ \"gencode_id\": str, \"gene_symbol\": str, \"variant_id\": str, \"tissue_site_detail_id\": str, \"p_value\": float, \"nes\": float, \"t_statistic\": float, \"maf\": float, \"hom_ref_count\": int, \"het_count\": int, \"hom_alt_count\": int, \"n_samples\": int, \"samples\": [ { \"genotype\": float, \"expression\": float } ] }` — `samples` sorted by (genotype, expression).",
        "exampleArgs": {
          "gencode_id": "ENSG00000111640.14",
          "variant_id": "chr12_6452899_G_A_b38",
          "tissue_site_detail_id": "Whole_Blood"
        }
      },
      {
        "id": "bgee_species",
        "connector": "expression",
        "credentialKeys": [],
        "description": "List species available in the Bgee healthy wild-type expression atlas, or retrieve one species by its NCBI taxonomy id. Single-species queries load data-source metadata to determine expression-data availability. List queries return null for availability because their metadata does not load data sources.",
        "input": {
          "type": "object",
          "properties": {
            "species_id": {
              "type": "integer",
              "minimum": 1,
              "maximum": 2147483647
            }
          }
        },
        "returns": "`{ \"species\": [ { \"taxon_id\": int, \"name\": str, \"scientific_name\": str, \"genome_version\": str, \"has_expression_data\": bool|null } ] }` — taxon_id identifies the species, not the species supplying its reference genome. has_expression_data is null when data-source metadata was not loaded or is unavailable.",
        "exampleArgs": {}
      },
      {
        "id": "bgee_expression_calls",
        "connector": "expression",
        "credentialKeys": [],
        "description": "Retrieve Bgee present/absent expression calls and normalized expression scores for one gene in one species, preserving anatomical entity and cell type context. Results are healthy wild-type baseline calls and can be capped with max_calls. Missing or unspecified cell types are returned as null.",
        "input": {
          "type": "object",
          "properties": {
            "gene_id": {
              "type": "string"
            },
            "species_id": {
              "type": "integer",
              "minimum": 1,
              "maximum": 2147483647
            },
            "max_calls": {
              "type": "integer",
              "minimum": 1,
              "maximum": 500,
              "default": 100
            },
            "expression_type": {
              "type": "string",
              "enum": [
                "EXPRESSED",
                "NOT_EXPRESSED"
              ],
              "default": "EXPRESSED"
            }
          },
          "required": [
            "gene_id",
            "species_id"
          ]
        },
        "required": [
          "gene_id",
          "species_id"
        ],
        "returns": "`{ \"gene\": { \"id\": str, \"name\": str, \"species\": object }, \"returned\": int, \"truncated\": bool, \"calls\": [ { \"anatomical_entity_id\": str, \"anatomical_entity_name\": str, \"cell_type_id\": str|null, \"cell_type_name\": str|null, \"expression_state\": str, \"expression_score\": float, \"expression_score_confidence\": str, \"expression_quality\": str, \"fdr\": str, \"data_types\": [str] } ] }` — cell type fields preserve condition.cellType; absent, null or empty fields are null.",
        "exampleArgs": {
          "gene_id": "ENSG00000130208",
          "species_id": 9606,
          "max_calls": 50
        },
        "totalTimeoutMs": 30000,
        "maxResponseBytes": 4194304
      },
      {
        "id": "bgee_sparql_expression",
        "connector": "expression",
        "credentialKeys": [],
        "description": "Run a bounded Bgee SPARQL query for one gene, one NCBI species and one tissue/anatomical entity. All three filters are required; the generated query includes a hard LIMIT and the call has its own timeout.",
        "input": {
          "type": "object",
          "properties": {
            "gene": {
              "type": "string",
              "minLength": 1,
              "maxLength": 128
            },
            "species_id": {
              "type": "integer",
              "minimum": 1,
              "maximum": 2147483647
            },
            "tissue": {
              "type": "string",
              "minLength": 1,
              "maxLength": 128
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 25
            }
          },
          "required": [
            "gene",
            "species_id",
            "tissue"
          ]
        },
        "required": [
          "gene",
          "species_id",
          "tissue"
        ],
        "returns": "`{ \"returned\": int, \"truncated\": bool, \"rows\": [ { \"gene_name\": str, \"species_name\": str, \"anatomical_entity\": str, \"anatomical_entity_name\": str, \"expression_score\": number } ] }` — score-ranked Bgee SPARQL bindings.",
        "exampleArgs": {
          "gene": "APOC1",
          "species_id": 9606,
          "tissue": "liver",
          "limit": 25
        },
        "totalTimeoutMs": 20000,
        "maxResponseBytes": 2097152
      },
      {
        "id": "bgee_download_links",
        "connector": "expression",
        "credentialKeys": [],
        "description": "Build official Bgee download links for one species: summarized present/absent calls or processed expression-value directories. This returns URLs only and never downloads the large files.",
        "input": {
          "type": "object",
          "properties": {
            "species": {
              "type": "string",
              "minLength": 1,
              "maxLength": 128
            },
            "file_kind": {
              "type": "string",
              "enum": [
                "calls_simple",
                "calls_advanced",
                "processed_rna_seq",
                "processed_affymetrix",
                "processed_sc_full_length",
                "processed_sc_droplet_based"
              ],
              "default": "calls_simple"
            },
            "all_conditions": {
              "type": "boolean",
              "default": false
            }
          },
          "required": [
            "species"
          ]
        },
        "required": [
          "species"
        ],
        "returns": "`{ \"species\": str, \"file_kind\": str, \"download_url\": str, \"documentation_url\": str }` — stable official Bgee FTP/site URLs.",
        "exampleArgs": {
          "species": "Homo_sapiens",
          "file_kind": "calls_simple"
        }
      }
    ]
  },
  {
    "id": "hmmer",
    "displayName": "HMMER",
    "aliases": [
      "HMMER3",
      "phmmer",
      "hmmscan",
      "hmmsearch",
      "jackhmmer",
      "profile HMM"
    ],
    "description": "Protein family and remote-homology searches via the EMBL-EBI HMMER3 service.",
    "useWhen": "Use when you need profile-HMM protein-family scans, sequence-versus-sequence homology searches, or iterative remote-homolog discovery through phmmer, hmmscan, hmmsearch, or jackhmmer. It complements BLAST for protein-family and distant-homology analysis and overlaps with InterProScan for domain-family discovery.",
    "sources": [
      "HMMER3",
      "EMBL-EBI"
    ],
    "termsUrl": "https://www.ebi.ac.uk/about/terms-of-use",
    "requiresNcbi": false,
    "group": "featured",
    "tools": [
      {
        "connector": "hmmer",
        "credentialKeys": [],
        "id": "search",
        "description": "Submit one asynchronous EMBL-EBI HMMER3 search. program selects phmmer (protein sequence against a sequence database), hmmscan (protein sequence against Pfam profiles), hmmsearch (profile HMM/alignment against a sequence database), or jackhmmer (iterative remote-homolog search). input is the FASTA sequence, profile HMM, or alignment text accepted by that program. database is the provider database name. Optional thresholds use HMMER parameter names (incE/incdomE, E/domE, incT/incdomT, T/domT); iterations controls jackhmmer rounds. Submission is not completion: retain the returned job_id and poll with status. The service may accept a job even if the response is lost; never automatically resubmit an uncertain submission.",
        "input": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "program": {
              "type": "string",
              "enum": [
                "phmmer",
                "hmmscan",
                "hmmsearch",
                "jackhmmer"
              ]
            },
            "database": {
              "type": "string",
              "enum": [
                "refprot",
                "uniprot",
                "swissprot",
                "pdb",
                "rp15",
                "rp35",
                "rp55",
                "rp75",
                "pfam"
              ]
            },
            "input": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200000
            },
            "incE": {
              "type": "number",
              "exclusiveMinimum": 0,
              "maximum": 10
            },
            "incdomE": {
              "type": "number",
              "exclusiveMinimum": 0,
              "maximum": 10
            },
            "incT": {
              "type": "number",
              "exclusiveMinimum": 0
            },
            "incdomT": {
              "type": "number",
              "exclusiveMinimum": 0
            },
            "E": {
              "type": "number",
              "exclusiveMinimum": 0,
              "maximum": 10
            },
            "domE": {
              "type": "number",
              "exclusiveMinimum": 0,
              "maximum": 10
            },
            "T": {
              "type": "number",
              "exclusiveMinimum": 0
            },
            "domT": {
              "type": "number",
              "exclusiveMinimum": 0
            },
            "popen": {
              "type": "number",
              "minimum": 0,
              "exclusiveMaximum": 0.5
            },
            "pextend": {
              "type": "number",
              "minimum": 0,
              "exclusiveMaximum": 1
            },
            "mx": {
              "type": "string",
              "enum": [
                "BLOSUM45",
                "BLOSUM62",
                "BLOSUM90",
                "PAM30",
                "PAM70"
              ]
            },
            "iterations": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9
            }
          },
          "required": [
            "program",
            "database",
            "input"
          ],
          "allOf": [
            {
              "if": {
                "properties": {
                  "program": {
                    "const": "hmmscan"
                  }
                },
                "required": [
                  "program"
                ]
              },
              "then": {
                "properties": {
                  "database": {
                    "const": "pfam"
                  }
                }
              }
            },
            {
              "if": {
                "properties": {
                  "program": {
                    "enum": [
                      "phmmer",
                      "hmmsearch",
                      "jackhmmer"
                    ]
                  }
                },
                "required": [
                  "program"
                ]
              },
              "then": {
                "properties": {
                  "database": {
                    "not": {
                      "const": "pfam"
                    }
                  }
                }
              }
            },
            {
              "if": {
                "properties": {
                  "program": {
                    "not": {
                      "enum": [
                        "phmmer",
                        "jackhmmer"
                      ]
                    }
                  },
                  "popen": {}
                },
                "required": [
                  "program",
                  "popen"
                ]
              },
              "then": {
                "not": {
                  "required": [
                    "popen"
                  ]
                }
              }
            },
            {
              "if": {
                "properties": {
                  "program": {
                    "not": {
                      "enum": [
                        "phmmer",
                        "jackhmmer"
                      ]
                    }
                  },
                  "pextend": {}
                },
                "required": [
                  "program",
                  "pextend"
                ]
              },
              "then": {
                "not": {
                  "required": [
                    "pextend"
                  ]
                }
              }
            },
            {
              "if": {
                "properties": {
                  "program": {
                    "not": {
                      "enum": [
                        "phmmer",
                        "jackhmmer"
                      ]
                    }
                  },
                  "mx": {}
                },
                "required": [
                  "program",
                  "mx"
                ]
              },
              "then": {
                "not": {
                  "required": [
                    "mx"
                  ]
                }
              }
            },
            {
              "if": {
                "properties": {
                  "program": {
                    "not": {
                      "const": "jackhmmer"
                    }
                  },
                  "iterations": {}
                },
                "required": [
                  "program",
                  "iterations"
                ]
              },
              "then": {
                "not": {
                  "required": [
                    "iterations"
                  ]
                }
              }
            }
          ]
        },
        "required": [
          "program",
          "database",
          "input"
        ],
        "returns": "{job_id,program,database,status:\"SUBMITTED\"}. Keep job_id and call status until ready=true; this connector does not poll or resubmit automatically.",
        "exampleArgs": {
          "program": "hmmscan",
          "database": "pfam",
          "input": ">query\nMKTIIALSYIFCLVFADYKDDDDK"
        },
        "totalTimeoutMs": 60000,
        "maxResponseBytes": 16384
      },
      {
        "connector": "hmmer",
        "credentialKeys": [],
        "id": "status",
        "description": "Check one HMMER job once, without polling or resubmitting. SUCCESS means results are available; PENDING/RUNNING means wait before checking again; ERROR/FAILURE/NOT_FOUND are terminal outcomes and never mean zero hits. Keep the exact job_id.",
        "input": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "job_id": {
              "type": "string",
              "pattern": "^[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}$",
              "maxLength": 36
            }
          },
          "required": [
            "job_id"
          ]
        },
        "required": [
          "job_id"
        ],
        "returns": "{job_id,status,ready,poll_after_seconds}. ready is true only when status is SUCCESS; unknown provider statuses are preserved for forward compatibility.",
        "exampleArgs": {
          "job_id": "8ebb1d5f-4457-4da8-808c-f811105c3654"
        },
        "maxResponseBytes": 16384,
        "totalTimeoutMs": 30000
      },
      {
        "connector": "hmmer",
        "credentialKeys": [],
        "id": "results",
        "description": "Retrieve one HMMER job result once. Checks the provider status first and returns no result payload while the job is pending or failed. On SUCCESS, retrieves all result pages, including domain annotations; jackhmmer iteration records are returned in the provider array shape. Preserve the result because provider retention is finite; an empty match list is a completed zero-hit result, distinct from a pending or failed job.",
        "input": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "job_id": {
              "type": "string",
              "pattern": "^[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}$",
              "maxLength": 36
            }
          },
          "required": [
            "job_id"
          ]
        },
        "required": [
          "job_id"
        ],
        "returns": "{job_id,status,ready:false} until SUCCESS; otherwise {job_id,status:\"SUCCESS\",ready:true,result:object|array}. Result pages are merged into one result object.",
        "exampleArgs": {
          "job_id": "8ebb1d5f-4457-4da8-808c-f811105c3654"
        },
        "maxResponseBytes": 8388608,
        "totalTimeoutMs": 60000
      }
    ]
  },
  {
    "id": "interproscan",
    "displayName": "InterProScan",
    "aliases": [
      "InterProScan 5",
      "iprscan5"
    ],
    "description": "InterProScan protein sequence submission, job status and TSV result retrieval via EMBL-EBI.",
    "useWhen": "Use to identify protein domains, families and functional sites in submitted protein sequences with EMBL-EBI InterProScan. For precomputed annotations of known UniProt accessions, use Protein Annotation instead.",
    "sources": [
      "InterProScan",
      "EMBL-EBI"
    ],
    "termsUrl": "https://www.ebi.ac.uk/about/terms-of-use",
    "requiresNcbi": false,
    "group": "featured",
    "tools": [
      {
        "connector": "interproscan",
        "credentialKeys": [
          "ncbiEmail"
        ],
        "id": "submit",
        "description": "Submit one or more protein sequences to EMBL-EBI InterProScan for asynchronous domain and family annotation. Accepts raw protein sequence or FASTA input with at most 1,000 records, a local limit of 10,000 residues per record and a 4 MiB encoded request body limit. Returns a job_id immediately and never polls. Keep the job_id, then call status and results yourself after waiting at least 10 seconds between status checks. A lost response may represent an accepted job; do not resubmit automatically. A valid contact email is required. Provide a contact email in credentials.ncbiEmail. This email is sent to EMBL-EBI when submitting a job. Keep the exact job_id to resume after restart. This connector adds no job registry, result cache or background polling. Cancellation, app exit and uninstall stop local requests only; this connector cannot cancel or delete remote jobs. Result expiry is controlled by EMBL-EBI. Sequences and contact email are sent to EMBL-EBI. Submit no more than 30 jobs in a batch and wait for processing/results before submitting more; cross-call throttling is not enforced. The existing results tool returns at most 2 MiB of TSV and rejects larger reports.",
        "input": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "sequence": {
              "type": "string",
              "minLength": 1,
              "maxLength": 4194304,
              "description": "A raw protein sequence or FASTA input with up to 1,000 records."
            },
            "title": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200
            }
          },
          "required": [
            "sequence"
          ]
        },
        "required": [
          "sequence"
        ],
        "returns": "{job_id,status:\"SUBMITTED\",ready:false,sequence_count,poll_after_seconds:10}. Submission is not completion; retain job_id and call status/results explicitly.",
        "exampleArgs": {
          "sequence": ">query\nMKTIIALSYIFCLVFADYKDDDDK"
        },
        "totalTimeoutMs": 35000,
        "maxResponseBytes": 16384
      },
      {
        "connector": "interproscan",
        "credentialKeys": [
          "ncbiEmail"
        ],
        "id": "status",
        "description": "Check one InterProScan job once, without retrying or polling. Wait at least 10 seconds between checks. FINISHED means results can be retrieved; ERROR/FAILURE are job failures, NOT_FOUND means unknown or expired, never a zero-hit result. Keep the exact job_id; this tool never resubmits.",
        "input": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "job_id": {
              "type": "string",
              "maxLength": 200,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,199}$"
            }
          },
          "required": [
            "job_id"
          ]
        },
        "required": [
          "job_id"
        ],
        "returns": "{job_id,status:\"PENDING\"|\"QUEUED\"|\"RUNNING\"|\"FINISHED\"|\"ERROR\"|\"FAILURE\"|\"NOT_FOUND\",ready,poll_after_seconds:number|null}. ready is true only for FINISHED.",
        "exampleArgs": {
          "job_id": "iprscan5-R20260922-123456-0123-12345678-p1m"
        },
        "maxResponseBytes": 1024,
        "totalTimeoutMs": 30000
      },
      {
        "connector": "interproscan",
        "credentialKeys": [
          "ncbiEmail"
        ],
        "id": "results",
        "description": "Retrieve the complete InterProScan TSV report for a job, capped at 2 MiB (oversized reports fail, never truncate). Checks status once first, then fetches TSV only for FINISHED. No retries, polling, or resubmission. Preserve the report promptly because provider results expire. TSV contains one row per signature match; coordinates are 1-based inclusive and scores are application-specific. Optional columns hold InterPro, GO and pathway annotations. An empty TSV after FINISHED means no reported matches, not evidence that the protein lacks function.",
        "input": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "job_id": {
              "type": "string",
              "maxLength": 200,
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,199}$"
            }
          },
          "required": [
            "job_id"
          ]
        },
        "required": [
          "job_id"
        ],
        "returns": "{job_id,status,ready:false} when not FINISHED, otherwise {job_id,status:\"FINISHED\",ready:true,format:\"tsv\",n_matches,data:string}. data is the complete verbatim TSV (no header); n_matches counts rows, not unique domains or proteins. Failure/expired statuses have no data or match count.",
        "exampleArgs": {
          "job_id": "iprscan5-R20260922-123456-0123-12345678-p1m"
        },
        "maxResponseBytes": 2097152,
        "totalTimeoutMs": 60000
      }
    ]
  },
  {
    "id": "protein-annotation",
    "displayName": "Protein Annotation",
    "description": "Protein domain architecture, family/clan membership, expression atlas and interaction networks via InterPro/Pfam, the Human Protein Atlas and STRING.",
    "useWhen": "Use when you need protein annotation — a protein's complete InterPro/Pfam domain architecture, entry/family/clan search and detail, member proteins or proteomes of a Pfam family, Human Protein Atlas per-gene expression (tissue/subcellular/pathology/blood/brain) and bulk search, or STRING id mapping, interaction networks and homology similarity.",
    "sources": [
      "InterPro",
      "Pfam",
      "Human Protein Atlas",
      "STRING"
    ],
    "termsUrl": "https://string-db.org/cgi/access?footer_active_subpage=licensing",
    "requiresNcbi": false,
    "group": "featured",
    "tools": [
      {
        "id": "get_domain_architecture",
        "connector": "protein-annotation",
        "credentialKeys": [],
        "description": "Complete InterPro domain architecture for one or more UniProt proteins (all matching entries, member-DB signatures, fragment coordinates), with pagination verified against the API count.",
        "input": {
          "type": "object",
          "properties": {
            "accessions": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "description": "UniProt accessions, e.g. [\"P04637\"]."
            }
          },
          "required": [
            "accessions"
          ]
        },
        "required": [
          "accessions"
        ],
        "returns": "`{ \"summaries\": { <accession>: { \"protein\": str, \"protein_length\": int, \"entry_count\": int, \"entries\": [ { \"accession\": str, \"name\": str, \"type\": str, \"member_db_signatures\": [ { \"database\": str, \"accession\": str, \"name\": str } ], \"locations\": [ { \"fragments\": [ { \"start\": int, \"end\": int } ], ... } ] } ] } }, \"stats\": { \"http_requests\": int, \"bytes_downloaded\": int } }` — entries sorted by (type, accession); default location fields (model/score/representative, fragment dc_status \"CONTINUOUS\") are omitted.",
        "exampleArgs": {
          "accessions": [
            "P04637"
          ]
        }
      },
      {
        "id": "search_interpro_entries",
        "connector": "protein-annotation",
        "credentialKeys": [],
        "description": "Keyword search over InterPro or member-database entries (Pfam, SMART, PROSITE, PANTHER, CDD), complete cursor walk verified against the API count.",
        "input": {
          "type": "object",
          "properties": {
            "query": {
              "type": "string",
              "description": "Free-text keyword, e.g. \"kinase\". Optional if go_term is given."
            },
            "entry_type": {
              "type": "string",
              "description": "family | domain | repeat | homologous_superfamily | conserved_site | active_site | binding_site | ptm"
            },
            "source_db": {
              "type": "string",
              "default": "interpro",
              "description": "interpro (default) or a member DB: pfam, smart, prosite, panther, cdd."
            },
            "go_term": {
              "type": "string",
              "description": "GO identifier filter, e.g. \"GO:0004672\"."
            }
          }
        },
        "returns": "`{ \"count\": int, \"results\": [ { \"accession\": str, \"name\": str, \"type\": str, \"source_database\": str, \"integrated\": str|null, \"member_db_signatures\"?: [...], \"go_terms\"?: [...] } ] }` — rows sorted by accession; `count` is the API total.",
        "exampleArgs": {
          "query": "kinase",
          "source_db": "pfam"
        }
      },
      {
        "id": "get_interpro_entry",
        "connector": "protein-annotation",
        "credentialKeys": [],
        "description": "Detail record for an InterPro entry (IPRxxxxxx) or Pfam family (PFxxxxx) — route chosen by accession prefix.",
        "input": {
          "type": "object",
          "properties": {
            "accession": {
              "type": "string",
              "description": "InterPro (IPRxxxxxx) or Pfam (PFxxxxx) accession."
            }
          },
          "required": [
            "accession"
          ]
        },
        "required": [
          "accession"
        ],
        "returns": "`{ \"accession\": str, \"name\": { \"name\": str, \"short\": str|null }, \"type\": str, \"source_database\": str, \"integrated\": str|null, \"hierarchy\": ..., \"set_info\": ..., \"member_db_signatures\"?: [...], \"go_terms\"?: [...], \"n_literature_refs\"?: int }` — a Pfam family's clan appears under `set_info`.",
        "exampleArgs": {
          "accession": "IPR000719"
        }
      },
      {
        "id": "search_pfam_clans",
        "connector": "protein-annotation",
        "credentialKeys": [],
        "description": "Keyword search over Pfam clans (InterPro sets, accessions CLxxxx).",
        "input": {
          "type": "object",
          "properties": {
            "query": {
              "type": "string",
              "description": "Free-text keyword; omit to list all clans."
            }
          }
        },
        "returns": "`{ \"count\": int, \"results\": [ { \"accession\": str, \"name\": str, \"source_database\": str } ] }` — rows sorted by accession; an empty upstream result yields count 0.",
        "exampleArgs": {
          "query": "kinase"
        }
      },
      {
        "id": "get_pfam_clan",
        "connector": "protein-annotation",
        "credentialKeys": [],
        "description": "Pfam clan detail including the complete sorted member-family list.",
        "input": {
          "type": "object",
          "properties": {
            "clan_accession": {
              "type": "string",
              "description": "Clan accession, e.g. \"CL0016\"."
            }
          },
          "required": [
            "clan_accession"
          ]
        },
        "required": [
          "clan_accession"
        ],
        "returns": "`{ \"accession\": str, \"name\": str, \"source_database\": str, \"member_count\": int, \"members\": [ { \"accession\": str, \"name\": str, \"short_name\": str, \"type\": str } ] }` — members sorted by accession.",
        "exampleArgs": {
          "clan_accession": "CL0016"
        }
      },
      {
        "id": "get_pfam_family_proteins",
        "connector": "protein-annotation",
        "credentialKeys": [],
        "description": "Member proteins of a Pfam family (complete count-verified walk or count only). Use count_only for very large families.",
        "input": {
          "type": "object",
          "properties": {
            "pfam_accession": {
              "type": "string",
              "description": "Pfam family accession, e.g. \"PF00069\"."
            },
            "reviewed_only": {
              "type": "boolean",
              "default": false,
              "description": "Restrict to reviewed (Swiss-Prot) proteins."
            },
            "tax_id": {
              "type": "integer",
              "description": "Restrict to an NCBI taxon, e.g. 9606 for human."
            },
            "count_only": {
              "type": "boolean",
              "default": false,
              "description": "Return only the match count — REQUIRED for very large families (e.g. unfiltered PF00069)."
            }
          },
          "required": [
            "pfam_accession"
          ]
        },
        "required": [
          "pfam_accession"
        ],
        "returns": "`{ \"count\": int, \"results\": [ { \"accession\": str, \"name\": str, \"source_database\": str, \"length\": int, \"tax_id\": int, \"organism\": str } ] | null }` — `results` is null in count_only mode; otherwise sorted by accession.",
        "exampleArgs": {
          "pfam_accession": "PF00069",
          "count_only": true
        }
      },
      {
        "id": "get_pfam_family_proteomes",
        "connector": "protein-annotation",
        "credentialKeys": [],
        "description": "Proteomes containing members of a Pfam family. count_only defaults true — the upstream proteome cursor pagination is defective for deep walks.",
        "input": {
          "type": "object",
          "properties": {
            "pfam_accession": {
              "type": "string",
              "description": "Pfam family accession, e.g. \"PF00069\"."
            },
            "count_only": {
              "type": "boolean",
              "default": true,
              "description": "Default true (reliable count). Set false only for small families."
            }
          },
          "required": [
            "pfam_accession"
          ]
        },
        "required": [
          "pfam_accession"
        ],
        "returns": "`{ \"count\": int, \"results\": [ { \"accession\": str, \"name\": str, \"is_reference\": bool, \"taxonomy\": ... } ] | null }` — `results` is null in count_only mode; a full walk raises if upstream pagination is defective.",
        "exampleArgs": {
          "pfam_accession": "PF00069"
        }
      },
      {
        "id": "get_protein_atlas_gene",
        "connector": "protein-annotation",
        "credentialKeys": [],
        "description": "Human Protein Atlas per-gene record (release 25.x): tissue/subcellular/pathology/blood/brain expression and antibody info. Accepts an Ensembl gene ID or a gene symbol.",
        "input": {
          "type": "object",
          "properties": {
            "gene": {
              "type": "string",
              "description": "Ensembl gene ID (\"ENSG00000141510\") or gene symbol (\"TP53\")."
            },
            "full": {
              "type": "boolean",
              "default": false,
              "description": "False (default) returns a grouped summary; true returns HPA's complete raw record."
            }
          },
          "required": [
            "gene"
          ]
        },
        "required": [
          "gene"
        ],
        "returns": "`full=false`: `{ \"identity\": {...}, \"tissue_expression\": {...}, \"single_cell_expression\": {...}, \"blood_expression\": {...}, \"brain_expression\": {...}, \"cancer_expression\": {...}, \"subcellular\": {...}, \"antibody\": {...}, \"pathology\": { \"prognostics\": { <cancer>: ... } } }`. `full=true`: HPA's complete raw ~119-key per-gene record.",
        "exampleArgs": {
          "gene": "TP53"
        }
      },
      {
        "id": "search_protein_atlas",
        "connector": "protein-annotation",
        "credentialKeys": [],
        "description": "Column-selected bulk search over the Human Protein Atlas (search_download).",
        "input": {
          "type": "object",
          "properties": {
            "query": {
              "type": "string",
              "description": "Free-text search (gene symbol, description keyword, ...)."
            },
            "columns": {
              "type": "string",
              "default": "g,gs,eg,gd,up,chr,chrp,scl",
              "description": "Comma-separated HPA column codes: g=Gene, gs=synonym, eg=Ensembl, gd=description, up=Uniprot, chr=Chromosome, chrp=Position, scl=Subcellular location, ab=Antibody, pc=Protein class, di=Disease."
            }
          },
          "required": [
            "query"
          ]
        },
        "required": [
          "query"
        ],
        "returns": "`[ { <HPA field name>: value } ]` — a list of row dicts keyed by the human-readable field names selected via `columns`; `[]` when nothing matches.",
        "exampleArgs": {
          "query": "kinase"
        }
      },
      {
        "id": "map_string_ids",
        "connector": "protein-annotation",
        "credentialKeys": [],
        "description": "Map gene symbols/aliases to STRING protein identifiers (v12.0). Every input symbol is either mapped or listed in unmapped — the two partition the input.",
        "input": {
          "type": "object",
          "properties": {
            "symbols": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "description": "Gene symbols or aliases, e.g. [\"TP53\", \"PD-1\"]."
            },
            "species": {
              "type": "integer",
              "default": 9606,
              "description": "NCBI taxonomy ID (9606 = human)."
            }
          },
          "required": [
            "symbols"
          ]
        },
        "required": [
          "symbols"
        ],
        "returns": "`{ \"string_version\": { \"string_version\": str, \"stable_address\": str }, \"species\": int, \"mapped\": [ { \"query\": str, \"string_id\": str, \"preferred_name\": str, \"ncbi_taxon_id\": int } ], \"unmapped\": [ str ] }`.",
        "exampleArgs": {
          "symbols": [
            "TP53",
            "BRCA1",
            "EGFR"
          ]
        }
      },
      {
        "id": "get_string_network",
        "connector": "protein-annotation",
        "credentialKeys": [],
        "description": "STRING protein-protein interaction network for a gene list (v12.0) at a confidence threshold. Maps symbols first (unmapped reported), then retrieves nodes, edges, summary and provenance. A single mapped input requests 10 interaction neighbors, matching STRING; multiple mapped inputs are not expanded.",
        "input": {
          "type": "object",
          "properties": {
            "symbols": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "description": "Gene symbols, e.g. [\"TP53\", \"BRCA1\", \"EGFR\"]."
            },
            "species": {
              "type": "integer",
              "default": 9606,
              "description": "NCBI taxonomy ID (9606 = human)."
            },
            "required_score": {
              "type": "integer",
              "default": 700,
              "description": "Minimum combined score 0-1000 (400 medium, 700 high, 900 highest)."
            }
          },
          "required": [
            "symbols"
          ]
        },
        "required": [
          "symbols"
        ],
        "returns": "`{ \"tool\", \"tool_version\", \"query\", \"string_version\", \"nodes\": [ { \"query\": str|null, \"queries\": [str], \"is_query\": bool, \"name\", \"string_id\", \"degree\" } ], \"unmapped\": [ str ], \"edges\": [ { \"a\": str, \"b\": str, \"string_id_a\": str, \"string_id_b\": str, \"score\": float, \"evidence\": { <channel>: float } } ], \"summary\": { node/edge counts, \"n_expanded_nodes\": int, score stats }, \"provenance\": {...} }` — edges deterministically ordered; nodes include all edge endpoints and isolated mapped inputs (degree 0). Counts and degrees use unique STRING IDs. Expanded nodes have query=null, queries=[], is_query=false; input nodes retain all mapped aliases in queries (query is the first). n_mapped counts input mappings, n_nodes counts the returned network, and n_expanded_nodes counts returned non-input nodes, not the requested expansion size.",
        "exampleArgs": {
          "symbols": [
            "TP53",
            "BRCA1",
            "EGFR"
          ],
          "required_score": 700
        }
      },
      {
        "id": "get_string_ppi_enrichment",
        "connector": "protein-annotation",
        "credentialKeys": [],
        "description": "STRING protein-protein interaction enrichment for a gene list (v12.0). Tests whether the mapped proteins have more interactions than expected from the STRING background distribution, with an optional background set of STRING protein IDs.",
        "input": {
          "type": "object",
          "properties": {
            "symbols": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "description": "Gene symbols or aliases, e.g. [\"TP53\", \"BRCA1\", \"EGFR\"]."
            },
            "species": {
              "type": "integer",
              "default": 9606,
              "description": "NCBI taxonomy ID (9606 = human)."
            },
            "required_score": {
              "type": "integer",
              "default": 400,
              "description": "Minimum combined score 0-1000 used to count an interaction."
            },
            "background_string_ids": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "description": "Optional background proteome as STRING IDs (for example 9606.ENSP00000269305); omit to use STRING’s default proteome-wide background."
            }
          },
          "required": [
            "symbols"
          ]
        },
        "required": [
          "symbols"
        ],
        "returns": "`{ \"tool\", \"tool_version\", \"query\", \"string_version\", \"mapped\": [...], \"unmapped\": [ str ], \"result\": { \"number_of_nodes\": int, \"number_of_edges\": int, \"average_node_degree\": float, \"local_clustering_coefficient\": float, \"expected_number_of_edges\": float, \"p_value\": float }, \"provenance\": {...} }` — p_value is the significance of observing more interactions than expected; result is null when no input symbol maps.",
        "exampleArgs": {
          "symbols": [
            "TP53",
            "BRCA1",
            "EGFR"
          ],
          "required_score": 700
        }
      },
      {
        "id": "get_string_similarity_scores",
        "connector": "protein-annotation",
        "credentialKeys": [],
        "description": "Smith-Waterman protein similarity bitscores among a gene set (STRING /homology). Sparse: pairs absent from STRING's data are not listed (absence means no recorded similarity, not zero).",
        "input": {
          "type": "object",
          "properties": {
            "symbols": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "description": "Gene symbols in the source species."
            },
            "species": {
              "type": "integer",
              "default": 9606,
              "description": "NCBI taxonomy ID (9606 = human)."
            }
          },
          "required": [
            "symbols"
          ]
        },
        "required": [
          "symbols"
        ],
        "returns": "`{ \"species\": int, \"mapped\": [...], \"unmapped\": [ str ], \"n_pairs\": int, \"n_self\": int, \"pairs\": [ { \"id_a\": str, \"id_b\": str, \"taxon_a\": int, \"taxon_b\": int, \"bitscore\": float, \"self\": bool, \"name_a\": str, \"name_b\": str } ] }` — one record per reported unordered pair (incl. self-scores), id_a <= id_b.",
        "exampleArgs": {
          "symbols": [
            "TP53",
            "MDM2",
            "MDM4"
          ]
        }
      },
      {
        "id": "get_string_best_similarity_hits",
        "connector": "protein-annotation",
        "credentialKeys": [],
        "description": "Best homology hit per input protein in a target species (STRING /homology_best). target_species=null asks for the best hit across all species.",
        "input": {
          "type": "object",
          "properties": {
            "symbols": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "description": "Gene symbols in the source species."
            },
            "species": {
              "type": "integer",
              "default": 9606,
              "description": "Source NCBI taxonomy ID (9606 = human)."
            },
            "target_species": {
              "type": "integer",
              "description": "Target NCBI taxonomy ID; omit for best hit across all species."
            }
          },
          "required": [
            "symbols"
          ]
        },
        "required": [
          "symbols"
        ],
        "returns": "`{ \"species\": int, \"species_b\": int|null, \"mapped\": [...], \"unmapped\": [ str ], \"n_hits\": int, \"hits\": [ { \"query_id\": str, \"query_name\": str, \"query_taxon\": int, \"hit_id\": str, \"hit_taxon\": int, \"bitscore\": float } ] }` — one best-hit record per query protein, sorted by query STRING ID.",
        "exampleArgs": {
          "symbols": [
            "TP53"
          ],
          "target_species": 10090
        }
      }
    ]
  },
  {
    "id": "cancer-models",
    "displayName": "Cancer Models",
    "description": "Cancer genomics studies, cell models, expression, copy number, gene dependencies and drug responses via cBioPortal and DepMap/CCLE.",
    "useWhen": "Use when you need cancer genomics data from cBioPortal — listing or looking up cancer studies, samples and patients; retrieving patient/sample clinical values; fetching mRNA expression values for genes; the mutations of a gene in a study (recurrent protein changes, mutation types), a gene's mutation frequency across several studies, discrete copy-number alterations (deletions/amplifications) of a gene, or a study's clinical attributes and survival endpoints. Also use for DepMap/CCLE model identity, exact-gene RNA expression (log2(TPM+1)), WGS gene copy number relative to ploidy, Chronos gene effects and exact-compound PRISM secondary AUC profiles; preserve dataset releases, units and missing values.",
    "sources": [
      "cBioPortal",
      "DepMap / CCLE"
    ],
    "termsUrl": "https://www.cbioportal.org/faq",
    "requiresNcbi": false,
    "group": "featured",
    "tools": [
      {
        "connector": "cancer-models",
        "credentialKeys": [],
        "totalTimeoutMs": 25000,
        "maxResponseBytes": 1000000,
        "id": "depmap_search_models",
        "description": "Search DepMap/CCLE cancer models by name substring or exact ACH ModelID and return selected identity, lineage, disease and RRID metadata. Names may match multiple models: retain their distinct ModelIDs. No full model catalog download.",
        "input": {
          "type": "object",
          "properties": {
            "query": {
              "type": "string",
              "minLength": 2,
              "maxLength": 100,
              "pattern": "\\S"
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 20,
              "default": 10
            }
          },
          "required": [
            "query"
          ],
          "additionalProperties": false
        },
        "required": [
          "query"
        ],
        "exampleArgs": {
          "query": "A549"
        },
        "returns": "{ source, source_url, model_metadata_dataset, returned, has_more, records:[{model_id, CellLineName, OncotreeLineage, OncotreePrimaryDisease, CCLEName, RRID}] }. Missing fields remain null. has_more reports truncated search results, not a total count."
      },
      {
        "connector": "cancer-models",
        "credentialKeys": [],
        "totalTimeoutMs": 25000,
        "maxResponseBytes": 1000000,
        "id": "depmap_gene_dependency",
        "description": "Get one exact gene symbol’s DepMap Chronos gene-effect profile, optionally restricted to ModelIDs. Returns the strongest effects first, bounded to 50 models. Missing scores are unknown, not zero; negative gene effects are not dependency probabilities. Includes current dataset release and model annotations; no full matrix download.",
        "input": {
          "type": "object",
          "properties": {
            "gene": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{0,59}$"
            },
            "model_ids": {
              "type": "array",
              "items": {
                "type": "string",
                "pattern": "^ACH-[0-9]{6}$"
              },
              "minItems": 1,
              "maxItems": 20,
              "uniqueItems": true,
              "description": "Optional exact ModelIDs from depmap_search_models; omit for a ranked profile across models."
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50,
              "default": 20
            }
          },
          "required": [
            "gene"
          ],
          "additionalProperties": false
        },
        "required": [
          "gene"
        ],
        "exampleArgs": {
          "gene": "KRAS",
          "model_ids": [
            "ACH-000681"
          ]
        },
        "returns": "{ source, source_url, feature, dataset:{id,given_id,name,release,file,units}, model_metadata_dataset, total_models, missing_values, returned, truncated, unavailable_model_ids, sort, interpretation, records:[{model_id,CellLineName,OncotreeLineage,OncotreePrimaryDisease,CCLEName,RRID,score}] }. Counts cover the requested model scope before truncation; nulls sort last. Empty results mean no data for the exact request."
      },
      {
        "connector": "cancer-models",
        "credentialKeys": [],
        "totalTimeoutMs": 25000,
        "maxResponseBytes": 1000000,
        "id": "depmap_drug_response",
        "description": "Get one compound’s DepMap PRISM secondary screen AUC profile, optionally restricted to ModelIDs. Accepts an exact DPC compound ID or full compound name (case-insensitive exact match, no fuzzy substitution). Returns lowest AUC first, bounded to 50 models. AUC is not IC50 or viability; missing values stay null. Reports the PRISM release separately from model metadata.",
        "input": {
          "type": "object",
          "properties": {
            "compound": {
              "type": "string",
              "minLength": 2,
              "maxLength": 100,
              "pattern": "\\S"
            },
            "model_ids": {
              "type": "array",
              "items": {
                "type": "string",
                "pattern": "^ACH-[0-9]{6}$"
              },
              "minItems": 1,
              "maxItems": 20,
              "uniqueItems": true,
              "description": "Optional exact ModelIDs from depmap_search_models; omit for a ranked profile across models."
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50,
              "default": 20
            }
          },
          "required": [
            "compound"
          ],
          "additionalProperties": false
        },
        "required": [
          "compound"
        ],
        "exampleArgs": {
          "compound": "trametinib",
          "model_ids": [
            "ACH-000681"
          ]
        },
        "returns": "Same bounded score profile as depmap_gene_dependency, with feature set to the exact DPC ID and dataset.units=\"AUC\". Unknown or ambiguous compound names raise an error; known compounds without PRISM measurements return empty records. Missing measurements do not establish drug resistance."
      },
      {
        "connector": "cancer-models",
        "credentialKeys": [],
        "totalTimeoutMs": 25000,
        "maxResponseBytes": 1000000,
        "id": "depmap_gene_expression",
        "description": "Get one exact gene symbol’s current DepMap/CCLE RNA expression profile in log2(TPM+1), optionally restricted to ModelIDs. Returns highest expression first, at most 50 models, with release and model metadata. This is not raw TPM or z-score data. Use depmap_search_models to resolve cell line names to ModelIDs; no full matrix download.",
        "input": {
          "type": "object",
          "properties": {
            "gene": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{0,59}$"
            },
            "model_ids": {
              "type": "array",
              "items": {
                "type": "string",
                "pattern": "^ACH-[0-9]{6}$"
              },
              "minItems": 1,
              "maxItems": 20,
              "uniqueItems": true,
              "description": "Optional exact ModelIDs from depmap_search_models; omit for a ranked profile across models."
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50,
              "default": 20
            }
          },
          "required": [
            "gene"
          ],
          "additionalProperties": false
        },
        "required": [
          "gene"
        ],
        "exampleArgs": {
          "gene": "KRAS",
          "model_ids": [
            "ACH-000681"
          ]
        },
        "returns": "Same bounded profile envelope as depmap_gene_dependency, but records.score is RNA expression in dataset.units=\"log2(TPM+1)\", sorted descending with nulls last. Includes release, file, dataset UUID, model metadata provenance, total_models, missing_values, returned, truncated and unavailable_model_ids. Null/absent data are unknown; zero is a measured value."
      },
      {
        "connector": "cancer-models",
        "credentialKeys": [],
        "totalTimeoutMs": 25000,
        "maxResponseBytes": 1000000,
        "id": "depmap_copy_number",
        "description": "Get one exact gene symbol’s current DepMap/CCLE WGS gene copy-number profile relative to model ploidy, optionally restricted to ModelIDs. Returns highest relative copy number first, at most 50 models, with release and model metadata. Values are not absolute copies, log2 values or discrete amplification/deletion calls. Use depmap_search_models to resolve cell line names to ModelIDs.",
        "input": {
          "type": "object",
          "properties": {
            "gene": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{0,59}$"
            },
            "model_ids": {
              "type": "array",
              "items": {
                "type": "string",
                "pattern": "^ACH-[0-9]{6}$"
              },
              "minItems": 1,
              "maxItems": 20,
              "uniqueItems": true,
              "description": "Optional exact ModelIDs from depmap_search_models; omit for a ranked profile across models."
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50,
              "default": 20
            }
          },
          "required": [
            "gene"
          ],
          "additionalProperties": false
        },
        "required": [
          "gene"
        ],
        "exampleArgs": {
          "gene": "MYC",
          "model_ids": [
            "ACH-000681"
          ]
        },
        "returns": "Same bounded profile envelope as depmap_gene_dependency, but records.score is dataset.units=\"Copy number relative to ploidy\", sorted descending with nulls last. Includes release, file, dataset UUID, model metadata provenance, total_models, missing_values, returned, truncated and unavailable_model_ids. Null/absent data are unknown; preserve zero. No discrete event classification is inferred."
      },
      {
        "id": "cbioportal_list_studies",
        "connector": "cancer-models",
        "credentialKeys": [],
        "description": "List cBioPortal cancer studies, optionally filtered by a free-text keyword (name/description/cancer type) and/or an exact cancer-type id; returns study id, name, cancer type, reference genome, citation, and per-data-type sample counts.",
        "input": {
          "type": "object",
          "properties": {
            "keyword": {
              "type": "string",
              "description": "Free-text match on name/description/cancer type"
            },
            "cancer_type_id": {
              "type": "string",
              "description": "Exact cancer-type id filter (client-side), e.g. brca, difg"
            },
            "max_records": {
              "type": "integer",
              "default": 500
            }
          }
        },
        "returns": "`{ \"keyword\": str|null, \"cancer_type_id\": str|null, \"api_total_for_keyword\": int, \"count\": int, \"truncated\": bool, \"studies\": [ { \"study_id\": str, \"name\": str, \"description\": str, \"cancer_type_id\": str, \"cancer_type\": str, \"reference_genome\": str, \"pmid\": str, \"citation\": str, \"sequenced_sample_count\": int, \"cna_sample_count\": int, \"structural_variant_count\": int } ] }` — `api_total_for_keyword` is every study the keyword matched (before the `cancer_type_id` filter); `count` is after it; `studies` are sorted by `study_id`, capped at `max_records` (default 500), and `truncated` is true when `count` exceeds the cap.",
        "exampleArgs": {
          "keyword": "glioma"
        }
      },
      {
        "id": "cbioportal_get_study",
        "connector": "cancer-models",
        "credentialKeys": [],
        "description": "Get a cBioPortal cancer study by id: metadata, per-data-type sample counts, true sample/patient counts (from the study collections, not the display field), and its molecular profiles.",
        "input": {
          "type": "object",
          "properties": {
            "study_id": {
              "type": "string"
            }
          },
          "required": [
            "study_id"
          ]
        },
        "required": [
          "study_id"
        ],
        "returns": "`{ \"study_id\": str, \"name\": str, \"description\": str, \"cancer_type\": str, \"cancer_type_id\": str, \"reference_genome\": str, \"pmid\": str, \"citation\": str, \"public\": bool, \"groups\": str, \"import_date\": str, \"sample_count\": int, \"patient_count\": int, \"sequenced_sample_count\": int, \"cna_sample_count\": int, \"mrna_rnaseq_v2_sample_count\": int, \"rppa_sample_count\": int, \"structural_variant_count\": int, \"treatment_count\": int, ..., \"molecular_profiles\": [ { \"molecular_profile_id\": str, \"alteration_type\": str, \"datatype\": str, \"name\": str, \"description\": str } ] }` — `sample_count`/`patient_count` are the real collection sizes; `molecular_profiles` are sorted by id. Unknown study id throws \"Study not found\".",
        "exampleArgs": {
          "study_id": "msk_impact_2017"
        }
      },
      {
        "id": "cbioportal_mutations_in_gene",
        "connector": "cancer-models",
        "credentialKeys": [],
        "description": "All mutations of one gene (HUGO symbol) in a cBioPortal study, with recurrence aggregates: total mutations, mutated-sample count, mutation-type and protein-change distributions, and the most recurrent protein changes.",
        "input": {
          "type": "object",
          "properties": {
            "gene_symbol": {
              "type": "string",
              "description": "HUGO gene symbol, e.g. KRAS, IDH1"
            },
            "study_id": {
              "type": "string"
            },
            "max_records": {
              "type": "integer",
              "default": 100
            }
          },
          "required": [
            "gene_symbol",
            "study_id"
          ]
        },
        "required": [
          "gene_symbol",
          "study_id"
        ],
        "returns": "`{ \"gene\": { \"symbol\": str, \"entrez_gene_id\": int }, \"study_id\": str, \"molecular_profile_id\": str, \"total_mutations\": int, \"mutated_sample_count\": int, \"mutation_type_counts\": { str: int }, \"distinct_protein_changes\": int, \"top_protein_changes\": { str: int }, \"truncated\": bool, \"mutations\": [ { \"sample_id\": str, \"patient_id\": str, \"protein_change\": str, \"mutation_type\": str, \"mutation_status\": str, \"chromosome\": str, \"start_position\": int, \"end_position\": int, \"reference_allele\": str, \"variant_allele\": str, \"variant_type\": str, \"ncbi_build\": str, \"protein_pos_start\": int, \"protein_pos_end\": int, \"tumor_alt_count\": int, \"tumor_ref_count\": int, \"refseq_mrna_id\": str } ] }` — aggregates cover every mutation; `mutations` are sorted by genomic position and capped at `max_records` (default 100), with `truncated` set when they exceed it. `top_protein_changes` holds the 25 most recurrent. Unknown gene throws \"Gene not found\"; a study without mutation data throws, listing the alteration types it does have.",
        "exampleArgs": {
          "gene_symbol": "IDH1",
          "study_id": "difg_msk_2023"
        }
      },
      {
        "id": "cbioportal_mutation_frequency",
        "connector": "cancer-models",
        "credentialKeys": [],
        "description": "Mutation frequency of one gene across several cBioPortal studies (1–12): unique mutated samples divided by samples profiled for that gene in the selected mutation profile and sample list, accounting for targeted gene panels; ranked most-frequent first.",
        "input": {
          "type": "object",
          "properties": {
            "gene_symbol": {
              "type": "string",
              "description": "HUGO gene symbol, e.g. KRAS, IDH1"
            },
            "study_ids": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "minItems": 1,
              "maxItems": 12
            }
          },
          "required": [
            "gene_symbol",
            "study_ids"
          ]
        },
        "required": [
          "gene_symbol",
          "study_ids"
        ],
        "returns": "`{ \"gene\": { \"symbol\": str, \"entrez_gene_id\": int }, \"count\": int, \"frequencies\": [ { \"study_id\": str, \"study_name\": str, \"molecular_profile_id\": str, \"sample_list_id\": str, \"mutation_count\": int, \"mutated_samples\": int, \"sequenced_samples\": int, \"cohort_samples\": int, \"profiled_samples\": int, \"not_profiled_samples\": int, \"unknown_profile_samples\": int, \"frequency\": float | null, \"frequency_status\": str } ], \"unknown_studies\": [ str ], \"no_mutation_data\": [ str ] }` — `frequency` is an unrounded fraction (0–1), sorted descending with null last. `profiled_samples` is the gene-specific denominator; `cohort_samples` equals profiled + not_profiled + unknown_profile samples in the selected list. `sequenced_samples` is study metadata, not the denominator. `mutation_count` counts returned mutation records and `mutated_samples` counts their unique sample ids, without additional mutation-type filtering. `frequency_status` is `available`, `no_profiled_samples`, `incomplete_coverage`, or `inconsistent_mutation_data` (a mutation lacks a sample id or falls outside the known gene-profiled samples); only `available` has a numeric frequency. Zero means profiled samples with no reported mutation, not an untested gene. Unknown study ids go to `unknown_studies`, studies without a mutation profile / sample list to `no_mutation_data`. At most 12 ids are considered. Unknown gene throws \"Gene not found\".",
        "exampleArgs": {
          "gene_symbol": "KRAS",
          "study_ids": [
            "msk_impact_2017",
            "difg_msk_2023"
          ]
        }
      },
      {
        "id": "cbioportal_cna_in_gene",
        "connector": "cancer-models",
        "credentialKeys": [],
        "description": "Discrete copy-number alterations of one gene in a cBioPortal study, filtered by event type (deep deletion / amplification by default), with the full per-sample alteration distribution.",
        "input": {
          "type": "object",
          "properties": {
            "gene_symbol": {
              "type": "string",
              "description": "HUGO gene symbol, e.g. KRAS, IDH1"
            },
            "study_id": {
              "type": "string"
            },
            "event_type": {
              "type": "string",
              "enum": [
                "HOMDEL_AND_AMP",
                "HOMDEL",
                "AMP",
                "GAIN",
                "HETLOSS",
                "DIPLOID",
                "ALL"
              ],
              "default": "HOMDEL_AND_AMP"
            },
            "max_records": {
              "type": "integer",
              "default": 100
            }
          },
          "required": [
            "gene_symbol",
            "study_id"
          ]
        },
        "required": [
          "gene_symbol",
          "study_id"
        ],
        "returns": "`{ \"gene\": { \"symbol\": str, \"entrez_gene_id\": int }, \"study_id\": str, \"molecular_profile_id\": str, \"event_type\": str, \"total_events\": int, \"altered_sample_count\": int, \"alteration_counts\": { str: int }, \"truncated\": bool, \"events\": [ { \"sample_id\": str, \"patient_id\": str, \"alteration\": int, \"alteration_label\": str } ] }` — `alteration_counts` is the complete per-label distribution over the gene (deep_deletion/shallow_deletion/diploid/gain/amplification); `total_events`/`events` cover only rows matching `event_type` (default HOMDEL_AND_AMP), sorted by sample id and capped at `max_records`. Unknown gene throws \"Gene not found\"; a study without discrete CNA throws, listing its alteration types.",
        "exampleArgs": {
          "gene_symbol": "CDKN2A",
          "study_id": "msk_impact_2017"
        }
      },
      {
        "id": "cbioportal_clinical_attributes",
        "connector": "cancer-models",
        "credentialKeys": [],
        "description": "Clinical attributes defined in a cBioPortal study (patient- and sample-level fields), highlighting survival endpoints and whether overall-survival data is present.",
        "input": {
          "type": "object",
          "properties": {
            "study_id": {
              "type": "string"
            },
            "max_records": {
              "type": "integer",
              "default": 200
            }
          },
          "required": [
            "study_id"
          ]
        },
        "required": [
          "study_id"
        ],
        "returns": "`{ \"study_id\": str, \"total_attributes\": int, \"patient_level_count\": int, \"sample_level_count\": int, \"survival_attributes\": [ str ], \"has_overall_survival\": bool, \"truncated\": bool, \"attributes\": [ { \"attribute_id\": str, \"display_name\": str, \"description\": str, \"datatype\": \"STRING\"|\"NUMBER\", \"level\": \"patient\"|\"sample\", \"priority\": int } ] }` — `survival_attributes` are every OS_/DFS_/PFS_/DSS_ attribute id; `has_overall_survival` is true when both OS_STATUS and OS_MONTHS exist; `attributes` are sorted by id and capped at `max_records` (default 200).",
        "exampleArgs": {
          "study_id": "brca_tcga_pan_can_atlas_2018"
        }
      },
      {
        "id": "cbioportal_get_samples",
        "connector": "cancer-models",
        "credentialKeys": [],
        "description": "List cBioPortal samples in a study with detailed sample and patient identifiers. Optional sample_ids restrict the returned rows; max_records caps the response while preserving the true study count.",
        "input": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "study_id": {
              "type": "string",
              "minLength": 1,
              "pattern": "\\S"
            },
            "sample_ids": {
              "type": "array",
              "items": {
                "type": "string",
                "minLength": 1,
                "pattern": "\\S"
              },
              "minItems": 1,
              "maxItems": 1000
            },
            "max_records": {
              "type": "integer",
              "minimum": 1,
              "maximum": 10000,
              "default": 500
            }
          },
          "required": [
            "study_id"
          ]
        },
        "required": [
          "study_id"
        ],
        "returns": "`{ study_id, total, n_returned, truncated, samples: [{ sample_id, patient_id, study_id, ... }] }` — `total` is the complete study sample count before optional filtering and the output cap.",
        "exampleArgs": {
          "study_id": "brca_tcga_pan_can_atlas_2018",
          "max_records": 100
        }
      },
      {
        "id": "cbioportal_get_patients",
        "connector": "cancer-models",
        "credentialKeys": [],
        "description": "List cBioPortal patients in a study with detailed identifiers. Optional patient_ids restrict the returned rows; max_records caps the response while preserving the true study count.",
        "input": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "study_id": {
              "type": "string",
              "minLength": 1,
              "pattern": "\\S"
            },
            "patient_ids": {
              "type": "array",
              "items": {
                "type": "string",
                "minLength": 1,
                "pattern": "\\S"
              },
              "minItems": 1,
              "maxItems": 1000
            },
            "max_records": {
              "type": "integer",
              "minimum": 1,
              "maximum": 10000,
              "default": 500
            }
          },
          "required": [
            "study_id"
          ]
        },
        "required": [
          "study_id"
        ],
        "returns": "`{ study_id, total, n_returned, truncated, patients: [{ patient_id, study_id, ... }] }` — `total` is the complete study patient count before optional filtering and the output cap.",
        "exampleArgs": {
          "study_id": "brca_tcga_pan_can_atlas_2018",
          "max_records": 100
        }
      },
      {
        "id": "cbioportal_get_clinical_data",
        "connector": "cancer-models",
        "credentialKeys": [],
        "description": "Fetch cBioPortal clinical data values for explicit patient_ids or sample_ids matching level, optionally restricted to attribute_ids. Clinical values remain strings, including missing-value markers.",
        "input": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "study_id": {
              "type": "string",
              "minLength": 1,
              "pattern": "\\S"
            },
            "level": {
              "type": "string",
              "enum": [
                "SAMPLE",
                "PATIENT"
              ],
              "default": "SAMPLE"
            },
            "attribute_ids": {
              "type": "array",
              "items": {
                "type": "string",
                "minLength": 1,
                "pattern": "\\S"
              },
              "maxItems": 1000
            },
            "sample_ids": {
              "type": "array",
              "items": {
                "type": "string",
                "minLength": 1,
                "pattern": "\\S"
              },
              "minItems": 1,
              "maxItems": 1000
            },
            "patient_ids": {
              "type": "array",
              "items": {
                "type": "string",
                "minLength": 1,
                "pattern": "\\S"
              },
              "minItems": 1,
              "maxItems": 1000
            },
            "max_records": {
              "type": "integer",
              "minimum": 1,
              "maximum": 10000,
              "default": 1000
            }
          },
          "required": [
            "study_id"
          ]
        },
        "required": [
          "study_id"
        ],
        "returns": "`{ study_id, level, total, n_returned, truncated, clinical_data: [{ clinical_attribute_id, patient_id, sample_id, value, ... }] }`.",
        "exampleArgs": {
          "study_id": "brca_tcga_pan_can_atlas_2018",
          "level": "PATIENT",
          "attribute_ids": [
            "AGE"
          ],
          "patient_ids": [
            "TCGA-A1-A0SB"
          ]
        }
      },
      {
        "id": "cbioportal_get_molecular_data",
        "connector": "cancer-models",
        "credentialKeys": [],
        "description": "Fetch numeric mRNA or protein expression values from an explicit study molecular profile. Discover profiles with cbioportal_get_study; choose the measurement/normalization deliberately. Supply gene_symbol or entrez_gene_ids and exactly one of sample_ids or sample_list_id. Missing rows are not zero expression.",
        "input": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "study_id": {
              "type": "string",
              "minLength": 1,
              "pattern": "\\S"
            },
            "molecular_profile_id": {
              "type": "string",
              "minLength": 1,
              "pattern": "\\S"
            },
            "gene_symbol": {
              "type": "string",
              "description": "HUGO symbol, e.g. TP53"
            },
            "entrez_gene_ids": {
              "type": "array",
              "items": {
                "type": "integer"
              },
              "maxItems": 1000
            },
            "sample_ids": {
              "type": "array",
              "items": {
                "type": "string",
                "minLength": 1,
                "pattern": "\\S"
              },
              "minItems": 1,
              "maxItems": 1000
            },
            "sample_list_id": {
              "type": "string",
              "minLength": 1,
              "pattern": "\\S"
            },
            "max_records": {
              "type": "integer",
              "minimum": 1,
              "maximum": 10000,
              "default": 1000
            }
          },
          "required": [
            "study_id",
            "molecular_profile_id"
          ]
        },
        "required": [
          "study_id",
          "molecular_profile_id"
        ],
        "returns": "`{ study_id, molecular_profile_id, gene_ids, total, n_returned, truncated, molecular_data: [{ entrez_gene_id, sample_id, patient_id, value, ... }] }` — profile metadata describes the measurement and normalization; values are preserved without conversion.",
        "exampleArgs": {
          "study_id": "brca_tcga_pan_can_atlas_2018",
          "molecular_profile_id": "brca_tcga_pan_can_atlas_2018_rna_seq_v2_mrna",
          "gene_symbol": "ESR1",
          "sample_list_id": "brca_tcga_pan_can_atlas_2018_all"
        }
      }
    ]
  },
  {
    "id": "gdc",
    "displayName": "GDC",
    "description": "Cancer project, case and file inventories via the Genomic Data Commons API.",
    "useWhen": "Use when you need GDC project, case or file metadata and data inventories — including project summaries, case identifiers, file formats, checksums, access classification and Data Transfer Tool manifests.",
    "sources": [
      "Genomic Data Commons (GDC)"
    ],
    "termsUrl": "https://docs.gdc.cancer.gov/API/Users_Guide/Getting_Started/",
    "requiresNcbi": false,
    "group": "directory",
    "tools": [
      {
        "connector": "gdc",
        "credentialKeys": [],
        "id": "gdc_list_projects",
        "description": "List GDC cancer projects and their case/file summaries. Filters are explicit and bounded; this is metadata discovery, not a data download operation.",
        "input": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "project_ids": {
              "anyOf": [
                {
                  "type": "string",
                  "minLength": 1
                },
                {
                  "type": "array",
                  "items": {
                    "type": "string",
                    "minLength": 1
                  },
                  "minItems": 1,
                  "maxItems": 100
                }
              ]
            },
            "disease_type": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200
            },
            "primary_site": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200
            },
            "page": {
              "type": "integer",
              "minimum": 1,
              "maximum": 10000,
              "default": 1
            },
            "page_size": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            }
          }
        },
        "returns": "`{ page, page_size, returned, total, total_relation, next_page, projects: [{ project_id, name, program, disease_type, primary_site, state, dbgap_accession_number, case_count, file_count }] }`. Project/file counts are summaries from GDC metadata; no files are downloaded. Pagination is limited to 10000 pages. next_page is null when no further matches are reported, the total is unknown, or the page limit is reached; it does not by itself prove that all matches were retrieved. Narrow the filters when the page limit is reached with more matches remaining.",
        "exampleArgs": {
          "project_ids": "TCGA-BRCA",
          "page_size": 5
        }
      },
      {
        "connector": "gdc",
        "credentialKeys": [],
        "id": "gdc_list_cases",
        "description": "List GDC cases (sample donors) with project, disease and biospecimen metadata (samples and aliquots). Results identify cases and do not expose or download controlled data.",
        "input": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "project_ids": {
              "anyOf": [
                {
                  "type": "string",
                  "minLength": 1
                },
                {
                  "type": "array",
                  "items": {
                    "type": "string",
                    "minLength": 1
                  },
                  "minItems": 1,
                  "maxItems": 100
                }
              ]
            },
            "submitter_ids": {
              "anyOf": [
                {
                  "type": "string",
                  "minLength": 1
                },
                {
                  "type": "array",
                  "items": {
                    "type": "string",
                    "minLength": 1
                  },
                  "minItems": 1,
                  "maxItems": 100
                }
              ]
            },
            "case_ids": {
              "anyOf": [
                {
                  "type": "string",
                  "minLength": 1
                },
                {
                  "type": "array",
                  "items": {
                    "type": "string",
                    "minLength": 1
                  },
                  "minItems": 1,
                  "maxItems": 100
                }
              ]
            },
            "page": {
              "type": "integer",
              "minimum": 1,
              "maximum": 10000,
              "default": 1
            },
            "page_size": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            }
          }
        },
        "returns": "`{ page, page_size, returned, total, total_relation, next_page, cases: [{ case_id, submitter_id, project_id, project_name, disease_type, primary_site, state, samples }] }`. Each sample includes sample_id, submitter_id, sample_type, tissue_type, tumor_descriptor and aliquots (aliquot_id, submitter_id, portion_id, analyte_id). These are case-level biospecimens, not evidence that every sample contributed to a particular file. Missing samples/aliquots are empty arrays; file contents are not returned. Pagination is limited to 10000 pages. next_page is null when no further matches are reported, the total is unknown, or the page limit is reached; it does not by itself prove that all matches were retrieved. Narrow the filters when the page limit is reached with more matches remaining.",
        "exampleArgs": {
          "project_ids": [
            "TCGA-BRCA"
          ],
          "page_size": 5
        }
      },
      {
        "connector": "gdc",
        "credentialKeys": [],
        "id": "gdc_search_files",
        "description": "Search the GDC file inventory by project, case UUID, sample type and analysis workflow type (OR within each filter, AND across filters), and explicitly label each file as open or controlled access. Metadata discovery does not grant download access; controlled files require appropriate GDC authorization.",
        "input": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "project_ids": {
              "anyOf": [
                {
                  "type": "string",
                  "minLength": 1
                },
                {
                  "type": "array",
                  "items": {
                    "type": "string",
                    "minLength": 1
                  },
                  "minItems": 1,
                  "maxItems": 100
                }
              ]
            },
            "case_ids": {
              "anyOf": [
                {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 200
                },
                {
                  "type": "array",
                  "items": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200
                  },
                  "minItems": 1,
                  "maxItems": 100
                }
              ]
            },
            "sample_types": {
              "anyOf": [
                {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 200
                },
                {
                  "type": "array",
                  "items": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200
                  },
                  "minItems": 1,
                  "maxItems": 100
                }
              ]
            },
            "workflow_types": {
              "anyOf": [
                {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 200
                },
                {
                  "type": "array",
                  "items": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200
                  },
                  "minItems": 1,
                  "maxItems": 100
                }
              ]
            },
            "access": {
              "type": "string",
              "enum": [
                "all",
                "open",
                "controlled"
              ],
              "default": "all"
            },
            "data_category": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200
            },
            "data_type": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200
            },
            "data_format": {
              "type": "string",
              "minLength": 1,
              "maxLength": 50
            },
            "file_name": {
              "type": "string",
              "minLength": 1,
              "maxLength": 500
            },
            "page": {
              "type": "integer",
              "minimum": 1,
              "maximum": 10000,
              "default": 1
            },
            "page_size": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            }
          }
        },
        "returns": "`{ page, page_size, returned, total, total_relation, next_page, access_summary: { open, controlled, unknown }, controlled_files_require_authorization, files: [{ file_id, file_name, file_size_bytes, md5sum, data_format, data_type, data_category, access, state, project_id, cases, analysis, download_url, download_requires_authentication, download_status }], download_note }`. Open files expose a public data URL; controlled files deliberately expose no downloadable URL and are marked `requires_authorization`. No file bytes are downloaded. access_summary and controlled_files_require_authorization describe only the returned page. project_id is a single related-project summary; nested cases use the first case, not a complete list of related projects. cases preserves every file-linked case and its samples with sample_id, submitter_id, sample_type, tissue_type, tumor_descriptor and aliquots (aliquot_id, submitter_id, portion_id, analyte_id). Relationships come only from /files cases.samples, never from all biospecimens under /cases. Missing relationships are empty arrays and do not prove absence of biological sources. Sample-type filtering selects files; it does not remove other linked samples (e.g. a paired normal). analysis is null when absent, otherwise contains analysis_id, workflow_type, workflow_version and workflow_link; workflow metadata does not identify tumor/normal roles. Pagination is limited to 10000 pages. next_page is null when no further matches are reported, the total is unknown, or the page limit is reached; it does not by itself prove that all matches were retrieved. Narrow the filters when the page limit is reached with more matches remaining.",
        "exampleArgs": {
          "project_ids": [
            "TCGA-BRCA"
          ],
          "sample_types": "Primary Tumor",
          "workflow_types": "STAR - Counts",
          "access": "open",
          "page_size": 10
        }
      },
      {
        "connector": "gdc",
        "credentialKeys": [],
        "id": "gdc_get_file",
        "description": "Retrieve metadata for one GDC file UUID, including its open/controlled access classification. This performs no file download and does not claim that a listed file is downloadable for the current user.",
        "input": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "file_id": {
              "type": "string",
              "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-5][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$"
            }
          },
          "required": [
            "file_id"
          ]
        },
        "returns": "`{ file: { file_id, file_name, file_size_bytes, md5sum, data_format, data_type, data_category, access, state, project_id, cases, analysis, download_url, download_requires_authentication, download_status }, download_note }`. `download_url` is only returned for open-access files; controlled-access files require authorization and an `X-Auth-Token` outside this metadata call. project_id is a single related-project summary; nested cases use the first case, not a complete list of related projects. cases preserves every file-linked case and its samples with sample_id, submitter_id, sample_type, tissue_type, tumor_descriptor and aliquots (aliquot_id, submitter_id, portion_id, analyte_id). Relationships come only from /files cases.samples, never from all biospecimens under /cases. Missing relationships are empty arrays and do not prove absence of biological sources. Sample-type filtering selects files; it does not remove other linked samples (e.g. a paired normal). analysis is null when absent, otherwise contains analysis_id, workflow_type, workflow_version and workflow_link; workflow metadata does not identify tumor/normal roles.",
        "exampleArgs": {
          "file_id": "cb92f61d-041c-4424-a3e9-891b7545f351"
        }
      },
      {
        "connector": "gdc",
        "credentialKeys": [],
        "id": "gdc_get_manifest",
        "description": "Create a GDC Data Transfer Tool manifest for up to 100 file UUIDs. The returned manifest is an inventory only; it does not download files or bypass controlled-access authorization.",
        "input": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "file_ids": {
              "type": "array",
              "items": {
                "type": "string",
                "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-5][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$"
              },
              "minItems": 1,
              "maxItems": 100,
              "uniqueItems": true
            }
          },
          "required": [
            "file_ids"
          ]
        },
        "returns": "`{ file_ids: [str], manifest: str, download_note }`. `manifest` is the GDC Data Transfer Tool inventory text. It does not establish that every entry is downloadable; controlled-access entries still require authorization. Match manifest rows by UUID, not request order. If any requested UUID is not found, the request fails with HTTP 404 rather than returning a partial manifest.",
        "exampleArgs": {
          "file_ids": [
            "cb92f61d-041c-4424-a3e9-891b7545f351"
          ]
        }
      }
    ]
  },
  {
    "id": "rna",
    "displayName": "RNA",
    "description": "Non-coding RNA sequences and identifier mappings via RNAcentral, and family metadata, alignments, models and structures via Rfam.",
    "useWhen": "Use for RNAcentral sequence records and cross-database identifier mappings, or non-coding RNA families from Rfam (accession or family id, e.g. RF00005 / tRNA): family metadata (RNA type, seed/full counts, gathering/trusted/noise cutoffs, clan); the seed alignment (Stockholm or FASTA); the Infernal covariance model; the seed phylogenetic tree; full-region hits across sequence databases; PDB structure mappings; accession<->id conversion; and single-sequence cmscan search against all Rfam models.",
    "sources": [
      "Rfam",
      "RNAcentral"
    ],
    "termsUrl": "https://docs.rfam.org/en/latest/",
    "requiresNcbi": false,
    "group": "featured",
    "tools": [
      {
        "id": "get_rnacentral_record",
        "connector": "rna",
        "credentialKeys": [],
        "maxResponseBytes": 2000000,
        "description": "Fetch an RNAcentral sequence record by URS accession using API v1. Retains sequence, MD5, activity status, organism and RNA type metadata.",
        "input": {
          "type": "object",
          "properties": {
            "urs": {
              "type": "string",
              "pattern": "^URS[0-9A-F]{10}$"
            }
          },
          "required": [
            "urs"
          ],
          "additionalProperties": false
        },
        "required": [
          "urs"
        ],
        "exampleArgs": {
          "urs": "URS0000000001"
        },
        "returns": "{ source: \"RNAcentral\", api_version: \"v1\", source_url, record: { rnacentral_id, sequence, length, md5?, is_active?, ... } }. API version is not a dataset release. Linked resources are not fetched. Cite RNAcentral and the originating expert database."
      },
      {
        "id": "get_rnacentral_xrefs",
        "connector": "rna",
        "credentialKeys": [],
        "maxResponseBytes": 2000000,
        "description": "Map an RNAcentral URS accession to one page of expert-database identifiers. Retains source database, taxonomy, accession version, activity and first/last-seen dates; no automatic page traversal.",
        "input": {
          "type": "object",
          "properties": {
            "urs": {
              "type": "string",
              "pattern": "^URS[0-9A-F]{10}$"
            },
            "page": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100000,
              "default": 1
            },
            "page_size": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 10
            }
          },
          "required": [
            "urs"
          ],
          "additionalProperties": false
        },
        "required": [
          "urs"
        ],
        "exampleArgs": {
          "urs": "URS0000000001",
          "page": 1,
          "page_size": 10
        },
        "returns": "{ source: \"RNAcentral\", api_version: \"v1\", source_url, count, next, previous, next_page, results: [{ upi, database, taxid?, is_active?, first_seen?, last_seen?, accession: { id, ... }, ... }] }. Each page retains full mapping evidence. Links are informational and never followed."
      },
      {
        "id": "get_family",
        "connector": "rna",
        "credentialKeys": [],
        "description": "Rfam family metadata for an accession (RF00005) or family id (tRNA) — both resolve. Flattened record plus the full upstream JSON in \"raw\".",
        "input": {
          "type": "object",
          "properties": {
            "family": {
              "type": "string"
            }
          },
          "required": [
            "family"
          ]
        },
        "required": [
          "family"
        ],
        "returns": "`{ \"rfam_acc\": str, \"rfam_id\": str, \"description\": str, \"comment\": str, \"clan_acc\": str|null, \"clan_id\": str|null, \"rna_type\": str, \"structure_source\": str, \"num_seed\": int, \"num_full\": int, \"num_species\": int, \"gathering_cutoff\": float, \"trusted_cutoff\": float, \"noise_cutoff\": float, \"release_number\": str, \"release_date\": str, \"raw\": {…} }` — flattened metadata; `raw` is the complete upstream `rfam` record. Absent fields are `null`/`undefined`.",
        "exampleArgs": {
          "family": "RF00005"
        }
      },
      {
        "id": "get_seed_alignment",
        "connector": "rna",
        "credentialKeys": [],
        "description": "Seed alignment of an Rfam family in Stockholm (default, with consensus secondary-structure line) or aligned gapped FASTA.",
        "input": {
          "type": "object",
          "properties": {
            "family": {
              "type": "string"
            },
            "fmt": {
              "type": "string",
              "enum": [
                "stockholm",
                "fasta"
              ],
              "default": "stockholm"
            },
            "max_bytes": {
              "type": "integer",
              "default": 400000
            }
          },
          "required": [
            "family"
          ]
        },
        "required": [
          "family"
        ],
        "format": "text",
        "returns": "`{ \"family\": str, \"format\": str, \"num_sequences\": int, \"sequence_names\": [str], \"sha256\": str, \"alignment\": str }` — when the alignment exceeds `max_bytes` (default 400000) \"alignment\" is dropped and replaced by \"alignment_omitted\"/\"size_bytes\"; metadata, counts and sha256 are always present. Raise `max_bytes` to force the full body.",
        "exampleArgs": {
          "family": "RF00162",
          "fmt": "stockholm"
        }
      },
      {
        "id": "get_covariance_model",
        "connector": "rna",
        "credentialKeys": [],
        "description": "Infernal covariance model (CM file) of an Rfam family, usable directly with cmsearch/cmscan, plus parsed header fields.",
        "input": {
          "type": "object",
          "properties": {
            "family": {
              "type": "string"
            },
            "max_bytes": {
              "type": "integer",
              "default": 400000
            }
          },
          "required": [
            "family"
          ]
        },
        "required": [
          "family"
        ],
        "format": "text",
        "returns": "`{ \"family\": str, \"header\": { \"NAME\": str, \"ACC\": str, \"STATES\": int, \"CLEN\": int, \"W\": int, … }, \"size_bytes\": int, \"sha256\": str, \"cm\": str }` — when the CM exceeds `max_bytes` (default 400000) \"cm\" is dropped for \"cm_omitted\"; header, size_bytes and sha256 are always present.",
        "exampleArgs": {
          "family": "RF00162"
        }
      },
      {
        "id": "get_tree",
        "connector": "rna",
        "credentialKeys": [],
        "description": "Seed phylogenetic tree of an Rfam family (NHX/Newick text).",
        "input": {
          "type": "object",
          "properties": {
            "family": {
              "type": "string"
            }
          },
          "required": [
            "family"
          ]
        },
        "required": [
          "family"
        ],
        "format": "text",
        "returns": "`{ \"family\": str, \"num_leaf_labels\": int, \"sha256\": str, \"tree\": str }` — `tree` is NHX/Newick text; `num_leaf_labels` counts labelled leaves.",
        "exampleArgs": {
          "family": "RF00162"
        }
      },
      {
        "id": "get_sequence_regions",
        "connector": "rna",
        "credentialKeys": [],
        "description": "All full-region hits of an Rfam family across sequence databases (parsed TSV). Check num_full via get_family first — rfam.org 403s this route for very large families (e.g. RF00005).",
        "input": {
          "type": "object",
          "properties": {
            "family": {
              "type": "string"
            }
          },
          "required": [
            "family"
          ]
        },
        "required": [
          "family"
        ],
        "format": "text",
        "returns": "`{ \"family\": str, \"declared_count\": int|null, \"num_regions\": int, \"regions\": [ { \"sequence_accession\": str, \"bits_score\": str, \"region_start\": str, \"region_end\": str, \"sequence_description\": str, \"species\": str, \"ncbi_tax_id\": str } ] }` — `declared_count` is the server's own \"# found N regions\" header. Very large families surface an HTTP 403 error as-is.",
        "exampleArgs": {
          "family": "RF00162"
        }
      },
      {
        "id": "get_structure_mapping",
        "connector": "rna",
        "credentialKeys": [],
        "description": "PDB residue-level structure mappings of an Rfam family, deterministically sorted.",
        "input": {
          "type": "object",
          "properties": {
            "family": {
              "type": "string"
            }
          },
          "required": [
            "family"
          ]
        },
        "required": [
          "family"
        ],
        "returns": "`{ \"family\": str, \"num_mappings\": int, \"num_pdb_ids\": int, \"pdb_ids\": [str], \"mapping\": [ { \"pdb_id\": str, \"chain\": str, \"pdb_start\": int, \"pdb_end\": int, \"cm_start\": int, \"cm_end\": int, \"bit_score\": float, \"evalue_score\": str, \"rfam_acc\": str } ] }` — rows sorted by (pdb_id, chain, pdb_start, pdb_end, cm_start); exact per-row fields follow upstream. `mapping` is `[]` when no structures exist.",
        "exampleArgs": {
          "family": "RF00162"
        }
      },
      {
        "id": "accession_to_id",
        "connector": "rna",
        "credentialKeys": [],
        "description": "Convert an Rfam accession to its family id (e.g. RF00005 -> \"tRNA\").",
        "input": {
          "type": "object",
          "properties": {
            "accession": {
              "type": "string"
            }
          },
          "required": [
            "accession"
          ]
        },
        "required": [
          "accession"
        ],
        "format": "text",
        "returns": "`{ \"accession\": str, \"rfam_id\": str }` — echoes the input accession and its resolved family id.",
        "exampleArgs": {
          "accession": "RF00005"
        }
      },
      {
        "id": "id_to_accession",
        "connector": "rna",
        "credentialKeys": [],
        "description": "Convert an Rfam family id to its accession (e.g. \"tRNA\" -> RF00005).",
        "input": {
          "type": "object",
          "properties": {
            "family_id": {
              "type": "string"
            }
          },
          "required": [
            "family_id"
          ]
        },
        "required": [
          "family_id"
        ],
        "format": "text",
        "returns": "`{ \"rfam_id\": str, \"accession\": str }` — echoes the input id and its resolved RF##### accession. Throws when no accession resolves.",
        "exampleArgs": {
          "family_id": "tRNA"
        }
      },
      {
        "id": "search_sequence",
        "connector": "rna",
        "credentialKeys": [],
        "totalTimeoutMs": 600000,
        "description": "Search a single RNA/DNA sequence against all Rfam covariance models (async cmscan): submit a multipart sequence file to batch.rfam.org and poll until done. The whole call is capped at 600 seconds, including submission and polling. Submission is not automatically retried. Cancellation stops local polling; the provider retains job results for one week. Upstream failures are surfaced as errors.",
        "input": {
          "type": "object",
          "properties": {
            "sequence": {
              "type": "string"
            },
            "max_wait_s": {
              "type": "number",
              "default": 300
            },
            "poll_interval_s": {
              "type": "number",
              "default": 5
            }
          },
          "required": [
            "sequence"
          ]
        },
        "required": [
          "sequence"
        ],
        "returns": "`{ \"job_id\": str, \"num_hits\": int, \"families\": [str], \"hits\": { family_id: [ { e-value, score, alignment blocks, … } ] }, \"search_sequence\": str }` — hits grouped by matching family id. Surfaces upstream HTTP, invalid-response and timeout errors; no local fallback.",
        "exampleArgs": {
          "sequence": "GGUUCCGGGAAGGCAGCAGGUGGAAACCUGCCA"
        }
      }
    ]
  },
  {
    "id": "omics-archives",
    "displayName": "Omics Archives",
    "description": "Omics data archives — expression (ArrayExpress, GEO), sequencing reads (ENA), metabolomics (MetaboLights, Metabolomics Workbench), metagenomics (MGnify) and proteomics (PRIDE).",
    "useWhen": "Use when finding or looking up omics datasets across the major archives — functional-genomics / expression experiments in ArrayExpress (BioStudies) or NCBI GEO series (by keyword, organism, assay, or accession, with per-sample metadata); metabolomics studies and data files in MetaboLights (MTBLS), or Metabolomics Workbench (ST) study records, samples, experimental factors, analysis metadata and compound structures/cross-references; metagenomics studies, analyses and downloadable result files in MGnify (MGYS, by free text or biome lineage); or proteomics projects, proteins and paged project file inventories with download locations in PRIDE Archive (PXD/PRD, by keyword/organism/instrument/disease, or protein↔project). Discover GEO Series Matrix and NCBI-generated RNA-seq count files, or inspect matrix format, dimensions and sample correspondence. Discover ENA sequencing runs by taxonomy, library strategy and title/description keywords, or resolve ENA/INSDC study, experiment or sample accessions to runs. List archive-generated FASTQ URLs or original submitted file locations (including BAM/CRAM), sizes and MD5 checksums for a run.",
    "sources": [
      "ArrayExpress",
      "GEO",
      "ENA",
      "MetaboLights",
      "Metabolomics Workbench",
      "MGnify",
      "PRIDE"
    ],
    "termsUrl": "https://www.ebi.ac.uk/about/terms-of-use",
    "requiresNcbi": true,
    "group": "featured",
    "tools": [
      {
        "id": "ena_query_runs",
        "connector": "omics-archives",
        "credentialKeys": [],
        "description": "Discover public sequencing runs by NCBI tax_id (including descendant taxa), library_strategy and/or a keyword in study, experiment or sample titles and run descriptions. Supplied filters are combined with AND; at least one is required. Taxonomy describes the sequenced organism, not the host of a microbiome sample. Keyword is a literal substring, not ENA query syntax; double quotes, backslashes, wildcards and control characters are rejected. Includes public metagenome records. Returns bounded metadata only, not a complete cohort when truncated. Narrow filters to retrieve a smaller set; repeated calls are not pagination. For known INSDC accessions use ena_search_runs.",
        "input": {
          "type": "object",
          "properties": {
            "tax_id": {
              "type": "integer",
              "minimum": 1,
              "maximum": 2147483647
            },
            "library_strategy": {
              "type": "string",
              "enum": [
                "AMPLICON",
                "ATAC-seq",
                "Bisulfite-Seq",
                "CLONE",
                "CLONEEND",
                "CTS",
                "ChIA-PET",
                "ChIP-Seq",
                "ChM-Seq",
                "DNase-Hypersensitivity",
                "EST",
                "FAIRE-seq",
                "FINISHING",
                "FL-cDNA",
                "GBS",
                "Hi-C",
                "MBD-Seq",
                "MNase-Seq",
                "MRE-Seq",
                "MeDIP-Seq",
                "NOMe-Seq",
                "OTHER",
                "POOLCLONE",
                "RAD-Seq",
                "RIP-Seq",
                "RNA-Seq",
                "Ribo-Seq",
                "SELEX",
                "Synthetic-Long-Read",
                "Targeted-Capture",
                "Tethered Chromatin Conformation Capture",
                "Tn-Seq",
                "VALIDATION",
                "WCS",
                "WGA",
                "WGS",
                "WXS",
                "miRNA-Seq",
                "ncRNA-Seq",
                "snRNA-seq",
                "ssRNA-seq"
              ]
            },
            "keyword": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200,
              "pattern": "^(?=[\\s\\S]*\\S)[^\"\\\\*?\\u0000-\\u001f\\u007f]+$"
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000,
              "default": 100
            }
          },
          "anyOf": [
            {
              "properties": {
                "tax_id": {}
              },
              "required": [
                "tax_id"
              ]
            },
            {
              "properties": {
                "library_strategy": {}
              },
              "required": [
                "library_strategy"
              ]
            },
            {
              "properties": {
                "keyword": {}
              },
              "required": [
                "keyword"
              ]
            }
          ],
          "additionalProperties": false
        },
        "returns": "{ filters:{tax_id:number|null, library_strategy:string|null, keyword:string|null}, query, n_runs_returned, truncated, runs:[{run_accession, study_accession, secondary_study_accession, sample_accession, experiment_accession, tax_id, scientific_name, instrument_platform, instrument_model, library_layout, library_strategy, library_source, study_title, experiment_title, sample_title, description}] }. Run metadata values are strings or null. query is the generated ENA expression. Requests limit+1 rows to detect truncation; n_runs_returned is not a total. ENA chooses the subset in unspecified order; returned rows are sorted by run_accession. No offset or continuation token and no local result cache. Pass a run_accession to ena_get_run_files for generated FASTQ or ena_get_submitted_files for original submissions.",
        "exampleArgs": {
          "tax_id": 6239,
          "library_strategy": "RNA-Seq",
          "keyword": "transcriptome",
          "limit": 20
        }
      },
      {
        "id": "ena_get_submitted_files",
        "connector": "omics-archives",
        "credentialKeys": [],
        "description": "List original submitted files for one ERR/SRR/DRR run, including submitted BAM, CRAM or FASTQ when ENA exposes them. Returns FTP locations, submitted formats, byte sizes and MD5 checksums as metadata only. Does not download, convert formats, retrieve reference genomes or verify checksums. These are submitted files, not the archive-generated FASTQ returned by ena_get_run_files and not a list of archive-generated SRA containers. A CRAM may require its matching reference for analysis.",
        "input": {
          "type": "object",
          "properties": {
            "run_accession": {
              "type": "string",
              "minLength": 1,
              "maxLength": 64
            }
          },
          "required": [
            "run_accession"
          ],
          "additionalProperties": false
        },
        "required": [
          "run_accession"
        ],
        "returns": "{run_accession, found, library_layout:string|null, submitted_available, n_files, submitted_files:[{file_index, ftp_location, format:string|null, size_bytes:number|null, md5:string|null}]}. found means a public run report was returned; found:true with submitted_available:false means no submitted FTP files are listed, not that the run is missing. file_index is 1-based report order, not read/mate identity. Locations, formats, sizes and checksums are aligned by position; inconsistent lists fail, missing metadata values are null. ftp_location preserves the upstream address, often a scheme-less FTP path: filenames may contain literal # or other URI-reserved characters, so it must not be parsed as an already encoded URL. MD5s are validated as hexadecimal and normalized to lowercase. Metadata comes from ENA cache and may lag updates; no local cache is added.",
        "exampleArgs": {
          "run_accession": "ERR10015065"
        }
      },
      {
        "id": "ena_search_runs",
        "connector": "omics-archives",
        "credentialKeys": [],
        "description": "Find public sequencing runs associated with one ENA/INSDC study, experiment, sample or run accession. Accepts PRJ/ERP/SRP/DRP, ERX/SRX/DRX, SAM/ERS/SRS/DRS and ERR/SRR/DRR identifiers; GEO GSE/GSM, ArrayExpress E-MTAB and MGnify MGYS identifiers need their linked INSDC accession first. Accession lookup only, not keyword search. Returns organism and library metadata without fetching data files. The result is capped at 1000 runs; a truncated result is not a complete cohort, and repeated calls are not pagination because ENA provides no offset or continuation token. Use a narrower sample or experiment accession when complete coverage is required.",
        "input": {
          "type": "object",
          "properties": {
            "accession": {
              "type": "string",
              "minLength": 1,
              "maxLength": 64
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000,
              "default": 100
            }
          },
          "required": [
            "accession"
          ],
          "additionalProperties": false
        },
        "required": [
          "accession"
        ],
        "returns": "{ accession, n_runs_returned, truncated, runs: [{ run_accession, study_accession, secondary_study_accession, sample_accession, experiment_accession, tax_id, scientific_name, instrument_platform, instrument_model, library_layout, library_strategy, library_source }] }. Metadata values are strings or null, including tax_id. Requests limit+1 rows to detect truncation; n_runs_returned is not a total. ENA selects the subset in unspecified order; returned rows are sorted by run_accession. No public matches yields runs:[]; this does not distinguish an unknown/private accession from a study without public runs. No offset or next-page token. Pass run_accession to ena_get_run_files.",
        "exampleArgs": {
          "accession": "PRJNA123835",
          "limit": 100
        }
      },
      {
        "id": "ena_get_run_files",
        "connector": "omics-archives",
        "credentialKeys": [],
        "description": "Get archive-generated FASTQ download URLs, byte sizes and upstream MD5 checksums for one ERR/SRR/DRR run. Returns a file inventory only; no download or checksum verification. Retains every file in report order, including unpaired or long-read files; library_layout=PAIRED does not imply exactly two files. file_index is positional only and is not an R1/R2 or mate identifier. Some runs (including some single-cell/native-format submissions) have no archive-generated FASTQ. Submitted BAM/CRAM/SRA files are outside this tool.",
        "input": {
          "type": "object",
          "properties": {
            "run_accession": {
              "type": "string",
              "minLength": 1,
              "maxLength": 64
            }
          },
          "required": [
            "run_accession"
          ],
          "additionalProperties": false
        },
        "required": [
          "run_accession"
        ],
        "returns": "{ run_accession, found, library_layout:string|null, fastq_available, n_files, fastq_files:[{ file_index, url, size_bytes:number|null, md5:string|null }] }. found means a public run report was returned; found:true with fastq_available:false is a run without listed archive-generated FASTQ, not a missing run. file_index is 1-based report order, not read/mate identity. URLs, sizes and MD5s are paired by position; unknown sizes/checksums are null, inconsistent lists fail. Scheme-less ENA FTP paths receive ftp://; sizes/checksums describe the downloadable files (typically .fastq.gz), not decompressed content. Reports come from ENA cache and may lag updates; no local result cache is added.",
        "exampleArgs": {
          "run_accession": "SRR037073"
        }
      },
      {
        "id": "geo_get_matrix_files",
        "connector": "omics-archives",
        "credentialKeys": [],
        "maxResponseBytes": 2097152,
        "description": "Discover Series Matrix files and NCBI-generated RNA-seq raw counts, FPKM/TPM and gene annotation files for one GSE from live NCBI listings. Returns advertised URLs, not downloaded matrices or verified file contents. Start with geo_get_series for sample metadata. Offer the official URL for manual download by the user, then use geo_preflight_matrix on locally read decompressed text. Missing or failed listings do not prove absence of data; also inspect the series supplementary files.",
        "input": {
          "type": "object",
          "properties": {
            "accession": {
              "type": "string",
              "pattern": "^GSE[1-9][0-9]*$"
            }
          },
          "required": [
            "accession"
          ],
          "additionalProperties": false
        },
        "required": [
          "accession"
        ],
        "returns": "{accession, files:[{name,url,kind,format,compression,platform_id,source_url}], sources:[{url,status,error?}], status, next_steps}. kind separates series_matrix, raw_counts, normalized_counts and gene_annotation. status is ok when both sources list recognized files, partial when files are found but a source fails or has no recognized links, and unrecognized when no files are recognized. None proves an exhaustive inventory or absence of data. If both sources are unavailable, the call throws with source errors. Never infer matrix dimensions or sample coverage from these filenames.",
        "exampleArgs": {
          "accession": "GSE164073"
        }
      },
      {
        "id": "geo_preflight_matrix",
        "connector": "omics-archives",
        "credentialKeys": [],
        "description": "Preflight decompressed dense TSV or Series Matrix text (up to 8 MiB) without network or filesystem access. Supply samples from geo_get_series (accession, title, platform_id) to map columns by GSM, never by position. Only plain TSV supports unique exact title matching; GSM-shaped columns never fall back to titles. Series Matrix requires exactly one !Sample_geo_accession header containing valid GSM accessions matching the sample column count and order, and never falls back to title matching. For larger files use complete:false and perform full validation in the analysis environment. For plain TSV previews, pass the table header plus complete preview rows. For Series Matrix previews, also preserve the preceding metadata, including !Sample_geo_accession and any !Sample_platform_id header, and !series_matrix_table_begin; do not submit only the table or fabricate !series_matrix_table_end. Set complete:true only when text contains the entire file. For plain TSV, completeness is caller-declared, not independently verified. A preview cannot establish total dimensions. Does not handle sparse Matrix Market, archives, HDF5 or multiline TSV fields. Preserve sample_mapping column order when preparing the analysis matrix.",
        "input": {
          "type": "object",
          "properties": {
            "text": {
              "type": "string",
              "minLength": 1,
              "maxLength": 8388608
            },
            "complete": {
              "type": "boolean",
              "default": false
            },
            "matrix_kind": {
              "type": "string",
              "enum": [
                "series_matrix",
                "raw_counts",
                "normalized_counts",
                "unknown"
              ],
              "default": "unknown"
            },
            "samples": {
              "type": "array",
              "maxItems": 10000,
              "items": {
                "type": "object",
                "properties": {
                  "accession": {
                    "type": "string",
                    "pattern": "^GSM[1-9][0-9]*$"
                  },
                  "title": {
                    "type": "string"
                  },
                  "platform_id": {
                    "type": "string",
                    "pattern": "^GPL[1-9][0-9]*$"
                  }
                },
                "required": [
                  "accession"
                ],
                "additionalProperties": true
              }
            }
          },
          "required": [
            "text"
          ],
          "additionalProperties": false
        },
        "required": [
          "text"
        ],
        "returns": "{format,matrix_kind,complete,dimensions:{features:number|null,features_observed,samples},feature_column,sample_mapping:[{column_index,column,accession,matched_by,status}],metadata_samples_not_in_matrix,diagnostics,issues,warnings,structural_checks_passed,analysis_notes}. column_index is one-based among sample columns. features is null for partial input; structural_checks_passed requires complete numeric data and unambiguous sample mapping. Series Matrix platform conflicts are issues; multiple platforms alone are advisory warnings. It is not an analysis-readiness guarantee.",
        "exampleArgs": {
          "text": "GeneID\tGSM5000001\n1\t12\n",
          "complete": false,
          "matrix_kind": "raw_counts",
          "samples": [
            {
              "accession": "GSM5000001"
            }
          ]
        }
      },
      {
        "connector": "omics-archives",
        "credentialKeys": [],
        "maxResponseBytes": 5242880,
        "returns": "{source, source_url, records: [upstream record with original fields], returned, total_received, truncated}. Counts describe this response, not a verified database total. limit caps local output only.",
        "id": "workbench_search_compounds",
        "description": "Look up Metabolomics Workbench compounds by registry number, formula, InChIKey, or a PubChem, HMDB, KEGG, ChEBI, LIPID MAPS or MetaCyc cross-reference. Returns available SMILES, structure identifiers, formula, exact mass and cross-references. Compound names are not a supported input; resolve names with PubChem first.",
        "input": {
          "type": "object",
          "properties": {
            "field": {
              "type": "string",
              "enum": [
                "regno",
                "formula",
                "inchi_key",
                "lm_id",
                "pubchem_cid",
                "hmdb_id",
                "kegg_id",
                "chebi_id",
                "metacyc_id"
              ]
            },
            "query": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000,
              "default": 100,
              "description": "Maximum returned records, applied locally after fetching one bounded response. The API has no pagination."
            }
          },
          "required": [
            "field",
            "query"
          ],
          "additionalProperties": false
        },
        "required": [
          "field",
          "query"
        ],
        "exampleArgs": {
          "field": "pubchem_cid",
          "query": "5793"
        }
      },
      {
        "connector": "omics-archives",
        "credentialKeys": [],
        "maxResponseBytes": 5242880,
        "returns": "{source, source_url, records: [upstream record with original fields], returned, total_received, truncated}. Counts describe this response, not a verified database total. limit caps local output only. Upstream study_url values are preserved without correction and may contain the search term instead of a study ID. Use source_url to trace the API response and study_id with workbench_get_study to retrieve a study.",
        "id": "workbench_search_studies",
        "description": "Search public Metabolomics Workbench study summaries by a title substring or institute. Returns study IDs and available species, sample counts, analysis types and license metadata. Use workbench_get_study for a selected study’s samples, experimental factors, analyses or metabolite annotations.",
        "input": {
          "type": "object",
          "properties": {
            "field": {
              "type": "string",
              "enum": [
                "study_title",
                "institute"
              ],
              "default": "study_title"
            },
            "query": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000,
              "default": 100,
              "description": "Maximum returned records, applied locally after fetching one bounded response. The API has no pagination."
            }
          },
          "required": [
            "query"
          ],
          "additionalProperties": false
        },
        "required": [
          "query"
        ],
        "exampleArgs": {
          "query": "Diabetes",
          "limit": 20
        }
      },
      {
        "connector": "omics-archives",
        "credentialKeys": [],
        "maxResponseBytes": 5242880,
        "returns": "{study_id, section, ...result}; result: {source, source_url, records: [upstream record with original fields], returned, total_received, truncated}. Counts describe this response, not a verified database total. limit caps local output only. Upstream study_url values are preserved without correction and may contain the search term instead of a study ID. Use source_url to trace the API response and study_id with workbench_get_study to retrieve a study.",
        "id": "workbench_get_study",
        "description": "Retrieve one public Metabolomics Workbench study (ST followed by six digits). Select summary for the study record; factors for samples, sample sources and experimental variables; analysis for instrument and experimental metadata; metabolites for measured metabolite annotations and cross-references. Preserves upstream fields and factor text. Does not download raw files or measurement matrices.",
        "input": {
          "type": "object",
          "properties": {
            "study_id": {
              "type": "string",
              "pattern": "^ST[0-9]{6}$"
            },
            "section": {
              "type": "string",
              "enum": [
                "summary",
                "factors",
                "analysis",
                "metabolites"
              ],
              "default": "summary"
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000,
              "default": 100,
              "description": "Maximum returned records, applied locally after fetching one bounded response. The API has no pagination."
            }
          },
          "required": [
            "study_id"
          ],
          "additionalProperties": false
        },
        "required": [
          "study_id"
        ],
        "exampleArgs": {
          "study_id": "ST000001",
          "section": "factors"
        }
      },
      {
        "id": "arrayexpress_search_experiments",
        "connector": "omics-archives",
        "credentialKeys": [
          "ncbiEmail",
          "ncbiApiKey"
        ],
        "description": "Search ArrayExpress functional-genomics experiments (BioStudies) with complete, totalHits-verified retrieval; filters (query, organism, study_type, technology, release-date range, extra facets) combine with AND.",
        "input": {
          "type": "object",
          "properties": {
            "query": {
              "type": "string",
              "description": "Free text (BioStudies/Lucene syntax)"
            },
            "organism": {
              "type": "string",
              "description": "e.g. 'Homo sapiens'"
            },
            "study_type": {
              "type": "string",
              "description": "e.g. 'ChIP-seq'"
            },
            "technology": {
              "type": "string",
              "description": "e.g. 'sequencing assay', 'array assay'"
            },
            "released_after": {
              "type": "string",
              "description": "Inclusive ISO date YYYY-MM-DD"
            },
            "released_before": {
              "type": "string",
              "description": "Inclusive ISO date YYYY-MM-DD"
            },
            "extra_facets": {
              "type": "object",
              "additionalProperties": {
                "type": "string"
              }
            },
            "max_records": {
              "type": "integer",
              "default": 50
            }
          }
        },
        "returns": "`{ \"total_hits\": int, \"is_total_exact\": bool, \"truncated\": bool, \"params\": {...}, \"records\": [ { \"accession\": str, \"title\": str, \"release_date\": str, \"files\": int, \"links\": int, \"is_public\": bool } ] }` — every match is walked and the unique count verified against `total_hits`; `records` is capped at `max_records` (default 50) with `truncated=true`, `total_hits` still the full count. Sorted release_date desc, accession asc.",
        "exampleArgs": {
          "organism": "Homo sapiens",
          "study_type": "ChIP-seq",
          "max_records": 50
        }
      },
      {
        "id": "arrayexpress_get_experiment",
        "connector": "omics-archives",
        "credentialKeys": [
          "ncbiEmail",
          "ncbiApiKey"
        ],
        "description": "Fetch one ArrayExpress experiment (BioStudies) as a flattened analyst record — study type, organisms, assay/sample counts, designs/factors, authors, publications, protocols, array designs, and file summary.",
        "input": {
          "type": "object",
          "properties": {
            "accession": {
              "type": "string",
              "description": "e.g. 'E-MTAB-5061'"
            }
          },
          "required": [
            "accession"
          ]
        },
        "required": [
          "accession"
        ],
        "returns": "`{ \"accession\", \"title\", \"release_date\", \"study_type\", \"organisms\": [str], \"description\", \"assay_count\", \"sample_count\", \"technology\", \"assay_by_molecule\", \"experimental_designs\": [str], \"experimental_factors\": [str], \"authors\": [{name,email,role,affiliations}], \"submitter_organizations\": [str], \"publications\": [{accno,title,authors,doi,status}], \"protocol_count\", \"protocol_types\": [str], \"array_designs\": [str], \"file_count\", \"files_by_type\": {type:count}, \"total_file_bytes\", \"links\": [{target,type}] }` — absent attributes are undefined.",
        "exampleArgs": {
          "accession": "E-MTAB-5061"
        }
      },
      {
        "id": "arrayexpress_get_experiment_files",
        "connector": "omics-archives",
        "credentialKeys": [
          "ncbiEmail",
          "ncbiApiKey"
        ],
        "description": "List every file of an ArrayExpress experiment (name, size, type, format, description) with download URLs, plus the /info endpoint file count carried alongside for comparison.",
        "input": {
          "type": "object",
          "properties": {
            "accession": {
              "type": "string",
              "description": "e.g. 'E-MTAB-5061'"
            }
          },
          "required": [
            "accession"
          ]
        },
        "required": [
          "accession"
        ],
        "returns": "`{ \"accession\", \"n_files\": int, \"files\": [ { \"path\", \"size_bytes\", \"type\", \"format\", \"description\", \"download_url\" } ], \"info_reported_file_count\": int, \"http_link\", \"ftp_link\", \"rel_path\" }` — files sorted by path.",
        "exampleArgs": {
          "accession": "E-MTAB-5061"
        }
      },
      {
        "id": "arrayexpress_get_experiment_samples",
        "connector": "omics-archives",
        "credentialKeys": [
          "ncbiEmail",
          "ncbiApiKey"
        ],
        "description": "Fetch relationship rows from the first SDRF file sorted by path for an ArrayExpress experiment, preserving every sample/assay/file relationship in that file (trimmed MAGE-TAB headers, repeats suffixed #2/#3). Count distinct named sample/source identifiers, not independent biological replicates, using Sample Name in preference to Source Name. Experiments with no SDRF return {\"error\":\"no_sdrf\"}.",
        "input": {
          "type": "object",
          "properties": {
            "accession": {
              "type": "string",
              "description": "e.g. 'E-MTAB-5061'"
            },
            "max_rows_returned": {
              "type": "integer",
              "default": 200
            }
          },
          "required": [
            "accession"
          ]
        },
        "required": [
          "accession"
        ],
        "returns": "`{ \"accession\", \"sdrf_file\", \"sdrf_size_bytes\", \"headers\": [str], \"sample_id_column\": str|null, \"n_samples\": int|null, \"samples\": [ {header: value} ], \"n_samples_returned\": int|null, \"n_rows_total\": int, \"n_rows_returned\": int, \"rows_truncated\": bool }` — Only the first SDRF file sorted by path is read; counts and relationship rows refer to that file, not the entire experiment. `samples` contains relationship rows capped at `max_rows_returned` (default 200), without deduplication. Lines starting with # are skipped as comments before parsing and capping. `n_rows_total`/`n_rows_returned` provide the former row counts. Corrected legacy `n_samples`/`n_samples_returned` count distinct identifiers in all/returned rows using `sample_id_column`: the first Sample Name header, otherwise the first Source Name header (case-insensitive matching after trimming and removing optional outer double quotes for matching only; record keys remain unchanged). Values are trimmed and case-preserved; these counts are not independent biological replicates. A missing identity column or blank/missing identifier makes the corresponding nonempty row set count null. Empty row sets count 0. No SDRF or an empty file has null `sample_id_column` and zero counts as an empty parsed-row sentinel, not evidence that the experiment has no samples.",
        "exampleArgs": {
          "accession": "E-MTAB-5061",
          "max_rows_returned": 200
        }
      },
      {
        "id": "geo_search_series",
        "connector": "omics-archives",
        "credentialKeys": [
          "ncbiEmail",
          "ncbiApiKey"
        ],
        "description": "Search NCBI GEO DataSets (db=gds) and return series-level records (trimmed esummary docs). `term` is full E-utilities syntax; add gse[ETYP] to restrict to series.",
        "input": {
          "type": "object",
          "properties": {
            "term": {
              "type": "string",
              "description": "E-utilities query, e.g. 'asthma AND gse[ETYP]'"
            },
            "retmax": {
              "type": "integer",
              "default": 500
            }
          },
          "required": [
            "term"
          ]
        },
        "required": [
          "term"
        ],
        "returns": "`{ \"term\": str, \"count\": int, \"retrieved\": int, \"complete\": bool, \"records\": [ { \"accession\", \"title\", \"summary\", \"gdstype\", \"taxon\", \"n_samples\", \"pdat\", \"ftplink\", \"bioproject\", \"pubmedids\", \"samples\": [{accession,title}], ... } ] }` — `count` is esearch's own total (may exceed `retrieved` when > retmax); records sorted by accession.",
        "exampleArgs": {
          "term": "asthma AND gse[ETYP]",
          "retmax": 20
        }
      },
      {
        "id": "geo_get_series",
        "connector": "omics-archives",
        "credentialKeys": [
          "ncbiEmail",
          "ncbiApiKey"
        ],
        "description": "Fetch structured metadata for GEO series (GSE accessions) with samples included — series title/summary/design, platforms, samples with characteristics and library info, and supplementary-file URLs. Sample channels preserve source_name, organism, characteristics, molecule and label separately; flat source_name, characteristics and molecule refer to channel 1. Use channels for dual-channel experiments and dye swaps. Data tables are never downloaded. Use geo_get_matrix_files next to discover Series Matrix and NCBI-generated RNA-seq count files, then geo_preflight_matrix to check decompressed data against these samples.",
        "input": {
          "type": "object",
          "properties": {
            "accessions": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "description": "GSE accessions, e.g. ['GSE131907']"
            }
          },
          "required": [
            "accessions"
          ]
        },
        "required": [
          "accessions"
        ],
        "returns": "`{ \"n_requested\": int (accessions requested, before de-duplication), \"records\": [ { \"accession\", \"title\", \"organism\": [str], \"series_type\": [str], \"status\", \"submission_date\", \"last_update_date\", \"summary\", \"overall_design\", \"pubmed_ids\": [str], \"platforms\": [str], \"n_samples\": int, \"samples\": [ {accession,title,organism,characteristics:[{tag,value}],library_strategy,instrument_model,...} ], \"supplementary_files\": {series:[str],samples:{acc:[str]},ftp_root}, \"esummary\": {...} } ] }` — records ordered by accession.",
        "exampleArgs": {
          "accessions": [
            "GSE131907"
          ]
        }
      },
      {
        "id": "metabolights_list_studies",
        "connector": "omics-archives",
        "credentialKeys": [
          "ncbiEmail",
          "ncbiApiKey"
        ],
        "description": "List every public MetaboLights study accession (numerically sorted) with the API's own reported count. There is no server-side study search — filter fetched candidates by title/descriptor instead.",
        "input": {
          "type": "object",
          "properties": {}
        },
        "returns": "`{ \"accessions\": [str], \"count\": int, \"reported_count\": int }` — full accession list (MTBLS1, MTBLS2, ...); `count` and `reported_count` should agree.",
        "exampleArgs": {}
      },
      {
        "id": "metabolights_get_studies",
        "connector": "omics-archives",
        "credentialKeys": [
          "ncbiEmail",
          "ncbiApiKey"
        ],
        "description": "Fetch structured metadata for MetaboLights studies (MTBLSxxx) from the parsed ISA payload — title, status, years, organisms, assays, factors, descriptors, sample count, protocols; optional per-sample table with unique column keys preserving ISA column order and associations. Unknown/private accessions go in not_found.",
        "input": {
          "type": "object",
          "properties": {
            "accessions": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "description": "e.g. ['MTBLS1']"
            },
            "include_samples": {
              "type": "boolean",
              "default": false
            },
            "max_sample_rows_returned": {
              "type": "integer",
              "default": 200
            }
          },
          "required": [
            "accessions"
          ]
        },
        "required": [
          "accessions"
        ],
        "returns": "`{ \"n_requested\": int, \"records\": [ { \"accession\", \"title\", \"description\", \"study_status\", \"release_year\", \"submission_year\", \"organisms\": [{organism,organism_part}], \"organism_names\": [str], \"assays\": [{assay_number,measurement,technology,platform,filename}], \"assay_count\", \"technologies\": [str], \"factors\": [str], \"descriptors\": [str], \"sample_count\", \"protocols\": [{name,description}], \"sample_table\"?: { \"headers\": [str], \"rows\": [{header: value}], \"n_rows_total\": int, \"rows_truncated\": bool } } ], \"not_found\": [str] }` — records sorted by numeric accession. Sample-table headers stay in numeric field.index order to retain column associations. First occurrences keep their header (or column_<index> fallback); repeats receive the smallest available #2/#3/... suffix without claiming an existing original header or fallback key. All columns remain present in each row; short rows are padded with empty strings.",
        "exampleArgs": {
          "accessions": [
            "MTBLS1"
          ],
          "include_samples": false
        }
      },
      {
        "id": "metabolights_get_study_files",
        "connector": "omics-archives",
        "credentialKeys": [
          "ncbiEmail",
          "ncbiApiKey"
        ],
        "description": "Complete file inventory for a public MetaboLights study — the top-level study folder (ISA-Tab, MAF, folder entries) and, by default, the recursive FILES data folder.",
        "input": {
          "type": "object",
          "properties": {
            "accession": {
              "type": "string",
              "description": "e.g. 'MTBLS1'"
            },
            "include_data_files": {
              "type": "boolean",
              "default": true
            }
          },
          "required": [
            "accession"
          ]
        },
        "required": [
          "accession"
        ],
        "returns": "`{ \"accession\", \"latest_version\", \"study_folder\": [ {file,type,status,directory} ], \"n_study_folder_entries\": int, \"metadata_files\": [str], \"data_files\"?: [str], \"n_data_files\"?: int }` — sorted deterministically; volatile timestamps dropped.",
        "exampleArgs": {
          "accession": "MTBLS1"
        }
      },
      {
        "id": "metabolights_search_data_files",
        "connector": "omics-archives",
        "credentialKeys": [
          "ncbiEmail",
          "ncbiApiKey"
        ],
        "description": "Glob search over a MetaboLights study's raw-data folder (FILES tree). `pattern` is a filename glob (e.g. '*.mzML', '*.raw'); omit it to list every data file.",
        "input": {
          "type": "object",
          "properties": {
            "accession": {
              "type": "string",
              "description": "e.g. 'MTBLS1'"
            },
            "pattern": {
              "type": "string",
              "description": "filename glob, e.g. '*.mzML'"
            }
          },
          "required": [
            "accession"
          ]
        },
        "required": [
          "accession"
        ],
        "returns": "`{ \"accession\", \"pattern\": str|null, \"file_match\": true, \"folder_match\": false, \"files\": [str], \"n_files\": int }` — relative paths under the study folder (FILES/...), sorted.",
        "exampleArgs": {
          "accession": "MTBLS1",
          "pattern": "*.zip"
        }
      },
      {
        "id": "mgnify_search_studies",
        "connector": "omics-archives",
        "credentialKeys": [
          "ncbiEmail",
          "ncbiApiKey"
        ],
        "description": "Find MGnify metagenomics studies by free text OR biome lineage (provide exactly one). Full listing is paginated to completion and count-verified against the API.",
        "input": {
          "type": "object",
          "properties": {
            "query": {
              "type": "string",
              "description": "free text, e.g. 'coral'"
            },
            "biome_lineage": {
              "type": "string",
              "description": "GOLD-style lineage, e.g. 'root:Engineered:Wastewater' (includes sub-lineages)"
            }
          }
        },
        "returns": "`{ \"spec\": {...}, \"count\": int, \"pages_fetched\": int, \"records\": [ { \"accession\", \"secondary_accession\", \"bioproject\", \"study_name\", \"biome_lineages\": [str], \"samples_count\", \"centre_name\", \"data_origination\", \"is_private\", \"last_update\" } ] }` — `count == records.length` (verified); records sorted by MGYS accession.",
        "exampleArgs": {
          "query": "coral"
        }
      },
      {
        "id": "mgnify_get_studies",
        "connector": "omics-archives",
        "credentialKeys": [
          "ncbiEmail",
          "ncbiApiKey"
        ],
        "description": "Fetch structured records for MGnify studies (MGYS accessions). With include_analyses, each study also carries its complete analyses listing plus by-pipeline/by-experiment breakdowns. Unknown accessions go in missing.",
        "input": {
          "type": "object",
          "properties": {
            "accessions": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "description": "e.g. ['MGYS00000410']"
            },
            "include_analyses": {
              "type": "boolean",
              "default": false
            }
          },
          "required": [
            "accessions"
          ]
        },
        "required": [
          "accessions"
        ],
        "returns": "`{ \"studies\": [ { \"accession\", \"secondary_accession\", \"bioproject\", \"study_name\", \"biome_lineages\": [str], \"samples_count\", \"centre_name\", \"data_origination\", \"is_private\", \"last_update\", \"analyses_total\"?, \"analyses_by_pipeline_version\"?, \"analyses_by_experiment_type\"? } ], \"missing\": [str], \"analyses\"?: {acc: [record]} }` — studies sorted by accession.",
        "exampleArgs": {
          "accessions": [
            "MGYS00000410"
          ],
          "include_analyses": false
        }
      },
      {
        "id": "mgnify_get_study_analyses",
        "connector": "omics-archives",
        "credentialKeys": [
          "ncbiEmail",
          "ncbiApiKey"
        ],
        "description": "List ALL analyses of one MGnify study (complete, count-verified pagination) — one record per MGYA analysis with pipeline version, experiment type, status, and run/assembly/sample accessions.",
        "input": {
          "type": "object",
          "properties": {
            "accession": {
              "type": "string",
              "description": "MGYS accession, e.g. 'MGYS00000410'"
            }
          },
          "required": [
            "accession"
          ]
        },
        "required": [
          "accession"
        ],
        "returns": "`{ \"study_accession\", \"analyses_count\": int, \"analyses\": [ { \"analysis_accession\", \"study_accession\", \"pipeline_version\", \"experiment_type\", \"analysis_status\", \"run_accession\", \"assembly_accession\", \"sample_accession\", \"instrument_platform\" } ] }` — `analyses_count` is the API total (retrieval verified against it); sorted by MGYA accession.",
        "exampleArgs": {
          "accession": "MGYS00000410"
        }
      },
      {
        "id": "mgnify_get_analysis_files",
        "connector": "omics-archives",
        "credentialKeys": [
          "ncbiEmail",
          "ncbiApiKey"
        ],
        "description": "List result-file metadata for one MGnify analysis using API v2: file type, category, byte size when reported, and upstream download URL. No file bytes are downloaded. Missing sizes or URLs remain null.",
        "input": {
          "type": "object",
          "properties": {
            "accession": {
              "type": "string",
              "pattern": "^MGYA[0-9]{8,}$",
              "maxLength": 32
            }
          },
          "additionalProperties": false,
          "required": [
            "accession"
          ]
        },
        "required": [
          "accession"
        ],
        "returns": "`{ analysis_accession, files_count, files: [{ file_name, path, file_type, download_type, download_group, description, file_size_bytes:number|null, download_url:string|null }] }` — files are sorted by file_name. URLs are supplied by MGnify without reconstruction; missing sizes are not zero.",
        "exampleArgs": {
          "accession": "MGYA00639970"
        }
      },
      {
        "id": "pride_get_project_files",
        "connector": "omics-archives",
        "credentialKeys": [
          "ncbiEmail",
          "ncbiApiKey"
        ],
        "description": "List one page of public PRIDE project files for a PXD or PRD accession, including file category, byte size, upstream checksum and download locations (FTP, HTTP or Aspera). Metadata only: does not download files or verify checksums. Pages are zero-based; keep page_size unchanged and follow next_page until null. Ordering is supplied by PRIDE, not a snapshot. An empty list does not establish whether a project exists or is public.",
        "input": {
          "type": "object",
          "properties": {
            "project_accession": {
              "type": "string",
              "pattern": "^(?:PXD|PRD)[0-9]{6,}$",
              "maxLength": 32
            },
            "page": {
              "type": "integer",
              "minimum": 0,
              "maximum": 1000000,
              "default": 0
            },
            "page_size": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 100
            }
          },
          "required": [
            "project_accession"
          ],
          "additionalProperties": false
        },
        "required": [
          "project_accession"
        ],
        "returns": "{project_accession, page, page_size, api_total:number|null, n_files_returned, next_page:number|null, files:[{file_accession, file_name, file_category:string|null, file_size_bytes:number|null, checksum:string|null, public_file_locations:[{protocol:string|null, location:string}]}]}. api_total counts files across all pages; null means no total header. Without a total, a full page yields a possible next_page which may be empty. Missing sizes/checksums are null, not zero. Checksum text and location strings are preserved from PRIDE; no checksum algorithm or alternate download URL is inferred. Aspera locations are transfer addresses, not HTTP URLs.",
        "exampleArgs": {
          "project_accession": "PXD000001",
          "page": 0,
          "page_size": 100
        }
      },
      {
        "id": "pride_search_projects",
        "connector": "omics-archives",
        "credentialKeys": [
          "ncbiEmail",
          "ncbiApiKey"
        ],
        "description": "Search PRIDE Archive proteomics projects (complete, api_total-verified retrieval); filters (keyword, organism, instrument, disease, extra_filters) combine with AND. Sorted by accession ASC — a bounded walk is a stable prefix.",
        "input": {
          "type": "object",
          "properties": {
            "keyword": {
              "type": "string",
              "description": "free text, e.g. 'phosphoproteome'"
            },
            "organism": {
              "type": "string",
              "description": "exact PRIDE facet, e.g. 'Homo sapiens (human)'"
            },
            "instrument": {
              "type": "string",
              "description": "exact PRIDE facet, e.g. 'Orbitrap Fusion Lumos'"
            },
            "disease": {
              "type": "string",
              "description": "exact PRIDE facet, e.g. 'Covid-19'"
            },
            "extra_filters": {
              "type": "object",
              "additionalProperties": {
                "type": "string"
              }
            },
            "max_records_returned": {
              "type": "integer",
              "default": 50
            }
          }
        },
        "returns": "`{ \"spec\": {...}, \"filter\": str|null, \"api_total\": int, \"complete\": bool, \"pages_fetched\": int, \"n_records_returned\": int, \"records_truncated\": bool, \"records\": [ { \"accession\", \"title\", \"organisms\": [str], \"diseases\": [str], \"instruments\": [str], \"experiment_types\": [str], \"quantification_methods\": [str], \"submission_date\", \"publication_date\", \"submitters\": [str], \"lab_pis\": [str], \"references\": [{pubmed_id,doi,reference_line}], ... } ] }` — `api_total` is the true count; `records` capped at `max_records_returned` (default 50) with `records_truncated`.",
        "exampleArgs": {
          "keyword": "phosphoproteome",
          "organism": "Homo sapiens (human)",
          "max_records_returned": 50
        }
      },
      {
        "id": "pride_get_projects",
        "connector": "omics-archives",
        "credentialKeys": [
          "ncbiEmail",
          "ncbiApiKey"
        ],
        "description": "Fetch full metadata for PRIDE projects by accession (e.g. PXD010154) — the same normalized record shape as pride_search_projects, so the two are directly comparable. Unknown accessions go in not_found.",
        "input": {
          "type": "object",
          "properties": {
            "accessions": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "description": "e.g. ['PXD010154']"
            }
          },
          "required": [
            "accessions"
          ]
        },
        "required": [
          "accessions"
        ],
        "returns": "`{ \"n_requested\": int, \"records\": [ { \"accession\", \"title\", \"organisms\": [str], \"organism_parts\": [str], \"diseases\": [str], \"instruments\": [str], \"experiment_types\": [str], \"quantification_methods\": [str], \"keywords\": [str], \"submission_date\", \"publication_date\", \"submitters\": [str], \"lab_pis\": [str], \"references\": [{pubmed_id,doi,reference_line}], \"source\": \"detail\" } ], \"not_found\": [str] }` — records sorted by accession.",
        "exampleArgs": {
          "accessions": [
            "PXD010154"
          ]
        }
      },
      {
        "id": "pride_search_project_proteins",
        "connector": "omics-archives",
        "credentialKeys": [
          "ncbiEmail",
          "ncbiApiKey"
        ],
        "description": "List protein evidence rows for one PRIDE affinity-proteomics project (paged to exhaustion). NOTE: only affinity-proteomics projects are served here; for classic MS (PXD) projects use pride_find_projects_for_protein instead.",
        "input": {
          "type": "object",
          "properties": {
            "project_accession": {
              "type": "string",
              "description": "PRIDE project accession"
            },
            "keyword": {
              "type": "string",
              "description": "server-side filter (accession, gene, or protein name)"
            }
          },
          "required": [
            "project_accession"
          ]
        },
        "required": [
          "project_accession"
        ],
        "returns": "`{ \"project_accession\", \"keyword\": str|null, \"n_proteins\": int, \"proteins\": [ { \"protein_accession\", \"protein_name\", \"gene\", \"project_count\" } ] }` — sorted by protein accession; empty for MS-only projects.",
        "exampleArgs": {
          "project_accession": "PXD010154"
        }
      },
      {
        "id": "pride_find_projects_for_protein",
        "connector": "omics-archives",
        "credentialKeys": [
          "ncbiEmail",
          "ncbiApiKey"
        ],
        "description": "Find PRIDE projects containing a protein (MS-archive direction). `protein_accession` is a UniProt accession (e.g. P04637). Feed the returned project accessions to pride_get_projects for full metadata.",
        "input": {
          "type": "object",
          "properties": {
            "protein_accession": {
              "type": "string",
              "description": "UniProt accession, e.g. 'P04637'"
            }
          },
          "required": [
            "protein_accession"
          ]
        },
        "required": [
          "protein_accession"
        ],
        "returns": "`{ \"query_accession\", \"n_records\": int, \"records\": [ { \"protein_accession\", \"n_projects\": int, \"projects\": [str] } ] }` — project lists sorted.",
        "exampleArgs": {
          "protein_accession": "P04637"
        }
      }
    ]
  },
  {
    "id": "cellxgene-discover",
    "displayName": "CELLxGENE Discover",
    "aliases": [
      "CELLxGENE Discover",
      "CELLxGENE datasets"
    ],
    "description": "Public collections, datasets, versions and file download links from CELLxGENE Discover.",
    "useWhen": "Use to discover public single-cell datasets and collections in CELLxGENE Discover, filter dataset metadata by organism, tissue, disease, assay or cell type, inspect published collection/dataset versions, and obtain file formats, sizes and download URLs. Use CellGuide for cell-type descriptions and marker genes.",
    "sources": [
      "CELLxGENE Discover"
    ],
    "termsUrl": "https://cellxgene.cziscience.com/",
    "requiresNcbi": false,
    "group": "featured",
    "tools": [
      {
        "id": "list_collections",
        "connector": "cellxgene-discover",
        "description": "List public CELLxGENE Discover collections; optional case-insensitive substring query over name, description and DOI. Filtering and pagination are client-side over the complete API response, fetched on each call; results may change between calls. Save version IDs for reproducibility.",
        "input": {
          "type": "object",
          "properties": {
            "query": {
              "type": "string",
              "minLength": 1,
              "maxLength": 500,
              "pattern": "\\S"
            },
            "page": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000000,
              "default": 1
            },
            "page_size": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 25
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "returns": "{ page, page_size, count, total (after filtering), next_page (null at the end), pagination: \"client\", results: [collection summaries with canonical/version IDs, name, DOI, dates, URL and dataset_count] }",
        "exampleArgs": {
          "query": "liver",
          "page_size": 10
        }
      },
      {
        "id": "get_collection",
        "connector": "cellxgene-discover",
        "description": "Retrieve the latest public collection metadata by canonical collection_id, with a page of dataset summaries. Filtering and pagination are client-side over the complete API response, fetched on each call; results may change between calls. Save version IDs for reproducibility.",
        "input": {
          "type": "object",
          "properties": {
            "collection_id": {
              "type": "string",
              "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
            },
            "page": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000000,
              "default": 1
            },
            "page_size": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 25
            }
          },
          "required": [
            "collection_id"
          ],
          "additionalProperties": false
        },
        "required": [
          "collection_id"
        ],
        "returns": "{ collection_id, collection_version_id, name, description, DOI/links and other API metadata, datasets: { page, page_size, count, total (after filtering), next_page (null at the end), pagination: \"client\", results: [dataset summaries] } }",
        "exampleArgs": {
          "collection_id": "9a71db9e-687f-41f0-b88e-544eb1314ef6"
        }
      },
      {
        "id": "list_datasets",
        "connector": "cellxgene-discover",
        "description": "List public datasets. query matches title, collection name or DOI by case-insensitive substring. organism, tissue, disease, assay and cell_type match an exact ontology ID or label (case-insensitive); filters are ANDed. schema_version selects the latest published collection versions matching a major/minor/patch schema and can return historical datasets. Use each result's dataset_version_id with get_dataset_version or list_dataset_files to retain that publication; canonical IDs resolve to the current version. Filtering and pagination are client-side over the complete API response, fetched on each call; results may change between calls. Save version IDs for reproducibility.",
        "input": {
          "type": "object",
          "properties": {
            "query": {
              "type": "string",
              "minLength": 1,
              "maxLength": 500,
              "pattern": "\\S"
            },
            "collection_id": {
              "type": "string",
              "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
            },
            "organism": {
              "type": "string",
              "minLength": 1,
              "maxLength": 500,
              "pattern": "\\S"
            },
            "tissue": {
              "type": "string",
              "minLength": 1,
              "maxLength": 500,
              "pattern": "\\S"
            },
            "disease": {
              "type": "string",
              "minLength": 1,
              "maxLength": 500,
              "pattern": "\\S"
            },
            "assay": {
              "type": "string",
              "minLength": 1,
              "maxLength": 500,
              "pattern": "\\S"
            },
            "cell_type": {
              "type": "string",
              "minLength": 1,
              "maxLength": 500,
              "pattern": "\\S"
            },
            "schema_version": {
              "type": "string",
              "pattern": "^\\d+(\\.\\d+){0,2}$",
              "description": "Upstream schema filter; may return historical versions. Continue with the returned dataset_version_id."
            },
            "page": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000000,
              "default": 1
            },
            "page_size": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 25
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "returns": "{ page, page_size, count, total (after filtering), next_page (null at the end), pagination: \"client\", results: [dataset summaries with canonical/version IDs, collection identity, title, cell counts, organism/tissue/disease/assay, schema version and dates] }",
        "exampleArgs": {
          "organism": "NCBITaxon:9606",
          "tissue": "liver",
          "page_size": 10
        }
      },
      {
        "id": "get_dataset",
        "connector": "cellxgene-discover",
        "description": "Retrieve full current public dataset metadata, ontology annotations, citation, assets and version ID using canonical collection_id and dataset_id.",
        "input": {
          "type": "object",
          "properties": {
            "collection_id": {
              "type": "string",
              "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
            },
            "dataset_id": {
              "type": "string",
              "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
            }
          },
          "required": [
            "collection_id",
            "dataset_id"
          ],
          "additionalProperties": false
        },
        "required": [
          "collection_id",
          "dataset_id"
        ],
        "returns": "The API dataset object, including dataset_id, dataset_version_id, title, cell_count, ontology annotations, schema_version, citation and assets [{filetype, filesize (bytes, or -1 when unknown), url}]. Nullable metadata is preserved. No files are downloaded.",
        "exampleArgs": {
          "collection_id": "9a71db9e-687f-41f0-b88e-544eb1314ef6",
          "dataset_id": "0bbf93aa-2d3a-420f-95a1-26fe384024cb"
        }
      },
      {
        "id": "list_collection_versions",
        "connector": "cellxgene-discover",
        "description": "List published versions of a canonical collection, newest first, retaining version IDs and dataset counts. Filtering and pagination are client-side over the complete API response, fetched on each call; results may change between calls. Save version IDs for reproducibility.",
        "input": {
          "type": "object",
          "properties": {
            "collection_id": {
              "type": "string",
              "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
            },
            "page": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000000,
              "default": 1
            },
            "page_size": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 25
            }
          },
          "required": [
            "collection_id"
          ],
          "additionalProperties": false
        },
        "required": [
          "collection_id"
        ],
        "returns": "{ page, page_size, count, total (after filtering), next_page (null at the end), pagination: \"client\", results: [collection version summaries] }",
        "exampleArgs": {
          "collection_id": "9a71db9e-687f-41f0-b88e-544eb1314ef6"
        }
      },
      {
        "id": "get_collection_version",
        "connector": "cellxgene-discover",
        "description": "Retrieve a specific published collection_version_id and a page of its dataset versions; does not resolve to the latest collection. Filtering and pagination are client-side over the complete API response, fetched on each call; results may change between calls. Save version IDs for reproducibility.",
        "input": {
          "type": "object",
          "properties": {
            "collection_version_id": {
              "type": "string",
              "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
            },
            "page": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000000,
              "default": 1
            },
            "page_size": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 25
            }
          },
          "required": [
            "collection_version_id"
          ],
          "additionalProperties": false
        },
        "required": [
          "collection_version_id"
        ],
        "returns": "{ collection_id, collection_version_id, name, description and other API metadata, dataset_versions: { page, page_size, count, total (after filtering), next_page (null at the end), pagination: \"client\", results: [dataset version summaries] } }",
        "exampleArgs": {
          "collection_version_id": "46ac9732-ff1c-4f87-86d7-0488d15aecd3"
        }
      },
      {
        "id": "list_dataset_versions",
        "connector": "cellxgene-discover",
        "description": "List published versions of a canonical dataset_id, newest first, with schema version and publication dates. Filtering and pagination are client-side over the complete API response, fetched on each call; results may change between calls. Save version IDs for reproducibility.",
        "input": {
          "type": "object",
          "properties": {
            "dataset_id": {
              "type": "string",
              "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
            },
            "page": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000000,
              "default": 1
            },
            "page_size": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 25
            }
          },
          "required": [
            "dataset_id"
          ],
          "additionalProperties": false
        },
        "required": [
          "dataset_id"
        ],
        "returns": "{ page, page_size, count, total (after filtering), next_page (null at the end), pagination: \"client\", results: [dataset version summaries] }",
        "exampleArgs": {
          "dataset_id": "0bbf93aa-2d3a-420f-95a1-26fe384024cb"
        }
      },
      {
        "id": "get_dataset_version",
        "connector": "cellxgene-discover",
        "description": "Retrieve full metadata and file assets for a specific published dataset_version_id. This ID is distinct from the canonical dataset_id.",
        "input": {
          "type": "object",
          "properties": {
            "dataset_version_id": {
              "type": "string",
              "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
            }
          },
          "required": [
            "dataset_version_id"
          ],
          "additionalProperties": false
        },
        "required": [
          "dataset_version_id"
        ],
        "returns": "The API dataset version object, including dataset_id, dataset_version_id, collection_id, collection_version_id (first publication), schema_version, citation, ontology metadata and assets [{filetype, filesize (bytes, or -1 when unknown), url}].",
        "exampleArgs": {
          "dataset_version_id": "8e0fcb64-735c-4fcb-a74b-12a3518683d1"
        }
      },
      {
        "id": "list_dataset_files",
        "connector": "cellxgene-discover",
        "description": "Return a download inventory from public dataset assets. Provide either dataset_version_id for a fixed publication, or both collection_id and dataset_id for the current version. After list_datasets with a schema_version filter, pass the returned dataset_version_id to preserve the selected publication. Returns API-provided H5AD/RDS/ATAC assets when available; no binary download, upload manifest or Census expression query.",
        "input": {
          "type": "object",
          "properties": {
            "collection_id": {
              "type": "string",
              "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
            },
            "dataset_id": {
              "type": "string",
              "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
            },
            "dataset_version_id": {
              "type": "string",
              "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
            }
          },
          "required": [],
          "additionalProperties": false,
          "oneOf": [
            {
              "type": "object",
              "properties": {
                "dataset_version_id": {
                  "type": "string",
                  "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
                }
              },
              "required": [
                "dataset_version_id"
              ],
              "additionalProperties": false
            },
            {
              "type": "object",
              "properties": {
                "collection_id": {
                  "type": "string",
                  "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
                },
                "dataset_id": {
                  "type": "string",
                  "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
                }
              },
              "required": [
                "collection_id",
                "dataset_id"
              ],
              "additionalProperties": false
            }
          ]
        },
        "returns": "{ collection_id, dataset_id, dataset_version_id, collection_version_id (when supplied), schema_version, citation, count, files: [{filetype, filesize (bytes, or -1 when unknown), url}] }. URL and format come directly from the API; no checksum is invented. Empty assets return count: 0; malformed responses and HTTP errors propagate.",
        "exampleArgs": {
          "dataset_version_id": "8e0fcb64-735c-4fcb-a74b-12a3518683d1"
        }
      }
    ]
  },
  {
    "id": "cellosaurus",
    "displayName": "Cellosaurus",
    "aliases": [
      "Cellosaurus",
      "cell line identity",
      "CVCL"
    ],
    "description": "Cell line identity, origin, diseases, quality records and database mappings from Cellosaurus.",
    "useWhen": "Use for Cellosaurus RDF, bounded read-only SPARQL, CLASTR STR similarity and official file discovery, or laboratory cell line identity and curated quality information: search names and aliases, resolve CVCL or RRID:CVCL identifiers, inspect species/tissue origin and donor disease, known contamination or misidentification, ICLAC registrations, and external database mappings.",
    "sources": [
      "Cellosaurus"
    ],
    "termsUrl": "https://www.cellosaurus.org/description.html",
    "requiresNcbi": false,
    "group": "directory",
    "tools": [
      {
        "id": "get_cell_line_rdf",
        "connector": "cellosaurus",
        "credentialKeys": [],
        "description": "Retrieve RDF for one Cellosaurus accession from the official dereferencing service. The returned RDF text stays in the request result; there is no connector-owned file store or ontology download.",
        "input": {
          "type": "object",
          "properties": {
            "accession": {
              "type": "string",
              "pattern": "^CVCL_[A-Z0-9]{4}$"
            },
            "format": {
              "type": "string",
              "enum": [
                "ttl",
                "rdf",
                "jsonld"
              ],
              "default": "ttl"
            }
          },
          "required": [
            "accession"
          ],
          "additionalProperties": false
        },
        "required": [
          "accession"
        ],
        "exampleArgs": {
          "accession": "CVCL_0030",
          "format": "ttl"
        },
        "maxResponseBytes": 2000000,
        "returns": "{ source, source_url, retrieved_at, accession, format, content }. HTML access pages are errors. RDF knowledge does not authenticate a physical cell sample."
      },
      {
        "id": "query_knowledge_graph",
        "connector": "cellosaurus",
        "credentialKeys": [],
        "maxResponseBytes": 2000000,
        "description": "Run a bounded Cellosaurus SPARQL SELECT against the local official graph. Only PREFIX/SELECT queries without SERVICE, FROM or updates are supported; the supplied query is nested and limited, never broadened on zero results.",
        "input": {
          "type": "object",
          "properties": {
            "query": {
              "type": "string",
              "minLength": 1,
              "maxLength": 12000
            },
            "max_rows": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            }
          },
          "required": [
            "query"
          ],
          "additionalProperties": false
        },
        "required": [
          "query"
        ],
        "exampleArgs": {
          "query": "SELECT ?s WHERE { ?s a <http://www.w3.org/2002/07/owl#Class> }",
          "max_rows": 2
        },
        "returns": "{ source, source_url, retrieved_at, variables, records: [SPARQL bindings], max_rows, truncated }. Binding types and language/datatype metadata are preserved; an empty result only describes this query."
      },
      {
        "id": "search_str_similarity",
        "connector": "cellosaurus",
        "credentialKeys": [],
        "maxResponseBytes": 2000000,
        "description": "Compare an explicitly supplied cell-line STR profile with the official CLASTR service. Marker alleles are sent upstream. Similarity depends on loci and scoring options; it does not certify sample identity or absence of contamination.",
        "input": {
          "type": "object",
          "properties": {
            "markers": {
              "type": "object",
              "minProperties": 1,
              "maxProperties": 50,
              "propertyNames": {
                "pattern": "^[A-Za-z0-9_-]{1,30}$"
              },
              "additionalProperties": {
                "type": "string",
                "pattern": "^[XYxy0-9., ]{1,100}$"
              }
            },
            "species": {
              "type": "string",
              "enum": [
                "human",
                "mouse",
                "dog"
              ],
              "default": "human"
            },
            "algorithm": {
              "type": "integer",
              "enum": [
                1,
                2,
                3
              ],
              "default": 1
            },
            "scoring_mode": {
              "type": "integer",
              "enum": [
                1,
                2,
                3
              ],
              "default": 1
            },
            "score_filter": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100,
              "default": 70
            },
            "min_markers": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50,
              "default": 8
            },
            "max_results": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            }
          },
          "required": [
            "markers"
          ],
          "additionalProperties": false
        },
        "required": [
          "markers"
        ],
        "exampleArgs": {
          "markers": {
            "D5S818": "12,13"
          },
          "min_markers": 1,
          "max_results": 2
        },
        "returns": "{ source, source_url, retrieved_at, species, result, note }. Official scores/thresholds are not converted into an authentication decision."
      },
      {
        "id": "list_cellosaurus_files",
        "connector": "cellosaurus",
        "credentialKeys": [],
        "maxResponseBytes": 2000000,
        "description": "Discover official Cellosaurus data-file links. No ontology, file or dataset is downloaded or persisted automatically.",
        "input": {
          "type": "object",
          "properties": {},
          "required": [],
          "additionalProperties": false
        },
        "exampleArgs": {},
        "returns": "{ source, source_url, retrieved_at, files: [{filename,url}] }. File links remain official references, not local paths or completed downloads."
      },
      {
        "connector": "cellosaurus",
        "credentialKeys": [],
        "id": "search_cell_lines",
        "description": "Search Cellosaurus recommended names and synonyms using a literal phrase (not raw Solr syntax). Returns candidates, not an unambiguous identity match. Use get_cell_line with the selected CVCL accession for origin, diseases and external mappings.",
        "input": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "query": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200,
              "pattern": "\\S"
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            },
            "offset": {
              "type": "integer",
              "minimum": 0,
              "maximum": 1000000,
              "default": 0
            }
          },
          "required": [
            "query"
          ]
        },
        "required": [
          "query"
        ],
        "returns": "`{ query, offset, limit, returned, next_offset, pagination_limited, cell_lines: [{ accession, rrid, name, synonyms, secondary_accessions, species, category, quality: { status, problems, cautions, registrations, note }, source_url, created, last_updated, entry_version }] }`. One extra row determines next_offset; the API supplies no total. Results are ordered by accession. An empty cell_lines list means the requested page has no records; only an empty page at offset=0 means no name/synonym match. quality.status is problematic_recorded or no_problem_recorded, never a sample certification. HTTP and malformed-response errors propagate.",
        "exampleArgs": {
          "query": "HeLa",
          "limit": 20
        }
      },
      {
        "connector": "cellosaurus",
        "credentialKeys": [],
        "id": "get_cell_line",
        "description": "Resolve a Cellosaurus CVCL accession or RRID:CVCL identifier. Retrieve identity, species, tissue/cell-type origin, establishing laboratory, donor disease/age/sex, parent cell lines, curated contamination/misidentification and caution records, ICLAC registrations, and external database mappings. Missing annotations do not establish sample quality.",
        "input": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "accession": {
              "type": "string",
              "minLength": 9,
              "maxLength": 40,
              "pattern": "^\\s*(?:[Rr][Rr][Ii][Dd]:)?[Cc][Vv][Cc][Ll]_[A-Za-z0-9]{4}\\s*$",
              "description": "CVCL_0030 or RRID:CVCL_0030; case and surrounding whitespace are normalized."
            }
          },
          "required": [
            "accession"
          ]
        },
        "required": [
          "accession"
        ],
        "returns": "`{ accession, rrid, name, synonyms, secondary_accessions, species, category, sex, age, diseases, derived_from_sites, cell_type, established_by, parent_cell_lines, quality: { status, problems, cautions, registrations, note }, cross_references, source_url, created, last_updated, entry_version }`. Annotations retain upstream objects, evidence text and database identifiers/URLs. Optional uncurated lists are empty; scalar fields are null. No recorded problem is not evidence of authentication or absence of contamination. A detail HTTP 404 triggers one exact primary/secondary accession search; a unique matching record resolves an old CVCL/RRID to its current primary accession and RRID. No match preserves the original HTTP 404; ambiguous/mismatched records fail. Other HTTP, network and malformed-response failures propagate without identity fallback.",
        "exampleArgs": {
          "accession": "RRID:CVCL_1906"
        }
      }
    ]
  },
  {
    "id": "cellguide",
    "displayName": "CellGuide",
    "description": "Cell-type identity, marker genes, source datasets, and tissues via CELLxGENE CellGuide.",
    "useWhen": "Use for cell-type biology from CELLxGENE CellGuide — searching cell types by name/synonym, or (by Cell Ontology id or name) getting identity/description, computational or canonical marker genes, contributing source datasets/publications, and the anatomical tissues a cell type is found in.",
    "sources": [
      "CELLxGENE"
    ],
    "termsUrl": "https://cellxgene.cziscience.com/",
    "requiresNcbi": false,
    "group": "featured",
    "tools": [
      {
        "id": "get_cell_type_info",
        "connector": "cellguide",
        "credentialKeys": [],
        "description": "CellGuide (CELLxGENE) cell-type info by Cell Ontology id or name: name, synonyms, ontology description, and curated/GPT description.",
        "input": {
          "type": "object",
          "properties": {
            "cell_type": {
              "type": "string",
              "description": "Cell Ontology id (CL:0000622, CL_0000622, or 0000622) or a cell-type name/synonym (e.g. 'acinar cell')"
            }
          },
          "required": [
            "cell_type"
          ]
        },
        "required": [
          "cell_type"
        ],
        "returns": "`{ \"id\": str, \"name\": str, \"synonyms\": [ str ], \"ontologyDescription\": str, \"description\": str, \"descriptionSource\": str, \"references\": [ ... ] }` — `descriptionSource` is `validated`, `gpt`, or `none` (with `description` empty). Returns `{ \"error\": str }` when the cell type is not found.",
        "exampleArgs": {
          "cell_type": "acinar cell"
        }
      },
      {
        "id": "search_cell_types",
        "connector": "cellguide",
        "credentialKeys": [],
        "description": "Search CellGuide cell types by free text over name and synonyms (the CDN has no search endpoint, so celltype_metadata.json is filtered client-side).",
        "input": {
          "type": "object",
          "properties": {
            "query": {
              "type": "string"
            },
            "limit": {
              "type": "integer",
              "default": 25
            }
          },
          "required": [
            "query"
          ]
        },
        "required": [
          "query"
        ],
        "returns": "`{ \"result\": [ { \"id\": str, \"name\": str, \"synonyms\": [ str ], \"ontology_description\": str } ] }` — cell types whose name or a synonym contains `query` (case-insensitive), capped at `limit` (default 25).",
        "exampleArgs": {
          "query": "T cell",
          "limit": 25
        }
      },
      {
        "id": "get_marker_genes",
        "connector": "cellguide",
        "credentialKeys": [],
        "description": "CellGuide marker genes for a cell type (id or name): computational (data-derived, scored) or canonical (literature-curated).",
        "input": {
          "type": "object",
          "properties": {
            "cell_type": {
              "type": "string"
            },
            "marker_type": {
              "type": "string",
              "enum": [
                "computational",
                "canonical"
              ],
              "default": "computational"
            },
            "limit": {
              "type": "integer",
              "default": 25
            }
          },
          "required": [
            "cell_type"
          ]
        },
        "required": [
          "cell_type"
        ],
        "returns": "`{ \"id\": str, \"name\": str, \"markerType\": str, \"returned\": int, \"markerGenes\": [ ... ] }`. Computational items: `{ \"symbol\": str, \"name\": str, \"geneId\": str, \"markerScore\": float, \"specificity\": float, \"meanExpression\": float, \"percentExpressing\": float, \"groupbyDims\": { ... } }` sorted by `markerScore` desc. Canonical items: `{ \"symbol\": str, \"name\": str, \"tissue\": str, \"publication\": str, \"publicationTitle\": str }`. Capped at `limit` (default 25); an empty list means no markers are curated/computed for this cell type. `{ \"error\": str }` when the cell type is not found.",
        "exampleArgs": {
          "cell_type": "CL:0000084",
          "marker_type": "computational",
          "limit": 25
        }
      },
      {
        "id": "get_source_data",
        "connector": "cellguide",
        "credentialKeys": [],
        "description": "CellGuide source datasets and publications contributing to a cell type (id or name): collection name/url, publication, and the tissues/diseases/organisms each covers.",
        "input": {
          "type": "object",
          "properties": {
            "cell_type": {
              "type": "string"
            }
          },
          "required": [
            "cell_type"
          ]
        },
        "required": [
          "cell_type"
        ],
        "returns": "`{ \"id\": str, \"name\": str, \"count\": int, \"sources\": [ { \"collectionName\": str, \"collectionUrl\": str, \"publicationUrl\": str, \"publicationTitle\": str, \"tissues\": [ { \"id\": str, \"label\": str } ], \"diseases\": [ { \"id\": str, \"label\": str } ], \"organisms\": [ { \"id\": str, \"label\": str } ] } ] }` — empty `sources` when no source collections exist. `{ \"error\": str }` when the cell type is not found.",
        "exampleArgs": {
          "cell_type": "CL:0000622"
        }
      },
      {
        "id": "get_cell_tissues",
        "connector": "cellguide",
        "credentialKeys": [],
        "description": "Anatomical tissues where a cell type (id or name) is observed, aggregated (deduplicated) across CellGuide source collections.",
        "input": {
          "type": "object",
          "properties": {
            "cell_type": {
              "type": "string"
            }
          },
          "required": [
            "cell_type"
          ]
        },
        "required": [
          "cell_type"
        ],
        "returns": "`{ \"id\": str, \"name\": str, \"count\": int, \"tissues\": [ { \"id\": str, \"label\": str } ] }` — unique UBERON tissues (by ontology term id) the cell type appears in, sorted by label. `{ \"error\": str }` when the cell type is not found.",
        "exampleArgs": {
          "cell_type": "T cell"
        }
      }
    ]
  },
  {
    "id": "regulation",
    "displayName": "Regulation",
    "description": "Gene-regulation functional genomics — ENCODE experiments/biosamples/files, JASPAR TF binding profiles, and UniBind ChIP-seq TFBS.",
    "useWhen": "Use when you need gene-regulation / functional-genomics data — ENCODE experiments (ChIP-seq, ATAC-seq, ...), biosamples and data files (searches by assay/target/organism/format, or a record by accession); JASPAR transcription-factor binding profiles (PFM by versioned matrix id, version history, filtered profile catalog by species/collection, and the species/taxa/collections/releases listings); or UniBind high-confidence TF binding sites (search ChIP-seq datasets, per-model TFBS detail with BED/FASTA URLs, and TFBS overlapping a genomic region).",
    "sources": [
      "ENCODE",
      "JASPAR",
      "UniBind"
    ],
    "termsUrl": "https://www.encodeproject.org/about/data-use-policy/",
    "requiresNcbi": false,
    "group": "featured",
    "tools": [
      {
        "id": "encode_search_experiments",
        "connector": "regulation",
        "credentialKeys": [],
        "description": "Search ENCODE functional-genomics experiments (ChIP-seq, ATAC-seq, ...). Filters: assay_title (e.g. \"TF ChIP-seq\"), target (protein label, e.g. \"CTCF\"), organism (scientific name), status (default \"released\"), date_released_before (ISO date — a closed window), plus arbitrary portal field filters via extra_filters. The full result set is paged and count-verified; `accessions` lists every match, at most max_rows row summaries are returned.",
        "input": {
          "type": "object",
          "properties": {
            "assay_title": {
              "type": "string"
            },
            "target": {
              "type": "string"
            },
            "organism": {
              "type": "string"
            },
            "status": {
              "type": "string",
              "default": "released"
            },
            "date_released_before": {
              "type": "string"
            },
            "extra_filters": {
              "type": "object",
              "additionalProperties": {
                "type": "string"
              }
            },
            "max_rows": {
              "type": "integer",
              "default": 100
            }
          }
        },
        "returns": "`{ total (exact), returned, truncated, accessions: [every matching accession, sorted], experiments: [ report rows: accession, assay_title, assay_term_name, target.label, biosample_ontology.term_name, status, date_released, lab.title ] }`.",
        "exampleArgs": {
          "target": "CTCF",
          "assay_title": "TF ChIP-seq",
          "max_rows": 50
        }
      },
      {
        "id": "encode_search_biosamples",
        "connector": "regulation",
        "credentialKeys": [],
        "description": "Search ENCODE biosamples (cell lines, tissues, primary cells). Filters: term_name (ontology term, e.g. \"K562\"), classification (\"cell line\", \"tissue\", ...), organism (scientific name), status (default \"released\"), date_created_before (ISO date), plus arbitrary portal field filters via extra_filters. Complete, count-verified: `accessions` is the full match list, at most max_rows row summaries are returned.",
        "input": {
          "type": "object",
          "properties": {
            "term_name": {
              "type": "string"
            },
            "classification": {
              "type": "string"
            },
            "organism": {
              "type": "string"
            },
            "status": {
              "type": "string",
              "default": "released"
            },
            "date_created_before": {
              "type": "string"
            },
            "extra_filters": {
              "type": "object",
              "additionalProperties": {
                "type": "string"
              }
            },
            "max_rows": {
              "type": "integer",
              "default": 100
            }
          }
        },
        "returns": "`{ total, returned, truncated, accessions: [...], biosamples: [ report rows: accession, biosample_ontology.term_name/classification, organism.scientific_name, status, lab.title, summary, date_created ] }`.",
        "exampleArgs": {
          "term_name": "K562",
          "classification": "cell line",
          "max_rows": 25
        }
      },
      {
        "id": "encode_list_files",
        "connector": "regulation",
        "credentialKeys": [],
        "description": "List ENCODE data files by format / assay / biosample. Filters: file_format (\"fastq\", \"bam\", \"bigWig\", \"bed\", ...), assay_term_name (the ontology term e.g. \"ChIP-seq\" — NOT the display assay_title like \"TF ChIP-seq\", which matches nothing; pass titles via extra_filters={\"assay_title\": ...}), biosample_term_name (e.g. \"K562\"), status (default \"released\"), date_created_before, plus arbitrary portal field filters via extra_filters. File queries match millions of rows unfiltered — always combine several filters. Complete + count-verified; at most max_rows row summaries returned.",
        "input": {
          "type": "object",
          "properties": {
            "file_format": {
              "type": "string"
            },
            "assay_term_name": {
              "type": "string"
            },
            "biosample_term_name": {
              "type": "string"
            },
            "status": {
              "type": "string",
              "default": "released"
            },
            "date_created_before": {
              "type": "string"
            },
            "extra_filters": {
              "type": "object",
              "additionalProperties": {
                "type": "string"
              }
            },
            "max_rows": {
              "type": "integer",
              "default": 100
            }
          }
        },
        "returns": "`{ total, returned, truncated, accessions: [...], files: [ report rows: accession, file_format, output_type, assay_term_name, assembly, dataset, status, file_size, date_created ] }`.",
        "exampleArgs": {
          "file_format": "bed",
          "assay_term_name": "ChIP-seq",
          "biosample_term_name": "K562",
          "extra_filters": {
            "output_type": "peaks",
            "assembly": "GRCh38"
          },
          "max_rows": 50
        }
      },
      {
        "id": "encode_get_experiment",
        "connector": "regulation",
        "credentialKeys": [],
        "description": "Get one ENCODE experiment by accession (e.g. \"ENCSR000AKP\"). Returns a stable-field record: assay, target, biosample ontology + summary, description, lab, award project, release/submission dates, assemblies, replicate counts, replication type, dbxrefs, DOI and uuid. Volatile portal fields (audits, analyses, internal status) are excluded.",
        "input": {
          "type": "object",
          "properties": {
            "accession": {
              "type": "string"
            }
          },
          "required": [
            "accession"
          ]
        },
        "required": [
          "accession"
        ],
        "returns": "`{ record_type: \"experiment\", accession, status, assay_term_name, assay_title, target_label, biosample_term_name, biosample_classification, biosample_summary, description, lab, award_project, date_released, date_submitted, assembly: [...], bio_replicate_count, tech_replicate_count, replication_type, dbxrefs: [...], doi, uuid }`.",
        "exampleArgs": {
          "accession": "ENCSR000AKP"
        }
      },
      {
        "id": "encode_get_file",
        "connector": "regulation",
        "credentialKeys": [],
        "description": "Get one ENCODE file by accession (e.g. \"ENCFF002JUR\"). Returns a stable-field record: format, output type/category, assay, assembly, parent dataset, biological replicates, file size, md5sums, run type, read length, lab, creation date, download href and uuid.",
        "input": {
          "type": "object",
          "properties": {
            "accession": {
              "type": "string"
            }
          },
          "required": [
            "accession"
          ]
        },
        "required": [
          "accession"
        ],
        "returns": "`{ record_type: \"file\", accession, status, file_format, file_format_type, output_type, output_category, assay_term_name, assembly, dataset, biological_replicates: [...], file_size, md5sum, content_md5sum, run_type, read_length, lab, date_created, href, uuid }`.",
        "exampleArgs": {
          "accession": "ENCFF002JUR"
        }
      },
      {
        "id": "encode_get_biosample",
        "connector": "regulation",
        "credentialKeys": [],
        "description": "Get one ENCODE biosample by accession (e.g. \"ENCBS013JZP\"). Returns a stable-field record: ontology term + classification, organism, summary/description, source, donor, treatments, genetic modifications, life stage, age, sex, lab, creation date, status and uuid.",
        "input": {
          "type": "object",
          "properties": {
            "accession": {
              "type": "string"
            }
          },
          "required": [
            "accession"
          ]
        },
        "required": [
          "accession"
        ],
        "returns": "`{ record_type: \"biosample\", accession, status, term_name, classification, organism, donor, source, lab, summary, life_stage, age_display, sex, treatments: [...], genetic_modifications: [...], date_created, uuid }`.",
        "exampleArgs": {
          "accession": "ENCBS013JZP"
        }
      },
      {
        "id": "jaspar_get_matrix",
        "connector": "regulation",
        "credentialKeys": [],
        "description": "Get one JASPAR TF binding profile by VERSIONED matrix id (e.g. \"MA0002.2\"). Returns the full record: position frequency matrix (pfm), TF name/class/family, species, data type, literature references (pubmed/medline), sequence logo URL. Requires a versioned id (\"MA0002.2\", not \"MA0002\") — use jaspar_matrix_versions to enumerate versions. Versioned matrices are immutable, so results are reproducible.",
        "input": {
          "type": "object",
          "properties": {
            "matrix_id": {
              "type": "string"
            }
          },
          "required": [
            "matrix_id"
          ]
        },
        "required": [
          "matrix_id"
        ],
        "returns": "`{ matrix_id, name, base_id, version, collection, pfm: { A:[...], C:[...], G:[...], T:[...] }, class, family, species: [ { tax_id, name } ], pubmed_ids, uniprot_ids, tax_group, type, sequence_logo, versions_url, sites_url, ... }` — the full immutable JASPAR record.",
        "exampleArgs": {
          "matrix_id": "MA0002.2"
        }
      },
      {
        "id": "jaspar_matrix_versions",
        "connector": "regulation",
        "credentialKeys": [],
        "description": "List all versions of a JASPAR base matrix id (e.g. \"MA0002\"). Returns every released version with its matrix_id, name, collection and URL — count-verified. Use to pin an exact version before jaspar_get_matrix, or to track how a profile changed across releases. A versioned id (\"MA0002.2\") is accepted and reduced to its base.",
        "input": {
          "type": "object",
          "properties": {
            "base_id": {
              "type": "string"
            }
          },
          "required": [
            "base_id"
          ]
        },
        "required": [
          "base_id"
        ],
        "returns": "`{ count, results: [ { matrix_id, name, base_id, version, collection, sequence_logo, url } ] }`.",
        "exampleArgs": {
          "base_id": "MA0002"
        }
      },
      {
        "id": "jaspar_list_matrices",
        "connector": "regulation",
        "credentialKeys": [],
        "description": "Search/list JASPAR TF binding profiles (the full profile catalog). Filters (all optional): collection (\"CORE\", \"UNVALIDATED\"), tax_group (\"vertebrates\", \"plants\", ...), tax_id (NCBI taxonomy id, e.g. 9606 for human — this is how you filter by species; enumerate ids with jaspar_list_species), name (exact TF name, e.g. \"FOXA1\"), search (free text), version=\"latest\" (restrict to latest versions only). The full filtered catalog is paginated and count-verified; at most max_rows summary rows are returned.",
        "input": {
          "type": "object",
          "properties": {
            "collection": {
              "type": "string"
            },
            "tax_group": {
              "type": "string"
            },
            "tax_id": {
              "type": "integer"
            },
            "name": {
              "type": "string"
            },
            "search": {
              "type": "string"
            },
            "version": {
              "type": "string"
            },
            "max_rows": {
              "type": "integer",
              "default": 1000
            }
          }
        },
        "returns": "`{ count (exact), returned, truncated, matrices: [ { matrix_id, name, base_id, version, collection, sequence_logo, url } ] }`.",
        "exampleArgs": {
          "tax_id": 9606,
          "collection": "CORE",
          "version": "latest",
          "max_rows": 200
        }
      },
      {
        "id": "jaspar_list_species",
        "connector": "regulation",
        "credentialKeys": [],
        "description": "List all species with JASPAR profiles (NCBI tax_id + name); count-verified full listing. Use the tax_id values to filter jaspar_list_matrices (e.g. 9606 = Homo sapiens, 10090 = Mus musculus).",
        "input": {
          "type": "object",
          "properties": {}
        },
        "returns": "`{ count, results: [ { tax_id, species, url, matrix_url } ] }`.",
        "exampleArgs": {}
      },
      {
        "id": "jaspar_list_taxa",
        "connector": "regulation",
        "credentialKeys": [],
        "description": "List all JASPAR taxonomic groups (vertebrates, plants, fungi, insects, ...); count-verified full listing. Use the group names as the tax_group filter of jaspar_list_matrices.",
        "input": {
          "type": "object",
          "properties": {}
        },
        "returns": "`{ count, results: [ { name, url } ] }`.",
        "exampleArgs": {}
      },
      {
        "id": "jaspar_list_collections",
        "connector": "regulation",
        "credentialKeys": [],
        "description": "List all JASPAR collections (CORE, UNVALIDATED, ...); count-verified full listing. Use the collection names as the collection filter of jaspar_list_matrices (CORE = curated, non-redundant profiles).",
        "input": {
          "type": "object",
          "properties": {}
        },
        "returns": "`{ count, results: [ { name, url } ] }`.",
        "exampleArgs": {}
      },
      {
        "id": "jaspar_list_releases",
        "connector": "regulation",
        "credentialKeys": [],
        "description": "List all JASPAR database releases (year, release number, active flag); count-verified full listing. Record the active release when selecting motifs for reproducibility, or check release history before comparing results across JASPAR versions.",
        "input": {
          "type": "object",
          "properties": {}
        },
        "returns": "`{ count, results: [ { year, release_number, pubmed_id, website, active, url } ] }`.",
        "exampleArgs": {}
      },
      {
        "id": "unibind_search_tfbs",
        "connector": "regulation",
        "credentialKeys": [],
        "description": "Search UniBind ChIP-seq datasets with high-confidence TFBS predictions (unibind.uio.no, 2021 release; direct TF-DNA interactions from ~10k datasets across 9 species). Each dataset is one (experiment, cell type, TF) triple. Filters (all optional, AND-combined, exact-match unless noted): tf_name (gene symbol, e.g. \"CTCF\"), cell_line (verbose UniBind title — prefer `search` for fuzzy matching), species (scientific name), collection (\"Robust\" = best-model / high confidence, or \"Permissive\"), jaspar_id (versioned, e.g. \"MA0139.1\"), search (free text). `total` is the API's exact count; at most max_rows rows are returned (a stable prefix).",
        "input": {
          "type": "object",
          "properties": {
            "tf_name": {
              "type": "string"
            },
            "cell_line": {
              "type": "string"
            },
            "species": {
              "type": "string"
            },
            "collection": {
              "type": "string",
              "enum": [
                "Robust",
                "Permissive"
              ]
            },
            "jaspar_id": {
              "type": "string"
            },
            "search": {
              "type": "string"
            },
            "max_rows": {
              "type": "integer",
              "default": 200
            }
          }
        },
        "returns": "`{ total (exact), returned, truncated, datasets: [ { tf_id (key for unibind_get_dataset), tf_name, total_peaks (ChIP-seq peak count, NOT TFBS count), identifier, cell_line } ] }`.",
        "exampleArgs": {
          "tf_name": "CTCF",
          "collection": "Robust",
          "max_rows": 50
        }
      },
      {
        "id": "unibind_get_dataset",
        "connector": "regulation",
        "credentialKeys": [],
        "description": "Get one UniBind dataset's detail: per-model TFBS counts + file URLs. tf_id is the dataset key \"<identifier>.<cell_line>.<TF>\" as returned by unibind_search_tfbs (e.g. \"ENCSR000AUE.A549_lung_carcinoma.CTCF\"). Returns the TF name, source identifiers (ENCODE/GEO/GTRD), cell lines, biological conditions, JASPAR matrix ids, ChIP-seq peak count, and one row per TFBS prediction model (DAMO/PWM/...) with total_tfbs, score/distance thresholds, adjusted CentriMo p-value, and direct BED/FASTA download URLs — use those URLs (not an MCP call) to retrieve the complete site list.",
        "input": {
          "type": "object",
          "properties": {
            "tf_id": {
              "type": "string"
            }
          },
          "required": [
            "tf_id"
          ]
        },
        "required": [
          "tf_id"
        ],
        "returns": "`{ tf_id, tf_name, identifiers: [...], cell_lines: [...], biological_conditions: [...], jaspar_ids: [...], prediction_models: [...], total_peaks, n_models, models: [ { prediction_model, jaspar_id, jaspar_version, total_tfbs, score_threshold, distance_threshold, adj_centrimo_pvalue, bed_url, fasta_url } ] }`.",
        "exampleArgs": {
          "tf_id": "ENCSR000AUE.A549_lung_carcinoma.CTCF"
        }
      },
      {
        "id": "unibind_tfbs_in_region",
        "connector": "regulation",
        "credentialKeys": [],
        "description": "TF binding sites overlapping a genomic region (UniBind 2021 maps), served via the UCSC hubApi against UniBind's registered public track hubs (UniBind's own REST API has no region endpoint). Coordinates are 0-based half-open. genome: UCSC assembly — Robust hub: hg38, mm10, ce11, dm6, danRer11, sacCer3, rn6, araTha1; Permissive adds spo2 (no hg19 — lift first). chrom: with \"chr\" prefix. start/end: interval, end-start <= 1,000,000 bp. HONEST-CAP: at most 20,000 items are scanned per call; region_scan_complete=false means the region has more sites than were scanned (narrow the window) and, with tf_name set, matches may be missing. n_matching counts scanned sites passing the filter; returned/truncated describe the max_sites cap.",
        "input": {
          "type": "object",
          "properties": {
            "genome": {
              "type": "string"
            },
            "chrom": {
              "type": "string"
            },
            "start": {
              "type": "integer"
            },
            "end": {
              "type": "integer"
            },
            "tf_name": {
              "type": "string"
            },
            "collection": {
              "type": "string",
              "enum": [
                "Robust",
                "Permissive"
              ],
              "default": "Robust"
            },
            "max_sites": {
              "type": "integer",
              "default": 2000
            }
          },
          "required": [
            "genome",
            "chrom",
            "start",
            "end"
          ]
        },
        "required": [
          "genome",
          "chrom",
          "start",
          "end"
        ],
        "returns": "`{ genome, chrom, start, end, collection, tf_name_filter, items_scanned, region_scan_complete, n_matching, returned, truncated, sites: [ { chrom, start, end, strand, dataset, cell_line, tf_name, jaspar_matrix } ] }`.",
        "exampleArgs": {
          "genome": "hg38",
          "chrom": "chr1",
          "start": 1000000,
          "end": 1010000,
          "collection": "Robust"
        }
      }
    ]
  },
  {
    "id": "research-resources",
    "displayName": "Research Resources",
    "description": "Funding-opportunity search (Grants.gov) and antibody catalog lookups (Antibody Registry).",
    "useWhen": "Use when you need U.S. federal funding opportunities from Grants.gov (search by keyword, opportunity number, CFDA/ALN, agency such as NIH/NSF/FDA, status, eligibility, or funding category, with facet breakdowns) or research antibodies from the Antibody Registry (full-text search by target/name/catalog, lookup by RRID/accession, exact catalog-number matching, and registry statistics — with RRID, vendor, target, clone, and species).",
    "sources": [
      "Grants.gov",
      "Antibody Registry"
    ],
    "termsUrl": "https://www.antibodyregistry.org/",
    "requiresNcbi": false,
    "group": "featured",
    "tools": [
      {
        "id": "search_grants",
        "connector": "research-resources",
        "credentialKeys": [],
        "description": "Search Grants.gov funding opportunities via the search2 API (complete, count-verified retrieval). At least one criterion is required (keyword, opportunity_number, aln/CFDA, agencies, eligibilities, funding_categories, or funding_instruments). opportunity_statuses defaults to [\"forecasted\",\"posted\"] (current opportunities); add \"closed\"/\"archived\" for historical ones. agencies takes codes like [\"HHS-NIH11\"] (NIH), [\"HHS-FDA\"], [\"NSF\"]. Set count_only for just the hit count + facets; max_records caps returned records (the walk still retrieves the complete set and flags truncated).",
        "input": {
          "type": "object",
          "properties": {
            "keyword": {
              "type": "string"
            },
            "opportunity_number": {
              "type": "string"
            },
            "aln": {
              "type": "string"
            },
            "agencies": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "opportunity_statuses": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "forecasted",
                  "posted",
                  "closed",
                  "archived"
                ]
              }
            },
            "eligibilities": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "funding_categories": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "funding_instruments": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "count_only": {
              "type": "boolean",
              "default": false
            },
            "max_records": {
              "type": "integer",
              "default": 100
            },
            "include_facets": {
              "type": "boolean",
              "default": true
            }
          }
        },
        "returns": "`{ hit_count, n_returned, truncated, records: [ { id, number, title, agencyCode, agency, oppStatus, openDate, closeDate, docType, cfdaList } ], facets? }` — records are the raw search2 hits (verbatim, sorted by oppNum). `truncated` is true when `hit_count` exceeds the returned count. `facets` (when include_facets) holds oppStatusOptions/agencies/eligibilities/fundingCategories/fundingInstruments/dateRangeOptions value counts. With `count_only`, records is [] and n_returned 0.",
        "exampleArgs": {
          "keyword": "cancer",
          "agencies": [
            "HHS-NIH11"
          ],
          "max_records": 25
        }
      },
      {
        "id": "search_antibodies",
        "connector": "research-resources",
        "credentialKeys": [],
        "description": "Full-text search the Antibody Registry (antibodyregistry.org, ~3.2M records). Token-based matching against antibody name/target/catalog text (\"TP53\" and \"p53\" are different queries). With page omitted, all pages are walked up to max_records or the anonymous depth cap (rows beyond offset 500 need authentication upstream, flagged as anonymous_limit_hit — never silently dropped). Pass a 1-based page for single-page retrieval (page*page_size must stay <= 500).",
        "input": {
          "type": "object",
          "properties": {
            "query": {
              "type": "string"
            },
            "page": {
              "type": "integer"
            },
            "page_size": {
              "type": "integer",
              "default": 100
            },
            "max_records": {
              "type": "integer",
              "default": 500
            }
          },
          "required": [
            "query"
          ]
        },
        "required": [
          "query"
        ],
        "returns": "Walk mode (page omitted): `{ query, total_elements, retrieved, unique_ab_ids, complete, truncated_at_max_records, anonymous_limit_hit, items: [ { abId, abName, abTarget, catalogNum, vendorName, cloneId, sourceOrganism, targetSpecies, ... } ] }`. `total_elements` counts index rows (not unique antibodies). Single-page mode (page given): `{ query, page, total_elements, retrieved, complete, items }`.",
        "exampleArgs": {
          "query": "CD4",
          "max_records": 100
        }
      },
      {
        "id": "get_antibody",
        "connector": "research-resources",
        "credentialKeys": [],
        "description": "Fetch Antibody Registry detail record(s) for one antibody accession / RRID. Accepts a plain number (\"3643095\"), \"AB_3643095\", or \"RRID:AB_3643095\". The upstream route is list-valued (an accession can map to several curated records, e.g. multi-vendor duplicates). A nonexistent id yields record_count 0, not an error.",
        "input": {
          "type": "object",
          "properties": {
            "antibody_id": {
              "type": "string"
            }
          },
          "required": [
            "antibody_id"
          ]
        },
        "required": [
          "antibody_id"
        ],
        "returns": "`{ ab_id (numeric), rrid (\"AB_<id>\"), record_count, records: [ full antibody records ] }`. `record_count` is 0 (with records []) when the accession has no records.",
        "exampleArgs": {
          "antibody_id": "RRID:AB_3643095"
        }
      },
      {
        "id": "find_antibodies_by_catalog",
        "connector": "research-resources",
        "credentialKeys": [],
        "description": "Find antibodies by vendor catalog number (exact, case-insensitive). Implemented as a full-text search plus client-side exact matching on the catalog number (or its listed alternatives), because the upstream column-filter route returns HTTP 500 for every key. Pass an optional vendor name (exact, case-insensitive) to further narrow the matches.",
        "input": {
          "type": "object",
          "properties": {
            "catalog_number": {
              "type": "string"
            },
            "vendor": {
              "type": "string"
            },
            "page_size": {
              "type": "integer",
              "default": 100
            }
          },
          "required": [
            "catalog_number"
          ]
        },
        "required": [
          "catalog_number"
        ],
        "returns": "`{ catalog_num, vendor, match_count, search_total_elements, matches: [ full antibody records ] }`. `search_total_elements` is the underlying full-text hit count; `matches` are the exact catalog-number matches.",
        "exampleArgs": {
          "catalog_number": "ab32572"
        }
      },
      {
        "id": "get_antibody_registry_stats",
        "connector": "research-resources",
        "credentialKeys": [],
        "description": "Antibody Registry statistics: total antibody count and last-update date. Returns the upstream /api/datainfo payload.",
        "input": {
          "type": "object",
          "properties": {}
        },
        "returns": "`{ total (registry size), lastupdate (YYYY-MM-DD) }` — the upstream /api/datainfo payload.",
        "exampleArgs": {}
      }
    ]
  },
  {
    "id": "biomart",
    "displayName": "BioMart",
    "description": "Ensembl BioMart attribute queries and identifier translation.",
    "useWhen": "Use when you need Ensembl BioMart data — browsing the marts → datasets → attributes/filters hierarchy, running attribute queries (get_data) for a dataset with filters, or translating gene/transcript identifiers between attribute types (e.g. HGNC symbol → Ensembl gene ID).",
    "sources": [
      "Ensembl BioMart"
    ],
    "termsUrl": "https://www.ensembl.org/info/about/legal/disclaimer.html",
    "requiresNcbi": false,
    "group": "featured",
    "tools": [
      {
        "id": "list_marts",
        "connector": "biomart",
        "credentialKeys": [],
        "description": "List available Ensembl BioMart marts (databases). BioMart organizes data as MART -> DATASET -> ATTRIBUTES/FILTERS; a mart name feeds list_datasets.",
        "input": {
          "type": "object",
          "properties": {}
        },
        "returns": "CSV string with header `name,display_name,description` — one row per mart (e.g. `ENSEMBL_MART_ENSEMBL,Ensembl Genes 116,...`). Header-only when the registry lists no marts.",
        "exampleArgs": {},
        "format": "text"
      },
      {
        "id": "list_datasets",
        "connector": "biomart",
        "credentialKeys": [],
        "description": "List the datasets available in a given mart (e.g. hsapiens_gene_ensembl for human genes). A dataset name feeds the attribute/filter/query tools.",
        "input": {
          "type": "object",
          "properties": {
            "mart": {
              "type": "string"
            }
          },
          "required": [
            "mart"
          ]
        },
        "required": [
          "mart"
        ],
        "returns": "CSV string with header `name,display_name,description` — one row per dataset (`description` is the assembly/version, e.g. `GRCh38.p14`).",
        "exampleArgs": {
          "mart": "ENSEMBL_MART_ENSEMBL"
        },
        "format": "text"
      },
      {
        "id": "list_common_attributes",
        "connector": "biomart",
        "credentialKeys": [],
        "description": "List the commonly used attributes for a dataset (a curated high-signal subset). Use this before list_all_attributes to pick attributes for get_data. `mart` is accepted for signature parity but ignored; the query keys off `dataset`.",
        "input": {
          "type": "object",
          "properties": {
            "mart": {
              "type": "string"
            },
            "dataset": {
              "type": "string"
            }
          },
          "required": [
            "mart",
            "dataset"
          ]
        },
        "required": [
          "mart",
          "dataset"
        ],
        "returns": "CSV string with header `name,display_name,description` — the subset of the dataset’s attributes that are commonly used identifiers/annotations.",
        "exampleArgs": {
          "mart": "ENSEMBL_MART_ENSEMBL",
          "dataset": "hsapiens_gene_ensembl"
        },
        "format": "text"
      },
      {
        "id": "list_all_attributes",
        "connector": "biomart",
        "credentialKeys": [],
        "description": "List all attributes available for a dataset, minus homologs and microarray probes (which are bulky and rarely needed). Can be large; prefer list_common_attributes first. `mart` is accepted for signature parity but ignored; the query keys off `dataset`.",
        "input": {
          "type": "object",
          "properties": {
            "mart": {
              "type": "string"
            },
            "dataset": {
              "type": "string"
            }
          },
          "required": [
            "mart",
            "dataset"
          ]
        },
        "required": [
          "mart",
          "dataset"
        ],
        "returns": "CSV string with header `name,display_name,description` — every attribute except the homologs page and microarray-probe attributes.",
        "exampleArgs": {
          "mart": "ENSEMBL_MART_ENSEMBL",
          "dataset": "hsapiens_gene_ensembl"
        },
        "format": "text"
      },
      {
        "id": "list_filters",
        "connector": "biomart",
        "credentialKeys": [],
        "description": "List the filters available for a dataset. Filters narrow a get_data query (e.g. chromosome_name, biotype) and are passed to get_data as a filters dict. `mart` is accepted for signature parity but ignored; the query keys off `dataset`.",
        "input": {
          "type": "object",
          "properties": {
            "mart": {
              "type": "string"
            },
            "dataset": {
              "type": "string"
            }
          },
          "required": [
            "mart",
            "dataset"
          ]
        },
        "required": [
          "mart",
          "dataset"
        ],
        "returns": "CSV string with header `name,description` — one row per filter name and its human-readable label.",
        "exampleArgs": {
          "mart": "ENSEMBL_MART_ENSEMBL",
          "dataset": "hsapiens_gene_ensembl"
        },
        "format": "text"
      },
      {
        "id": "get_data",
        "connector": "biomart",
        "credentialKeys": [],
        "description": "Run a BioMart query: retrieve the requested attributes for a dataset, optionally narrowed by filters. This is the main data-retrieval tool. `mart` is accepted for signature parity but ignored; the query keys off `dataset`.",
        "input": {
          "type": "object",
          "properties": {
            "mart": {
              "type": "string"
            },
            "dataset": {
              "type": "string"
            },
            "attributes": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "filters": {
              "type": "object"
            }
          },
          "required": [
            "mart",
            "dataset",
            "attributes"
          ]
        },
        "required": [
          "mart",
          "dataset",
          "attributes"
        ],
        "returns": "CSV string whose header row is the requested attributes, followed by one row per matching record (in BioMart order). Header-only when nothing matches.",
        "exampleArgs": {
          "mart": "ENSEMBL_MART_ENSEMBL",
          "dataset": "hsapiens_gene_ensembl",
          "attributes": [
            "ensembl_gene_id",
            "external_gene_name",
            "chromosome_name"
          ],
          "filters": {
            "chromosome_name": "Y",
            "biotype": "protein_coding"
          }
        },
        "format": "text"
      },
      {
        "id": "get_translation",
        "connector": "biomart",
        "credentialKeys": [],
        "description": "Translate a single identifier from one attribute type to another (e.g. an HGNC symbol to an Ensembl gene ID) within a dataset. `mart` is accepted for signature parity but ignored; the query keys off `dataset`.",
        "input": {
          "type": "object",
          "properties": {
            "mart": {
              "type": "string"
            },
            "dataset": {
              "type": "string"
            },
            "from_attr": {
              "type": "string"
            },
            "to_attr": {
              "type": "string"
            },
            "target": {
              "type": "string"
            }
          },
          "required": [
            "mart",
            "dataset",
            "from_attr",
            "to_attr",
            "target"
          ]
        },
        "required": [
          "mart",
          "dataset",
          "from_attr",
          "to_attr",
          "target"
        ],
        "returns": "The translated identifier as a string, or a `No translation found ...` message string when the source id has no mapping.",
        "exampleArgs": {
          "mart": "ENSEMBL_MART_ENSEMBL",
          "dataset": "hsapiens_gene_ensembl",
          "from_attr": "hgnc_symbol",
          "to_attr": "ensembl_gene_id",
          "target": "TP53"
        },
        "format": "text"
      },
      {
        "id": "batch_translate",
        "connector": "biomart",
        "credentialKeys": [],
        "description": "Translate many identifiers from one attribute type to another in a single query — more efficient than repeated get_translation calls. `mart` is accepted for signature parity but ignored; the query keys off `dataset`.",
        "input": {
          "type": "object",
          "properties": {
            "mart": {
              "type": "string"
            },
            "dataset": {
              "type": "string"
            },
            "from_attr": {
              "type": "string"
            },
            "to_attr": {
              "type": "string"
            },
            "targets": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          "required": [
            "mart",
            "dataset",
            "from_attr",
            "to_attr",
            "targets"
          ]
        },
        "required": [
          "mart",
          "dataset",
          "from_attr",
          "to_attr",
          "targets"
        ],
        "returns": "`{ \"translations\": { <input>: <translated> }, \"not_found\": [str], \"found_count\": int, \"not_found_count\": int }` — `translations` maps each resolved input id to its target id.",
        "exampleArgs": {
          "mart": "ENSEMBL_MART_ENSEMBL",
          "dataset": "hsapiens_gene_ensembl",
          "from_attr": "hgnc_symbol",
          "to_attr": "ensembl_gene_id",
          "targets": [
            "TP53",
            "BRCA1",
            "BRCA2"
          ]
        },
        "format": "text"
      }
    ]
  },
  {
    "id": "zinc",
    "displayName": "ZINC",
    "description": "ZINC22 purchasable chemical space (CartBlanche22) — compound lookup by ZINC id, SMILES exact/similarity search, supplier-code resolution, random sampling, 3D structure locations for docking.",
    "useWhen": "Use when you need purchasable small molecules from ZINC22 — look up compounds by ZINC id, search by SMILES (exact or analog/similarity), resolve vendor catalog codes, draw a random compound sample, or locate docking-ready 3D structures.",
    "sources": [
      "ZINC"
    ],
    "termsUrl": "https://zinc.docking.org/",
    "requiresNcbi": false,
    "group": "featured",
    "tools": [
      {
        "id": "zinc_search_by_id",
        "connector": "zinc",
        "credentialKeys": [],
        "description": "Look up purchasable compounds in ZINC22/ZINC20 by ZINC identifier — answers \"what is this compound and who sells it\". Batched: pass up to 100 ids in one call rather than many single-id calls. Async upstream (submit + poll); can take up to timeout_s seconds.",
        "input": {
          "type": "object",
          "properties": {
            "zinc_ids": {
              "type": [
                "string",
                "array"
              ],
              "items": {
                "type": "string"
              },
              "description": "One or more ZINC ids, e.g. ZINC000000000012 (max 100 per call)."
            },
            "max_results": {
              "type": "integer",
              "default": 50,
              "description": "Response bound (hard cap 500)."
            },
            "timeout_s": {
              "type": "number",
              "default": 25,
              "description": "Overall submit->result budget in seconds (clamped 5-55)."
            }
          },
          "required": [
            "zinc_ids"
          ]
        },
        "required": [
          "zinc_ids"
        ],
        "returns": "`{ \"query\", \"total_available\", \"returned_count\", \"truncated\", \"source_counts\": { \"zinc22\": int, ... }, \"records\": [ { \"zinc_id\", \"smiles\", \"tranche_name\", \"catalogs\", \"source\", \"tranche_properties\": { \"heavy_atoms\", \"logp\" } } ] }` — records capped at `max_results` (default 50, cap 500); `truncated` true when more were available. `source` is \"zinc22\"/\"zinc20\"; ids with no match simply have no record.",
        "exampleArgs": {
          "zinc_ids": [
            "ZINC000000000012"
          ]
        }
      },
      {
        "id": "zinc_search_by_smiles",
        "connector": "zinc",
        "credentialKeys": [],
        "description": "Search ZINC22's purchasable chemical space by structure — answers \"what purchasable compounds look like this SMILES\". This is BOTH the exact-match and the analog-discovery (similarity) tool: CartBlanche22 exposes one structure-search endpoint whose `dist` parameter spans exact through diverse, so there is deliberately no separate similarity-search tool. The slowest ZINC query — raise `dist` gradually rather than starting loose.",
        "input": {
          "type": "object",
          "properties": {
            "smiles": {
              "type": "string",
              "description": "Query SMILES string (sent verbatim as a form field)."
            },
            "dist": {
              "type": "integer",
              "default": 0,
              "description": "Tanimoto DISTANCE 0-10 (a distance, not a percent similarity): 0 = exact match, 1-3 = close analogs, 4-6 = moderate, 7-10 = diverse (looser = slower, many more hits)."
            },
            "adist": {
              "type": "integer",
              "description": "Anonymous-graph distance 0-10 (scaffold-shaped tolerance); defaults to dist."
            },
            "max_results": {
              "type": "integer",
              "default": 50,
              "description": "Response bound (hard cap 500)."
            },
            "timeout_s": {
              "type": "number",
              "default": 25,
              "description": "Overall submit->result budget in seconds (clamped 5-55)."
            }
          },
          "required": [
            "smiles"
          ]
        },
        "required": [
          "smiles"
        ],
        "returns": "The standard bounded shape (`query`, `total_available`, `returned_count`, `truncated`, `source_counts`, `records`) with records as in `zinc_search_by_id`. `query` echoes the resolved `{ smiles, dist, adist }`.",
        "exampleArgs": {
          "smiles": "CC(=O)Oc1ccccc1C(=O)O",
          "dist": 2
        }
      },
      {
        "id": "zinc_search_by_supplier",
        "connector": "zinc",
        "credentialKeys": [],
        "description": "Resolve vendor catalog numbers to ZINC compounds — answers \"which ZINC substance is this supplier code, and what's its structure\". Batched: up to 100 supplier codes per call. Async upstream (submit + poll).",
        "input": {
          "type": "object",
          "properties": {
            "supplier_codes": {
              "type": [
                "string",
                "array"
              ],
              "items": {
                "type": "string"
              },
              "description": "One or more vendor catalog codes, e.g. MCULE-2311834287 (max 100 per call)."
            },
            "max_results": {
              "type": "integer",
              "default": 50,
              "description": "Response bound (hard cap 500)."
            },
            "timeout_s": {
              "type": "number",
              "default": 25,
              "description": "Overall submit->result budget in seconds (clamped 5-55)."
            }
          },
          "required": [
            "supplier_codes"
          ]
        },
        "required": [
          "supplier_codes"
        ],
        "returns": "The standard bounded shape; records additionally carry `supplier_code` alongside `zinc_id`/`smiles`/`catalogs`/`tranche_name`/`tranche_properties`.",
        "exampleArgs": {
          "supplier_codes": [
            "MCULE-2311834287"
          ]
        }
      },
      {
        "id": "zinc_random_sample",
        "connector": "zinc",
        "credentialKeys": [],
        "description": "Draw a random sample of purchasable compounds from ZINC22 — for building screening decks, property baselines, or decoy sets. `count` doubles as this tool's `max_results`; re-calling draws a fresh sample. Async upstream (submit + poll).",
        "input": {
          "type": "object",
          "properties": {
            "count": {
              "type": "integer",
              "default": 50,
              "description": "Sample size; doubles as max_results (default 50, hard cap 500)."
            },
            "subset": {
              "type": "string",
              "description": "Optional predefined property filter: fragment (MW < 250), lead-like (MW 250-350, logP <= 3.5), drug-like (MW 350-500, Lipinski), lugs (curated). Other upstream subset names pass through verbatim."
            },
            "timeout_s": {
              "type": "number",
              "default": 25,
              "description": "Overall submit->result budget in seconds (clamped 5-55)."
            }
          },
          "required": []
        },
        "returns": "The standard bounded shape with records as in `zinc_search_by_id` (random order). `query` echoes `{ count, subset, known_subsets }`.",
        "exampleArgs": {
          "count": 25,
          "subset": "lead-like"
        }
      },
      {
        "id": "zinc_get_3d",
        "connector": "zinc",
        "credentialKeys": [],
        "description": "Locate docking-ready 3D structures for ZINC compounds. ZINC22 ships pre-generated 3D conformers (DOCK .db2.gz, .mol2.gz, .sdf.gz) in its file repository, organized by tranche — this tool resolves each id to its tranche and returns the repository locations to download from for docking prep (DOCK6, AutoDock Vina, etc.). Max 50 ids per call (3D retrieval is per-compound work). Async upstream (submit + poll).",
        "input": {
          "type": "object",
          "properties": {
            "zinc_ids": {
              "type": [
                "string",
                "array"
              ],
              "items": {
                "type": "string"
              },
              "description": "ZINC ids to prepare, e.g. ZINC000000000012 (max 50 per call)."
            },
            "timeout_s": {
              "type": "number",
              "default": 25,
              "description": "Overall lookup budget in seconds (clamped 5-55)."
            }
          },
          "required": [
            "zinc_ids"
          ]
        },
        "required": [
          "zinc_ids"
        ],
        "returns": "`{ \"query\", \"returned_count\", \"structures\", \"repository_note\" }`; each structure carries `zinc_id`, `found`, `smiles`, `source`, `tranche_name` + `tranche_properties`, and (when the tranche decodes) `download`: `{ repository, tranche_path_pattern: \"zinc-22*/H##/<tranche>/\", formats }`. Sub-release directories (zinc-22a, zinc-22b, …) must be browsed for exact file names — the repository has no per-compound fetch URL.",
        "exampleArgs": {
          "zinc_ids": [
            "ZINC000000000012"
          ]
        }
      }
    ]
  },
  {
    "id": "zenodo",
    "displayName": "Zenodo",
    "description": "Public research records, versions and file metadata from Zenodo.",
    "useWhen": "Use when discovering datasets, software or publications deposited in Zenodo, inspecting record and concept DOIs, or listing file names, sizes, checksums and download links for a record.",
    "sources": [
      "Zenodo"
    ],
    "termsUrl": "https://about.zenodo.org/terms/",
    "requiresNcbi": false,
    "group": "featured",
    "tools": [
      {
        "connector": "zenodo",
        "credentialKeys": [],
        "id": "search_records",
        "description": "Search public Zenodo records (datasets, software and publications) using Zenodo query-string syntax, e.g. title:\"climate\" or doi:\"10.5281/zenodo.8435696\". Fetches one page, up to 25 records, without authentication. By default only the latest version is listed; all_versions includes older versions. For the next page, keep query, page_size, sort and all_versions unchanged. The search window is limited to 10,000 results: (page - 1) * page_size must be less than 10,000; the final page may be partial. If pagination_limited is true, narrow the query. Public metadata does not imply open file access.",
        "input": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "query": {
              "type": "string",
              "minLength": 1,
              "maxLength": 1000,
              "pattern": "\\S"
            },
            "page": {
              "type": "integer",
              "minimum": 1,
              "maximum": 10000,
              "default": 1
            },
            "page_size": {
              "type": "integer",
              "minimum": 1,
              "maximum": 25,
              "default": 10
            },
            "sort": {
              "type": "string",
              "enum": [
                "bestmatch",
                "mostrecent"
              ],
              "default": "bestmatch"
            },
            "all_versions": {
              "type": "boolean",
              "default": false
            }
          },
          "required": [
            "query"
          ]
        },
        "returns": "`{ records: [{ record_id, concept_record_id, doi, concept_doi, title, creators, publication_date, resource_type, version, access_right, license, record_url }], page, page_size, count, total, total_relation, next_page, pagination_limited }`. IDs are strings; optional metadata is null when absent. total_relation is eq (exact) or gte (lower bound). next_page is null when no next link is supplied or the next page would exceed the search window. pagination_limited is true when a supplied next page exceeds that window; this does not mean all matches were retrieved. No automatic page walking or cached results.",
        "exampleArgs": {
          "query": "title:climate",
          "page_size": 5
        }
      },
      {
        "connector": "zenodo",
        "credentialKeys": [],
        "id": "get_record",
        "description": "Retrieve public Zenodo metadata and the file inventory exposed by the record endpoint. Pass a decimal record ID, not a DOI or URL. A concept ID may resolve to its latest version; requested_record_id, record_id and concept_record_id remain distinct. Use the returned version-specific record_id for reproducible lookup. description_html is upstream HTML, not sanitized. File links and checksums are metadata only: no download, checksum verification or access probe is performed. Restricted or embargoed records can have public metadata without accessible files; an empty file list does not establish that the deposit has no files.",
        "input": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "record_id": {
              "type": "string",
              "pattern": "^[1-9][0-9]*$",
              "maxLength": 20
            }
          },
          "required": [
            "record_id"
          ]
        },
        "returns": "`{ requested_record_id, record: { ...search record fields, description_html, keywords, related_identifiers, communities, created, modified }, files: [{ key, size_bytes, checksum, download_url }] | null }`. Missing file inventory is null; an explicitly empty inventory is []. Optional file metadata is null when absent. HTTP, network and malformed-response errors propagate; a missing record is not an empty successful result.",
        "exampleArgs": {
          "record_id": "8435696"
        }
      }
    ]
  }
]
