io.github.cyanheads/uniprot-mcp-server
REMOTE · UNIPROT.CASEYJHAND.COM · 2 COMPONENTS · SCANNED SEP 21
Protein research over UniProtKB — search by function, fetch curated records, map IDs, proteomes.
Available components
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →
Endpoint Security66
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation not fully verified: no authorisation is required to call this server, and 6 tool(s) never declared a destructiveHint. The MCP spec treats an absent hint as destructive by default, so we cannot call this surface safe. See how to fix → View diagnostics → Unverified
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC is configured correctly; the domain's records validate against the full chain to the root. View diagnostics → Pass
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability76
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 2312 tokens (~385/item across 6 items; 6 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
- No destabilizing schema changes in the last 30 days.Pass
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 6 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 7 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
How do I install the io.github.cyanheads/uniprot-mcp-server server?
io.github.cyanheads/uniprot-mcp-server is a hosted endpoint at https://uniprot.caseyjhand.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · uniprot.caseyjhand.com
claude mcp add --transport http cyanheads-uniprot-mcp-server 'https://uniprot.caseyjhand.com/mcp'
{
"mcpServers": {
"cyanheads-uniprot-mcp-server": {
"url": "https://uniprot.caseyjhand.com/mcp"
}
}
} {
"servers": {
"cyanheads-uniprot-mcp-server": {
"type": "http",
"url": "https://uniprot.caseyjhand.com/mcp"
}
}
} [mcp_servers.cyanheads-uniprot-mcp-server] url = "https://uniprot.caseyjhand.com/mcp"
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"cyanheads-uniprot-mcp-server": {
"type": "remote",
"url": "https://uniprot.caseyjhand.com/mcp",
"enabled": true
}
}
} openclaw mcp add cyanheads-uniprot-mcp-server --url 'https://uniprot.caseyjhand.com/mcp' --transport streamable-http
mcp_servers:
cyanheads-uniprot-mcp-server:
url: "https://uniprot.caseyjhand.com/mcp" {
"McpServers": {
"cyanheads-uniprot-mcp-server": {
"Transport": "http",
"Url": "https://uniprot.caseyjhand.com/mcp"
}
}
} assistant mcp add cyanheads-uniprot-mcp-server -t streamable-http -u 'https://uniprot.caseyjhand.com/mcp'
{
"mcpServers": {
"cyanheads-uniprot-mcp-server": {
"type": "http",
"url": "https://uniprot.caseyjhand.com/mcp"
}
}
} The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 21 Sept 26 0
- Stability: 0.97 → pass security
- 20 Sept 26 +1
- Server version: 0.2.3 → 0.2.4 functional
- 18 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 87 to 90. That category is still filling its 30-day observation window: 26 days of observed history at the previous scan, 27 at this one. The score rises as the window fills, whether or not the server changes.
- 16 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 80 to 83. That category is still filling its 30-day observation window: 24 days of observed history at the previous scan, 25 at this one. The score rises as the window fills, whether or not the server changes.
- 14 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 73 to 77. That category is still filling its 30-day observation window: 22 days of observed history at the previous scan, 23 at this one. The score rises as the window fills, whether or not the server changes.
- 12 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 67 to 70. That category is still filling its 30-day observation window: 20 days of observed history at the previous scan, 21 at this one. The score rises as the window fills, whether or not the server changes.
- 10 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 60 to 63. That category is still filling its 30-day observation window: 18 days of observed history at the previous scan, 19 at this one. The score rises as the window fills, whether or not the server changes.
- 7 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 50 to 53. That category is still filling its 30-day observation window: 15 days of observed history at the previous scan, 16 at this one. The score rises as the window fills, whether or not the server changes.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 21 Sept 2026 · Probed https://uniprot.caseyjhand.com/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=caseyjhand.com | CN=WE1,O=Google Trust Services,C=US | 4 Sept 2026 | 3 Dec 2026 | ECDSA 256 | ECDSA-SHA256 | a6985204ed51ae050e7738aa6be668e9 |
| SANs: caseyjhand.com, *.caseyjhand.com | ||||||
| CN=WE1,O=Google Trust Services,C=US (CA) | CN=GTS Root R4,O=Google Trust Services LLC,C=US | 13 Dec 2023 | 20 Feb 2029 | ECDSA 256 | ECDSA-SHA384 | 7ff31977972c224a76155d13b6d685e3 |
| CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) | CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE | 15 Nov 2023 | 28 Jan 2028 | ECDSA 384 | SHA256-RSA | 7fe530bf331343bedd821610493d8a1b |
Background: What to check on a remote MCP endpoint →
DNSSEC secure
Validation of uniprot.caseyjhand.com. — Secure
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| com. | present | 19718 | 13 | Verified |
| caseyjhand.com. | present | 2371 | 13 | Verified |
| uniprot.caseyjhand.com. | Verified address RRset verified with the apex keys |
Authentication No authorisation required
The endpoint answered without asking for a token. Anyone who knows the URL can reach it.
| Result | No authorisation required |
|---|---|
| HTTP status | 200 |
| Header | Value |
|---|---|
| strict-transport-security | max-age=63072000; includeSubDomains; preload |
| x-content-type-options | nosniff |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://uniprot.caseyjhand.com/mcp | Verified | 200 | |
| http (plaintext) | http://uniprot.caseyjhand.com/mcp | HTTPS enforced | 301 | https://uniprot.caseyjhand.com/mcp |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
uniprot_get_entry uniprot-mcp-server: get entry ~320
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/withdrawn accessions in failed[]. 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. 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.
| Name | Type | Req | Description |
|---|---|---|---|
| accessions | array | yes | Accessions to fetch (1–20). From uniprot_search_proteins or uniprot_map_ids. |
| fields | string | – | 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 | array | – | Only used to re-call after a kind: "outline" response — pass a subset of the outlined section keys to fetch just those sections. Do not pass on the initial call. |
| Name | Type | Req | Description |
|---|---|---|---|
| error | object | – | Present when the call failed. Absent on success. |
| failed | array | – | Accessions that were well-formed but not found in UniProtKB. Present when kind is "full". |
| kind | string | – | Result kind. "full": the batch resolved — read succeeded[] and failed[]. "outline": a single record exceeded the context budget and is returned as a section listing — re-call the same accession with… |
| notice | string | – | Re-call guidance when kind is "outline" — re-call the same accession with sections:[...] to pull specific sections. |
| sections | array | – | Section outline returned when a single record exceeds the context budget. Present when kind is "outline". |
| succeeded | array | – | Entries that resolved successfully. Present when kind is "full". |
No examples provided.
uniprot_get_proteome uniprot-mcp-server: get proteome ~355
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.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | Forward-pagination cursor from a prior protein page. Only meaningful with include_proteins. |
| include_proteins | boolean | – | When true, also return a capped, cursor-paginated page of the proteome's proteins. Defaults to false — metadata alone is the common case. |
| query | string | – | Optional UniProtKB Lucene filter to narrow the protein list, e.g. "reviewed:true AND keyword:KW-0067". Only applies when include_proteins is true. |
| size | integer | – | Proteins per page when include_proteins is true (max 500). Omit for the server default. |
| taxon_id | integer | – | NCBI taxon ID, e.g. 9606 for human. Resolves to the reference proteome. Provide this OR upid, not both. |
| upid | – | – | Proteome UPID. Provide this OR taxon_id, not both. |
| Name | Type | Req | Description |
|---|---|---|---|
| cap | number | – | The page-size cap that was applied. |
| cursor | string | – | Forward cursor for the next protein page. Absent on the last page. |
| error | object | – | Present when the call failed. Absent on success. |
| notice | string | – | Truncation guidance when the protein page was capped — how to reach the rest (walk the cursor or narrow with the query filter). |
| proteins | array | – | A capped page of the proteome's proteins. Present only when include_proteins is true. |
| proteome | object | – | Proteome metadata. |
| shown | number | – | Number of proteins returned in this page. |
| totalProteinsMatched | number | – | Total proteins matching the (optionally filtered) proteome query. |
| truncated | boolean | – | True when the protein page hit the size cap — more remain via cursor. |
No examples provided.
uniprot_get_sequence uniprot-mcp-server: get sequence ~170
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. Accessions come from uniprot_search_proteins or uniprot_map_ids; strip any "-N" isoform suffix (P04637-2 to P04637) before calling.
| Name | Type | Req | Description |
|---|---|---|---|
| accession | string | yes | UniProtKB primary accession, e.g. "P04637". Canonical form only — strip any "-N" isoform suffix. |
| include_isoforms | boolean | – | When true, also return the isoform sequences. Defaults to false (canonical only). |
| Name | Type | Req | Description |
|---|---|---|---|
| accession | string | – | The accession that was fetched. |
| canonical | object | – | The canonical sequence record. |
| error | object | – | Present when the call failed. Absent on success. |
| isoforms | array | – | Isoform sequence records. Present only when include_isoforms is true and isoforms exist. |
No examples provided.
uniprot_get_taxonomy uniprot-mcp-server: get taxonomy ~219
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). Use this to turn an organism name into the taxon ID that uniprot_search_proteins (organism_id) and uniprot_get_proteome (taxon_id) expect.
| Name | Type | Req | Description |
|---|---|---|---|
| include_children | boolean | – | When true, also fetch the immediate child taxa via a follow-up search. Defaults to false. |
| name | string | – | Organism scientific name, e.g. "Homo sapiens". Provide this OR taxon_id, not both. Matched against the scientific name. |
| taxon_id | integer | – | NCBI taxonomy ID, e.g. 9606. Provide this OR name, not both. |
| Name | Type | Req | Description |
|---|---|---|---|
| childCount | number | – | Number of immediate children returned (when include_children is true). |
| children | array | – | Immediate children. Present only when include_children is true. |
| error | object | – | Present when the call failed. Absent on success. |
| lineage | array | – | Full lineage from root to the taxon's near ancestor. |
| taxon | object | – | The taxonomy record. |
No examples provided.
uniprot_map_ids uniprot-mcp-server: map IDs ~511
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 / UniProtKB_AC-ID to include TrEMBL. Pair a gene-symbol from_db with tax_id to disambiguate species. Chain the resulting accessions into uniprot_get_entry.
| Name | Type | Req | Description |
|---|---|---|---|
| continuation | object | – | Completed-page continuation from a prior status "finished" response. Pass it alone to fetch the next page without polling or re-submitting. |
| from_db | string | – | Source database. Gene_Name = HGNC symbol (pair with tax_id); UniProtKB_AC-ID = accession or entry name; Ensembl/Ensembl_Protein = ENSG/ENSP; PDB; RefSeq_Nucleotide/RefSeq_Protein = NM_/NP_; ChEMBL; G… |
| ids | array | – | Identifiers to translate. Required only when submitting a new mapping job; omitted when resuming with a ticket or continuation. |
| tax_id | integer | – | NCBI taxon ID to disambiguate ambiguous source IDs (e.g. a gene symbol across species). Recommended with Gene_Name; e.g. 9606 for human. |
| ticket | string | – | 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. |
| to_db | string | – | Target database. UniProtKB-Swiss-Prot = reviewed accessions only (the usual intent); UniProtKB / UniProtKB_AC-ID also include unreviewed TrEMBL. Required only when submitting a new mapping job; omitt… |
| Name | Type | Req | Description |
|---|---|---|---|
| continuation | object | – | Next completed-page continuation (finished jobs only). Pass it alone to fetch the next page; absent on the terminal page. |
| error | object | – | Present when the call failed. Absent on success. |
| mappedCount | number | – | Number of resolved mappings (finished jobs only). |
| notice | string | – | Status guidance — e.g. that the job is still running, or that no IDs mapped. |
| results | array | – | Resolved mappings on this completed page (present only when status is "finished"). Failed source IDs are reported in unmappedIds. |
| status | string | – | Job state: "finished" (one completed results page included) or "running" (poll with ticket). |
| ticket | string | – | Running-job ticket (present only when status is "running"). Pass it alone to poll the same job. |
| unmappedIds | array | – | Source IDs UniProt reported as failed on this completed page. Absent when none failed. |
No examples provided.
uniprot_search_proteins uniprot-mcp-server: search proteins ~534
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 include TrEMBL. Request facets (e.g. reviewed, model_organism) for server-side count breakdowns. Results page forward with an opaque cursor; UniProtKB has no offset paging. This is the discovery entry point — chain results[].accession into uniprot_get_entry for full records, or uniprot_get_sequence for FASTA.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | Opaque forward-pagination cursor from a prior response. Walk pages with this; random access to page N is not supported. |
| facets | string | – | Comma-separated upstream facet names for count breakdowns, e.g. "reviewed,model_organism,proteins_with". Returns a facets array alongside the hits. |
| fields | string | – | 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 snipp… |
| organism_id | integer | – | Restrict to an NCBI taxon ID, e.g. 9606 for human. A convenience filter ANDed onto the query; resolve names with uniprot_get_taxonomy. |
| query | string | – | 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… |
| reviewed | boolean | – | Restrict to reviewed Swiss-Prot entries. Defaults to true (curated only); set false to include unreviewed TrEMBL. Ignored when query already pins a reviewed: clause. |
| size | integer | – | Number of hits per page (max 500). Omit for the server default. |
| text_search | string | – | Plain-language search across protein names, gene names, and function, e.g. "kinase apoptosis". Provide this OR query, not both. |
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | Forward cursor for the next page. Absent on the last page. |
| effectiveQuery | string | – | The query as the server assembled and sent it to UniProtKB. |
| error | object | – | Present when the call failed. Absent on success. |
| facets | array | – | Upstream facet count breakdowns. Present only when facets were requested. |
| notice | string | – | Guidance when nothing matched — echoes the query and suggests how to broaden. |
| results | array | – | Matching protein hits for this page. |
| totalResults | number | – | Total matches for the query before pagination (from the upstream result count). |
No examples provided.
What is the io.github.cyanheads/uniprot-mcp-server server?
io.github.cyanheads/uniprot-mcp-server is listed in the public MCP registry as io.github.cyanheads/uniprot-mcp-server. Protein research over UniProtKB, search by function, fetch curated records, map IDs, proteomes. This page covers its hosted endpoint (https://uniprot.caseyjhand.com/mcp).
Is the io.github.cyanheads/uniprot-mcp-server server safe to use?
io.github.cyanheads/uniprot-mcp-server scores 82 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the io.github.cyanheads/uniprot-mcp-server server expose?
io.github.cyanheads/uniprot-mcp-server exposes 6 tools: uniprot_search_proteins, uniprot_get_entry, uniprot_map_ids, uniprot_get_proteome, uniprot_get_taxonomy, uniprot_get_sequence. Their descriptions and schemas cost roughly 2,109 tokens of context every time the server is loaded.
Does the io.github.cyanheads/uniprot-mcp-server server require authentication?
No. We connected to io.github.cyanheads/uniprot-mcp-server without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.
Is the io.github.cyanheads/uniprot-mcp-server server still maintained?
io.github.cyanheads/uniprot-mcp-server is still listed as active in the MCP registry. We last reached this channel on 21 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.