Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Analyze and engineer protein glycosylation. Scan sequences for N-glycosylation sequons (N-X-S/T), predict O-glycosylation hotspots, and access curated glycoengineering tools (NetOGlyc, GlycoShield, GlycoWorkbench). For glycoprotein engineering, therapeutic antibody optimization, and vaccine design.
.claude/skills/k-dense-ai-glycoengineering/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 114% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 33% | 0% |
| case-20 | ✗→✓ | ▲ Improved | 411% | 0% |
| case-21 | ✗→✓ | ▲ Improved | 360% | 0% |
| case-02 | ✓→✓ | = Same ✓ | 213% | 0% |
Glycosylation is the most common and complex post-translational modification (PTM) of proteins, affecting over 50% of all human proteins. Glycans regulate protein folding, stability, immune recognition, receptor interactions, and pharmacokinetics of therapeutic proteins. Glycoengineering involves rational modification of glycosylation patterns for improved therapeutic efficacy, stability, or immune evasion.
Two major glycosylation types:
Use this skill when:
N-glycosylation occurs at the sequon N-X-S/T] where X ≠ Proline.
pythonimport re from typing import List, Tuple def find_n_glycosylation_sequons(sequence: str) -> List[dict]: """ Scan a protein sequence for canonical N-linked glycosylation sequons. Motif: N-X-[S/T], where X ≠ Proline. Args: sequence: Single-letter amino acid sequence Returns: List of dicts with position (1-based), motif, and context """ seq = sequence.upper() results = [] i = 0 while i <= len(seq) - 3: triplet = seq[i:i+3] if triplet[0] == 'N' and triplet[1] != 'P' and triplet[2] in {'S', 'T'}: context = seq[max(0, i-3):i+6] # ±3 residue context results.append({ 'position': i + 1, # 1-based 'motif': triplet, 'context': context, 'sequon_type': 'NXS' if triplet[2] == 'S' else 'NXT' }) i += 3 else: i += 1 return results def summarize_glycosylation_sites(sequence: str, protein_name: str = "") -> str: """Generate a research log summary of N-glycosylation sites.""" sequons = find_n_glycosylation_sequons(sequence) lines = [f"# N-Glycosylation Sequon Analysis: {protein_name or 'Protein'}"] lines.append(f"Sequence length: {len(sequence)}") lines.append(f"Total N-glycosylation sequons: {len(sequons)}") if sequons: lines.append(f"\nN-X-S sites: {sum(1 for s in sequons if s['sequon_type'] == 'NXS')}") lines.append(f"N-X-T sites: {sum(1 for s in sequons if s['sequon_type'] == 'NXT')}") lines.append(f"\nSite details:") for s in sequons: lines.append(f" Position {s['position']}: {s['motif']} (context: ...{s['context']}...)") else: lines.append("No canonical N-glycosylation sequons detected.") return "\n".join(lines) # Example: IgG1 Fc region fc_sequence = "APELLGGPSVFLFPPKPKDTLMISRTPEVTCVVVDVSHEDPEVKFNWYVDGVEVHNAKTKPREEQYNSTYRVVSVLTVLHQDWLNGKEYKCKVSNKALPAPIEKTISKAKGQPREPQVYTLPPSREEMTKNQVSLTCLVKGFYPSDIAVEWESNGQPENNYKTTPPVLDSDGSFFLYSKLTVDKSRWQQGNVFSCSVMHEALHNHYTQKSLSLSPGK" print(summarize_glycosylation_sites(fc_sequence, "IgG1 Fc"))
pythondef eliminate_glycosite(sequence: str, position: int, replacement: str = "Q") -> str: """ Eliminate an N-glycosylation site by substituting Asn → Gln (conservative). Args: sequence: Protein sequence position: 1-based position of the Asn to mutate replacement: Amino acid to substitute (default Q = Gln; similar size, not glycosylated) Returns: Mutated sequence """ seq = list(sequence.upper()) idx = position - 1 assert seq[idx] == 'N', f"Position {position} is '{seq[idx]}', not 'N'" seq[idx] = replacement.upper() return ''.join(seq) def add_glycosite(sequence: str, position: int, flanking_context: str = "S") -> str: """ Introduce an N-glycosylation site by mutating a residue to Asn, and ensuring X ≠ Pro and +2 = S/T. Args: position: 1-based position to introduce Asn flanking_context: 'S' or 'T' at position+2 (if modification needed) """ seq = list(sequence.upper()) idx = position - 1 # Mutate to Asn seq[idx] = 'N' # Ensure X+1 != Pro (mutate to Ala if needed) if idx + 1 < len(seq) and seq[idx + 1] == 'P': seq[idx + 1] = 'A' # Ensure X+2 = S or T if idx + 2 < len(seq) and seq[idx + 2] not in ('S', 'T'): seq[idx + 2] = flanking_context return ''.join(seq)
pythondef predict_o_glycosylation_hotspots( sequence: str, window: int = 7, min_st_fraction: float = 0.4, disallow_proline_next: bool = True ) -> List[dict]: """ Heuristic O-glycosylation hotspot scoring based on local S/T density. Not a substitute for NetOGlyc; use as fast baseline. Rules: - O-GalNAc glycosylation clusters on Ser/Thr-rich segments - Flag Ser/Thr residues in windows enriched for S/T - Avoid S/T immediately followed by Pro (TP/SP motifs inhibit GalNAc-T) Args: window: Odd window size for local S/T density min_st_fraction: Minimum fraction of S/T in window to flag site """ if window % 2 == 0: window = 7 seq = sequence.upper() half = window // 2 candidates = [] for i, aa in enumerate(seq): if aa not in ('S', 'T'): continue if disallow_proline_next and i + 1 < len(seq) and seq[i+1] == 'P': continue start = max(0, i - half) end = min(len(seq), i + half + 1) segment = seq[start:end] st_count = sum(1 for c in segment if c in ('S', 'T')) frac = st_count / len(segment) if frac >= min_st_fraction: candidates.append({ 'position': i + 1, 'residue': aa, 'st_fraction': round(frac, 3), 'window': f"{start+1}-{end}", 'segment': segment }) return candidates
Web service for high-accuracy O-GalNAc site prediction:
pythonimport requests def submit_netoglycv4(fasta_sequence: str) -> str: """ Submit sequence to NetOGlyc 4.0 web service. Returns the job URL for result retrieval. Note: This uses the DTU Health Tech web service. Results take ~1-5 min. """ url = "https://services.healthtech.dtu.dk/cgi-bin/webface2.cgi" # NetOGlyc submission (parameters may vary with web service version) # Recommend using the web interface directly for most use cases print("Submit sequence at: https://services.healthtech.dtu.dk/services/NetOGlyc-4.0/") return url # Also: NetNGlyc for N-glycosylation prediction # URL: https://services.healthtech.dtu.dk/services/NetNGlyc-1.0/
GlycoSHIELD grafts libraries of pre-simulated glycan conformers onto a static protein structure and scores how much of the protein surface the glycans shield, without running new MD (Tsai et al., Cell 2024, doi:10.1016/j.cell.2024.01.034):
GlycoSHIELD is not on PyPI — uv pip install glycoshield fails. It ships as three scripts on top of a small glycoshield package (needs numpy, scipy, matplotlib, MDAnalysis; GlycoSASA.py also needs gmx from GROMACS on PATH). Install from the checkout:
bash# Installation (GPL-3.0). Glycan conformer libraries are downloaded separately — # see glycan_library_downloader.py and GLYCAN_LIBRARY/ in the repository. git clone https://gitlab.mpcdf.mpg.de/dioscuri-biophysics/glycoshield-md.git cd glycoshield-md uv pip install -e . # 1. Graft glycan conformers onto each sequon listed in the input file. # One line per site: <chain> <res-1,res,res+1> <1,2,3> <glycan.pdb> <glycan.xtc> <out.pdb> <out.xtc> python GlycoSHIELD.py --protpdb protein.pdb --inputfile sequons_input \ --threshold 3.5 --mode CG --shuffle-sugar # 2. Per-residue shielding score across the grafted ensembles (probe radii in nm) python GlycoSASA.py --pdblist A_463.pdb,A_492.pdb --xtclist A_463.xtc,A_492.xtc \ --probelist 0.14,0.25 --plottrace
Illustrative: the flags come from the scripts' argparse definitions and the upstream tutorial (N-cadherin EC5 with Man5 glycans); they were not run here. --mode CG checks clashes against Cα atoms only and pairs with --threshold 3.5; --mode All with --threshold 0.7 is the all-atom setting.
pythonimport requests def query_glyconnect(uniprot_id: str) -> dict: """Query GlyConnect for glycosylation data for a protein.""" url = f"https://glyconnect.expasy.org/api/proteins/uniprot/{uniprot_id}" response = requests.get(url, headers={"Accept": "application/json"}) if response.status_code == 200: return response.json() return {} # Example: query EGFR glycosylation egfr_glyco = query_glyconnect("P00533")
| Goal | Strategy | Notes | |------|----------|-------| | Enhance ADCC | Defucosylation at Fc Asn297 | Afucosylated IgG1 has ~50× better FcγRIIIa binding | | Reduce immunogenicity | Remove non-human glycans | Eliminate α-Gal, NGNA epitopes | | Improve PK half-life | Sialylation | Sialylated glycans extend half-life | | Reduce inflammation | Hypersialylation | IVIG anti-inflammatory mechanism | | Create glycan shield | Add N-glycosites to surface | Masks vulnerable epitopes (vaccine design) |
| Mutation | Effect | |----------|--------| | N297A/Q (IgG1) | Removes Fc glycosylation (aglycosyl) | | N297D (IgG1) | Removes Fc glycosylation | | S298A/E333A/K334A | Increases FcγRIIIa binding | | F243L (IgG1) | Increases defucosylation | | T299A | Removes Fc glycosylation |
| Symbol | Full Name | Type | |--------|-----------|------| | Glc | Glucose | Hexose | | GlcNAc | N-Acetylglucosamine | HexNAc | | Man | Mannose | Hexose | | Gal | Galactose | Hexose | | Fuc | Fucose | Deoxyhexose | | Neu5Ac | N-Acetylneuraminic acid (Sialic acid) | Sialic acid | | GalNAc | N-Acetylgalactosamine | HexNAc |
Typical complex biantennary N-glycan:
Neu5Ac-Gal-GlcNAc-Man\
Man-GlcNAc-GlcNAc-[Asn]
Neu5Ac-Gal-GlcNAc-Man/
(±Core Fuc at innermost GlcNAc)| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 18,926 | 22,906 | +21% | 1 | 1 | 0% | 4,575 | 9,807 | +114% | 0 | 0 | — |
case-02 | pass→pass | 7,957 | 8,294 | +4% | 1 | 1 | 0% | 1,613 | 5,053 | +213% | 0 | 0 | — |
case-03 | pass→pass | 9,422 | 13,156 | +40% | 1 | 1 | 0% | 1,669 | 4,775 | +186% | 0 | 0 | — |
case-04 | pass→pass | 4,694 | 6,375 | +36% | 1 | 1 | 0% | 996 | 4,770 | +379% | 0 | 0 | — |
case-05 | pass→pass | 5,180 | 7,114 | +37% | 1 | 1 | 0% | 978 | 4,925 | +404% | 0 | 0 | — |
case-06 | pass→pass | 5,964 | 4,897 | -18% | 1 | 1 | 0% | 1,130 | 4,439 | +293% | 0 | 0 | — |
case-07 | pass→pass | 4,345 | 5,532 | +27% | 1 | 1 | 0% | 782 | 4,604 | +489% | 0 | 0 | — |
case-08 | pass→pass | 5,285 | 5,042 | -5% | 1 | 1 | 0% | 982 | 4,434 | +352% | 0 | 0 | — |
case-09 | fail→pass | 19,090 | 7,155 | -63% | 1 | 1 | 0% | 3,792 | 5,051 | +33% | 0 | 0 | — |
case-10 | pass→pass | 4,464 | 3,365 | -25% | 1 | 1 | 0% | 811 | 4,156 | +412% | 0 | 0 | — |
case-11 | pass→pass | 5,767 | 5,070 | -12% | 1 | 1 | 0% | 967 | 4,526 | +368% | 0 | 0 | — |
case-12 | pass→pass | 3,309 | 2,150 | -35% | 1 | 1 | 0% | 585 | 3,877 | +563% | 0 | 0 | — |
case-13 | pass→pass | 7,950 | 5,619 | -29% | 1 | 1 | 0% | 1,445 | 4,681 | +224% | 0 | 0 | — |
case-14 | pass→pass | 10,518 | 4,776 | -55% | 1 | 1 | 0% | 1,803 | 4,393 | +144% | 0 | 0 | — |
case-15 | pass→pass | 21,893 | 9,490 | -57% | 1 | 1 | 0% | 3,505 | 5,207 | +49% | 0 | 0 | — |
case-16 | pass→pass | 4,252 | 3,403 | -20% | 1 | 1 | 0% | 885 | 4,177 | +372% | 0 | 0 | — |
case-17 | pass→pass | 72,972 | 9,742 | -87% | 1 | 1 | 0% | 1,945 | 5,368 | +176% | 0 | 0 | — |
case-18 | pass→pass | 6,166 | 7,641 | +24% | 1 | 1 | 0% | 1,097 | 4,849 | +342% | 0 | 0 | — |
case-19 | pass→pass | 4,717 | 3,115 | -34% | 1 | 1 | 0% | 758 | 4,024 | +431% | 0 | 0 | — |
case-20 | fail→pass | 4,856 | 5,712 | +18% | 1 | 1 | 0% | 895 | 4,569 | +411% | 0 | 0 | — |
case-21 | fail→pass | 39,861 | 21,428 | -46% | 1 | 1 | 0% | 1,582 | 7,280 | +360% | 0 | 0 | — |
case-22 | pass→pass | 16,945 | 17,798 | +5% | 1 | 1 | 0% | 2,897 | 6,708 | +132% | 0 | 0 | — |
case-23 | pass→pass | 14,614 | 20,734 | +42% | 1 | 1 | 0% | 2,680 | 7,174 | +168% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted, and 22 counted toward the lift figure. The other 1 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +17 percentage points is the difference between those two pass rates over the 22 comparable cases.
The publisher has shipped newer versions since this run, so these numbers describe v1, not the version currently listed.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.