Skip to main content
Glama

TogoMCP: An MCP Server for Life-Science Databases

Python >=3.11 License: MIT

An MCP (Model Context Protocol) server that gives AI assistants (Claude, etc.) access to biological and biomedical RDF databases via SPARQL at the RDF Portal, as well as selected REST APIs (NCBI E-utilities, UniProt, ChEMBL, PDB, Reactome, Rhea, MeSH, and more).

Quick Start: Remote Server (No Installation)

You can use the hosted TogoMCP server directly — no local setup needed.
See https://togomcp.rdfportal.org/ for connection instructions.


Related MCP server: mcp-pubmed

Local Installation

Prerequisites

  • Python >= 3.11

  • uv package manager

1. Install uv

# macOS/Linux
curl -LsSf https://astral.sh/uv/install.sh | sh

# Windows (PowerShell)
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

2. Clone and install

git clone https://github.com/dbcls/togomcp.git
cd togomcp
uv sync

3. Set NCBI API Key (required for NCBI tools)

Obtain your NCBI API key and export it:

export NCBI_API_KEY="your-key-here"

Configuration

Claude Desktop

Edit your Claude Desktop config file:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows: ~\AppData\Roaming\Claude\claude_desktop_config.json

{
    "mcpServers": {
        "togomcp": {
            "command": "/path/to/uv",
            "args": [
                "--directory",
                "/path/to/togomcp",
                "run",
                "togo-mcp-local"
            ],
            "env": {
                "NCBI_API_KEY": "your-key-here"
            }
        }
    }
}

Tip: Run which uv (macOS/Linux) or where uv (Windows) to find the full path to uv.

Note on KEGG: TogoMCP does not enable KEGG by default. The kegg_* tools require TOGOMCP_ENABLE_KEGG=1 and the local stdio server, because the KEGG API is licensed to academic users at academic institutions. If that is not you, simply leave it unset and everything else works normally. See KEGG (opt-in, local stdio only).


Docker

A Dockerfile is provided for containerized deployment.

compose.yaml defines two services — togomcp-main (port 8000) and togomcp-test (port 8001) — so you can run production and staging endpoints side by side from the same image.

cp .env.example .env                                # then fill in NCBI_API_KEY
docker build -t localhost/togo-mcp:latest .         # build main image (tag in .env)
docker compose up -d togomcp-main                   # start main endpoint

Common operations:

docker compose logs -f togomcp-main                 # tail logs
docker compose down                                 # stop and remove all services
docker compose down togomcp-test                    # stop and remove just one
docker compose up -d togomcp-test                   # after rebuilding, recreates with new image

Override image tags and host ports via .env — see .env.example for the full list. Use docker compose up -d --force-recreate <svc> if compose doesn't pick up a rebuilt image, and docker image prune -f to clean up dangling layers.

Behind a reverse proxy

Two env vars matter if you put TogoMCP behind nginx/Caddy/Traefik. Both fail in ways that are easy to misdiagnose:

  • TOGOMCP_ALLOWED_HOSTS — FastMCP validates the Host header (DNS-rebinding protection) and answers 421 for any host not on the allow-list. The default list is localhost plus the public DBCLS vhosts, so your own hostname must be added or every proxied request is rejected.

  • TOGOMCP_FORWARDED_ALLOW_IPS — which peer addresses may set X-Forwarded-Proto/-For. uvicorn parses those headers but trusts only 127.0.0.1 unless told otherwise, and a container reached via a published port never arrives as loopback. Left wrong, the header is silently dropped (not rejected): the app then believes it is serving plain HTTP and emits redirects that downgrade https:// to http://. The default covers the usual container-runtime ranges; set this only if your proxy sits elsewhere.

Your proxy must also send X-Forwarded-Proto — nginx does not by default (proxy_set_header X-Forwarded-Proto $scheme;), while Caddy and Traefik do. Both halves are required; neither works alone.

Simple: docker run

For a single container without compose:

docker build -t togo-mcp .
docker run -e NCBI_API_KEY="your-key-here" -p 8000:8000 togo-mcp

Tool-Call Logging (Optional)

TogoMCP can record every MCP tool call as one JSON line per call (timestamp, tool name, arguments, status, elapsed_ms, session/request/client IDs, transport, client IP). SPARQL calls are enriched with endpoint URL, HTTP code, row/byte counts, and a SHA-256 of the query. Note the client IP is the peer address as the app sees it — behind a proxy or container that is the proxy/gateway, the same value for every caller, unless TOGOMCP_FORWARDED_ALLOW_IPS lets uvicorn trust X-Forwarded-For. Useful for benchmarking, MIE iteration, and reconstructing multi-tool sequences.

The IP is recorded as a salted hash (ip_hash) by default. Set TOGOMCP_LOG_RAW_IP=1 to also record it in the clear as ip, which is what lets an abusive caller be identified and blocked — at the cost of making the log personal data (and /stats/log serves it verbatim to whoever holds the dashboard credentials). Full field-by-field reference, including the privacy model, is in log_file_specs.md.

On/off is a single env var: TOGOMCP_QUERY_LOG. Unset/empty = disabled (zero-overhead default). Set to a writable file path to enable. Output uses RotatingFileHandler (50 MB × 10, ~500 MB cap).

Docker

compose.yaml bind-mounts ./logs (and ./logs-test) on the host to /var/log/togomcp inside each container and passes through TOGOMCP_QUERY_LOG / TOGOMCP_QUERY_LOG_TEST from .env. Opt in:

echo 'TOGOMCP_QUERY_LOG=/var/log/togomcp/togomcp.jsonl' >> .env
mkdir -p logs
docker compose up -d togomcp-main
tail -f logs/togomcp.jsonl

The path in the env var is the container-side path; the bind mount makes the same file visible at ./logs/togomcp.jsonl on your host. Leaving the var unset keeps logging off — no compose changes needed.

Claude Desktop (local stdio)

