Koskamo

uniprot-mcp-server

An MCP server for protein research over UniProtKB. It allows agents to search UniProtKB by protein function or gene, fetch curated records, map IDs across databases, and pull reference proteomes, taxonomy, and sequences via STDIO or Streamable HTTP.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

uniprot-mcp-server logo, by cyanheadsCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-06Published by cyanheads
MCP endpoint (Streamable HTTP)
https://uniprot.caseyjhand.com/mcp
Vendor documentation

What its tools do

6 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

6 of 6 have a description · 6 of 6 declare behavior hints · 6 of 6 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Search UniProtKB by protein function
  • Fetch curated protein records
  • Map IDs across databases
  • Pull reference proteomes and taxonomy

Source and maintenance

Community listingRegistry 0.4.0
Maintenance checked

Protocol and capabilities

Server
uniprot-mcp-server 0.4.0
MCP protocol negotiated in check
2025-11-25
Tools
6 advertised
Resources
1 advertised
Resource templates
3 advertised
Prompts
1 advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  },
  "logging": {},
  "prompts": {
    "listChanged": true
  },
  "resources": {
    "subscribe": true,
    "listChanged": true
  },
  "extensions": {
    "io.modelcontextprotocol/skills": {
      "directoryRead": true
    }
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Protein-first research over UniProt (rest.uniprot.org), keyless. Start with uniprot_search_proteins (function/gene/organism queries) or arrive from a sibling identifier through uniprot_map_ids — the bridge that turns a gene, Ensembl, ChEMBL, RefSeq, or PDB id into a UniProtKB accession. Reviewed Swiss-Prot entries are manually curated; unreviewed TrEMBL are computationally predicted and ~30x more numerous, so favor reviewed:true unless you specifically want predictions. Chain accessions into uniprot_get_entry for curated records and uniprot_get_sequence for FASTA. An oversized entry batch returns outlinedEntries: re-call each listed accession individually, e.g. accessions:["P04637"]. A singleton section outline is retrieved with that one accession and sections:["function","disease"]; use section_limit/section_offset for one large list section. Cross-references hop outward: PDB ids to protein-mcp-server for structure, ChEMBL ids to chembl for bioactivity, PubMed evidence to pubmed. Data is UniProt, CC BY 4.0 — attribute UniProt in downstream use.

Tools

6 advertised

uniprot_search_proteins — uniprot-mcp-server: search proteins
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Search UniProtKB and return curated protein records. Pass text_search for a plain-language query (the 80% case) or query for the full Lucene field syntax (gene:TP53 AND organism_id:9606 AND reviewed:true) — exactly one is required. Reviewed (Swiss-Prot) entries are manually curated; unreviewed (TrEMBL) are computationally predicted and ~30x more numerous, so reviewed defaults to true to avoid drowning in predictions — set it false to search both tiers together (for TrEMBL only, put reviewed:false in query). The organism_id and reviewed filters apply to the whole query. Request facets (e.g. reviewed, model_organism) for server-side count breakdowns. Results page forward with an opaque cursor; UniProtKB has no offset paging. An inactive accession the query matches (merged, demerged, or deleted) comes back in inactive[] with the accessions that replace it, never as a result. This is the discovery entry point — chain results[].accession into uniprot_get_entry for full records, or uniprot_get_sequence for FASTA.

uniprot_search_proteins input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "size": {
      "type": "integer",
      "maximum": 500,
      "description": "Number of hits per page (max 500). Omit for the server default.",
      "exclusiveMinimum": 0
    },
    "query": {
      "type": "string",
      "description": "UniProtKB Lucene query with field prefixes — gene, organism_id, keyword (KW-xxxx), go (GO id), reviewed, protein_name, family, length, existence, accession. Example: \"gene:BRCA1 AND organism_id:9606 AND reviewed:true\". Provide this OR text_search, not both."
    },
    "cursor": {
      "type": "string",
      "description": "Opaque forward cursor from this tool for the same exact effective query and filters. Size, fields, and facets may change. Older raw cursors are rejected; restart without cursor. Random access to page N is not supported."
    },
    "facets": {
      "type": "string",
      "description": "Comma-separated upstream facet names for count breakdowns, e.g. \"reviewed,model_organism,proteins_with\". Returns a facets array alongside the hits."
    },
    "fields": {
      "type": "string",
      "description": "Comma-separated UniProtKB field names to project, e.g. \"accession,gene_names,cc_function\". Omit for a sensible default set covering name, gene, organism, length, reviewed, score, and a function snippet."
    },
    "reviewed": {
      "type": "boolean",
      "default": true,
      "description": "Restrict to reviewed Swiss-Prot entries. Defaults to true (curated only). false applies no tier filter, returning reviewed and unreviewed TrEMBL entries together; for TrEMBL only, put reviewed:false in query. Ignored when query already contains a reviewed: clause; plain text never overrides this filter."
    },
    "organism_id": {
      "type": "integer",
      "maximum": 9007199254740991,
      "description": "Restrict to an NCBI taxon and its descendants, including strains and subspecies, e.g. 9606 for human or 562 for E. coli. Applies taxonomy_id to the whole query; use an explicit organism_id: clause in query for an exact taxon. Resolve names with uniprot_get_taxonomy.",
      "exclusiveMinimum": 0
    },
    "text_search": {
      "type": "string",
      "description": "Plain-language search across protein names, gene names, and function, e.g. \"kinase apoptosis\". Punctuation and uppercase AND/OR/NOT are searched as text, with UniProt tokenization; use query for operators and field syntax. Provide this OR query, not both."
    }
  },
  "additionalProperties": false
}
uniprot_search_proteins output schema
{
  "type": "object",
  "anyOf": [
    {
      "not": {
        "required": [
          "error"
        ]
      },
      "required": [
        "results",
        "totalResults",
        "effectiveQuery"
      ]
    },
    {
      "required": [
        "error"
      ]
    }
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "error": {
      "type": "object",
      "required": [
        "code",
        "message"
      ],
      "properties": {
        "code": {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": -9007199254740991,
          "description": "JSON-RPC error code for this failure."
        },
        "data": {
          "type": "object",
          "properties": {
            "reason": {
              "type": "string",
              "examples": [
                "missing_query",
                "conflicting_query",
                "invalid_query",
                "invalid_cursor"
              ],
              "description": "Machine-readable failure mode. Declared by this tool: `missing_query`: Neither text_search nor query was provided. `conflicting_query`: Both text_search and query were provided. `invalid_query`: The query has unbalanced parentheses (rejected before any request), or UniProtKB rejected the query, text_search, fields, or facets value — the message names the rejected value. `invalid_cursor`: The cursor is malformed, from an older version, belongs to another tool or effective query, or UniProt could not continue from it (HTTP 500). Other values are possible when a failure originates below the handler."
            },
            "recovery": {
              "type": "object",
              "required": [
                "hint"
              ],
              "properties": {
                "hint": {
                  "type": "string"
                }
              },
              "description": "Actionable next step for the caller.",
              "additionalProperties": {}
            },
            "retryable": {
              "type": "boolean",
              "description": "Whether retrying may succeed."
            }
          },
          "additionalProperties": {}
        },
        "message": {
          "type": "string",
          "description": "Human-readable description of what went wrong."
        }
      },
      "description": "Present when the call failed. Absent on success.",
      "additionalProperties": {}
    },
    "cursor": {
      "type": "string",
      "description": "Forward cursor for the next page. Absent on the last page."
    },
    "facets": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "name",
          "label",
          "values"
        ],
        "properties": {
          "name": {
            "type": "string",
            "description": "Facet identifier, e.g. \"reviewed\"."
          },
          "label": {
            "type": "string",
            "description": "Human-readable facet label, e.g. \"Status\"."
          },
          "values": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "value",
                "label",
                "count"
              ],
              "properties": {
                "count": {
                  "type": "number",
                  "description": "Number of matches in this bucket."
                },
                "label": {
                  "type": "string",
                  "description": "Human-readable value label, e.g. \"Reviewed (Swiss-Prot)\"."
                },
                "value": {
                  "type": "string",
                  "description": "Facet value, e.g. \"true\"."
                }
              },
              "description": "A single facet bucket.",
              "additionalProperties": false
            },
            "description": "Count buckets for this facet."
          }
        },
        "description": "A server-side facet breakdown.",
        "additionalProperties": false
      },
      "description": "Upstream facet count breakdowns. Present only when facets were requested."
    },
    "notice": {
      "type": "string",
      "description": "Guidance when nothing matched, distinguishing plain text from a structured query and suggesting how to broaden."
    },
    "results": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "accession",
          "entryName",
          "geneNames",
          "organism",
          "length",
          "reviewed",
          "annotationScore",
          "proteinExistence"
        ],
        "properties": {
          "length": {
            "type": "number",
            "description": "Canonical sequence length in residues."
          },
          "organism": {
            "type": "object",
            "required": [
              "scientificName",
              "taxonId"
            ],
            "properties": {
              "taxonId": {
                "type": "number",
                "description": "NCBI taxonomy ID, e.g. 9606."
              },
              "commonName": {
                "type": "string",
                "description": "Organism common name, e.g. \"Human\". Omitted when none."
              },
              "scientificName": {
                "type": "string",
                "description": "Organism scientific name, e.g. \"Homo sapiens\"."
              }
            },
            "description": "Source organism.",
            "additionalProperties": false
          },
          "reviewed": {
            "type": "boolean",
            "description": "True for reviewed Swiss-Prot (manually curated), false for unreviewed TrEMBL (computationally predicted)."
          },
          "accession": {
            "type": "string",
            "description": "UniProtKB primary accession, e.g. \"P04637\". The lookup key for uniprot_get_entry and uniprot_get_sequence."
          },
          "entryName": {
            "type": "string",
            "description": "UniProtKB mnemonic ID, e.g. \"P53_HUMAN\". Not an input key — use accession."
          },
          "geneNames": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "A gene name or synonym."
            },
            "description": "Gene names and synonyms for the protein."
          },
          "proteinName": {
            "type": "string",
            "description": "Recommended full protein name. Omitted when the entry has none."
          },
          "annotationScore": {
            "type": "number",
            "description": "Annotation confidence on a 1–5 scale; higher means more curation evidence."
          },
          "functionSnippet": {
            "type": "string",
            "description": "First sentence(s) of the FUNCTION annotation, evidence references stripped. Omitted when no function is annotated."
          },
          "proteinExistence": {
            "type": "string",
            "description": "Evidence level for the protein's existence, e.g. \"1: Evidence at protein level\"."
          }
        },
        "description": "A UniProtKB search hit.",
        "additionalProperties": false
      },
      "description": "Matching active protein hits for this page. Inactive accessions are in inactive."
    },
    "inactive": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "accession"
        ],
        "properties": {
          "reason": {
            "type": "string",
            "description": "UniProt inactiveReasonType: MERGED, DEMERGED, or DELETED. Omitted when UniProt names none."
          },
          "accession": {
            "type": "string",
            "description": "The inactive UniProtKB accession the query matched."
          },
          "uniParcId": {
            "type": "string",
            "description": "UniParc ID that still holds the sequence, when UniProt gives one."
          },
          "replacedBy": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "A replacement UniProtKB accession."
            },
            "description": "Accessions that replace it — the merge target (MERGED) or the demerge products (DEMERGED). Look these up instead."
          },
          "deletedReason": {
            "type": "string",
            "description": "Why UniProt deleted the entry, when it says. Present on DELETED only."
          }
        },
        "description": "An inactive accession the query matched, with where to go instead.",
        "additionalProperties": false
      },
      "description": "Matching accessions that are inactive in UniProtKB (merged, demerged, or deleted) — not proteins to read, but pointers to the accessions that replace them. Present only when the page held any."
    },
    "totalResults": {
      "type": "number",
      "description": "Total matches for the query before pagination (from the upstream result count), inactive accessions included."
    },
    "effectiveQuery": {
      "type": "string",
      "description": "The query as the server assembled and sent it to UniProtKB."
    }
  },
  "additionalProperties": false
}
uniprot_search_proteins annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true
}
uniprot_get_entry — uniprot-mcp-server: get entry
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Fetch full curated UniProtKB entries by accession in one batch (up to 20). Each entry carries function, catalytic activity, cofactors, subcellular location, disease involvement, PTMs, natural variants, isoforms, domains, GO terms, keywords, and cross-references. Partial failures do not abort the batch — resolved entries land in succeeded[] and unknown or inactive (merged, demerged, deleted) accessions in failed[], where an inactive accession names its replacement or UniParc ID. Pass fields to trim the upstream projection. Initial responses exceeding 24,000 UTF-8 bytes across both output surfaces return kind: "outline": a single resolved record lists sections with byte sizes; a batch lists outlinedEntries in request order and retains failed[]. Re-call each outlined accession individually, e.g. accessions:["P04637"], for its full record or section outline, then add sections:["disease","variants"] to select sections. sections takes exactly one accession; trim a batch with fields instead. All returned list items and cross-reference IDs render in full. A large list section pages with section_limit/section_offset on a re-call naming that one section. This tool does not search: accessions come from uniprot_search_proteins.results[].accession or uniprot_map_ids. Strip any isoform suffix (P04637-2 to P04637) before calling.

