MCP server for querying UniProt protein database via unipressed
The server provides two well-named, action-oriented tools (search, fetch) with detailed descriptions and complete input schemas. Naming follows verb_noun convention clearly. Both tools have extensive parameter documentation with enum constraints for database selection and response_format. However, output schemas are not formally documented in the source code, descriptions mention return structure in prose but lack explicit JSON Schema definitions. Descriptions are comprehensive (well over 194 char baseline) but include numerous example values that could lead to LLM hallucination. Error handling is not visible in the source provided. Security posture is reasonable (read-only tools, no secrets in params), but permission gates and audit logging are not evident.
Fetch specific protein entries by their UniProt accession IDs. Args: ids: List of UniProt accession IDs to fetch. Examples: - ["P62988"] - Single protein - ["A0A0C5B5G6", "A0A1B0GTW7"] - Multiple proteins database: UniProt database to fetch from. One of: uniprotkb (default), uniparc, uniref fields: Optional list of return fields to include. If not specified, all fields are returned. Available return fields (see https://www.uniprot.org/help/return_fields): Names & Taxonomy: - accession, id, gene_names, gene_primary, gene_synonym, gene_oln, gene_orf - organism_name, organism_id, protein_name, xref_proteomes - lineage, lineage_ids, virus_hosts Sequences: - cc_alternative_products, ft_var_seq, cc_sc_epred, fragment, encoded_in - length, mass, cc_mass_spectrometry, ft_variant, ft_non_cons, ft_non_std - ft_non_ter, cc_polymorphism, cc_rna_editing, sequence, cc_sequence_caution - ft_conflict, ft_unsure, sequence_version Function: - absorption, ft_act_site, cc_activity_regulation, ft_binding, cc_catalytic_activity - cc_cofactor, ft_dna_bind, ec, cc_function, kinetics, cc_pathway - ph_dependence, redox_potential, rhea, ft_site, temp_dependence Miscellaneous: - annotation_score, cc_caution, comment_count, feature_count, keywordid, keyword - cc_miscellaneous, protein_existence, reviewed, tools, uniparc_id Interaction: - cc_interaction, cc_subunit Expression: - cc_developmental_stage, cc_induction, cc_tissue_specificity Gene Ontology (GO): - go_p, go_c, go, go_f, go_id Pathology & Biotech: - cc_allergen, cc_biotechnology, cc_disruption_phenotype, cc_disease - ft_mutagen, cc_pharmaceutical, cc_toxic_dose Subcellular location: - ft_intramem, cc_subcellular_location, ft_topo_dom, ft_transmem PTM / Processing: - ft_chain, ft_crosslnk, ft_disulfid, ft_carbohyd, ft_init_met, ft_lipid - ft_mod_res, ft_peptide, cc_ptm, ft_propep, ft_signal, ft_transit Structure: - structure_3d, ft_strand, ft_helix, ft_turn Publications: - lit_pubmed_id Date: - date_created, date_modified, date_sequence_modified, version Family & Domains: - ft_coiled, ft_compbias, cc_domain, ft_domain, ft_motif, protein_families - ft_region, ft_repeat, ft_zn_fing Cross-references: - See https://www.uniprot.org/help/return_fields for cross-reference fields response_format: Response format. One of: 'json' (default) or 'toon'. - 'json': Returns response in JSON format - 'toon': Returns response in TOON format Returns: When response_format='json': JSON object with: - results: Array of matching protein entries - notFound: Array of IDs that were not found (if any) When response_format='toon': TOON-formatted string with: - results: Array of matching protein entries - notFound: Array of IDs that were not found (if any)
Output schemas not formally documented. Descriptions include prose return structure ('Returns: When response_format=json: JSON object with: results, total, nextCursor') but no explicit JSON Schema definitions visible in code. LLMs cannot reliably parse or chain on outputs without formal schema.
Descriptions contain numerous example values (accession:P62988, organism_id:9606, lit_author:ashburner, inchikey:WQZGKKKJIJFFOK-GASJEMHNSA-N, etc.). LLMs tend to reuse example values literally rather than adapt to context, risking malformed queries passed to UniProt API.
Error handling logic not visible in provided source. No guidance on recovery from invalid queries, API timeouts, or malformed pagination cursors. LLMs receive no direction on how to self-correct if a search fails.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 54 | 2026-07-28+ | v2 |
Search the UniProt protein database using query syntax. Args: query: UniProt query string. Examples: - gene:BRCA1 - Search by gene name - organism_id:9606 - Human proteins (NCBI taxonomy ID) - (gene:BRCA*) AND (organism_id:10090) - Mouse BRCA genes with wildcard - length:[500 TO 700] - Proteins of specific length range - keyword:kinase - By UniProt keyword - family:serpin - By protein family - ec:3.2.1.23 - By enzyme classification - database:pfam - With Pfam cross-references - reviewed:true - Only Swiss-Prot reviewed entries Available query fields (see https://www.uniprot.org/help/query-fields): - accession: Primary/canonical isoform accessions (e.g., accession:P62988) - active: Active/obsolete status (e.g., active:false) - lit_author: Reference author (e.g., lit_author:ashburner) - protein_name: Protein name (e.g., protein_name:CD233) - chebi: ChEBI identifier (e.g., chebi:18420) - xrefcount_pdb: Cross-reference count (e.g., xref_count_pdb:[20 TO *]) - date_created: Creation date (e.g., date_created:[2012-10-01 TO *]) - date_modified: Last modification date (e.g., date_modified:[2012-01-01 TO 2019-03-01]) - date_sequence_modified: Sequence modification date (e.g., date_sequence_modified:[2012-01-01 TO 2012-03-01]) - database: Database cross-reference (e.g., database:pfam) - xref: Cross-reference (e.g., xref:pdb-1aut) - ec: Enzyme Commission number (e.g., ec:3.2.1.23) - existence: Protein existence level (e.g., existence:3) - family: Protein family (e.g., family:serpin) - fragment: Fragment status (e.g., fragment:true) - gene: Gene name (e.g., gene:HPSE) - gene_exact: Exact gene name (e.g., gene_exact:HPSE) - go: Gene Ontology term (e.g., go:0015629) - virus_host_name: Virus host name - virus_host_id: Virus host ID (e.g., virus_host_id:10090) - accession_id: Primary accession (e.g., accession_id:P00750) - inchikey: InChIKey identifier (e.g., inchikey:WQZGKKKJIJFFOK-GASJEMHNSA-N) - interactor: Interacting protein (e.g., interactor:P00520) - keyword: Keyword (e.g., keyword:toxin or keyword:KW-0800) - length: Sequence length range (e.g., length:[500 TO 700]) - mass: Molecular mass range (e.g., mass:[500000 TO *]) - cc_mass_spectrometry: Mass spectrometry method (e.g., cc_mass_spectrometry:maldi) - encoded_in: Gene location (e.g., encoded_in:Mitochondrion) - organism_name: Organism name (e.g., organism_name:"Ovis aries") - organism_id: Organism taxonomy ID (e.g., organism_id:9940) - plasmid: Plasmid name (e.g., plasmid:ColE1) - proteome: Proteome ID (e.g., proteome:UP000005640) - proteomecomponent: Proteome component (e.g., proteomecomponent:"chromosome 1") - sec_acc: Secondary accession (e.g., sec_acc:P02023) - reviewed: Reviewed status (e.g., reviewed:true) - scope: Reference scope (e.g., scope:mutagenesis) - sequence: Sequence identifier (e.g., accession:P05067-9 AND is_isoform:true) - strain: Organism strain (e.g., strain:wistar) - taxonomy_name: Taxonomy name (e.g., taxonomy_name:mammal) - taxonomy_id: Taxonomy ID (e.g., taxonomy_id:40674) - tissue: Tissue type (e.g., tissue:liver) - cc_webresource: Web resource (e.g., cc_webresource:wikipedia) database: UniProt database to search. One of: uniprotkb (default), uniparc, uniref limit: Maximum number of results per page (1-100, default 10) fields: Optional list of return fields to include. If not specified, all fields are returned. Available return fields (see https://www.uniprot.org/help/return_fields): Names & Taxonomy: - accession, id, gene_names, gene_primary, gene_synonym, gene_oln, gene_orf - organism_name, organism_id, protein_name, xref_proteomes - lineage, lineage_ids, virus_hosts Sequences: - cc_alternative_products, ft_var_seq, cc_sc_epred, fragment, encoded_in - length, mass, cc_mass_spectrometry, ft_variant, ft_non_cons, ft_non_std - ft_non_ter, cc_polymorphism, cc_rna_editing, sequence, cc_sequence_caution - ft_conflict, ft_unsure, sequence_version Function: - absorption, ft_act_site, cc_activity_regulation, ft_binding, cc_catalytic_activity - cc_cofactor, ft_dna_bind, ec, cc_function, kinetics, cc_pathway - ph_dependence, redox_potential, rhea, ft_site, temp_dependence Miscellaneous: - annotation_score, cc_caution, comment_count, feature_count, keywordid, keyword - cc_miscellaneous, protein_existence, reviewed, tools, uniparc_id Interaction: - cc_interaction, cc_subunit Expression: - cc_developmental_stage, cc_induction, cc_tissue_specificity Gene Ontology (GO): - go_p, go_c, go, go_f, go_id Pathology & Biotech: - cc_allergen, cc_biotechnology, cc_disruption_phenotype, cc_disease - ft_mutagen, cc_pharmaceutical, cc_toxic_dose Subcellular location: - ft_intramem, cc_subcellular_location, ft_topo_dom, ft_transmem PTM / Processing: - ft_chain, ft_crosslnk, ft_disulfid, ft_carbohyd, ft_init_met, ft_lipid - ft_mod_res, ft_peptide, cc_ptm, ft_propep, ft_signal, ft_transit Structure: - structure_3d, ft_strand, ft_helix, ft_turn Publications: - lit_pubmed_id Date: - date_created, date_modified, date_sequence_modified, version Family & Domains: - ft_coiled, ft_compbias, cc_domain, ft_domain, ft_motif, protein_families - ft_region, ft_repeat, ft_zn_fing Cross-references: - See https://www.uniprot.org/help/return_fields for cross-reference fields cursor: Pagination cursor from a previous search result's 'nextCursor' field. Pass this to retrieve the next page of results. response_format: Response format. One of: 'json' (default) or 'toon'. - 'json': Returns response in JSON format - 'toon': Returns response in TOON format Returns: When response_format='json': JSON object with: - results: Array of matching protein entries - total: Total number of matching entries (if available) - nextCursor: Cursor string for retrieving the next page (if more results exist) When response_format='toon': TOON-formatted string with: - results: Array of matching protein entries - total: Total number of matching entries (if available) - nextCursor: Cursor string for retrieving the next page (if more results exist) See https://www.uniprot.org/help/query-fields for full query syntax documentation.
'fields' parameter in both tools accepts arbitrary list of field names without validation or enum constraints. LLM could pass invalid field names. Description references external docs (https://www.uniprot.org/help/return_fields) but does not constrain valid values in schema.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) visible. While both tools are read-only and safe to retry, annotations would help LLM reasoning about safety and retry strategies.