Add TOGOMCP_QUERY_LOG to the env block alongside NCBI_API_KEY. Use an absolute path (the spawned process's cwd is unpredictable) and ensure the parent directory exists:

"env": {
    "NCBI_API_KEY": "your-key-here",
    "TOGOMCP_QUERY_LOG": "/Users/you/togomcp-logs/togomcp.jsonl"
}

Then mkdir -p ~/togomcp-logs once and fully restart Claude Desktop.


Available Databases & Tools

TogoMCP exposes tools for querying the following (via SPARQL or REST APIs):

Category

Resources

Proteins / Proteomics

UniProt, PDB, jPOST

Genes / Genomics

NCBI Gene, Ensembl, HGNC, OMA, Bgee, HCO, MCO, DDBJ, MoG+, TogoVar, GWAS Catalog

Chemistry

ChEMBL, PubChem, ChEBI, Rhea, BRENDA, MassBank

Pathways

Reactome

Disease / Clinical

ClinVar, MedGen, MONDO, NANDO

Literature

PubMed, PubTator

Microbiology

BacDive, MediaDive, AMR Portal, NBRC

Glycomics

GlyCosmos

Ontologies / Vocabulary

MeSH, GO, Ontology Graphs (HP, UBERON, CL, SO, ECO, EFO, PRO, FMA, …)

Taxonomy

NCBI Taxonomy

Materials Science

SuperCon

KEGG (opt-in, local stdio only)

KEGG is off by default. You do not need it, and TogoMCP is fully functional without it — this section only matters if you are eligible and want it.

A kegg tool group (kegg_find, kegg_get_entry, kegg_pathway_graph, kegg_pathway_neighborhood, kegg_pathway_paths, kegg_pathway_cycles, kegg_link, kegg_conv) is mounted only when both conditions hold:

  1. you run the local stdio entry point togo-mcp-local, and

  2. you set TOGOMCP_ENABLE_KEGG=1.

Why two gates, for two different reasons:

  • The transport gate is structural and not configurable. The KEGG API is provided "for academic use by academic users belonging to academic institutions", and offering a service built on KEGG additionally requires an academic service-provider license (see KEGG's terms). A public host cannot verify a caller's affiliation, so the hosted server at togomcp.rdfportal.org — and any HTTP deployment — never reaches rest.kegg.jp. No environment variable can change this; TOGOMCP_ENABLE_KEGG has no effect on the HTTP path at all.

  • The opt-in exists because eligibility is yours to assert. Under stdio you are the caller, but only you know whether your institution's access covers you. Mounting KEGG by default would put an API call you may not be entitled to make on the path of least resistance — an AI assistant will use any tool it can see. Leaving the variable unset is the correct configuration for a non-academic user, and nothing else is affected.

Enable it in your Claude Desktop config:

"env": {
    "NCBI_API_KEY": "your-key-here",
    "TOGOMCP_ENABLE_KEGG": "1"
}

Calls are capped at 3 requests per second (TogoMCP enforces this process-wide, and never retries an HTTP 403/429). KEGG is not part of RDF Portal: it has no SPARQL endpoint, so database="kegg" is invalid in run_sparql. Use kegg_conv to translate KEGG identifiers to UniProt, NCBI Gene/Protein, ChEBI or PubChem before querying any RDF database with them.


Example Prompts

Once connected, you can ask your AI assistant things like:

  • "Find all human proteins associated with Alzheimer's disease in UniProt."

  • "Run a SPARQL query on the ChEMBL database to find compounds targeting EGFR."

  • "Search PubMed for recent papers on CRISPR base editing."

  • "What pathways involve the TP53 gene in Reactome?"


Directory Structure

togomcp/
├── togo_mcp/               # Main Python package
│   ├── server.py           # Root FastMCP instance + tool-call logging middleware
│   ├── main.py             # Assembles the server, mounts sub-servers, entry points
│   ├── rdf_portal.py       # RDF Portal / SPARQL, MIE, and endpoint tools
│   ├── api_tools.py        # REST search wrappers (UniProt, PDB, Reactome, MeSH, PubChem, etc.)
│   ├── chembl.py           # ChEMBL REST search wrappers
│   ├── ncbi_tools.py       # NCBI E-utilities sub-server
│   ├── togoid.py           # TogoID identifier-conversion sub-server
│   ├── togovar.py          # TogoVar human-variation sub-server
│   ├── kegg.py             # KEGG sub-server — mounted by togo-mcp-local ONLY (licence, see above)
│   ├── kgml.py             # KGML -> signed pathway graph (pure; no network, no FastMCP)
│   ├── stats.py            # Tool-call usage-log analysis
│   └── data/               # Bundled data files (included in wheel)
│       ├── mie/            # MIE files (YAML, one per database)
│       ├── docs/           # Developer documentation (MIE spec, examples)
│       └── resources/      # Static resources (endpoints.csv, usage guide, etc.)
├── benchmark/              # Benchmark question set, scripts, and results
├── scripts/                # Utility/maintenance scripts (deploy, Docker, MIE keywords)
├── tests/                  # Pytest test suite
├── Dockerfile              # Docker build configuration
├── compose.yaml            # Docker Compose (main + test services)
├── pyproject.toml          # Python project metadata and entry points
└── uv.lock                 # Locked dependency versions (uv)

Contributing

Contributions are welcome!

Adding a database: five places, not two. Only the first two affect what the server validates; the rest are documentation surfaces that drift silently, and the tests are what catch them.

  1. togo_mcp/data/resources/endpoints.csv — the registry row (this alone decides valid database= values).

  2. togo_mcp/data/mie/<db>.yaml — the MIE file (see the MIE spec in togo_mcp/data/docs/).

  3. uv run python scripts/generate_usage_guide_catalog.py — regenerates the Usage Guide's database catalog. Guarded by tests/test_catalog_in_sync.py.

  4. togo_mcp/data/resources/usage_guide_v6/02_budgets_and_discovery.md — a hand-written copy of the registry that no generator touches. Bump the per-endpoint count and add the key. Guarded by TestUsageGuideEndpointTable in tests/test_server.py.

  5. togo_mcp/data/docs/togomcp-intro.html — add a card to the database grid (not generated).

Note that a database removal really is just step 1: nothing validates against the other four.

Adding a tool: pass annotations=READ_ONLY_TOOL to the @mcp.tool decorator. Every TogoMCP tool is read-only, and MCP's default for an unannotated tool is the unsafe one — clients such as ChatGPT treat a tool with no readOnlyHint as a write action, which means a confirmation prompt on every call. A test asserts this, so omitting it fails the build.

Please open an issue or pull request on GitHub.

References

The system paper — describes TogoMCP as a whole (based on MIE v2):

Kinjo, A. R., Yamamoto, Y., Bustamante-Larriet, S., Labra-Gayo, J.-E., & Fujisawa, T. (2026). TogoMCP: Natural Language Querying of Life-Science Knowledge Graphs via Schema-Guided LLMs and the Model Context Protocol. Database 2026:baag042. https://doi.org/10.1093/database/baag042

The MIE v3 report — the ablation study behind the current MIE format. Removing any single MIE section (or any whole functional group) turned out to be statistically null, while removing the MIE entirely cost 0.9 points out of 20 — heavy redundancy, with the query-construction content alone recovering 99% of the total effect. MIE v3 reorganizes around that evidence, matching v2 answer quality at n=100 benchmark questions while using 15% fewer input tokens and running 6% faster:

Kinjo, A. R., & Yamamoto, Y. (2026). Measure before you rewrite: ablation-driven redesign of LLM-facing RDF schema documentation in TogoMCP. BioHackrXiv. https://doi.org/10.37044/osf.io/6v5ra_v1

The measured version of the server is archived as release v2.0.0: https://doi.org/10.5281/zenodo.21543297

License

This project is licensed under the MIT License.

The MIT licence covers this code only, not the data or the third-party APIs it reaches — each carries its own terms, and you are the caller. Most RDF Portal databases are open, but note in particular that the KEGG API (kegg_* tools, opt-in and local stdio only) is licensed to academic users at academic institutions and requires a separate academic service-provider licence to redistribute as a service — which is why it is off by default and the hosted server does not expose it at all. See KEGG (opt-in, local stdio only).

Available Tools

29 tools
get_compound_attributes_from_pubchemA
Read-only

Get compound attributes from PubChem RDF.

RETURNS the compound attributes as a JSON-formatted string. On upstream/HTTP failure this tool does NOT raise — it returns a plain string beginning with "Error:" (not JSON). CHECK FOR the "Error:" prefix BEFORE parsing.

ParametersJSON Schema
NameRequiredDescriptionDefault
pubchem_compound_idYesPubChem Compound ID (CID), e.g. "445154".

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses critical failure behavior: it does not raise on upstream/HTTP failure, returns a plain string beginning with 'Error:' instead of JSON, and warns the caller to check for that prefix. This is high-value behavioral context not present in the annotations.

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

Conciseness5/5

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

The description is only a few sentences and each one earns its place: the action, the return format, and the error-handling caveat. It is front-loaded and avoids filler.

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

Completeness5/5

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

For a simple one-parameter read-only tool, the description covers the core purpose, return format, and failure mode with high clarity. The presence of an output schema means return-value details do not need to be restated, and the tool's context is adequately complete.

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

Parameters3/5

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

The single parameter is fully documented in the input schema, including an example CID ('445154'). The description does not need to add parameter details, so the baseline score of 3 is appropriate because the schema already carries the meaning.

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

Purpose5/5

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

The description clearly identifies the verb ('Get') and the resource ('compound attributes from PubChem RDF'), which distinguishes it from sibling tools like get_pubchem_compound_id. The scope is specific and immediately understandable.

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

Usage Guidelines3/5

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

The description implies use when retrieving PubChem compound attributes, but it does not explicitly state when to choose this tool over alternatives or mention any exclusions. No direct comparison with siblings such as get_pubchem_compound_id is provided.

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

get_graph_listA
Read-only

Get a list of named graphs on a SPARQL endpoint. ALWAYS pass database (required). Virtuoso/OpenLink internal graphs are filtered out. Graph URIs containing the database substring (case-insensitive) are ranked first — useful when the endpoint hosts multiple databases (e.g. SIB hosts UniProt + Rhea + Bgee + OMA). For a database not yet in the registry, pass endpoint_url (or endpoint_name if its parent endpoint is registered) to bypass database validation; the required database value is then used only as a ranking hint. RETURNS a CSV-formatted list of named graphs (database-name matches first); on missing endpoint selection it returns a string beginning with 'Error:' — check for that prefix before use.

ParametersJSON Schema
NameRequiredDescriptionDefault
databaseYesRDF database name (e.g. 'uniprot', 'chembl'). Required. When the name is in the registry it resolves the endpoint URL; in any case the value is used as a case-insensitive substring to rank matching graph URIs first. For an unregistered database, also pass `endpoint_url` or `endpoint_name` (which take priority); `database` is then just the ranking hint.
endpoint_urlNoDirect SPARQL endpoint URL. Use when neither the database nor its parent endpoint name is in the registry.
endpoint_nameNoShort endpoint name (e.g. 'primary', 'sib', 'ebi'). Use when the database is not yet registered but its parent endpoint is.
include_systemNoIf True, include Virtuoso/OpenLink internal graphs (virtrdf, ldp, activitystreams, etc.). Default False — these are never useful for queries.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint and openWorldHint), the description details specific behaviors: internal graphs are filtered out, graph URIs containing the database substring are ranked first, and it returns a CSV list. It also discloses the error response prefix, adding transparency about output format and failure modes.

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

Conciseness5/5

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

The description is front-loaded with purpose, then proceeds to usage constraints, ranking behavior, fallback logic, and return format. Each sentence adds value without redundancy. Though a bit long, the density of relevant information justifies its length.

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

Completeness5/5

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

For a tool with 4 parameters and a complex registry logic, the description covers all necessary context: required input, alternative inputs, ranking behavior, internal graph filtering, and error handling. The presence of an output schema is complemented by the description's explanation of CSV format and 'Error:' prefix, making the tool fully understandable.

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

Parameters5/5

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

The schema descriptions already cover all parameters (100% coverage), but the description adds semantic depth: it explains the dual role of database (validation vs ranking), priority between endpoint_url and endpoint_name, and how include_system affects output. This goes beyond simple schema documentation and helps agents use parameters correctly.

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

Purpose5/5

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

The description clearly states the tool's purpose: 'Get a list of named graphs on a SPARQL endpoint.' It specifies the action (list), the resource (named graphs), and the context (SPARQL endpoint). It also distinguishes from siblings by highlighting endpoint discovery and filtering/ranking behavior, which is unique among the provided tools.

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

Usage Guidelines5/5

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

The description provides explicit usage guidance: 'ALWAYS pass database (required)' and explains when to use endpoint_url vs endpoint_name for unregistered databases, and how database value is used for ranking. It also warns about the 'Error:' prefix in return values, covering both usage conditions and error expectations.

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

get_MIE_fileA
Read-only

At the start of any task, identify ALL databases needed and call this tool for EACH of them before writing any SPARQL queries. Do not query a database until its MIE file has been read. Get the MIE (Metadata Interoperability Exchange) file containing the ShEx schema, RDF and SPARQL examples of a specific RDF database. RETURNS the MIE file as a YAML-formatted string; an unknown database returns a string beginning with 'Error:' that lists the valid database names.

ParametersJSON Schema
NameRequiredDescriptionDefault
dbNoAlias for `database`.
dbnameNoAlias for `database`.
databaseNoName of a single RDF database. Must be exactly one of: uniprot, rhea, pubchem, pdb, chembl, chebi, reactome, ensembl, amrportal, mesh, go, taxonomy, mondo, nando, bacdive, mediadive, clinvar, pubmed, pubtator, ncbigene, medgen, ddbj, glycosmos, supercon, bgee, oma, brenda, hgnc, jpostdb, massbank, nbrc, mogplus, hco, mco, togovar, ontology, gwascatalog. Do NOT pass an endpoint group name here (e.g. 'ebi', 'sib') — those go in endpoint_name instead.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already signal read-only and open-world behavior, so the bar for additional disclosure is lower. The description adds concrete behavioral details: it returns a YAML-formatted string and an unknown database returns an error string listing valid database names. This goes beyond the annotations without contradicting them.

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

Conciseness5/5

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

The description is front-loaded with the most important usage instruction in bold, followed by a concise definition and return behavior. Every sentence contributes meaningful information, and there is no redundant repetition of schema details.

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

Completeness5/5

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

Given the output schema and fully documented parameters, the description provides the remaining context needed: when to call it, what it returns, and how errors are surfaced. It is complete for an agent selecting and invoking this tool correctly.

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

Parameters3/5

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

Schema description coverage is 100%, with each parameter fully documented including db/dbname as aliases and a detailed list of valid database values. The description adds no per-parameter semantics beyond what the schema already provides, so the baseline score of 3 is appropriate.

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

Purpose5/5

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

The description clearly states the tool gets the MIE file for a specific RDF database, including its ShEx schema, RDF, and SPARQL examples. This specific verb-resource pairing and the explicit prerequisite to run before SPARQL queries distinguishes it from sibling tools like run_sparql.

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

Usage Guidelines5/5

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

The description provides explicit workflow guidance: identify all databases needed and call this tool for each before writing any SPARQL queries. It also states when not to proceed ('Do not query a database until its MIE file has been read'), giving clear usage context.

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

get_pubchem_compound_idA
Read-only

Get a PubChem compound ID (CID) for a compound name.

RETURNS the PubChem Compound ID(s) as a JSON-formatted string. On upstream/HTTP failure this tool does NOT raise — it returns a plain string beginning with "Error:" (not JSON). CHECK FOR the "Error:" prefix BEFORE parsing.

ParametersJSON Schema
NameRequiredDescriptionDefault
compound_nameYesCompound name, e.g. "resveratrol".

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior5/5

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

Beyond readOnlyHint and openWorldHint annotations, description discloses key error behavior: returns plain string with 'Error:' prefix (not JSON) on upstream/HTTP failure, and instructs to check for prefix before parsing. This is critical operational context not in annotations.

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

Conciseness5/5

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

Description is compact and front-loaded: first sentence states the action, then critical error-handling details. Every sentence earns its place with no filler.

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

Completeness5/5

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

For a single-parameter lookup tool with strong annotations and output schema, the description covers purpose, error behavior, and return format. It is complete for an agent to select and invoke correctly.

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

Parameters3/5

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

Schema coverage is 100% and the only parameter compound_name is already described with example. Description adds minimal extra meaning beyond the schema, so baseline 3 is appropriate.

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

Purpose5/5

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

Description explicitly states it retrieves a PubChem compound ID (CID) for a compound name, with a clear verb+resource combination. It distinguishes from siblings like get_compound_attributes_from_pubchem by focusing on ID retrieval specifically.

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

Usage Guidelines4/5

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

Description implies usage for looking up compound IDs by name and distinguishes via example. However, it does not explicitly state when to prefer this over related PubChem tools or exclude alternatives.

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

get_sparql_endpointsA
Read-only

Get the available SPARQL endpoints for RDF Portal.

RETURNS a dict with two keys: databases (maps each database -> {url, endpoint_name, keyword_search}) and endpoints (maps each endpoint_name -> {url, databases}).

Returns: Dict with two keys: - databases: Dict mapping database -> {url, endpoint_name, keyword_search} - endpoints: Dict mapping endpoint_name -> {url, databases}

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already communicate that this is a read-only, open-world operation, which covers the main safety profile. The description adds the RDF Portal scope and return-key vocabulary but does not disclose additional behavioral details like authorization requirements, rate limits, or failure modes; this is adequate but not rich.

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

Conciseness3/5

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

The opening sentence is concise and front-loaded, but the description repeats the same return information twice: once in prose ('RETURNS a dict with two keys...') and once in a 'Returns:' block. This redundancy prevents every sentence from earning its place.

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

Completeness5/5

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

For a zero-parameter, read-only discovery tool with readOnlyHint and openWorldHint annotations plus an output schema, the description provides sufficient context. It covers the purpose, the resource scope, and the expected return structure, leaving no material gaps.

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

Parameters4/5

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

The tool has zero parameters and the schema coverage is complete, so there is no parameter ambiguity for the description to resolve. Per the baseline rule for tools with no parameters, a score of 4 is appropriate.

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

Purpose5/5

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

The description uses a specific verb ('Get') and a specific resource ('available SPARQL endpoints for RDF Portal'), making the tool's function immediately clear. It also distinguishes this tool from sibling tools like 'run_sparql' by focusing on endpoint discovery rather than query execution.

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

Usage Guidelines2/5

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

No when-to-use guidance or alternative-recommendation is provided. The description only restates the action and return structure, so the agent must infer that this tool is meant for discovering endpoints before running SPARQL queries.

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

ncbi_efetchA
Read-only

Fetch full records using efetch. Returns actual data (sequences, records, etc.)

ParametersJSON Schema
NameRequiredDescriptionDefault
dbNoAlias for `database`.
idsNoIDs to fetch. Accepts either a list of strings (e.g., ["123", "456"]) or a comma-separated string ("123,456").
retmodeNoReturn mode (text, xml, json where applicable)text
rettypeNoReturn type (xml, fasta, gb, etc.)xml
databaseNoNCBI database name (alias: `db`)

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so the safety profile is known. The description adds that it returns actual data (sequences, records), which is useful but vague. It does not disclose pagination, rate limits, or format specifics, which are partially covered by schema parameters. No contradiction with annotations.

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

Conciseness5/5

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

Two short, front-loaded sentences: 'Fetch full records using efetch. Returns actual data (sequences, records, etc.)'. Every word earns its place, and the description is concise without unnecessary detail.

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

Completeness3/5

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

The tool is relatively simple with full schema coverage and read-only annotations, but there is no output schema, so the description bears some burden to explain return values. It only vaguely says 'actual data (sequences, records, etc.)' and doesn't address retmode/rettype interplay or how IDs are accepted (though schema covers this). It is adequate but not rich.

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

Parameters3/5

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

Schema description coverage is 100%, so parameters are already documented (db/database, ids, retmode, rettype). The description adds no additional parameter-level meaning, which aligns with the baseline of 3 when the schema covers all parameters.

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

Purpose4/5

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

The description states 'Fetch full records using efetch' with a specific verb and resource, and clarifies 'Returns actual data (sequences, records, etc.)'. It distinguishes from sibling tools like ncbi_esearch (search) and ncbi_esummary (summary) by emphasizing full record retrieval, though it could be more specific about which databases are supported.

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

Usage Guidelines3/5

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

Usage is implied: the description suggests this tool is for fetching full records when actual data is needed, as opposed to summaries or search. However, it does not explicitly state when to use it over alternatives like ncbi_esummary or provide exclusion criteria, leaving the agent to infer from the name and sibling tools.

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

ncbi_esearchA
Read-only

Search NCBI databases using E-utilities esearch API.

⚠️ CRITICAL FOR COMPREHENSIVE RESULTS ⚠️ ALWAYS use NCBI field tags for Gene, ClinVar, and similar databases! Without field tags, you may miss 70-80% of relevant results.

MANDATORY FIELD TAGS FOR GENE DATABASE: • [Organism] - Taxonomic filtering (e.g., "Homo sapiens[Organism]", "Archaea[Organism]") • [Gene Name] - Gene symbols (e.g., "TP53[Gene Name]", "nifH[Gene Name]") • [All Fields] - Broad keyword search (e.g., "nitrogenase[All Fields]")

IMPACT OF FIELD TAGS (Gene Database): • Without field tags: ~300 results (20-30% recall) ❌ • With field tags: ~1,300 results (100% recall) ✅ • Performance loss: Missing field tags = 70-80% data loss!

EXAMPLE (Gene): ✅ query="Archaea[Organism] AND (nifH[Gene Name] OR nitrogenase[All Fields])" ❌ query="archaea AND nifH" (missing [Organism]/[Gene Name] tags → ~23% recall)

RETURNS formatted text results carrying the database-specific IDs. On a missing/invalid database or query it returns a single text item whose message begins with "Error:" — check for that prefix before using the IDs.

ParametersJSON Schema
NameRequiredDescriptionDefault
dbNoAlias for `database`.
termNoAlias for `query`.
queryNoSearch query with NCBI field tags and boolean operators (alias: `term`)
sort_byNoOptional sort order (e.g., "relevance", "pub_date" for PubMed)
databaseNoNCBI database name (alias: `db`). Supported values: - "gene" or "ncbigene": NCBI Gene database ⚠️ FIELD TAGS CRITICAL - "taxonomy": NCBI Taxonomy (organism information) - "clinvar": ClinVar (genetic variants) ⚠️ FIELD TAGS CRITICAL - "medgen": MedGen (medical genetics concepts) - "mesh": MeSH (Medical Subject Headings) - "pubmed": PubMed (biomedical literature) - "pccompound": PubChem Compound - "pcsubstance": PubChem Substance - "pcassay": PubChem BioAssay
max_resultsNoMaximum number of results to return (default: 20)
start_indexNoStarting index for pagination (default: 0)
search_fieldNoOptional specific field to search in

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the readOnlyHint and openWorldHint annotations, the description discloses important runtime behavior: it returns formatted text with database-specific IDs, and it returns an error-prefixed text item on invalid database or query. It also warns about 70-80% recall loss without field tags, providing valuable behavioral context.

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

Conciseness4/5

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

The description is long and uses bolded warnings, emojis, and repeated emphasis on field tags, but it is well organized with clear sections and examples. The verbosity is justified by the critical impact of field tags on result quality, though some repetition could be trimmed.

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

Completeness4/5

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

For a search tool with no output schema, the description covers the critical operational details: query format, field tag requirements, error behavior, and pagination parameters in schema. It does not mention NCBI rate limits or explain how the returned IDs are delimited, but the provided guidance is sufficient for successful invocation.

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

Parameters4/5

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

The input schema already documents all eight parameters, so baseline is 3. The description adds meaningful query-construction semantics, including field tag syntax, boolean operations, and worked examples for the `query` and `database` parameters, going beyond the schema's brief descriptions.

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

Purpose5/5

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

The description opens with a specific action and resource: 'Search NCBI databases using E-utilities esearch API.' It clearly states the tool returns database-specific IDs, which distinguishes it from sibling tools like ncbi_esummary and ncbi_efetch.

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

Usage Guidelines4/5

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

The description provides strong, explicit guidance on how to construct queries, especially mandatory field tags for Gene and ClinVar, with concrete examples and performance consequences. It does not explicitly contrast this tool with sibling retrieval tools, but the context for when to search for IDs is clear.

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

ncbi_esummaryA
Read-only

Fetch summary information for given IDs using esummary. Useful for getting detailed info after esearch.

RETURNS a text item holding the parsed JSON summary data. On a missing/invalid database or empty ids it returns a single text item whose message begins with "Error:" — check for that prefix before use.

ParametersJSON Schema
NameRequiredDescriptionDefault
dbNoAlias for `database`.
idsNoIDs to fetch summaries for. Accepts either a list of strings (e.g., ["123", "456"]) or a comma-separated string ("123,456").
databaseNoNCBI database name (alias: `db`)

TDQS

A3.8/5.0
Behavior4/5

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

Beyond the readOnlyHint and openWorldHint annotations, the description discloses the return shape ('a text item holding parsed JSON summary data') and the failure mode for invalid database or empty IDs, including the 'Error:' prefix. This is useful operational guidance, though it does not cover all possible API behaviors.

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

Conciseness5/5

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

The description is compact and front-loaded with the primary purpose, then adds a return/error note. Every sentence contributes useful information, and the RETURNS/Error sections are well structured.

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

Completeness4/5

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

For a relatively simple 3-parameter wrapper with no output schema, the description gives purpose, relationship to esearch, return format, and error handling. It could be more complete by briefly contrasting with ncbi_efetch or describing the summary fields, but the provided context is sufficient for basic correct use.

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

Parameters3/5

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

Schema description coverage is 100%, and the descriptions in the schema already explain database/db alias and the accepted ids formats. The tool description only references database/ids in the error conditions, adding little semantic value beyond the schema.

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

Purpose4/5

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

The description opens with a specific verb+resource: 'Fetch summary information for given IDs using esummary.' It clearly conveys the tool's function and positions it as a follow-up to esearch, but it does not explicitly contrast it with sibling retrieval tools like ncbi_efetch.

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

Usage Guidelines3/5

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

'Useful for getting detailed info after esearch' gives contextual placement but no explicit when-to-use vs alternatives or when-not-to-use. It implies usage after esearch but doesn't name competing tools such as ncbi_efetch or list_databases.

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

ncbi_list_databasesA
Read-only

List all supported NCBI databases with descriptions and example queries.

Returns: Formatted list of available databases

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior3/5

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

The annotations already declare readOnlyHint: true and openWorldHint: true, so the description doesn't need to restate that it's safe. However, the description adds only that it 'Returns a formatted list' with descriptions and example queries, which is content detail rather than behavioral context. It doesn't disclose any additional traits such as pagination, ordering, or rate limits, so it stays at baseline value.

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

Conciseness5/5

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

The description is two concise sentences—one for purpose and one for return value—with no irrelevant details. The action is clear and the format of the response is front-loaded. Only essential information is included, meeting the highest standard.

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

Completeness4/5

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

Given the tool has no parameters and no output schema, the description adequately covers its full behavior: it lists databases with descriptions and example queries, and it specifies that the result is a formatted list. A small gap is the lack of context on how this tool integrates as a prerequisite for other NCBI tools, but it is not necessary for basic use.

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

Parameters4/5

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

The tool has zero parameters, and the schema coverage is 100% (vacuously). Per the rubric, zero parameters warrant a baseline of 4, and the description adds no parameter info since there is nothing to describe. This is appropriate and no points are lost.

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

Purpose5/5

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

The description clearly states a specific verb ('List') and resource ('all supported NCBI databases') with the added detail of including descriptions and example queries. This distinguishes it from sibling tools like ncbi_esearch or ncbi_efetch, which search or fetch data, making the purpose unambiguous.

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

Usage Guidelines3/5

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

The description implies this is a discovery tool (to see which databases are available), but it does not explicitly state when to use it versus the other NCBI tools or mention any exclusions/alternatives. This is a clear gap for a tool that would logically be used as a preliminary step before querying specific databases.

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

run_sparqlA
Read-only

Run a SPARQL query on an RDF database. ALWAYS pass database (required; valid values: uniprot, rhea, pubchem, pdb, chembl, chebi, reactome, ensembl, amrportal, mesh, go, taxonomy, mondo, nando, bacdive, mediadive, clinvar, pubmed, pubtator, ncbigene, medgen, ddbj, glycosmos, supercon, bgee, oma, brenda, hgnc, jpostdb, massbank, nbrc, mogplus, hco, mco, togovar, ontology, gwascatalog) for single-database queries. For cross-database queries on a shared endpoint, still pass a member database AND add endpoint_name (valid values: sib, pubchem, pdb, ebi, primary, ncbi, ddbj, glycosmos, nims, togovar) or endpoint_url, which take priority over database. Invalid database/endpoint_name values fail immediately with a deterministic error — do not retry. RETURNS the query results as a CSV-formatted string (first row is the header of SELECT variable names).

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNoAlias for `sparql_query`.
databaseYesName of a single RDF database. Must be exactly one of: uniprot, rhea, pubchem, pdb, chembl, chebi, reactome, ensembl, amrportal, mesh, go, taxonomy, mondo, nando, bacdive, mediadive, clinvar, pubmed, pubtator, ncbigene, medgen, ddbj, glycosmos, supercon, bgee, oma, brenda, hgnc, jpostdb, massbank, nbrc, mogplus, hco, mco, togovar, ontology, gwascatalog. Do NOT pass an endpoint group name here (e.g. 'ebi', 'sib') — those go in endpoint_name instead.
endpoint_urlNoDirect SPARQL endpoint URL. Use this for explicit control over the endpoint.
sparql_queryNoThe SPARQL query to execute. Alias: `query`.
endpoint_nameNoEndpoint name for cross-database queries. One of: sib, pubchem, pdb, ebi, primary, ncbi, ddbj, glycosmos, nims, togovar. Use this when querying multiple databases on the same endpoint.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

With annotations already declaring readOnlyHint and openWorldHint, the description adds valuable behavioral context: invalid database/endpoint_name values fail immediately with a deterministic error and should not be retried, and results are returned as a CSV string with a header row. This goes beyond the annotations and helps set expectations.

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

Conciseness4/5

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

The description is dense and front-loaded with the core action, and every sentence carries critical information. It is longer than ideal due to the extensive enum lists, but those are necessary. The structure is logical, moving from basic usage to cross-database nuances to error and return behavior.

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

Completeness5/5

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

Given the tool's complexity (5 params, multiple endpoint options, cross-database scenarios, output schema), the description is thorough. It covers required parameters, valid values, endpoint priority, error behavior, and return format. The output schema exists, but the description additionally explains the CSV structure, making it fully self-contained.

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

Parameters5/5

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

Although schema coverage is 100%, the description significantly enriches parameter understanding: it lists all valid database values, explains that endpoint_url takes priority over database, and clarifies alias relationships (query vs. sparql_query). This is not merely restating schema; it provides essential operational semantics for correct usage.

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

Purpose4/5

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

The description clearly states the tool's function: 'Run a SPARQL query on an RDF database.' It uses a specific verb and resource, and the detailed guidance on single vs. cross-database queries distinguishes it from sibling search tools. However, it does not explicitly compare itself to alternatives like search_uniprot_entity, so it does not fully earn a 5.

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

Usage Guidelines4/5

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

The description provides explicit when-to-use instructions: ALWAYS pass database for single-database queries, and still pass a member database plus endpoint_name or endpoint_url for cross-database queries. It also clarifies priority and error behavior. Yet it does not mention alternatives (e.g., using search_* tools for standard queries), leaving the vs. alternatives aspect partially unaddressed.

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

search_chembl_id_lookupA
Read-only

Resolve a name to ChEMBL IDs across several entity kinds in one call.

Cross-entity convenience wrapper over the ChEMBL RDF graph. Two matching regimes, because the entity kinds carry different searchable text:

• EXACT (case-insensitive) NAME match — COMPOUND (skos:altLabel: brands, generics, synonyms), TARGET (its own rdfs:label OR its component's skos:altLabel — gene symbols and protein names), CELL_LINE and TISSUE (rdfs:label, e.g. "Liver", "CCRF S-180"). Not fuzzy/substring — fix typos before calling, or use search_chembl_target, which falls back to a substring pass. Prefer the entity-specific tools (search_chembl_molecule / search_chembl_target) when you know the kind; they carry extra fields (organism/type).

• KEYWORD-IN-DESCRIPTION — ASSAY. Assays have no name; their searchable text is a free-text dcterms:description, so ASSAY does a keyword (token) match on that description, NOT an exact match, e.g. entity_type="ASSAY", query="acetylcholinesterase" → every assay whose description mentions it. ASSAY results are relevance-ranked (best description match first).

Default (no entity_type) searches the four EXACT-name kinds and UNIONs them. ASSAY is opt-in via entity_type="ASSAY" — its keyword semantics and high hit counts would otherwise swamp a name lookup. (DOCUMENT is not supported; query SPARQL directly for it.)

The search string can be passed as any of: query (canonical), search, term, keyword, keywords, search_term, or name.

RETURNS a dict {'total_count', 'has_more', 'results'}. total_count is the number of rows RETURNED (capped by limit), NOT the full match count; check has_more (true = more results exist beyond this page — relevant mainly for ASSAY, whose keyword search can have many hits). ⚠️ On a default (cross-kind) search, has_more=true can also mean an entire entity_type is missing from the page: the kinds are UNIONed and the limit is applied to the whole, so e.g. "Liver" at limit=5 returns 5 TARGET rows and no TISSUE row, though both exist. Do NOT conclude a kind is absent from a truncated page — raise limit or re-run with entity_type set. Each result carries 'chembl_id', 'entity_type', and 'organism' (null for COMPOUND / where absent — use it to tell e.g. human from mouse targets). Name kinds also carry 'name' (rdfs:label); ASSAY rows instead carry 'description' (the free-text assay description, name=null) and a relevance 'score' (higher = better match).

An EMPTY 'results' additionally carries 'hint'. Read it: an empty result is NOT an endpoint failure, and must not be reported as one. On a real endpoint failure this tool does NOT raise — it returns a dict with a single 'error' key instead; CHECK FOR 'error' BEFORE READING 'results'.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
termNo
limitNoThe maximum number of results to return.
queryNoThe query string to search for.
searchNo
keywordNo
keywordsNo
entity_typeNoOptional: COMPOUND, TARGET, CELL_LINE, TISSUE, or ASSAY. Omit to search the four name kinds together. ASSAY (keyword match on the assay description) is opt-in only.
search_termNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

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

Goes far beyond the readOnlyHint and openWorldHint annotations. It explains matching regimes (EXACT vs KEYWORD), pagination behavior (has_more semantics), empty-result hint, and error handling (returns error key instead of raising). It clarifies that total_count is capped by limit, and warns against misinterpreting truncated results. This is exemplary behavioral disclosure.

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

Conciseness5/5

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

Although lengthy, the description is well-organized with bullet points, clear sections for matching regimes, return structure, and warnings. It front-loads the core purpose and then systematically adds details. Every sentence carries useful information; no filler. The structure aids readability for a complex tool.

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

Completeness5/5

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

Given the tool's complexity (9 params, multiple entity types, intricate matching semantics, detailed return structure), the description is remarkably complete. It covers all necessary aspects: input handling, behavior differences per entity type, pagination nuances, empty results, error handling, and return dict structure. The presence of an output schema doesn't reduce the value of the description's explanations.

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

Parameters5/5

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

Schema coverage is only 33%, but the description compensates extensively. It documents the multiple aliases for the query parameter (query, search, term, keyword, keywords, search_term, name) and explains the entity_type values and their matching semantics. It also clarifies the limit's effect on cross-kind results. The description provides far more parameter context than the schema alone.

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

Purpose5/5

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

The description clearly states the tool's purpose: 'Resolve a name to ChEMBL IDs across several entity kinds in one call.' It explicitly distinguishes itself as a cross-entity convenience wrapper over the ChEMBL RDF graph, and contrasts with siblings like search_chembl_target (substring fallback) and search_chembl_molecule. The verb+resource+scope are specific and unambiguous.

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

Usage Guidelines5/5

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

Provides explicit guidance: when to use entity-specific tools (if you know the kind), when to use search_chembl_target (for fuzzy/substring matching), and when to use this tool (unsure of kind, want cross-kind search). It also details the ASSAY opt-in rationale and warns about implications of the has_more flag on truncated pages. Usage boundaries and alternatives are clearly stated.

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

search_chembl_moleculeA
Read-only

Resolve a DRUG / COMPOUND / MOLECULE (by name or structure) to a ChEMBL ID.

✅ Use this tool for drug, compound, or molecule names (e.g., "sorafenib", "imatinib", "aspirin", "Gleevec"). ⚠️ For biological targets (proteins, receptors, enzymes, genes such as EGFR, BRCA1, TP53), use search_chembl_target instead.

Resolution path is auto-selected from the query shape:

• NAME / BRAND / SYNONYM → deterministic SPARQL, EXACT (case-insensitive) match on the molecule's skos:altLabel synonyms (which include brand and trade names — "Gleevec" → CHEMBL941 IMATINIB). Not fuzzy/substring: fix typos before calling. No relevance ranking to second-guess.

• InChIKey / InChI → deterministic SPARQL, EXACT (case-SENSITIVE) match on the RDF-stored identifier. These are canonical (toolkit-independent), so exact match is correct, e.g. "BSYNRYMUTXBXSQ-UHFFFAOYSA-N" → CHEMBL25.

• SMILES → the ChEMBL REST chemistry engine (flexmatch), NOT exact match: a SMILES is written differently by each toolkit, so flexmatch normalizes the structure first, e.g. "CC(=O)Oc1ccccc1C(=O)O" → CHEMBL25.

Structure detection is conservative (multi-word input, or input without the "InChI=" prefix / InChIKey pattern / structural punctuation, is treated as a name), so a bare-chain SMILES like "CCO" is treated as a name.

The search string can be passed as any of: query (canonical), search, term, keyword, keywords, search_term, or name.

⚠️ mode='extract' — for a string that NAMES a drug rather than IS one. Exact matching (the default) cannot resolve a clinical-trial intervention string, a dosed/formulated product, or a multi-drug regimen, because none of those is a synonym of anything: "Ustekinumab 90 mg", "Diclofenac SR", "Ropivacaine 10% + Clonidine 1 µg/kg" all return 0 rows under 'exact'. mode='extract' instead finds every substance NAMED INSIDE the string, returning one result per distinct drug — so the combination above yields ROPIVACAINE and CLONIDINE. Nested synonyms collapse to the longest match ("Sofpironium Bromide Gel" → SOFPIRONIUM BROMIDE, not also BROMIDE). Use it as the RETRY when 'exact' returns nothing, not as the first call: it is a text-extraction heuristic, so treat a hit as a candidate to confirm, and note that it resolves a regimen to its COMPONENTS — it will never return "FOLFIRI" itself, only the drugs a string spells out.

RETURNS a dict {'total_count', 'has_more', 'results'}. total_count is rows RETURNED (capped by limit), not the full match count; has_more is true if more exist beyond this page. Each result has 'chembl_id' (e.g. "CHEMBL25") and 'name' (rdfs:label, may be None for some structure hits). Under mode='extract' each result additionally carries 'matched_span' (the text that matched) and 'match_type' ('exact' if the span is the whole query, else 'contained') — CHECK 'match_type' before trusting a hit. When a call returns no results, a 'note' key explains why and what to try next. On endpoint/HTTP failure this tool does NOT raise — it returns a dict with a single 'error' key instead; CHECK FOR 'error' BEFORE READING 'results'.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNo"exact" (default) matches the WHOLE string against a synonym; "extract" finds substances named INSIDE it. Defaults to "exact".exact
nameNo
termNo
limitNoMaximum number of results to return. Defaults to 20.
queryNoDrug/compound name, brand, synonym, or a structure string. Examples: "Aspirin", "Gleevec", "CC(=O)Oc1ccccc1C(=O)O", "BSYNRYMUTXBXSQ-UHFFFAOYSA-N".
searchNo
keywordNo
keywordsNo
search_termNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

Beyond annotations readOnlyHint=true and openWorldHint=true, the description thoroughly discloses matching semantics (deterministic exact vs. SMILES flexmatch), case sensitivity, conservative structure detection, and non-raising error behavior returning an 'error' key. It also explains the extract mode's heuristic nature and 'match_type' checking. This goes far beyond what annotations provide and contains no contradictions.

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

Conciseness4/5

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

The description is long but dense and well-organized with bullet points, clear sections, and front-loaded purpose. Every major behavioral nuance (exact vs extract, error handling, return keys) earns its place, though a few points (e.g., the full list of alias parameters) are repeated. Slightly verbose for the tool's complexity but justified.

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

Completeness5/5

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

Despite the output schema existing, the description adds critical operational context: return dict keys, total_count meaning, has_more semantics, matched_span/match_type under extract, the 'note' key for empty results, and the 'error' key on HTTP failure. It also addresses edge cases like bare-chain SMILES. The tool is complex, and the description covers all necessary decision paths.

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

Parameters5/5

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

Schema description coverage is only 33%, but the description compensates fully. It clarifies that any of seven alias parameters can carry the search string, explains mode='exact' vs 'extract' in detail with examples, and interprets the return shape tied to limit. It adds significant semantic meaning beyond the raw schema.

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

Purpose5/5

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

The description opens with a clear verb+resource statement: 'Resolve a DRUG / COMPOUND / MOLECULE (by name or structure) to a ChEMBL ID.' It immediately distinguishes itself from sibling search_chembl_target by explicitly redirecting biological target queries. The scope is precise and matches the tool name.

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

Usage Guidelines5/5

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

The description provides explicit when-to-use guidance: use for drug/compound/molecule names, and for targets use search_chembl_target instead. It also details when to use mode='extract' as a retry for strings that name drugs rather than being drugs, and warns against using it as the first call. This is exemplary usage guidance.

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

search_chembl_targetA
Read-only

Resolve a biological TARGET (protein/receptor/enzyme) to a ChEMBL ID.

⚠️ DO NOT use this tool to look up drugs, compounds, or molecules by name. For drug/compound/molecule names (e.g., "sorafenib", "imatinib", "aspirin"), use search_chembl_molecule instead.

Resolution is deterministic SPARQL against the ChEMBL RDF graph, not a lexical search — there is no ranking to second-guess: • UNIPROT ACCESSION (e.g. "P00533") → the structured skos:exactMatch link. Returns every target containing that protein (the single protein plus any complex/family/chimera it participates in) — filter target_type to get just one. • GENE SYMBOL / PROTEIN NAME (e.g. "EGFR", "epidermal growth factor receptor") → EXACT (case-insensitive) match, tried against BOTH the target's own name and its protein component's skos:altLabel synonyms. • If that finds nothing, ONE substring pass over target names runs as a fallback (e.g. "dehydrogenase"). Still never fuzzy — fix typos.

Every result carries organism and type, so a symbol shared across species or complexes is disambiguated by inspecting those fields (or by passing the organism/target_type filters) — NOT by trusting order.

Target-type values (for type and the target_type filter): SINGLE PROTEIN, PROTEIN COMPLEX, PROTEIN FAMILY, PROTEIN-PROTEIN INTERACTION, CHIMERIC PROTEIN, NUCLEIC-ACID, CELL-LINE, TISSUE, ORGANISM, SELECTIVITY GROUP, SMALL MOLECULE, OLIGOSACCHARIDE, LIPID, METAL, and other rarer kinds. An unrecognized target_type raises rather than silently matching nothing.

The search string can be passed as any of: query (canonical), search, term, keyword, keywords, search_term, or name.

RETURNS a dict {'total_count', 'has_more', 'results', 'match_mode'}. total_count is rows RETURNED (capped by limit), not the full match count; has_more is true if more exist beyond this page. Each result has 'chembl_id', 'name' (rdfs:label), 'organism', and 'type'. match_mode is 'exact', 'substring', or 'none' — 'substring' means the exact pass found nothing and these are looser, UNRANKED matches, so verify 'name' before using them; 'none' means both passes ran and neither matched.

An EMPTY 'results' additionally carries 'hint'. Read it: an empty result is NOT an endpoint failure, and must not be reported as one. On a real endpoint failure this tool does NOT raise — it returns a dict with a single 'error' key instead; CHECK FOR 'error' BEFORE READING 'results'.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
termNo
limitNoMax results. Defaults to 20.
queryNoUniProt accession (preferred), gene symbol, or exact protein name. Examples: "P00533", "EGFR", "Thrombin".
searchNo
keywordNo
keywordsNo
organismNoCase-insensitive substring filter on organism, e.g. "Homo sapiens". Applied inside the query.
search_termNo
target_typeNoExact (case-insensitive) filter on target type, e.g. "SINGLE PROTEIN" — collapses an accession/symbol match to the canonical single protein and drops complexes/families.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

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

Annotations declare readOnlyHint and openWorldHint, but the description adds substantial behavioral detail beyond them: deterministic SPARQL with no ranking, exact versus substring match modes, unrecognized target_type raising, empty results carrying a hint, and endpoint failures returning an 'error' dict without raising. No contradiction with annotations exists.

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

Conciseness5/5

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

The description is long but highly structured: a clear purpose line, warning callout, bulleted resolution rules, filter guidance, return dict explanation, and failure-mode instructions. Every section adds necessary operational context, and the most critical caveats are front-loaded.

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

Completeness5/5

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

Given the tool's complexity—10 parameters, multiple search-string aliases, fallback matching, result disambiguation, and non-raising failure modes—the description is exceptionally complete. It explains return structure, match_mode semantics, empty-result hints, and error checking, leaving little ambiguity for an agent.

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

Parameters5/5

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

Schema coverage is only 40%, so the description must compensate, and it does thoroughly. It defines the canonical `query` parameter (UniProt accession, gene symbol, or exact protein name), lists all accepted alias parameters, explains `target_type` accepted values, and clarifies `limit` affects returned rows. This goes well beyond the sparse input schema.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Resolve a biological TARGET (protein/receptor/enzyme) to a ChEMBL ID.' It further distinguishes itself from siblings by explicitly warning not to use it for drugs/compounds and directing users to `search_chembl_molecule` instead.

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

Usage Guidelines5/5

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

The description provides explicit when-to-use and when-not-to-use guidance: 'DO NOT use this tool to look up drugs, compounds, or molecules by name... use search_chembl_molecule instead.' It also explains deterministic matching behavior, fallback substring mode, result disambiguation, and filtering via organism/target_type.

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

search_mesh_descriptorA
Read-only

Search for MeSH ID by query.

RETURNS a JSON-formatted string of the search results. On upstream/HTTP failure this tool does NOT raise — it returns a plain string beginning with "Error:" (not JSON). CHECK FOR the "Error:" prefix BEFORE parsing.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
termNo
limitNoThe maximum number of results to return. Default is 10.
queryNoThe query string to search for. Accepts aliases: `search`, `term`, `keyword`, `keywords`, `search_term`, `name`.
searchNo
keywordNo
keywordsNo
search_termNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior5/5

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

The description discloses critical behavior: returns JSON-formatted string, on failure does NOT raise but returns a plain string starting with 'Error:' and instructs to check before parsing. This adds value beyond the readOnlyHint and openWorldHint annotations, which do not cover error handling or return format.

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

Conciseness5/5

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

The description is two sentences, front-loaded with the purpose and followed by a crucial error-handling note. Every sentence earns its place with no filler.

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

Completeness2/5

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

The tool has 8 parameters with many undocumented aliases, and the description does not explain how to construct a query or which parameter takes precedence. While the error handling and return type are covered, the overall parameter semantics remain incomplete, making it hard for an agent to use correctly without additional inference.

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

Parameters2/5

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

The description only references 'query' generically, while the schema has 8 parameters with only 25% coverage. It does not explain the relationship between the many alias parameters (name, term, search, keyword, etc.) or how they should be used, failing to compensate for the low schema coverage.

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

Purpose5/5

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

The description clearly states 'Search for MeSH ID by query', specifying the verb, resource, and input. This distinguishes it from sibling entity search tools like search_uniprot_entity or search_pdb_entity by targeting MeSH specifically.

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

Usage Guidelines4/5

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

The description provides clear context that this tool is for MeSH ID lookup, making the primary use case obvious. It does not explicitly mention alternatives or exclusions, but the MeSH-specific purpose gives sufficient guidance for when to use it.

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

search_pdb_entityA
Read-only

Search PDBj for structures, chemical components, or BIRD molecules.

Returns rich, named fields per hit (not just the title) — for pdb, each result carries the experimental method, resolution, bound ligands, and citation; for cc, the formula, SMILES, and InChI.

RETURNS a JSON string {"total": int | null, "results": [ {…fields…} ]}. total is null when PDBj gives no count (typical for structured-filter searches) — that is NOT zero and does NOT mean "no results"; consult results directly. On upstream/HTTP failure returns a JSON object with an error key instead — CHECK FOR error BEFORE reading results.

ParametersJSON Schema
NameRequiredDescriptionDefault
dbYesThe database to search in. Allowed values are: - "pdb" (Protein Data Bank, macromolecular structures) - "cc" (Chemical Component Dictionary, ligands / small molecules) - "prd" (BIRD, Biologically Interesting Reference Molecule Dictionary, mostly peptides).
nameNo
termNo
limitNoMax results to return, in [0, 500]. Default 20.
queryNoFree-text keywords. May be empty when at least one structured filter is supplied. Accepts aliases: `search`, `term`, `keyword`, `keywords`, `search_term`, `name`. If both `query` and an alias are given with different values, this raises ValueError (pass only one).
ligandNo
methodNo
offsetNoNumber of leading results to skip (server-side pagination). Default 0.
searchNo
smilesNo
sourceNo
formulaNo
keywordNo
res_maxNo
res_minNo
keywordsNo
search_termNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds meaningful context: it explains the return format (rich named fields), clarifies that a null total does not mean zero results, and warns about error key checking. This goes beyond the annotations and is valuable for safe invocation.

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

Conciseness5/5

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

The description is concise, well-structured, and front-loaded with the purpose. It uses clear formatting (capitalized key sections) and highlights critical caveats like total null and error handling in a readable way, with no wasted words.

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

Completeness2/5

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

Given the tool's complexity (17 parameters) and low schema coverage, the description lacks essential parameter guidance. While it thoroughly explains the return format (aided by the output schema), it does not explain how to use most search filters or constraints, making correct invocation difficult for an agent.

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

Parameters2/5

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

Schema description coverage is only 24% (4 of 17 parameters have descriptions). The tool description does not compensate; it only briefly mentions the 'db' parameter and focuses on output format. Many parameters like 'name', 'ligand', 'res_min', 'res_max', 'source' remain undocumented, leaving users to guess their meaning and usage.

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

Purpose5/5

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

The description clearly states it searches PDBj for structures, chemical components, or BIRD molecules, using specific verbs ('Search') and resource types ('PDBj', 'structures', 'chemical components', 'BIRD molecules'). This distinguishes it from sibling tools like search_uniprot_entity or search_reactome_entity, which target other databases.

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

Usage Guidelines4/5

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

The description implicitly indicates usage for PDBj-specific searches, but does not explicitly state when to use this tool versus alternatives or provide exclusions. It does mention the supported database types, which gives context, but lacks a direct 'use when' statement.

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

search_reactome_entityA
Read-only

Search the Reactome pathway knowledgebase by keyword (name / fuzzy match).

Resolves a term (pathway / reaction / protein / complex / small-molecule name) to Reactome stable IDs. Matching is keyword/fuzzy — UNLIKE the exact-match ChEMBL search tools, so expect ranked, approximate hits.

RETURNS a dict {'total_count', 'has_more', 'results'} — NOT a bare list. total_count is the number of records RETURNED (capped by limit); has_more is true if more matched beyond the cap. Each result carries 'id' (stable Reactome stId, e.g. "R-HSA-109581"), 'name', 'type' (facet type), 'exactType' (specific BioPAX-ish class), 'species' (list), and — only when include_summation=True — 'summation' (≤240-char description). On upstream failure returns {'error': ...} instead — CHECK FOR 'error' BEFORE READING 'results'.

species and types are validated case-INSENSITIVELY against Reactome's controlled vocabularies and normalized to canonical casing before dispatch: the server-side filter is case-SENSITIVE and silently ignores a mis-cased value (returning UNFILTERED results), so a mis-cased species used to lose most hits. An unrecognized species/type now RAISES rather than silently returning the wrong rows.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
rowsNoDEPRECATED alias for `limit` (the old name meant per-type rows). Passing both `limit` and `rows` with different values raises.
termNo
limitNoMaximum number of records returned overall (default 25). A true total cap, not per-type.
queryNoSearch string, e.g. "apoptosis", "TP53", "cell cycle". Accepts aliases: `search`, `term`, `keyword`, `keywords`, `search_term`, `name` (supplying two different values raises ValueError).
typesNoFilter by entity type(s), case-insensitive; a string or list. Valid values: Cell, Chemical Compound, Complex, DNA Sequence, Drug, Genes and Transcripts, OtherEntity, Pathway, Polymer, Protein, RNA Sequence, Reaction, Set. Unknown values raise ValueError.
searchNo
keywordNo
speciesNoFilter by species scientific name, case-insensitive (e.g. "Homo sapiens", "homo sapiens", "Mus musculus"). A single string or a list. Unrecognized names raise ValueError (96 species available; see reactome.org/ContentService/data/species/all).
keywordsNo
search_termNo
include_summationNoWhen True, add a ≤240-char 'summation' description to each record. Default False keeps the payload small (a broad default search is ~hundreds of tokens instead of thousands).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

Even though annotations already mark readOnlyHint and openWorldHint, the description adds substantial behavioral detail: the exact return dict shape, 'has_more' semantics, error dict on upstream failure, include_summation payload tradeoff, and server-side case-sensitivity normalization. No annotation contradiction exists.

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

Conciseness4/5

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

The description is longer than typical but every sentence carries meaningful operational guidance, with clear warnings and structured paragraphs. It is front-loaded with the core purpose and avoids filler, though a few details repeat schema descriptions.

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

Completeness5/5

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

For a 12-parameter fuzzy search tool with an output schema and read-only annotations, the description covers the return contract, error handling, filter normalization, and payload optimization. An agent has enough information to invoke it correctly and interpret results without significant gaps.

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

Parameters4/5

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

Schema description coverage is 50%, so the description must compensate, and it does by clarifying limit as a total cap, return format, and the species/types validation-to-casing behavior. Some parameters (name, term, search, keyword) remain undocumented outside the schema's query alias note, so it stops short of a 5.

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

Purpose5/5

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

The description opens with 'Search the Reactome pathway knowledgebase by keyword (name / fuzzy match)' and explicitly says it resolves terms to Reactome stable IDs. This is a specific verb+resource with clear scope, and it distinguishes itself from the exact-match ChEMBL search tools.

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

Usage Guidelines5/5

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

It provides direct usage context by contrasting keyword/fuzzy matching with the exact-match ChEMBL search tools, telling the agent when approximate ranked hits are expected. It also warns about case-sensitivity and error-checking behavior, which supports correct selection and invocation.

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

search_rhea_entityA
Read-only

Search the Rhea reaction database by keyword and return matching reactions.

Matching is KEYWORD/FUZZY over reaction participants, equations, EC numbers, and cross-references — NOT exact-ID lookup. A term like "glucose" matches any reaction mentioning glucose. Field-scoped terms and wildcards are supported (e.g. ec:1.1.1.1, chebi:17234, uniprot:*). A chebi:-scoped term takes a BARE ChEBI number, not the CHEBI: prefix; a redundant chebi:CHEBI:17234 is auto-corrected to chebi:17234 (the prefixed form otherwise 500s).

RETURNS a dict {'total_count', 'has_more', 'results'} — NOT a bare list. 'total_count' is the number of reactions RETURNED (capped by limit, max 500); 'has_more' is true if more matched beyond the cap. Each result carries the requested columns as snake_cased keys (e.g. 'rhea-id' → 'rhea_id', 'chebi-id' → 'chebi_id'). On upstream failure returns {'error': ...} instead — CHECK FOR 'error' BEFORE READING 'results'.

Valid columns (default rhea-id,equation): rhea-id, equation, chebi, chebi-id, ec, uniprot, go, pubmed, reaction-xref(EcoCyc|KEGG|MetaCyc| Reactome|M-CSA).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
termNo
limitNoMaximum number of reactions returned (default 25). Must be between 0 and 500; a negative limit or one above 500 raises ValueError. `has_more` in the result signals whether more matched.
queryNoSearch string, e.g. "ATP", "glucose", "ec:1.1.1.1", "chebi:17234", "uniprot:*". REQUIRED — a blank query raises ValueError (it would otherwise dump an arbitrary slice of the whole database). Accepts aliases: `search`, `term`, `keyword`, `keywords`, `search_term`, `name` (supplying two different values raises ValueError).
searchNo
columnsNoWhich fields to return, as a comma-separated string or a list of column IDs (case-INSENSITIVE). Default "rhea-id,equation". Each requested column becomes a key on every result row; hyphenated IDs are snake_cased in the output (e.g. `chebi-id` → `chebi_id`). The 13 valid column IDs and their output keys: - chebi -> chebi (';'-joined ChEBI names) - chebi-id -> chebi_id (';'-joined ChEBI ids) - ec -> ec (';'-joined EC numbers) - equation -> equation (textual reaction equation) - go -> go (GO id + label) - pubmed -> pubmed (';'-joined PubMed ids) - reaction-xref(EcoCyc) -> xref_ecocyc - reaction-xref(KEGG) -> xref_kegg - reaction-xref(M-CSA) -> xref_mcsa - reaction-xref(MetaCyc) -> xref_metacyc - reaction-xref(Reactome) -> xref_reactome - rhea-id -> rhea_id (e.g. RHEA:10000) - uniprot -> uniprot (count of annotated UniProtKB entries) An unknown column raises ValueError — the API would otherwise silently drop it and return an unannounced narrower table.rhea-id,equation
keywordNo
keywordsNo
search_termNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the readOnlyHint and openWorldHint annotations, the description discloses critical runtime behavior: non-exact fuzzy matching, field-scoped syntax and wildcards, the ChEBI prefix 500-error trap and auto-correction, return dict shape with total_count/has_more, the 500-result cap, snake_casing of output keys, and the possibility of an {'error': ...} response. No contradiction with annotations exists.

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

Conciseness5/5

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

Although longer than average, the description is densely informative and well-structured: opening purpose, matching semantics, return contract, error handling, and columns. Every section adds operational value, and critical caveats such as the ChEBI prefix 500 and the need to check for 'error' are emphasized without padding.

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

Completeness5/5

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

For a tool with 9 parameters, fuzzy query syntax, return-shape nuances, error cases, column enumeration, and limit bounds, the description is complete enough for an agent to select and invoke it correctly. The output schema exists, and the description still goes beyond it by explaining how to interpret total_count, has_more, snake_cased keys, and failure responses.

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

Parameters4/5

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

Schema coverage is only 33% because several alias parameters have no prose description. The tool description compensates substantially by explaining query semantics, field-scoped terms, wildcard examples, ChEBI formatting constraints, limit cap behavior, and column-name-to-key mapping. It does not describe the alias parameters (name, term, search, keyword, etc.) in prose, but the schema already documents those aliases.

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

Purpose5/5

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

The opening sentence names a specific verb, resource, and expected output: "Search the Rhea reaction database by keyword and return matching reactions." It further distinguishes the tool from exact-ID lookups and sibling entity-search tools by clarifying that matching is keyword/fuzzy across participants, equations, EC numbers, and cross-references.

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

Usage Guidelines4/5

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

The description gives clear context for when to use the tool — flexible keyword search over reaction data — and explicitly states what it is NOT for: "NOT exact-ID lookup." However, it does not name alternative sibling tools for exact-ID lookup or other database-specific searches, so the alternatives are implied rather than explicit.

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

search_uniprot_entityA
Read-only

Search for a UniProt entity ID by query.

⚠️ Only the search string and limit are accepted. Extra parameters like taxon, organism, reviewed, species, etc. are silently dropped and have no effect — express such filters inside the Solr query string instead (e.g., organism_id:9606 AND reviewed:true).

⚠️ An unrecognised FIELD NAME inside the query string is not silently ignored: UniProt rejects it (HTTP 400, "'taxon' is not a valid search field") and this tool returns the "Error:" string described below. Common wrong guesses that fail this way: taxon, organism, species, go_id. What CAN fail silently is a valid field given an ill-formed value — it returns 0 rows, or rows you did not expect, with HTTP 200.

The search string can be passed as any of: query (canonical), search, term, keyword, keywords, search_term, or name.

RETURNS a TSV string with columns: accession, protein_name, organism_name. On upstream/HTTP failure this tool does NOT raise — it returns a plain string beginning with "Error:" (not TSV). CHECK FOR the "Error:" prefix BEFORE parsing rows.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
termNo
limitNoThe maximum number of results to return. Default is 20.
queryNoThe Solr-style query string for the UniProtKB /search endpoint. QUERY SYNTAX: - Simple keyword: "rubisco" - Field-specific: "field:value" (e.g., "gene:BRCA1", "protein_name:rubisco") - Boolean operators: AND, OR, NOT (e.g., "gene:TP53 AND organism_id:9606") - Grouping with parentheses: "((gene:CTNNB1) AND (taxonomy_id:9606))" - Wildcards (* suffix): "gene:PRO*" matches any gene starting with PRO - Ranges: "length:[1000 TO 2000]" or open-ended "length:[5000 TO *]" KEY QUERY FIELDS: Identity / Name: accession UniProt primary accession (e.g., "accession:P04637") id UniProt entry name / mnemonic (e.g., "id:P53_HUMAN") protein_name Protein name, including synonyms (e.g., "protein_name:rubisco") gene Gene name with wildcard support (e.g., "gene:BRCA*") gene_exact Exact gene name match (e.g., "gene_exact:TP53") ec Enzyme Commission number (e.g., "ec:1.1.1.1") Taxonomy: organism_id NCBI taxonomy ID (e.g., "organism_id:9606" for human, "organism_id:10090" for mouse) organism_name Organism scientific or common name taxonomy_id Taxon ID including all descendants lineage Taxonomic lineage keyword Annotation status: reviewed true = Swiss-Prot (manually reviewed), false = TrEMBL (automatically annotated) ALWAYS add "reviewed:true" when seeking high-quality entries. Sequence properties: length Sequence length as a range (e.g., "length:[100 TO 500]") mass Molecular mass in Daltons (range supported) existence Protein existence level: 1 (protein), 2 (transcript), 3 (homology), 4 (predicted), 5 (uncertain) Functional annotation: keyword UniProt keyword name (e.g., "keyword:Kinase") keyword_id UniProt keyword ID (e.g., "keyword_id:KW-0418") go Gene Ontology term, by ID or by term name (e.g., "go:0043202", 'go:"lysosomal lumen"'). TWO behaviours to know: (1) the ID must be zero-padded to 7 digits — "go:43202" is a VALID field with an unmatchable value, so it returns 0 rows and no error; (2) the match includes the term's GO DESCENDANTS, so "go:0043202" also returns proteins annotated only to its children (acrosomal lumen, endolysosome lumen) — 192 reviewed entries carry the term directly, 214 once descendants are counted (2026-08-20). function Function free-text annotation family Protein family (e.g., "family:globin") organelle Subcellular organelle (e.g., "organelle:chloroplast") cc_subcellular_location Subcellular location comment Cross-references: database Database cross-reference (e.g., "database:PDB") xref Cross-reference ID (e.g., "xref:pdb-1A2B") chebi ChEBI ID (e.g., "chebi:15422") interactor UniProt accession of interacting protein Literature: lit_author Author surname (e.g., "lit_author:Smith") lit_pubmed PubMed ID lit_doi DOI EXAMPLES (structured queries): # Reviewed human TP53 protein "gene_exact:TP53 AND organism_id:9606 AND reviewed:true" # All human kinases manually reviewed "keyword:Kinase AND organism_id:9606 AND reviewed:true" # EGFR in human or mouse "gene_exact:EGFR AND (organism_id:9606 OR organism_id:10090) AND reviewed:true" # Long chloroplast proteins (>= 5000 aa) in any organism "organelle:chloroplast AND length:[5000 TO *]" # Proteins with PDB structures involved in apoptosis "database:PDB AND keyword:Apoptosis AND organism_id:9606 AND reviewed:true" # Proteins encoded by gene names starting with "PIK3" "gene:PIK3* AND organism_id:9606 AND reviewed:true"
searchNo
keywordNo
keywordsNo
search_termNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior5/5

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

This is unusually transparent: it discloses silent dropping of extra parameters, HTTP 400 on invalid field names, silent 0-row or unexpected results for ill-formed values, the exact TSV column layout, and the 'Error:' prefix on upstream failure. These details go far beyond the readOnly/openWorld annotations and contain no contradiction.

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

Conciseness5/5

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

The description is longer than average, but every sentence earns its place: accepted parameters, failure modes, alias names, return format, and the required error-prefix check. It is front-loaded with the core purpose and uses structured warnings rather than padding.

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

Completeness4/5

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

It covers return format, failure behavior, accepted parameter aliases, and query-field constraints, which combined with the rich query syntax in the schema makes it largely complete. Minor gaps remain, such as what happens with an empty query and any pagination behavior beyond the schema's default limit.

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

Parameters4/5

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

With only 25% schema coverage, the description compensates by enumerating all accepted aliases (query, search, term, keyword, keywords, search_term, name) and clarifying that extra parameter names are ignored. The query parameter's syntax is already extensively documented in the schema, so the description does not need to repeat it.

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

Purpose4/5

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

The description opens with 'Search for a UniProt entity ID by query,' clearly naming the action and resource, and the subsequent details about Solr queries and TSV output clarify the scope. It distinguishes the tool from sibling search_* tools by resource, though 'entity ID' is slightly imprecise because the tool returns TSV rows rather than a single ID.

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

Usage Guidelines4/5

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

The description gives clear context: use it for UniProt queries, express filters inside the Solr query string, and only the search string and limit are accepted. It explicitly warns against extra parameters like taxon/organism/reviewed, but it does not directly compare this tool to sibling search tools.

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

togoid_convertIdA
Read-only

Convert identifiers from one database to another.

Maps IDs between biological databases — e.g., NCBI Gene IDs to UniProt accessions, or UniProt accessions to PDB structure IDs.

RETURNS a JSON string of a bare array of [source_id, target_id] pairs, e.g. '[["672", "P38398"], ["675", "O15129"]]'. An empty array means none of the input IDs converted along the route.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYesSource IDs. Accepts either a list of strings (e.g., ["672", "675", "7157"]) or a comma-separated string ("672,675,7157"). Examples: "672,675,7157" (NCBI Gene IDs), "P38398,P04637" (UniProt)
limitNoMaximum number of results (default 10000)
routeYesComma-separated pair of dataset keys: 'source,target'. NOTE: this is a single joined string, NOT separate `source`/`target` args (as in countId/getRelation) — because a route may be multi-hop (3+ datasets). Examples: - 'ncbigene,uniprot' (Gene → Protein) - 'uniprot,pdb' (Protein → 3D Structure) - 'ncbigene,ensembl_gene' (NCBI Gene → Ensembl Gene) - 'chembl_target,uniprot' (Drug Target → Protein) - 'uniprot,chembl_target' (Protein → Drug Target) - 'ncbigene,hgnc' (Gene → HGNC symbol) Multi-hop routes are also supported: - 'ncbigene,uniprot,pdb' (Gene → Protein → Structure)
offsetNoPagination offset for large result sets

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds valuable behavioral context by describing the return format (JSON string of [source_id, target_id] pairs) and the meaning of an empty array. It doesn't discuss failure modes or multi-hop edge cases, but it goes beyond the annotations.

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

Conciseness5/5

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

The description is two short paragraphs: the first states the purpose, the second explains the return format. It is front-loaded and every sentence contributes without verbosity. Excellent conciseness.

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

Completeness4/5

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

For a tool with 4 fully described parameters and an output schema, the description covers purpose, examples, return format, and empty-array semantics. It doesn't discuss error handling or limits beyond schema, but given the annotations and schema, it is quite complete.

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

Parameters3/5

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

Schema description coverage is 100% for all 4 parameters, with detailed descriptions including examples. The description itself adds no extra parameter semantics beyond the schema; it merely repeats route examples already present in the schema. Baseline of 3 is appropriate.

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

Purpose5/5

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

The description clearly states the tool's purpose: converting identifiers between biological databases, with concrete examples like NCBI Gene to UniProt. This differentiates it from sibling tools like togoid_getRelation (which returns relations) and togoid_countId (which counts). The verb 'convert' plus the resource is specific.

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

Usage Guidelines4/5

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

The description implies usage for ID conversion through examples, but it does not explicitly mention when to use this versus alternatives like togoid_getRelation or togoid_countId. While the purpose is clear, there is no explicit 'when not to use' guidance, though the examples effectively illustrate typical use cases.

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

togoid_countIdA
Read-only

Check how many of your IDs can be converted before doing bulk conversion.

A lightweight pre-check: tells you how many source IDs have mappings in the target database WITHOUT actually returning the mapped IDs. Use this to: - Verify your IDs are in the correct format - Estimate result size before a large convertId call - Check if a conversion route works for your specific IDs

This is a single-hop, pairwise check: pass source and target as two separate args (unlike convertId, which takes one comma-joined route).

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYesSource IDs to check. Accepts either a list of strings or a comma-separated string (e.g., ["672", "675"] or "672,675").
sourceYesSource database key (e.g., 'ncbigene', 'uniprot')
targetYesTarget database key (e.g., 'uniprot', 'pdb')

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, but the description adds valuable behavioral context: it is a lightweight pre-check, it does NOT return mapped IDs, and it is a single-hop pairwise check. This goes beyond what annotations provide and clarifies the tool's side-effect-free, non-returning nature.

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

Conciseness5/5

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

The description is well-structured and front-loaded with the core purpose, followed by a concise bulleted list of use cases and a final clarifying note about parameter style. Every sentence adds value without unnecessary fluff.

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

Completeness5/5

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

Given the output schema exists, the annotations are present, and all parameters are documented in the schema, the description fully covers the tool's purpose, usage context, behavioral constraints, and relationship to the sibling convertId tool. No critical gaps remain.

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

Parameters4/5

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

The input schema already documents all three parameters with 100% coverage, so the baseline is 3. The description adds meaning by explaining that source and target are passed as two separate args and that this is a single-hop pairwise check, which clarifies the parameter relationship and distinguishes it from convertId's route parameter.

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

Purpose5/5

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

The description clearly states the tool's function: 'Check how many of your IDs can be converted before doing bulk conversion.' It specifies the resource (source IDs, target database) and explicitly distinguishes itself from the sibling togoid_convertId by highlighting that this is a pre-check that does not return mapped IDs.

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

Usage Guidelines5/5

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

The description provides explicit use cases: verify ID format, estimate result size before a large convertId call, and check if a conversion route works. It also contrasts this tool with convertId's comma-joined 'route' parameter, giving clear guidance on when to use this tool versus the alternative.

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

togoid_getAllDatasetA
Read-only

List all databases registered in TogoID with their ID formats.

Returns configuration for every dataset TogoID knows about, including:

  • label: Human-readable database name

  • regex: Pattern for validating IDs (helps you check if you have the right ID format before converting)

  • prefix: URI prefix for linked data

  • examples: Sample IDs you can use to test conversions

Useful for: - Discovering which databases are available for ID conversion - Checking the expected ID format (e.g., UniProt accession vs entry name) - Finding example IDs to test with countId before bulk conversion

Returns: Dictionary mapping dataset keys (e.g., 'uniprot', 'ncbigene', 'pdb') to their configuration objects.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations provide readOnlyHint=true and openWorldHint=true, covering the safety profile. The description adds value by explaining the return structure (label, regex, prefix, examples) and clarifying that it returns config rather than data retrieved from databases. It doesn't discuss errors, rate limits, or pagination, but for a parameterless discovery call that's minor. No contradiction with annotations.

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

Conciseness4/5

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

Organized with a field list and use-case bullets; each sentence adds information. A little verbose with repeated tokens like 'You can use' but I'll keep the structure as a 4 because the redundancy is minor.

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

Completeness4/5

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

For a no-parameter discovery tool it's largely complete: it states the return type and fieldseuristics. It even ties examples to a workflow (testing with countId before bulk conversion) which aids agent planning. Minor gap: it doesn't mention max result size or whether output is localized, but those are minor.

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

Parameters4/5

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

Tool has zero parameters ESA, schema coverage is 100% (empty props), so there is nothing to document. Baseline 4 applies; the description correctly focuses on the return value instead of parameters.

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

Purpose5/5

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

The first sentence states a specific verb-resource pair: 'List all databases registered in TogoID'. This clearly distinguishes it from sibling tools like togoid_getDescription or togoid_convertId, which operate on specific entities or conversions. The scope 'all databases' is explicit and unambiguous.

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

Usage Guidelines4/5

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

Three concrete use cases are listed: discovering available databases, checking ID formats, and finding sample IDs to test with countId. This gives the agent a clear sense of when to call it. However, it does not explicitly state when NOT to use it or name a sibling alternative, so it stops short of the full 5.

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

togoid_getAllRelationA
Read-only

Discover all available ID conversion routes between databases.

⚡ PLANNING TOOL — Call this EARLY when a question involves 2+ databases that are on DIFFERENT SPARQL endpoints and you need to map IDs between them.

Returns a map of all source→target database pairs that TogoID can convert. Use this to plan your cross-database strategy BEFORE attempting SPARQL joins or manual ID lookups.

Common conversion routes include: - ncbigene ↔ uniprot (Gene IDs to/from protein accessions) - uniprot ↔ pdb (Protein accessions to/from 3D structure IDs) - ncbigene ↔ ensembl_gene (NCBI Gene to/from Ensembl gene IDs) - chembl_target ↔ uniprot (Drug targets to/from protein accessions) - ncbigene ↔ hgnc (Gene IDs to/from HGNC symbols) - pubchem_compound ↔ chembl_compound (Compound IDs across databases)

When to use: - Question references 2+ databases on different SPARQL endpoints - You need to bridge identifiers (e.g., "find UniProt proteins for these NCBI Gene IDs") - Before writing complex multi-step SPARQL to join databases manually

When NOT to use: - Both databases share a SPARQL endpoint (use a single SPARQL query) - You only need data from one database - NCBI esearch can already cross-reference what you need

Returns: Dictionary mapping database pairs to their relationship metadata. Each entry shows source, target, and the nature of the link.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

The annotations already declare readOnlyHint=true and openWorldHint=true, and the description adds behavioral context without contradiction. It explains that this is a planning tool to call early, returns a map of all source→target pairs, and includes examples of common routes, which goes beyond the annotations to convey usage semantics.

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

Conciseness4/5

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

The description is relatively long but well-structured with headings, bullet lists, and clear sections. It is front-loaded with the main purpose, then provides examples and usage guidance. Every section earns its place, though it could be slightly tightened without losing information.

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

Completeness5/5

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

Given that the tool has no parameters and an output schema exists, the description is complete. It explains the return type (dictionary of database pairs and metadata), provides examples, and covers when to use/not use. There are no significant gaps for the agent to misunderstand.

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

Parameters4/5

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

The tool has 0 parameters, so per the rubric the baseline is 4. The description doesn't need to explain parameters, and nothing is missing. It adds value by describing the return structure, which is not covered by the schema since there are no parameters.

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

Purpose5/5

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

The description clearly states the tool discovers all available ID conversion routes between databases. It uses a specific verb and resource, and distinguishes from siblings like togoid_getRelation and togoid_convertId by emphasizing it returns all routes for planning.

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

Usage Guidelines5/5

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

The description includes explicit 'When to use' and 'When NOT to use' sections, providing clear conditions and alternatives such as using a single SPARQL query when databases share an endpoint or NCBI esearch for cross-referencing. This gives actionable guidance for selecting this tool vs alternatives.

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

togoid_getDatasetA
Read-only

Get configuration for a specific database in TogoID.

Retrieves detailed metadata about a single dataset, including its ID format, URI prefix, example IDs, and available annotations.

RETURNS a dict with label (human-readable name), regex (ID-validation pattern — use it to check your IDs are well-formed), prefix (URI prefixes for linking), examples (sample IDs — test with countId before bulk conversion), and annotations (available annotation types).

ParametersJSON Schema
NameRequiredDescriptionDefault
datasetYesDataset key (e.g., 'uniprot', 'ncbigene', 'pdb', 'chembl_target', 'ensembl_gene', 'hgnc', 'pubchem_compound')

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

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

Annotations already signal read-only and open-world behavior. The description adds valuable behavioral context: `regex` should be used to validate IDs, and `example` IDs should be tested with `countId` before bulk operations. It does not contradict the annotations.

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

Conciseness4/5

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

The description is well-structured and front-loaded with the tool's purpose. The return field explanation is useful and avoids serious filler. It is moderately detailed, but each part earns its place.

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

Completeness5/5

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

For a single-parameter, read-only metadata retrieval tool with annotations and an output schema, the description is complete. It explains what is returned, how to interpret the fields, and how the returned data can be used in combination with `togoid_countId`.

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

Parameters3/5

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

The input schema already documents the `dataset` parameter completely, including example values, and coverage is 100%. The description adds some contextual meaning around returned fields like `regex` and `examples`, but it does not deeply expand the dataset parameter semantics beyond what the schema provides.

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

Purpose5/5

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

The description clearly states it retrieves configuration/metadata for a specific dataset in TogoID, using a specific verb and resource. It explicitly distinguishes from the sibling tool `togoid_getAllDataset` by emphasizing 'specific database' and 'single dataset'.

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

Usage Guidelines3/5

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

The description implies usage for inspecting a single dataset's metadata and mentions using `countId` for testing before bulk conversion. However, it does not explicitly tell the agent when to prefer this tool over siblings like `togoid_getAllDataset` or `togoid_getDescription`.

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

togoid_getDescriptionA
Read-only

Get human-readable descriptions for all databases in TogoID.

Returns names, descriptions (in English and Japanese), and organization info for each registered database. Useful for understanding what each database contains when planning cross-database queries.

Returns: Dictionary keyed by dataset name with description metadata.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint; the description adds concrete return format details (dictionary keyed by dataset name) and metadata contents, consistent with those hints. No rate limits or auth requirements are mentioned, but they are not critical for a simple read-only lookup.

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

Conciseness5/5

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

The description is four short, purposeful sentences: purpose, contents, use case, and return shape. It is front-loaded and contains no filler or redundancy.

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

Completeness5/5

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

For a zero-parameter metadata lookup with output schema and safety annotations, the description fully covers what the tool does, when to use it, and what it returns. It is complete enough for an agent to select and invoke correctly.

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

Parameters4/5

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

The tool has zero parameters, so the description carries no parameter explanation burden. The baseline of 4 applies because there are no parameters to document.

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

Purpose5/5

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

The description clearly identifies the tool as retrieving human-readable descriptions for all TogoID databases, including names, descriptions in English and Japanese, and organization info. This specific verb+resource pairing distinguishes it from sibling tools like togoid_getAllDataset or togoid_convertId.

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

Usage Guidelines4/5

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

The description explicitly states it is useful for understanding database contents when planning cross-database queries, giving a clear context for use. It does not name alternatives or exclusions, but the use case is specific enough to guide tool selection.

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

togoid_getRelationA
Read-only

Check if a specific ID conversion route exists and get its details.

Use this to verify that a particular source→target conversion is available before calling convertId. Also reveals the nature of the relationship (e.g., "encoded by", "has structure", "is target of").

This is a single-hop, pairwise check: pass source and target as two separate args (unlike convertId, which takes one comma-joined route).

RETURNS a JSON string of a bare array of relationship objects, each with forward (label from source to target), reverse (label from target to source), and description (explanation of the link). An empty array means no direct route exists.

ParametersJSON Schema
NameRequiredDescriptionDefault
sourceYesSource database key (e.g., 'uniprot', 'ncbigene', 'chembl_target')
targetYesTarget database key (e.g., 'pdb', 'ensembl_gene', 'hgnc')

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

The annotations already indicate the tool is read-only (readOnlyHint: true) and may return varying data (openWorldHint: true), covering safety and variability. The description adds crucial behavioral detail: it returns a JSON string of an array of relationship objects with specific fields (forward, reverse, description), and clarifies that an empty array means no direct route exists. It also notes that it is a single-hop pairwise check. This adds context beyond the annotations without contradicting them.

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

Conciseness5/5

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

The description is well-structured and appropriately sized. It opens with a clear purpose statement, then immediately gives usage guidance and a contrast with a sibling tool. The return format is described concisely in a separate paragraph, using bullet-like structure. Every sentence adds value, and there is no fluff or repetition.

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

Completeness5/5

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

The tool is relatively simple (2 params, no nested objects), and the schema covers both parameters fully. The output schema is present, so return values don't need to be overly detailed, but the description still gives a clear summary of the return structure. The description also clearly explains the tool's role in the broader workflow (verify before convertId), and differentiates it from other relation-related tools. It is complete for an agent to select and invoke this tool correctly.

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

Parameters4/5

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

The schema already provides examples for both parameters ('uniprot', 'ncbigene' etc.), so coverage is high. The description adds semantic meaning by framing them as 'source' and 'target' for a route check, and explicitly mentions that they are passed separately (unlike convertId). It also tells the user that these are database keys, but the schema examples already did that. The added value is the clarification of how to pass them, which is useful.

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

Purpose5/5

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

The description clearly states that the tool checks if a specific ID conversion route exists and retrieves its details. It specifies the action ('Check', 'get details'), the resource ('ID conversion route'), and differentiates it from sibling tools like togoid_convertId (which actually converts) and togoid_getAllRelation (which lists all relations).

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

Usage Guidelines5/5

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

The description explicitly states when to use this tool: 'Use this to verify that a particular source→target conversion is available before calling convertId.' It also provides a clear contrast with convertId, which takes a comma-joined route, and explains that this tool requires separate 'source' and 'target' arguments. This gives clear usage guidelines and differentiates from the closest sibling.

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

TogoMCP_Usage_GuideA
Read-only

⚠️ CALL THIS TOOL FIRST every turn, before any other TogoMCP tool.

Returns the v6 Usage Guide, which enforces the empirically-validated workflow:

GATE 0: classify the question (bounded → STEP −1 | open-ended → EXPLORATION).
STEP −1: analyze entities, databases, endpoints (no tools).
STEP  0: pick database(s) from the DATABASE CATALOG in this guide — no tool call.
STEP  1: specialized search or ncbi_esearch — ground in real IRIs.
STEP  2: get_MIE_file(database) — required before any run_sparql.
STEP  3: run_sparql() — pin every graph; LIMIT 10 first; max 2 consecutive.
STEP  4: synthesize — each fact once, no meta-commentary.

Why this matters (measured): questions with ≥3 consecutive run_sparql calls score ~1.1 points lower than compliant ones; jumping to text search before reading the MIE schema accounts for ~95% of silent SPARQL failures. The guide's DATABASE CATALOG lists all databases with what each is for (scan it to pick 1–3), plus the EXPLORATION habits (Seed Definition, concierge check, prioritized Next Steps) for open-ended deep dives.

Most RDF Portal endpoints host MANY databases (primary: 16, ebi: 5, ncbi: 5, sib: 4) and every endpoint hosts many GRAPHS. An unpinned query silently reads all of them, so a co-hosted graph can supply a predicate you believe is native and return a plausible, correctly-shaped, WRONG number — with no error. The guide's CO-TENANCY section is the one to read before writing SPARQL.

Re-run GATE 0 every turn — prior workflow does not carry forward.

Returns: str: The content of the TogoMCP usage guide.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations (readOnlyHint=true, openWorldHint=true) already indicate safe, read-only behavior. The description adds valuable context about what the guide enforces and warns about co-tenancy and unpinned SPARQL risks, going beyond the annotations. No hidden behavior is left undisclosed; it simply returns a string.

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

Conciseness4/5

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

The description is lengthy but well-structured: the imperative call-to-action is front-loaded, followed by stepwise workflow, measured rationale, and a critical co-tenancy warning. Each section earns its place for a tool meant to be consulted first, though it could be slightly condensed without losing value.

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

Completeness5/5

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

For a simple parameterless tool, the description is exceptionally complete. It explains why to call it, what the guide contains (DATABASE CATALOG, EXPLORATION habits), and provides the co-tenancy warning essential for correct SPARQL use. The output schema further covers return value details, so no critical context is missing.

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

Parameters4/5

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

The tool has zero parameters, so schema coverage is trivially 100%. The description compensates by explaining the guide's content and purpose, which is the relevant semantic context. A baseline of 4 is appropriate since there are no parameter semantics to clarify.

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

Purpose5/5

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

The description clearly states 'Returns the v6 Usage Guide' and positions the tool as the mandatory first call, distinguishing it from sibling query/search tools. The verb 'returns' with resource 'usage guide' and the explicit scope ('before any other TogoMCP tool') make the purpose unmistakable.

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

Usage Guidelines5/5

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

The description explicitly instructs 'CALL THIS TOOL FIRST every turn' and provides a detailed stepwise workflow (GATE 0, STEP −1 through STEP 4) with when to use which action. It also says 'Re-run GATE 0 every turn', giving clear, concrete usage rules that differentiate it from alternatives.

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

togovar_search_diseaseA
Read-only

Resolve a disease term to MONDO / MedGen IDs for variant search.

The returned mondo_id (or MedGen CUI) is what search_variant takes as disease_id. Both land directly on TogoMCP's existing mondo/medgen RDF databases and TogoID nodes.

The TogoVar endpoint does loose token matching with no relevance order (a query like "cystic fibrosis" also returns unrelated "Hepatic fibrosis…" rows), so this tool RE-RANKS client-side: exact label match first, then prefix, then whole-word, then loose token matches last. Each result carries match_type ("exact"|"prefix"|"word"|"fuzzy") — a top hit that is not exact means no exact label matched.

COVERAGE LIMIT: TogoVar only indexes diseases that have ClinVar/MGeND variant associations, so some canonical/parent MONDO terms are simply absent here (e.g. MONDO_0007254 "breast cancer" does NOT appear in these results). But a broad/parent MONDO ID still WORKS as a disease_id in search_variant even when unlisted here — the variant search resolves it via MONDO descendant expansion (MONDO_0007254 -> ~24,550 variants). So if you know or can resolve the canonical MONDO ID (e.g. via OLS4 or the mondo RDF database), pass it straight to search_variant; do not assume this resolver is exhaustive.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax matches to return, in [1, 100]. Default 10.
queryNoDisease term, e.g. 'breast cancer'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the readOnlyHint and openWorldHint annotations, the description discloses internal re-ranking behavior, match_type semantics, loose token matching pitfalls, and coverage limitations. It also clarifies that unlisted parent MONDO IDs still work downstream, adding crucial behavioral context.

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

Conciseness4/5

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

The description is longer than average but every paragraph adds substantive context: purpose, ranking logic, and coverage limitations. It is front-loaded with the core purpose and then provides necessary caveats, though some internal references (e.g., TogoMCP RDF databases) could be trimmed.

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

Completeness5/5

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

Given the tool's complexity and the presence of an output schema, the description is exceptionally complete: it covers return field semantics, ranking order, edge cases, alternatives, and downstream integration. No critical behavioral aspect is left unexplained.

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

Parameters3/5

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

The schema already fully describes both parameters (`query` and `limit`) with types, ranges, defaults, and examples, so the description adds no new parameter-level detail. The baseline 3 is appropriate given complete schema coverage.

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

Purpose5/5

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

The description clearly states the tool resolves a disease term to MONDO/MedGen IDs for variant search, giving a specific verb and resource. It distinguishes itself from sibling tools by explicitly linking its output to `search_variant`'s `disease_id` parameter.

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

Usage Guidelines5/5

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

The description explicitly explains when to use this tool: to resolve a disease term before calling `search_variant`. It also provides an alternative — using OLS4 or the `mondo` RDF database to resolve canonical MONDO IDs directly — and warns that the resolver is not exhaustive.

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

togovar_search_geneA
Read-only

Resolve a human gene symbol/alias to its HGNC ID for variant search.

This is the FIRST step of the two-step variant workflow: the hgnc_id returned here is what search_variant takes as gene_hgnc_id.

The TogoVar endpoint does loose token matching with no relevance order (it returns the same set for "ALDH2" and the non-existent "ALDH2A1"), so this tool RE-RANKS client-side: exact symbol match first, then prefix, then other matches. Each result carries match_type ("exact"|"prefix"|"word"|"fuzzy") against your query — CHECK IT: if the top hit is not exact, the exact symbol you asked for does not exist and the rows are loose false positives, so do not blindly feed the first hgnc_id downstream. (The endpoint echoes the matched token as symbol and the HGNC approved gene name as name; it does not expose approved-vs-alias status, so use name to sanity-check.)

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax matches to return, in [1, 100]. Default 10.
queryNoGene symbol or alias, e.g. 'ALDH2'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

The description goes well beyond the readOnlyHint/openWorldHint annotations, disclosing the endpoint's loose token matching, lack of relevance order, client-side re-ranking, match_type values, and false-positive risk. It also explains the symbol/name echo behavior and the absence of approved-vs-alias status, giving the agent actionable behavioral expectations.

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

Conciseness5/5

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

The description is front-loaded with a clear purpose sentence, then each subsequent sentence earns its place by explaining workflow placement, matching quirks, and result interpretation. Despite being detailed, it is free of filler and tightly organized around helping the agent avoid a real failure mode.

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

Completeness5/5

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

For a two-step lookup tool with an output schema and complete parameter schema, the description is fully complete: it covers purpose, input semantics, workflow linkage, output field interpretation, and caveats. Nothing important is left unexplained for safe invocation.

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

Parameters4/5

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

The input schema already covers both parameters at 100%, so the baseline is 3, but the description adds meaningful query semantics: loose token matching, exact/prefix/word/fuzzy re-ranking, and the significance of match_type. The limit parameter is not expanded beyond the schema, but the added query behavior justifies a slightly higher score.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Resolve a human gene symbol/alias to its HGNC ID for variant search.' It clearly distinguishes this from sibling tools like togovar_search_disease and togovar_search_variant by framing it as the gene-resolution step for the variant workflow.

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

Usage Guidelines5/5

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

The description explicitly positions this as 'the FIRST step of the two-step variant workflow' and states that the returned hgnc_id is what search_variant takes as gene_hgnc_id. It also gives strong when-to-use caution: check match_type and do not blindly feed the first hgnc_id downstream unless the top hit is exact.

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

togovar_search_variantA
Read-only

Search TogoVar for human genome variants with population frequencies.

TogoVar integrates allele frequencies from gnomAD, ToMMo (Japanese), NCBN, GEM-J, JGA, and BioBank Japan, plus ClinVar + MGeND clinical significance and SIFT/PolyPhen/AlphaMissense predictions — data with no SPARQL counterpart elsewhere in TogoMCP.

All filters are optional and combined with AND. Supply zero filters to browse; but scope tightly — the database holds ~1 billion variants.

COUNTS: total is the size of the whole REST backend (1,097,708,150) and is constant across queries; filtered is the count matching your filters. Note the REST backend is LARGER than TogoMCP's togovar SPARQL graph (~2.8x: the SPARQL side is the annotated subset, 390,725,782), so REST counts will not match SPARQL COUNT(*) — they measure different sets.

PAGING CAP: the API allows offset + limit <= 10,000 and returns HTTP 400 beyond it, so a result set larger than 10,000 cannot be fully paged. Narrow the filters until filtered <= 10,000 to enumerate one exhaustively.

STATISTICS SCOPE (stat=True): all facets are scoped to the filtered set, but they count at different granularities. type counts per variant (sums to filtered); dataset per variant-cohort; consequence per variant-TRANSCRIPT (VEP fan-out, so its sum is filtered x transcripts per variant — ~5-6 for a typical gene, 400+ in transcript-dense loci like BRCA1); significance per variant-condition record. So consequence/ significance sums exceed filtered and must NOT be summed against it (they are not per-variant counts). See statistics_caveats for the per-facet rule.

ROUND-TRIP TO SPARQL: gate on tgv_id. It is NULL for variants that exist in the REST backend but NOT in the (smaller) SPARQL subset — including some ClinVar-Pathogenic ones. variant_iri is emitted ONLY when tgv_id is non-null, so a non-null variant_iri is safe to query in the togovar SPARQL graph; a row with tgv_id: null has no SPARQL record at all, and REST is the only source for it.

TWO-STEP WORKFLOW for gene/disease filters: 1. search_gene("ALDH2") -> hgnc_id -> pass as gene_hgnc_id. 2. search_disease("breast cancer") -> mondo_id -> pass as disease_id.

ParametersJSON Schema
NameRequiredDescriptionDefault
statNoIf True, also return match counts (`total`, `filtered`) and the aggregate breakdown (counts by dataset, type, consequence, significance). REQUIRED to get a count — e.g. "how many variants match". Left False by default because computing the aggregation is the slow part of the query; use stat=False when you only need rows. See STATISTICS SCOPE above — every facet is scoped to the filtered set, but they count at different granularities, so only `type` sums to `filtered`.
stopNo
limitNoMax variant rows to return, in [0, 1000]. Default 100.
startNo
offsetNoRows to skip (pagination). Default 0.
tgv_idNoTogoVar variant ID(s), e.g. "tgv16331".
datasetNoFrequency panel for a frequency filter, e.g. "gnomad_genomes", "gnomad_exomes", "tommo", "ncbn", "gem_j_wga", "jga_wgs", "jga_wes", "jga_snp", "bbj_riken". Sub-populations allowed (e.g. "gnomad_genomes.eas", "ncbn.jpn").
positionNoSingle 1-based site (mutually exclusive with start/stop).
chromosomeNo"1"-"22", "X", "Y", "MT". Required for a positional filter.
disease_idNoMONDO ID(s) (e.g. "MONDO_0007254") or MedGen CUI(s) from `search_disease`.
consequenceNoSO consequence term or label, e.g. "missense_variant", "stop_gained", "frameshift_variant".
gene_hgnc_idNoHGNC ID (integer) from `search_gene` (NOT a symbol).
variant_typeNo"snv", "ins", "del", "indel", "sub".
max_frequencyNo
min_frequencyNo
disease_sourceNoRestrict disease link source(s): "clinvar", "mgend".
include_transcriptsNoIf True, add a `transcripts` list to each row with the per-transcript VEP annotation the REST backend already carries: transcript/gene IDs, SO consequence(+labels), HGVS c/p/g, and per-transcript SIFT/PolyPhen/AlphaMissense. Default False — a variant in a transcript-dense locus (e.g. BRCA1) can carry 400+ transcript annotations, which would dominate the response. Note this means HGVS and per-transcript predictions do NOT require a SPARQL round-trip.
significance_sourceNoRestrict significance source(s): "clinvar", "mgend".
include_full_allelesNoIf True, return full REF/ALT sequences even for large structural variants. Default False summarizes alleles over ~50 bp as "<head>…(<n> bp)" to keep the response inline-readable; `ref_length`/`alt_length` always give the true lengths.
clinical_significanceNoe.g. "pathogenic", "likely_pathogenic", "benign", "uncertain_significance", "risk_factor".

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

Despite having readOnlyHint and openWorldHint annotations, the description goes far beyond them, disclosing the paging cap of 10,000 with HTTP 400, the peculiarity of `total` being constant, the statistics granularity caveats, and the round-trip to SPARQL conditions. This provides critical behavioral context that annotations do not cover.

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

Conciseness4/5

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

The description is long but every section serves a purpose: the statistics caveats, paging cap, and SPARQL mapping are critical for correct usage. The use of bold headers and bullet-like structure improves readability, though it could be slightly more concise without losing essential warnings.

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

Completeness5/5

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

Given the tool's complexity (20 parameters, output schema, advanced features), the description is remarkably complete. It covers filtering logic, count semantics, statistics pitfalls, paging limitations, SPARQL integration, and workflow prerequisites. This is one of the most thorough descriptions for a complex tool, leaving little ambiguity.

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

Parameters4/5

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

With 80% schema description coverage, many parameters are well-described in the schema, and the description adds value by explaining the `stat` parameter in depth, the two-step workflow for gene_hgnc_id and disease_id, and noting the importance of limiting results. However, some parameters like max_frequency and min_frequency lack description beyond the schema, but the description's coverage is strong.

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

Purpose5/5

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

The description clearly states the verb ('Search') and resource ('TogoVar for human genome variants with population frequencies'). It also differentiates from siblings by emphasizing the integration of allele frequencies and clinical significance, and explicitly mentions 'no SPARQL counterpart elsewhere in TogoMCP', distinguishing it from run_sparql and related tools.

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

Usage Guidelines5/5

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

The description provides extensive guidance on when to use this tool, including a two-step workflow for gene/disease filters (referencing togovar_search_gene and togovar_search_disease). It also explains when not to use SPARQL (when variant lacks tgv_id) and notes the REST backend is larger than SPARQL, helping choose between tools.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 4 tool updatesv2.0.1
    • Changedget_MIE_file1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Name of a single RDF database. Must be exactly one of: uniprot, rhea, pubchem, pdb, chembl, chebi, reactome, ensembl, amrportal, mesh, go, taxonomy, mondo, nando, bacdive, mediadive, clinvar, pubmed, pubtator, ncbigene, medgen, ddbj, glycosmos, supercon, bgee, oma, brenda, hgnc, jpostdb, massbank, nbrc, mogplus, hco, mco, togovar, ontology. Do NOT pass an endpoint group name here (e.g. 'ebi', 'sib') — those go in endpoint_name instead."New value: +"Name of a single RDF database. Must be exactly one of: uniprot, rhea, pubchem, pdb, chembl, chebi, reactome, ensembl, amrportal, mesh, go, taxonomy, mondo, nando, bacdive, mediadive, clinvar, pubmed, pubtator, ncbigene, medgen, ddbj, glycosmos, supercon, bgee, oma, brenda, hgnc, jpostdb, massbank, nbrc, mogplus, hco, mco, togovar, ontology, gwascatalog. Do NOT pass an endpoint group name here (e.g. 'ebi', 'sib') — those go in endpoint_name instead."
    • Changedrun_sparql1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Name of a single RDF database. Must be exactly one of: uniprot, rhea, pubchem, pdb, chembl, chebi, reactome, ensembl, amrportal, mesh, go, taxonomy, mondo, nando, bacdive, mediadive, clinvar, pubmed, pubtator, ncbigene, medgen, ddbj, glycosmos, supercon, bgee, oma, brenda, hgnc, jpostdb, massbank, nbrc, mogplus, hco, mco, togovar, ontology. Do NOT pass an endpoint group name here (e.g. 'ebi', 'sib') — those go in endpoint_name instead."New value: +"Name of a single RDF database. Must be exactly one of: uniprot, rhea, pubchem, pdb, chembl, chebi, reactome, ensembl, amrportal, mesh, go, taxonomy, mondo, nando, bacdive, mediadive, clinvar, pubmed, pubtator, ncbigene, medgen, ddbj, glycosmos, supercon, bgee, oma, brenda, hgnc, jpostdb, massbank, nbrc, mogplus, hco, mco, togovar, ontology, gwascatalog. Do NOT pass an endpoint group name here (e.g. 'ebi', 'sib') — those go in endpoint_name instead."
    • Changedsearch_chembl_molecule1 field changed
      • addedInput schema / properties / mode
        Added value: +{
        +  "default": "exact",
        +  "description": "\"exact\" (default) matches the WHOLE string against a\nsynonym; \"extract\" finds substances named INSIDE it. Defaults to \"exact\".",
        +  "type": "string"
        +}
    • Changedsearch_uniprot_entity1 field changed
      • changedInput schema / properties / query / description
        Previous value: -"The Solr-style query string for the UniProtKB /search endpoint.\n\nQUERY SYNTAX:\n- Simple keyword: \"rubisco\"\n- Field-specific: \"field:value\"  (e.g., \"gene:BRCA1\", \"protein_name:rubisco\")\n- Boolean operators: AND, OR, NOT  (e.g., \"gene:TP53 AND organism_id:9606\")\n- Grouping with parentheses: \"((gene:CTNNB1) AND (taxonomy_id:9606))\"\n- Wildcards (* suffix): \"gene:PRO*\" matches any gene starting with PRO\n- Ranges: \"length:[1000 TO 2000]\" or open-ended \"length:[5000 TO *]\"\n\nKEY QUERY FIELDS:\nIdentity / Name:\n  accession          UniProt primary accession (e.g., \"accession:P04637\")\n  id                 UniProt entry name / mnemonic (e.g., \"id:P53_HUMAN\")\n  protein_name       Protein name, including synonyms (e.g., \"protein_name:rubisco\")\n  gene               Gene name with wildcard support (e.g., \"gene:BRCA*\")\n  gene_exact         Exact gene name match (e.g., \"gene_exact:TP53\")\n  ec                 Enzyme Commission number (e.g., \"ec:1.1.1.1\")\n\nTaxonomy:\n  organism_id        NCBI taxonomy ID (e.g., \"organism_id:9606\" for human,\n                     \"organism_id:10090\" for mouse)\n  organism_name      Organism scientific or common name\n  taxonomy_id        Taxon ID including all descendants\n  lineage            Taxonomic lineage keyword\n\nAnnotation status:\n  reviewed           true = Swiss-Prot (manually reviewed),\n                     false = TrEMBL (automatically annotated)\n                     ALWAYS add \"reviewed:true\" when seeking high-quality entries.\n\nSequence properties:\n  length             Sequence length as a range (e.g., \"length:[100 TO 500]\")\n  mass               Molecular mass in Daltons (range supported)\n  existence          Protein existence level: 1 (protein), 2 (transcript),\n                     3 (homology), 4 (predicted), 5 (uncertain)\n\nFunctional annotation:\n  keyword            UniProt keyword name (e.g., \"keyword:Kinase\")\n  keyword_id         UniProt keyword ID (e.g., \"keyword_id:KW-0418\")\n  function           Function free-text annotation\n  family             Protein family (e.g., \"family:globin\")\n  organelle          Subcellular organelle (e.g., \"organelle:chloroplast\")\n  cc_subcellular_location  Subcellular location comment\n\nCross-references:\n  database           Database cross-reference (e.g., \"database:PDB\")\n  xref               Cross-reference ID (e.g., \"xref:pdb-1A2B\")\n  chebi              ChEBI ID (e.g., \"chebi:15422\")\n  interactor         UniProt accession of interacting protein\n\nLiterature:\n  lit_author         Author surname (e.g., \"lit_author:Smith\")\n  lit_pubmed         PubMed ID\n  lit_doi            DOI\n\nEXAMPLES (structured queries):\n  # Reviewed human TP53 protein\n  \"gene_exact:TP53 AND organism_id:9606 AND reviewed:true\"\n\n  # All human kinases manually reviewed\n  \"keyword:Kinase AND organism_id:9606 AND reviewed:true\"\n\n  # EGFR in human or mouse\n  \"gene_exact:EGFR AND (organism_id:9606 OR organism_id:10090) AND reviewed:true\"\n\n  # Long chloroplast proteins (>= 5000 aa) in any organism\n  \"organelle:chloroplast AND length:[5000 TO *]\"\n\n  # Proteins with PDB structures involved in apoptosis\n  \"database:PDB AND keyword:Apoptosis AND organism_id:9606 AND reviewed:true\"\n\n  # Proteins encoded by gene names starting with \"PIK3\"\n  \"gene:PIK3* AND organism_id:9606 AND reviewed:true\""New value: +"The Solr-style query string for the UniProtKB /search endpoint.\n\nQUERY SYNTAX:\n- Simple keyword: \"rubisco\"\n- Field-specific: \"field:value\"  (e.g., \"gene:BRCA1\", \"protein_name:rubisco\")\n- Boolean operators: AND, OR, NOT  (e.g., \"gene:TP53 AND organism_id:9606\")\n- Grouping with parentheses: \"((gene:CTNNB1) AND (taxonomy_id:9606))\"\n- Wildcards (* suffix): \"gene:PRO*\" matches any gene starting with PRO\n- Ranges: \"length:[1000 TO 2000]\" or open-ended \"length:[5000 TO *]\"\n\nKEY QUERY FIELDS:\nIdentity / Name:\n  accession          UniProt primary accession (e.g., \"accession:P04637\")\n  id                 UniProt entry name / mnemonic (e.g., \"id:P53_HUMAN\")\n  protein_name       Protein name, including synonyms (e.g., \"protein_name:rubisco\")\n  gene               Gene name with wildcard support (e.g., \"gene:BRCA*\")\n  gene_exact         Exact gene name match (e.g., \"gene_exact:TP53\")\n  ec                 Enzyme Commission number (e.g., \"ec:1.1.1.1\")\n\nTaxonomy:\n  organism_id        NCBI taxonomy ID (e.g., \"organism_id:9606\" for human,\n                     \"organism_id:10090\" for mouse)\n  organism_name      Organism scientific or common name\n  taxonomy_id        Taxon ID including all descendants\n  lineage            Taxonomic lineage keyword\n\nAnnotation status:\n  reviewed           true = Swiss-Prot (manually reviewed),\n                     false = TrEMBL (automatically annotated)\n                     ALWAYS add \"reviewed:true\" when seeking high-quality entries.\n\nSequence properties:\n  length             Sequence length as a range (e.g., \"length:[100 TO 500]\")\n  mass               Molecular mass in Daltons (range supported)\n  existence          Protein existence level: 1 (protein), 2 (transcript),\n                     3 (homology), 4 (predicted), 5 (uncertain)\n\nFunctional annotation:\n  keyword            UniProt keyword name (e.g., \"keyword:Kinase\")\n  keyword_id         UniProt keyword ID (e.g., \"keyword_id:KW-0418\")\n  go                 Gene Ontology term, by ID or by term name\n                     (e.g., \"go:0043202\", 'go:\"lysosomal lumen\"').\n                     TWO behaviours to know: (1) the ID must be\n                     zero-padded to 7 digits — \"go:43202\" is a VALID\n                     field with an unmatchable value, so it returns 0\n                     rows and no error; (2) the match includes the\n                     term's GO DESCENDANTS, so \"go:0043202\" also\n                     returns proteins annotated only to its children\n                     (acrosomal lumen, endolysosome lumen) — 192\n                     reviewed entries carry the term directly, 214\n                     once descendants are counted (2026-08-20).\n  function           Function free-text annotation\n  family             Protein family (e.g., \"family:globin\")\n  organelle          Subcellular organelle (e.g., \"organelle:chloroplast\")\n  cc_subcellular_location  Subcellular location comment\n\nCross-references:\n  database           Database cross-reference (e.g., \"database:PDB\")\n  xref               Cross-reference ID (e.g., \"xref:pdb-1A2B\")\n  chebi              ChEBI ID (e.g., \"chebi:15422\")\n  interactor         UniProt accession of interacting protein\n\nLiterature:\n  lit_author         Author surname (e.g., \"lit_author:Smith\")\n  lit_pubmed         PubMed ID\n  lit_doi            DOI\n\nEXAMPLES (structured queries):\n  # Reviewed human TP53 protein\n  \"gene_exact:TP53 AND organism_id:9606 AND reviewed:true\"\n\n  # All human kinases manually reviewed\n  \"keyword:Kinase AND organism_id:9606 AND reviewed:true\"\n\n  # EGFR in human or mouse\n  \"gene_exact:EGFR AND (organism_id:9606 OR organism_id:10090) AND reviewed:true\"\n\n  # Long chloroplast proteins (>= 5000 aa) in any organism\n  \"organelle:chloroplast AND length:[5000 TO *]\"\n\n  # Proteins with PDB structures involved in apoptosis\n  \"database:PDB AND keyword:Apoptosis AND organism_id:9606 AND reviewed:true\"\n\n  # Proteins encoded by gene names starting with \"PIK3\"\n  \"gene:PIK3* AND organism_id:9606 AND reviewed:true\""
  2. 26 tool updatesv2.0.0
    • Removedfind_databases
    • Changedget_compound_attributes_from_pubchem1 field changed
      • addedInput schema / properties / pubchem_compound_id / description
        Added value: +"PubChem Compound ID (CID), e.g. \"445154\"."
    • Changedget_graph_list5 fields changed
      • removedInput schema / properties / database / default
        Removed value: -""
      • changedInput schema / properties / database / description
        Previous value: -"RDF database name (e.g. 'uniprot', 'chembl'). When the name is in the registry it resolves the endpoint URL; in any case the value is used as a case-insensitive substring to rank matching graph URIs first. Optional if `endpoint_url` or `endpoint_name` is provided."New value: +"RDF database name (e.g. 'uniprot', 'chembl'). Required. When the name is in the registry it resolves the endpoint URL; in any case the value is used as a case-insensitive substring to rank matching graph URIs first. For an unregistered database, also pass `endpoint_url` or `endpoint_name` (which take priority); `database` is then just the ranking hint."
      • removedInput schema / properties / db
        Removed value: -{
        -  "default": "",
        -  "type": "string"
        -}
      • removedInput schema / properties / dbname
        Removed value: -{
        -  "default": "",
        -  "type": "string"
        -}
      • addedInput schema / required
        Added value: +[
        +  "database"
        +]
    • Changedget_MIE_file3 fields changed
      • changedInput schema / properties / database / description
        Previous value: -"Name of a single RDF database. Must be exactly one of: uniprot, rhea, pubchem, pdb, chembl, chebi, reactome, ensembl, amrportal, mesh, go, taxonomy, mondo, nando, bacdive, mediadive, clinvar, pubmed, pubtator, ncbigene, medgen, ddbj, glycosmos, supercon, bgee, oma, brenda, hgnc, jpostdb, massbank. Do NOT pass an endpoint group name here (e.g. 'ebi', 'sib') — those go in endpoint_name instead."New value: +"Name of a single RDF database. Must be exactly one of: uniprot, rhea, pubchem, pdb, chembl, chebi, reactome, ensembl, amrportal, mesh, go, taxonomy, mondo, nando, bacdive, mediadive, clinvar, pubmed, pubtator, ncbigene, medgen, ddbj, glycosmos, supercon, bgee, oma, brenda, hgnc, jpostdb, massbank, nbrc, mogplus, hco, mco, togovar, ontology. Do NOT pass an endpoint group name here (e.g. 'ebi', 'sib') — those go in endpoint_name instead."
      • addedInput schema / properties / db / description
        Added value: +"Alias for `database`."
      • addedInput schema / properties / dbname / description
        Added value: +"Alias for `database`."
    • Changedget_pubchem_compound_id1 field changed
      • addedInput schema / properties / compound_name / description
        Added value: +"Compound name, e.g. \"resveratrol\"."
    • Removedlist_categories
    • Removedlist_databases
    • Changedncbi_efetch5 fields changed
      • addedInput schema / properties / database / description
        Added value: +"NCBI database name (alias: `db`)"
      • addedInput schema / properties / db / description
        Added value: +"Alias for `database`."
      • addedInput schema / properties / ids / description
        Added value: +"IDs to fetch. Accepts either a list of strings\n(e.g., [\"123\", \"456\"]) or a comma-separated string (\"123,456\")."
      • addedInput schema / properties / retmode / description
        Added value: +"Return mode (text, xml, json where applicable)"
      • addedInput schema / properties / rettype / description
        Added value: +"Return type (xml, fasta, gb, etc.)"
    • Changedncbi_esearch8 fields changed
      • addedInput schema / properties / database / description
        Added value: +"NCBI database name (alias: `db`). Supported values:\n- \"gene\" or \"ncbigene\": NCBI Gene database ⚠️ FIELD TAGS CRITICAL\n- \"taxonomy\": NCBI Taxonomy (organism information)\n- \"clinvar\": ClinVar (genetic variants) ⚠️ FIELD TAGS CRITICAL\n- \"medgen\": MedGen (medical genetics concepts)\n- \"mesh\": MeSH (Medical Subject Headings)\n- \"pubmed\": PubMed (biomedical literature)\n- \"pccompound\": PubChem Compound\n- \"pcsubstance\": PubChem Substance\n- \"pcassay\": PubChem BioAssay"
      • addedInput schema / properties / db / description
        Added value: +"Alias for `database`."
      • addedInput schema / properties / max_results / description
        Added value: +"Maximum number of results to return (default: 20)"
      • addedInput schema / properties / query / description
        Added value: +"Search query with NCBI field tags and boolean operators (alias: `term`)"
      • addedInput schema / properties / search_field / description
        Added value: +"Optional specific field to search in"
      • addedInput schema / properties / sort_by / description
        Added value: +"Optional sort order (e.g., \"relevance\", \"pub_date\" for PubMed)"
      • addedInput schema / properties / start_index / description
        Added value: +"Starting index for pagination (default: 0)"
      • addedInput schema / properties / term / description
        Added value: +"Alias for `query`."
    • Changedncbi_esummary3 fields changed
      • addedInput schema / properties / database / description
        Added value: +"NCBI database name (alias: `db`)"
      • addedInput schema / properties / db / description
        Added value: +"Alias for `database`."
      • addedInput schema / properties / ids / description
        Added value: +"IDs to fetch summaries for. Accepts either a list of strings\n(e.g., [\"123\", \"456\"]) or a comma-separated string (\"123,456\")."
    • Changedrun_sparql7 fields changed
      • removedInput schema / properties / database / default
        Removed value: -""
      • changedInput schema / properties / database / description
        Previous value: -"Name of a single RDF database. Must be exactly one of: uniprot, rhea, pubchem, pdb, chembl, chebi, reactome, ensembl, amrportal, mesh, go, taxonomy, mondo, nando, bacdive, mediadive, clinvar, pubmed, pubtator, ncbigene, medgen, ddbj, glycosmos, supercon, bgee, oma, brenda, hgnc, jpostdb, massbank. Do NOT pass an endpoint group name here (e.g. 'ebi', 'sib') — those go in endpoint_name instead."New value: +"Name of a single RDF database. Must be exactly one of: uniprot, rhea, pubchem, pdb, chembl, chebi, reactome, ensembl, amrportal, mesh, go, taxonomy, mondo, nando, bacdive, mediadive, clinvar, pubmed, pubtator, ncbigene, medgen, ddbj, glycosmos, supercon, bgee, oma, brenda, hgnc, jpostdb, massbank, nbrc, mogplus, hco, mco, togovar, ontology. Do NOT pass an endpoint group name here (e.g. 'ebi', 'sib') — those go in endpoint_name instead."
      • removedInput schema / properties / db
        Removed value: -{
        -  "default": "",
        -  "type": "string"
        -}
      • removedInput schema / properties / dbname
        Removed value: -{
        -  "default": "",
        -  "type": "string"
        -}
      • changedInput schema / properties / endpoint_name / description
        Previous value: -"Endpoint name for cross-database queries. One of: sib, pubchem, pdb, ebi, primary, ncbi, ddbj, glycosmos, nims. Use this when querying multiple databases on the same endpoint."New value: +"Endpoint name for cross-database queries. One of: sib, pubchem, pdb, ebi, primary, ncbi, ddbj, glycosmos, nims, togovar. Use this when querying multiple databases on the same endpoint."
      • addedInput schema / properties / query / description
        Added value: +"Alias for `sparql_query`."
      • addedInput schema / required
        Added value: +[
        +  "database"
        +]
    • Changedsearch_chembl_id_lookup1 field changed
      • addedInput schema / properties / entity_type
        Added value: +{
        +  "default": "",
        +  "description": "Optional: COMPOUND, TARGET, CELL_LINE, TISSUE, or ASSAY. Omit to search the four name kinds together. ASSAY (keyword match on the assay description) is opt-in only.",
        +  "type": "string"
        +}
    • Changedsearch_chembl_molecule2 fields changed
      • addedInput schema / properties / limit / description
        Added value: +"Maximum number of results to return. Defaults to 20."
      • addedInput schema / properties / query / description
        Added value: +"Drug/compound name, brand, synonym, or a structure string.\nExamples: \"Aspirin\", \"Gleevec\", \"CC(=O)Oc1ccccc1C(=O)O\",\n\"BSYNRYMUTXBXSQ-UHFFFAOYSA-N\"."
    • Changedsearch_chembl_target4 fields changed
      • addedInput schema / properties / limit / description
        Added value: +"Max results. Defaults to 20."
      • addedInput schema / properties / organism
        Added value: +{
        +  "default": "",
        +  "description": "Case-insensitive substring filter on organism,\ne.g. \"Homo sapiens\". Applied inside the query.",
        +  "type": "string"
        +}
      • addedInput schema / properties / query / description
        Added value: +"UniProt accession (preferred), gene symbol, or exact protein\nname. Examples: \"P00533\", \"EGFR\", \"Thrombin\"."
      • addedInput schema / properties / target_type
        Added value: +{
        +  "default": "",
        +  "description": "Exact (case-insensitive) filter on target\ntype, e.g. \"SINGLE PROTEIN\" — collapses an accession/symbol match to the\ncanonical single protein and drops complexes/families.",
        +  "type": "string"
        +}
    • Changedsearch_mesh_descriptor2 fields changed
      • addedInput schema / properties / limit / description
        Added value: +"The maximum number of results to return. Default is 10."
      • addedInput schema / properties / query / description
        Added value: +"The query string to search for. Accepts aliases:\n`search`, `term`, `keyword`, `keywords`, `search_term`, `name`."
    • Changedsearch_pdb_entity4 fields changed
      • addedInput schema / properties / db / description
        Added value: +"The database to search in. Allowed values are:\n- \"pdb\" (Protein Data Bank, macromolecular structures)\n- \"cc\" (Chemical Component Dictionary, ligands / small molecules)\n- \"prd\" (BIRD, Biologically Interesting Reference Molecule\n  Dictionary, mostly peptides)."
      • addedInput schema / properties / limit / description
        Added value: +"Max results to return, in [0, 500]. Default 20."
      • addedInput schema / properties / offset / description
        Added value: +"Number of leading results to skip (server-side\npagination). Default 0."
      • addedInput schema / properties / query / description
        Added value: +"Free-text keywords. May be empty when at least one\nstructured filter is supplied. Accepts aliases: `search`, `term`,\n`keyword`, `keywords`, `search_term`, `name`. If both `query` and\nan alias are given with different values, this raises ValueError (pass only one)."
    • Changedsearch_reactome_entity13 fields changed
      • addedInput schema / properties / include_summation
        Added value: +{
        +  "default": false,
        +  "description": "When True, add a ≤240-char 'summation' description to\neach record. Default False keeps the payload small (a broad default\nsearch is ~hundreds of tokens instead of thousands).",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / limit
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Maximum number of records returned overall (default 25). A true\ntotal cap, not per-type."
        +}
      • addedInput schema / properties / query / description
        Added value: +"Search string, e.g. \"apoptosis\", \"TP53\", \"cell cycle\". Accepts\naliases: `search`, `term`, `keyword`, `keywords`, `search_term`,\n`name` (supplying two different values raises ValueError)."
      • addedInput schema / properties / rows / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / rows / default
        Previous value: -30New value: +null
      • addedInput schema / properties / rows / description
        Added value: +"DEPRECATED alias for `limit` (the old name meant per-type rows).\nPassing both `limit` and `rows` with different values raises."
      • removedInput schema / properties / rows / type
        Removed value: -"integer"
      • addedInput schema / properties / species / description
        Added value: +"Filter by species scientific name, case-insensitive\n(e.g. \"Homo sapiens\", \"homo sapiens\", \"Mus musculus\"). A single\nstring or a list. Unrecognized names raise ValueError (96 species\navailable; see reactome.org/ContentService/data/species/all)."
      • addedInput schema / properties / types / description
        Added value: +"Filter by entity type(s), case-insensitive; a string or list.\nValid values: Cell, Chemical Compound, Complex, DNA Sequence, Drug,\nGenes and Transcripts, OtherEntity, Pathway, Polymer, Protein,\nRNA Sequence, Reaction, Set. Unknown values raise ValueError."
      • addedOutput schema / additionalProperties
        Added value: +true
      • removedOutput schema / properties
        Removed value: -{
        -  "result": {
        -    "type": "string"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
    • Changedsearch_rhea_entity8 fields changed
      • addedInput schema / properties / columns
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    }
        +  ],
        +  "default": "rhea-id,equation",
        +  "description": "Which fields to return, as a comma-separated string or a list\nof column IDs (case-INSENSITIVE). Default \"rhea-id,equation\". Each\nrequested column becomes a key on every result row; hyphenated IDs\nare snake_cased in the output (e.g. `chebi-id` → `chebi_id`). The 13\nvalid column IDs and their output keys:\n  - chebi                   -> chebi        (';'-joined ChEBI names)\n  - chebi-id                -> chebi_id     (';'-joined ChEBI ids)\n  - ec                      -> ec           (';'-joined EC numbers)\n  - equation                -> equation     (textual reaction equation)\n  - go                      -> go           (GO id + label)\n  - pubmed                  -> pubmed       (';'-joined PubMed ids)\n  - reaction-xref(EcoCyc)   -> xref_ecocyc\n  - reaction-xref(KEGG)     -> xref_kegg\n  - reaction-xref(M-CSA)    -> xref_mcsa\n  - reaction-xref(MetaCyc)  -> xref_metacyc\n  - reaction-xref(Reactome) -> xref_reactome\n  - rhea-id                 -> rhea_id      (e.g. RHEA:10000)\n  - uniprot                 -> uniprot      (count of annotated UniProtKB entries)\nAn unknown column raises ValueError — the API would otherwise\nsilently drop it and return an unannounced narrower table."
        +}
      • changedInput schema / properties / limit / default
        Previous value: -100New value: +25
      • addedInput schema / properties / limit / description
        Added value: +"Maximum number of reactions returned (default 25). Must be\nbetween 0 and 500; a negative limit or one above 500 raises\nValueError. `has_more` in the result signals whether more matched."
      • addedInput schema / properties / query / description
        Added value: +"Search string, e.g. \"ATP\", \"glucose\", \"ec:1.1.1.1\",\n\"chebi:17234\", \"uniprot:*\". REQUIRED — a blank query raises\nValueError (it would otherwise dump an arbitrary slice of the whole\ndatabase). Accepts aliases: `search`, `term`, `keyword`, `keywords`,\n`search_term`, `name` (supplying two different values raises ValueError)."
      • addedOutput schema / additionalProperties
        Added value: +true
      • removedOutput schema / properties
        Removed value: -{
        -  "result": {
        -    "type": "string"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
    • Changedsearch_uniprot_entity2 fields changed
      • addedInput schema / properties / limit / description
        Added value: +"The maximum number of results to return. Default is 20."
      • addedInput schema / properties / query / description
        Added value: +"The Solr-style query string for the UniProtKB /search endpoint.\n\nQUERY SYNTAX:\n- Simple keyword: \"rubisco\"\n- Field-specific: \"field:value\"  (e.g., \"gene:BRCA1\", \"protein_name:rubisco\")\n- Boolean operators: AND, OR, NOT  (e.g., \"gene:TP53 AND organism_id:9606\")\n- Grouping with parentheses: \"((gene:CTNNB1) AND (taxonomy_id:9606))\"\n- Wildcards (* suffix): \"gene:PRO*\" matches any gene starting with PRO\n- Ranges: \"length:[1000 TO 2000]\" or open-ended \"length:[5000 TO *]\"\n\nKEY QUERY FIELDS:\nIdentity / Name:\n  accession          UniProt primary accession (e.g., \"accession:P04637\")\n  id                 UniProt entry name / mnemonic (e.g., \"id:P53_HUMAN\")\n  protein_name       Protein name, including synonyms (e.g., \"protein_name:rubisco\")\n  gene               Gene name with wildcard support (e.g., \"gene:BRCA*\")\n  gene_exact         Exact gene name match (e.g., \"gene_exact:TP53\")\n  ec                 Enzyme Commission number (e.g., \"ec:1.1.1.1\")\n\nTaxonomy:\n  organism_id        NCBI taxonomy ID (e.g., \"organism_id:9606\" for human,\n                     \"organism_id:10090\" for mouse)\n  organism_name      Organism scientific or common name\n  taxonomy_id        Taxon ID including all descendants\n  lineage            Taxonomic lineage keyword\n\nAnnotation status:\n  reviewed           true = Swiss-Prot (manually reviewed),\n                     false = TrEMBL (automatically annotated)\n                     ALWAYS add \"reviewed:true\" when seeking high-quality entries.\n\nSequence properties:\n  length             Sequence length as a range (e.g., \"length:[100 TO 500]\")\n  mass               Molecular mass in Daltons (range supported)\n  existence          Protein existence level: 1 (protein), 2 (transcript),\n                     3 (homology), 4 (predicted), 5 (uncertain)\n\nFunctional annotation:\n  keyword            UniProt keyword name (e.g., \"keyword:Kinase\")\n  keyword_id         UniProt keyword ID (e.g., \"keyword_id:KW-0418\")\n  function           Function free-text annotation\n  family             Protein family (e.g., \"family:globin\")\n  organelle          Subcellular organelle (e.g., \"organelle:chloroplast\")\n  cc_subcellular_location  Subcellular location comment\n\nCross-references:\n  database           Database cross-reference (e.g., \"database:PDB\")\n  xref               Cross-reference ID (e.g., \"xref:pdb-1A2B\")\n  chebi              ChEBI ID (e.g., \"chebi:15422\")\n  interactor         UniProt accession of interacting protein\n\nLiterature:\n  lit_author         Author surname (e.g., \"lit_author:Smith\")\n  lit_pubmed         PubMed ID\n  lit_doi            DOI\n\nEXAMPLES (structured queries):\n  # Reviewed human TP53 protein\n  \"gene_exact:TP53 AND organism_id:9606 AND reviewed:true\"\n\n  # All human kinases manually reviewed\n  \"keyword:Kinase AND organism_id:9606 AND reviewed:true\"\n\n  # EGFR in human or mouse\n  \"gene_exact:EGFR AND (organism_id:9606 OR organism_id:10090) AND reviewed:true\"\n\n  # Long chloroplast proteins (>= 5000 aa) in any organism\n  \"organelle:chloroplast AND length:[5000 TO *]\"\n\n  # Proteins with PDB structures involved in apoptosis\n  \"database:PDB AND keyword:Apoptosis AND organism_id:9606 AND reviewed:true\"\n\n  # Proteins encoded by gene names starting with \"PIK3\"\n  \"gene:PIK3* AND organism_id:9606 AND reviewed:true\""
    • Changedtogoid_convertId4 fields changed
      • addedInput schema / properties / ids / description
        Added value: +"Source IDs. Accepts either a list of strings\n(e.g., [\"672\", \"675\", \"7157\"]) or a comma-separated string\n(\"672,675,7157\").\nExamples: \"672,675,7157\" (NCBI Gene IDs), \"P38398,P04637\" (UniProt)"
      • addedInput schema / properties / limit / description
        Added value: +"Maximum number of results (default 10000)"
      • addedInput schema / properties / offset / description
        Added value: +"Pagination offset for large result sets"
      • addedInput schema / properties / route / description
        Added value: +"Comma-separated pair of dataset keys: 'source,target'. NOTE: this\nis a single joined string, NOT separate `source`/`target` args (as in\ncountId/getRelation) — because a route may be multi-hop (3+ datasets).\nExamples:\n    - 'ncbigene,uniprot' (Gene → Protein)\n    - 'uniprot,pdb' (Protein → 3D Structure)\n    - 'ncbigene,ensembl_gene' (NCBI Gene → Ensembl Gene)\n    - 'chembl_target,uniprot' (Drug Target → Protein)\n    - 'uniprot,chembl_target' (Protein → Drug Target)\n    - 'ncbigene,hgnc' (Gene → HGNC symbol)\nMulti-hop routes are also supported:\n    - 'ncbigene,uniprot,pdb' (Gene → Protein → Structure)"
    • Changedtogoid_countId3 fields changed
      • addedInput schema / properties / ids / description
        Added value: +"Source IDs to check. Accepts either a list of strings or a\ncomma-separated string (e.g., [\"672\", \"675\"] or \"672,675\")."
      • addedInput schema / properties / source / description
        Added value: +"Source database key (e.g., 'ncbigene', 'uniprot')"
      • addedInput schema / properties / target / description
        Added value: +"Target database key (e.g., 'uniprot', 'pdb')"
    • Changedtogoid_getDataset1 field changed
      • addedInput schema / properties / dataset / description
        Added value: +"Dataset key (e.g., 'uniprot', 'ncbigene', 'pdb', 'chembl_target',\n     'ensembl_gene', 'hgnc', 'pubchem_compound')"
    • Changedtogoid_getRelation2 fields changed
      • addedInput schema / properties / source / description
        Added value: +"Source database key (e.g., 'uniprot', 'ncbigene', 'chembl_target')"
      • addedInput schema / properties / target / description
        Added value: +"Target database key (e.g., 'pdb', 'ensembl_gene', 'hgnc')"
    • Addedtogovar_search_disease
    • Addedtogovar_search_gene
    • Addedtogovar_search_variant
  3. 9 tool updatesv0.1.1
    • Changedfind_databases2 fields changed
      • removedOutput schema / properties / result / items
        Removed value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}
      • changedOutput schema / properties / result / type
        Previous value: -"array"New value: +"string"
    • Changedget_MIE_file1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Name of a single RDF database. Must be exactly one of: uniprot, rhea, pubchem, pdb, chembl, chebi, reactome, ensembl, amrportal, mesh, go, taxonomy, mondo, nando, bacdive, mediadive, clinvar, pubmed, pubtator, ncbigene, medgen, ddbj, glycosmos, supercon, bgee, oma, brenda, hgnc, jpostdb. Do NOT pass an endpoint group name here (e.g. 'ebi', 'sib') — those go in endpoint_name instead."New value: +"Name of a single RDF database. Must be exactly one of: uniprot, rhea, pubchem, pdb, chembl, chebi, reactome, ensembl, amrportal, mesh, go, taxonomy, mondo, nando, bacdive, mediadive, clinvar, pubmed, pubtator, ncbigene, medgen, ddbj, glycosmos, supercon, bgee, oma, brenda, hgnc, jpostdb, massbank. Do NOT pass an endpoint group name here (e.g. 'ebi', 'sib') — those go in endpoint_name instead."
    • Changedlist_databases2 fields changed
      • removedOutput schema / properties / result / items
        Removed value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}
      • changedOutput schema / properties / result / type
        Previous value: -"array"New value: +"string"
    • Changedrun_sparql1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Name of a single RDF database. Must be exactly one of: uniprot, rhea, pubchem, pdb, chembl, chebi, reactome, ensembl, amrportal, mesh, go, taxonomy, mondo, nando, bacdive, mediadive, clinvar, pubmed, pubtator, ncbigene, medgen, ddbj, glycosmos, supercon, bgee, oma, brenda, hgnc, jpostdb. Do NOT pass an endpoint group name here (e.g. 'ebi', 'sib') — those go in endpoint_name instead."New value: +"Name of a single RDF database. Must be exactly one of: uniprot, rhea, pubchem, pdb, chembl, chebi, reactome, ensembl, amrportal, mesh, go, taxonomy, mondo, nando, bacdive, mediadive, clinvar, pubmed, pubtator, ncbigene, medgen, ddbj, glycosmos, supercon, bgee, oma, brenda, hgnc, jpostdb, massbank. Do NOT pass an endpoint group name here (e.g. 'ebi', 'sib') — those go in endpoint_name instead."
    • Changedsearch_pdb_entity8 fields changed
      • addedInput schema / properties / formula
        Added value: +{
        +  "default": "",
        +  "type": "string"
        +}
      • addedInput schema / properties / ligand
        Added value: +{
        +  "default": "",
        +  "type": "string"
        +}
      • addedInput schema / properties / method
        Added value: +{
        +  "default": "",
        +  "enum": [
        +    "",
        +    "xray",
        +    "nmr",
        +    "em",
        +    "neutron",
        +    "fiber",
        +    "electron-crystallography",
        +    "solid-state-nmr"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / res_max
        Added value: +{
        +  "anyOf": [
        +    {
        +      "minimum": 0,
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedInput schema / properties / res_min
        Added value: +{
        +  "anyOf": [
        +    {
        +      "minimum": 0,
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedInput schema / properties / smiles
        Added value: +{
        +  "default": "",
        +  "type": "string"
        +}
      • addedInput schema / properties / source
        Added value: +{
        +  "default": "",
        +  "type": "string"
        +}
    • Changedsearch_reactome_entity2 fields changed
      • removedOutput schema / properties / result / items
        Removed value: -{
        -  "additionalProperties": {
        -    "type": "string"
        -  },
        -  "type": "object"
        -}
      • changedOutput schema / properties / result / type
        Previous value: -"array"New value: +"string"
    • Changedsearch_rhea_entity2 fields changed
      • removedOutput schema / properties / result / items
        Removed value: -{
        -  "additionalProperties": {
        -    "type": "string"
        -  },
        -  "type": "object"
        -}
      • changedOutput schema / properties / result / type
        Previous value: -"array"New value: +"string"
    • Changedtogoid_convertId2 fields changed
      • removedOutput schema / properties / result / items
        Removed value: -{}
      • changedOutput schema / properties / result / type
        Previous value: -"array"New value: +"string"
    • Changedtogoid_getRelation2 fields changed
      • removedOutput schema / properties / result / items
        Removed value: -{}
      • changedOutput schema / properties / result / type
        Previous value: -"array"New value: +"string"
  4. 29 tool updatesv0.1.0
    • First observedfind_databases
    • First observedget_compound_attributes_from_pubchem
    • First observedget_graph_list
    • First observedget_MIE_file
    • First observedget_pubchem_compound_id
    • First observedget_sparql_endpoints
    • First observedlist_categories
    • First observedlist_databases
    • First observedncbi_efetch
    • First observedncbi_esearch
    • First observedncbi_esummary
    • First observedncbi_list_databases
    • First observedrun_sparql
    • First observedsearch_chembl_id_lookup
    • First observedsearch_chembl_molecule
    • First observedsearch_chembl_target
    • First observedsearch_mesh_descriptor
    • First observedsearch_pdb_entity
    • First observedsearch_reactome_entity
    • First observedsearch_rhea_entity
    • First observedsearch_uniprot_entity
    • First observedtogoid_convertId
    • First observedtogoid_countId
    • First observedtogoid_getAllDataset
    • First observedtogoid_getAllRelation
    • First observedtogoid_getDataset
    • First observedtogoid_getDescription
    • First observedtogoid_getRelation
    • First observedTogoMCP_Usage_Guide

TDQS

A4/5.0
Disambiguation4/5

Most tools target distinct resources: each search_<database> tool is scoped to one database (uniprot, pdb, mesh, reactome, rhea), and the NCBI and TogoVar tools form clear workflow chains. The main overlap is search_chembl_id_lookup, which intentionally duplicates search_chembl_molecule/target, though the descriptions carefully direct the agent to the entity-specific tools, mitigating misselection.

Naming Consistency3/5

Naming is internally consistent within each library group (togoid_* camelCase, ncbi_*/togovar_* snake_case, search_*_entity), but the set mixes several conventions: TogoMCP_Usage_Guide is a PascalCase outlier, and get_pubchem_compound_id vs get_compound_attributes_from_pubchem invert the object/database order. Predictable within groups, inconsistent across groups.

Tool Count3/5

29 tools is above the typical coherence sweet spot and borderline heavy for an agent to navigate. However, the scope is genuinely broad — a federation of dozens of RDF databases with SPARQL infrastructure, ID conversion, NCBI, and TogoVar workflows — so most tools earn their place, though the 5-functional togoid metadata/planning tools and 4 SPARQL infra tools could be trimmed.

Completeness4/5

For a mostly read-only query federation, the surface is well covered: generic run_sparql plus MIE files/graph listing handles arbitrary databases, search bridges exist for the most-used ones, the NCBI esearch/esummary/efetch chain is complete, and the TogoVar two-step gene/disease-to-variant workflow is explicit. The main gap is that some databases only have search without a paired fetch tool, but SPARQL covers those paths.

Maintenance

ActivityActive
ResponsivenessResponsive

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    An MCP server that provides direct access to PubMed and PubMed Central via the NCBI E-utilities API. It enables AI models to search biomedical literature, retrieve detailed article metadata, and download open-access full texts.
    5
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    A high-performance MCP server that gives LLMs access to 25 biomedical tools federated across 50+ upstream APIs for genes, variants, drugs, diseases, literature, clinical trials, and structural biology.
    41
    2,054
    2
    Apache 2.0

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/dbcls/togomcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server