uniprot_get_entry input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "accessions"
  ],
  "properties": {
    "fields": {
      "type": "string",
      "description": "Comma-separated UniProtKB field names to project, e.g. \"accession,gene_names,cc_function,ft_variant\". Omit for the full curated default set. Use this on the initial call to trim payload."
    },
    "sections": {
      "type": "array",
      "items": {
        "type": "string",
        "description": "A section key from a prior outline response, e.g. \"disease\", \"variants\", \"function\", \"xrefs\"."
      },
      "description": "Only used to re-call one accession after a kind: \"outline\" response — pass a subset of the outlined section keys to fetch just those sections. Requires exactly one accession: a batch with sections is rejected, so trim a batch with fields. A requested section the record lacks is named in absentSections, not an error. Do not pass on the initial call."
    },
    "accessions": {
      "type": "array",
      "items": {
        "type": "string",
        "pattern": "^(?:[OPQ][0-9][A-Z0-9]{3}[0-9]|[A-NR-Z][0-9](?:[A-Z][A-Z0-9]{2}[0-9]){1,2})$",
        "description": "A UniProtKB primary accession, e.g. \"P04637\". Canonical form only — strip any \"-N\" isoform suffix."
      },
      "maxItems": 20,
      "minItems": 1,
      "description": "Accessions to fetch (1–20). From uniprot_search_proteins or uniprot_map_ids."
    },
    "section_limit": {
      "type": "integer",
      "maximum": 500,
      "minimum": 1,
      "description": "Window size for one list section on a sections re-call: return at most this many items of it (1–500). Requires sections naming exactly one list section, e.g. [\"variants\"] (or ptms, domains, goTerms). Omit together with section_offset to return the whole section."
    },
    "section_offset": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": 0,
      "description": "Zero-based index of the first item in the windowed section. Defaults to 0. Pass the previous response's nextOffset to page forward. Same requirements as section_limit; set without section_limit, returns every item from this index on."
    }
  },
  "additionalProperties": false
}
uniprot_get_entry output schema
{
  "type": "object",
  "anyOf": [
    {
      "not": {
        "required": [
          "error"
        ]
      },
      "required": [
        "kind"
      ]
    },
    {
      "required": [
        "error"
      ]
    }
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "cap": {
      "type": "number",
      "description": "The section_limit applied. Present when truncated."
    },
    "kind": {
      "enum": [
        "full",
        "outline"
      ],
      "type": "string",
      "description": "Result kind. \"full\": read succeeded[] and failed[]. \"outline\": the complete inline result exceeded 24,000 UTF-8 bytes; read outlinedEntries for a batch or sections for a single record, and re-call one accession individually."
    },
    "error": {
      "type": "object",
      "required": [
        "code",
        "message"
      ],
      "properties": {
        "code": {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": -9007199254740991,
          "description": "JSON-RPC error code for this failure."
        },
        "data": {
          "type": "object",
          "properties": {
            "reason": {
              "type": "string",
              "examples": [
                "sections_single_accession",
                "unknown_section",
                "invalid_section_window",
                "all_not_found",
                "invalid_fields"
              ],
              "description": "Machine-readable failure mode. Declared by this tool: `sections_single_accession`: sections was passed with more than one accession — rejected before any request. sections re-calls a single outlined record. `unknown_section`: sections named a key this tool never emits — rejected before any request. The message lists every valid key. `invalid_section_window`: section_limit or section_offset was set without sections naming exactly one list section — no sections, several, or a non-list section such as organism or xrefs. Rejected before any request. `all_not_found`: No accession in the batch resolved to an active entry — each was unknown to UniProtKB or inactive (merged, demerged, or deleted). The message names each inactive accession and its replacement. `invalid_fields`: UniProtKB rejected the fields value — the message relays UniProt naming the rejected field. Other values are possible when a failure originates below the handler."
            },
            "recovery": {
              "type": "object",
              "required": [
                "hint"
              ],
              "properties": {
                "hint": {
                  "type": "string"
                }
              },
              "description": "Actionable next step for the caller.",
              "additionalProperties": {}
            },
            "retryable": {
              "type": "boolean",
              "description": "Whether retrying may succeed."
            }
          },
          "additionalProperties": {}
        },
        "message": {
          "type": "string",
          "description": "Human-readable description of what went wrong."
        }
      },
      "description": "Present when the call failed. Absent on success.",
      "additionalProperties": {}
    },
    "shown": {
      "type": "number",
      "description": "Items in the returned window. Present when truncated."
    },
    "failed": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "accession",
          "error"
        ],
        "properties": {
          "error": {
            "type": "string",
            "description": "Why it failed and how to recover. For an inactive accession: the merge target to retry with, the demerge products to choose among, or the UniParc ID that keeps a deleted sequence."
          },
          "accession": {
            "type": "string",
            "description": "The requested accession that did not resolve."
          }
        },
        "description": "A per-accession failure.",
        "additionalProperties": false
      },
      "description": "Accessions that did not resolve to an active entry — unknown to UniProtKB, or inactive (merged, demerged, or deleted). Retained on batch outlines as well as full results."
    },
    "notice": {
      "type": "string",
      "description": "Re-call guidance. On a single-record outline: re-call that accession with sections:[...] to pull specific sections. On a batch outline: re-call each outlined accession individually with accessions:[accession]. On a section window: the section_offset that pages the rest, or why the window came back empty."
    },
    "window": {
      "type": "object",
      "required": [
        "section",
        "offset"
      ],
      "properties": {
        "offset": {
          "type": "number",
          "description": "Index of the first returned item within the full section."
        },
        "section": {
          "type": "string",
          "description": "The section key section_limit/section_offset windowed."
        }
      },
      "description": "The window applied to succeeded[0]'s one requested section. Present only when section_limit or section_offset was set; totalCount and nextOffset place it in the full section.",
      "additionalProperties": false
    },
    "sections": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "name",
          "bytes"
        ],
        "properties": {
          "name": {
            "type": "string",
            "description": "Section identifier — pass a subset in sections:[...] to retrieve it."
          },
          "bytes": {
            "type": "number",
            "description": "Serialized byte size of the section."
          }
        },
        "description": "An outlined section with its serialized size.",
        "additionalProperties": false
      },
      "description": "Section outline for a single fully resolved accession whose inline result exceeds the budget. Absent on batch outlines, which return outlinedEntries instead."
    },
    "succeeded": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "accession",
          "entryName",
          "genes",
          "organism",
          "length",
          "reviewed",
          "annotationScore",
          "proteinExistence"
        ],
        "properties": {
          "ptms": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "type",
                "location"
              ],
              "properties": {
                "type": {
                  "type": "string",
                  "description": "Feature type, e.g. \"Modified residue\" or \"Domain\"."
                },
                "location": {
                  "type": "object",
                  "properties": {
                    "end": {
                      "type": "number",
                      "description": "End residue position. Omitted when not exact."
                    },
                    "start": {
                      "type": "number",
                      "description": "Start residue position. Omitted when not exact."
                    }
                  },
                  "description": "Residue range of the feature.",
                  "additionalProperties": false
                },
                "featureId": {
                  "type": "string",
                  "description": "Stable feature identifier, e.g. \"VAR_066493\". Omitted when none."
                },
                "description": {
                  "type": "string",
                  "description": "Free-text description of the feature. Omitted when absent."
                }
              },
              "description": "A sequence feature.",
              "additionalProperties": false
            },
            "description": "Post-translational modification features (modified residues, glycosylation, etc.). Absent when none."
          },
          "genes": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "A gene name or synonym."
            },
            "description": "Gene names and synonyms."
          },
          "xrefs": {
            "type": "object",
            "description": "Cross-references grouped by database (PDB, Ensembl, RefSeq, ChEMBL, AlphaFoldDB). Chain a PDB id into protein-mcp-server, a ChEMBL id into chembl. Absent when none.",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {
              "type": "array",
              "items": {
                "type": "string",
                "description": "A cross-reference identifier in that database."
              }
            }
          },
          "length": {
            "type": "number",
            "description": "Canonical sequence length in residues."
          },
          "disease": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "name"
              ],
              "properties": {
                "name": {
                  "type": "string",
                  "description": "Disease name."
                },
                "omimId": {
                  "type": "string",
                  "description": "OMIM identifier. Omitted when none."
                },
                "acronym": {
                  "type": "string",
                  "description": "Disease acronym. Omitted when none."
                },
                "diseaseId": {
                  "type": "string",
                  "description": "UniProt disease accession, e.g. \"DI-01537\". Omitted when none."
                },
                "description": {
                  "type": "string",
                  "description": "Disease description. Omitted when none."
                }
              },
              "description": "A disease association.",
              "additionalProperties": false
            },
            "description": "Disease involvements (DISEASE comments). Absent when none."
          },
          "domains": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "type",
                "location"
              ],
              "properties": {
                "type": {
                  "type": "string",
                  "description": "Feature type, e.g. \"Modified residue\" or \"Domain\"."
                },
                "location": {
                  "type": "object",
                  "properties": {
                    "end": {
                      "type": "number",
                      "description": "End residue position. Omitted when not exact."
                    },
                    "start": {
                      "type": "number",
                      "description": "Start residue position. Omitted when not exact."
                    }
                  },
                  "description": "Residue range of the feature.",
                  "additionalProperties": false
                },
                "featureId": {
                  "type": "string",
                  "description": "Stable feature identifier, e.g. \"VAR_066493\". Omitted when none."
                },
                "description": {
                  "type": "string",
                  "description": "Free-text description of the feature. Omitted when absent."
                }
              },
              "description": "A sequence feature.",
              "additionalProperties": false
            },
            "description": "Domain and region features. Absent when none."
          },
          "goTerms": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "id",
                "term",
                "aspect"
              ],
              "properties": {
                "id": {
                  "type": "string",
                  "description": "GO identifier, e.g. \"GO:0006915\"."
                },
                "term": {
                  "type": "string",
                  "description": "GO term label, e.g. \"apoptotic process\"."
                },
                "aspect": {
                  "type": "string",
                  "description": "GO aspect: P (process), F (function), or C (component)."
                }
              },
              "description": "A Gene Ontology annotation.",
              "additionalProperties": false
            },
            "description": "GO annotations. Absent when none."
          },
          "function": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "value"
              ],
              "properties": {
                "value": {
                  "type": "string",
                  "description": "The annotated text."
                },
                "evidence": {
                  "type": "array",
                  "items": {
                    "type": "string",
                    "description": "A PubMed/source evidence reference, e.g. \"PubMed:11025664\"."
                  },
                  "description": "Source evidence codes. Omitted when none are attached."
                }
              },
              "description": "An annotation with its source evidence preserved.",
              "additionalProperties": false
            },
            "description": "FUNCTION annotations. Absent on most TrEMBL entries."
          },
          "isoforms": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "isoformId"
              ],
              "properties": {
                "name": {
                  "type": "string",
                  "description": "Isoform name. Omitted when none."
                },
                "isoformId": {
                  "type": "string",
                  "description": "Isoform accession, e.g. \"P04637-2\"."
                },
                "sequenceStatus": {
                  "type": "string",
                  "description": "Sequence status, e.g. \"Displayed\" or \"Described\". Omitted when none."
                }
              },
              "description": "An alternatively-spliced isoform.",
              "additionalProperties": false
            },
            "description": "Isoforms (ALTERNATIVE PRODUCTS). Absent when only one product."
          },
          "keywords": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "id",
                "name"
              ],
              "properties": {
                "id": {
                  "type": "string",
                  "description": "Keyword identifier, e.g. \"KW-0053\"."
                },
                "name": {
                  "type": "string",
                  "description": "Keyword name, e.g. \"Apoptosis\"."
                },
                "category": {
                  "type": "string",
                  "description": "Keyword category. Omitted when none."
                }
              },
              "description": "A UniProt keyword.",
              "additionalProperties": false
            },
            "description": "UniProt keywords. Absent when none."
          },
          "organism": {
            "type": "object",
            "required": [
              "scientificName",
              "taxonId"
            ],
            "properties": {
              "taxonId": {
                "type": "number",
                "description": "NCBI taxonomy ID."
              },
              "mnemonic": {
                "type": "string",
                "description": "Organism mnemonic, e.g. \"HUMAN\". Omitted when none."
              },
              "commonName": {
                "type": "string",
                "description": "Organism common name. Omitted when none."
              },
              "scientificName": {
                "type": "string",
                "description": "Organism scientific name."
              }
            },
            "description": "Source organism.",
            "additionalProperties": false
          },
          "reviewed": {
            "type": "boolean",
            "description": "True for reviewed Swiss-Prot, false for unreviewed TrEMBL."
          },
          "variants": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "location"
              ],
              "properties": {
                "location": {
                  "type": "object",
                  "properties": {
                    "end": {
                      "type": "number",
                      "description": "End residue position. Omitted when not exact."
                    },
                    "start": {
                      "type": "number",
                      "description": "Start residue position. Omitted when not exact."
                    }
                  },
                  "description": "Residue range of the variant.",
                  "additionalProperties": false
                },
                "original": {
                  "type": "string",
                  "description": "Original residue(s). Omitted when not a substitution."
                },
                "featureId": {
                  "type": "string",
                  "description": "Variant identifier, e.g. \"VAR_066493\". Omitted when none."
                },
                "variation": {
                  "type": "string",
                  "description": "Variant residue(s). Omitted when not a substitution."
                },
                "description": {
                  "type": "string",
                  "description": "Variant description. Omitted when none."
                }
              },
              "description": "A natural variant.",
              "additionalProperties": false
            },
            "description": "Natural variants (dbSNP/ClinVar-linked). Absent when none."
          },
          "accession": {
            "type": "string",
            "description": "UniProtKB primary accession."
          },
          "cofactors": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "name"
              ],
              "properties": {
                "name": {
                  "type": "string",
                  "description": "Cofactor name, e.g. \"Zn(2+)\"."
                },
                "chebiId": {
                  "type": "string",
                  "description": "ChEBI identifier. Omitted when none."
                }
              },
              "description": "A required cofactor.",
              "additionalProperties": false
            },
            "description": "Cofactors. Absent when none are annotated."
          },
          "entryName": {
            "type": "string",
            "description": "UniProtKB mnemonic ID, e.g. \"P53_HUMAN\"."
          },
          "proteinName": {
            "type": "string",
            "description": "Recommended full protein name. Omitted when none."
          },
          "annotationScore": {
            "type": "number",
            "description": "Annotation confidence on a 1–5 scale."
          },
          "proteinExistence": {
            "type": "string",
            "description": "Protein-existence evidence level."
          },
          "catalyticActivity": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "name"
              ],
              "properties": {
                "name": {
                  "type": "string",
                  "description": "Reaction equation, e.g. \"ATP + L-tyrosyl-[protein] = ...\"."
                },
                "rheaId": {
                  "type": "string",
                  "description": "Rhea reaction ID, e.g. \"RHEA:10596\". Omitted when none."
                },
                "ecNumber": {
                  "type": "string",
                  "description": "Enzyme Commission number. Omitted when none."
                }
              },
              "description": "A catalyzed reaction.",
              "additionalProperties": false
            },
            "description": "Catalytic-activity reactions (Rhea-cross-referenced). Absent when not an enzyme."
          },
          "subcellularLocation": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "location"
              ],
              "properties": {
                "location": {
                  "type": "string",
                  "description": "Subcellular location, e.g. \"Nucleus\"."
                },
                "topology": {
                  "type": "string",
                  "description": "Membrane topology. Omitted when not applicable."
                }
              },
              "description": "A subcellular location.",
              "additionalProperties": false
            },
            "description": "Subcellular locations. Absent when none are annotated."
          }
        },
        "description": "A full curated UniProtKB entry.",
        "additionalProperties": false
      },
      "description": "Entries that resolved successfully. Present when kind is \"full\"."
    },
    "truncated": {
      "type": "boolean",
      "description": "True when items remain past the returned window. Absent on the final window."
    },
    "nextOffset": {
      "type": "number",
      "description": "section_offset for the next window (same section_limit). Present while items remain."
    },
    "totalCount": {
      "type": "number",
      "description": "Items in the windowed section before section_limit/section_offset applied. Present on every windowed call; 0 when the record lacks the section."
    },
    "absentSections": {
      "type": "array",
      "items": {
        "type": "string",
        "description": "A requested section key the record does not carry."
      },
      "description": "Requested section keys this record does not carry — UniProt holds no annotation of that kind for it, or fields excluded it. Not an error: the other requested sections are returned. Present only on a sections re-call that named one."
    },
    "outlinedEntries": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "accession",
          "bytes"
        ],
        "properties": {
          "bytes": {
            "type": "number",
            "description": "UTF-8 serialized bytes of this entry before outlining."
          },
          "accession": {
            "type": "string",
            "description": "Accession to re-call individually with accessions:[accession]."
          }
        },
        "description": "An omitted successful entry and its size.",
        "additionalProperties": false
      },
      "description": "Successful entries omitted when the aggregate inline result exceeds 24,000 UTF-8 bytes, in request order. Re-call each accession individually for its full record or section outline."
    }
  },
  "additionalProperties": false
}
uniprot_get_entry annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true
}
uniprot_map_ids — uniprot-mcp-server: map IDs
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Translate identifiers across databases via UniProt's ID-mapping service — gene names to accessions, accession to PDB / Ensembl / RefSeq / ChEMBL / GeneID, and back. The job runs asynchronously; this tool submits it and polls within a budget. A running job returns status "running" with a ticket; pass that ticket alone to poll the same job. A completed call returns status "finished" with one results page; when continuation is present, pass it alone to fetch the next completed page without re-submitting or polling the job. A gene name often maps to one reviewed Swiss-Prot accession plus dozens of unreviewed TrEMBL ones, so target UniProtKB-Swiss-Prot (reviewed only) for the usual intent, or UniProtKB to include TrEMBL. Pair a gene-symbol from_db with tax_id to disambiguate species. A row whose UniProtKB target is inactive (merged, demerged, or deleted) carries an inactive marker naming its replacements. Chain the resulting active accessions into uniprot_get_entry.

