Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

Plant Genomics

PYPI · PLANT-GENOMICS-MCP

Plant genomics MCP — 58 tools across 24 backends with cross-source synthesis.

Available components

−15 this week 81 Trust /100

Last scanned (20 hours ago)

Scores higher than 82% of PyPI servers

Category Health and Science

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security50
  • Malware scan not yet available for this package.Unverified
  • No known CVEs affecting this package version or its production dependencies.Pass
  • Runs hatchling.build at install time, a recognised build step with no custom scripting around it. View diagnostics → Pass
  • 2 of 32 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency100
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Cryptographically verified build provenance (signed, bound to musharna/plant-genomics-mcp). View diagnostics → Pass
  • Clear OSI-approved license (MIT).Pass
  • Actively maintained (last published 8 days ago).Pass
  • Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability78
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 13419 tokens (~216/item across 62 items; 58 tools + 4 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
  • No destabilizing schema changes in the last 30 days.Pass
Tool Coverage97
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 89% of tool parameters carry a description.Partial
  • Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • We read all 58 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
  • An AI judge read all 59 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a current MCP spec version (2026-07-28).Pass
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 31 Oct 26 −15
    • Malware scan: pass → unverified ▼ security
  • 30 Oct 26 +15
    • Malware scan: unverified → pass ▲ security
  • 29 Oct 26 −15
    • Malware scan: pass → unverified ▼ security
  • 28 Oct 26 +15
    • Malware scan: unverified → pass ▲ security
  • 27 Oct 26 −15
    • Malware scan: pass → unverified ▼ security
    • Package version: 1.29.3 → 1.30.0 functional
  • 23 Oct 26 0
    • Stability: 0.97 → pass security
  • 22 Oct 26 0
    • Stability: fail → 0.97 functional
  • 18 Oct 26 +15
    • Malware scan: unverified → pass ▲ security
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 4 Nov 2026 · Analysed pypi/plant-genomics-mcp@1.30.0

Provenance Verified

A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.

Result Verified
Ecosystem pypi
Reason Verified
Discovered via Registry attestation endpoint
Source repo musharna/plant-genomics-mcp
Certificate issuer https://token.actions.githubusercontent.com
Certificate SAN https://github.com/musharna/plant-genomics-mcp/.github/workflows/release.yml@refs/tags/v1.30.0
Rekor log index 3500429017
Predicate type PyPI publish attestation https://docs.pypi.org/attestations/publish/v1
Subject digest sha256:a2b90e8243c17dbf1aff867e67bbaf4652cddc273a9e79eef9659d2b23d100c9

Background: How many MCP packages publish verified provenance →

Install scripts 1 script
Hook Tier Command
build_backend allowlisted hatchling.build

Background: Why install scripts are a supply-chain risk →

Dependencies 32 packages
Packages resolved 32
Stale 1
No linked repository 1
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 58 exposed · ~13,205 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
interpro_domains ~245

Fetch the InterPro domain / family architecture for a locus (www.ebi.ac.uk/interpro; free, no key). Resolves the locus → UniProt accession, then returns the protein's InterPro entries — each with accession, name, type (domain / family / homologous_superfamily / …), source_database (Pfam appears here as source_database='pfam', not a separate tool), the integrated InterPro accession, and residue spans — plus a count_by_type rollup. A protein with no annotated domains returns found=true with an empty list; a locus with no UniProt entry raises a typed NotFoundError. domain_count is the true total even when the row list is page-capped. Works for all 12 organisms (UniProt-keyed). Defaults to arabidopsis_thaliana; pass organism= for other species.

NameTypeReqDescription
locusstringyese.g. AT4G09760 (Arabidopsis), Os01g0100100 (rice RAP-DB)
organismstring|integer–Plant organism — accepts canonical slug (arabidopsis_thaliana), scientific or common name, or NCBI taxid
NameTypeReqDescription
accessionstringyesResolved UniProt accession
count_by_typeobjectyesRollup of entry count by type
domain_countintegeryesTotal InterPro entries (pre-cap)
domainsarrayyes–
foundbooleanyesTrue once the locus resolved to a UniProt entry
locusstringyes–
returnedintegeryesRows in this payload (#123)
totalintegeryesHow many InterPro entries on this protein exist upstream for this query, all pages (pre-cap) (#123)
truncatedbooleanyesTrue if the row list was page-capped (< domain_count)
upstream_version––InterPro release that produced THIS response, as stated by the upstream's own header (e.g. '109.0'). null means InterPro did not state one — never that no release exists, and never inferred from a se…

No examples provided.

jaspar_motif ~178

Fetch one JASPAR binding profile by matrix id, including its raw position-frequency matrix (PFM: per-base count vectors keyed A/C/G/T) plus TF class/family, assay type, source species, UniProt accessions, PubMed refs, IUPAC consensus, and the sequence-logo URL (a link for the client to fetch; no tool on this server retrieves it). The drill-down companion to tf_binding_motifs, which returns the derived consensus but not the matrix. Accepts a versioned id (MA0570.1) or a bare base id (MA0570, which resolves to the newest version). Unknown ids raise a typed NotFoundError.

NameTypeReqDescription
matrix_idstringyesJASPAR profile id, e.g. MA0570.1 or MA0570 (latest version)
NameTypeReqDescription
base_id––Version-less profile id, e.g. MA0570
collection––CORE / PBM / UNVALIDATED / …
consensus––IUPAC consensus derived from the PFM, e.g. 'AAATATCT' (the Evening Element)
data_type––Assay the profile derives from: SELEX / ChIP-seq / PBM / DAP-seq
length––Motif width in bases
matrix_id––JASPAR profile id, e.g. MA0570.1
name––TF name as curated by JASPAR
pfm––Position-frequency matrix: per-base count vectors keyed A/C/G/T
pubmed_idsarray–Supporting PubMed IDs
sequence_logo––URL of the SVG sequence logo — a link for the client to open or fetch; no tool on this server dereferences it
speciesarray–Source species [{tax_id, name}]
tf_class––Structural class, e.g. ['Basic leucine zipper factors (bZIP)']
tf_family––TF family, e.g. ['MYB-related']
uniprot_idsarray–UniProt accessions JASPAR attributes the profile to
version––JASPAR release version of the profile
web_url––JASPAR profile page — a link for the client to open or fetch; no tool on this server dereferences it

No examples provided.

kegg_pathways ~272

Fetch KEGG pathway memberships for a plant locus from rest.kegg.jp. Returns a list of pathway IDs + names + KEGG category classes the locus participates in. Pairs with locus_go_annotations for the GO-level functional view. Covers: arabidopsis_thaliana, brachypodium_distachyon, glycine_max, hordeum_vulgare, oryza_sativa, populus_trichocarpa, zea_mays. Any other organism raises OrganismNotSupported before any request (both the single and batch forms). Non-Arabidopsis loci are bridged to the NCBI Entrez Gene ID KEGG indexes (returned as entrez_gene_id). A gene KEGG knows with no pathway memberships is an ok answer with pathways=[]; a gene KEGG has no record of raises NotFoundError. KEGG v118+ is case-sensitive on the locus: pass AGI loci as uppercase.

NameTypeReqDescription
locusstringyesArabidopsis AGI locus, e.g. AT1G01010 (case preserved verbatim — KEGG v118+ is case-sensitive)
organismstring|integer–Plant organism — accepts canonical slug, scientific or common name, or NCBI taxid; see the tool description for which KEGG covers
NameTypeReqDescription
entrez_gene_id––Entrez Gene ID from the non-Arabidopsis KEGG↔Entrez bridge; absent for ath.
errorsarray–Per-pathway step-2 failures (kept inline so the call doesn't abort)
kegg_gene_idstringyese.g. "ath:at1g01010"
locusstringyes–
organismstringyesResolved canonical organism slug, e.g. arabidopsis_thaliana
pathwaysarrayyes–
upstream_version––KEGG release that produced THIS response, — always null today: this backend states no release on its responses; upstream_release(backend='kegg') reports the release its own endpoint calls current at…

No examples provided.

locus_gene_rifs ~242

Fetch curated GeneRIF functional statements for an Arabidopsis locus from ThaleMine (free, no key). A GeneRIF is a one-sentence, manually curated statement of what the gene does, each anchored to the PubMed ID of the publication that demonstrated it — dense, directly citable functional context that GO terms (locus_go_annotations) and raw abstracts (locus_literature) do not provide. Well-studied genes have many: HY5 (AT5G11260) has 114. Upstream order is preserved because ThaleMine supplies no meaningful ranking, so `truncated` means later statements were cut, not that they were less relevant. found=false means the gene exists but has no GeneRIF; an unknown locus raises a typed NotFoundError. Arabidopsis only.

NameTypeReqDescription
locusstringyesAGI locus, e.g. AT5G11260 (HY5)
organismstring|integer–Plant organism — accepts canonical slug (arabidopsis_thaliana), scientific or common name, or NCBI taxid. ThaleMine supports Arabidopsis only.
NameTypeReqDescription
foundbooleanyesTrue if the gene has at least one GeneRIF
gene_rifsarray–Curated statements in upstream order
gene_symbol––Gene symbol from ThaleMine
locusstringyes–
organismstringyesCanonical organism slug (Arabidopsis only)
returnedintegeryesRows in this payload (#123)
rif_countintegeryesTotal GeneRIFs (pre-cap)
source_urlstringyesThaleMine gene report page — a link for the client to open or fetch; no tool on this server dereferences it
totalintegeryesHow many GeneRIFs exist upstream for this query, all pages (pre-cap) (#123)
truncatedbooleanyesTrue if the GeneRIF list was capped

No examples provided.

locus_go_annotations ~261

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).

NameTypeReqDescription
cursorstring–next_cursor from the previous page; omit for the first (#123)
limitinteger–Max annotations from QuickGO (1–100, default 50)
locusstringyese.g. AT1G01010 (Arabidopsis), Os01g0100100 (rice)
organismstring|integer–Plant organism — accepts canonical slug (arabidopsis_thaliana), scientific or common name, or NCBI taxid
NameTypeReqDescription
annotationsarrayyes–
by_aspectobjectyesaspect → [{goId, goName}, ...], deduped on goId, over annotations[] only
by_aspect_deduped_onstringyesThe key by_aspect collapses annotations[] on: a dedup, not a truncation
locusstringyes–
next_cursor––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)
numberOfHitsintegeryesTotal annotations available upstream
returnedintegeryesRows in this payload (#123)
totalintegeryesHow many GO annotations (QuickGO numberOfHits) exist upstream for this query, all pages (pre-cap) (#123)
truncatedbooleanyesTrue when numberOfHits exceeds returned (raise `limit`)
uniprot_accessionstringyesUniProt accession used to query QuickGO
upstream_version––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 curre…
with_from_includedboolean–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.

No examples provided.

locus_literature ~293

Search Europe PMC for literature mentioning a plant locus. Free, no API key. Returns up to `size` results (default 10, capped at 25) with title, authors, journal, year, DOI, PMID, open-access status, citation count, abstract, and the article's web_url (a link for the client to open; no tool on this server retrieves it). For non-Arabidopsis species the species common name is appended to the query to disambiguate locus IDs (rice, maize, ...). Pair with resolve_locus_to_uniprot or ensembl_plants_lookup_locus to ground the locus before fanning out to the literature.

NameTypeReqDescription
cursorstring–next_cursor from the previous page; omit for the first (#123)
include_abstractboolean–Set false to null out abstractText, which is ~67% of this payload. The response echoes 'abstracts_included' so a null abstract is not mistaken for an article that has none.
locusstringyese.g. AT1G01010 (Arabidopsis), Os01g0100100 (rice)
organismstring|integer–Plant organism — accepts canonical slug (arabidopsis_thaliana), scientific or common name, or NCBI taxid
sizeinteger–Max results (1–25, default 10)
NameTypeReqDescription
abstracts_includedboolean–False when include_abstract=False was passed, in which case every abstractText is null because it was not requested — not because the article lacks one. Abstracts are ~67% of this payload.
hitCountintegeryesTotal hits available upstream (may exceed returned)
hitsarrayyes–
locusstringyes–
next_cursor––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)
organismstringyes–
querystringyesFinal query string sent to Europe PMC
returnedintegeryesRows in this payload (#123)
totalintegeryesHow many papers (Europe PMC hitCount) exist upstream for this query, all pages (pre-cap) (#123)
truncatedbooleanyesTrue when total > returned: more exist upstream than came back (#123)
upstream_version––Europe PMC release that produced THIS response, — always null today: this backend states no release on its responses; upstream_release(backend='europe_pmc') reports the release its own endpoint calls…

No examples provided.

locus_plant_ontology ~317

Fetch Plant Ontology (PO) + Trait Ontology (TO) + experimental-condition (PECO) annotations for a plant locus from Planteome (browser.planteome.org, AmiGO2/GOlr; free, no API key). Complements locus_go_annotations: QuickGO serves GO (species-agnostic), Planteome serves the plant-specific ontologies — PO (anatomy + developmental stage), TO (traits). The locus is matched across Planteome's searchable bioentity fields and filtered by the organism's NCBI taxon. Returns annotations[] (term_id / term_name / ontology / aspect / evidence / reference) + a by_ontology rollup ({PO: [{term_id, term_name}, ...], TO: [...], PECO: [...]}) deduped on term_id. Planteome names genes by these locus ids for arabidopsis, rice, wheat and tomato only; other organisms are refused, and a gene Planteome has no record of is not found. Defaults to arabidopsis_thaliana; pass organism= for other species.

NameTypeReqDescription
limitinteger–Max annotations from Planteome (1–200, default 100)
locusstringyese.g. AT1G01010 (Arabidopsis), Os01g0100100 (rice)
organismstring|integer–Plant organism — accepts canonical slug (arabidopsis_thaliana), scientific or common name, or NCBI taxid
NameTypeReqDescription
annotationsarrayyes–
by_ontologyobjectyesnamespace → [{term_id, term_name}, ...], deduped on term_id
locusstringyes–
numberOfHitsintegeryesTotal annotations available upstream
organismstringyesCanonical organism slug
returnedintegeryesRows in this payload (#123)
taxonstringyesNCBI taxon filter applied, e.g. NCBITaxon:3702
totalintegeryesHow many annotations (Planteome numFound) exist upstream for this query, all pages (pre-cap) (#123)
truncatedbooleanyesTrue when total > returned: more exist upstream than came back (#123)

No examples provided.

locus_variants ~232

List natural (germline) variants overlapping a locus's genomic span via Ensembl (rest.ensembl.org; free, no key). Resolves the locus → gene coordinates, then returns EVA/dbSNP-sourced SNPs and indels with id, source, consequence class, alleles, and clinical significance. variant_count is the true overlap total; the variant list is capped for payload size with truncated flagged. Opens the variation axis (distinct from get_sequence / ensembl_region_query). Works for all 12 organisms. Defaults to arabidopsis_thaliana; pass organism= for other species.

NameTypeReqDescription
limitinteger–Max variant rows to return. 'variant_count' always reports the true pre-cap total and 'truncated' says whether the cap bit.
locusstringyese.g. AT1G01010 (Arabidopsis), Os01g0100100 (rice RAP-DB)
organismstring|integer–Plant organism — accepts canonical slug (arabidopsis_thaliana), scientific or common name, or NCBI taxid
NameTypeReqDescription
gene_end––Gene span end (1-based)
gene_start––Gene span start (1-based)
locusstringyes–
organismstringyesResolved Ensembl species slug
regionstringyesQueried gene span, e.g. '1:33666-37840'
returnedintegeryesRows in this payload (#123)
totalintegeryesHow many variants overlapping the gene exist upstream for this query, all pages (pre-cap) (#123)
truncatedbooleanyesTrue if the variant list was capped
variant_countintegeryesTotal overlapping variants (pre-cap)
variantsarray–Per-variant {id, source, consequence_type, alleles, …}

No examples provided.

maize_gene_model_translation ~275

Translate maize B73 gene-model IDs between RefGen_v4 (Zm00001d) and RefGen_v5 (Zm00001eb) with MaizeGDB's published translation table. UniProt and Ensembl Plants know only v5 IDs, so a v4 ID answers nothing there until it is translated. direction v4_to_v5 (default) or v5_to_v4. Each ID comes back mapped (targets: one, or several when the model split or merged), no_counterpart (MaizeGDB lists it with no model in the other assembly: report it as unmappable), or not_in_table (MaizeGDB does not list it, so this source says nothing about it). Gene-model IDs only, no transcript suffix; up to 1000 per call. source gives the table's URL (a link for the client to open; no tool on this server retrieves it), its Last-Modified date and sha256, so an answer can be tied to one release of the table.

NameTypeReqDescription
directionstring–v4_to_v5 (Zm00001d → Zm00001eb) or v5_to_v4
idsarrayyesGene-model IDs, e.g. ['Zm00001d022051'] for v4_to_v5
NameTypeReqDescription
countintegeryesDistinct IDs queried (duplicates collapsed)
directionstringyes–
from_assemblystringyesRefGen_v4 or RefGen_v5
mappedintegeryesResults with status mapped
no_counterpartintegeryesResults with status no_counterpart
not_in_tableintegeryesResults with status not_in_table
resultsarrayyes–
source–yes–
to_assemblystringyesRefGen_v5 or RefGen_v4
upstream_version––MaizeGDB release that produced THIS response, as stated by the table's Last-Modified header (MaizeGDB numbers no release). null means MaizeGDB did not state one — never that no release exists, and ne…

No examples provided.

orthodb_orthologs ~409

Resolve a locus to its OrthoDB ortholog group and cross-species member genes (data.orthodb.org; free, no key). Searches at the Viridiplantae level, then returns the group metadata (name, evolutionary rate) and member genes grouped by organism (organism, gene id, description). organism_count is the true cluster total; the member list is capped with truncated flagged. found=false when the locus maps to no ortholog group. Works for all 12 organisms. NOTE: unlike the other locus tools, organism= does NOT scope the search — the group is resolved from the locus id alone at the Viridiplantae level, and organism is only validated and echoed back. Passing a mismatched organism therefore still returns the locus's real group. target_organism= DOES filter: it keeps only that organism's members, before the cap, so a 2,000-member group cannot hide rice or wheat behind 'limit'.

NameTypeReqDescription
cursorstring–next_cursor from the previous page; omit for the first (#123)
limitinteger–Max ortholog member rows to return. 'member_count' always reports the true pre-cap total and 'truncated' says whether the cap bit.
locusstringyese.g. AT1G01060 (Arabidopsis), Os01g0100100 (rice RAP-DB)
organismstring|integer–Plant organism — accepts canonical slug (arabidopsis_thaliana), scientific or common name, or NCBI taxid. Validated and echoed only: it does NOT scope the OrthoDB search, which keys on the locus id a…
target_organismstring|integer–Keep only this organism's members (slug, scientific/common name, or NCBI taxid), filtered BEFORE the cap. Adds 'member_count_all_organisms' for the whole group.
NameTypeReqDescription
foundbooleanyesTrue if the locus maps to an ortholog group
group––Group metadata {id, name, evolutionary_rate, level_name, …}
locusstringyes–
member_countintegeryesMember genes before the cap (pre-cap; = total)
member_count_all_organisms––Whole-group member total (pre-filter, pre-cap); present only when filtered
membersarray–Per-gene {organism, gene_id, xref, description}
next_cursor––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)
organismstringyesCanonical organism as requested — echoed, not inferred from the hit. Does not scope the search (see class docstring)
organism_countintegeryesNumber of member organisms in the whole ortholog group (pre-cap) — the true cluster total, unaffected by the member cap below
returnedintegeryesRows in this payload (#123)
target_organism––Canonical organism the members were filtered to, when target_organism was passed
totalintegeryesHow many members (all organisms, or target_organism when given) exist upstream for this query, all pages (pre-cap) (#123)
truncatedbooleanyesTrue if the member list was capped
upstream_version––OrthoDB release that produced THIS response, as stated by the release pinned in every request path (/v12/). null means OrthoDB did not state one — never that no release exists, and never inferred fro…

No examples provided.

panther_family ~222

Fetch the PANTHER protein-family classification for a locus (pantherdb.org; free, no key). Returns the PANTHER family and subfamily (id + name) plus curated GO terms grouped by aspect (molecular_function / biological_process / cellular_component), the PANTHER protein class, and pathways. found=false when PANTHER cannot map the locus; a mapped locus can still have a null family or subfamily, which means PANTHER assigns it none. Complements the sequence-homology tools (gramene_homologs / consensus_homologs) with an evolutionary-family view. Works for all 12 organisms. Defaults to arabidopsis_thaliana; pass organism= for other species.

NameTypeReqDescription
locusstringyese.g. AT1G01060 (Arabidopsis), Os01g0100100 (rice RAP-DB)
organismstring|integer–Plant organism — accepts canonical slug (arabidopsis_thaliana), scientific or common name, or NCBI taxid
NameTypeReqDescription
accession––PANTHER mapped accession
family_id––PANTHER family id, e.g. PTHR12802; null when PANTHER assigns no family
family_name–––
foundbooleanyesTrue if PANTHER mapped the locus; the family fields can still be null
go_biological_processarray––
go_cellular_componentarray––
go_molecular_functionarray––
locusstringyes–
pathwaysarray––
protein_classarray––
subfamily_id––e.g. PTHR12802:SF176; null when PANTHER assigns no subfamily, which is PANTHER's answer, not a failed lookup
subfamily_name–––
upstream_version––PANTHER release that produced THIS response, as stated by the answer's search.product.version. null means PANTHER did not state one — never that no release exists, and never inferred from a separate…

No examples provided.

phytozome_lookup_locus ~193

Fetch a gene record from Phytozome BioMart (phytozome-next.jgi.doe.gov). Defaults to arabidopsis_thaliana; pass organism= for other Phytozome proteomes (slug, scientific/common name, or NCBI taxid — e.g. glycine_max, sorghum_bicolor). Locus is the source-genome gene name (e.g. AT1G01010, Glyma.01G000100). Returns organism_name, gene_name, chromosome, gene_start, gene_end, strand, description.

NameTypeReqDescription
locusstringyese.g. AT1G01010 (Arabidopsis), Glyma.01G000100 (soybean)
organismstring|integer–Plant organism — accepts canonical slug (arabidopsis_thaliana), scientific or common name, or NCBI taxid
NameTypeReqDescription
chromosomestringyes–
descriptionstringyes–
gene_endstringyesString — BioMart TSV is untyped
gene_namestringyes–
gene_startstringyesString — BioMart TSV is untyped
organism_namestringyes–
strandstringyesString — typically "1" or "-1"

No examples provided.

plantcyc_locus_info ~297

Fetch metabolic annotation for a locus from PlantCyc / the Plant Metabolic Network (pmn.plantcyc.org; free BioCyc web-services API, no key). Walks gene → enzyme → catalyzed reactions → PlantCyc pathways in the organism's PGDB, returning enzymes[] + reactions[] (id/name) + pathways[] (id/name) — the metabolic-pathway view KEGG and GO don't provide. A non-enzymatic gene (e.g. a transcription factor) returns found=false with empty lists, not an error. reaction_count is the true total even when the lists are capped; pathway_count is too, or null (unknown) when the gene catalyzes more reactions than are walked for pathways. 11 organisms have a PGDB (arabidopsis, rice, maize, soybean, grape, poplar, tomato, barley, sorghum, medicago, brachypodium); wheat is not yet mapped. Defaults to arabidopsis_thaliana (AraCyc, the best-curated); pass organism= for other species.

NameTypeReqDescription
locusstringyese.g. AT3G51240 (Arabidopsis), Os11g0530600 (rice RAP-DB)
organismstring|integer–Plant organism — accepts canonical slug (arabidopsis_thaliana), scientific or common name, or NCBI taxid
NameTypeReqDescription
enzymesarrayyesProduct monomer (enzyme) frame ids
foundbooleanyesTrue if the locus resolved to a metabolic gene
gene_common_name––Gene common name in the PGDB
gene_frame––Resolved PGDB gene frame id
locusstringyes–
organismstringyesCanonical organism slug
orgidstringyesPlantCyc PGDB org id, e.g. ARA (AraCyc)
pathway_count–yesTotal distinct pathways (pre-cap); null (unknown) when the gene catalyzes more reactions than are walked for pathways
pathwaysarrayyes–
reaction_countintegeryesTotal distinct reactions (pre-cap)
reactionsarrayyes–

No examples provided.

resolve_locus_to_uniprot ~262

Resolve a plant locus to its canonical UniProtKB record. Prefers reviewed (Swiss-Prot) entries; falls back to unreviewed (TrEMBL) when no curated record exists (common for non-Arabidopsis plants). organism accepts a canonical slug, scientific/common name, or NCBI taxid (default arabidopsis_thaliana; e.g. oryza_sativa, zea_mays). A gene symbol answers only when it names one locus; a symbol shared by several loci (ARF1) is InvalidArguments listing them. Returns primaryAccession, uniProtkbId, entryType, recommendedName, geneNames, organism, taxonId, sequenceLength, web_url (a link for the client to open; no tool on this server retrieves it). This is the protein-side entry point — pair with InterPro / AlphaFold / Reactome / structural-bio tools.

NameTypeReqDescription
locusstringyese.g. AT1G01010 (Arabidopsis), Os01g0100100 (rice)
organismstring|integer–Plant organism — accepts canonical slug (arabidopsis_thaliana), scientific or common name, or NCBI taxid
NameTypeReqDescription
entryTypestringyese.g. 'UniProtKB reviewed (Swiss-Prot)' or '... (TrEMBL)'
geneNamesarray–Gene symbols, e.g. ['NAC001']
locus_querystringyesThe locus identifier the user asked about
organism––Scientific name
primaryAccessionstringyesUniProt accession, e.g. Q0WV96
recommendedName––Recommended protein name
reviewedbooleanyesTrue if Swiss-Prot (curated)
sequenceLength––Protein length in residues
taxonId––NCBI taxonomy ID
uniProtkbIdstringyesUniProtKB ID, e.g. NAC1_ARATH
upstream_version––UniProt release that produced THIS record, as stated by the upstream's own header (e.g. '2026_02'). null means UniProt did not state one — never that no release exists, and never inferred from a sepa…
web_url––Browser URL for the UniProt entry — a link for the client to open or fetch; no tool on this server dereferences it

No examples provided.

string_interactions ~215

Fetch protein-protein interaction partners from STRING-DB (string-db.org). Accepts either a UniProt accession or a locus identifier. A locus goes to STRING's own resolver, except for wheat, whose STRING proteins carry no locus alias: a wheat locus is resolved via UniProt first. Defaults to arabidopsis_thaliana; pass organism= for other plant species (slug, scientific/common name, or NCBI taxid). Returns first-neighbor partners with the combined STRING score plus per-channel sub-scores (experimental, database, textmining, predicted). The argument was called locus_or_accession before #129; that name is still accepted, deprecated.

NameTypeReqDescription
limitinteger–Number of partners to return
locusstringyesLocus (AT1G01010) or UniProt accession (Q0WV96)
organismstring|integer–Plant organism — accepts canonical slug (arabidopsis_thaliana), scientific or common name, or NCBI taxid
NameTypeReqDescription
accessionstringyesUniProt accession actually queried at STRING
organismstringyesPlant organism canonical slug, e.g. arabidopsis_thaliana
partnersarrayyes–
querystringyesThe locus or accession the user passed
returnedintegeryesRows in this payload (#123)
total––Always null: the upstream returns the top partners asked for and states no total; null means unknown, never zero (#123)
truncated––Always null: without a stated total, truncation is unknown (#123)
upstream_version––STRING release that produced THIS response, — always null today: this backend states no release on its responses; upstream_release(backend='string') reports the release its own endpoint calls current…

No examples provided.

tair_locus_info ~131

Fetch the TAIR curator-vetted Arabidopsis locus summary. Served via BAR/ThaleMine (U Toronto, Global Core Biodata Resource 2023) since TAIR's free per-locus REST API is gated behind a paid Phoenix Bioinformatics subscription. Returns TAIR curator summary + Araport11 computational description + NCBI Gene ID + cross-DB aliases (RefSeq, UniProt, TIGR locus-model IDs). Arabidopsis only. Alias of bar_gene_summary.

NameTypeReqDescription
locusstringyesArabidopsis AGI locus, e.g. AT1G01010
NameTypeReqDescription
agi––AGI primary identifier echoed by ThaleMine, e.g. "AT1G01010"
aliasesarray–Cross-DB aliases from /gaia/aliases/ (RefSeq accessions, UniProt accessions, TIGR locus-model IDs, and TAIR aliases). Empty list if /gaia degraded.
brief_description––Gene.briefDescription — short blurb (often same as full_name)
computational_description––Gene.tairComputationalDescription — Araport11-sourced computed description
curator_summary––Gene.tairCuratorSummary — the TAIR-curated functional summary prose
full_name––Gene name from ThaleMine
locusstringyes–
ncbi_gene_id––NCBI Gene ID from /gaia/aliases/ — None if BAR has no NCBI cross-ref
source_urlstringyesThaleMine endpoint URL for traceability — a link for the client to open or fetch; no tool on this server dereferences it
speciesstringyes–
symbol––Gene symbol, e.g. "NAC001"
synonymsarray–TAIR aliases (CSV from Gene.tairAliases, split on commas + stripped)
tair_locus_id––TAIR locus ID from Gene.secondaryIdentifier, e.g. "locus:2200935"
tair_short_description––Gene.tairShortDescription — TAIR-specific short description

No examples provided.

tf_binding_motifs ~414

Fetch curated transcription-factor DNA binding motifs for a locus from JASPAR (jaspar.elixir.no; free, no key) — the cis-regulatory view. Resolves the locus → UniProt accession + gene symbol, searches JASPAR by symbol scoped to the organism's taxid, then CONFIRMS each candidate by matching the accession against the profile's uniprot_ids. Returns per motif the JASPAR matrix id, TF class/family, assay type (SELEX / ChIP-seq / PBM / DAP-seq), an IUPAC consensus derived from the position-frequency matrix (e.g. CACGTG, the G-box/ABRE core), motif length, PubMed refs, and the SVG sequence_logo and JASPAR web_url — links for the client to fetch; no tool on this server retrieves them. IMPORTANT: JASPAR's name search is fuzzy, so name-similarity hits belonging to a DIFFERENT gene are returned separately in name_only_matches and must NOT be attributed to this locus; only `motifs` is UniProt-confirmed. found=false means the gene has no curated profile (not a TF, or its family is unprofiled for that species) — a normal outcome, not an error. Use jaspar_motif to retrieve the raw matrix for any matrix_id. Coverage is Arabidopsis-heavy (1236 profiles) and thin elsewhere (maize 131, soybean 91, wheat 58, tomato 51, rice 10; Brachypodium and sorghum have none). Defaults to arabidopsis_thaliana; pass organism= for other species.

NameTypeReqDescription
locusstringyese.g. AT2G46830 (Arabidopsis CCA1), Os01g0100100 (rice RAP-DB)
organismstring|integer–Plant organism — accepts canonical slug (arabidopsis_thaliana), scientific or common name, or NCBI taxid
NameTypeReqDescription
accessionstringyesResolved UniProt accession
foundbooleanyesTrue if any profile was UniProt-confirmed for this locus
gene_names_searchedarray–Gene symbols used as JASPAR search keys
locusstringyes–
motif_countintegeryesTotal confirmed profiles (pre-cap)
motifsarray–UniProt-confirmed binding profiles
name_only_matchesarray–Name-similarity hits belonging to a DIFFERENT gene [{matrix_id, name, uniprot_ids}] — not this locus's motifs
returnedintegeryesRows in this payload (#123)
tax_idintegeryesNCBI taxid the JASPAR search was scoped to
totalintegeryesHow many UniProt-confirmed JASPAR profiles exist upstream for this query, all pages (pre-cap) (#123)
truncatedbooleanyesTrue if the motif list was capped
upstream_version––JASPAR release that produced THIS response, — always null today: this backend states no release on its responses; upstream_release(backend='jaspar') reports the release its own endpoint calls current…

No examples provided.

uniprot_id_mapping ~287

Map a batch of gene, transcript or protein IDs to EVERY UniProtKB entry UniProt's own ID mapping service returns, one job for the whole batch. Use it when a question asks for all accessions, or for many IDs at once: resolve_locus_to_uniprot returns one entry per locus (its best search hit), so a gene with several entries loses the rest. from_db names the IDs' source as UniProt does: Ensembl_Genomes for plant gene IDs such as maize Zm00001eb, rice Os01g, wheat TraesCS (the default), Ensembl_Genomes_Transcript, Ensembl_Genomes_Protein, or Araport for Arabidopsis AGIs. Each ID comes back mapped (accessions, each with entry_type and reviewed) or unmapped (UniProt lists it as failed: it maps to no entry). Up to 500 IDs per call; duplicates are collapsed. upstream_version is the UniProt release. Maize RefGen_v4 IDs (Zm00001d) are not in UniProt: translate them first with maize_gene_model_translation.

NameTypeReqDescription
from_dbstring–UniProt's name for the IDs' source database
idsarrayyesIDs from from_db, e.g. ['Zm00001eb326750', 'Zm00001eb181120']
NameTypeReqDescription
countintegeryesDistinct IDs queried (duplicates collapsed)
from_dbstringyesUniProt's name for the source database
mappedintegeryesResults with status mapped
obsolete_count–yesUniProt's obsoleteCount for the job: mapped entries now obsolete
resultsarrayyes–
to_dbstringyesAlways UniProtKB
unmappedintegeryesResults with status unmapped
upstream_version––UniProt release that produced THIS response, as stated by the x-uniprot-release header. null means UniProt did not state one — never that no release exists, and never inferred from a separate metadat…

No examples provided.

upstream_release ~244

Report the release a backend's own release endpoint calls current, for the backends whose answers state none (their tools' upstream_version is always null). It is read by a SEPARATE request at query time, so it is not proof of the release that answered any one call: read it before and after a run, and equal values mean no release changed in between. Never cached. ensembl_plants: the Ensembl Genomes release (e.g. '63'); string: the STRING release ('12.0'); quickgo: the GO annotation load date and the GO ontology date; jaspar: the newest ACTIVE release (several are active at once); kegg: the pathway and genes last-update dates (KEGG has no release number). pdbe, aragwas and europe_pmc publish no data release: release is null and reason says why. Backends whose answers state or pin their release (UniProt, InterPro, PANTHER, AlphaFold, Gramene, ATTED-II, OrthoDB) are not listed: read upstream_version on their answers instead.

NameTypeReqDescription
backendstringyesThe backend whose current release to read
NameTypeReqDescription
backendstringyesThe backend asked about
componentsobjectyesThe release's parts by name, e.g. QuickGO annotation + go dates; {} when null
endpointsarrayyesFull URLs of the release endpoints read, as provenance; [] when the backend publishes none — a link for the client to open or fetch; no tool on this server dereferences it
observed_atstringyesUTC time the endpoints were read (ISO 8601)
reasonstringyesWhat the value is, or why there is none
release–yesThe release its own endpoint calls current at query time — a DIFFERENT request from any data call, so not proof of the release that answered one. null when the backend publishes no data release (see…

No examples provided.

vep_annotate ~250

Predict a variant's molecular consequences with Ensembl VEP (rest.ensembl.org; free, no key). Variant-first (not locus-first): supply an Ensembl region (chr:start-end:strand, e.g. '1:10000-10000:1') and an alternate allele (e.g. 'C'); returns the most-severe consequence plus one row per overlapping transcript (consequence terms, IMPACT, and SIFT when the variant is coding-missense; the polyphen fields stay null, as Ensembl runs PolyPhen for human only). found=false when Ensembl reports no overlapping feature. Works for all 12 organisms. Defaults to arabidopsis_thaliana; pass organism= for other species.

NameTypeReqDescription
allelestringyesAlternate allele, e.g. 'C' (or 'A/C', an insertion, etc.)
organismstring|integer–Plant organism — accepts canonical slug (arabidopsis_thaliana), scientific or common name, or NCBI taxid
regionstringyesEnsembl region chr:start-end:strand, e.g. '1:10000-10000:1'
NameTypeReqDescription
allelestringyesAlternate allele, e.g. 'C'
allele_string–––
assembly_name––Assembly the call is against
end–––
foundbooleanyesTrue if VEP returned an overlapping feature
input––VEP echo of the parsed input
most_severe_consequence––Most severe SO term
organismstringyesResolved Ensembl species slug
regionstringyesEnsembl region, e.g. '1:10000-10000:1'
seq_region_name–––
start–––
transcript_consequencesarray–Per-transcript {gene_id, transcript_id, consequence_terms, impact, sift_*, …}

No examples provided.

Install

How do I install the Plant Genomics MCP server?

Plant Genomics runs locally as a PyPI package, launched with uvx plant-genomics-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

pypi · plant-genomics-mcp

# add to Claude Code
claude mcp add musharna-plant-genomics-mcp -- uvx plant-genomics-mcp
Common questions

What is the Plant Genomics MCP server?

Plant Genomics is an MCP server listed in the public MCP registry as io.github.musharna/plant-genomics-mcp. Plant genomics MCP, 58 tools across 24 backends with cross-source synthesis. This page covers its PyPI package (plant-genomics-mcp).

Is the Plant Genomics MCP server safe to use?

Plant Genomics scores 81 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 4 November 2026. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the Plant Genomics MCP server expose?

Plant Genomics exposes 58 tools: ensembl_plants_lookup_locus, get_gene_xrefs, get_sequence, ensembl_region_query, phytozome_lookup_locus, and 53 more. Their descriptions and schemas cost roughly 13,205 tokens of context every time the server is loaded.

Is the Plant Genomics MCP server still maintained?

Plant Genomics is still listed as active in the MCP registry. We last reached this channel on 4 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the Plant Genomics MCP server under?

Plant Genomics declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.