Skip to main content
Glama
musharna

plant-genomics-mcp

by musharna

GO Annotations

locus_go_annotations
Read-onlyIdempotent

Fetch Gene Ontology annotations for a plant locus from QuickGO by resolving it to UniProt, and return GO terms grouped by molecular function, biological process, and cellular component.

Instructions

Fetch Gene Ontology annotations for a plant locus from QuickGO (EBI). Free, no API key. The locus is first resolved to a UniProt accession via the same logic as resolve_locus_to_uniprot, then QuickGO is queried by geneProductId. Returns annotations[] with goId/goName/goAspect/qualifier/evidence + a by_aspect rollup ({molecular_function: [{goId, goName}, ...], biological_process: [...], cellular_component: [...]}) deduped on goId so the high-level term set is one read away; by_aspect_deduped_on names that key in the payload. truncated is true when numberOfHits exceeds returned — raise limit (max 100).

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
limitNoMax annotations from QuickGO (1–100, default 50)
locusYese.g. AT1G01010 (Arabidopsis), Os01g0100100 (rice)
cursorNonext_cursor from the previous page; omit for the first (#123)
organismNoPlant organism — accepts canonical slug (arabidopsis_thaliana), scientific or common name, or NCBI taxidarabidopsis_thaliana

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
locusYes
totalYesHow many GO annotations (QuickGO numberOfHits) exist upstream for this query, all pages (pre-cap) (#123)
returnedYesRows in this payload (#123)
by_aspectYesaspect → [{goId, goName}, ...], deduped on goId, over annotations[] only
truncatedYesTrue when numberOfHits exceeds returned (raise `limit`)
annotationsYes
next_cursorNoPass back as cursor= to get the rows after this page; null on the last page. Opaque, and bound to this tool and query (#123)
numberOfHitsYesTotal annotations available upstream
upstream_versionNoQuickGO release that produced THIS response, — always null today: this backend states no release on its responses; upstream_release(backend='quickgo') reports the release its own endpoint calls current at query time, or why there is none. null means QuickGO did not state one — never that no release exists, and never inferred from a separate metadata call, which can describe a different release than the one that answered.
uniprot_accessionYesUniProt accession used to query QuickGO
with_from_includedNoFalse when withFrom was not asked for (gene_report's GO section), in which case every withFrom is null because it was left out — not because the annotation has no partner or source cross-ref.
by_aspect_deduped_onYesThe key by_aspect collapses annotations[] on: a dedup, not a truncation

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changedv1.28.0
    • addedOutput schema / properties / with_from_included
      Added value: +{
      +  "default": true,
      +  "description": "False when withFrom was not asked for (gene_report's GO section), in which case every withFrom is null because it was left out — not because the annotation has no partner or source cross-ref.",
      +  "title": "With From Included",
      +  "type": "boolean"
      +}
  2. Changed1 schema field changedv1.27.0
    • changedOutput schema / properties / upstream_version / description
      Previous value: -"QuickGO release that produced THIS response, — always null today: this backend states no release on its responses. null means QuickGO did not state one — never that no release exists, and never inferred from a separate metadata call, which can describe a different release than the one that answered."New value: +"QuickGO release that produced THIS response, — always null today: this backend states no release on its responses; upstream_release(backend='quickgo') reports the release its own endpoint calls current at query time, or why there is none. null means QuickGO did not state one — never that no release exists, and never inferred from a separate metadata call, which can describe a different release than the one that answered."
  3. Changed9 schema fields changedv1.22.0
    • addedInput schema / properties / cursor
      Added value: +{
      +  "description": "next_cursor from the previous page; omit for the first (#123)",
      +  "type": "string"
      +}
    • changedOutput schema / properties / by_aspect / description
      Previous value: -"aspect → [{goId, goName}, ...], deduped on goId"New value: +"aspect → [{goId, goName}, ...], deduped on goId, over annotations[] only"
    • addedOutput schema / properties / by_aspect_deduped_on
      Added value: +{
      +  "const": "goId",
      +  "description": "The key by_aspect collapses annotations[] on: a dedup, not a truncation",
      +  "title": "By Aspect Deduped On",
      +  "type": "string"
      +}
    • addedOutput schema / properties / next_cursor
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Pass back as cursor= to get the rows after this page; null on the last page. Opaque, and bound to this tool and query (#123)",
      +  "title": "Next Cursor"
      +}
    • changedOutput schema / properties / returned / description
      Previous value: -"Number of annotations in annotations[]"New value: +"Rows in this payload (#123)"
    • addedOutput schema / properties / total
      Added value: +{
      +  "description": "How many GO annotations (QuickGO numberOfHits) exist upstream for this query, all pages (pre-cap) (#123)",
      +  "title": "Total",
      +  "type": "integer"
      +}
    • addedOutput schema / properties / truncated
      Added value: +{
      +  "description": "True when numberOfHits exceeds returned (raise `limit`)",
      +  "title": "Truncated",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / upstream_version
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "QuickGO release that produced THIS response, — always null today: this backend states no release on its responses. null means QuickGO did not state one — never that no release exists, and never inferred from a separate metadata call, which can describe a different release than the one that answered.",
      +  "title": "Upstream Version"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "locus",
      -  "uniprot_accession",
      -  "numberOfHits",
      -  "returned",
      -  "annotations",
      -  "by_aspect"
      -]New value: +[
      +  "total",
      +  "locus",
      +  "uniprot_accession",
      +  "numberOfHits",
      +  "returned",
      +  "truncated",
      +  "annotations",
      +  "by_aspect",
      +  "by_aspect_deduped_on"
      +]
  4. First observedv1.8.0

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so safety is covered. The description adds real behavioral context beyond them: the UniProt resolution step, cursor paging, that 'truncated' signals numberOfHits exceeding the returned set, and that limit can be raised to 100. Error/auth behavior is the only notable omission.

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

Conciseness4/5

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

Front-loaded with purpose and kept to a compact block, though the dedup/rollup sentence ('deduped on goId ... by_aspect_deduped_on names that key in the payload') is dense and partly redundant given the output schema exists.

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

Completeness4/5

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

Given an output schema is present, return-value explanation is optional, yet the description still covers resolution, paging, truncation, and limits, making the definition self-sufficient. Only failure/error behavior is left unaddressed.

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

Parameters4/5

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

Schema coverage is 100% (baseline 3), and the description meaningfully adds to it by tying 'truncated' to raising 'limit' (max 100) and clarifying the cursor is 'next_cursor from the previous page'. The organism flexibility and locus examples are already in the schema, so the extra lift is modest but real.

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

Purpose5/5

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

States a specific verb+resource ('Fetch Gene Ontology annotations for a plant locus') plus the data source (QuickGO/EBI), and implicitly separates itself from batch_locus_go_annotations and go_enrichment by scoping to a single locus. An agent can identify what it does without opening the schema.

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

Usage Guidelines3/5

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

It explains the resolution pipeline and notes 'Free, no API key', which is useful context, but never states when to prefer this over batch_locus_go_annotations or go_enrichment, nor any exclusions. Usage is implied rather than prescribed.

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