uniprot_map_ids input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "ids": {
      "type": "array",
      "items": {
        "type": "string",
        "description": "A source identifier in the from_db namespace, e.g. \"TP53\" for Gene_Name."
      },
      "maxItems": 100000,
      "description": "Identifiers to translate. Required only when submitting a new mapping job; omitted when resuming with a ticket or continuation."
    },
    "to_db": {
      "enum": [
        "UniProtKB",
        "UniProtKB-Swiss-Prot",
        "Gene_Name",
        "GeneID",
        "Ensembl",
        "Ensembl_Protein",
        "PDB",
        "RefSeq_Nucleotide",
        "RefSeq_Protein",
        "ChEMBL",
        "PomBase",
        "WormBase_Protein"
      ],
      "type": "string",
      "description": "Target database. UniProtKB-Swiss-Prot = reviewed accessions only (the usual intent); UniProtKB also includes unreviewed TrEMBL. Required only when submitting a new mapping job; omitted when resuming with a ticket or continuation."
    },
    "tax_id": {
      "type": "integer",
      "maximum": 9007199254740991,
      "description": "Exact NCBI taxon node for submission, e.g. 9606 for human. Unlike protein search taxonomy filters, this excludes descendant strains and subspecies. Resolve the strain taxon with uniprot_get_taxonomy when needed; no descendant filtering is applied to mapped results.",
      "exclusiveMinimum": 0
    },
    "ticket": {
      "type": "string",
      "minLength": 1,
      "description": "Running-job ticket from a prior status \"running\" response. Pass it alone to poll that job; do not combine it with continuation or submission inputs."
    },
    "from_db": {
      "enum": [
        "UniProtKB_AC-ID",
        "Gene_Name",
        "GeneID",
        "Ensembl",
        "Ensembl_Protein",
        "PDB",
        "RefSeq_Nucleotide",
        "RefSeq_Protein",
        "ChEMBL",
        "PomBase",
        "WormBase_Protein"
      ],
      "type": "string",
      "description": "Source database. Gene_Name = gene symbol (e.g. TP53; pair with tax_id); UniProtKB_AC-ID = accession or entry name; Ensembl/Ensembl_Protein = ENSG/ENSP; PDB; RefSeq_Nucleotide/RefSeq_Protein = NM_/NP_; ChEMBL; GeneID = NCBI Gene. Required only when submitting a new mapping job; omitted when resuming with a ticket or continuation."
    },
    "continuation": {
      "type": "object",
      "required": [
        "jobId",
        "cursor"
      ],
      "properties": {
        "jobId": {
          "type": "string",
          "minLength": 1,
          "description": "UniProt ID-mapping job identifier for the completed job."
        },
        "cursor": {
          "type": "string",
          "minLength": 1,
          "description": "Opaque cursor for the next completed results page."
        }
      },
      "description": "Completed-page continuation from a prior status \"finished\" response. Pass it alone to fetch the next page without polling or re-submitting."
    }
  },
  "additionalProperties": false
}
uniprot_map_ids output schema
{
  "type": "object",
  "anyOf": [
    {
      "not": {
        "required": [
          "error"
        ]
      },
      "required": [
        "status"
      ]
    },
    {
      "required": [
        "error"
      ]
    }
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "error": {
      "type": "object",
      "required": [
        "code",
        "message"
      ],
      "properties": {
        "code": {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": -9007199254740991,
          "description": "JSON-RPC error code for this failure."
        },
        "data": {
          "type": "object",
          "properties": {
            "reason": {
              "type": "string",
              "examples": [
                "mapping_failed",
                "missing_inputs",
                "conflicting_inputs",
                "unsupported_db_pair",
                "invalid_ticket",
                "invalid_continuation"
              ],
              "description": "Machine-readable failure mode. Declared by this tool: `mapping_failed`: UniProt reports a terminal ERROR for the mapping job. `missing_inputs`: No complete submission, running-job ticket, or completed-page continuation was provided. `conflicting_inputs`: Submission inputs, a running-job ticket, or a completed-page continuation were combined. `unsupported_db_pair`: The from_db/to_db combination is not supported by the ID-mapping service. `invalid_ticket`: The resume ticket is not a UniProt job ID, or is unknown or has expired server-side (UniProt holds jobs only temporarily). `invalid_continuation`: The completed-page continuation has an invalid job ID, is unknown or expired, or UniProt rejected the page with HTTP 400. Other values are possible when a failure originates below the handler."
            },
            "recovery": {
              "type": "object",
              "required": [
                "hint"
              ],
              "properties": {
                "hint": {
                  "type": "string"
                }
              },
              "description": "Actionable next step for the caller.",
              "additionalProperties": {}
            },
            "retryable": {
              "type": "boolean",
              "description": "Whether retrying may succeed."
            }
          },
          "additionalProperties": {}
        },
        "message": {
          "type": "string",
          "description": "Human-readable description of what went wrong."
        }
      },
      "description": "Present when the call failed. Absent on success.",
      "additionalProperties": {}
    },
    "notice": {
      "type": "string",
      "description": "Status guidance — e.g. that the job is still running, that no IDs mapped, that target identity is unavailable, or that inactive targets could not be marked on this page."
    },
    "status": {
      "enum": [
        "finished",
        "running"
      ],
      "type": "string",
      "description": "Job state: \"finished\" (one completed results page included) or \"running\" (poll with ticket)."
    },
    "ticket": {
      "type": "string",
      "description": "Running-job ticket (present only when status is \"running\"). Pass it alone to poll the same job."
    },
    "results": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "from",
          "to"
        ],
        "properties": {
          "to": {
            "type": "string",
            "description": "The resolved target identifier (e.g. a UniProtKB accession)."
          },
          "from": {
            "type": "string",
            "description": "The source identifier that was mapped."
          },
          "gene": {
            "type": "string",
            "description": "Primary target gene name when available."
          },
          "inactive": {
            "type": "object",
            "properties": {
              "reason": {
                "type": "string",
                "description": "UniProt inactiveReasonType: MERGED, DEMERGED, or DELETED. Omitted when UniProt names none."
              },
              "uniParcId": {
                "type": "string",
                "description": "UniParc ID that still holds the sequence, when UniProt gives one."
              },
              "replacedBy": {
                "type": "array",
                "items": {
                  "type": "string",
                  "description": "A replacement UniProtKB accession."
                },
                "description": "Accessions that replace the target — the merge target (MERGED) or the demerge products (DEMERGED)."
              },
              "deletedReason": {
                "type": "string",
                "description": "Why UniProt deleted the target, when it says. Present on DELETED only."
              }
            },
            "description": "Present only when the target accession is inactive in UniProtKB — it has no entry to fetch; use replacedBy or uniParcId instead. Absent for an active target.",
            "additionalProperties": false
          },
          "organism": {
            "type": "object",
            "required": [
              "taxonId"
            ],
            "properties": {
              "taxonId": {
                "type": "number",
                "description": "Target NCBI taxon ID."
              },
              "scientificName": {
                "type": "string",
                "description": "Target organism name when available."
              }
            },
            "description": "UniProtKB target organism when available.",
            "additionalProperties": false
          },
          "reviewed": {
            "type": "boolean",
            "description": "Whether UniProtKB marks the target reviewed."
          },
          "entryName": {
            "type": "string",
            "description": "UniProtKB entry name when available."
          }
        },
        "description": "A single from→to mapping.",
        "additionalProperties": false
      },
      "description": "Resolved mappings on this completed page (present only when status is \"finished\"). Failed source IDs are reported in unmappedIds."
    },
    "mappedCount": {
      "type": "number",
      "description": "Number of resolved mappings on this page (finished jobs only)."
    },
    "unmappedIds": {
      "type": "array",
      "items": {
        "type": "string",
        "description": "A source ID that resolved to nothing."
      },
      "description": "Job-wide source IDs UniProt reported as failed, repeated on every completed page. Absent when none failed."
    },
    "continuation": {
      "type": "object",
      "required": [
        "jobId",
        "cursor"
      ],
      "properties": {
        "jobId": {
          "type": "string",
          "minLength": 1,
          "description": "UniProt ID-mapping job identifier for the completed job."
        },
        "cursor": {
          "type": "string",
          "minLength": 1,
          "description": "Opaque cursor for the next completed results page."
        }
      },
      "description": "Next completed-page continuation (finished jobs only). Pass it alone to fetch the next page; absent on the terminal page.",
      "additionalProperties": false
    },
    "totalMappings": {
      "type": "number",
      "description": "Job-wide total mappings reported by UniProt; absent when unavailable."
    }
  },
  "additionalProperties": false
}
uniprot_map_ids annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true
}
uniprot_get_proteome — uniprot-mcp-server: get proteome
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Fetch the reference proteome for an organism by UPID (e.g. "UP000005640") or NCBI taxon ID (e.g. 9606) — provide exactly one. Returns metadata inline: proteome type, total protein count, BUSCO completeness (score, complete/fragmented/missing counts, lineage dataset), and the genome assembly accession. The protein set is opt-in via include_proteins (it is large — human is ~147,506) and returns a capped page with a forward cursor; narrow it with the query filter (UniProtKB Lucene syntax) for a subset. Resolve an organism name to a taxon ID first with uniprot_get_taxonomy.

