Skip to content

io.github.cyanheads/uniprot-mcp-server

by cyanheads · remote · local (npm) · no sign-in to list tools · v0.2.6 · published by GitHub user cyanheads

Protein research over UniProtKB: search by function, fetch curated records, map IDs, proteomes.

Changes · 1

6 tools: 1 change things and 5 only read.

Scanned Oct 21, 2026

No check matched anything in the tool definitions. No finding is not a safety guarantee. How the checks work.

claude mcp add --transport http uniprot https://uniprot.caseyjhand.com/mcp

Tools

Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.

6 tools

Changes things 1Claude Code: ask
  • uniprot_map_idsTranslate identifiers across databases via UniProt's ID-mapping service — gene names to accessions, accession to PDB / Ensembl / RefSeq / ChEMBL / GeneID, and back.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • readOnlyHint: true
    • openWorldHint: true
    • idempotentHint: true
Only reads 5Claude Code: allow
  • uniprot_get_entryFetch full curated UniProtKB entries by accession in one batch (up to 20).No findings

    Why it is in this group

    • The name "uniprot_get_entry" says "get": a word for reading.
    Description, as the server wrote it
    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 the error for an inactive accession names the accession to retry with or the UniParc ID that keeps its sequence. Pass fields to trim the upstream projection. A single oversized record returns kind: "outline" (a section listing with byte sizes) instead of overflowing context — re-call the same accession with sections:[...] (e.g. ["disease","variants"]) to pull only those. sections takes exactly one accession; trim a batch with fields instead. A list section too large on its own (the natural variants of p53, over a thousand) 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.

    Annotations the server declares

    • readOnlyHint: true
    • openWorldHint: true
    • idempotentHint: true
  • uniprot_get_proteomeFetch the reference proteome for an organism by UPID (e.g.No findings

    Why it is in this group

    • The name "uniprot_get_proteome" says "get": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • readOnlyHint: true
    • openWorldHint: true
    • idempotentHint: true
  • uniprot_get_sequenceFetch the canonical amino-acid sequence (FASTA) for a UniProtKB accession, with length and the parsed header.No findings

    Why it is in this group

    • The name "uniprot_get_sequence" says "get": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • readOnlyHint: true
    • openWorldHint: true
    • idempotentHint: true
  • uniprot_get_taxonomyResolve a taxonomy record by NCBI taxon ID (e.g.No findings

    Why it is in this group

    • The name "uniprot_get_taxonomy" says "get": a word for reading.
    Description, as the server wrote it
    Resolve a taxonomy record by NCBI taxon ID (e.g. 9606) or scientific name (e.g. "Homo sapiens") — provide exactly one. Returns the scientific and common name, mnemonic, rank, parent, and the full lineage. Set include_children to also fetch immediate child taxa (a separate lookup — not inline on the record) in pages of 100 with the total child count; when more remain, pass the returned cursor to fetch the next page. Use this to turn an organism name into the taxon ID that uniprot_search_proteins (organism_id) and uniprot_get_proteome (taxon_id) expect.

    Annotations the server declares

    • readOnlyHint: true
    • openWorldHint: true
    • idempotentHint: true
  • uniprot_search_proteinsSearch UniProtKB and return curated protein records.No findings

    Why it is in this group

    • The name "uniprot_search_proteins" says "search": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • readOnlyHint: true
    • openWorldHint: true
    • idempotentHint: true

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Install

Pinned to version 0.2.6. Values in angle brackets are yours to fill in.

claude mcp add --transport http uniprot https://uniprot.caseyjhand.com/mcp

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__uniprot__uniprot_search_proteins",
      "mcp__uniprot__uniprot_get_entry",
      "mcp__uniprot__uniprot_get_proteome",
      "mcp__uniprot__uniprot_get_taxonomy",
      "mcp__uniprot__uniprot_get_sequence"
    ],
    "ask": [
      "mcp__uniprot__uniprot_map_ids"
    ],
    "deny": []
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as uniprot. Review it before you use it.