MCP Server for fetching protein information from UniProt database
UniProtMCPServer has well-structured tool names (all verb-noun format: search_uniprot, get_protein_*) and complete input schemas with proper types. However, descriptions are generic and lack LLM-optimization guidance. Parameter descriptions are minimal (e.g., 'The UniProt identifier (e.g., P12345)' repeats across 4 tools). Output schemas are not documented, LLMs cannot predict response structure. Error handling returns raw HTTP status codes without recovery guidance. No parameter constraints (enums, ranges, patterns) despite domain-specific valid values. Tools lack idempotency hints and do not document when to use each variant (e.g., when to call get_protein_sequences vs get_protein_by_id). Baseline: avg tool description ~60 chars (well below 194-char production baseline); zero param descriptions beyond the name.
Retrieve detailed information about a protein by UniProt ID. Parameters: - uniprot_id: The UniProt identifier (e.g., P12345)
Retrieve the functional annotations of a protein by UniProt ID. Parameters: - uniprot_id: The UniProt identifier (e.g., P12345)
Retrieve the amino acid sequence of a protein by UniProt ID. Parameters: - uniprot_id: The UniProt identifier (e.g., P12345)
Retrieve structure information (PDB IDs) related to a protein by UniProt ID. Parameters: - uniprot_id: The UniProt identifier (e.g., P12345)
Search for proteins in the UniProt database. Parameters: - query: Search query (e.g., protein name, gene name, or UniProt ID) - limit: Maximum number of results to return (default: 10)
Output schemas not documented. LLMs cannot predict response structure (e.g., search_uniprot returns list of dicts, but fields are not specified; get_protein_functions returns {uniprot_id, name, functions} but 'functions' array structure is undocumented).
Error handling returns raw HTTP status codes without recovery guidance. E.g., 'Failed to fetch data: 404' tells LLM nothing about whether to retry, search differently, or ask user. No error classification (retryable vs user-fixable vs fatal).
Parameter descriptions are minimal and repetitive. 'The UniProt identifier (e.g., P12345)' appears identically in 4 tools. No guidance on format constraints, valid ranges, or when to use each tool variant. Baseline: production tools average 72 chars per param description; these are ~40 chars.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 47 | 2026-07-28+ | v2 |
No pagination support. search_uniprot accepts 'limit' but no offset/cursor or total_count in response. Large result sets will blow context window. Baseline: production tools with list results include pagination metadata.
Tool composition unclear. Four separate get_protein_* tools all fetch from the same endpoint and parse different fields. No guidance on which to call first or how they chain. LLM must reason about tool selection without clear differentiation.