uniprot_get_proteome input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "size": {
      "type": "integer",
      "maximum": 500,
      "description": "Proteins per page when include_proteins is true (max 500). Omit for the server default.",
      "exclusiveMinimum": 0
    },
    "upid": {
      "anyOf": [
        {
          "type": "string",
          "const": ""
        },
        {
          "type": "string",
          "pattern": "^UP[0-9]{9}$",
          "description": "Proteome identifier, e.g. \"UP000005640\"."
        }
      ],
      "description": "Proteome UPID. Provide this OR taxon_id, not both."
    },
    "query": {
      "type": "string",
      "description": "Optional UniProtKB Lucene filter to narrow the protein list, e.g. \"reviewed:true AND keyword:KW-0067\". Only applies when include_proteins is true."
    },
    "cursor": {
      "type": "string",
      "description": "Opaque cursor from this tool for the same resolved UPID and exact query. Identifier aliases resolving to that UPID and size changes are allowed. Older raw cursors are rejected; restart without cursor. Only meaningful with include_proteins."
    },
    "taxon_id": {
      "type": "integer",
      "maximum": 9007199254740991,
      "description": "NCBI taxon ID, e.g. 9606 for human. Prefers an exact reference proteome; otherwise resolves a unique descendant reference, or returns candidate UPIDs and taxon IDs for explicit selection. Provide this OR upid, not both.",
      "exclusiveMinimum": 0
    },
    "include_proteins": {
      "type": "boolean",
      "default": false,
      "description": "When true, also return a capped, cursor-paginated page of the proteome's proteins. Defaults to false — metadata alone is the common case."
    }
  },
  "additionalProperties": false
}
uniprot_get_proteome output schema
{
  "type": "object",
  "anyOf": [
    {
      "not": {
        "required": [
          "error"
        ]
      },
      "required": [
        "proteome"
      ]
    },
    {
      "required": [
        "error"
      ]
    }
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "cap": {
      "type": "number",
      "description": "The page-size cap that was applied."
    },
    "error": {
      "type": "object",
      "required": [
        "code",
        "message"
      ],
      "properties": {
        "code": {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": -9007199254740991,
          "description": "JSON-RPC error code for this failure."
        },
        "data": {
          "type": "object",
          "properties": {
            "reason": {
              "type": "string",
              "examples": [
                "ambiguous_proteome",
                "missing_identifier",
                "conflicting_identifier",
                "not_found",
                "invalid_query",
                "invalid_cursor"
              ],
              "description": "Machine-readable failure mode. Declared by this tool: `ambiguous_proteome`: Multiple descendant reference proteomes exist or candidate pages remain. `missing_identifier`: Neither upid nor taxon_id was provided. `conflicting_identifier`: Both upid and taxon_id were provided. `not_found`: The UPID or taxon has no reference proteome. `invalid_query`: The query filter has unbalanced parentheses (rejected before any request), or UniProtKB rejected it — the message names the rejected field or syntax. `invalid_cursor`: The protein cursor is malformed, from an older version, belongs to another tool, resolved UPID or query, or UniProt could not continue from it (HTTP 500). Other values are possible when a failure originates below the handler."
            },
            "recovery": {
              "type": "object",
              "required": [
                "hint"
              ],
              "properties": {
                "hint": {
                  "type": "string"
                }
              },
              "description": "Actionable next step for the caller.",
              "additionalProperties": {}
            },
            "retryable": {
              "type": "boolean",
              "description": "Whether retrying may succeed."
            }
          },
          "additionalProperties": {}
        },
        "message": {
          "type": "string",
          "description": "Human-readable description of what went wrong."
        }
      },
      "description": "Present when the call failed. Absent on success.",
      "additionalProperties": {}
    },
    "query": {
      "type": "string",
      "description": "The protein filter as supplied by the caller."
    },
    "shown": {
      "type": "number",
      "description": "Number of proteins returned in this page."
    },
    "cursor": {
      "type": "string",
      "description": "Forward cursor for the next protein page. Absent on the last page."
    },
    "notice": {
      "type": "string",
      "description": "Truncation guidance when the protein page was capped — how to reach the rest (walk the cursor or narrow with the query filter)."
    },
    "proteins": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "accession",
          "entryName",
          "geneNames",
          "organism",
          "length",
          "reviewed",
          "annotationScore",
          "proteinExistence"
        ],
        "properties": {
          "length": {
            "type": "number",
            "description": "Canonical sequence length in residues."
          },
          "organism": {
            "type": "object",
            "required": [
              "scientificName",
              "taxonId"
            ],
            "properties": {
              "taxonId": {
                "type": "number",
                "description": "NCBI taxonomy ID."
              },
              "commonName": {
                "type": "string",
                "description": "Organism common name. Omitted when none."
              },
              "scientificName": {
                "type": "string",
                "description": "Organism scientific name."
              }
            },
            "description": "Source organism.",
            "additionalProperties": false
          },
          "reviewed": {
            "type": "boolean",
            "description": "True for reviewed Swiss-Prot, false for unreviewed TrEMBL."
          },
          "accession": {
            "type": "string",
            "description": "UniProtKB primary accession."
          },
          "entryName": {
            "type": "string",
            "description": "UniProtKB mnemonic ID."
          },
          "geneNames": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "A gene name or synonym."
            },
            "description": "Gene names and synonyms."
          },
          "proteinName": {
            "type": "string",
            "description": "Recommended protein name. Omitted when none."
          },
          "annotationScore": {
            "type": "number",
            "description": "Annotation confidence on a 1–5 scale."
          },
          "functionSnippet": {
            "type": "string",
            "description": "First function sentence(s), evidence stripped. Omitted when none."
          },
          "proteinExistence": {
            "type": "string",
            "description": "Protein-existence evidence level."
          }
        },
        "description": "A protein in the proteome.",
        "additionalProperties": false
      },
      "description": "A capped page of the proteome's proteins. Present only when include_proteins is true."
    },
    "proteome": {
      "type": "object",
      "required": [
        "upid",
        "proteomeType",
        "organism",
        "proteinCount"
      ],
      "properties": {
        "upid": {
          "type": "string",
          "description": "Proteome identifier, e.g. \"UP000005640\"."
        },
        "busco": {
          "type": "object",
          "required": [
            "complete",
            "completeSingle",
            "completeDuplicated",
            "fragmented",
            "missing",
            "total"
          ],
          "properties": {
            "score": {
              "type": "number",
              "description": "Completeness percentage (0–100). Omitted when none."
            },
            "total": {
              "type": "number",
              "description": "Total BUSCO genes searched."
            },
            "missing": {
              "type": "number",
              "description": "Missing BUSCOs."
            },
            "complete": {
              "type": "number",
              "description": "Complete BUSCO genes."
            },
            "lineageDb": {
              "type": "string",
              "description": "BUSCO lineage dataset, e.g. \"primates_odb10\". Omitted when none."
            },
            "fragmented": {
              "type": "number",
              "description": "Fragmented BUSCOs."
            },
            "completeSingle": {
              "type": "number",
              "description": "Complete and single-copy BUSCOs."
            },
            "completeDuplicated": {
              "type": "number",
              "description": "Complete and duplicated BUSCOs."
            }
          },
          "description": "BUSCO completeness report. Absent for proteomes without one.",
          "additionalProperties": false
        },
        "organism": {
          "type": "object",
          "required": [
            "scientificName",
            "taxonId"
          ],
          "properties": {
            "taxonId": {
              "type": "number",
              "description": "NCBI taxonomy ID."
            },
            "mnemonic": {
              "type": "string",
              "description": "Organism mnemonic, e.g. \"HUMAN\". Omitted when none."
            },
            "commonName": {
              "type": "string",
              "description": "Organism common name. Omitted when none."
            },
            "scientificName": {
              "type": "string",
              "description": "Organism scientific name."
            }
          },
          "description": "Source organism.",
          "additionalProperties": false
        },
        "proteinCount": {
          "type": "number",
          "description": "Total number of proteins in the proteome."
        },
        "proteomeType": {
          "type": "string",
          "description": "Proteome type, e.g. \"Reference proteome\"."
        },
        "genomeAssembly": {
          "type": "string",
          "description": "Genome assembly accession, e.g. \"GCA_000001405.29\". Omitted when none."
        }
      },
      "description": "Proteome metadata.",
      "additionalProperties": false
    },
    "truncated": {
      "type": "boolean",
      "description": "True when the protein page hit the size cap — more remain via cursor."
    },
    "totalProteinsMatched": {
      "type": "number",
      "description": "Total proteins matching the (optionally filtered) proteome query."
    }
  },
  "additionalProperties": false
}
uniprot_get_proteome annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true
}
uniprot_get_taxonomy — uniprot-mcp-server: get taxonomy
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Resolve a taxonomy record by NCBI taxon ID (e.g. 9606) or organism name (e.g. "Homo sapiens" or "human") — provide exactly one. Exact case-insensitive scientific names take priority, then common names, mnemonic and aliases; stray double quotes and backslashes are tolerated after exact matching. Ties and partial matches return candidate taxon IDs instead of guessing. Returns the scientific and common name, mnemonic, rank, parent, and full lineage. Set include_children for immediate child taxa in pages of 100; pass the returned cursor for the next page. Use the resolved taxon ID with uniprot_search_proteins (organism_id) or uniprot_get_proteome (taxon_id).

