hpo-link
The hpo-link server is a read-only MCP/REST API that grounds phenotype research in the Human Phenotype Ontology (HPO), enabling offline lookups across phenotype terms, gene/disease associations, and cross-ontology mappings via a local SQLite database.
Discovery & Diagnostics
get_server_capabilities— Explore available tools, workflows, response modes, error taxonomy, and limitsget_diagnostics— Check database status, loaded HPO release version, term counts, and runtime metrics
Phenotype Term Lookup
resolve_term— Resolve a label, synonym, HP id, or external CURIE to a canonical HPO term with match typesearch_terms— Full-text search over HPO term names, synonyms, and definitions with relevance ranking and paginationget_term— Retrieve full term details: definition, synonyms, alt IDs, subsets, cross-references, parents/children, and obsolescence info
Hierarchy Navigation
get_term_ancestors— All transitiveis_aancestors (broader terms) with paginationget_term_descendants— All transitiveis_adescendants (more specific terms) with paginationget_term_parents— Directis_aparents onlyget_term_children— Directis_achildren only
Cross-Ontology Mapping
resolve_xref— Map an external CURIE (UMLS, SNOMED, NCIT, MedDRA, ICD-10, MONDO, ORPHA, etc.) back to HPO term(s)map_cross_ontology— List all cross-references for an HPO term grouped by target ontology prefix
Gene ↔ Phenotype ↔ Disease Associations (HPOA)
get_phenotypes_for_gene— HPO terms annotated to a gene (by symbol or NCBI id)get_genes_for_phenotype— Genes annotated to an HPO phenotype term (optionally including descendants)get_phenotypes_for_disease— HPO terms annotated to a disease CURIE (OMIM, Orphanet)get_diseases_for_phenotype— Diseases annotated to an HPO phenotype term (optionally including descendants)get_genes_for_disease— Genes associated with a disease CURIEget_diseases_for_gene— Diseases associated with a gene
Key Features
All responses cite HPO id and release version for provenance
Every response includes
_meta.next_commandsfor ready-to-call follow-up queriesFour verbosity levels:
minimal,compact,standard,fullFully offline — no external API calls after the local database is built
Research use only; not for clinical decision support
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@hpo-linkfind phenotypes for gene BRCA1"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
hpo-link
An MCP server (Streamable HTTP or stdio) that grounds phenotype work in the
Human Phenotype Ontology (HPO): term lookup, the is_a
hierarchy, cross-ontology mapping, and gene↔phenotype↔disease associations, served
read-only from a local index of the HPO release and its HPOA annotations.
Research use only. Not clinical decision support. Do not use for diagnosis, treatment, triage, or patient management.
Why
HPO ships as bulk artifacts — an OBO/JSON ontology graph (hp.json) and a flat
annotation table (phenotype.hpoa). Neither answers a question. "Which genes are
annotated to seizure, including its subtypes?" needs the transitive is_a closure over
a multi-parent DAG, a synonym/xref index to get from free text to HP:0001250, and a
join against HPOA — plumbing every consumer otherwise rebuilds, badly.
hpo-link builds that once into a read-only SQLite index (closure table, FTS over
names/synonyms/definitions, xrefs ranked by mapping predicate) and serves it as MCP
tools. No upstream call sits in the request path, so lookups are offline and
deterministic, and every response cites the HPO id and the HPO release it came from.
Related MCP server: Unofficial HPO MCP Server
Quick start
Hosted — no install:
claude mcp add --transport http hpo-link https://hpo-link.genefoundry.org/mcpLocal (Python 3.12+, uv):
uv sync --group dev # install
make data # REQUIRED: download HPO + HPOA and build the local database
make data-status # loaded HPO release + counts
make dev # unified REST + MCP on http://127.0.0.1:8000 (/mcp, /health)There is no data until make data (uv run hpo-link-data build) has run once.
claude mcp add --transport http hpo-link --scope user http://127.0.0.1:8000/mcp
make mcp-serve # stdio instead, for Claude Desktop (stdout is the protocol)Three console scripts: hpo-link (unified server), hpo-link-mcp (stdio),
hpo-link-data (build / refresh / status for data authoring, and
materialize-data for the hardened deployment init sidecar).
Tools
Tool | Purpose |
| Discovery surface — tools, workflows, error taxonomy, limits |
| Database status, loaded HPO release, counts |
| Label, synonym, HP id or xref → one canonical term + |
| Full-text search over names, synonyms and definitions |
| The record — definition, synonyms, grouped xrefs, parents/children, obsolescence |
| Transitive |
| Transitive |
| Direct |
| Direct |
| External CURIE ( |
| An HP term → its mappings, grouped by target prefix |
| HPO terms annotated to a gene |
| Genes annotated to an HPO term |
| HPO terms annotated to a disease |
| Diseases annotated to an HPO term |
| Genes associated with a disease |
| Diseases associated with a gene |
Every response carries _meta.next_commands (ready-to-call follow-ups). Ids are
normalised to HP:NNNNNNN. response_mode ∈ minimal | compact | standard | full
(default compact) trades detail for tokens. Worked examples: docs/usage.md.
Leaf names are unprefixed per
Tool-Naming Standard v1
(serverInfo.name = hpo-link); behind
genefoundry-router the gateway applies
the canonical namespace token hpo, so they surface as hpo_<tool> — e.g.
hpo_resolve_term.
Data & provenance
Built from two upstream artifacts: the HPO ontology (hp.json, via the OBO PURL
http://purl.obolibrary.org/obo/hp.json) and the HPOA annotations
(phenotype.hpoa), which link HPO terms to OMIM / Orphanet / DECIPHER diseases and,
derived from those, to genes.
Local data authoring can refresh from upstream with conditional GET (ETag /
Last-Modified), but deployed servers do not. Production uses the immutable,
digest-pinned release declared in container-release.json: hpo-data-init
materializes it before the application starts, then the application reads the
selected snapshot only. Details: docs/data.md.
Data licence: HPO is distributed under a custom licence for research and educational use (https://hpo.jax.org/app/license) — attribution required.
Cite: Köhler S, Gargano M, Matentzoglu N, et al. The Human Phenotype Ontology in 2021. Nucleic Acids Research 2021;49(D1):D1207–D1217. doi:10.1093/nar/gkaa1043. For the most recent release cite instead: Gargano MA, Matentzoglu N, Coleman B, et al. The Human Phenotype Ontology in 2024: phenotypes around the world. Nucleic Acids Research 2024;52(D1):D1333–D1346. doi:10.1093/nar/gkad1005.
Documentation
Usage — per-tool examples, the citation contract, typical workflows.
Architecture — the two planes, ingest pipeline, SQLite schema, request lifecycle.
Data & provenance — sources, freshness, build integrity, prebuilt artifacts, licence.
Configuration — every
HPO_LINK_*variable and the Host/Origin/CORS allowlists.Deployment — Docker init sidecar, health and deploy verification.
AGENTS.md — engineering conventions, invariants, definition of done.
Contributing
See AGENTS.md for the invariants and conventions. make ci-local is the
definition-of-done gate: format, lint, line budget, README standard, mypy, and tests.
Write the failing test first.
License
MIT © Bernt Popp — code only. The HPO data is licensed separately for research and educational use with required attribution (https://hpo.jax.org/app/license); see Data & provenance.
Available Tools
17 toolsget_diagnosticsGet HPO DiagnosticsARead-onlyIdempotent
Report the local HPO index status: whether the data is built, the loaded HPO and HPOA release versions, term/obsolete/closure/xref/annotation counts, when it was built, and a runtime block (request/error counts and latency percentiles p50/p95/p99). Use this to confirm freshness or diagnose an upstream_unavailable error (an unbuilt/unavailable local index). Signature: get_diagnostics().
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint false. The description adds valuable behavioral context by detailing the exact output (release versions, counts, runtime block with latency percentiles) and the specific error condition it diagnoses.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the main purpose and provides a structured list of reported items. It is slightly long but each part adds value. It could be more concise, but it remains clear and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no parameters and no output schema, the description comprehensively explains what the tool does and what it returns. It covers the full scope of behavior without leaving gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are no parameters, and schema coverage is 100%. The description reinforces this with 'Signature: get_diagnostics()', making it clear the tool requires no input. Baseline for 0 parameters is 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool reports local HPO index status, enumerating specific data points (versions, counts, runtime stats). It distinguishes itself from sibling tools like get_term or search_terms by being a diagnostic/reporting tool rather than a data query tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly provides usage scenarios: 'confirm freshness or diagnose an upstream_unavailable error'. It also states that the tool takes no parameters, leaving no ambiguity about invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_diseases_for_geneGet Diseases for GeneBRead-onlyIdempotent
Return diseases associated with a gene (symbol or NCBI id). Signature: get_diseases_for_gene(gene, limit=, offset=, response_mode=).
| Name | Required | Description | Default |
|---|---|---|---|
| gene | Yes | A gene symbol (e.g. 'PAX6') or NCBI gene CURIE (e.g. 'NCBIGene:5080'). Bare NCBI numeric ids (e.g. '5080') are also accepted. | |
| limit | No | Max diseases to return (default 25). | |
| offset | No | Rows to skip for forward paging (default 0). | |
| response_mode | No | Verbosity: minimal|compact|standard|full (default compact). | compact |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, idempotentHint, destructiveHint, and openWorldHint, which fully cover safety and idempotence. The description adds the function signature but no additional behavioral context beyond what annotations and schema provide. It does not contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: two sentences. The first sentence immediately states the purpose, and the second provides the signature. No redundant or unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description should explain return values but only states that diseases are returned. It does not describe the structure, paging behavior (limit/offset), or the effect of response_mode. The open world hint from annotations suggests partial results, but this is not elaborated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with detailed descriptions for all four parameters (gene format, limit, offset, response_mode enum). The description only lists parameter names via the signature, adding no new meaning. Baseline 3 is appropriate given high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'Return diseases associated with a gene (symbol or NCBI id)' with a specific verb and resource. It clearly distinguishes from siblings like get_diseases_for_phenotype and get_genes_for_disease by specifying the input type (gene). The inclusion of the function signature adds clarity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not provide any guidance on when to use this tool versus alternatives (e.g., get_diseases_for_phenotype). It only states what the tool does without context for selection, leaving the agent to infer based on name and purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_diseases_for_phenotypeGet Diseases for HPO PhenotypeARead-onlyIdempotent
Return diseases annotated to an HPO phenotype term, optionally expanded to include descendants. Signature: get_diseases_for_phenotype(hpo_id, include_descendants=, limit=, offset=, response_mode=).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max diseases to return (default 25). | |
| hpo_id | Yes | Canonical HP id for the resolved HPO phenotype (HP:0000118). Legacy `term` arguments are accepted as an alias. | |
| offset | No | Rows to skip for forward paging (default 0). | |
| response_mode | No | Verbosity: minimal|compact|standard|full (default compact). | compact |
| include_descendants | No | When true, unions the term's transitive descendants so diseases annotated to any child term are included (default false). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint. The description adds behavioral context about optional descendant expansion and provides the function signature, offering value beyond annotations without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences plus a signature, with no wasted words. It is front-loaded with the core purpose and immediately useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only query tool with good annotations, the description covers the core functionality. However, no output schema exists and the description does not explain the return format or pagination behavior, which would be helpful for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameters are well-documented in the schema. The description only lists the signature without adding new semantic information beyond what is already in the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description explicitly states 'Return diseases annotated to an HPO phenotype term' with a specific verb and resource, and mentions optional descendant expansion. This clearly distinguishes it from sibling tools like get_diseases_for_gene or get_genes_for_phenotype.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context by focusing on HPO phenotypes, but does not explicitly state when to use versus alternatives or provide exclusions. Sibling tool names differentiate, but no direct guidance is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_genes_for_diseaseGet Genes for DiseaseARead-onlyIdempotent
Return genes associated with a disease CURIE (e.g. OMIM:106210, ORPHA:550). Signature: get_genes_for_disease(disease_id, limit=, offset=, response_mode=).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max genes to return (default 25). | |
| offset | No | Rows to skip for forward paging (default 0). | |
| disease_id | Yes | A disease CURIE, e.g. 'OMIM:106210' (MIM Morbid) or 'ORPHA:550' (Orphanet). The prefix is case-sensitive. | |
| response_mode | No | Verbosity: minimal|compact|standard|full (default compact). | compact |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint, idempotentHint, and non-destructive behavior. The description adds the function signature and input format but does not disclose additional behavioral traits beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact: two sentences covering purpose and signature. Every word adds value, with no unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
While annotations and schema cover many aspects, the description could mention pagination behavior (limit/offset) and response format. Given the 17 siblings, a brief usage hint would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline 3 is appropriate. The description provides the signature and an example disease_id, but adds no extra semantic meaning beyond what the schema already documents for each parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Return genes associated with a disease CURIE.' It provides concrete examples (e.g., OMIM:106210, ORPHA:550) and the exact function signature, distinguishing it from sibling tools like get_diseases_for_gene.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives. With 17 sibling tools, the description does not differentiate use cases or mention when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_genes_for_phenotypeGet Genes for HPO PhenotypeARead-onlyIdempotent
Return the genes annotated to an HPO phenotype term, optionally expanded to include descendants. Signature: get_genes_for_phenotype(hpo_id, include_descendants=, limit=, offset=, response_mode=).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max genes to return (default 25). | |
| hpo_id | Yes | Canonical HP id for the resolved HPO phenotype (HP:0000118). Legacy `term` arguments are accepted as an alias. | |
| offset | No | Rows to skip for forward paging (default 0). | |
| response_mode | No | Verbosity: minimal|compact|standard|full (default compact). | compact |
| include_descendants | No | When true, unions the term's transitive descendants so genes annotated to any child term are included (default false). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true. The description adds the signature and the optional descendant expansion behavior, which goes beyond annotations. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise: one purpose sentence and a signature line. The signature line is somewhat redundant but adds clarity. Front-loading is adequate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema is provided, so the description could explain the return format. It does not. Parameter coverage is complete, and annotations cover safety. The description is adequate but not fully comprehensive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description lists the signature but repeats parameter information already in the schema. It adds minimal semantic meaning beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Return the genes annotated to an HPO phenotype term, optionally expanded to include descendants.' It uses specific verbs and resources, and the purpose is distinct from sibling tools like get_diseases_for_phenotype.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by naming the function and parameters, but does not explicitly state when to use this tool versus alternatives or provide when-not-to-use conditions. It lacks guidance on choosing among sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_phenotypes_for_diseaseGet HPO Phenotypes for DiseaseARead-onlyIdempotent
Return the HPO phenotype terms annotated to a disease CURIE (e.g. OMIM:106210, ORPHA:550). Signature: get_phenotypes_for_disease(disease_id, limit=, offset=, response_mode=).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max phenotypes to return (default 25). | |
| offset | No | Rows to skip for forward paging (default 0). | |
| disease_id | Yes | A disease CURIE, e.g. 'OMIM:106210' (MIM Morbid) or 'ORPHA:550' (Orphanet). The prefix is case-sensitive. | |
| response_mode | No | Verbosity: minimal|compact|standard|full (default compact). | compact |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint false, covering safety and idempotency. The description adds the signature and a note on case-sensitive prefix, but goes beyond annotations only with the signature structure. No additional behavioral traits like pagination mechanisms or auth requirements are disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long, including the signature. No redundant information. Every piece (return type, example, signature) is necessary and efficiently presented.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 4 parameters, no output schema, and strong annotations, the description is mostly complete. It provides the signature and a critical example. It stops short of describing pagination behavior or response format, but the schema covers parameter details well. A small gap remains for full completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the description's signature lists parameter names but adds no new semantics beyond the schema. Baseline score of 3 is appropriate since the schema already clearly documents each parameter's type, defaults, constraints, and examples.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns HPO phenotype terms for a disease CURIE, provides an example (OMIM:106210, ORPHA:550), and includes the function signature. This specific verb+resource combination distinguishes it from sibling tools like get_diseases_for_phenotype.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for retrieving phenotypes given a disease ID, with a signature and example. However, it does not explicitly state when not to use it or mention alternatives. Siblings show a clear pattern of inverse operations, but no direct guidance is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_phenotypes_for_geneGet HPO Phenotypes for GeneARead-onlyIdempotent
Return the HPO phenotype terms annotated to a gene (symbol or NCBI id). Signature: get_phenotypes_for_gene(gene, limit=, offset=, response_mode=).
| Name | Required | Description | Default |
|---|---|---|---|
| gene | Yes | A gene symbol (e.g. 'PAX6') or NCBI gene CURIE (e.g. 'NCBIGene:5080'). Bare NCBI numeric ids (e.g. '5080') are also accepted. | |
| limit | No | Max phenotypes to return (default 25). | |
| offset | No | Rows to skip for forward paging (default 0). | |
| response_mode | No | Verbosity: minimal|compact|standard|full (default compact). | compact |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the description adds minimal behavioral context beyond the signature. No mention of pagination behavior or response mode differences.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with clear purpose and signature. No unnecessary words, efficiently front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but the description omits details on pagination behavior and response mode options. Adequate but gaps remain for a complete understanding.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the description only repeats the signature without adding new meaning to parameters beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Return' and the resource 'HPO phenotype terms annotated to a gene (symbol or NCBI id)', distinguishing it from siblings like get_phenotypes_for_disease.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The purpose is clear, but no explicit guidance is given on when to use this tool versus alternatives. The description implies usage but lacks exclusions or mentions of other tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_server_capabilitiesGet Server CapabilitiesARead-onlyIdempotent
Return the hpo-link discovery surface: identity/build/HPO release, the tool list WITH call signatures, response modes, recommended workflows, the xref prefixes, the error taxonomy, and limits. detail='full' adds the full policy notes. Call this first in a cold session, or read hpo://tools / hpo://capabilities. Signature: get_server_capabilities(detail=).
| Name | Required | Description | Default |
|---|---|---|---|
| detail | No | summary (default, light) or full (adds policy notes). | summary |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint. The description adds value by detailing what is returned (identity, tool list, response modes, etc.) and how detail parameter affects output.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is dense but efficient, front-loading purpose. Could be slightly more structured but every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description enumerates key return components (identity, tool list, response modes, etc.). For a simple one-parameter tool, it provides sufficient completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers 100% with description. The tool description adds context like 'detail='full' adds the full policy notes', which enriches understanding beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns the 'hpo-link discovery surface' including identity, tool list, response modes, etc. It explicitly distinguishes from sibling tools by positioning it as the first call for discovery.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to 'Call this first in a cold session' and provides alternatives like reading hpo://tools or hpo://capabilities. Also includes the function signature.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_termGet HPO TermARead-onlyIdempotent
Return an HPO phenotype term record: definition, synonyms (exact/related/broad/narrow), alt_ids, subsets, comments, cross-references, direct parents and children, and obsolescence (replaced_by). The term accepts an HP id, a label/synonym, or an external xref CURIE (resolved first). Pass fields=['synonyms', 'definition'] for a sparse projection. Note on synonyms shape: compact (default) returns synonyms as plain strings; standard/full return {text, scope} objects. Signature: get_term(hpo_id, response_mode=, fields=).
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | Sparse fieldset: return ONLY these top-level keys (for map_cross_ontology, dot into the grouped object, e.g. 'mappings.UMLS'). Identity anchors (hpo_id, name, hpo_version) are always included. An unrecognised field is rejected with invalid_input. Omit for the full payload. | |
| hpo_id | Yes | Canonical HP id for the resolved HPO term (HP:0000118). Legacy `term` arguments are accepted as an alias. | |
| response_mode | No | Verbosity: minimal|compact|standard|full (default compact). | compact |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, etc. The description adds behavioral details like identifier resolution order ('resolved first') and synonym shape variations (compact vs standard/full), which go beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is concise (3 sentences) with no wasted words. Information is front-loaded: first sentence states purpose, subsequent sentences add details on inputs and output shape.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description adequately explains return values (definition, synonyms with shape details, always-included anchors) and input flexibility (multiple identifier types and response modes). Covers all key aspects for correct usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but description adds significant meaning: explains hpo_id accepts multiple types, fields is for sparse projection, response_mode verbosity levels, and always-included anchors. This enriches the schema definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns an HPO phenotype term record with specific fields like definition, synonyms, alt_ids, etc. It distinguishes from sibling tools (e.g., get_term_ancestors returns only ancestors) by implying this returns the full term record.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains that the tool accepts various identifier types (HP id, label, synonym, xref) and provides parameter details, but does not explicitly contrast with alternatives like get_term_ancestors. Usage context is 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.
get_term_ancestorsGet HPO Term AncestorsARead-onlyIdempotent
Return all transitive is_a ancestors (broader phenotype terms) of an HPO term via the precomputed closure, with a pagination block {total, returned, limit, offset, truncated, next_offset}. When truncated, next_commands carries a forward-page step (offset) so you can walk a >limit closure without re-sending rows. Use get_term_parents for only the immediate parents. Signature: get_term_ancestors(hpo_id, limit=, offset=, response_mode=).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max rows returned (default 50). | |
| hpo_id | Yes | Canonical HP id for the resolved HPO term (HP:0000118). Legacy `term` arguments are accepted as an alias. | |
| offset | No | Rows to skip for forward paging (default 0). | |
| response_mode | No | Verbosity: minimal|compact|standard|full (default compact). | compact |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true, covering the safety profile. The description adds value by explaining the pagination block structure (total, returned, limit, offset, truncated, next_offset) and that it uses a precomputed closure. It does not mention potential performance costs, but the existing annotations reduce the burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences: first defines the main function and pagination block, second provides usage guidance and pagination handling, third gives a signature summary. It is front-loaded, every sentence adds value, and there is no redundant or verbose language.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description specifies that the return includes a pagination block with named fields and mentions next_commands for forward paging. It sufficiently explains the core behavior and pagination. The lack of detail on the actual ancestor format is a minor gap, but the description is still quite complete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all four parameters with descriptions, defaults, and examples. The description adds a signature line and notes the alias for legacy 'term' arguments, but these are minor additions. Baseline 3 is appropriate given high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it returns 'all transitive is_a ancestors (broader phenotype terms) of an HPO term', using a specific verb and resource. It distinguishes itself from the sibling tool 'get_term_parents' by specifying that this tool returns all ancestors while the sibling returns only immediate parents.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells when not to use this tool: 'Use get_term_parents for only the immediate parents.' It also provides guidance on pagination with next_commands for walking large closures, which helps the agent decide how to handle results.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_term_childrenGet HPO Term ChildrenARead-onlyIdempotent
Return the direct is_a children (immediate more-specific phenotype terms) of an HPO term. Use get_term_descendants for the full transitive set. Signature: get_term_children(hpo_id, response_mode=).
| Name | Required | Description | Default |
|---|---|---|---|
| hpo_id | Yes | Canonical HP id for the resolved HPO term (HP:0000118). Legacy `term` arguments are accepted as an alias. | |
| response_mode | No | Verbosity: minimal|compact|standard|full (default compact). | compact |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, idempotentHint, and destructiveHint=false. The description adds context about what 'children' means in HPO ontology (direct is_a, immediate more-specific terms). This exceeds the annotation coverage but does not contradict it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no fluff: first defines the operation, second provides usage guidance and a signature. Front-loads the key purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with comprehensive annotations and clear purpose, the description is adequate. It could optionally describe the return format (list of term IDs/objects), but the core functionality is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters. The description does not add new semantic detail beyond the schema and the signature line. Baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Return the direct is_a children' and distinguishes from 'get_term_descendants' for the full transitive set. The verb 'return' and resource 'direct is_a children' are specific and unique among siblings like 'get_term_ancestors' and 'get_term_parents'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use this tool (to get immediate children) and when to use an alternative ('Use get_term_descendants for the full transitive set'). No ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_term_descendantsGet HPO Term DescendantsARead-onlyIdempotent
Return all transitive is_a descendants (more specific phenotype terms) of an HPO term via the precomputed closure, with a pagination block {total, returned, limit, offset, truncated, next_offset}. When truncated, next_commands carries a forward-page step (offset) so you can walk a >limit closure without re-sending rows. Use get_term_children for only the immediate children. Signature: get_term_descendants(hpo_id, limit=, offset=, response_mode=).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max rows returned (default 50). | |
| hpo_id | Yes | Canonical HP id for the resolved HPO term (HP:0000118). Legacy `term` arguments are accepted as an alias. | |
| offset | No | Rows to skip for forward paging (default 0). | |
| response_mode | No | Verbosity: minimal|compact|standard|full (default compact). | compact |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare read-only, idempotent, non-destructive. Description adds pagination behavior (truncated, next_commands) and response format, providing useful context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences: first covers purpose and pagination, second gives usage hint and signature. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description fully covers return shape (pagination block with fields and next_commands for paging). Sufficient for an AI agent to use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with clear parameter descriptions. Description adds value by explaining the pagination block structure and listing the signature, though not extensively enriching parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it returns all transitive is_a descendants of an HPO term, distinguishing from get_term_children for immediate children.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly directs to use get_term_children for immediate children. Provides context on pagination for large closures but doesn't contrast with other siblings like get_term_ancestors.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_term_parentsGet HPO Term ParentsARead-onlyIdempotent
Return the direct is_a parents (immediate broader phenotype terms) of an HPO term. Use get_term_ancestors for the full transitive set. Signature: get_term_parents(hpo_id, response_mode=).
| Name | Required | Description | Default |
|---|---|---|---|
| hpo_id | Yes | Canonical HP id for the resolved HPO term (HP:0000118). Legacy `term` arguments are accepted as an alias. | |
| response_mode | No | Verbosity: minimal|compact|standard|full (default compact). | compact |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the tool is clearly safe and non-destructive. The description adds that it returns direct parents and provides a signature, but does not further elaborate on behavior beyond what annotations cover.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description consists of two concise sentences plus a signature line, with no wasted words. The most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity, good annotations, and complete schema, the description is adequate. The missing output schema is not a major issue as the tool is read-only and likely returns a simple list. However, a brief note on return format would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value by showing the signature with parameter names and default for response_mode in a concise way, and by noting that legacy 'term' arguments are accepted as an alias for hpo_id.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Return' and the resource 'direct is_a parents (immediate broader phenotype terms)' of an HPO term. It distinguishes from the sibling tool get_term_ancestors by specifying that this tool returns only immediate parents, not the full transitive set.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly contrasts this tool with get_term_ancestors, guiding when to use which. It also includes a signature line showing parameter names. However, it does not provide explicit when-not-to-use scenarios or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
map_cross_ontologyMap HPO Cross-OntologyARead-onlyIdempotent
List an HPO term's cross-references to other ontologies/vocabularies, grouped by target prefix (UMLS/SNOMEDCT_US/NCIT/MEDDRA/ICD-10/ICD-9/MONDO/DOID/ORPHA/EFO/MSH/MESH). Optionally restrict to a subset of prefixes. Signature: map_cross_ontology(hpo_id, prefixes=, response_mode=, fields=).
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | Sparse fieldset: return ONLY these top-level keys (for map_cross_ontology, dot into the grouped object, e.g. 'mappings.UMLS'). Identity anchors (hpo_id, name, hpo_version) are always included. An unrecognised field is rejected with invalid_input. Omit for the full payload. | |
| hpo_id | Yes | Canonical HP id for the resolved HPO term (HP:0000118). Legacy `term` arguments are accepted as an alias. | |
| prefixes | No | Restrict to these target prefixes, e.g. ['UMLS','SNOMEDCT_US']. | |
| response_mode | No | Verbosity: minimal|compact|standard|full (default compact). | compact |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the description focuses on grouping behavior by prefix and optional restrictions. This adds valuable context beyond the annotations without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences: the first states the core functionality, the second provides a function signature. It is front-loaded and concise, though the signature may be redundant given the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description explains the output is 'grouped by target prefix' but lacks detail on return structure (e.g., keys). Given the tool's simplicity and annotations, it is adequate but not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the description adds minimal new meaning. It repeats parameter names in the signature and mentions prefix grouping, but the schema already contains detailed descriptions for each parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'List' and the resource 'an HPO term's cross-references to other ontologies/vocabularies, grouped by target prefix'. It enumerates specific prefixes (UMLS, SNOMEDCT_US, etc.) and notes optional filtering, which distinguishes it from siblings like get_term (returns term details) or resolve_xref.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description indicates the tool's purpose and mentions optional prefix restriction. It does not explicitly state when not to use it or compare to alternatives, but the context of siblings and the tool's specific functionality (cross-references) makes its use case clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_termResolve HPO TermARead-onlyIdempotent
Resolve a phenotype label, synonym, HP id (HP:0000118), or external cross-reference CURIE (UMLS:C0000737, SNOMEDCT_US:263681008, ...) to the canonical HPO term {hpo_id, name, match_type}. An ambiguous label returns ambiguous_query with candidates (each {hpo_id, name}); an obsolete HP id resolves with success:true, obsolete:true, and its successor in replaced_by. This is the recommended first step — resolve any query to a canonical HP id before calling get_term. Signature: resolve_term(query, response_mode=).
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | A phenotype label, synonym, HP id (HP:0000118), or external xref CURIE (UMLS:C0036572, SNOMEDCT_US:263681008, ...). | |
| response_mode | No | Verbosity: minimal|compact|standard|full (default compact). | compact |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses behavioral traits beyond annotations: handling of ambiguous labels (returns candidates), obsolete HP IDs (success with obsolete flag and replaced_by), and response_mode verbosity. No contradictions 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences plus a signature line, compact and front-loaded with the core purpose. Every sentence adds value, with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and two parameters, the description covers input types, edge cases (ambiguous, obsolete), and usage recommendation. It lacks detailed explanation of response_mode output structure but is sufficient for most use cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds meaningful context for both parameters: query input types (label, synonym, ID, CURIE) and response_mode enum with default. It also explains the signature.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool resolves phenotype labels, synonyms, HP IDs, or external cross-references to canonical HPO terms. It uses a specific verb and resource, and distinguishes itself from sibling tools like get_term and resolve_xref.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly recommends this as the first step before calling get_term, providing clear usage guidance. However, it does not explicitly mention when not to use this tool or list alternatives for other scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_xrefResolve HPO Cross-ReferenceARead-onlyIdempotent
Resolve an external cross-reference CURIE (UMLS/SNOMEDCT_US/NCIT/MEDDRA/ICD-10/ICD-9/MONDO/DOID/ORPHA) back to the HPO term(s) that cross-reference it. Returns matches[] plus a pagination block {total, returned, limit, offset, truncated, next_offset}; when truncated, next_commands carries a forward-page step (offset). Signature: resolve_xref(xref_id, limit=, offset=, response_mode=).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max matches (default 25). | |
| offset | No | Rows to skip for forward paging (default 0). | |
| xref_id | Yes | An external cross-reference CURIE (prefix:local), e.g. UMLS/SNOMED/NCIT/MEDDRA, to resolve back to the HPO term(s) that cross-reference it. | |
| response_mode | No | Verbosity: minimal|compact|standard|full (default compact). | compact |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnly, idempotent, non-destructive; description adds pagination behavior with next_commands and truncated flag, going beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences: purpose, return structure, signature. Front-loaded and no verbosity, though could be slightly more compact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Description explains return format (matches, pagination, next_commands) but does not specify the structure of each match (e.g., HPO term object). No output schema, so more detail would help.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline 3; description adds little beyond listing the signature and mentioning pagination, but no extra semantic detail for parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool resolves an external CURIE to HPO terms, listing allowed prefixes. It distinguishes from siblings like resolve_term (HPO ID to term) and map_cross_ontology (other mappings).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The context is clear (use when you have an external CURIE and need HPO terms), but no explicit when-not or alternatives are mentioned among the 17 siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_termsSearch HPO TermsARead-onlyIdempotent
Full-text search over HPO phenotype term names, synonyms, and definitions (FTS, relevance-ranked). Returns {hpo_id, name, score} -- compact adds a short definition_snippet; standard/full add the complete definition -- plus a pagination block {total, returned, limit, offset, truncated, next_offset}. When truncated, next_commands carries a forward-page step (offset advanced) and a widen step. Obsolete terms are excluded unless include_obsolete=true. Signature: search_terms(query, limit=, offset=, include_obsolete=, response_mode=).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max hits (default 25). | |
| query | Yes | A phenotype label, synonym, HP id (HP:0000118), or external xref CURIE (UMLS:C0036572, SNOMEDCT_US:263681008, ...). | |
| offset | No | Rows to skip for forward paging (default 0). | |
| response_mode | No | Verbosity: minimal|compact|standard|full (default compact). | compact |
| include_obsolete | No | Include obsolete terms (default false). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
While annotations already declare read-only and idempotent behavior, the description adds significant context: full-text search ranking, pagination with next_commands, exclusion of obsolete terms by default, and four response modes. This goes well 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single paragraph but packs essential information efficiently. It is front-loaded with the main purpose and provides necessary details about parameters and return format. Slightly more structure (e.g., bullet points) could improve readability, but it remains concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given five parameters and no output schema, the description covers all critical aspects: how to use each parameter, expected return shape (hits with id/name/score, pagination block), and behavior regarding obsolete terms. It is fully complete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds substantial meaning: explains query can be a label, HP ID, or CURIE; defines response_mode verbosity levels (minimal to full); clarifies pagination fields like total, truncated, next_offset. This greatly enhances understanding beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Full-text search over HPO phenotype term names, synonyms, and definitions (FTS, relevance-ranked)', which is a specific verb and resource. It distinguishes itself from sibling tools like 'get_term' or 'get_term_ancestors' by being a search tool rather than a direct lookup.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use the tool (for full-text search) and includes details like excluding obsolete terms unless overridden. It does not explicitly state when not to use it or mention alternatives, but the sibling context makes the purpose clear.
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.
17 tool updates
v0.4.0- Changed
get_diagnostics1 field changed- changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "properties": { - "_meta": { - "additionalProperties": true, - "type": "object" - }, - "allowed_values": { - "type": "array" - }, - "build_utc": { - "type": [ - "string", - "null" - ] - }, - "candidates": { - "type": "array" - }, - "counts": { - "additionalProperties": true, - "type": "object" - }, - "error_code": { - "type": "string" - }, - "field": { - "type": "string" - }, - "freshness": { - "additionalProperties": true, - "type": "object" - }, - "hint": { - "type": "string" - }, - "hpo_version": { - "type": [ - "string", - "null" - ] - }, - "hpoa_version": { - "type": [ - "string", - "null" - ] - }, - "index_status": { - "type": "string" - }, - "latency_slo": { - "additionalProperties": true, - "type": "object" - }, - "message": { - "type": "string" - }, - "recovery_action": { - "type": "string" - }, - "retryable": { - "type": "boolean" - }, - "runtime_metrics": { - "additionalProperties": true, - "type": "object" - }, - "server": { - "type": "string" - }, - "success": { - "type": "boolean" - } - }, - "type": "object" -}New value: +null
- Changed
get_diseases_for_gene1 field changed- changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "properties": { - "_meta": { - "additionalProperties": true, - "type": "object" - }, - "allowed_values": { - "type": "array" - }, - "candidates": { - "type": "array" - }, - "error_code": { - "type": "string" - }, - "field": { - "type": "string" - }, - "hint": { - "type": "string" - }, - "hpo_version": { - "type": [ - "string", - "null" - ] - }, - "limit": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "next_offset": { - "type": "integer" - }, - "offset": { - "type": "integer" - }, - "recommended_citation": { - "type": [ - "string", - "null" - ] - }, - "recovery_action": { - "type": "string" - }, - "retryable": { - "type": "boolean" - }, - "returned": { - "type": "integer" - }, - "success": { - "type": "boolean" - }, - "total": { - "type": "integer" - }, - "truncated": { - "type": "boolean" - } - }, - "type": "object" -}New value: +null
- Changed
get_diseases_for_phenotype1 field changed- changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "properties": { - "_meta": { - "additionalProperties": true, - "type": "object" - }, - "allowed_values": { - "type": "array" - }, - "candidates": { - "type": "array" - }, - "error_code": { - "type": "string" - }, - "field": { - "type": "string" - }, - "hint": { - "type": "string" - }, - "hpo_version": { - "type": [ - "string", - "null" - ] - }, - "limit": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "next_offset": { - "type": "integer" - }, - "offset": { - "type": "integer" - }, - "recommended_citation": { - "type": [ - "string", - "null" - ] - }, - "recovery_action": { - "type": "string" - }, - "retryable": { - "type": "boolean" - }, - "returned": { - "type": "integer" - }, - "success": { - "type": "boolean" - }, - "total": { - "type": "integer" - }, - "truncated": { - "type": "boolean" - } - }, - "type": "object" -}New value: +null
- Changed
get_genes_for_disease1 field changed- changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "properties": { - "_meta": { - "additionalProperties": true, - "type": "object" - }, - "allowed_values": { - "type": "array" - }, - "candidates": { - "type": "array" - }, - "error_code": { - "type": "string" - }, - "field": { - "type": "string" - }, - "hint": { - "type": "string" - }, - "hpo_version": { - "type": [ - "string", - "null" - ] - }, - "limit": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "next_offset": { - "type": "integer" - }, - "offset": { - "type": "integer" - }, - "recommended_citation": { - "type": [ - "string", - "null" - ] - }, - "recovery_action": { - "type": "string" - }, - "retryable": { - "type": "boolean" - }, - "returned": { - "type": "integer" - }, - "success": { - "type": "boolean" - }, - "total": { - "type": "integer" - }, - "truncated": { - "type": "boolean" - } - }, - "type": "object" -}New value: +null
- Changed
get_genes_for_phenotype1 field changed- changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "properties": { - "_meta": { - "additionalProperties": true, - "type": "object" - }, - "allowed_values": { - "type": "array" - }, - "candidates": { - "type": "array" - }, - "error_code": { - "type": "string" - }, - "field": { - "type": "string" - }, - "hint": { - "type": "string" - }, - "hpo_version": { - "type": [ - "string", - "null" - ] - }, - "limit": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "next_offset": { - "type": "integer" - }, - "offset": { - "type": "integer" - }, - "recommended_citation": { - "type": [ - "string", - "null" - ] - }, - "recovery_action": { - "type": "string" - }, - "retryable": { - "type": "boolean" - }, - "returned": { - "type": "integer" - }, - "success": { - "type": "boolean" - }, - "total": { - "type": "integer" - }, - "truncated": { - "type": "boolean" - } - }, - "type": "object" -}New value: +null
- Changed
get_phenotypes_for_disease1 field changed- changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "properties": { - "_meta": { - "additionalProperties": true, - "type": "object" - }, - "allowed_values": { - "type": "array" - }, - "candidates": { - "type": "array" - }, - "error_code": { - "type": "string" - }, - "field": { - "type": "string" - }, - "hint": { - "type": "string" - }, - "hpo_version": { - "type": [ - "string", - "null" - ] - }, - "limit": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "next_offset": { - "type": "integer" - }, - "offset": { - "type": "integer" - }, - "recommended_citation": { - "type": [ - "string", - "null" - ] - }, - "recovery_action": { - "type": "string" - }, - "retryable": { - "type": "boolean" - }, - "returned": { - "type": "integer" - }, - "success": { - "type": "boolean" - }, - "total": { - "type": "integer" - }, - "truncated": { - "type": "boolean" - } - }, - "type": "object" -}New value: +null
- Changed
get_phenotypes_for_gene1 field changed- changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "properties": { - "_meta": { - "additionalProperties": true, - "type": "object" - }, - "allowed_values": { - "type": "array" - }, - "candidates": { - "type": "array" - }, - "error_code": { - "type": "string" - }, - "field": { - "type": "string" - }, - "hint": { - "type": "string" - }, - "hpo_version": { - "type": [ - "string", - "null" - ] - }, - "limit": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "next_offset": { - "type": "integer" - }, - "offset": { - "type": "integer" - }, - "recommended_citation": { - "type": [ - "string", - "null" - ] - }, - "recovery_action": { - "type": "string" - }, - "retryable": { - "type": "boolean" - }, - "returned": { - "type": "integer" - }, - "success": { - "type": "boolean" - }, - "total": { - "type": "integer" - }, - "truncated": { - "type": "boolean" - } - }, - "type": "object" -}New value: +null
- Changed
get_server_capabilities1 field changed- changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "properties": { - "_meta": { - "additionalProperties": true, - "type": "object" - }, - "allowed_values": { - "type": "array" - }, - "candidates": { - "type": "array" - }, - "capabilities_version": { - "type": "string" - }, - "error_code": { - "type": "string" - }, - "error_codes": { - "type": "array" - }, - "field": { - "type": "string" - }, - "hint": { - "type": "string" - }, - "hpo_version": { - "type": [ - "string", - "null" - ] - }, - "message": { - "type": "string" - }, - "recovery_action": { - "type": "string" - }, - "response_modes": { - "type": "array" - }, - "retryable": { - "type": "boolean" - }, - "server": { - "type": "string" - }, - "server_version": { - "type": "string" - }, - "success": { - "type": "boolean" - }, - "tools": { - "type": "array" - } - }, - "type": "object" -}New value: +null
- Changed
get_term2 fields changed- changed
Input schema / properties / fields / descriptionPrevious value: -"Sparse fieldset: return ONLY these top-level keys (dot into a grouped object, e.g. 'xrefs.UMLS'). Identity anchors (hpo_id, name, hpo_version) are always included. Omit for the full payload."New value: +"Sparse fieldset: return ONLY these top-level keys (for map_cross_ontology, dot into the grouped object, e.g. 'mappings.UMLS'). Identity anchors (hpo_id, name, hpo_version) are always included. An unrecognised field is rejected with invalid_input. Omit for the full payload." - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "properties": { - "_meta": { - "additionalProperties": true, - "type": "object" - }, - "allowed_values": { - "type": "array" - }, - "alt_ids": { - "type": "array" - }, - "candidates": { - "type": "array" - }, - "children": { - "type": "array" - }, - "comments": { - "items": { - "additionalProperties": false, - "properties": { - "kind": { - "const": "untrusted_text" - }, - "provenance": { - "additionalProperties": false, - "properties": { - "record_id": { - "type": "string" - }, - "retrieved_at": { - "type": "string" - }, - "source": { - "type": "string" - } - }, - "type": "object" - }, - "raw_sha256": { - "type": "string" - }, - "text": { - "type": "string" - } - }, - "type": "object" - }, - "type": "array" - }, - "definition": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "kind": { - "const": "untrusted_text" - }, - "provenance": { - "additionalProperties": false, - "properties": { - "record_id": { - "type": "string" - }, - "retrieved_at": { - "type": "string" - }, - "source": { - "type": "string" - } - }, - "type": "object" - }, - "raw_sha256": { - "type": "string" - }, - "text": { - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "error_code": { - "type": "string" - }, - "field": { - "type": "string" - }, - "hint": { - "type": "string" - }, - "hpo_id": { - "type": "string" - }, - "hpo_version": { - "type": [ - "string", - "null" - ] - }, - "message": { - "type": "string" - }, - "name": { - "type": "string" - }, - "obsolete": { - "type": "boolean" - }, - "parents": { - "type": "array" - }, - "recommended_citation": { - "type": [ - "string", - "null" - ] - }, - "recovery_action": { - "type": "string" - }, - "retryable": { - "type": "boolean" - }, - "subsets": { - "type": "array" - }, - "success": { - "type": "boolean" - }, - "synonyms": { - "items": { - "oneOf": [ - { - "type": "string" - }, - { - "additionalProperties": true, - "properties": { - "scope": { - "type": "string" - }, - "text": { - "type": "string" - } - }, - "type": "object" - } - ] - }, - "type": "array" - } - }, - "type": "object" -}New value: +null
- Changed
get_term_ancestors1 field changed- changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "properties": { - "_meta": { - "additionalProperties": true, - "type": "object" - }, - "allowed_values": { - "type": "array" - }, - "ancestors": { - "type": "array" - }, - "candidates": { - "type": "array" - }, - "error_code": { - "type": "string" - }, - "field": { - "type": "string" - }, - "hint": { - "type": "string" - }, - "hpo_id": { - "type": "string" - }, - "hpo_version": { - "type": [ - "string", - "null" - ] - }, - "limit": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "name": { - "type": [ - "string", - "null" - ] - }, - "next_offset": { - "type": "integer" - }, - "offset": { - "type": "integer" - }, - "recovery_action": { - "type": "string" - }, - "retryable": { - "type": "boolean" - }, - "returned": { - "type": "integer" - }, - "success": { - "type": "boolean" - }, - "total": { - "type": "integer" - }, - "truncated": { - "type": "boolean" - } - }, - "type": "object" -}New value: +null
- Changed
get_term_children1 field changed- changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "properties": { - "_meta": { - "additionalProperties": true, - "type": "object" - }, - "allowed_values": { - "type": "array" - }, - "candidates": { - "type": "array" - }, - "children": { - "type": "array" - }, - "count": { - "type": "integer" - }, - "error_code": { - "type": "string" - }, - "field": { - "type": "string" - }, - "hint": { - "type": "string" - }, - "hpo_id": { - "type": "string" - }, - "hpo_version": { - "type": [ - "string", - "null" - ] - }, - "message": { - "type": "string" - }, - "name": { - "type": [ - "string", - "null" - ] - }, - "recovery_action": { - "type": "string" - }, - "retryable": { - "type": "boolean" - }, - "success": { - "type": "boolean" - } - }, - "type": "object" -}New value: +null
- Changed
get_term_descendants1 field changed- changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "properties": { - "_meta": { - "additionalProperties": true, - "type": "object" - }, - "allowed_values": { - "type": "array" - }, - "candidates": { - "type": "array" - }, - "descendants": { - "type": "array" - }, - "error_code": { - "type": "string" - }, - "field": { - "type": "string" - }, - "hint": { - "type": "string" - }, - "hpo_id": { - "type": "string" - }, - "hpo_version": { - "type": [ - "string", - "null" - ] - }, - "limit": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "name": { - "type": [ - "string", - "null" - ] - }, - "next_offset": { - "type": "integer" - }, - "offset": { - "type": "integer" - }, - "recovery_action": { - "type": "string" - }, - "retryable": { - "type": "boolean" - }, - "returned": { - "type": "integer" - }, - "success": { - "type": "boolean" - }, - "total": { - "type": "integer" - }, - "truncated": { - "type": "boolean" - } - }, - "type": "object" -}New value: +null
- Changed
get_term_parents1 field changed- changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "properties": { - "_meta": { - "additionalProperties": true, - "type": "object" - }, - "allowed_values": { - "type": "array" - }, - "candidates": { - "type": "array" - }, - "count": { - "type": "integer" - }, - "error_code": { - "type": "string" - }, - "field": { - "type": "string" - }, - "hint": { - "type": "string" - }, - "hpo_id": { - "type": "string" - }, - "hpo_version": { - "type": [ - "string", - "null" - ] - }, - "message": { - "type": "string" - }, - "name": { - "type": [ - "string", - "null" - ] - }, - "parents": { - "type": "array" - }, - "recovery_action": { - "type": "string" - }, - "retryable": { - "type": "boolean" - }, - "success": { - "type": "boolean" - } - }, - "type": "object" -}New value: +null
- Changed
map_cross_ontology2 fields changed- changed
Input schema / properties / fields / descriptionPrevious value: -"Sparse fieldset: return ONLY these top-level keys (dot into a grouped object, e.g. 'xrefs.UMLS'). Identity anchors (hpo_id, name, hpo_version) are always included. Omit for the full payload."New value: +"Sparse fieldset: return ONLY these top-level keys (for map_cross_ontology, dot into the grouped object, e.g. 'mappings.UMLS'). Identity anchors (hpo_id, name, hpo_version) are always included. An unrecognised field is rejected with invalid_input. Omit for the full payload." - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "properties": { - "_meta": { - "additionalProperties": true, - "type": "object" - }, - "allowed_values": { - "type": "array" - }, - "candidates": { - "type": "array" - }, - "error_code": { - "type": "string" - }, - "field": { - "type": "string" - }, - "hint": { - "type": "string" - }, - "hpo_id": { - "type": "string" - }, - "hpo_version": { - "type": [ - "string", - "null" - ] - }, - "mappings": { - "additionalProperties": true, - "type": "object" - }, - "message": { - "type": "string" - }, - "name": { - "type": [ - "string", - "null" - ] - }, - "recovery_action": { - "type": "string" - }, - "retryable": { - "type": "boolean" - }, - "success": { - "type": "boolean" - } - }, - "type": "object" -}New value: +null
- Changed
resolve_term1 field changed- changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "properties": { - "_meta": { - "additionalProperties": true, - "type": "object" - }, - "allowed_values": { - "type": "array" - }, - "candidates": { - "type": "array" - }, - "error_code": { - "type": "string" - }, - "field": { - "type": "string" - }, - "hint": { - "type": "string" - }, - "hpo_id": { - "type": [ - "string", - "null" - ] - }, - "hpo_version": { - "type": [ - "string", - "null" - ] - }, - "match_confidence": { - "type": [ - "number", - "null" - ] - }, - "match_type": { - "type": [ - "string", - "null" - ] - }, - "message": { - "type": "string" - }, - "name": { - "type": [ - "string", - "null" - ] - }, - "obsolete": { - "type": "boolean" - }, - "query": { - "type": "string" - }, - "recommended_citation": { - "type": [ - "string", - "null" - ] - }, - "recovery_action": { - "type": "string" - }, - "retryable": { - "type": "boolean" - }, - "success": { - "type": "boolean" - } - }, - "type": "object" -}New value: +null
- Changed
resolve_xref1 field changed- changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "properties": { - "_meta": { - "additionalProperties": true, - "type": "object" - }, - "allowed_values": { - "type": "array" - }, - "candidates": { - "type": "array" - }, - "error_code": { - "type": "string" - }, - "field": { - "type": "string" - }, - "hint": { - "type": "string" - }, - "hpo_version": { - "type": [ - "string", - "null" - ] - }, - "limit": { - "type": "integer" - }, - "matches": { - "type": "array" - }, - "message": { - "type": "string" - }, - "next_offset": { - "type": "integer" - }, - "offset": { - "type": "integer" - }, - "recovery_action": { - "type": "string" - }, - "retryable": { - "type": "boolean" - }, - "returned": { - "type": "integer" - }, - "success": { - "type": "boolean" - }, - "total": { - "type": "integer" - }, - "truncated": { - "type": "boolean" - }, - "xref_id": { - "type": "string" - } - }, - "type": "object" -}New value: +null
- Changed
search_terms1 field changed- changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "properties": { - "_meta": { - "additionalProperties": true, - "type": "object" - }, - "allowed_values": { - "type": "array" - }, - "candidates": { - "type": "array" - }, - "error_code": { - "type": "string" - }, - "field": { - "type": "string" - }, - "hint": { - "type": "string" - }, - "hpo_version": { - "type": [ - "string", - "null" - ] - }, - "include_obsolete": { - "type": "boolean" - }, - "limit": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "next_offset": { - "type": "integer" - }, - "offset": { - "type": "integer" - }, - "query": { - "type": "string" - }, - "recovery_action": { - "type": "string" - }, - "results": { - "items": { - "additionalProperties": true, - "properties": { - "definition": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "kind": { - "const": "untrusted_text" - }, - "provenance": { - "additionalProperties": false, - "properties": { - "record_id": { - "type": "string" - }, - "retrieved_at": { - "type": "string" - }, - "source": { - "type": "string" - } - }, - "type": "object" - }, - "raw_sha256": { - "type": "string" - }, - "text": { - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "definition_snippet": { - "additionalProperties": false, - "properties": { - "kind": { - "const": "untrusted_text" - }, - "provenance": { - "additionalProperties": false, - "properties": { - "record_id": { - "type": "string" - }, - "retrieved_at": { - "type": "string" - }, - "source": { - "type": "string" - } - }, - "type": "object" - }, - "raw_sha256": { - "type": "string" - }, - "text": { - "type": "string" - } - }, - "type": "object" - }, - "hpo_id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "score": { - "type": "number" - } - }, - "type": "object" - }, - "type": "array" - }, - "retryable": { - "type": "boolean" - }, - "returned": { - "type": "integer" - }, - "success": { - "type": "boolean" - }, - "total": { - "type": "integer" - }, - "truncated": { - "type": "boolean" - } - }, - "type": "object" -}New value: +null
2 tool updates
v0.3.0- Changed
get_term3 fields changed- added
Output schema / properties / commentsAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "kind": { + "const": "untrusted_text" + }, + "provenance": { + "additionalProperties": false, + "properties": { + "record_id": { + "type": "string" + }, + "retrieved_at": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "type": "object" + }, + "raw_sha256": { + "type": "string" + }, + "text": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / definition / oneOfAdded value: +[ + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "untrusted_text" + }, + "provenance": { + "additionalProperties": false, + "properties": { + "record_id": { + "type": "string" + }, + "retrieved_at": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "type": "object" + }, + "raw_sha256": { + "type": "string" + }, + "text": { + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / definition / typeRemoved value: -[ - "string", - "null" -]
- Changed
search_terms5 fields changed- added
Output schema / properties / results / items / properties / definition / oneOfAdded value: +[ + { + "additionalProperties": false, + "properties": { + "kind": { + "const": "untrusted_text" + }, + "provenance": { + "additionalProperties": false, + "properties": { + "record_id": { + "type": "string" + }, + "retrieved_at": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "type": "object" + }, + "raw_sha256": { + "type": "string" + }, + "text": { + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / results / items / properties / definition / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / results / items / properties / definition_snippet / additionalPropertiesAdded value: +false - added
Output schema / properties / results / items / properties / definition_snippet / propertiesAdded value: +{ + "kind": { + "const": "untrusted_text" + }, + "provenance": { + "additionalProperties": false, + "properties": { + "record_id": { + "type": "string" + }, + "retrieved_at": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "type": "object" + }, + "raw_sha256": { + "type": "string" + }, + "text": { + "type": "string" + } +} - changed
Output schema / properties / results / items / properties / definition_snippet / typePrevious value: -"string"New value: +"object"
12 tool updates
v0.1.1- Changed
get_diagnostics2 fields changed- added
Output schema / properties / freshnessAdded value: +{ + "additionalProperties": true, + "type": "object" +} - added
Output schema / properties / latency_sloAdded value: +{ + "additionalProperties": true, + "type": "object" +}
- Changed
get_diseases_for_phenotype3 fields changed- added
Input schema / properties / hpo_idAdded value: +{ + "description": "Canonical HP id for the resolved HPO phenotype (HP:0000118). Legacy `term` arguments are accepted as an alias.", + "examples": [ + "HP:0000118" + ], + "type": "string" +} - removed
Input schema / properties / termRemoved value: -{ - "description": "An HP id (HP:0000118), a phenotype label/synonym, or an external xref CURIE that resolves to a single HPO term.", - "examples": [ - "HP:0000118", - "Seizure", - "UMLS:C0036572" - ], - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "term" -]New value: +[ + "hpo_id" +]
- Changed
get_genes_for_phenotype3 fields changed- added
Input schema / properties / hpo_idAdded value: +{ + "description": "Canonical HP id for the resolved HPO phenotype (HP:0000118). Legacy `term` arguments are accepted as an alias.", + "examples": [ + "HP:0000118" + ], + "type": "string" +} - removed
Input schema / properties / termRemoved value: -{ - "description": "An HP id (HP:0000118), a phenotype label/synonym, or an external xref CURIE that resolves to a single HPO term.", - "examples": [ - "HP:0000118", - "Seizure", - "UMLS:C0036572" - ], - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "term" -]New value: +[ + "hpo_id" +]
- Changed
get_term4 fields changed- added
Input schema / properties / hpo_idAdded value: +{ + "description": "Canonical HP id for the resolved HPO term (HP:0000118). Legacy `term` arguments are accepted as an alias.", + "examples": [ + "HP:0000118" + ], + "type": "string" +} - removed
Input schema / properties / termRemoved value: -{ - "description": "An HP id (HP:0000118), a phenotype label/synonym, or an external xref CURIE that resolves to a single HPO term.", - "examples": [ - "HP:0000118", - "Seizure", - "UMLS:C0036572" - ], - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "term" -]New value: +[ + "hpo_id" +] - added
Output schema / properties / synonyms / itemsAdded value: +{ + "oneOf": [ + { + "type": "string" + }, + { + "additionalProperties": true, + "properties": { + "scope": { + "type": "string" + }, + "text": { + "type": "string" + } + }, + "type": "object" + } + ] +}
- Changed
get_term_ancestors3 fields changed- added
Input schema / properties / hpo_idAdded value: +{ + "description": "Canonical HP id for the resolved HPO term (HP:0000118). Legacy `term` arguments are accepted as an alias.", + "examples": [ + "HP:0000118" + ], + "type": "string" +} - removed
Input schema / properties / termRemoved value: -{ - "description": "An HP id (HP:0000118), a phenotype label/synonym, or an external xref CURIE that resolves to a single HPO term.", - "examples": [ - "HP:0000118", - "Seizure", - "UMLS:C0036572" - ], - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "term" -]New value: +[ + "hpo_id" +]
- Changed
get_term_children3 fields changed- added
Input schema / properties / hpo_idAdded value: +{ + "description": "Canonical HP id for the resolved HPO term (HP:0000118). Legacy `term` arguments are accepted as an alias.", + "examples": [ + "HP:0000118" + ], + "type": "string" +} - removed
Input schema / properties / termRemoved value: -{ - "description": "An HP id (HP:0000118), a phenotype label/synonym, or an external xref CURIE that resolves to a single HPO term.", - "examples": [ - "HP:0000118", - "Seizure", - "UMLS:C0036572" - ], - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "term" -]New value: +[ + "hpo_id" +]
- Changed
get_term_descendants3 fields changed- added
Input schema / properties / hpo_idAdded value: +{ + "description": "Canonical HP id for the resolved HPO term (HP:0000118). Legacy `term` arguments are accepted as an alias.", + "examples": [ + "HP:0000118" + ], + "type": "string" +} - removed
Input schema / properties / termRemoved value: -{ - "description": "An HP id (HP:0000118), a phenotype label/synonym, or an external xref CURIE that resolves to a single HPO term.", - "examples": [ - "HP:0000118", - "Seizure", - "UMLS:C0036572" - ], - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "term" -]New value: +[ + "hpo_id" +]
- Changed
get_term_parents3 fields changed- added
Input schema / properties / hpo_idAdded value: +{ + "description": "Canonical HP id for the resolved HPO term (HP:0000118). Legacy `term` arguments are accepted as an alias.", + "examples": [ + "HP:0000118" + ], + "type": "string" +} - removed
Input schema / properties / termRemoved value: -{ - "description": "An HP id (HP:0000118), a phenotype label/synonym, or an external xref CURIE that resolves to a single HPO term.", - "examples": [ - "HP:0000118", - "Seizure", - "UMLS:C0036572" - ], - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "term" -]New value: +[ + "hpo_id" +]
- Changed
map_cross_ontology4 fields changed- added
Input schema / properties / fieldsAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Sparse fieldset: return ONLY these top-level keys (dot into a grouped object, e.g. 'xrefs.UMLS'). Identity anchors (hpo_id, name, hpo_version) are always included. Omit for the full payload.", + "examples": [ + [ + "synonyms", + "definition" + ], + [ + "parents" + ] + ] +} - added
Input schema / properties / hpo_idAdded value: +{ + "description": "Canonical HP id for the resolved HPO term (HP:0000118). Legacy `term` arguments are accepted as an alias.", + "examples": [ + "HP:0000118" + ], + "type": "string" +} - removed
Input schema / properties / termRemoved value: -{ - "description": "An HP id (HP:0000118), a phenotype label/synonym, or an external xref CURIE that resolves to a single HPO term.", - "examples": [ - "HP:0000118", - "Seizure", - "UMLS:C0036572" - ], - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "term" -]New value: +[ + "hpo_id" +]
- Changed
resolve_term2 fields changed- changed
Input schema / properties / query / descriptionPrevious value: -"A phenotype label, synonym, HP id (HP:0000118), or external xref CURIE (UMLS:C0036572, SNOMEDCT_US:193046000, ...)."New value: +"A phenotype label, synonym, HP id (HP:0000118), or external xref CURIE (UMLS:C0036572, SNOMEDCT_US:263681008, ...)." - added
Output schema / properties / match_confidenceAdded value: +{ + "type": [ + "number", + "null" + ] +}
- Changed
resolve_xref1 field changed- changed
Input schema / properties / xref_id / examplesPrevious value: -[ - "UMLS:C0036572", - "SNOMEDCT_US:193046000", - "NCIT:C4890" -]New value: +[ + "UMLS:C0036572", + "SNOMEDCT_US:263681008", + "NCIT:C4890" +]
- Changed
search_terms1 field changed- changed
Input schema / properties / query / descriptionPrevious value: -"A phenotype label, synonym, HP id (HP:0000118), or external xref CURIE (UMLS:C0036572, SNOMEDCT_US:193046000, ...)."New value: +"A phenotype label, synonym, HP id (HP:0000118), or external xref CURIE (UMLS:C0036572, SNOMEDCT_US:263681008, ...)."
17 tool updates
v0.1.0- First observed
get_diagnostics - First observed
get_diseases_for_gene - First observed
get_diseases_for_phenotype - First observed
get_genes_for_disease - First observed
get_genes_for_phenotype - First observed
get_phenotypes_for_disease - First observed
get_phenotypes_for_gene - First observed
get_server_capabilities - First observed
get_term - First observed
get_term_ancestors - First observed
get_term_children - First observed
get_term_descendants - First observed
get_term_parents - First observed
map_cross_ontology - First observed
resolve_term - First observed
resolve_xref - First observed
search_terms
TDQS
Scored across 17 tools
Each tool has a clearly distinct purpose: diagnostics, term traversal, association queries, resolution, cross-reference mapping, and search. No overlap in functionality.
All tool names follow a consistent verb_noun pattern (e.g., get_diseases_for_gene, get_term_ancestors, resolve_term). No mixing of conventions.
17 tools provide comprehensive coverage for an HPO linking service, covering term navigation, associations, resolution, search, and diagnostics without being excessive.
The tool surface covers term retrieval, hierarchical traversal, disease-gene-phenotype associations, cross-references, resolution, search, and server diagnostics. No obvious gaps for the intended read-only use case.
Maintenance
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
MCP server for US nursing facility search and ownership lookup (NursingHomeDatabase).
MCP gateway federating 22 biomedical MCP servers behind one endpoint: gnomAD, ClinVar, HPO, VEP.
Human Phenotype Ontology — clinical phenotype terms + gene/disease annotations
Bioinformatics MCP for genomic variant interpretation, gene-disease evidence and literature.
Related MCP Servers
- FlicenseBqualityDmaintenanceA production-ready Model Context Protocol (MCP) server that provides comprehensive access to the BioOntology API for searching, annotating, and exploring over 1,200 biological ontologies.109-
- FlicenseAqualityDmaintenanceProvides access to the Human Phenotype Ontology (HPO) API with tools for searching, browsing hierarchy, and analyzing phenotypic terms used in genetic research.12-
- AlicenseNot gradedqualityDmaintenanceMCP servers for querying Brick and 223P ontologies, enabling abbreviation expansion, term/property lookup, and definition retrieval.5BSD 3-Clause
- AlicenseAqualityAmaintenanceMCP server that provides tools to query harmonized gene-disease validity data from the Gene Curation Coalition, supporting consensus and conflict detection for gene-disease assertions.12MIT