uniprot-link
This server provides a Model Context Protocol (MCP) and REST API for structured access to UniProt protein and taxonomy data, including direct SPARQL querying and curated examples from the UniProt SPARQL knowledge base.
Discovery & Configuration
get_server_capabilities— Retrieve the full discovery surface: tool list with signatures, named graphs, SPARQL prefix map, error taxonomy, and limits.
SPARQL Query Execution
run_sparql_query— Execute any SPARQL 1.1 query (SELECT, ASK, CONSTRUCT, DESCRIBE), including federated queries to Rhea, OMA, Bgee, etc. Supports multiple output formats (JSON, XML, CSV, TSV, Turtle, etc.) and auto-injects LIMIT on unbounded SELECTs.
Example Query Catalog
search_example_queries— Search UniProt's 126 curated SPARQL example queries by free text.get_example_query— Fetch the full SPARQL text, description, keyword tags, and federated endpoints for a specific example.
Protein Search & Lookup
find_proteins— Search UniProtKB by gene symbol, organism, keyword, EC number, or mnemonic.find_proteins_batch— Resolve multiple gene symbols to UniProtKB entries concurrently in a single call.get_protein— Retrieve the core summary for a UniProtKB entry by accession (mnemonic, names, genes, organism, sequence length/mass, function, etc.).
Protein Detail Tools
get_protein_sequence— Fetch canonical and isoform amino-acid sequences with length and mass; supports preview mode.get_protein_features— Return sequence features with FALDO coordinates (domains, transmembrane segments, binding/active sites, PTMs, signal peptides, etc.).get_protein_variants— Return natural-variant annotations including position, residue substitution, HGVS notation, disease links, and dbSNP rsIDs; filterable to disease-associated variants only.get_protein_diseases— Return disease annotations with disease name, UniProt disease ID, MIM ID, clinical definition, and involvement notes.get_protein_go_terms— Return Gene Ontology annotations grouped by aspect (biological process, molecular function, cellular component) with GO IDs, labels, and evidence codes.get_protein_cross_references— Return all database cross-references grouped by database (PDB, AlphaFoldDB, Ensembl, RefSeq, Reactome, STRING, InterPro, DrugBank, etc.).
Identifier Mapping & Taxonomy
map_identifiers— Map a UniProtKB accession to primary external identifiers (PDB, AlphaFoldDB, Ensembl, RefSeq, GeneID, HGNC, KEGG, Pfam, InterPro, etc.).get_taxon— Resolve an organism by NCBI taxon ID or scientific/common name; returns scientific name, rank, parent taxon, and optional full lineage.
Agentic Affordances: Every response includes _meta.next_commands with suggested follow-up tool calls, and the server provides a structured error taxonomy for robust agent-driven workflows.
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., "@uniprot-linkfind proteins related to 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.
uniprot-link
An MCP server (Streamable HTTP) that grounds protein research in the UniProt SPARQL
endpoint (https://sparql.uniprot.org/sparql) — a QLever-backed SPARQL 1.1 service
over ~232 billion triples in 21 named graphs. It exposes intent-named, token-economical
tools, a guarded raw-SPARQL escape hatch, and UniProt's curated example queries.
Research use only. Not clinical decision support. Do not use for diagnosis, treatment, triage, or patient management.
Why
UniProt's SPARQL endpoint can answer questions no REST route can — cross-graph joins
over sequence features, variants, diseases, GO terms, taxonomy and cross-references —
but it is a hostile surface to write against. QLever is very fast on bound joins and
falls off a cliff on shapes that look harmless: property paths inside OPTIONAL,
GROUP_CONCAT over large literals, ORDER BY before LIMIT. The failure mode is not
an error, it is a 45-minute server timeout.
This server carries that discipline so the model does not have to. The typed tools
compile to anchored, timeout-safe queries; search_sparql_query admits only bounded
SELECT/ASK (CONSTRUCT/DESCRIBE and SERVICE federation are rejected, and a
LIMIT is auto-injected into unbounded SELECTs); and UniProt's curated example queries
are searchable and executable, so an agent learns the data model instead of guessing
IRIs. Every response carries _meta.next_commands — ready-to-run {tool, arguments}
steps — plus a structured error taxonomy.
Related MCP server: TogoMCP
Quick start
The GeneFoundry instance is hosted — no install required:
claude mcp add --transport http uniprot-link https://uniprot-link.genefoundry.org/mcpTo run your own (Python 3.12+, uv):
make install # uv sync --group dev
make dev # unified: REST on / and MCP on /mcp, port 8000
claude mcp add --transport http uniprot-link --scope user http://127.0.0.1:8000/mcpThere is no data build step — every call queries the live endpoint, which needs no
authentication. Do set UNIPROT_LINK_SPARQL__CONTACT_EMAIL to a mailbox you read:
UniProt asks programmatic clients to identify themselves in the User-Agent.
Tools
Tool | Purpose |
| Discovery surface: tool inventory, named graphs, prefixes, formats, workflows, limits |
| Execute a bounded SELECT/ASK SPARQL query (the power tool) |
| Search UniProt's curated, executable example queries |
| Full SPARQL text and metadata of one curated example |
| Search UniProtKB by gene symbol / organism / keyword / EC number / mnemonic |
| Resolve several gene symbols to entries concurrently in one call |
| Core entry summary for one accession |
| Canonical and isoform sequences |
| Sequence features with FALDO begin/end coordinates |
| Natural-variant annotations |
| Disease annotations |
| Cross-references grouped by database (PDB, Ensembl, RefSeq, …) |
| GO annotations grouped by aspect, with evidence codes |
| Resolve an accession to its primary external database ids |
| Resolve an organism by NCBI taxon id or name |
Leaf names are unprefixed per the GeneFoundry Tool-Naming Standard v1:
serverInfo.name is uniprot-link and the canonical gateway namespace token is
uniprot, so behind the
genefoundry-router the tools surface
as uniprot_<tool> (e.g. uniprot_find_proteins). Standalone MCP clients namespace
them as mcp__uniprot-link__<tool>.
Data & provenance
All data comes live from the UniProt SPARQL endpoint —
there is no local mirror and no snapshot, so freshness tracks UniProt's release cycle
directly. The release the query builders and the named-graph inventory were validated
against is pinned in uniprot_link/services/constants.py and reported by
get_server_capabilities. The curated examples come from UniProt's upstream
sparql-examples graph.
UniProt data is licensed CC BY 4.0. Cite it, verbatim (also served at
uniprot://citation):
The UniProt Consortium. UniProt: the Universal Protein Knowledgebase in 2025. Nucleic Acids Res. 2025;53(D1):D609-D617. doi:10.1093/nar/gkae1010
Documentation
Usage — the CLI, typical workflows,
search_sparql_queryrules, and theuniprot://discovery resources.Configuration — every
UNIPROT_LINK_*variable, the two transports, and the Host / Origin / CORS allowlists.Deployment — containers, the production overlays, the reverse-proxy boundary, and the build-provenance release gate.
Architecture — the layer map, the response contract, and why QLever shapes the design.
Development — setup, quality gates, and re-validating a query builder live.
AGENTS.md — engineering conventions, including the SPARQL / QLever discipline.
Contributing
See AGENTS.md for conventions. make ci-local is the
definition-of-done gate: format, lint, line budget, README standard, mypy, and tests.
Changes to the query builders in uniprot_link/services/queries/ must be re-validated
against the live endpoint with research/verify_queries.py.
License
Code: MIT © Bernt Popp. Data: UniProt is licensed CC BY 4.0 by the UniProt Consortium and requires the citation above.
Available Tools
15 toolsfind_proteinsFind ProteinsARead-onlyIdempotent
Search UniProtKB by structured filters and return matching entries (accession, mnemonic, recommended name, reviewed flag, organism). Requires at least one anchor: gene symbol, mnemonic, EC number, keyword (KW-id or label), OR organism_taxon together with name_contains (matched per word, in any order, case-insensitive). Reviewed (Swiss-Prot) hits are ranked first. UniProt SPARQL has no general full-text index, so for broad text use search_example_queries or run_sparql_query. Pair with get_protein for full detail. Results are ordered reviewed-first, then by mnemonic, then accession (stable across pages). Cold search can take several seconds; an identical repeat is cached (~0 ms). If you already know the accession, call get_protein directly -- it is far faster than a cold search. Signature: find_proteins(gene=, organism_taxon=, reviewed=, keyword=, ec_number=, mnemonic=, name_contains=, limit=, offset=).
| Name | Required | Description | Default |
|---|---|---|---|
| gene | No | Gene symbol, e.g. BRCA1. | |
| organism_taxon | No | NCBI taxon id, e.g. 9606 for human. | |
| reviewed | No | True = Swiss-Prot only; False = TrEMBL only. | |
| keyword | No | UniProt keyword (KW-id like KW-0007, or a label). | |
| ec_number | No | EC number, e.g. 2.7.11.1. | |
| mnemonic | No | Entry mnemonic, e.g. BRCA1_HUMAN. | |
| name_contains | No | Words to match in the recommended protein name. Multi-word input matches per word (each word must appear, in any order), so 'polynucleotide kinase' matches 'Bifunctional polynucleotide phosphatase/kinase'. Case-insensitive. | |
| limit | No | Max results per page. | |
| offset | No | Pagination offset. |
Output Schema
| Name | Required | Description |
|---|---|---|
| success | No | |
| _meta | No | |
| error_code | No | |
| message | No | |
| retryable | No | |
| recovery_action | No | |
| field | No | |
| allowed_values | No | |
| hint | No | |
| count | No | |
| proteins | No | |
| truncated | No | |
| reviewed_count | No | |
| reviewed_hint | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds performance details (cold search vs cached) and result ordering beyond what annotations provide, with 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 dense but every sentence serves a purpose, front-loading the main action and then detailing requirements, behavior, and alternatives.
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 parameters, output schema presence, and sibling tools, the description covers all necessary context: use cases, prerequisites, behavior, performance, and relationships.
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?
With 100% schema coverage, the description still adds significant value by explaining constraint logic (e.g., name_contains matches per word), providing examples, and listing required anchors.
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 searches UniProtKB with structured filters, lists the return fields, and distinguishes from sibling tools like search_example_queries, run_sparql_query, and get_protein.
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 states prerequisites (at least one anchor), provides detailed alternatives for different use cases (broad text or known accession), and explains ordering and caching behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_proteins_batchFind Proteins (Batch)ARead-onlyIdempotent
Resolve SEVERAL gene symbols to UniProtKB entries in ONE call, running the lookups concurrently -- so N genes cost about one cold round-trip instead of N sequential ones. Use this for multi-gene tasks (e.g. 'get domains for PNKP and NAA10'). Returns by_gene (gene -> accessions, reviewed-first), a flat proteins list tagged with matched_gene, resolved_genes, and unresolved_genes (a symbol that matched nothing is disclosed, never silently dropped). Optionally scope by organism_taxon and reviewed. next_commands fan out to get_protein on each resolved gene's top hit. For a single gene use find_proteins. Signature: find_proteins_batch(genes, organism_taxon=, reviewed=, limit_per_gene=).
| Name | Required | Description | Default |
|---|---|---|---|
| genes | Yes | Gene symbols to resolve, e.g. ['PNKP','NAA10']. | |
| organism_taxon | No | NCBI taxon id, e.g. 9606 for human. | |
| reviewed | No | True = Swiss-Prot only; False = TrEMBL only. | |
| limit_per_gene | No | Max entries per gene (default 5). |
Output Schema
| Name | Required | Description |
|---|---|---|
| success | No | |
| _meta | No | |
| error_code | No | |
| message | No | |
| retryable | No | |
| recovery_action | No | |
| field | No | |
| allowed_values | No | |
| hint | No | |
| gene_count | No | |
| count | No | |
| by_gene | No | |
| proteins | No | |
| resolved_genes | No | |
| unresolved_genes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive. Description adds significant behavioral details: concurrent lookups, return structure (by_gene with matched_gene, resolved_genes, unresolved_genes), and that unresolved symbols are disclosed, never silently dropped. No contradiction 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?
Description is concisely structured: front-loaded with purpose and concurrency benefit, then usage example, return details, optional scoping, and sibling differentiation. Every sentence earns its place with no fluff.
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, rich annotations, and an output schema, the description is fully complete. It covers purpose, usage, behavioral details, parameter context, return structure, and next steps. No gaps identified.
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 the description adds substantial meaning beyond it: explains concurrency benefit, clarifies return structure, and provides a signature line. Parameter descriptions in schema are clear, but description contextualizes them (e.g., limit_per_gene default and max).
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 several gene symbols to UniProtKB entries in one call, using strong verb-resource 'Resolve SEVERAL gene symbols to UniProtKB entries' and explicitly distinguishes from sibling 'find_proteins' by noting batch vs single gene usage.
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 gives explicit usage guidelines: use for multi-gene tasks (e.g., 'get domains for PNKP and NAA10'), states that for a single gene use find_proteins, and provides next_commands direction (fan out to get_protein).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_example_queryGet Example QueryARead-onlyIdempotent
Fetch one curated example's full SPARQL text, description, keyword tags, and any federated endpoints it joins. Pass an example_id (full IRI) from search_example_queries. _meta.next_commands offers to run it directly via run_sparql_query. Signature: get_example_query(example_id).
| Name | Required | Description | Default |
|---|---|---|---|
| example_id | Yes | Full example IRI from search_example_queries. |
Output Schema
| Name | Required | Description |
|---|---|---|
| success | No | |
| _meta | No | |
| error_code | No | |
| message | No | |
| retryable | No | |
| recovery_action | No | |
| field | No | |
| allowed_values | No | |
| hint | No | |
| example_id | No | |
| description | No | |
| query | No | |
| query_type | No | |
| keywords | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, and openWorldHint=true, so the safety profile is clear. The description adds value by specifying exactly what the tool fetches (SPARQL text, description, keywords, federated endpoints) and revealing that `_meta.next_commands` offers a follow-up action to run the query. No contradictory information.
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 with no redundancy. The first sentence states the purpose and return fields; the second sentence provides usage instructions and a hint about next steps. 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?
Given the low complexity (one parameter), rich annotations covering safety, and the presence of an output schema (so return format need not be described), the description is complete. It covers what the tool returns, how to get the ID, and a natural next step via _meta.next_commands.
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% for the single parameter, but the description adds the critical guidance that the example_id should be a full IRI from search_example_queries, which is not in the schema description. This helps the agent understand how to obtain a valid value.
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 uses a specific verb 'Fetch' and identifies the resource as 'one curated example's full SPARQL text, description, keyword tags, and any federated endpoints.' It also distinguishes from the sibling tool 'search_example_queries' by stating that an example_id must come from that 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 instructs to pass an example_id from search_example_queries and mentions that `_meta.next_commands` offers an alternative to run it via run_sparql_query. This provides clear context for when to use the tool and a hint about an alternative, though it does not explicitly state 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_proteinGet ProteinARead-onlyIdempotent
Return the core summary for a single UniProtKB entry by accession: mnemonic, reviewed flag, recommended/short name, gene(s), organism + taxon, protein existence, sequence length and mass, a function summary, and creation/modification dates, plus has_variants/has_diseases/has_structure presence flags that drive content-aware next_commands. An obsolete/demerged accession returns a flagged obsolete record (obsolete:true + replaced_by). response_mode (default compact) controls verbosity; standard/full add the created/modified dates. Signature: get_protein(accession, response_mode=).
| Name | Required | Description | Default |
|---|---|---|---|
| accession | Yes | UniProtKB accession, e.g. P05067 (isoforms like P05067-2 accepted). | |
| response_mode | No | Verbosity: minimal | compact | standard | full (default compact). | compact |
Output Schema
| Name | Required | Description |
|---|---|---|
| success | No | |
| _meta | No | |
| error_code | No | |
| message | No | |
| retryable | No | |
| recovery_action | No | |
| field | No | |
| allowed_values | No | |
| hint | No | |
| accession | No | |
| requested_accession | No | |
| mnemonic | No | |
| reviewed | No | |
| recommended_name | No | |
| genes | No | |
| organism | No | |
| taxon_id | No | |
| sequence_length | No | |
| mass_da | No | |
| obsolete | No | |
| replaced_by | No | |
| has_variants | No | |
| has_diseases | No | |
| has_structure | No | |
| isoform | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond annotations by explaining behavior for obsolete/demerged accessions (obsolete flag and replaced_by field) and detailing the response_mode parameter's effect on verbosity and included dates. 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 a single, dense sentence that efficiently conveys all necessary information. It could be slightly more structured, but it remains concise and 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 complexity (two parameters, output schema, rich annotations), the description is highly complete. It covers edge cases (obsolete accessions), response modes, and flags for guiding next steps.
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?
Although the schema has 100% coverage, the description adds context by providing an example accession, explaining the response_mode enum values (minimal, compact, standard, full) and their impact on output.
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 returns the core summary for a single UniProtKB entry by accession, listing specific fields. It distinguishes from sibling tools that focus on specific aspects (e.g., get_protein_sequence, get_protein_variants).
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 core summary data and mentions flags that drive next commands, but it does not explicitly state when to use this tool versus alternatives or 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_protein_cross_referencesGet Protein Cross-ReferencesARead-onlyIdempotent
Return database cross-references for an entry, grouped by database (PDB, AlphaFoldDB, Ensembl, RefSeq, Reactome, STRING, InterPro, ...). Optionally restrict to specific databases (case-sensitive); any requested name that matched nothing is echoed under unmatched_databases with a did-you-mean, so a typo never reads as 'no data'. response_mode (default compact) returns short ids; full restores raw IRIs. Returns every cross-reference database; use map_identifiers for a focused primary-id mapping. Signature: get_protein_cross_references(accession, databases=, response_mode=).
| Name | Required | Description | Default |
|---|---|---|---|
| accession | Yes | UniProtKB accession, e.g. P05067 (isoforms like P05067-2 accepted). | |
| databases | No | Database short names to keep (omit for all). | |
| response_mode | No | Verbosity: minimal | compact | standard | full (default compact). | compact |
Output Schema
| Name | Required | Description |
|---|---|---|
| success | No | |
| _meta | No | |
| error_code | No | |
| message | No | |
| retryable | No | |
| recovery_action | No | |
| field | No | |
| allowed_values | No | |
| hint | No | |
| accession | No | |
| database_count | No | |
| total | No | |
| counts | No | |
| by_database | No | |
| truncated_databases | No | |
| requested_databases | No | |
| unmatched_databases | No | |
| database_hint | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnly, idempotent), description adds grouping by database, case-sensitive filtering, unmatched databases echoed with did-you-mean, and response mode effects. No contradiction 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?
Three sentences plus signature, no waste. Purpose front-loaded. 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?
With output schema present, description completes the picture: explains all parameters, behavior, and sibling differentiation. No 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?
Schema coverage is 100%, baseline 3. Description adds meaning: explains response_mode returns short ids vs full IRIs, and databases parameter case-sensitivity with typo handling. Accession example given. Adds value beyond 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?
Clearly states 'Return database cross-references for an entry, grouped by database', specifying verb and resource. Distinguishes from sibling 'map_identifiers' by directing focused mapping elsewhere.
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?
Provides context on optional restriction to specific databases with case-sensitivity and typo handling. Contrasts with map_identifiers for focused mapping. Could be more explicit about when not to use, but sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_protein_diseasesGet Protein DiseasesARead-onlyIdempotent
Return disease annotations associated with an entry: disease name, UniProt disease id, mnemonic, MIM id, the clinical definition (the disease vocabulary's own description), and involvement (the entry-specific note). Pairs with get_protein_variants for variant-level disease evidence. Signature: get_protein_diseases(accession).
| Name | Required | Description | Default |
|---|---|---|---|
| accession | Yes | UniProtKB accession, e.g. P05067 (isoforms like P05067-2 accepted). |
Output Schema
| Name | Required | Description |
|---|---|---|
| success | No | |
| _meta | No | |
| error_code | No | |
| message | No | |
| retryable | No | |
| recovery_action | No | |
| field | No | |
| allowed_values | No | |
| hint | No | |
| accession | No | |
| count | No | |
| diseases | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, non-destructive, idempotent behavior; description adds value by detailing output fields and pairing suggestion, 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?
Two sentences, front-loaded with purpose, efficient and 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?
With output schema present, description explains return fields adequately; single parameter and clear purpose make it 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 coverage is 100% with parameter description already including example; description does not add new semantics 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?
Description clearly states the tool returns disease annotations with specific fields listed (name, UniProt id, etc.) and distinguishes from sibling tool get_protein_variants.
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 pairs with get_protein_variants for variant-level evidence, providing clear context, though no explicit when-not-to-use is stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_protein_featuresGet Protein FeaturesARead-onlyIdempotent
Return sequence features with begin/end coordinates (FALDO) for an entry: domains, regions, transmembrane segments, binding/active sites, PTMs, signal peptides, secondary structure, mutagenesis sites, and more. feature_types=['domain'] returns positional domain extents; each returned type round-trips to the filter vocabulary. Filter keys come from capabilities (feature_types); a zero-match filter echoes the accepted keys as a filter_hint. Secondary-structure features (helix/strand/turn) are hidden by default and disclosed under excluded_secondary_structure; set include_secondary_structure=true (or name them in feature_types) to return them. Signature: get_protein_features(accession, feature_types=, limit=, include_secondary_structure=).
| Name | Required | Description | Default |
|---|---|---|---|
| accession | Yes | UniProtKB accession, e.g. P05067 (isoforms like P05067-2 accepted). | |
| feature_types | No | Feature-type keys to keep (omit for all). | |
| limit | No | Max features to return (default 200). | |
| include_secondary_structure | No | Include helix/strand/turn features (hidden by default). |
Output Schema
| Name | Required | Description |
|---|---|---|
| success | No | |
| _meta | No | |
| error_code | No | |
| message | No | |
| retryable | No | |
| recovery_action | No | |
| field | No | |
| allowed_values | No | |
| hint | No | |
| accession | No | |
| count | No | |
| features | No | |
| filter_hint | No | |
| truncated | No | |
| excluded_secondary_structure | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, and openWorldHint=true. The description adds behavioral details: features use FALDO coordinates, secondary-structure features are hidden by default and disclosed under excluded_secondary_structure, and filter behavior for zero matches. No 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 front-loaded with the core purpose, then efficiently explains filtering and default behaviors. Every sentence adds value; no redundancy or fluff. It is concise yet comprehensive.
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 presence of an output schema (not shown but noted in context), the description covers all necessary aspects: coordinate system, feature types, filtering, secondary structure handling, and the signature. It is complete for a tool of this 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%, but the description adds meaning: for feature_types, it explains that each returned type round-trips to the filter vocabulary and describes the zero-match filter behavior. For include_secondary_structure, it clarifies that secondary structure is hidden by default. The signature line also provides a quick overview.
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 sequence features with coordinates, listing many specific feature types (domains, regions, PTMs, etc.). It uses strong verbs ('Return') and names the resource ('features for an entry'), distinguishing it from sibling tools like get_protein_sequence or get_protein.
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 tells how to use the tool: filter by feature_types, set include_secondary_structure, and notes that secondary structure is hidden by default. It provides context for filtering behavior ('zero-match filter echoes accepted keys'). However, it does not explicitly contrast with alternative tools for retrieving protein data, though siblings are listed separately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_protein_go_termsGet Protein GO TermsARead-onlyIdempotent
Return Gene Ontology annotations for an entry, grouped by aspect (biological_process / molecular_function / cellular_component) where available, each with GO id, label, and (when annotated) ECO evidence ids plus mapped GO evidence_codes (IDA/IEA/IMP/...) for citation. Always returns count and count_by_aspect; pass aspect to scope to one ontology and limit to cap a large set (token economy). Signature: get_protein_go_terms(accession, aspect=, limit=).
| Name | Required | Description | Default |
|---|---|---|---|
| accession | Yes | UniProtKB accession, e.g. P05067 (isoforms like P05067-2 accepted). | |
| aspect | No | Restrict to one GO aspect (omit for all). | |
| limit | No | Max terms to return (0 = all). |
Output Schema
| Name | Required | Description |
|---|---|---|
| success | No | |
| _meta | No | |
| error_code | No | |
| message | No | |
| retryable | No | |
| recovery_action | No | |
| field | No | |
| allowed_values | No | |
| hint | No | |
| accession | No | |
| count | No | |
| by_aspect | No | |
| count_by_aspect | No | |
| truncated | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true, destructiveHint=false, idempotentHint=true, openWorldHint=true. The description adds that it 'always returns `count` and `count_by_aspect`' and details evidence fields, enhancing transparency 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?
A single sentence packed with essential information, front-loaded with the main action, followed by structured details and a signature. No extraneous 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 3 parameters, existence of an output schema, and no nested objects, the description fully covers behavior, return structure, and parameter usage. It is complete for an AI agent to use 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%, so baseline is 3. The description adds value by explaining the 'token economy' for limit, grouping by aspect, and providing a signature example, elevating it to 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 explicitly states 'Return Gene Ontology annotations for an entry, grouped by aspect...' with specific output fields (GO id, label, evidence ids). This clearly distinguishes it from sibling tools like get_protein or get_protein_features.
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 advises to 'pass `aspect` to scope to one ontology and `limit` to cap a large set (token economy),' providing clear usage guidance. It does not explicitly exclude scenarios but gives contextual advice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_protein_sequenceGet Protein SequenceARead-onlyIdempotent
Return the amino-acid sequence(s) for an entry: the canonical isoform (length, mass, sequence) plus any additional (non-canonical) isoforms. Pass a canonical accession for all isoforms, or an isoform accession (e.g. P05067-2) to get THAT isoform's specific sequence and mass. response_mode controls verbosity: minimal=metadata only; compact (default)=length/mass + a first/last-30-residue sequence_preview (sequence_truncated:true) — cheap for large proteins; standard/full return the complete sequence string. Set canonical_only=true to return only the canonical isoform (skip the additional-isoform list). Signature: get_protein_sequence(accession, response_mode=, canonical_only=).
| Name | Required | Description | Default |
|---|---|---|---|
| accession | Yes | UniProtKB accession, e.g. P05067 (isoforms like P05067-2 accepted). | |
| response_mode | No | Verbosity: minimal | compact | standard | full (default compact). | compact |
| canonical_only | No | Return only the canonical isoform (omit the additional-isoform list). |
Output Schema
| Name | Required | Description |
|---|---|---|
| success | No | |
| _meta | No | |
| error_code | No | |
| message | No | |
| retryable | No | |
| recovery_action | No | |
| field | No | |
| allowed_values | No | |
| hint | No | |
| accession | No | |
| canonical | No | |
| isoform_count | No | |
| isoforms | No | |
| requested_isoform | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description adds valuable context beyond annotations: explains that compact mode returns a preview to limit payload, details the effect of canonical_only, and confirms read-only behavior. No contradiction with annotations (readOnlyHint, idempotentHint).
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?
Single paragraph with clear, information-dense sentences. Front-loaded with main purpose. Could benefit from minor structural improvements like bullet points but is sufficiently 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 annotations, output schema, and schema coverage, the description adequately covers input behavior, response_mode variations, and canonical_only. No missing elements for effective use.
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 all 3 parameters (100% coverage), and description enriches with examples (e.g., P05067-2 for isoform) and usage tips (e.g., 'cheap for large proteins' for compact mode). Exceeds baseline 3.
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?
Clearly states it returns amino-acid sequences for an entry, specifying canonical and additional isoforms. Distinguishes from sibling tools like get_protein, get_protein_features, etc., which focus on other aspects.
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?
Provides explicit guidance on when to use canonical vs. isoform accessions and how response_mode affects output (e.g., compact mode for large proteins). Lacks explicit comparison to alternative tools but context is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_protein_variantsGet Protein VariantsARead-onlyIdempotent
Return natural-variant annotations for an entry: position, wild-type residue, amino-acid substitution, an HGVS-style notation (e.g. L176F) for simple substitutions, variant_type (substitution|other), free-text description, structured linked diseases, and dbsnp rsIDs. Set disease_associated_only=true to keep only disease-linked variants. Signature: get_protein_variants(accession, limit=, disease_associated_only=).
| Name | Required | Description | Default |
|---|---|---|---|
| accession | Yes | UniProtKB accession, e.g. P05067 (isoforms like P05067-2 accepted). | |
| limit | No | Max variants to return. | |
| disease_associated_only | No | Return only variants linked to a disease. |
Output Schema
| Name | Required | Description |
|---|---|---|
| success | No | |
| _meta | No | |
| error_code | No | |
| message | No | |
| retryable | No | |
| recovery_action | No | |
| field | No | |
| allowed_values | No | |
| hint | No | |
| accession | No | |
| count | No | |
| variants | No | |
| truncated | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true. The description adds behavioral context by listing return fields and providing an example notation format. No contradictions; adds detail 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 concise (two sentences plus signature), front-loaded with purpose, and every sentence adds value. No unnecessary words or repetition. Efficiently communicates key 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?
Given the tool has 3 parameters, full schema coverage, and an output schema, the description is complete enough. It explains return fields, filter usage, and signature. Could mention pagination or rate limits, but not essential. Overall very good coverage.
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 good descriptions. The description adds a signature line showing function call format and explains the effect of disease_associated_only. Also provides an example of the notation field. Adds value beyond 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 'natural-variant annotations for an entry' and lists specific fields (position, wild-type residue, substitution, notation, variant_type, description, diseases, dbsnp). This distinguishes it from sibling tools like get_protein_features or get_protein_diseases by focusing on variants.
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 gives a specific usage example: 'Set disease_associated_only=true to keep only disease-linked variants.' It does not explicitly contrast with sibling tools, but the context and parameter description imply when to use the filter. Lacks explicit when-not-to-use guidance.
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 uniprot-link discovery surface. detail='summary' (default) is light: identity/build/release, the tool list WITH call signatures, accepted argument aliases, response modes, recommended workflows, error taxonomy, and limits -- enough to call any tool without guessing an argument name. detail='full' adds the heavy reference blocks (21 named graphs with triple counts, the full SPARQL prefix map, full latency bands, feature-type and cross-reference vocabularies). Call this first in a cold session, or read uniprot://tools (signatures only) or uniprot://capabilities (full). Signature: get_server_capabilities(detail=).
| Name | Required | Description | Default |
|---|---|---|---|
| detail | No | summary (default, light) or full (adds named graphs/prefixes). | summary |
Output Schema
| Name | Required | Description |
|---|---|---|
| success | No | |
| _meta | No | |
| error_code | No | |
| message | No | |
| retryable | No | |
| recovery_action | No | |
| field | No | |
| allowed_values | No | |
| hint | No | |
| server | No | |
| server_version | No | |
| uniprot_release | No | |
| tools | No | |
| named_graphs | No | |
| feature_types | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint. The description adds valuable context about what is returned at each detail level, including the list of tools, accepted argument aliases, response modes, etc. 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 well-structured, front-loading the purpose, then detailing parameter options, and ending with usage guidance. Every sentence adds value, with no redundancy.
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 simple one-parameter tool with 100% schema coverage and an output schema, the description is complete. It covers what the tool returns, when to use it, and how it relates to other resources (uniprot://tools, uniprot://capabilities).
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?
The only parameter, 'detail', is fully described in the schema and enhanced in the description: it explains the default, the two options, and what each option includes (summary is light with tool list; full adds heavy reference blocks). This adds significant meaning beyond the enum values.
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 uniprot-link discovery surface, with explicit details about summary vs full modes. It distinguishes itself from sibling tools which deal with proteins and queries, making it clear this is a meta-information 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?
Provides explicit guidance: 'Call this first in a cold session' and suggests alternatives like uniprot://tools or uniprot://capabilities. This helps the agent decide when and how to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_taxonGet TaxonARead-onlyIdempotent
Resolve an organism in the UniProt taxonomy. Pass a numeric NCBI taxon id (e.g. 9606) for full detail (scientific/common name, rank, the DIRECT parent, and an optional ordered lineage from species up to root), or a scientific/common name to get candidate taxon ids. Use the resolved taxon id with find_proteins(organism_taxon=...). Name matches are ranked best-first (an exact scientific/common-name hit leads, tagged match_quality:'exact'), so matches[0] and next_commands point at the right organism. Numeric-id and common-organism-name lookups are fast (~0 ms for common names); an uncommon name triggers a multi-second taxonomy scan. Signature: get_taxon(taxon, include_lineage=).
| Name | Required | Description | Default |
|---|---|---|---|
| taxon | Yes | NCBI taxon id (digits) or a scientific/common name. | |
| include_lineage | No | Include the ancestor lineage (id lookups only). |
Output Schema
| Name | Required | Description |
|---|---|---|
| success | No | |
| _meta | No | |
| error_code | No | |
| message | No | |
| retryable | No | |
| recovery_action | No | |
| field | No | |
| allowed_values | No | |
| hint | No | |
| taxon_id | No | |
| scientific_name | No | |
| common_name | No | |
| rank | No | |
| parent_taxon_id | No | |
| lineage | No | |
| query | No | |
| match_count | No | |
| matches | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, idempotent, and open-world. The description adds: exact match quality tagging ('exact'), ranked name matches, lineage inclusion only for id lookups, and performance characteristics. 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?
Approximately 120 words, well-structured with clear sections: purpose, usage guidance, performance notes, and signature. Every sentence adds unique value without redundancy.
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 2-parameter tool with output schema, the description covers behavioral aspects (output details for each input type), performance, and integration with sibling tools. No gaps remain; completeness is high.
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 descriptions for both parameters. The description adds context: taxon parameter can be numeric id or name with example, and include_lineage only works for id lookups. This enriches understanding beyond 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 resolves organisms in UniProt taxonomy, distinguishing it from sibling tools like find_proteins. It specifies two modes: numeric NCBI taxon id for full detail (scientific/common name, rank, parent, optional lineage) and name for candidate ids, with an example (9606). This is specific and actionable.
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 guides when to use: 'Use the resolved taxon id with find_proteins(organism_taxon=...).' It also warns about performance differences: numeric-id and common names are fast (~0 ms), uncommon names trigger a multi-second scan. This helps the agent decide based on input type.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
map_identifiersMap IdentifiersARead-onlyIdempotent
Map a UniProtKB accession to its PRIMARY external identifiers: the genomic/structural/family core (PDB, AlphaFoldDB, Ensembl, RefSeq, GeneID, HGNC, KEGG, OrthoDB, Pfam, InterPro) by default. Optionally restrict to specific databases. Returns ids grouped by database plus the databases that matched and per-database counts. response_mode (default compact) returns short ids; full restores raw IRIs. For the exhaustive cross-reference set (incl. drug/disease databases like DrugBank/ChEMBL/OpenTargets) use get_protein_cross_references instead. Signature: map_identifiers(accession, databases=, response_mode=).
| Name | Required | Description | Default |
|---|---|---|---|
| accession | Yes | UniProtKB accession, e.g. P05067 (isoforms like P05067-2 accepted). | |
| databases | No | Target database short names (omit for all available). | |
| response_mode | No | Verbosity: minimal | compact | standard | full (default compact). | compact |
Output Schema
| Name | Required | Description |
|---|---|---|
| success | No | |
| _meta | No | |
| error_code | No | |
| message | No | |
| retryable | No | |
| recovery_action | No | |
| field | No | |
| allowed_values | No | |
| hint | No | |
| accession | No | |
| database_count | No | |
| counts | No | |
| by_database | No | |
| requested_databases | No | |
| mapped_databases | No | |
| unmatched_databases | No | |
| database_hint | No | |
| truncated_databases | No |
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 behavior details: response mode controls verbosity, return structure (grouped by database, matched databases, counts), and explains difference between compact and full modes. Adds 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?
The description is well-structured with front-loaded main purpose, then details, then alternative tool. It is informative but slightly verbose. Could be more concise, 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?
Given the complexity of mapping to multiple databases, the description fully explains return format (grouped by database, counts, matched databases) and response mode behavior. Output schema exists, so return values are documented. Complete for an agent to use 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%, so baseline is 3. The description adds value by providing examples (P05067, isoforms), default database list, and explanation of response_mode values. This exceeds what the schema alone 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 tool maps a UniProtKB accession to primary external identifiers, listing specific databases and distinguishing it from the sibling tool get_protein_cross_references. The verb 'map' and resource identification are precise.
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 default behavior, optional restriction to databases, and directs to get_protein_cross_references for exhaustive cross-references. This provides clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_sparql_queryRun SPARQL QueryARead-onlyIdempotent
Execute an arbitrary SPARQL 1.1 query against the UniProt endpoint (SELECT / ASK / CONSTRUCT / DESCRIBE, including SERVICE federation to Rhea, OMA, Bgee, etc.). SELECT results come back as columns+rows JSON; ASK as a boolean; CONSTRUCT/DESCRIBE as raw RDF in the chosen format. A LIMIT is auto-injected into unbounded SELECTs (see _meta/truncated). This is the escape hatch for anything the typed tools do not cover -- seed queries from search_example_queries. Use uniprot://prefixes for the standard PREFIX block. Unbounded or federated queries can take 10-60 s; bound lookups (anchored on an accession/gene/taxon) return in <2 s. Signature: run_sparql_query(query, result_format=, limit=, timeout_seconds=).
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | A complete SPARQL 1.1 query string. | |
| result_format | No | Result serialisation. Use json for SELECT/ASK. | json |
| limit | No | LIMIT to inject when a SELECT lacks one (capped at 10000). | |
| timeout_seconds | No | Per-call timeout override in seconds. |
Output Schema
| Name | Required | Description |
|---|---|---|
| success | No | |
| _meta | No | |
| error_code | No | |
| message | No | |
| retryable | No | |
| recovery_action | No | |
| field | No | |
| allowed_values | No | |
| hint | No | |
| query_type | No | |
| columns | No | |
| row_count | No | |
| rows | No | |
| boolean | No | |
| content_type | No | |
| data | No | |
| byte_length | No | |
| truncated | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint, idempotentHint, and openWorldHint, covering safety and idempotency. The description adds valuable behavioral details beyond these: auto-injection of LIMIT into unbounded SELECTs with a _meta/truncated flag, federation endpoints, and performance characteristics. 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 reasonably concise given the complexity of the tool. It front-loads the main purpose, then layers details about results, behavioral traits, usage guidance, performance, and signature. Every sentence adds value, though the density could be slightly improved with more structured formatting. 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 the tool's complexity (SPARQL endpoint, multiple query types, federation) and the existence of an output schema, the description covers all essential aspects: query types, result formats, auto-limit, escape hatch role, prefix usage, performance tiers, and parameter signature. It does not need to repeat output schema details. The description is comprehensive for effective agent use.
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 parameter descriptions. The description adds additional context: it explains the auto-limit injection and the _meta/truncated indicator, and provides a signature line showing parameter names. This enriches understanding beyond what the schema alone offers, justifying a score above the baseline of 3.
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 executes arbitrary SPARQL 1.1 queries against the UniProt endpoint, lists supported query forms (SELECT/ASK/CONSTRUCT/DESCRIBE), and explicitly distinguishes it from sibling tools by labeling it as 'the escape hatch for anything the typed tools do not cover.' This provides a precise verb+resource description with clear differentiation.
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 provides explicit guidance: it positions the tool as an escape hatch, directs users to seed queries from search_example_queries, mentions using uniprot://prefixes for standard prefixes, and even gives performance expectations (unbounded/federated queries 10-60s, bound lookups <2s). This effectively tells the agent when and how to use the tool versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_example_queriesSearch Example QueriesARead-onlyIdempotent
Search UniProt's 126 curated, executable SPARQL example queries by free text over their descriptions and keyword tags (e.g. 'disease', '3D structure', 'cross-reference', 'taxonomy'). Returns example ids, descriptions, tags, and query types. Fetch the full query text with get_example_query, then run it via run_sparql_query. The best way to learn how to query UniProt. Signature: search_example_queries(text=, limit=).
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Free-text filter over descriptions and keywords. | |
| limit | No | Max examples to return. |
Output Schema
| Name | Required | Description |
|---|---|---|
| success | No | |
| _meta | No | |
| error_code | No | |
| message | No | |
| retryable | No | |
| recovery_action | No | |
| field | No | |
| allowed_values | No | |
| hint | No | |
| count | No | |
| query_text | No | |
| examples | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint, idempotentHint, openWorldHint. Description adds search behavior details (free-text over descriptions and tags, return fields) 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?
Concise single paragraph, front-loaded with purpose, ends with function 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 output schema exists and 2 simple params, the description fully covers searchable fields, return types, and workflow. 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 coverage is 100%. Description adds context to text parameter ('free-text filter over descriptions and keywords') and shows signature with defaults, providing marginal extra 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?
The description clearly states it searches UniProt's curated SPARQL example queries by free text over descriptions and keyword tags, lists return fields, and differentiates from siblings like get_example_query.
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?
Provides context for learning how to query UniProt and outlines workflow (fetch full query with get_example_query then run via run_sparql_query). Lacks explicit when-not-to-use but adequate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool has a clearly distinct purpose: find_proteins vs find_proteins_batch are differentiated by batch vs single; get_protein_* tools each target specific data aspects (sequence, features, variants, diseases, GO, cross-refs); SPARQL-related tools are separate; taxonomy and mapping tools are unique. No overlap in functionality.
All tool names follow a consistent verb_noun pattern: find_*, get_*, map_*, run_*, search_*. The naming is predictable and homogeneous, making it easy for an agent to understand the action and target of each tool.
With 15 tools, the server is well-scoped for querying UniProt data. It covers search, retrieval of detailed protein information, cross-references, sequence, features, variants, diseases, GO terms, taxonomy, identifier mapping, SPARQL queries, and server capabilities, without being excessive.
The tool surface is comprehensive for the domain: all major UniProt data types are covered (core summary, cross-references, features, sequence, variants, diseases, GO terms). The inclusion of find_proteins_batch, map_identifiers, get_taxon, and the SPARQL escape hatch ensures no major workflow dead ends. Minor gaps like subcellular localization can be obtained via GO terms or SPARQL.
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 querying BrainKB, a knowledge base for neuroscience knowledge graphs.
MCP server for progressive tool usage at any scale (see https://klavis.ai)
Auditable MCP server for PubMed, Europe PMC, ClinicalTrials.gov, and bioRxiv/medRxiv queries
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceAn MCP server that enables language models to fetch protein information from the UniProt database, including protein details, sequences, functions, and structures.MIT
- AlicenseAqualityAmaintenanceAn MCP server that gives AI assistants access to biological and biomedical RDF databases via SPARQL at the RDF Portal, as well as selected REST APIs (NCBI E-utilities, UniProt, ChEMBL, PDB, Reactome, Rhea, MeSH, and more).2911MIT
- AlicenseAqualityBmaintenanceMCP server that exposes the UniProt REST API to LLM clients, enabling search and retrieval of protein data via tools like search_uniprotkb, get_entry, and map_ids.7MIT
- AlicenseNot gradedqualityCmaintenanceMCP server for querying gene annotations, full-text gene search, and species taxonomy via MyGene.info. Enables AI agents to access gene data through natural language questions.15MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/berntpopp/uniprot-link'
If you have feedback or need assistance with the MCP directory API, please join our Discord server