uniprot_get_taxonomy input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "name": {
      "type": "string",
      "description": "Organism name, e.g. \"Homo sapiens\" or \"human\". Exact case-insensitive scientific names take priority, then common names, mnemonic and aliases. Stray double quotes and backslashes are tolerated only after exact matching; ties require taxon_id. Provide this OR taxon_id, not both."
    },
    "cursor": {
      "type": "string",
      "description": "Forward-pagination cursor from a prior children page, for the next page of the same taxon; a cursor issued for another taxon is rejected. Only meaningful with include_children."
    },
    "taxon_id": {
      "type": "integer",
      "maximum": 9007199254740991,
      "description": "NCBI taxonomy ID, e.g. 9606. Provide this OR name, not both.",
      "exclusiveMinimum": 0
    },
    "include_children": {
      "type": "boolean",
      "default": false,
      "description": "When true, also fetch a page of up to 100 immediate child taxa via a follow-up search. Defaults to false."
    }
  },
  "additionalProperties": false
}
uniprot_get_taxonomy output schema
{
  "type": "object",
  "anyOf": [
    {
      "not": {
        "required": [
          "error"
        ]
      },
      "required": [
        "taxon",
        "lineage"
      ]
    },
    {
      "required": [
        "error"
      ]
    }
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "cap": {
      "type": "number",
      "description": "The page size that was applied, when more remain."
    },
    "error": {
      "type": "object",
      "required": [
        "code",
        "message"
      ],
      "properties": {
        "code": {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": -9007199254740991,
          "description": "JSON-RPC error code for this failure."
        },
        "data": {
          "type": "object",
          "properties": {
            "reason": {
              "type": "string",
              "examples": [
                "incomplete_candidates",
                "ambiguous_name",
                "no_exact_match",
                "missing_identifier",
                "conflicting_identifier",
                "not_found",
                "invalid_cursor"
              ],
              "description": "Machine-readable failure mode. Declared by this tool: `incomplete_candidates`: The 45-second name lookup budget expires before all candidate pages are checked. `ambiguous_name`: Multiple taxa share the best exact name match. `no_exact_match`: Only partial candidate names match. `missing_identifier`: Neither taxon_id nor name was provided. `conflicting_identifier`: Both taxon_id and name were provided. `not_found`: The taxon ID or name did not resolve to a record. `invalid_cursor`: The cursor was issued for another taxon, is malformed, or UniProt could not continue from it. Other values are possible when a failure originates below the handler."
            },
            "recovery": {
              "type": "object",
              "required": [
                "hint"
              ],
              "properties": {
                "hint": {
                  "type": "string"
                }
              },
              "description": "Actionable next step for the caller.",
              "additionalProperties": {}
            },
            "retryable": {
              "type": "boolean",
              "description": "Whether retrying may succeed."
            }
          },
          "additionalProperties": {}
        },
        "message": {
          "type": "string",
          "description": "Human-readable description of what went wrong."
        }
      },
      "description": "Present when the call failed. Absent on success.",
      "additionalProperties": {}
    },
    "shown": {
      "type": "number",
      "description": "Number of children on this page, when more remain."
    },
    "taxon": {
      "type": "object",
      "required": [
        "taxonId",
        "scientificName",
        "rank"
      ],
      "properties": {
        "rank": {
          "type": "string",
          "description": "Taxonomic rank, e.g. \"species\"."
        },
        "parent": {
          "type": "object",
          "required": [
            "taxonId",
            "scientificName"
          ],
          "properties": {
            "taxonId": {
              "type": "number",
              "description": "Parent taxon ID."
            },
            "scientificName": {
              "type": "string",
              "description": "Parent scientific name."
            }
          },
          "description": "Immediate parent taxon. Omitted at the root.",
          "additionalProperties": false
        },
        "taxonId": {
          "type": "number",
          "description": "NCBI taxonomy ID."
        },
        "mnemonic": {
          "type": "string",
          "description": "UniProt organism mnemonic, e.g. \"HUMAN\". Omitted when none."
        },
        "commonName": {
          "type": "string",
          "description": "Common name. Omitted when none."
        },
        "otherNames": {
          "type": "array",
          "items": {
            "type": "string",
            "description": "An alternative name or synonym."
          },
          "description": "Synonyms and alternative spellings. Omitted when none."
        },
        "scientificName": {
          "type": "string",
          "description": "Scientific name."
        }
      },
      "description": "The taxonomy record.",
      "additionalProperties": false
    },
    "cursor": {
      "type": "string",
      "description": "Forward cursor for the next children page. Absent on the last page."
    },
    "notice": {
      "type": "string",
      "description": "Paging guidance when more children remain — the total and how to continue."
    },
    "lineage": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "taxonId",
          "scientificName",
          "rank"
        ],
        "properties": {
          "rank": {
            "type": "string",
            "description": "Taxonomic rank, e.g. \"phylum\", \"clade\", \"no rank\"."
          },
          "taxonId": {
            "type": "number",
            "description": "NCBI taxonomy ID of the lineage node."
          },
          "commonName": {
            "type": "string",
            "description": "Common name of the node. Omitted when none."
          },
          "scientificName": {
            "type": "string",
            "description": "Scientific name of the lineage node."
          }
        },
        "description": "A node in the lineage, ordered root → near.",
        "additionalProperties": false
      },
      "description": "Full lineage from root to the taxon's near ancestor."
    },
    "children": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "taxonId",
          "scientificName",
          "rank"
        ],
        "properties": {
          "rank": {
            "type": "string",
            "description": "Child rank."
          },
          "taxonId": {
            "type": "number",
            "description": "Child taxon ID."
          },
          "scientificName": {
            "type": "string",
            "description": "Child scientific name."
          }
        },
        "description": "An immediate child taxon.",
        "additionalProperties": false
      },
      "description": "One page of immediate children (up to 100). Present only when include_children is true."
    },
    "truncated": {
      "type": "boolean",
      "description": "True when more children remain past this page — fetch them with cursor."
    },
    "childCount": {
      "type": "number",
      "description": "Number of immediate children on this page (when include_children is true)."
    },
    "totalChildren": {
      "type": "number",
      "description": "Total immediate children of the taxon across all pages (when include_children is true)."
    }
  },
  "additionalProperties": false
}
uniprot_get_taxonomy annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true
}
uniprot_get_sequence — uniprot-mcp-server: get sequence
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Fetch the canonical amino-acid sequence (FASTA) for a UniProtKB accession, with length and the parsed header. Set include_isoforms to also return the alternatively-spliced isoform sequences. This is the cheap sequence-only path — for the full functional record use uniprot_get_entry. A merged accession returns the sequences of its merge target, labelled with the target accession and the requested one in mergedFrom; a demerged or deleted accession fails not_found naming its replacements or UniParc ID. Accessions come from uniprot_search_proteins or uniprot_map_ids; strip any "-N" isoform suffix (P04637-2 to P04637) before calling.

