Identifier translation is handled rather than pushed back at you: a PDB ID resolves to its UniProt accession through the sequence cross-reference, and a similarity search accepts a raw sequence or either identifier. Defaults are worth knowing before trusting a single answer: best_available optimises for the best model rather than biological representativeness, ligand components are ranked by deposition frequency so the top hit is the most-deposited match rather than an exact name match, and binding sites exist only for experimental entries because predicted models carry no bound ligands.
One federated surface over experimental structures (RCSB PDB) and predicted models (AlphaFold, 3D-Beacons), plus the annotation databases beside them — UniProt, InterPro, GO — and the Foldseek and RCSB comparison services. Search, fetch and compare treat both universes the same, and every upstream is public, so there is no key to provision.
- protein_search_structures takes free text, a protein sequence which triggers an mmseqs2 similarity search, or organism, method and resolution filters, and content_type decides whether you get experimental entries, computed models, or a genuine union of both.
- protein_get_structure fetches metadata and coordinate-file URLs — PDB entry IDs batched in one call, UniProt accessions for the AlphaFold model with pLDDT and PAE confidence, or best_available for the top federated model per accession. Unresolved IDs come back in a failed list rather than sinking the batch.
- protein_find_similar runs a synchronous mmseqs2 sequence search or an asynchronous Foldseek fold search, from a raw sequence, a PDB ID or a UniProt accession; a job that outruns the poll budget hands back a ticket to resume rather than blocking.
- protein_track_ligands resolves a name or formula to chemical component IDs with formula, weight and SMILES, lists the entries containing a component, or returns the residues lining a ligand's pocket with contact distances.
- protein_compare_structures aligns via TM-align or jFATCAT — every structure to the first, or the full pairwise matrix — returning TM-score, RMSD and aligned-residue count per pair, with a failed pair degrading its own row only.
- protein_analyze_collection profiles the corpus server-side on RCSB's facet engine: counts by method, organism or polymer composition, resolution and molecular-weight histograms, release-year timelines and cross-tabs, with no rows pulled.
- protein_get_annotations returns UniProt features and natural variants plus InterPro family memberships with GO terms, resolving a PDB ID to its accession through the sequence cross-reference and naming the alternatives when a multi-chain entry is ambiguous.
- Structure and annotation responses carry an attribution block naming the licence and citation for each source that contributed — the obligation travels with the data rather than staying on a page you have to remember.
No account and no key: RCSB, AlphaFold DB, 3D-Beacons, UniProt, InterPro and Foldseek are all public. Point a client at the public instance at https://protein.caseyjhand.com/mcp and install nothing, or run your own over stdio or Streamable HTTP on Bun v1.3.2 or newer, or Node.js v24. Either way the host needs outbound network access.
One command — npx -y @cyanheads/protein-mcp-server@latest
