[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-anthropic-single-cell-rna-qc":3,"mdc--89lnml-key":34,"related-repo-anthropic-single-cell-rna-qc":1188,"related-org-anthropic-single-cell-rna-qc":1274},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":27,"topics":28,"repo":29,"sourceUrl":32,"mdContent":33},"single-cell-rna-qc","run quality control on single-cell RNA-seq data","Performs quality control on single-cell RNA-seq data (.h5ad or .h5 files) using scverse best practices with MAD-based filtering and comprehensive visualizations. Use when users request QC analysis, filtering low-quality cells, assessing data quality, or following scverse\u002Fscanpy best practices for single-cell analysis.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"anthropic","Anthropic","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fanthropic.png","anthropics",[13,17,20],{"name":14,"slug":15,"type":16},"Life Sciences","life-sciences","tag",{"name":18,"slug":19,"type":16},"Bioinformatics","bioinformatics",{"name":21,"slug":22,"type":16},"RNA-seq","rna-seq",537,"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Flife-sciences","2026-04-06T17:57:01.442679",null,101,[],{"repoUrl":24,"stars":23,"forks":27,"topics":30,"description":31},[],"Repo for the Claude Code Marketplace to use with the Claude for Life Sciences Launch. This will continue to host the marketplace.json long-term, but not the actual MCP servers.","https:\u002F\u002Fgithub.com\u002Fanthropics\u002Flife-sciences\u002Ftree\u002FHEAD\u002Fsingle-cell-rna-qc","---\nname: single-cell-rna-qc\ndescription: Performs quality control on single-cell RNA-seq data (.h5ad or .h5 files) using scverse best practices with MAD-based filtering and comprehensive visualizations. Use when users request QC analysis, filtering low-quality cells, assessing data quality, or following scverse\u002Fscanpy best practices for single-cell analysis.\n---\n\n# Single-Cell RNA-seq Quality Control\n\nAutomated QC workflow for single-cell RNA-seq data following scverse best practices.\n\n## When to Use This Skill\n\nUse when users:\n- Request quality control or QC on single-cell RNA-seq data\n- Want to filter low-quality cells or assess data quality\n- Need QC visualizations or metrics\n- Ask to follow scverse\u002Fscanpy best practices\n- Request MAD-based filtering or outlier detection\n\n**Supported input formats:**\n- `.h5ad` files (AnnData format from scanpy\u002FPython workflows)\n- `.h5` files (10X Genomics Cell Ranger output)\n\n**Default recommendation**: Use Approach 1 (complete pipeline) unless the user has specific custom requirements or explicitly requests non-standard filtering logic.\n\n## Approach 1: Complete QC Pipeline (Recommended for Standard Workflows)\n\nFor standard QC following scverse best practices, use the convenience script `scripts\u002Fqc_analysis.py`:\n\n```bash\npython3 scripts\u002Fqc_analysis.py input.h5ad\n# or for 10X Genomics .h5 files:\npython3 scripts\u002Fqc_analysis.py raw_feature_bc_matrix.h5\n```\n\nThe script automatically detects the file format and loads it appropriately.\n\n**When to use this approach:**\n- Standard QC workflow with adjustable thresholds (all cells filtered the same way)\n- Batch processing multiple datasets\n- Quick exploratory analysis\n- User wants the \"just works\" solution\n\n**Requirements:** anndata, scanpy, scipy, matplotlib, seaborn, numpy\n\n**Parameters:**\n\nCustomize filtering thresholds and gene patterns using command-line parameters:\n- `--output-dir` - Output directory\n- `--mad-counts`, `--mad-genes`, `--mad-mt` - MAD thresholds for counts\u002Fgenes\u002FMT%\n- `--mt-threshold` - Hard mitochondrial % cutoff\n- `--min-cells` - Gene filtering threshold\n- `--mt-pattern`, `--ribo-pattern`, `--hb-pattern` - Gene name patterns for different species\n\nUse `--help` to see current default values.\n\n**Outputs:**\n\nAll files are saved to `\u003Cinput_basename>_qc_results\u002F` directory by default (or to the directory specified by `--output-dir`):\n- `qc_metrics_before_filtering.png` - Pre-filtering visualizations\n- `qc_filtering_thresholds.png` - MAD-based threshold overlays\n- `qc_metrics_after_filtering.png` - Post-filtering quality metrics\n- `\u003Cinput_basename>_filtered.h5ad` - Clean, filtered dataset ready for downstream analysis\n- `\u003Cinput_basename>_with_qc.h5ad` - Original data with QC annotations preserved\n\nIf copying outputs to `\u002Fmnt\u002Fuser-data\u002Foutputs\u002F` for user access, copy individual files (not the entire directory) so users can preview them directly as Claude.ai artifacts.\n\n### Workflow Steps\n\nThe script performs the following steps:\n\n1. **Calculate QC metrics** - Count depth, gene detection, mitochondrial\u002Fribosomal\u002Fhemoglobin content\n2. **Apply MAD-based filtering** - Permissive outlier detection using MAD thresholds for counts\u002Fgenes\u002FMT%\n3. **Filter genes** - Remove genes detected in few cells\n4. **Generate visualizations** - Comprehensive before\u002Fafter plots with threshold overlays\n\n## Approach 2: Modular Building Blocks (For Custom Workflows)\n\nFor custom analysis workflows or non-standard requirements, use the modular utility functions from `scripts\u002Fqc_core.py` and `scripts\u002Fqc_plotting.py`:\n\n```python\n# Run from scripts\u002F directory, or add scripts\u002F to sys.path if needed\nimport anndata as ad\nfrom qc_core import calculate_qc_metrics, detect_outliers_mad, filter_cells\nfrom qc_plotting import plot_qc_distributions  # Only if visualization needed\n\nadata = ad.read_h5ad('input.h5ad')\ncalculate_qc_metrics(adata, inplace=True)\n# ... custom analysis logic here\n```\n\n**When to use this approach:**\n- Different workflow needed (skip steps, change order, apply different thresholds to subsets)\n- Conditional logic (e.g., filter neurons differently than other cells)\n- Partial execution (only metrics\u002Fvisualization, no filtering)\n- Integration with other analysis steps in a larger pipeline\n- Custom filtering criteria beyond what command-line params support\n\n**Available utility functions:**\n\nFrom `qc_core.py` (core QC operations):\n- `calculate_qc_metrics(adata, mt_pattern, ribo_pattern, hb_pattern, inplace=True)` - Calculate QC metrics and annotate adata\n- `detect_outliers_mad(adata, metric, n_mads, verbose=True)` - MAD-based outlier detection, returns boolean mask\n- `apply_hard_threshold(adata, metric, threshold, operator='>', verbose=True)` - Apply hard cutoffs, returns boolean mask\n- `filter_cells(adata, mask, inplace=False)` - Apply boolean mask to filter cells\n- `filter_genes(adata, min_cells=20, min_counts=None, inplace=True)` - Filter genes by detection\n- `print_qc_summary(adata, label='')` - Print summary statistics\n\nFrom `qc_plotting.py` (visualization):\n- `plot_qc_distributions(adata, output_path, title)` - Generate comprehensive QC plots\n- `plot_filtering_thresholds(adata, outlier_masks, thresholds, output_path)` - Visualize filtering thresholds\n- `plot_qc_after_filtering(adata, output_path)` - Generate post-filtering plots\n\n**Example custom workflows:**\n\n**Example 1: Only calculate metrics and visualize, don't filter yet**\n```python\nadata = ad.read_h5ad('input.h5ad')\ncalculate_qc_metrics(adata, inplace=True)\nplot_qc_distributions(adata, 'qc_before.png', title='Initial QC')\nprint_qc_summary(adata, label='Before filtering')\n```\n\n**Example 2: Apply only MT% filtering, keep other metrics permissive**\n```python\nadata = ad.read_h5ad('input.h5ad')\ncalculate_qc_metrics(adata, inplace=True)\n\n# Only filter high MT% cells\nhigh_mt = apply_hard_threshold(adata, 'pct_counts_mt', 10, operator='>')\nadata_filtered = filter_cells(adata, ~high_mt)\nadata_filtered.write('filtered.h5ad')\n```\n\n**Example 3: Different thresholds for different subsets**\n```python\nadata = ad.read_h5ad('input.h5ad')\ncalculate_qc_metrics(adata, inplace=True)\n\n# Apply type-specific QC (assumes cell_type metadata exists)\nneurons = adata.obs['cell_type'] == 'neuron'\nother_cells = ~neurons\n\n# Neurons tolerate higher MT%, other cells use stricter threshold\nneuron_qc = apply_hard_threshold(adata[neurons], 'pct_counts_mt', 15, operator='>')\nother_qc = apply_hard_threshold(adata[other_cells], 'pct_counts_mt', 8, operator='>')\n```\n\n## Best Practices\n\n1. **Be permissive with filtering** - Default thresholds intentionally retain most cells to avoid losing rare populations\n2. **Inspect visualizations** - Always review before\u002Fafter plots to ensure filtering makes biological sense\n3. **Consider dataset-specific factors** - Some tissues naturally have higher mitochondrial content (e.g., neurons, cardiomyocytes)\n4. **Check gene annotations** - Mitochondrial gene prefixes vary by species (mt- for mouse, MT- for human)\n5. **Iterate if needed** - QC parameters may need adjustment based on the specific experiment or tissue type\n\n## Reference Materials\n\nFor detailed QC methodology, parameter rationale, and troubleshooting guidance, see `references\u002Fscverse_qc_guidelines.md`. This reference provides:\n- Detailed explanations of each QC metric and why it matters\n- Rationale for MAD-based thresholds and why they're better than fixed cutoffs\n- Guidelines for interpreting QC visualizations (histograms, violin plots, scatter plots)\n- Species-specific considerations for gene annotations\n- When and how to adjust filtering parameters\n- Advanced QC considerations (ambient RNA correction, doublet detection)\n\nLoad this reference when users need deeper understanding of the methodology or when troubleshooting QC issues.\n\n## Next Steps After QC\n\nTypical downstream analysis steps:\n- Ambient RNA correction (SoupX, CellBender)\n- Doublet detection (scDblFinder)\n- Normalization (log-normalize, scran)\n- Feature selection and dimensionality reduction\n- Clustering and cell type annotation\n",{"data":35,"body":36},{"name":4,"description":6},{"type":37,"children":38},"root",[39,48,54,61,66,96,105,131,141,147,160,221,226,234,257,267,275,280,367,380,388,408,466,479,486,491,535,541,561,640,647,675,683,696,765,777,813,821,829,866,874,934,942,1027,1033,1086,1092,1105,1138,1143,1149,1154,1182],{"type":40,"tag":41,"props":42,"children":44},"element","h1",{"id":43},"single-cell-rna-seq-quality-control",[45],{"type":46,"value":47},"text","Single-Cell RNA-seq Quality Control",{"type":40,"tag":49,"props":50,"children":51},"p",{},[52],{"type":46,"value":53},"Automated QC workflow for single-cell RNA-seq data following scverse best practices.",{"type":40,"tag":55,"props":56,"children":58},"h2",{"id":57},"when-to-use-this-skill",[59],{"type":46,"value":60},"When to Use This Skill",{"type":40,"tag":49,"props":62,"children":63},{},[64],{"type":46,"value":65},"Use when users:",{"type":40,"tag":67,"props":68,"children":69},"ul",{},[70,76,81,86,91],{"type":40,"tag":71,"props":72,"children":73},"li",{},[74],{"type":46,"value":75},"Request quality control or QC on single-cell RNA-seq data",{"type":40,"tag":71,"props":77,"children":78},{},[79],{"type":46,"value":80},"Want to filter low-quality cells or assess data quality",{"type":40,"tag":71,"props":82,"children":83},{},[84],{"type":46,"value":85},"Need QC visualizations or metrics",{"type":40,"tag":71,"props":87,"children":88},{},[89],{"type":46,"value":90},"Ask to follow scverse\u002Fscanpy best practices",{"type":40,"tag":71,"props":92,"children":93},{},[94],{"type":46,"value":95},"Request MAD-based filtering or outlier detection",{"type":40,"tag":49,"props":97,"children":98},{},[99],{"type":40,"tag":100,"props":101,"children":102},"strong",{},[103],{"type":46,"value":104},"Supported input formats:",{"type":40,"tag":67,"props":106,"children":107},{},[108,120],{"type":40,"tag":71,"props":109,"children":110},{},[111,118],{"type":40,"tag":112,"props":113,"children":115},"code",{"className":114},[],[116],{"type":46,"value":117},".h5ad",{"type":46,"value":119}," files (AnnData format from scanpy\u002FPython workflows)",{"type":40,"tag":71,"props":121,"children":122},{},[123,129],{"type":40,"tag":112,"props":124,"children":126},{"className":125},[],[127],{"type":46,"value":128},".h5",{"type":46,"value":130}," files (10X Genomics Cell Ranger output)",{"type":40,"tag":49,"props":132,"children":133},{},[134,139],{"type":40,"tag":100,"props":135,"children":136},{},[137],{"type":46,"value":138},"Default recommendation",{"type":46,"value":140},": Use Approach 1 (complete pipeline) unless the user has specific custom requirements or explicitly requests non-standard filtering logic.",{"type":40,"tag":55,"props":142,"children":144},{"id":143},"approach-1-complete-qc-pipeline-recommended-for-standard-workflows",[145],{"type":46,"value":146},"Approach 1: Complete QC Pipeline (Recommended for Standard Workflows)",{"type":40,"tag":49,"props":148,"children":149},{},[150,152,158],{"type":46,"value":151},"For standard QC following scverse best practices, use the convenience script ",{"type":40,"tag":112,"props":153,"children":155},{"className":154},[],[156],{"type":46,"value":157},"scripts\u002Fqc_analysis.py",{"type":46,"value":159},":",{"type":40,"tag":161,"props":162,"children":167},"pre",{"className":163,"code":164,"language":165,"meta":166,"style":166},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","python3 scripts\u002Fqc_analysis.py input.h5ad\n# or for 10X Genomics .h5 files:\npython3 scripts\u002Fqc_analysis.py raw_feature_bc_matrix.h5\n","bash","",[168],{"type":40,"tag":112,"props":169,"children":170},{"__ignoreMap":166},[171,194,204],{"type":40,"tag":172,"props":173,"children":176},"span",{"class":174,"line":175},"line",1,[177,183,189],{"type":40,"tag":172,"props":178,"children":180},{"style":179},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[181],{"type":46,"value":182},"python3",{"type":40,"tag":172,"props":184,"children":186},{"style":185},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[187],{"type":46,"value":188}," scripts\u002Fqc_analysis.py",{"type":40,"tag":172,"props":190,"children":191},{"style":185},[192],{"type":46,"value":193}," input.h5ad\n",{"type":40,"tag":172,"props":195,"children":197},{"class":174,"line":196},2,[198],{"type":40,"tag":172,"props":199,"children":201},{"style":200},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[202],{"type":46,"value":203},"# or for 10X Genomics .h5 files:\n",{"type":40,"tag":172,"props":205,"children":207},{"class":174,"line":206},3,[208,212,216],{"type":40,"tag":172,"props":209,"children":210},{"style":179},[211],{"type":46,"value":182},{"type":40,"tag":172,"props":213,"children":214},{"style":185},[215],{"type":46,"value":188},{"type":40,"tag":172,"props":217,"children":218},{"style":185},[219],{"type":46,"value":220}," raw_feature_bc_matrix.h5\n",{"type":40,"tag":49,"props":222,"children":223},{},[224],{"type":46,"value":225},"The script automatically detects the file format and loads it appropriately.",{"type":40,"tag":49,"props":227,"children":228},{},[229],{"type":40,"tag":100,"props":230,"children":231},{},[232],{"type":46,"value":233},"When to use this approach:",{"type":40,"tag":67,"props":235,"children":236},{},[237,242,247,252],{"type":40,"tag":71,"props":238,"children":239},{},[240],{"type":46,"value":241},"Standard QC workflow with adjustable thresholds (all cells filtered the same way)",{"type":40,"tag":71,"props":243,"children":244},{},[245],{"type":46,"value":246},"Batch processing multiple datasets",{"type":40,"tag":71,"props":248,"children":249},{},[250],{"type":46,"value":251},"Quick exploratory analysis",{"type":40,"tag":71,"props":253,"children":254},{},[255],{"type":46,"value":256},"User wants the \"just works\" solution",{"type":40,"tag":49,"props":258,"children":259},{},[260,265],{"type":40,"tag":100,"props":261,"children":262},{},[263],{"type":46,"value":264},"Requirements:",{"type":46,"value":266}," anndata, scanpy, scipy, matplotlib, seaborn, numpy",{"type":40,"tag":49,"props":268,"children":269},{},[270],{"type":40,"tag":100,"props":271,"children":272},{},[273],{"type":46,"value":274},"Parameters:",{"type":40,"tag":49,"props":276,"children":277},{},[278],{"type":46,"value":279},"Customize filtering thresholds and gene patterns using command-line parameters:",{"type":40,"tag":67,"props":281,"children":282},{},[283,294,320,331,342],{"type":40,"tag":71,"props":284,"children":285},{},[286,292],{"type":40,"tag":112,"props":287,"children":289},{"className":288},[],[290],{"type":46,"value":291},"--output-dir",{"type":46,"value":293}," - Output directory",{"type":40,"tag":71,"props":295,"children":296},{},[297,303,305,311,312,318],{"type":40,"tag":112,"props":298,"children":300},{"className":299},[],[301],{"type":46,"value":302},"--mad-counts",{"type":46,"value":304},", ",{"type":40,"tag":112,"props":306,"children":308},{"className":307},[],[309],{"type":46,"value":310},"--mad-genes",{"type":46,"value":304},{"type":40,"tag":112,"props":313,"children":315},{"className":314},[],[316],{"type":46,"value":317},"--mad-mt",{"type":46,"value":319}," - MAD thresholds for counts\u002Fgenes\u002FMT%",{"type":40,"tag":71,"props":321,"children":322},{},[323,329],{"type":40,"tag":112,"props":324,"children":326},{"className":325},[],[327],{"type":46,"value":328},"--mt-threshold",{"type":46,"value":330}," - Hard mitochondrial % cutoff",{"type":40,"tag":71,"props":332,"children":333},{},[334,340],{"type":40,"tag":112,"props":335,"children":337},{"className":336},[],[338],{"type":46,"value":339},"--min-cells",{"type":46,"value":341}," - Gene filtering threshold",{"type":40,"tag":71,"props":343,"children":344},{},[345,351,352,358,359,365],{"type":40,"tag":112,"props":346,"children":348},{"className":347},[],[349],{"type":46,"value":350},"--mt-pattern",{"type":46,"value":304},{"type":40,"tag":112,"props":353,"children":355},{"className":354},[],[356],{"type":46,"value":357},"--ribo-pattern",{"type":46,"value":304},{"type":40,"tag":112,"props":360,"children":362},{"className":361},[],[363],{"type":46,"value":364},"--hb-pattern",{"type":46,"value":366}," - Gene name patterns for different species",{"type":40,"tag":49,"props":368,"children":369},{},[370,372,378],{"type":46,"value":371},"Use ",{"type":40,"tag":112,"props":373,"children":375},{"className":374},[],[376],{"type":46,"value":377},"--help",{"type":46,"value":379}," to see current default values.",{"type":40,"tag":49,"props":381,"children":382},{},[383],{"type":40,"tag":100,"props":384,"children":385},{},[386],{"type":46,"value":387},"Outputs:",{"type":40,"tag":49,"props":389,"children":390},{},[391,393,399,401,406],{"type":46,"value":392},"All files are saved to ",{"type":40,"tag":112,"props":394,"children":396},{"className":395},[],[397],{"type":46,"value":398},"\u003Cinput_basename>_qc_results\u002F",{"type":46,"value":400}," directory by default (or to the directory specified by ",{"type":40,"tag":112,"props":402,"children":404},{"className":403},[],[405],{"type":46,"value":291},{"type":46,"value":407},"):",{"type":40,"tag":67,"props":409,"children":410},{},[411,422,433,444,455],{"type":40,"tag":71,"props":412,"children":413},{},[414,420],{"type":40,"tag":112,"props":415,"children":417},{"className":416},[],[418],{"type":46,"value":419},"qc_metrics_before_filtering.png",{"type":46,"value":421}," - Pre-filtering visualizations",{"type":40,"tag":71,"props":423,"children":424},{},[425,431],{"type":40,"tag":112,"props":426,"children":428},{"className":427},[],[429],{"type":46,"value":430},"qc_filtering_thresholds.png",{"type":46,"value":432}," - MAD-based threshold overlays",{"type":40,"tag":71,"props":434,"children":435},{},[436,442],{"type":40,"tag":112,"props":437,"children":439},{"className":438},[],[440],{"type":46,"value":441},"qc_metrics_after_filtering.png",{"type":46,"value":443}," - Post-filtering quality metrics",{"type":40,"tag":71,"props":445,"children":446},{},[447,453],{"type":40,"tag":112,"props":448,"children":450},{"className":449},[],[451],{"type":46,"value":452},"\u003Cinput_basename>_filtered.h5ad",{"type":46,"value":454}," - Clean, filtered dataset ready for downstream analysis",{"type":40,"tag":71,"props":456,"children":457},{},[458,464],{"type":40,"tag":112,"props":459,"children":461},{"className":460},[],[462],{"type":46,"value":463},"\u003Cinput_basename>_with_qc.h5ad",{"type":46,"value":465}," - Original data with QC annotations preserved",{"type":40,"tag":49,"props":467,"children":468},{},[469,471,477],{"type":46,"value":470},"If copying outputs to ",{"type":40,"tag":112,"props":472,"children":474},{"className":473},[],[475],{"type":46,"value":476},"\u002Fmnt\u002Fuser-data\u002Foutputs\u002F",{"type":46,"value":478}," for user access, copy individual files (not the entire directory) so users can preview them directly as Claude.ai artifacts.",{"type":40,"tag":480,"props":481,"children":483},"h3",{"id":482},"workflow-steps",[484],{"type":46,"value":485},"Workflow Steps",{"type":40,"tag":49,"props":487,"children":488},{},[489],{"type":46,"value":490},"The script performs the following steps:",{"type":40,"tag":492,"props":493,"children":494},"ol",{},[495,505,515,525],{"type":40,"tag":71,"props":496,"children":497},{},[498,503],{"type":40,"tag":100,"props":499,"children":500},{},[501],{"type":46,"value":502},"Calculate QC metrics",{"type":46,"value":504}," - Count depth, gene detection, mitochondrial\u002Fribosomal\u002Fhemoglobin content",{"type":40,"tag":71,"props":506,"children":507},{},[508,513],{"type":40,"tag":100,"props":509,"children":510},{},[511],{"type":46,"value":512},"Apply MAD-based filtering",{"type":46,"value":514}," - Permissive outlier detection using MAD thresholds for counts\u002Fgenes\u002FMT%",{"type":40,"tag":71,"props":516,"children":517},{},[518,523],{"type":40,"tag":100,"props":519,"children":520},{},[521],{"type":46,"value":522},"Filter genes",{"type":46,"value":524}," - Remove genes detected in few cells",{"type":40,"tag":71,"props":526,"children":527},{},[528,533],{"type":40,"tag":100,"props":529,"children":530},{},[531],{"type":46,"value":532},"Generate visualizations",{"type":46,"value":534}," - Comprehensive before\u002Fafter plots with threshold overlays",{"type":40,"tag":55,"props":536,"children":538},{"id":537},"approach-2-modular-building-blocks-for-custom-workflows",[539],{"type":46,"value":540},"Approach 2: Modular Building Blocks (For Custom Workflows)",{"type":40,"tag":49,"props":542,"children":543},{},[544,546,552,554,560],{"type":46,"value":545},"For custom analysis workflows or non-standard requirements, use the modular utility functions from ",{"type":40,"tag":112,"props":547,"children":549},{"className":548},[],[550],{"type":46,"value":551},"scripts\u002Fqc_core.py",{"type":46,"value":553}," and ",{"type":40,"tag":112,"props":555,"children":557},{"className":556},[],[558],{"type":46,"value":559},"scripts\u002Fqc_plotting.py",{"type":46,"value":159},{"type":40,"tag":161,"props":562,"children":566},{"className":563,"code":564,"language":565,"meta":166,"style":166},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Run from scripts\u002F directory, or add scripts\u002F to sys.path if needed\nimport anndata as ad\nfrom qc_core import calculate_qc_metrics, detect_outliers_mad, filter_cells\nfrom qc_plotting import plot_qc_distributions  # Only if visualization needed\n\nadata = ad.read_h5ad('input.h5ad')\ncalculate_qc_metrics(adata, inplace=True)\n# ... custom analysis logic here\n","python",[567],{"type":40,"tag":112,"props":568,"children":569},{"__ignoreMap":166},[570,578,586,594,603,613,622,631],{"type":40,"tag":172,"props":571,"children":572},{"class":174,"line":175},[573],{"type":40,"tag":172,"props":574,"children":575},{},[576],{"type":46,"value":577},"# Run from scripts\u002F directory, or add scripts\u002F to sys.path if needed\n",{"type":40,"tag":172,"props":579,"children":580},{"class":174,"line":196},[581],{"type":40,"tag":172,"props":582,"children":583},{},[584],{"type":46,"value":585},"import anndata as ad\n",{"type":40,"tag":172,"props":587,"children":588},{"class":174,"line":206},[589],{"type":40,"tag":172,"props":590,"children":591},{},[592],{"type":46,"value":593},"from qc_core import calculate_qc_metrics, detect_outliers_mad, filter_cells\n",{"type":40,"tag":172,"props":595,"children":597},{"class":174,"line":596},4,[598],{"type":40,"tag":172,"props":599,"children":600},{},[601],{"type":46,"value":602},"from qc_plotting import plot_qc_distributions  # Only if visualization needed\n",{"type":40,"tag":172,"props":604,"children":606},{"class":174,"line":605},5,[607],{"type":40,"tag":172,"props":608,"children":610},{"emptyLinePlaceholder":609},true,[611],{"type":46,"value":612},"\n",{"type":40,"tag":172,"props":614,"children":616},{"class":174,"line":615},6,[617],{"type":40,"tag":172,"props":618,"children":619},{},[620],{"type":46,"value":621},"adata = ad.read_h5ad('input.h5ad')\n",{"type":40,"tag":172,"props":623,"children":625},{"class":174,"line":624},7,[626],{"type":40,"tag":172,"props":627,"children":628},{},[629],{"type":46,"value":630},"calculate_qc_metrics(adata, inplace=True)\n",{"type":40,"tag":172,"props":632,"children":634},{"class":174,"line":633},8,[635],{"type":40,"tag":172,"props":636,"children":637},{},[638],{"type":46,"value":639},"# ... custom analysis logic here\n",{"type":40,"tag":49,"props":641,"children":642},{},[643],{"type":40,"tag":100,"props":644,"children":645},{},[646],{"type":46,"value":233},{"type":40,"tag":67,"props":648,"children":649},{},[650,655,660,665,670],{"type":40,"tag":71,"props":651,"children":652},{},[653],{"type":46,"value":654},"Different workflow needed (skip steps, change order, apply different thresholds to subsets)",{"type":40,"tag":71,"props":656,"children":657},{},[658],{"type":46,"value":659},"Conditional logic (e.g., filter neurons differently than other cells)",{"type":40,"tag":71,"props":661,"children":662},{},[663],{"type":46,"value":664},"Partial execution (only metrics\u002Fvisualization, no filtering)",{"type":40,"tag":71,"props":666,"children":667},{},[668],{"type":46,"value":669},"Integration with other analysis steps in a larger pipeline",{"type":40,"tag":71,"props":671,"children":672},{},[673],{"type":46,"value":674},"Custom filtering criteria beyond what command-line params support",{"type":40,"tag":49,"props":676,"children":677},{},[678],{"type":40,"tag":100,"props":679,"children":680},{},[681],{"type":46,"value":682},"Available utility functions:",{"type":40,"tag":49,"props":684,"children":685},{},[686,688,694],{"type":46,"value":687},"From ",{"type":40,"tag":112,"props":689,"children":691},{"className":690},[],[692],{"type":46,"value":693},"qc_core.py",{"type":46,"value":695}," (core QC operations):",{"type":40,"tag":67,"props":697,"children":698},{},[699,710,721,732,743,754],{"type":40,"tag":71,"props":700,"children":701},{},[702,708],{"type":40,"tag":112,"props":703,"children":705},{"className":704},[],[706],{"type":46,"value":707},"calculate_qc_metrics(adata, mt_pattern, ribo_pattern, hb_pattern, inplace=True)",{"type":46,"value":709}," - Calculate QC metrics and annotate adata",{"type":40,"tag":71,"props":711,"children":712},{},[713,719],{"type":40,"tag":112,"props":714,"children":716},{"className":715},[],[717],{"type":46,"value":718},"detect_outliers_mad(adata, metric, n_mads, verbose=True)",{"type":46,"value":720}," - MAD-based outlier detection, returns boolean mask",{"type":40,"tag":71,"props":722,"children":723},{},[724,730],{"type":40,"tag":112,"props":725,"children":727},{"className":726},[],[728],{"type":46,"value":729},"apply_hard_threshold(adata, metric, threshold, operator='>', verbose=True)",{"type":46,"value":731}," - Apply hard cutoffs, returns boolean mask",{"type":40,"tag":71,"props":733,"children":734},{},[735,741],{"type":40,"tag":112,"props":736,"children":738},{"className":737},[],[739],{"type":46,"value":740},"filter_cells(adata, mask, inplace=False)",{"type":46,"value":742}," - Apply boolean mask to filter cells",{"type":40,"tag":71,"props":744,"children":745},{},[746,752],{"type":40,"tag":112,"props":747,"children":749},{"className":748},[],[750],{"type":46,"value":751},"filter_genes(adata, min_cells=20, min_counts=None, inplace=True)",{"type":46,"value":753}," - Filter genes by detection",{"type":40,"tag":71,"props":755,"children":756},{},[757,763],{"type":40,"tag":112,"props":758,"children":760},{"className":759},[],[761],{"type":46,"value":762},"print_qc_summary(adata, label='')",{"type":46,"value":764}," - Print summary statistics",{"type":40,"tag":49,"props":766,"children":767},{},[768,769,775],{"type":46,"value":687},{"type":40,"tag":112,"props":770,"children":772},{"className":771},[],[773],{"type":46,"value":774},"qc_plotting.py",{"type":46,"value":776}," (visualization):",{"type":40,"tag":67,"props":778,"children":779},{},[780,791,802],{"type":40,"tag":71,"props":781,"children":782},{},[783,789],{"type":40,"tag":112,"props":784,"children":786},{"className":785},[],[787],{"type":46,"value":788},"plot_qc_distributions(adata, output_path, title)",{"type":46,"value":790}," - Generate comprehensive QC plots",{"type":40,"tag":71,"props":792,"children":793},{},[794,800],{"type":40,"tag":112,"props":795,"children":797},{"className":796},[],[798],{"type":46,"value":799},"plot_filtering_thresholds(adata, outlier_masks, thresholds, output_path)",{"type":46,"value":801}," - Visualize filtering thresholds",{"type":40,"tag":71,"props":803,"children":804},{},[805,811],{"type":40,"tag":112,"props":806,"children":808},{"className":807},[],[809],{"type":46,"value":810},"plot_qc_after_filtering(adata, output_path)",{"type":46,"value":812}," - Generate post-filtering plots",{"type":40,"tag":49,"props":814,"children":815},{},[816],{"type":40,"tag":100,"props":817,"children":818},{},[819],{"type":46,"value":820},"Example custom workflows:",{"type":40,"tag":49,"props":822,"children":823},{},[824],{"type":40,"tag":100,"props":825,"children":826},{},[827],{"type":46,"value":828},"Example 1: Only calculate metrics and visualize, don't filter yet",{"type":40,"tag":161,"props":830,"children":832},{"className":563,"code":831,"language":565,"meta":166,"style":166},"adata = ad.read_h5ad('input.h5ad')\ncalculate_qc_metrics(adata, inplace=True)\nplot_qc_distributions(adata, 'qc_before.png', title='Initial QC')\nprint_qc_summary(adata, label='Before filtering')\n",[833],{"type":40,"tag":112,"props":834,"children":835},{"__ignoreMap":166},[836,843,850,858],{"type":40,"tag":172,"props":837,"children":838},{"class":174,"line":175},[839],{"type":40,"tag":172,"props":840,"children":841},{},[842],{"type":46,"value":621},{"type":40,"tag":172,"props":844,"children":845},{"class":174,"line":196},[846],{"type":40,"tag":172,"props":847,"children":848},{},[849],{"type":46,"value":630},{"type":40,"tag":172,"props":851,"children":852},{"class":174,"line":206},[853],{"type":40,"tag":172,"props":854,"children":855},{},[856],{"type":46,"value":857},"plot_qc_distributions(adata, 'qc_before.png', title='Initial QC')\n",{"type":40,"tag":172,"props":859,"children":860},{"class":174,"line":596},[861],{"type":40,"tag":172,"props":862,"children":863},{},[864],{"type":46,"value":865},"print_qc_summary(adata, label='Before filtering')\n",{"type":40,"tag":49,"props":867,"children":868},{},[869],{"type":40,"tag":100,"props":870,"children":871},{},[872],{"type":46,"value":873},"Example 2: Apply only MT% filtering, keep other metrics permissive",{"type":40,"tag":161,"props":875,"children":877},{"className":563,"code":876,"language":565,"meta":166,"style":166},"adata = ad.read_h5ad('input.h5ad')\ncalculate_qc_metrics(adata, inplace=True)\n\n# Only filter high MT% cells\nhigh_mt = apply_hard_threshold(adata, 'pct_counts_mt', 10, operator='>')\nadata_filtered = filter_cells(adata, ~high_mt)\nadata_filtered.write('filtered.h5ad')\n",[878],{"type":40,"tag":112,"props":879,"children":880},{"__ignoreMap":166},[881,888,895,902,910,918,926],{"type":40,"tag":172,"props":882,"children":883},{"class":174,"line":175},[884],{"type":40,"tag":172,"props":885,"children":886},{},[887],{"type":46,"value":621},{"type":40,"tag":172,"props":889,"children":890},{"class":174,"line":196},[891],{"type":40,"tag":172,"props":892,"children":893},{},[894],{"type":46,"value":630},{"type":40,"tag":172,"props":896,"children":897},{"class":174,"line":206},[898],{"type":40,"tag":172,"props":899,"children":900},{"emptyLinePlaceholder":609},[901],{"type":46,"value":612},{"type":40,"tag":172,"props":903,"children":904},{"class":174,"line":596},[905],{"type":40,"tag":172,"props":906,"children":907},{},[908],{"type":46,"value":909},"# Only filter high MT% cells\n",{"type":40,"tag":172,"props":911,"children":912},{"class":174,"line":605},[913],{"type":40,"tag":172,"props":914,"children":915},{},[916],{"type":46,"value":917},"high_mt = apply_hard_threshold(adata, 'pct_counts_mt', 10, operator='>')\n",{"type":40,"tag":172,"props":919,"children":920},{"class":174,"line":615},[921],{"type":40,"tag":172,"props":922,"children":923},{},[924],{"type":46,"value":925},"adata_filtered = filter_cells(adata, ~high_mt)\n",{"type":40,"tag":172,"props":927,"children":928},{"class":174,"line":624},[929],{"type":40,"tag":172,"props":930,"children":931},{},[932],{"type":46,"value":933},"adata_filtered.write('filtered.h5ad')\n",{"type":40,"tag":49,"props":935,"children":936},{},[937],{"type":40,"tag":100,"props":938,"children":939},{},[940],{"type":46,"value":941},"Example 3: Different thresholds for different subsets",{"type":40,"tag":161,"props":943,"children":945},{"className":563,"code":944,"language":565,"meta":166,"style":166},"adata = ad.read_h5ad('input.h5ad')\ncalculate_qc_metrics(adata, inplace=True)\n\n# Apply type-specific QC (assumes cell_type metadata exists)\nneurons = adata.obs['cell_type'] == 'neuron'\nother_cells = ~neurons\n\n# Neurons tolerate higher MT%, other cells use stricter threshold\nneuron_qc = apply_hard_threshold(adata[neurons], 'pct_counts_mt', 15, operator='>')\nother_qc = apply_hard_threshold(adata[other_cells], 'pct_counts_mt', 8, operator='>')\n",[946],{"type":40,"tag":112,"props":947,"children":948},{"__ignoreMap":166},[949,956,963,970,978,986,994,1001,1009,1018],{"type":40,"tag":172,"props":950,"children":951},{"class":174,"line":175},[952],{"type":40,"tag":172,"props":953,"children":954},{},[955],{"type":46,"value":621},{"type":40,"tag":172,"props":957,"children":958},{"class":174,"line":196},[959],{"type":40,"tag":172,"props":960,"children":961},{},[962],{"type":46,"value":630},{"type":40,"tag":172,"props":964,"children":965},{"class":174,"line":206},[966],{"type":40,"tag":172,"props":967,"children":968},{"emptyLinePlaceholder":609},[969],{"type":46,"value":612},{"type":40,"tag":172,"props":971,"children":972},{"class":174,"line":596},[973],{"type":40,"tag":172,"props":974,"children":975},{},[976],{"type":46,"value":977},"# Apply type-specific QC (assumes cell_type metadata exists)\n",{"type":40,"tag":172,"props":979,"children":980},{"class":174,"line":605},[981],{"type":40,"tag":172,"props":982,"children":983},{},[984],{"type":46,"value":985},"neurons = adata.obs['cell_type'] == 'neuron'\n",{"type":40,"tag":172,"props":987,"children":988},{"class":174,"line":615},[989],{"type":40,"tag":172,"props":990,"children":991},{},[992],{"type":46,"value":993},"other_cells = ~neurons\n",{"type":40,"tag":172,"props":995,"children":996},{"class":174,"line":624},[997],{"type":40,"tag":172,"props":998,"children":999},{"emptyLinePlaceholder":609},[1000],{"type":46,"value":612},{"type":40,"tag":172,"props":1002,"children":1003},{"class":174,"line":633},[1004],{"type":40,"tag":172,"props":1005,"children":1006},{},[1007],{"type":46,"value":1008},"# Neurons tolerate higher MT%, other cells use stricter threshold\n",{"type":40,"tag":172,"props":1010,"children":1012},{"class":174,"line":1011},9,[1013],{"type":40,"tag":172,"props":1014,"children":1015},{},[1016],{"type":46,"value":1017},"neuron_qc = apply_hard_threshold(adata[neurons], 'pct_counts_mt', 15, operator='>')\n",{"type":40,"tag":172,"props":1019,"children":1021},{"class":174,"line":1020},10,[1022],{"type":40,"tag":172,"props":1023,"children":1024},{},[1025],{"type":46,"value":1026},"other_qc = apply_hard_threshold(adata[other_cells], 'pct_counts_mt', 8, operator='>')\n",{"type":40,"tag":55,"props":1028,"children":1030},{"id":1029},"best-practices",[1031],{"type":46,"value":1032},"Best Practices",{"type":40,"tag":492,"props":1034,"children":1035},{},[1036,1046,1056,1066,1076],{"type":40,"tag":71,"props":1037,"children":1038},{},[1039,1044],{"type":40,"tag":100,"props":1040,"children":1041},{},[1042],{"type":46,"value":1043},"Be permissive with filtering",{"type":46,"value":1045}," - Default thresholds intentionally retain most cells to avoid losing rare populations",{"type":40,"tag":71,"props":1047,"children":1048},{},[1049,1054],{"type":40,"tag":100,"props":1050,"children":1051},{},[1052],{"type":46,"value":1053},"Inspect visualizations",{"type":46,"value":1055}," - Always review before\u002Fafter plots to ensure filtering makes biological sense",{"type":40,"tag":71,"props":1057,"children":1058},{},[1059,1064],{"type":40,"tag":100,"props":1060,"children":1061},{},[1062],{"type":46,"value":1063},"Consider dataset-specific factors",{"type":46,"value":1065}," - Some tissues naturally have higher mitochondrial content (e.g., neurons, cardiomyocytes)",{"type":40,"tag":71,"props":1067,"children":1068},{},[1069,1074],{"type":40,"tag":100,"props":1070,"children":1071},{},[1072],{"type":46,"value":1073},"Check gene annotations",{"type":46,"value":1075}," - Mitochondrial gene prefixes vary by species (mt- for mouse, MT- for human)",{"type":40,"tag":71,"props":1077,"children":1078},{},[1079,1084],{"type":40,"tag":100,"props":1080,"children":1081},{},[1082],{"type":46,"value":1083},"Iterate if needed",{"type":46,"value":1085}," - QC parameters may need adjustment based on the specific experiment or tissue type",{"type":40,"tag":55,"props":1087,"children":1089},{"id":1088},"reference-materials",[1090],{"type":46,"value":1091},"Reference Materials",{"type":40,"tag":49,"props":1093,"children":1094},{},[1095,1097,1103],{"type":46,"value":1096},"For detailed QC methodology, parameter rationale, and troubleshooting guidance, see ",{"type":40,"tag":112,"props":1098,"children":1100},{"className":1099},[],[1101],{"type":46,"value":1102},"references\u002Fscverse_qc_guidelines.md",{"type":46,"value":1104},". This reference provides:",{"type":40,"tag":67,"props":1106,"children":1107},{},[1108,1113,1118,1123,1128,1133],{"type":40,"tag":71,"props":1109,"children":1110},{},[1111],{"type":46,"value":1112},"Detailed explanations of each QC metric and why it matters",{"type":40,"tag":71,"props":1114,"children":1115},{},[1116],{"type":46,"value":1117},"Rationale for MAD-based thresholds and why they're better than fixed cutoffs",{"type":40,"tag":71,"props":1119,"children":1120},{},[1121],{"type":46,"value":1122},"Guidelines for interpreting QC visualizations (histograms, violin plots, scatter plots)",{"type":40,"tag":71,"props":1124,"children":1125},{},[1126],{"type":46,"value":1127},"Species-specific considerations for gene annotations",{"type":40,"tag":71,"props":1129,"children":1130},{},[1131],{"type":46,"value":1132},"When and how to adjust filtering parameters",{"type":40,"tag":71,"props":1134,"children":1135},{},[1136],{"type":46,"value":1137},"Advanced QC considerations (ambient RNA correction, doublet detection)",{"type":40,"tag":49,"props":1139,"children":1140},{},[1141],{"type":46,"value":1142},"Load this reference when users need deeper understanding of the methodology or when troubleshooting QC issues.",{"type":40,"tag":55,"props":1144,"children":1146},{"id":1145},"next-steps-after-qc",[1147],{"type":46,"value":1148},"Next Steps After QC",{"type":40,"tag":49,"props":1150,"children":1151},{},[1152],{"type":46,"value":1153},"Typical downstream analysis steps:",{"type":40,"tag":67,"props":1155,"children":1156},{},[1157,1162,1167,1172,1177],{"type":40,"tag":71,"props":1158,"children":1159},{},[1160],{"type":46,"value":1161},"Ambient RNA correction (SoupX, CellBender)",{"type":40,"tag":71,"props":1163,"children":1164},{},[1165],{"type":46,"value":1166},"Doublet detection (scDblFinder)",{"type":40,"tag":71,"props":1168,"children":1169},{},[1170],{"type":46,"value":1171},"Normalization (log-normalize, scran)",{"type":40,"tag":71,"props":1173,"children":1174},{},[1175],{"type":46,"value":1176},"Feature selection and dimensionality reduction",{"type":40,"tag":71,"props":1178,"children":1179},{},[1180],{"type":46,"value":1181},"Clustering and cell type annotation",{"type":40,"tag":1183,"props":1184,"children":1185},"style",{},[1186],{"type":46,"value":1187},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":1189,"total":615},[1190,1207,1224,1240,1251,1268],{"slug":1191,"name":1191,"fn":1192,"description":1193,"org":1194,"tags":1195,"stars":23,"repoUrl":24,"updatedAt":1206},"clinical-trial-protocol-skill","generate clinical trial protocols for FDA submissions","Generate clinical trial protocols for medical devices or drugs. This skill should be used when users say \"Create a clinical trial protocol\", \"Generate protocol for [device\u002Fdrug]\", \"Help me design a clinical study\", \"Research similar trials for [intervention]\", or when developing FDA submission documentation for investigational products.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1196,1199,1202,1203],{"name":1197,"slug":1198,"type":16},"Clinical Trials","clinical-trials",{"name":1200,"slug":1201,"type":16},"FDA","fda",{"name":14,"slug":15,"type":16},{"name":1204,"slug":1205,"type":16},"Regulatory Compliance","regulatory-compliance","2026-04-06T17:57:05.297219",{"slug":1208,"name":1208,"fn":1209,"description":1210,"org":1211,"tags":1212,"stars":23,"repoUrl":24,"updatedAt":1223},"instrument-data-to-allotrope","convert instrument data to Allotrope ASM","Convert laboratory instrument output files (PDF, CSV, Excel, TXT) to Allotrope Simple Model (ASM) JSON format or flattened 2D CSV. Use this skill when scientists need to standardize instrument data for LIMS systems, data lakes, or downstream analysis. Supports auto-detection of instrument types. Outputs include full ASM JSON, flattened CSV for easy import, and exportable Python code for data engineers. Common triggers include converting instrument files, standardizing lab data, preparing data for upload to LIMS\u002FELN systems, or generating parser code for production pipelines.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1213,1216,1219,1222],{"name":1214,"slug":1215,"type":16},"Allotrope","allotrope",{"name":1217,"slug":1218,"type":16},"Data Cleaning","data-cleaning",{"name":1220,"slug":1221,"type":16},"Laboratory","laboratory",{"name":14,"slug":15,"type":16},"2026-04-06T17:57:07.996807",{"slug":1225,"name":1225,"fn":1226,"description":1227,"org":1228,"tags":1229,"stars":23,"repoUrl":24,"updatedAt":1239},"nextflow-development","run nf-core bioinformatics pipelines on sequencing data","Run nf-core bioinformatics pipelines (rnaseq, sarek, atacseq) on sequencing data. Use when analyzing RNA-seq, WGS\u002FWES, or ATAC-seq data—either local FASTQs or public datasets from GEO\u002FSRA. Triggers on nf-core, Nextflow, FASTQ analysis, variant calling, gene expression, differential expression, GEO reanalysis, GSE\u002FGSM\u002FSRR accessions, or samplesheet creation.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1230,1231,1234,1235,1238],{"name":18,"slug":19,"type":16},{"name":1232,"slug":1233,"type":16},"Data Pipeline","data-pipeline",{"name":14,"slug":15,"type":16},{"name":1236,"slug":1237,"type":16},"Nextflow","nextflow",{"name":21,"slug":22,"type":16},"2026-04-06T17:57:04.014571",{"slug":1241,"name":1241,"fn":1242,"description":1243,"org":1244,"tags":1245,"stars":23,"repoUrl":24,"updatedAt":1250},"scientific-problem-selection","guide scientific research problem selection","This skill should be used when scientists need help with research problem selection, project ideation, troubleshooting stuck projects, or strategic scientific decisions. Use this skill when users ask to pitch a new research idea, work through a project problem, evaluate project risks, plan research strategy, navigate decision trees, or get help choosing what scientific problem to work on. Typical requests include \"I have an idea for a project\", \"I'm stuck on my research\", \"help me evaluate this project\", \"what should I work on\", or \"I need strategic advice about my research\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1246,1247],{"name":14,"slug":15,"type":16},{"name":1248,"slug":1249,"type":16},"Research","research","2026-04-06T17:57:06.62424",{"slug":1252,"name":1252,"fn":1253,"description":1254,"org":1255,"tags":1256,"stars":23,"repoUrl":24,"updatedAt":1267},"scvi-tools","analyze single-cell data with scvi-tools","Deep learning for single-cell analysis using scvi-tools. This skill should be used when users need (1) data integration and batch correction with scVI\u002FscANVI, (2) ATAC-seq analysis with PeakVI, (3) CITE-seq multi-modal analysis with totalVI, (4) multiome RNA+ATAC analysis with MultiVI, (5) spatial transcriptomics deconvolution with DestVI, (6) label transfer and reference mapping with scANVI\u002FscArches, (7) RNA velocity with veloVI, or (8) any deep learning-based single-cell method. Triggers include mentions of scVI, scANVI, totalVI, PeakVI, MultiVI, DestVI, veloVI, sysVI, scArches, variational autoencoder, VAE, batch correction, data integration, multi-modal, CITE-seq, multiome, reference mapping, latent space.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1257,1258,1261,1262,1264],{"name":18,"slug":19,"type":16},{"name":1259,"slug":1260,"type":16},"Deep Learning","deep-learning",{"name":14,"slug":15,"type":16},{"name":1263,"slug":565,"type":16},"Python",{"name":1265,"slug":1266,"type":16},"Single-Cell","single-cell","2026-04-06T17:57:02.70437",{"slug":4,"name":4,"fn":5,"description":6,"org":1269,"tags":1270,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1271,1272,1273],{"name":18,"slug":19,"type":16},{"name":14,"slug":15,"type":16},{"name":21,"slug":22,"type":16},{"items":1275,"total":1462},[1276,1297,1311,1323,1342,1355,1376,1396,1410,1425,1433,1446],{"slug":1277,"name":1277,"fn":1278,"description":1279,"org":1280,"tags":1281,"stars":1294,"repoUrl":1295,"updatedAt":1296},"algorithmic-art","create algorithmic art with p5.js","Creating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems. Create original algorithmic art rather than copying existing artists' work to avoid copyright violations.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1282,1285,1288,1291],{"name":1283,"slug":1284,"type":16},"Creative","creative",{"name":1286,"slug":1287,"type":16},"Design","design",{"name":1289,"slug":1290,"type":16},"Generative Art","generative-art",{"name":1292,"slug":1293,"type":16},"JavaScript","javascript",161831,"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fskills","2026-04-06T17:56:15.455818",{"slug":1298,"name":1298,"fn":1299,"description":1300,"org":1301,"tags":1302,"stars":1294,"repoUrl":1295,"updatedAt":1310},"brand-guidelines","apply Anthropic brand colors and typography","Applies Anthropic's official brand colors and typography to any sort of artifact that may benefit from having Anthropic's look-and-feel. Use it when brand colors or style guidelines, visual formatting, or company design standards apply.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1303,1306,1307],{"name":1304,"slug":1305,"type":16},"Branding","branding",{"name":1286,"slug":1287,"type":16},{"name":1308,"slug":1309,"type":16},"Typography","typography","2026-04-06T17:56:05.042852",{"slug":1312,"name":1312,"fn":1313,"description":1314,"org":1315,"tags":1316,"stars":1294,"repoUrl":1295,"updatedAt":1322},"canvas-design","create posters and visual art as PNG or PDF","Create beautiful visual art in .png and .pdf documents using design philosophy. You should use this skill when the user asks to create a poster, piece of art, design, or other static piece. Create original visual designs, never copying existing artists' work to avoid copyright violations.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1317,1318,1319],{"name":1283,"slug":1284,"type":16},{"name":1286,"slug":1287,"type":16},{"name":1320,"slug":1321,"type":16},"PDF","pdf","2026-04-06T17:56:03.794732",{"slug":1324,"name":1324,"fn":1325,"description":1326,"org":1327,"tags":1328,"stars":1294,"repoUrl":1295,"updatedAt":1341},"claude-api","build apps with the Claude API","Reference for the Claude API \u002F Anthropic SDK — model ids, pricing, params, streaming, tool use, MCP, agents, caching, token counting, model migration.\nTRIGGER — read BEFORE opening the target file; don't skip because it \"looks like a one-liner\" — whenever: the prompt names Claude\u002FAnthropic in any form (Claude, Anthropic, Fable, Opus, Sonnet, Haiku, `anthropic`, `@anthropic-ai`, `claude-*`, `us.anthropic.*`, `[1m]`); the user asks about an LLM (pricing\u002Fmodel choice\u002Flimits\u002Fcaching) — never answer from memory; OR the task is LLM-shaped with provider unstated (agent\u002FMCP\u002Ftool-definition\u002Fmulti-agent\u002FRAG\u002FLLM-judge\u002Fcomputer-use; generate\u002Fsummarize\u002Fextract\u002Fclassify\u002Frewrite\u002Fconverse over NL; debugging refusals\u002Fcutoffs\u002Fstreaming\u002Ftool-calls\u002Ftokens).\nSKIP only when another provider is being worked on (overrides all triggers): OpenAI\u002FGPT\u002FGemini\u002FLlama\u002FMistral\u002FCohere\u002FOllama named in the query; OR `grep -rE 'openai|langchain_openai|google.generativeai|genai|mistralai|cohere|ollama'` over the project hits (run this grep FIRST if no provider named — don't Read the file).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1329,1332,1333,1336,1338],{"name":1330,"slug":1331,"type":16},"Agents","agents",{"name":9,"slug":8,"type":16},{"name":1334,"slug":1335,"type":16},"Anthropic SDK","anthropic-sdk",{"name":1337,"slug":1324,"type":16},"Claude API",{"name":1339,"slug":1340,"type":16},"LLM","llm","2026-07-28T05:36:08.213335",{"slug":1343,"name":1343,"fn":1344,"description":1345,"org":1346,"tags":1347,"stars":1294,"repoUrl":1295,"updatedAt":1354},"doc-coauthoring","co-author documentation and technical specs","Guide users through a structured workflow for co-authoring documentation. Use when user wants to write documentation, proposals, technical specs, decision docs, or similar structured content. This workflow helps users efficiently transfer context, refine content through iteration, and verify the doc works for readers. Trigger when user mentions writing docs, creating proposals, drafting specs, or similar documentation tasks.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1348,1351],{"name":1349,"slug":1350,"type":16},"Documentation","documentation",{"name":1352,"slug":1353,"type":16},"Technical Writing","technical-writing","2026-04-06T17:56:14.18897",{"slug":1356,"name":1356,"fn":1357,"description":1358,"org":1359,"tags":1360,"stars":1294,"repoUrl":1295,"updatedAt":1375},"docx","create and edit Word documents","Use this skill whenever the user wants to create, read, edit, or manipulate Word documents (.docx files) or Word templates (.dotx files). Triggers include: any mention of 'Word doc', 'word document', '.docx', '.dotx', or requests to produce professional documents with formatting like tables of contents, headings, page numbers, or letterheads. Also use when extracting or reorganizing content from .docx or .dotx files, inserting or replacing images in documents, performing find-and-replace in Word files, working with tracked changes or comments, or converting content into a polished Word document. If the user asks for a 'report', 'memo', 'letter', 'template', or similar deliverable as a Word or .docx file, use this skill. Do NOT use for PDFs, spreadsheets, Google Docs, or general coding tasks unrelated to document generation.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1361,1364,1366,1369,1372],{"name":1362,"slug":1363,"type":16},"Documents","documents",{"name":1365,"slug":1356,"type":16},"DOCX",{"name":1367,"slug":1368,"type":16},"Office","office",{"name":1370,"slug":1371,"type":16},"Templates","templates",{"name":1373,"slug":1374,"type":16},"Word","word","2026-07-18T05:16:23.136271",{"slug":1377,"name":1377,"fn":1378,"description":1379,"org":1380,"tags":1381,"stars":1294,"repoUrl":1295,"updatedAt":1395},"frontend-design","design production-grade frontend interfaces","Guidance for distinctive, intentional visual design when building new UI or reshaping an existing one. Helps with aesthetic direction, typography, and making choices that don't read as templated defaults.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1382,1383,1386,1389,1392],{"name":1286,"slug":1287,"type":16},{"name":1384,"slug":1385,"type":16},"Frontend","frontend",{"name":1387,"slug":1388,"type":16},"React","react",{"name":1390,"slug":1391,"type":16},"Tailwind CSS","tailwind-css",{"name":1393,"slug":1394,"type":16},"UI Components","ui-components","2026-04-06T17:56:16.723469",{"slug":1397,"name":1397,"fn":1398,"description":1399,"org":1400,"tags":1401,"stars":1294,"repoUrl":1295,"updatedAt":1409},"internal-comms","write internal company communications","A set of resources to help me write all kinds of internal communications, using the formats that my company likes to use. Claude should use this skill whenever asked to write some sort of internal communications (status reports, leadership updates, 3P updates, company newsletters, FAQs, incident reports, project updates, etc.).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1402,1405,1406],{"name":1403,"slug":1404,"type":16},"Communications","communications",{"name":1370,"slug":1371,"type":16},{"name":1407,"slug":1408,"type":16},"Writing","writing","2026-04-06T17:56:20.695522",{"slug":1411,"name":1411,"fn":1412,"description":1413,"org":1414,"tags":1415,"stars":1294,"repoUrl":1295,"updatedAt":1424},"mcp-builder","build MCP servers","Guide for creating high-quality MCP (Model Context Protocol) servers that enable LLMs to interact with external services through well-designed tools. Use when building MCP servers to integrate external APIs or services, whether in Python (FastMCP) or Node\u002FTypeScript (MCP SDK).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1416,1417,1420,1421],{"name":1330,"slug":1331,"type":16},{"name":1418,"slug":1419,"type":16},"API Development","api-development",{"name":1339,"slug":1340,"type":16},{"name":1422,"slug":1423,"type":16},"MCP","mcp","2026-04-06T17:56:10.357665",{"slug":1321,"name":1321,"fn":1426,"description":1427,"org":1428,"tags":1429,"stars":1294,"repoUrl":1295,"updatedAt":1432},"read edit and manipulate PDF files","Use this skill whenever the user wants to do anything with PDF files. This includes reading or extracting text\u002Ftables from PDFs, combining or merging multiple PDFs into one, splitting PDFs apart, rotating pages, adding watermarks, creating new PDFs, filling PDF forms, encrypting\u002Fdecrypting PDFs, extracting images, and OCR on scanned PDFs to make them searchable. If the user mentions a .pdf file or asks to produce one, use this skill.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1430,1431],{"name":1362,"slug":1363,"type":16},{"name":1320,"slug":1321,"type":16},"2026-04-06T17:56:02.483316",{"slug":1434,"name":1434,"fn":1435,"description":1436,"org":1437,"tags":1438,"stars":1294,"repoUrl":1295,"updatedAt":1445},"pptx","create and edit PowerPoint presentations","Use this skill any time a .pptx or .potx file is involved in any way — as input, output, or both. This includes: creating slide decks, pitch decks, or presentations; reading, parsing, or extracting text from any .pptx or .potx file (even if the extracted content will be used elsewhere, like in an email or summary); editing, modifying, or updating existing presentations; combining or splitting slide files; working with templates (.potx), layouts, speaker notes, or comments. Trigger whenever the user mentions \"deck,\" \"slides,\" \"presentation,\" or references a .pptx or .potx filename, regardless of what they plan to do with the content afterward. If a .pptx or .potx file needs to be opened, created, or touched, use this skill.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1439,1442],{"name":1440,"slug":1441,"type":16},"PowerPoint","powerpoint",{"name":1443,"slug":1444,"type":16},"Presentations","presentations","2026-07-18T05:16:24.1471",{"slug":1447,"name":1447,"fn":1448,"description":1449,"org":1450,"tags":1451,"stars":1294,"repoUrl":1295,"updatedAt":1461},"skill-creator","create and optimize agent skills","Create new skills, modify and improve existing skills, and measure skill performance. Use when users want to create a skill from scratch, edit, or optimize an existing skill, run evals to test a skill, benchmark skill performance with variance analysis, or optimize a skill's description for better triggering accuracy.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1452,1453,1454,1457,1460],{"name":1330,"slug":1331,"type":16},{"name":1349,"slug":1350,"type":16},{"name":1455,"slug":1456,"type":16},"Evals","evals",{"name":1458,"slug":1459,"type":16},"Performance","performance",{"name":1352,"slug":1353,"type":16},"2026-04-19T06:45:40.804",490]