uniprot_get_sequence input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "accession"
  ],
  "properties": {
    "accession": {
      "type": "string",
      "pattern": "^(?:[OPQ][0-9][A-Z0-9]{3}[0-9]|[A-NR-Z][0-9](?:[A-Z][A-Z0-9]{2}[0-9]){1,2})$",
      "description": "UniProtKB primary accession, e.g. \"P04637\". Canonical form only — strip any \"-N\" isoform suffix."
    },
    "include_isoforms": {
      "type": "boolean",
      "default": false,
      "description": "When true, also return the isoform sequences. Defaults to false (canonical only)."
    }
  },
  "additionalProperties": false
}
uniprot_get_sequence output schema
{
  "type": "object",
  "anyOf": [
    {
      "not": {
        "required": [
          "error"
        ]
      },
      "required": [
        "accession",
        "canonical"
      ]
    },
    {
      "required": [
        "error"
      ]
    }
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "error": {
      "type": "object",
      "required": [
        "code",
        "message"
      ],
      "properties": {
        "code": {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": -9007199254740991,
          "description": "JSON-RPC error code for this failure."
        },
        "data": {
          "type": "object",
          "properties": {
            "reason": {
              "type": "string",
              "examples": [
                "not_found"
              ],
              "description": "Machine-readable failure mode. Declared by this tool: `not_found`: The accession has no sequence in UniProtKB — unknown, or demerged or deleted; for an inactive accession the message names its replacements or UniParc ID. Other values are possible when a failure originates below the handler."
            },
            "recovery": {
              "type": "object",
              "required": [
                "hint"
              ],
              "properties": {
                "hint": {
                  "type": "string"
                }
              },
              "description": "Actionable next step for the caller.",
              "additionalProperties": {}
            },
            "retryable": {
              "type": "boolean",
              "description": "Whether retrying may succeed."
            }
          },
          "additionalProperties": {}
        },
        "message": {
          "type": "string",
          "description": "Human-readable description of what went wrong."
        }
      },
      "description": "Present when the call failed. Absent on success.",
      "additionalProperties": {}
    },
    "isoforms": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "header",
          "sequence",
          "length",
          "isoformId"
        ],
        "properties": {
          "header": {
            "type": "string",
            "description": "The FASTA header line (without the leading \">\"), e.g. \"sp|P04637|P53_HUMAN Cellular tumor antigen p53 OS=Homo sapiens OX=9606 GN=TP53 PE=1 SV=4\"."
          },
          "length": {
            "type": "number",
            "description": "Sequence length in residues."
          },
          "sequence": {
            "type": "string",
            "description": "The amino-acid sequence as a single string (newlines removed)."
          },
          "isoformId": {
            "type": "string",
            "description": "Isoform accession, e.g. \"P04637-2\"."
          }
        },
        "description": "An isoform sequence record.",
        "additionalProperties": false
      },
      "description": "Isoform sequence records. Present only when include_isoforms is true and isoforms exist."
    },
    "accession": {
      "type": "string",
      "description": "The accession whose sequences are returned — the requested one, or its merge target when mergedFrom is present."
    },
    "canonical": {
      "type": "object",
      "required": [
        "header",
        "sequence",
        "length"
      ],
      "properties": {
        "header": {
          "type": "string",
          "description": "The FASTA header line (without the leading \">\"), e.g. \"sp|P04637|P53_HUMAN Cellular tumor antigen p53 OS=Homo sapiens OX=9606 GN=TP53 PE=1 SV=4\"."
        },
        "length": {
          "type": "number",
          "description": "Sequence length in residues."
        },
        "sequence": {
          "type": "string",
          "description": "The amino-acid sequence as a single string (newlines removed)."
        }
      },
      "description": "The canonical sequence record.",
      "additionalProperties": false
    },
    "mergedFrom": {
      "type": "string",
      "description": "The requested accession, present only when UniProt merged it into accession; every record here is the merge target. Omitted for an active accession."
    }
  },
  "additionalProperties": false
}
uniprot_get_sequence annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true
}

Prompts

1 advertised

uniprot_protein_dossier — uniprot-mcp-server: protein dossier

Advertised by the server during the last successful anonymous check.

Guided protein-research workflow over UniProt — resolve an identifier to a UniProtKB accession, fetch the curated entry, pull disease and variant detail, and surface cross-references for structure, citations, and bioactivity.

identifier
A gene name (e.g. "TP53"), UniProtKB accession (e.g. "P04637"), or protein name to research. (required)
organism
Optional organism scientific name or NCBI taxon ID to disambiguate (e.g. "Homo sapiens" or "9606").

Resources

1 advertised

uniprot-guide

Advertised by the server during the last successful anonymous check.

Resolve protein identity and organism scope with uniprot_* tools before interpreting annotations, mapping identifier sets, or comparing proteomes. Use for ambiguous gene names, species versus strain searches, evidence-backed protein dossiers, and claims that a protein or annotation is absent.

uniprot-guide URI
skill://uniprot-guide/SKILL.md

MIME type: text/markdown

UniProtKB entry — UniProtKB entry

Advertised by the server during the last successful anonymous check.

A curated UniProtKB entry by accession — function, catalytic activity, disease, variants, GO terms, and cross-references. The resource mirror of uniprot_get_entry for a single accession. An inactive accession (merged, demerged, or deleted) fails not_found with a message naming its replacement. An annotation-heavy entry over the outline budget returns a bounded identity summary plus a section outline (names + byte sizes) instead of the full record — fetch specific sections with the uniprot_get_entry tool (sections:[...]).

UniProtKB entry URI template
uniprot://entry/{accession}

MIME type: application/json

UniProt taxonomy record — UniProt taxonomy record

Advertised by the server during the last successful anonymous check.

A taxonomy record by NCBI taxon ID — scientific/common name, rank, parent, and full lineage. The resource mirror of uniprot_get_taxonomy by ID.

UniProt taxonomy record URI template
uniprot://taxonomy/{taxonId}

MIME type: application/json

io.modelcontextprotocol/skills

Advertised by the server during the last successful anonymous check.

io.modelcontextprotocol/skills URI template
skill://{+path}

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
687 ms
95th percentile latency
687 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 687 ms · metadata changed · 6 tool(s), 1 resource(s), 3 resource template(s), 1 prompt(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http uniprot-mcp-server-caseyjhand https://uniprot.caseyjhand.com/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add uniprot-mcp-server-caseyjhand --url https://uniprot.caseyjhand.com/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable uniprot-mcp-server-caseyjhand in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "uniprot-mcp-server-caseyjhand": {
      "url": "https://uniprot.caseyjhand.com/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "uniprot-mcp-server-caseyjhand": {
      "type": "streamableHttp",
      "url": "https://uniprot.caseyjhand.com/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start uniprot-mcp-server-caseyjhand and inspect its tools.
VS Code configuration
{
  "servers": {
    "uniprot-mcp-server-caseyjhand": {
      "type": "http",
      "url": "https://uniprot.caseyjhand.com/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http uniprot-mcp-server-caseyjhand https://uniprot.caseyjhand.com/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://uniprot.caseyjhand.com/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "uniprot-mcp-server-caseyjhand": {
      "serverUrl": "https://uniprot.caseyjhand.com/mcp"
    }
  }
}

Let your agent find its tools

Find servers like uniprot-mcp-server from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.