Agent Skills › anthropics/knowledge-work-plugins

anthropics/knowledge-work-plugins

GitHub

指导非生物信息学背景用户运行nf-core流程(RNA-seq、WGS/WES、ATAC-seq)。涵盖从GEO/SRA获取数据、环境检查、流水线选择到执行验证的全流程,支持本地或公共测序数据分析。

209 skills 22,355

Install All Skills

npx skills add anthropics/knowledge-work-plugins --all -g -y
More Options

List skills in collection

npx skills add anthropics/knowledge-work-plugins --list

Skills in Collection (209)

指导非生物信息学背景用户运行nf-core流程(RNA-seq、WGS/WES、ATAC-seq)。涵盖从GEO/SRA获取数据、环境检查、流水线选择到执行验证的全流程,支持本地或公共测序数据分析。
nf-core流程部署 Nextflow执行 FASTQ数据分析 变异检测 基因表达分析 差异表达分析 GEO/SRA数据重分析 GSE/GSM/SRR accession查询 样本表创建
bio-research/skills/nextflow-development/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill nextflow-development -g -y
SKILL.md
Frontmatter
{
    "name": "nextflow-development",
    "description": "Run nf-core bioinformatics pipelines (rnaseq, sarek, atacseq) on sequencing data. Use when analyzing RNA-seq, WGS\/WES, or ATAC-seq data—either local FASTQs or public datasets from GEO\/SRA. Triggers on nf-core, Nextflow, FASTQ analysis, variant calling, gene expression, differential expression, GEO reanalysis, GSE\/GSM\/SRR accessions, or samplesheet creation."
}

nf-core Pipeline Deployment

Run nf-core bioinformatics pipelines on local or public sequencing data.

Target users: Bench scientists and researchers without specialized bioinformatics training who need to run large-scale omics analyses—differential expression, variant calling, or chromatin accessibility analysis.

Workflow Checklist

- [ ] Step 0: Acquire data (if from GEO/SRA)
- [ ] Step 1: Environment check (MUST pass)
- [ ] Step 2: Select pipeline (confirm with user)
- [ ] Step 3: Run test profile (MUST pass)
- [ ] Step 4: Create samplesheet
- [ ] Step 5: Configure & run (confirm genome with user)
- [ ] Step 6: Verify outputs

Step 0: Acquire Data (GEO/SRA Only)

Skip this step if user has local FASTQ files.

For public datasets, fetch from GEO/SRA first. See references/geo-sra-acquisition.md for the full workflow.

Quick start:

# 1. Get study info
python scripts/sra_geo_fetch.py info GSE110004

# 2. Download (interactive mode)
python scripts/sra_geo_fetch.py download GSE110004 -o ./fastq -i

# 3. Generate samplesheet
python scripts/sra_geo_fetch.py samplesheet GSE110004 --fastq-dir ./fastq -o samplesheet.csv

DECISION POINT: After fetching study info, confirm with user:

  • Which sample subset to download (if multiple data types)
  • Suggested genome and pipeline

Then continue to Step 1.


Step 1: Environment Check

Run first. Pipeline will fail without passing environment.

python scripts/check_environment.py

All critical checks must pass. If any fail, provide fix instructions:

Docker issues

Problem Fix
Not installed Install from https://docs.docker.com/get-docker/
Permission denied sudo usermod -aG docker $USER then re-login
Daemon not running sudo systemctl start docker

Nextflow issues

Problem Fix
Not installed curl -s https://get.nextflow.io | bash && mv nextflow ~/bin/
Version < 23.04 nextflow self-update

Java issues

Problem Fix
Not installed / < 11 sudo apt install openjdk-11-jdk

Do not proceed until all checks pass. For HPC/Singularity, see references/troubleshooting.md.


Step 2: Select Pipeline

DECISION POINT: Confirm with user before proceeding.

Data Type Pipeline Version Goal
RNA-seq rnaseq 3.22.2 Gene expression
WGS/WES sarek 3.7.1 Variant calling
ATAC-seq atacseq 2.1.2 Chromatin accessibility

Auto-detect from data:

python scripts/detect_data_type.py /path/to/data

For pipeline-specific details:


Step 3: Run Test Profile

Validates environment with small data. MUST pass before real data.

nextflow run nf-core/<pipeline> -r <version> -profile test,docker --outdir test_output
Pipeline Command
rnaseq nextflow run nf-core/rnaseq -r 3.22.2 -profile test,docker --outdir test_rnaseq
sarek nextflow run nf-core/sarek -r 3.7.1 -profile test,docker --outdir test_sarek
atacseq nextflow run nf-core/atacseq -r 2.1.2 -profile test,docker --outdir test_atacseq

Verify:

ls test_output/multiqc/multiqc_report.html
grep "Pipeline completed successfully" .nextflow.log

If test fails, see references/troubleshooting.md.


Step 4: Create Samplesheet

Generate automatically

python scripts/generate_samplesheet.py /path/to/data <pipeline> -o samplesheet.csv

The script:

  • Discovers FASTQ/BAM/CRAM files
  • Pairs R1/R2 reads
  • Infers sample metadata
  • Validates before writing

For sarek: Script prompts for tumor/normal status if not auto-detected.

Validate existing samplesheet

python scripts/generate_samplesheet.py --validate samplesheet.csv <pipeline>

Samplesheet formats

rnaseq:

sample,fastq_1,fastq_2,strandedness
SAMPLE1,/abs/path/R1.fq.gz,/abs/path/R2.fq.gz,auto

sarek:

patient,sample,lane,fastq_1,fastq_2,status
patient1,tumor,L001,/abs/path/tumor_R1.fq.gz,/abs/path/tumor_R2.fq.gz,1
patient1,normal,L001,/abs/path/normal_R1.fq.gz,/abs/path/normal_R2.fq.gz,0

atacseq:

sample,fastq_1,fastq_2,replicate
CONTROL,/abs/path/ctrl_R1.fq.gz,/abs/path/ctrl_R2.fq.gz,1

Step 5: Configure & Run

5a. Check genome availability

python scripts/manage_genomes.py check <genome>
# If not installed:
python scripts/manage_genomes.py download <genome>

Common genomes: GRCh38 (human), GRCh37 (legacy), GRCm39 (mouse), R64-1-1 (yeast), BDGP6 (fly)

5b. Decision points

DECISION POINT: Confirm with user:

  1. Genome: Which reference to use
  2. Pipeline-specific options:
    • rnaseq: aligner (star_salmon recommended, hisat2 for low memory)
    • sarek: tools (haplotypecaller for germline, mutect2 for somatic)
    • atacseq: read_length (50, 75, 100, or 150)

5c. Run pipeline

nextflow run nf-core/<pipeline> \
    -r <version> \
    -profile docker \
    --input samplesheet.csv \
    --outdir results \
    --genome <genome> \
    -resume

Key flags:

  • -r: Pin version
  • -profile docker: Use Docker (or singularity for HPC)
  • --genome: iGenomes key
  • -resume: Continue from checkpoint

Resource limits (if needed):

--max_cpus 8 --max_memory '32.GB' --max_time '24.h'

Step 6: Verify Outputs

Check completion

ls results/multiqc/multiqc_report.html
grep "Pipeline completed successfully" .nextflow.log

Key outputs by pipeline

rnaseq:

  • results/star_salmon/salmon.merged.gene_counts.tsv - Gene counts
  • results/star_salmon/salmon.merged.gene_tpm.tsv - TPM values

sarek:

  • results/variant_calling/*/ - VCF files
  • results/preprocessing/recalibrated/ - BAM files

atacseq:

  • results/macs2/narrowPeak/ - Peak calls
  • results/bwa/mergedLibrary/bigwig/ - Coverage tracks

Quick Reference

For common exit codes and fixes, see references/troubleshooting.md.

Resume failed run

nextflow run nf-core/<pipeline> -resume

References


Disclaimer

This skill is provided as a prototype example demonstrating how to integrate nf-core bioinformatics pipelines into Claude Code for automated analysis workflows. The current implementation supports three pipelines (rnaseq, sarek, and atacseq), serving as a foundation that enables the community to expand support to the full set of nf-core pipelines.

It is intended for educational and research purposes and should not be considered production-ready without appropriate validation for your specific use case. Users are responsible for ensuring their computing environment meets pipeline requirements and for verifying analysis results.

Anthropic does not guarantee the accuracy of bioinformatics outputs, and users should follow standard practices for validating computational analyses. This integration is not officially endorsed by or affiliated with the nf-core community.

Attribution

When publishing results, cite the appropriate pipeline. Citations are available in each nf-core repository's CITATIONS.md file (e.g., https://github.com/nf-core/rnaseq/blob/3.22.2/CITATIONS.md).

Licenses

用于单细胞RNA-seq数据质量控制,支持.h5ad和.h5格式。基于scverse最佳实践,采用MAD过滤和低质量细胞筛选,提供完整流水线或模块化构建块,生成综合可视化报告及过滤后数据集。
请求单细胞RNA-seq数据质量控制 需要过滤低质量细胞或评估数据质量 要求生成QC可视化图表或指标 遵循scverse/scanpy最佳实践进行分析 请求使用MAD-based过滤或异常值检测
bio-research/skills/single-cell-rna-qc/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill single-cell-rna-qc -g -y
SKILL.md
Frontmatter
{
    "name": "single-cell-rna-qc",
    "description": "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\/scanpy best practices for single-cell analysis."
}

Single-Cell RNA-seq Quality Control

Automated QC workflow for single-cell RNA-seq data following scverse best practices.

When to Use This Skill

Use when users:

  • Request quality control or QC on single-cell RNA-seq data
  • Want to filter low-quality cells or assess data quality
  • Need QC visualizations or metrics
  • Ask to follow scverse/scanpy best practices
  • Request MAD-based filtering or outlier detection

Supported input formats:

  • .h5ad files (AnnData format from scanpy/Python workflows)
  • .h5 files (10X Genomics Cell Ranger output)

Default recommendation: Use Approach 1 (complete pipeline) unless the user has specific custom requirements or explicitly requests non-standard filtering logic.

Approach 1: Complete QC Pipeline (Recommended for Standard Workflows)

For standard QC following scverse best practices, use the convenience script scripts/qc_analysis.py:

python3 scripts/qc_analysis.py input.h5ad
# or for 10X Genomics .h5 files:
python3 scripts/qc_analysis.py raw_feature_bc_matrix.h5

The script automatically detects the file format and loads it appropriately.

When to use this approach:

  • Standard QC workflow with adjustable thresholds (all cells filtered the same way)
  • Batch processing multiple datasets
  • Quick exploratory analysis
  • User wants the "just works" solution

Requirements: anndata, scanpy, scipy, matplotlib, seaborn, numpy

Parameters:

Customize filtering thresholds and gene patterns using command-line parameters:

  • --output-dir - Output directory
  • --mad-counts, --mad-genes, --mad-mt - MAD thresholds for counts/genes/MT%
  • --mt-threshold - Hard mitochondrial % cutoff
  • --min-cells - Gene filtering threshold
  • --mt-pattern, --ribo-pattern, --hb-pattern - Gene name patterns for different species

Use --help to see current default values.

Outputs:

All files are saved to <input_basename>_qc_results/ directory by default (or to the directory specified by --output-dir):

  • qc_metrics_before_filtering.png - Pre-filtering visualizations
  • qc_filtering_thresholds.png - MAD-based threshold overlays
  • qc_metrics_after_filtering.png - Post-filtering quality metrics
  • <input_basename>_filtered.h5ad - Clean, filtered dataset ready for downstream analysis
  • <input_basename>_with_qc.h5ad - Original data with QC annotations preserved

If copying outputs for user access, copy individual files (not the entire directory) so users can preview them directly.

Workflow Steps

The script performs the following steps:

  1. Calculate QC metrics - Count depth, gene detection, mitochondrial/ribosomal/hemoglobin content
  2. Apply MAD-based filtering - Permissive outlier detection using MAD thresholds for counts/genes/MT%
  3. Filter genes - Remove genes detected in few cells
  4. Generate visualizations - Comprehensive before/after plots with threshold overlays

Approach 2: Modular Building Blocks (For Custom Workflows)

For custom analysis workflows or non-standard requirements, use the modular utility functions from scripts/qc_core.py and scripts/qc_plotting.py:

# Run from scripts/ directory, or add scripts/ to sys.path if needed
import anndata as ad
from qc_core import calculate_qc_metrics, detect_outliers_mad, filter_cells
from qc_plotting import plot_qc_distributions  # Only if visualization needed

adata = ad.read_h5ad('input.h5ad')
calculate_qc_metrics(adata, inplace=True)
# ... custom analysis logic here

When to use this approach:

  • Different workflow needed (skip steps, change order, apply different thresholds to subsets)
  • Conditional logic (e.g., filter neurons differently than other cells)
  • Partial execution (only metrics/visualization, no filtering)
  • Integration with other analysis steps in a larger pipeline
  • Custom filtering criteria beyond what command-line params support

Available utility functions:

From qc_core.py (core QC operations):

  • calculate_qc_metrics(adata, mt_pattern, ribo_pattern, hb_pattern, inplace=True) - Calculate QC metrics and annotate adata
  • detect_outliers_mad(adata, metric, n_mads, verbose=True) - MAD-based outlier detection, returns boolean mask
  • apply_hard_threshold(adata, metric, threshold, operator='>', verbose=True) - Apply hard cutoffs, returns boolean mask
  • filter_cells(adata, mask, inplace=False) - Apply boolean mask to filter cells
  • filter_genes(adata, min_cells=20, min_counts=None, inplace=True) - Filter genes by detection
  • print_qc_summary(adata, label='') - Print summary statistics

From qc_plotting.py (visualization):

  • plot_qc_distributions(adata, output_path, title) - Generate comprehensive QC plots
  • plot_filtering_thresholds(adata, outlier_masks, thresholds, output_path) - Visualize filtering thresholds
  • plot_qc_after_filtering(adata, output_path) - Generate post-filtering plots

Example custom workflows:

Example 1: Only calculate metrics and visualize, don't filter yet

adata = ad.read_h5ad('input.h5ad')
calculate_qc_metrics(adata, inplace=True)
plot_qc_distributions(adata, 'qc_before.png', title='Initial QC')
print_qc_summary(adata, label='Before filtering')

Example 2: Apply only MT% filtering, keep other metrics permissive

adata = ad.read_h5ad('input.h5ad')
calculate_qc_metrics(adata, inplace=True)

# Only filter high MT% cells
high_mt = apply_hard_threshold(adata, 'pct_counts_mt', 10, operator='>')
adata_filtered = filter_cells(adata, ~high_mt)
adata_filtered.write('filtered.h5ad')

Example 3: Different thresholds for different subsets

adata = ad.read_h5ad('input.h5ad')
calculate_qc_metrics(adata, inplace=True)

# Apply type-specific QC (assumes cell_type metadata exists)
neurons = adata.obs['cell_type'] == 'neuron'
other_cells = ~neurons

# Neurons tolerate higher MT%, other cells use stricter threshold
neuron_qc = apply_hard_threshold(adata[neurons], 'pct_counts_mt', 15, operator='>')
other_qc = apply_hard_threshold(adata[other_cells], 'pct_counts_mt', 8, operator='>')

Best Practices

  1. Be permissive with filtering - Default thresholds intentionally retain most cells to avoid losing rare populations
  2. Inspect visualizations - Always review before/after plots to ensure filtering makes biological sense
  3. Consider dataset-specific factors - Some tissues naturally have higher mitochondrial content (e.g., neurons, cardiomyocytes)
  4. Check gene annotations - Mitochondrial gene prefixes vary by species (mt- for mouse, MT- for human)
  5. Iterate if needed - QC parameters may need adjustment based on the specific experiment or tissue type

Reference Materials

For detailed QC methodology, parameter rationale, and troubleshooting guidance, see references/scverse_qc_guidelines.md. This reference provides:

  • Detailed explanations of each QC metric and why it matters
  • Rationale for MAD-based thresholds and why they're better than fixed cutoffs
  • Guidelines for interpreting QC visualizations (histograms, violin plots, scatter plots)
  • Species-specific considerations for gene annotations
  • When and how to adjust filtering parameters
  • Advanced QC considerations (ambient RNA correction, doublet detection)

Load this reference when users need deeper understanding of the methodology or when troubleshooting QC issues.

Next Steps After QC

Typical downstream analysis steps:

  • Ambient RNA correction (SoupX, CellBender)
  • Doublet detection (scDblFinder)
  • Normalization (log-normalize, scran)
  • Feature selection and dimensionality reduction
  • Clustering and cell type annotation
引导生物研究者初始化环境,检查MCP服务器连接状态,展示可用的文献、药物发现及可视化工具,列举核心分析技能(如单细胞QC、Nextflow流程),并询问用户需求以提供针对性协助。
初次使用插件时进行环境配置 检查已连接的MCP服务器和工具列表 浏览可用的生物研究分析技能 开始新项目前的准备工作
bio-research/skills/start/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill start -g -y
SKILL.md
Frontmatter
{
    "name": "start",
    "description": "Set up your bio-research environment and explore available tools. Use when first getting oriented with the plugin, checking which literature, drug-discovery, or visualization MCP servers are connected, or surveying available analysis skills before starting a new project."
}

Bio-Research Start

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

You are helping a biological researcher get oriented with the bio-research plugin. Walk through the following steps in order.

Step 1: Welcome

Display this welcome message:

Bio-Research Plugin

Your AI-powered research assistant for the life sciences. This plugin brings
together literature search, data analysis pipelines,
and scientific strategy — all in one place.

Step 2: Check Available MCP Servers

Test which MCP servers are connected by listing available tools. Group the results:

Literature & Data Sources:

  • ~~literature database — biomedical literature search
  • ~~literature database — preprint access (biology and medicine)
  • ~~journal access — academic publications
  • ~~data repository — collaborative research data (Sage Bionetworks)

Drug Discovery & Clinical:

  • ~~chemical database — bioactive compound database
  • ~~drug target database — drug target discovery platform
  • ClinicalTrials.gov — clinical trial registry
  • ~~clinical data platform — clinical trial site ranking and platform help

Visualization & AI:

  • ~~scientific illustration — create scientific figures and diagrams
  • ~~AI research platform — AI for biology (histopathology, drug discovery)

Report which servers are connected and which are not yet set up.

Step 3: Survey Available Skills

List the analysis skills available in this plugin:

Skill What It Does
Single-Cell RNA QC Quality control for scRNA-seq data with MAD-based filtering
scvi-tools Deep learning for single-cell omics (scVI, scANVI, totalVI, PeakVI, etc.)
Nextflow Pipelines Run nf-core pipelines (RNA-seq, WGS/WES, ATAC-seq)
Instrument Data Converter Convert lab instrument output to Allotrope ASM format
Scientific Problem Selection Systematic framework for choosing research problems

Step 4: Optional Setup — Binary MCP Servers

Mention that two additional MCP servers are available as separate installations:

These require downloading binary files and are optional.

Step 5: Ask How to Help

Ask the researcher what they're working on today. Suggest starting points based on common workflows:

  1. Literature review — "Search ~~literature database for recent papers on [topic]"
  2. Analyze sequencing data — "Run QC on my single-cell data" or "Set up an RNA-seq pipeline"
  3. Drug discovery — "Search ~~chemical database for compounds targeting [protein]" or "Find drug targets for [disease]"
  4. Data standardization — "Convert my instrument data to Allotrope format"
  5. Research strategy — "Help me evaluate a new project idea"

Wait for the user's response and guide them to the appropriate tools and skills.

用于自定义Claude Code插件以适应特定组织的工具和流程。支持首次设置、微调现有配置或修改特定部分。通过检测占位符区分通用模板替换与定向定制,确保输出非技术性语言,并遵循严格的文件定位与修改规范。
customize plugin set up plugin configure plugin tailor plugin adjust plugin settings customize plugin connectors tweak plugin modify plugin configuration
cowork-plugin-management/skills/cowork-plugin-customizer/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill cowork-plugin-customizer -g -y
SKILL.md
Frontmatter
{
    "name": "cowork-plugin-customizer",
    "description": "Customize a Claude Code plugin for a specific organization's tools and workflows. Use when: customize plugin, set up plugin, configure plugin, tailor plugin, adjust plugin settings, customize plugin connectors, customize plugin skill, tweak plugin, modify plugin configuration.\n",
    "compatibility": "Requires Cowork desktop app environment with access to mounted plugin directories (mnt\/.local-plugins, mnt\/.plugins)."
}

Cowork Plugin Customization

Customize a plugin for a specific organization — either by setting up a generic plugin template for the first time, or by tweaking and refining an already-configured plugin.

Finding the plugin: To find the plugin's source files, run find mnt/.local-plugins mnt/.plugins -type d -name "*<plugin-name>*" to locate the plugin directory, then read its files to understand its structure before making changes. If you cannot find the plugin directory, the user is likely running this conversation in a remote container. Abort and let them know: "Customizing plugins is currently only available in the desktop app's Cowork mode."

Determining the Customization Mode

After locating the plugin, check for ~~-prefixed placeholders: grep -rn '~~\w' /path/to/plugin --include='*.md' --include='*.json'

Default rule: If ~~ placeholders exist, default to Generic plugin setup unless the user explicitly asks to customize a specific part of the plugin.

1. Generic plugin setup — The plugin contains ~~-prefixed placeholders. These are customization points in a template that need to be replaced with real values (e.g., ~~JiraAsana, ~~your-team-channel#engineering).

2. Scoped customization — No ~~ placeholders exist, and the user asked to customize a specific part of the plugin (e.g., "customize the connectors", "update the standup skill", "change the ticket tool"). Read the plugin files to find the relevant section(s) and focus only on those. Do not scan the entire plugin or present unrelated customization items.

Legacy commands/ directories: Some plugins include a commands/ directory. The Cowork UI now presents these alongside skills as a single "Skills" concept, so treat commands/*.md files the same way you would skills/*/SKILL.md files when customizing.

3. General customization — No ~~ placeholders exist, and the user wants to modify the plugin broadly. Read the plugin's files to understand its current configuration, then ask the user what they'd like to change.

Important: Never change the name of the plugin or skill being customized. Do not rename directories, files, or the plugin/skill name fields.

Nontechnical output: All user-facing output (todo list items, questions, summaries) must be written in plain, nontechnical language. Never mention ~~ prefixes, placeholders, or customization points to the user. Frame everything in terms of the plugin's capabilities and the organization's tools.

Customization Workflow

Phase 0: Gather User Intent (scoped and general customization only)

For scoped customization and general customization (not generic plugin setup), check whether the user provided free-form context alongside their request (e.g., "customize the standup skill — we do async standups in #eng-updates every morning").

  • If the user provided context: Record it and use it to pre-fill answers in Phase 3 — skip asking questions that the user already answered here.

  • If the user did not provide context: Ask a single open-ended question using AskUserQuestion before proceeding. Tailor the question to what they asked to customize — e.g., "What changes do you have in mind for the brief skill?" or "What would you like to change about how this plugin works?" Keep it short and specific to their request.

    Use their response (if any) as additional context throughout the remaining phases.

Phase 1: Gather Context from Knowledge MCPs

Use company-internal knowledge MCPs to collect information relevant to the customization scope. See references/search-strategies.md for detailed query patterns by category.

What to gather (scope to what's relevant):

  • Tool names and services the organization uses
  • Organizational processes and workflows
  • Team conventions (naming, statuses, estimation scales)
  • Configuration values (workspace IDs, project names, team identifiers)

Sources to search:

  1. Chat/Slack MCPs — tool mentions, integrations, workflow discussions
  2. Document MCPs — onboarding docs, tool guides, setup instructions
  3. Email MCPs — license notifications, admin emails, setup invitations

Record all findings for use in Phase 3.

Phase 2: Create Todo List

Build a todo list of changes to make, scoped appropriately:

  • For scoped customization: Only include items related to the specific section the user asked about.
  • For generic plugin setup: Run grep -rn '~~\w' /path/to/plugin --include='*.md' --include='*.json' to find all placeholder customization points. Group them by theme.
  • For general customization: Read the plugin files, understand the current config, and based on the user's request, identify what needs to change.

Use user-friendly descriptions that focus on the plugin's purpose:

  • Good: "Learn how standup prep works at Company"
  • Bad: "Replace placeholders in skills/standup-prep/SKILL.md"

Phase 3: Complete Todo Items

Work through each item using context from Phase 0 and Phase 1.

If the user's free-form input (Phase 0) or knowledge MCPs (Phase 1) provided a clear answer: Apply directly without confirmation.

Otherwise: Use AskUserQuestion. Don't assume "industry standard" defaults are correct — if neither the user's input nor knowledge MCPs provided a specific answer, ask. Note: AskUserQuestion always includes a Skip button and a free-text input box for custom answers, so do not include None or Other as options.

Types of changes:

  1. Placeholder replacements (generic setup): ~~JiraAsana, ~~your-org-channel#engineering
  2. Content updates: Modifying instructions, skills, workflows, or references to match the organization
  3. URL pattern updates: tickets.example.com/your-team/123app.asana.com/0/PROJECT_ID/TASK_ID
  4. Configuration values: Workspace IDs, project names, team identifiers

If user doesn't know or skips, leave the value unchanged (or the ~~-prefixed placeholder, for generic setup).

Phase 4: Search for Useful MCPs

After customization items have been resolved, connect MCPs for any tools that were identified or changed. See references/mcp-servers.md for the full workflow, category-to-keywords mapping, and config file format.

For each tool identified during customization:

  1. Search the registry: search_mcp_registry(keywords=[...]) using category keywords from references/mcp-servers.md, or search for the specific tool name if already known
  2. If unconnected: suggest_connectors(directoryUuids=["chosen-uuid"]) — user completes auth
  3. Update the plugin's MCP config file (check plugin.json for custom location, otherwise .mcp.json at root)

Collect all MCP results and present them together in the summary output (see below) — don't present MCPs one at a time during this phase.

Packaging the Plugin

After all customizations are applied, package the plugin as a .plugin file for the user:

  1. Zip the plugin directory (excluding setup/ since it's no longer needed):
    cd /path/to/plugin && zip -r /tmp/plugin-name.plugin . -x "setup/*" && cp /tmp/plugin-name.plugin /path/to/outputs/plugin-name.plugin
    
  2. Present the file to the user with the .plugin extension so they can install it directly. (Presenting the .plugin file will show to the user as a rich preview where they can look through the plugin files, and they can accept the customization by pressing a button.)

Important: Always create the zip in /tmp/ first, then copy to the outputs folder. Writing directly to the outputs folder may fail due to permissions and leave behind temporary files.

Naming: Use the original plugin directory name for the .plugin file (e.g., if the plugin directory is coder, the output file should be coder.plugin). Do not rename the plugin or its files during customization — only replace placeholder values and update content.

Summary Output

After customization, present the user with a summary of what was learned grouped by source. Always include the MCPs sections showing which MCPs were connected during setup and which ones the user should still connect:

## From searching Slack

- You use Asana for project management
- Sprint cycles are 2 weeks

## From searching documents

- Story points use T-shirt sizes

## From your answers

- Ticket statuses are: Backlog, In Progress, In Review, Done

Then present the MCPs that were connected during setup and any that the user should still connect, with instructions on how to connect them.

If no knowledge MCPs were available in Phase 1, and the user had to answer at least one question manually, include a note at the end:

By the way, connecting sources like Slack or Microsoft Teams would let me find answers automatically next time you customize a plugin.

Additional Resources

  • references/mcp-servers.md — MCP discovery workflow, category-to-keywords mapping, config file locations
  • references/search-strategies.md — Knowledge MCP query patterns for finding tool names and org values
  • examples/customized-mcp.json — Example fully configured .mcp.json
引导用户从零开始创建插件。涵盖发现、规划、设计、实现和打包五阶段,最终交付可用的.plugin文件。要求使用Cowork模式,保持对话通俗易懂,不暴露技术细节。
用户想要创建新插件 用户需要构建或开发插件 用户希望从头搭建或设计插件
cowork-plugin-management/skills/create-cowork-plugin/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill create-cowork-plugin -g -y
SKILL.md
Frontmatter
{
    "name": "create-cowork-plugin",
    "description": "Guide users through creating a new plugin from scratch in a cowork session. Use when users want to create a plugin, build a plugin, make a new plugin, develop a plugin, scaffold a plugin, start a plugin from scratch, or design a plugin. This skill requires Cowork mode with access to the outputs directory for delivering the final .plugin file.\n",
    "compatibility": "Requires Cowork desktop app environment with access to the outputs directory for delivering .plugin files."
}

Create Cowork Plugin

Build a new plugin from scratch through guided conversation. Walk the user through discovery, planning, design, implementation, and packaging — delivering a ready-to-install .plugin file at the end.

Overview

A plugin is a self-contained directory that extends Claude's capabilities with skills, agents, hooks, and MCP server integrations. This skill encodes the full plugin architecture and a five-phase workflow for creating one conversationally.

The process:

  1. Discovery — understand what the user wants to build
  2. Component Planning — determine which component types are needed
  3. Design & Clarifying Questions — specify each component in detail
  4. Implementation — create all plugin files
  5. Review & Package — deliver the .plugin file

Nontechnical output: Keep all user-facing conversation in plain language. Do not expose implementation details like file paths, directory structures, or schema fields unless the user asks. Frame everything in terms of what the plugin will do.

Plugin Architecture

Directory Structure

Every plugin follows this layout:

plugin-name/
├── .claude-plugin/
│   └── plugin.json           # Required: plugin manifest
├── skills/                   # Skills (subdirectories with SKILL.md)
│   └── skill-name/
│       ├── SKILL.md
│       └── references/
├── agents/                   # Subagent definitions (.md files)
├── .mcp.json                 # MCP server definitions
└── README.md                 # Plugin documentation

Legacy commands/ format: Older plugins may include a commands/ directory with single-file .md slash commands. This format still works, but new plugins should use skills/*/SKILL.md instead — the Cowork UI presents both as a single "Skills" concept, and the skills format supports progressive disclosure via references/.

Rules:

  • .claude-plugin/plugin.json is always required
  • Component directories (skills/, agents/) go at the plugin root, not inside .claude-plugin/
  • Only create directories for components the plugin actually uses
  • Use kebab-case for all directory and file names

plugin.json Manifest

Located at .claude-plugin/plugin.json. Minimal required field is name.

{
  "name": "plugin-name",
  "version": "0.1.0",
  "description": "Brief explanation of plugin purpose",
  "author": {
    "name": "Author Name"
  }
}

Name rules: kebab-case, lowercase with hyphens, no spaces or special characters. Version: semver format (MAJOR.MINOR.PATCH). Start at 0.1.0.

Optional fields: homepage, repository, license, keywords.

Custom component paths can be specified (supplements, does not replace, auto-discovery):

{
  "commands": "./custom-commands",
  "agents": ["./agents", "./specialized-agents"],
  "hooks": "./config/hooks.json",
  "mcpServers": "./.mcp.json"
}

Component Schemas

Detailed schemas for each component type are in references/component-schemas.md. Summary:

Component Location Format
Skills skills/*/SKILL.md Markdown + YAML frontmatter
MCP Servers .mcp.json JSON
Agents (uncommonly used in Cowork) agents/*.md Markdown + YAML frontmatter
Hooks (rarely used in Cowork) hooks/hooks.json JSON
Commands (legacy) commands/*.md Markdown + YAML frontmatter

This schema is shared with Claude Code's plugin system, but you're creating a plugin for Claude Cowork, a desktop app for doing knowledge work. Cowork users will usually find skills the most useful. Scaffold new plugins with skills/*/SKILL.md — do not create commands/ unless the user explicitly needs the legacy single-file format.

Customizable plugins with ~~ placeholders

Do not use or ask about this pattern by default. Only introduce ~~ placeholders if the user explicitly says they want people outside their organization to use the plugin. You can mention this is an option if it seems like the user wants to distribute the plugin externally, but do not proactively ask about this with AskUserQuestion.

When a plugin is intended to be shared with others outside their company, it might have parts that need to be adapted to individual users. You might need to reference external tools by category rather than specific product (e.g., "project tracker" instead of "Jira"). When sharing is needed, use generic language and mark these as requiring customization with two tilde characters such as create an issue in ~~project tracker. If used any tool categories, write a CONNECTORS.md file at the plugin root to explain:

# Connectors

## How tool references work

Plugin files use `~~category` as a placeholder for whatever tool the user
connects in that category. Plugins are tool-agnostic — they describe
workflows in terms of categories rather than specific products.

## Connectors for this plugin

| Category        | Placeholder         | Options                         |
| --------------- | ------------------- | ------------------------------- |
| Chat            | `~~chat`            | Slack, Microsoft Teams, Discord |
| Project tracker | `~~project tracker` | Linear, Asana, Jira             |

${CLAUDE_PLUGIN_ROOT} Variable

Use ${CLAUDE_PLUGIN_ROOT} for all intra-plugin path references in hooks and MCP configs. Never hardcode absolute paths.

Guided Workflow

When you ask the user something, use AskUserQuestion. Don't assume "industry standard" defaults are correct. Note: AskUserQuestion always includes a Skip button and a free-text input box for custom answers, so do not include None or Other as options.

Phase 1: Discovery

Goal: Understand what the user wants to build and why.

Ask (only what is unclear — skip questions if the user's initial request already answers them):

  • What should this plugin do? What problem does it solve?
  • Who will use it and in what context?
  • Does it integrate with any external tools or services?
  • Is there a similar plugin or workflow to reference?

Summarize understanding and confirm before proceeding.

Output: Clear statement of plugin purpose and scope.

Phase 2: Component Planning

Goal: Determine which component types the plugin needs.

Based on the discovery answers, determine:

  • Skills — Does it need specialized knowledge that Claude should load on-demand, or user-initiated actions? (domain expertise, reference schemas, workflow guides, deploy/configure/analyze/review actions)
  • MCP Servers — Does it need external service integration? (databases, APIs, SaaS tools)
  • Agents (uncommon) — Are there autonomous multi-step tasks? (validation, generation, analysis)
  • Hooks (rare) — Should something happen automatically on certain events? (enforce policies, load context, validate operations)

Present a component plan table, including component types you decided not to create:

| Component | Count | Purpose |
|-----------|-------|---------|
| Skills    | 3     | Domain knowledge for X, /do-thing, /check-thing |
| Agents    | 0     | Not needed |
| Hooks     | 1     | Validate writes |
| MCP       | 1     | Connect to service Y |

Get user confirmation or adjustments before proceeding.

Output: Confirmed list of components to create.

Phase 3: Design & Clarifying Questions

Goal: Specify each component in detail. Resolve all ambiguities before implementation.

For each component type in the plan, ask targeted design questions. Present questions grouped by component type. Wait for answers before proceeding.

Skills:

  • What user queries should trigger this skill?
  • What knowledge domains does it cover?
  • Should it include reference files for detailed content?
  • If the skill represents a user-initiated action: what arguments does it accept, and what tools does it need? (Read, Write, Bash, Grep, etc.)

Agents:

  • Should each agent trigger proactively or only when requested?
  • What tools does it need?
  • What should the output format be?

Hooks:

  • Which events? (PreToolUse, PostToolUse, Stop, SessionStart, etc.)
  • What behavior — validate, block, modify, add context?
  • Prompt-based (LLM-driven) or command-based (deterministic script)?

MCP Servers:

  • What server type? (stdio for local, SSE for hosted with OAuth, HTTP for REST APIs)
  • What authentication method?
  • What tools should be exposed?

If the user says "whatever you think is best," provide specific recommendations and get explicit confirmation.

Output: Detailed specification for every component.

Phase 4: Implementation

Goal: Create all plugin files following best practices.

Order of operations:

  1. Create the plugin directory structure
  2. Create plugin.json manifest
  3. Create each component (see references/component-schemas.md for exact formats)
  4. Create README.md documenting the plugin

Implementation guidelines:

  • Skills use progressive disclosure: lean SKILL.md body (under 3,000 words), detailed content in references/. Frontmatter description must be third-person with specific trigger phrases. Skill bodies are instructions FOR Claude, not messages to the user — write them as directives about what to do.
  • Agents need a description with <example> blocks showing triggering conditions, plus a system prompt in the markdown body.
  • Hooks config goes in hooks/hooks.json. Use ${CLAUDE_PLUGIN_ROOT} for script paths. Prefer prompt-based hooks for complex logic.
  • MCP configs go in .mcp.json at plugin root. Use ${CLAUDE_PLUGIN_ROOT} for local server paths. Document required env vars in README.

Phase 5: Review & Package

Goal: Deliver the finished plugin.

  1. Summarize what was created — list each component and its purpose

  2. Ask if the user wants any adjustments

  3. Run claude plugin validate <path-to-plugin-json> to check the plugin structure. If this command is unavailable (e.g., when running inside Cowork), verify the structure manually:

    • .claude-plugin/plugin.json exists and contains valid JSON with at least a name field
    • The name field is kebab-case (lowercase letters, numbers, and hyphens only)
    • Any component directories referenced by the plugin (commands/, skills/, agents/, hooks/) actually exist and contain files in the expected formats — .md for commands/skills/agents, .json for hooks
    • Each skill subdirectory contains a SKILL.md
    • Report what passed and what didn't, the same way the CLI validator would

    Fix any errors before proceeding.

  4. Package as a .plugin file:

cd /path/to/plugin-dir && zip -r /tmp/plugin-name.plugin . -x "*.DS_Store" && cp /tmp/plugin-name.plugin /path/to/outputs/plugin-name.plugin

Important: Always create the zip in /tmp/ first, then copy to the outputs folder. Writing directly to the outputs folder may fail due to permissions.

Naming: Use the plugin name from plugin.json for the .plugin file (e.g., if name is code-reviewer, output code-reviewer.plugin).

The .plugin file will appear in the chat as a rich preview where the user can browse the files and accept the plugin by pressing a button.

Best Practices

  • Start small: Begin with the minimum viable set of components. A plugin with one well-crafted skill is more useful than one with five half-baked components.
  • Progressive disclosure for skills: Core knowledge in SKILL.md, detailed reference material in references/, working examples in examples/.
  • Clear trigger phrases: Skill descriptions should include specific phrases users would say. Agent descriptions should include <example> blocks.
  • Skills are for Claude: Write skill body content as instructions for Claude to follow, not documentation for the user to read.
  • Imperative writing style: Use verb-first instructions in skills ("Parse the config file," not "You should parse the config file").
  • Portability: Always use ${CLAUDE_PLUGIN_ROOT} for intra-plugin paths, never hardcoded paths.
  • Security: Use environment variables for credentials, HTTPS for remote servers, least-privilege tool access.

Additional Resources

  • references/component-schemas.md — Detailed format specifications for every component type (skills, agents, hooks, MCP, legacy commands, CONNECTORS.md)
  • references/example-plugins.md — Three complete example plugin structures at different complexity levels
将客户问题打包为结构化升级简报,用于向工程、产品或领导层汇报。收集上下文、复现步骤及业务影响,确定升级目标。适用于严重Bug、批量故障、流失威胁或超时未决场景。
需要工程关注的严重Bug 多名客户报告相同问题 客户威胁流失 问题超过SLA时限
customer-support/skills/customer-escalation/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill customer-escalation -g -y
SKILL.md
Frontmatter
{
    "name": "customer-escalation",
    "description": "Package an escalation for engineering, product, or leadership with full context. Use when a bug needs engineering attention beyond normal support, multiple customers report the same issue, a customer is threatening to churn, or an issue has sat unresolved past its SLA.",
    "argument-hint": "<issue summary> [customer name]"
}

/customer-escalation

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Package a support issue into a structured escalation brief for engineering, product, or leadership. Gathers context, structures reproduction steps, assesses business impact, and identifies the right escalation target.

Usage

/customer-escalation <issue description> [customer name or account]

Examples:

  • /customer-escalation API returning 500 errors intermittently for Acme Corp
  • /customer-escalation Data export is missing rows — 3 customers reported this week
  • /customer-escalation SSO login loop affecting all Enterprise customers
  • /customer-escalation Customer threatening to churn over missing audit log feature

Workflow

1. Understand the Issue

Parse the input and determine:

  • What's broken or needed: The core technical or product issue
  • Who's affected: Specific customer(s), segment, or all users
  • How long: When did this start? How long has the customer been waiting?
  • What's been tried: Any troubleshooting or workarounds attempted
  • Why escalate now: What makes this need attention beyond normal support

Use the "When to Escalate vs. Handle in Support" criteria below to confirm this warrants escalation.

2. Gather Context

Pull together relevant information from available sources:

  • ~~support platform: Related tickets, timeline of communications, previous troubleshooting
  • ~~CRM (if connected): Account details, key contacts, previous escalations
  • ~~chat: Internal discussions about this issue, similar reports from other customers
  • ~~project tracker (if connected): Related bug reports or feature requests, engineering status
  • ~~knowledge base: Known issues or workarounds, relevant documentation

3. Assess Business Impact

Using the impact dimensions below, quantify:

  • Breadth: How many customers/users affected? Growing?
  • Depth: Blocked vs. inconvenienced?
  • Duration: How long has this been going on?
  • Revenue: ARR at risk? Pending deals affected?
  • Time pressure: Hard deadline?

4. Determine Escalation Target

Using the escalation tiers below, identify the right target: L2 Support, Engineering, Product, Security, or Leadership.

5. Structure Reproduction Steps (for bugs)

If the issue is a bug, follow the reproduction step best practices below to document clear repro steps with environment details and evidence.

6. Generate Escalation Brief

## ESCALATION: [One-line summary]

**Severity:** [Critical / High / Medium]
**Target team:** [Engineering / Product / Security / Leadership]
**Reported by:** [Your name/team]
**Date:** [Today's date]

### Impact
- **Customers affected:** [Who and how many]
- **Workflow impact:** [What they can't do]
- **Revenue at risk:** [If applicable]
- **Time in queue:** [How long this has been an issue]

### Issue Description
[Clear, concise description of the problem — 3-5 sentences]

### What's Been Tried
1. [Troubleshooting step and result]
2. [Troubleshooting step and result]
3. [Troubleshooting step and result]

### Reproduction Steps
[If applicable — follow the format below]
1. [Step]
2. [Step]
3. [Step]
Expected: [X]
Actual: [Y]
Environment: [Details]

### Customer Communication
- **Last update to customer:** [Date and what was communicated]
- **Customer expectation:** [What they're expecting and by when]
- **Escalation risk:** [Will they escalate further if not resolved by X?]

### What's Needed
- [Specific ask — "investigate root cause", "prioritize fix",
  "make product decision on X", "approve exception for Y"]
- **Deadline:** [When this needs resolution or an update]

### Supporting Context
- [Related tickets or links]
- [Internal discussion threads]
- [Documentation or logs]

7. Offer Next Steps

After generating the escalation:

  • "Want me to post this in a ~~chat channel for the target team?"
  • "Should I update the customer with an interim response?"
  • "Want me to set a follow-up reminder to check on this?"
  • "Should I draft a customer-facing update with the current status?"

When to Escalate vs. Handle in Support

Handle in Support When:

  • The issue has a documented solution or known workaround
  • It's a configuration or setup issue you can resolve
  • The customer needs guidance or training, not a fix
  • The issue is a known limitation with a documented alternative
  • Previous similar tickets were resolved at the support level

Escalate When:

  • Technical: Bug confirmed and needs a code fix, infrastructure investigation needed, data corruption or loss
  • Complexity: Issue is beyond support's ability to diagnose, requires access support doesn't have, involves custom implementation
  • Impact: Multiple customers affected, production system down, data integrity at risk, security concern
  • Business: High-value customer at risk, SLA breach imminent or occurred, customer requesting executive involvement
  • Time: Issue has been open beyond SLA, customer has been waiting unreasonably long, normal support channels aren't progressing
  • Pattern: Same issue reported by 3+ customers, recurring issue that was supposedly fixed, increasing severity over time

Escalation Tiers

L1 → L2 (Support Escalation)

From: Frontline support To: Senior support / technical support specialists When: Issue requires deeper investigation, specialized product knowledge, or advanced troubleshooting What to include: Ticket summary, steps already tried, customer context

L2 → Engineering

From: Senior support To: Engineering team (relevant product area) When: Confirmed bug, infrastructure issue, needs code change, requires system-level investigation What to include: Full reproduction steps, environment details, logs or error messages, business impact, customer timeline

L2 → Product

From: Senior support To: Product management When: Feature gap causing customer pain, design decision needed, workflow doesn't match customer expectations, competing customer needs require prioritization What to include: Customer use case, business impact, frequency of request, competitive pressure (if known)

Any → Security

From: Any support tier To: Security team When: Potential data exposure, unauthorized access, vulnerability report, compliance concern What to include: What was observed, who/what is potentially affected, immediate containment steps taken, urgency assessment Note: Security escalations bypass normal tier progression — escalate immediately regardless of your level

Any → Leadership

From: Any tier (usually L2 or manager) To: Support leadership, executive team When: High-revenue customer threatening churn, SLA breach on critical account, cross-functional decision needed, exception to policy required, PR or legal risk What to include: Full business context, revenue at risk, what's been tried, specific decision or action needed, deadline

Business Impact Assessment

When escalating, quantify impact where possible:

Impact Dimensions

Dimension Questions to Answer
Breadth How many customers/users are affected? Is it growing?
Depth How severely are they impacted? Blocked vs. inconvenienced?
Duration How long has this been going on? How long until it's critical?
Revenue What's the ARR at risk? Are there pending deals affected?
Reputation Could this become public? Is it a reference customer?
Contractual Are SLAs being breached? Are there contractual obligations?

Severity Shorthand

  • Critical: Production down, data at risk, security breach, or multiple high-value customers affected. Needs immediate attention.
  • High: Major functionality broken, key customer blocked, SLA at risk. Needs same-day attention.
  • Medium: Significant issue with workaround, important but not urgent business impact. Needs attention this week.

Writing Reproduction Steps

Good reproduction steps are the single most valuable thing in a bug escalation. Follow these practices:

  1. Start from a clean state: Describe the starting point (account type, configuration, permissions)
  2. Be specific: "Click the Export button in the top-right of the Dashboard page" not "try to export"
  3. Include exact values: Use specific inputs, dates, IDs — not "enter some data"
  4. Note the environment: Browser, OS, account type, feature flags, plan level
  5. Capture the frequency: Always reproducible? Intermittent? Only under certain conditions?
  6. Include evidence: Screenshots, error messages (exact text), network logs, console output
  7. Note what you've ruled out: "Tested in Chrome and Firefox — same behavior" "Not account-specific — reproduced on test account"

Follow-up Cadence After Escalation

Don't escalate and forget. Maintain ownership of the customer relationship.

Severity Internal Follow-up Customer Update
Critical Every 2 hours Every 2-4 hours (or per SLA)
High Every 4 hours Every 4-8 hours
Medium Daily Every 1-2 business days

Follow-up Actions

  • Check with the receiving team for progress
  • Update the customer even if there's no new information ("We're still investigating — here's what we know so far")
  • Adjust severity if the situation changes (better or worse)
  • Document all updates in the ticket for audit trail
  • Close the loop when resolved: confirm with customer, update internal tracking, capture learnings

De-escalation

Not every escalation stays escalated. De-escalate when:

  • Root cause is found and it's a support-resolvable issue
  • A workaround is found that unblocks the customer
  • The issue resolves itself (but still document root cause)
  • New information changes the severity assessment

When de-escalating:

  • Notify the team you escalated to
  • Update the ticket with the resolution
  • Inform the customer of the resolution
  • Document what was learned for future reference

Escalation Best Practices

  1. Always quantify impact — vague escalations get deprioritized
  2. Include reproduction steps for bugs — this is the #1 thing engineering needs
  3. Be clear about what you need — "investigate" vs. "fix" vs. "decide" are different asks
  4. Set and communicate a deadline — urgency without a deadline is ambiguous
  5. Maintain ownership of the customer relationship even after escalating the technical issue
  6. Follow up proactively — don't wait for the receiving team to come to you
  7. Document everything — the escalation trail is valuable for pattern detection and process improvement
用于多源调研客户问题或主题的技能。通过系统搜索内部文档、CRM记录、团队沟通及外部资源,综合信息并附带来源引用与置信度评分,适用于回答问题、调查Bug或收集背景信息。
客户提出需要查证的问题 调查特定Bug是否曾被报告 查询特定账户的历史交互记录 起草回复前的背景信息收集
customer-support/skills/customer-research/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill customer-research -g -y
SKILL.md
Frontmatter
{
    "name": "customer-research",
    "description": "Multi-source research on a customer question or topic with source attribution. Use when a customer asks something you need to look up, investigating whether a bug has been reported before, checking what was previously told to a specific account, or gathering background before drafting a response.",
    "argument-hint": "<question or topic>"
}

/customer-research

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Multi-source research on a customer question, product topic, or account-related inquiry. Synthesizes findings from all available sources with clear attribution and confidence scoring.

Usage

/customer-research <question or topic>

Workflow

1. Parse the Research Request

Identify what type of research is needed:

  • Customer question: Something a customer has asked that needs an answer (e.g., "Does our product support SSO with Okta?")
  • Issue investigation: Background on a reported problem (e.g., "Has this bug been reported before? What's the known workaround?")
  • Account context: History with a specific customer (e.g., "What did we tell Acme Corp last time they asked about this?")
  • Topic research: General topic relevant to support work (e.g., "Best practices for webhook retry logic")

Before searching, clarify what you're actually trying to find:

  • Is this a factual question with a definitive answer?
  • Is this a contextual question requiring multiple perspectives?
  • Is this an exploratory question where the scope is still being defined?
  • Who is the audience for the answer (internal team, customer, leadership)?

2. Search Available Sources

Search systematically through the source tiers below, adapting to what is connected. Don't stop at the first result — cross-reference across sources.

Tier 1 — Official Internal Sources (highest confidence):

  • ~~knowledge base (if connected): product docs, runbooks, FAQs, policy documents
  • ~~cloud storage: internal documents, specs, guides, past research
  • Product roadmap (internal-facing): feature timelines, priorities

Tier 2 — Organizational Context:

  • ~~CRM notes: account notes, activity history, previous answers, opportunity details
  • ~~support platform (if connected): previous resolutions, known issues, workarounds
  • Meeting notes: previous discussions, decisions, commitments

Tier 3 — Team Communications:

  • ~~chat: search for the topic in relevant channels; check if teammates have discussed or answered this before
  • ~~email: search for previous correspondence on this topic
  • Calendar notes: meeting agendas and post-meeting notes

Tier 4 — External Sources:

  • Web search: official documentation, blog posts, community forums
  • Public knowledge bases, help centers, release notes
  • Third-party documentation: integration partners, complementary tools

Tier 5 — Inferred or Analogical (use when direct sources don't yield answers):

  • Similar situations: how similar questions were handled before
  • Analogous customers: what worked for comparable accounts
  • General best practices: industry standards and norms

3. Synthesize Findings

Compile results into a structured research brief:

## Research: [Question/Topic]

### Answer
[Clear, direct answer to the question — lead with the bottom line]

**Confidence:** [High / Medium / Low]
[Explain what drives the confidence level]

### Key Findings

**From [Source 1]:**
- [Finding with specific detail]
- [Finding with specific detail]

**From [Source 2]:**
- [Finding with specific detail]

### Context & Nuance
[Any caveats, edge cases, or additional context that matters]

### Sources
1. [Source name/link] — [what it contributed]
2. [Source name/link] — [what it contributed]
3. [Source name/link] — [what it contributed]

### Gaps & Unknowns
- [What couldn't be confirmed]
- [What might need verification from a subject matter expert]

### Recommended Next Steps
- [Action if the answer needs to go to a customer]
- [Action if further research is needed]
- [Who to consult for verification if needed]

4. Handle Insufficient Sources

If no connected sources yield results:

  • Perform web research on the topic
  • Ask the user for internal context:
    • "I couldn't find this in connected sources. Do you have internal docs or knowledge base articles about this?"
    • "Has your team discussed this topic before? Any ~~chat channels I should check?"
    • "Is there a subject matter expert who would know the answer?"
  • Be transparent about limitations:
    • "This answer is based on web research only — please verify against your internal documentation before sharing with the customer."
    • "I found a possible answer but couldn't confirm it from an authoritative internal source."

5. Customer-Facing Considerations

If the research is to answer a customer question:

  • Flag if the answer involves product roadmap, pricing, legal, or security topics that may need review
  • Note if the answer differs from what may have been communicated previously
  • Suggest appropriate caveats for the customer-facing response
  • Offer to draft the customer response: "Want me to draft a response to the customer based on these findings?"

6. Knowledge Capture

After research is complete, suggest capturing the knowledge:

  • "Should I save these findings to your knowledge base for future reference?"
  • "Want me to create a FAQ entry based on this research?"
  • "This might be worth documenting — should I draft a runbook entry?"

This helps build institutional knowledge and reduces duplicate research effort across the team.


Source Prioritization and Confidence

Confidence by Source Tier

Tier Source Type Confidence Notes
1 Official internal docs, KB, policies High Trust unless clearly outdated — check dates
2 CRM, support tickets, meeting notes Medium-High May be subjective or incomplete
3 Chat, email, calendar notes Medium Informal, may be out of context or speculative
4 Web, forums, third-party docs Low-Medium May not reflect your specific situation
5 Inference, analogies, best practices Low Clearly flag as inference, not fact

Confidence Levels

Always assign and communicate a confidence level:

High Confidence:

  • Answer confirmed by official documentation or authoritative source
  • Multiple sources corroborate the same answer
  • Information is current (verified within a reasonable timeframe)
  • "I'm confident this is accurate based on [source]."

Medium Confidence:

  • Answer found in informal sources (chat, email) but not official docs
  • Single source without corroboration
  • Information may be slightly outdated but likely still valid
  • "Based on [source], this appears to be the case, but I'd recommend confirming with [team/person]."

Low Confidence:

  • Answer is inferred from related information
  • Sources are outdated or potentially unreliable
  • Contradictory information found across sources
  • "I wasn't able to find a definitive answer. Based on [context], my best assessment is [answer], but this should be verified before sharing with the customer."

Unable to Determine:

  • No relevant information found in any source
  • Question requires specialized knowledge not available in sources
  • "I couldn't find information about this. I recommend reaching out to [suggested expert/team] for a definitive answer."

Handling Contradictions

When sources disagree:

  1. Note the contradiction explicitly
  2. Identify which source is more authoritative or more recent
  3. Present both perspectives with context
  4. Recommend how to resolve the discrepancy
  5. If going to a customer: use the most conservative/cautious answer until resolved

When to Escalate vs. Answer Directly

Answer Directly When:

  • Official documentation clearly addresses the question
  • Multiple reliable sources corroborate the answer
  • The question is factual and non-sensitive
  • The answer doesn't involve commitments, timelines, or pricing
  • You've answered similar questions before with confirmed accuracy

Escalate or Verify When:

  • The answer involves product roadmap commitments or timelines
  • Pricing, legal terms, or contract-specific questions
  • Security, compliance, or data handling questions
  • The answer could set a precedent or create expectations
  • You found contradictory information in sources
  • The question involves a specific customer's custom configuration
  • The answer requires specialized expertise you don't have
  • The customer is at risk and the wrong answer could exacerbate the situation

Escalation Path:

  1. Subject matter expert: For technical or domain-specific questions
  2. Product team: For roadmap, feature, or capability questions
  3. Legal/compliance: For terms, privacy, security, or regulatory questions
  4. Billing/finance: For pricing, invoice, or payment-related questions
  5. Engineering: For custom configurations, bugs, or technical root causes
  6. Leadership: For strategic decisions, exceptions, or high-stakes situations

Research Documentation for Team Knowledge Base

After completing research, capture the knowledge for future use.

When to Document:

  • Question has come up before or likely will again
  • Research took significant effort to compile
  • Answer required synthesizing multiple sources
  • Answer corrects a common misunderstanding
  • Answer involves nuance that's easy to get wrong

Documentation Format:

## [Question/Topic]

**Last Verified:** [date]
**Confidence:** [level]

### Answer
[Clear, direct answer]

### Details
[Supporting detail, context, and nuance]

### Sources
[Where this information came from]

### Related Questions
[Other questions this might help answer]

### Review Notes
[When to re-verify, what might change this answer]

Knowledge Base Hygiene:

  • Date-stamp all entries
  • Flag entries that reference specific product versions or features
  • Review and update entries quarterly
  • Archive entries that are no longer relevant
  • Tag entries for searchability (by topic, product area, customer segment)
根据客户问题、升级或坏消息等场景,起草专业且定制化的对外回复。支持解析上下文、调研背景信息,并生成符合语气要求的草稿及内部备注。
回答产品问题 处理升级或故障 传达延迟或无法修复的坏消息 拒绝功能请求 回复账单问题
customer-support/skills/draft-response/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill draft-response -g -y
SKILL.md
Frontmatter
{
    "name": "draft-response",
    "description": "Draft a professional customer-facing response tailored to the situation and relationship. Use when answering a product question, responding to an escalation or outage, delivering bad news like a delay or won't-fix, declining a feature request, or replying to a billing issue.",
    "argument-hint": "<situation description>"
}

/draft-response

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Draft a professional, customer-facing response tailored to the situation, customer relationship, and communication context.

Usage

/draft-response <context about the customer question, issue, or request>

Examples:

  • /draft-response Acme Corp is asking when the new dashboard feature will ship
  • /draft-response Customer escalation — their integration has been down for 2 days
  • /draft-response Responding to a feature request we won't be building
  • /draft-response Customer hit a billing error and wants a resolution ASAP

Workflow

1. Understand the Context

Parse the user's input to determine:

  • Customer: Who is the communication for? Look up account context if available.
  • Situation type: Question, issue, escalation, announcement, negotiation, bad news, good news, follow-up
  • Urgency: Is this time-sensitive? How long has the customer been waiting?
  • Channel: Email, support ticket, chat, or other (adjust formality accordingly)
  • Relationship stage: New customer, established, frustrated/escalated
  • Stakeholder level: End user, manager, executive, technical, business

2. Research Context

Gather relevant background from available sources:

~~email:

  • Previous correspondence with this customer on this topic
  • Any commitments or timelines previously shared
  • Tone and style of the existing thread

~~chat:

  • Internal discussions about this customer or topic
  • Any guidance from product, engineering, or leadership
  • Similar situations and how they were handled

~~CRM (if connected):

  • Account details and plan level
  • Contact information and key stakeholders
  • Previous escalations or sensitive issues

~~support platform (if connected):

  • Related tickets and their resolution
  • Known issues or workarounds
  • SLA status and response time commitments

~~knowledge base:

  • Official documentation or help articles to reference
  • Product roadmap information (if shareable)
  • Policy or process documentation

3. Generate the Draft

Produce a response tailored to the situation:

## Draft Response

**To:** [Customer contact name]
**Re:** [Subject/topic]
**Channel:** [Email / Ticket / Chat]
**Tone:** [Empathetic / Professional / Technical / Celebratory / Candid]

---

[Draft response text]

---

### Notes for You (internal — do not send)
- **Why this approach:** [Rationale for tone and content choices]
- **Things to verify:** [Any facts or commitments to confirm before sending]
- **Risk factors:** [Anything sensitive about this response]
- **Follow-up needed:** [Actions to take after sending]
- **Escalation note:** [If this should be reviewed by someone else first]

4. Run Quality Checks

Before presenting the draft, verify:

  • Tone matches the situation and relationship
  • No commitments beyond what's authorized
  • No product roadmap details that shouldn't be shared externally
  • Accurate references to previous conversations
  • Clear next steps and ownership
  • Appropriate for the stakeholder level (not too technical for executives, not too vague for engineers)
  • Length is appropriate for the channel (shorter for chat, fuller for email)

5. Offer Iterations

After presenting the draft:

  • "Want me to adjust the tone? (more formal, more casual, more empathetic, more direct)"
  • "Should I add or remove any specific points?"
  • "Want me to make this shorter/longer?"
  • "Should I draft a version for a different stakeholder?"
  • "Want me to draft the internal escalation note as well?"
  • "Should I prepare a follow-up message to send after [X days] if no response?"

Customer Communication Best Practices

Core Principles

  1. Lead with empathy: Acknowledge the customer's situation before jumping to solutions
  2. Be direct: Get to the point — customers are busy. Bottom-line-up-front.
  3. Be honest: Never overpromise, never mislead, never hide bad news in jargon
  4. Be specific: Use concrete details, timelines, and names — avoid vague language
  5. Own it: Take responsibility when appropriate. "We" not "the system" or "the process"
  6. Close the loop: Every response should have a clear next step or call to action
  7. Match their energy: If they're frustrated, be empathetic first. If they're excited, be enthusiastic.

Response Structure

For most customer communications, follow this structure:

1. Acknowledgment / Context (1-2 sentences)
   - Acknowledge what they said, asked, or are experiencing
   - Show you understand their situation

2. Core Message (1-3 paragraphs)
   - Deliver the main information, answer, or update
   - Be specific and concrete
   - Include relevant details they need

3. Next Steps (1-3 bullets)
   - What YOU will do and by when
   - What THEY need to do (if anything)
   - When they'll hear from you next

4. Closing (1 sentence)
   - Warm but professional sign-off
   - Reinforce you're available if needed

Length Guidelines

  • Chat/IM: 1-4 sentences. Get to the point immediately.
  • Support ticket response: 1-3 short paragraphs. Structured and scannable.
  • Email: 3-5 paragraphs max. Respect their inbox.
  • Escalation response: As long as needed to be thorough, but well-structured with headers.
  • Executive communication: Shorter is better. 2-3 paragraphs max. Data-driven.

Tone and Style Guidelines

Tone Spectrum

Situation Tone Characteristics
Good news / wins Celebratory Enthusiastic, warm, congratulatory, forward-looking
Routine update Professional Clear, concise, informative, friendly
Technical response Precise Accurate, detailed, structured, patient
Delayed delivery Accountable Honest, apologetic, action-oriented, specific
Bad news Candid Direct, empathetic, solution-oriented, respectful
Issue / outage Urgent Immediate, transparent, actionable, reassuring
Escalation Executive Composed, ownership-taking, plan-presenting, confident
Billing / account Precise Clear, factual, empathetic, resolution-focused

Tone Adjustments by Relationship Stage

New Customer (0-3 months):

  • More formal and professional
  • Extra context and explanation (don't assume knowledge)
  • Proactively offer help and resources
  • Build trust through reliability and responsiveness

Established Customer (3+ months):

  • Warm and collaborative
  • Can reference shared history and previous conversations
  • More direct and efficient communication
  • Show awareness of their goals and priorities

Frustrated or Escalated Customer:

  • Extra empathy and acknowledgment
  • Urgency in response times
  • Concrete action plans with specific commitments
  • Shorter feedback loops

Writing Style Rules

DO:

  • Use active voice ("We'll investigate" not "This will be investigated")
  • Use "I" for personal commitments and "we" for team commitments
  • Name specific people when assigning actions ("Sarah from our engineering team will...")
  • Use the customer's terminology, not your internal jargon
  • Include specific dates and times, not relative terms ("by Friday January 24" not "in a few days")
  • Break up long responses with headers or bullet points

DON'T:

  • Use corporate jargon or buzzwords ("synergy", "leverage", "paradigm shift")
  • Deflect blame to other teams, systems, or processes
  • Use passive voice to avoid ownership ("Mistakes were made")
  • Include unnecessary caveats or hedging that undermines confidence
  • CC people unnecessarily — only include those who need to be in the conversation
  • Use exclamation marks excessively (one per email max, if any)

Situation-Specific Approaches

Answering a product question:

  • Lead with the direct answer
  • Provide relevant documentation links
  • Offer to connect them with the right resource if needed
  • If you don't know the answer: say so honestly, commit to finding out, give a timeline

Responding to an issue or bug:

  • Acknowledge the impact on their work
  • State what you know about the issue and its status
  • Provide workaround if available
  • Set expectations for resolution timeline
  • Commit to updates at regular intervals

Handling an escalation:

  • Acknowledge the severity and their frustration
  • Take ownership (no deflecting or excuse-making)
  • Provide a clear action plan with timeline
  • Identify the person accountable for resolution
  • Offer a meeting or call if appropriate for the severity

Delivering bad news (feature sunset, delay, can't-fix):

  • Be direct — don't bury the news
  • Explain the reasoning honestly
  • Acknowledge the impact on them specifically
  • Offer alternatives or mitigation
  • Provide a clear path forward

Sharing good news (feature launch, milestone, recognition):

  • Lead with the positive outcome
  • Connect it to their specific goals or use case
  • Suggest next steps to capitalize on the good news
  • Express genuine enthusiasm

Declining a request (feature request, discount, exception):

  • Acknowledge the request and its reasoning
  • Be honest about the decision
  • Explain the why without being dismissive
  • Offer alternatives when possible
  • Leave the door open for future conversation

Response Templates for Common Scenarios

Acknowledging a Bug Report

Hi [Name],

Thank you for reporting this — I can see how [specific impact] would be
frustrating for your team.

I've confirmed the issue and escalated it to our engineering team as a
[priority level]. Here's what we know so far:
- [What's happening]
- [What's causing it, if known]
- [Workaround, if available]

I'll update you by [specific date/time] with a resolution timeline.
In the meantime, [workaround details if applicable].

Let me know if you have any questions or if this is impacting you in
other ways I should know about.

Best,
[Your name]

Acknowledging a Billing or Account Issue

Hi [Name],

Thank you for reaching out about this — I understand billing issues
need prompt attention, and I want to make sure this gets resolved
quickly.

I've looked into your account and here's what I'm seeing:
- [What happened — clear factual explanation]
- [Impact on their account — charges, access, etc.]

Here's what I'm doing to fix this:
- [Action 1 — with timeline]
- [Action 2 — if applicable]

[If resolution is immediate: "This has been corrected and you should
see the change reflected within [timeframe]."]
[If needs investigation: "I'm escalating this to our billing team
and will have an update for you by [specific date]."]

I'm sorry for the inconvenience. Let me know if you have any
questions about your account.

Best,
[Your name]

Responding to a Feature Request You Won't Build

Hi [Name],

Thank you for sharing this request — I can see why [capability] would
be valuable for [their use case].

I discussed this with our product team, and this isn't something we're
planning to build in the near term. The primary reason is [honest,
respectful explanation — e.g., it serves a narrow use case, it conflicts
with our architecture direction, etc.].

That said, I want to make sure you can accomplish your goal. Here are
some alternatives:
- [Alternative approach 1]
- [Alternative approach 2]
- [Integration or workaround if applicable]

I've also documented your request in our feedback system, and if our
direction changes, I'll let you know.

Would any of these alternatives work for your team? Happy to dig
deeper into any of them.

Best,
[Your name]

Outage or Incident Communication

Hi [Name],

I wanted to reach out directly to let you know about an issue affecting
[service/feature] that I know your team relies on.

**What happened:** [Clear, non-technical explanation]
**Impact:** [How it affects them specifically]
**Status:** [Current status — investigating / identified / fixing / resolved]
**ETA for resolution:** [Specific time if known, or "we'll update every X hours"]

[If applicable: "In the meantime, you can [workaround]."]

I'm personally tracking this and will update you as soon as we have a
resolution. You can also check [status page URL] for real-time updates.

I'm sorry for the disruption to your team's work. We take this seriously
and [what you're doing to prevent recurrence if known].

[Your name]

Following Up After Silence

Hi [Name],

I wanted to check in — I sent over [what you sent] on [date] and
wanted to make sure it didn't get lost in the shuffle.

[Brief reminder of what you need from them or what you're offering]

If now isn't a good time, no worries — just let me know when would be
better, and I'm happy to reconnect then.

Best,
[Your name]

Follow-up and Escalation Guidance

Follow-up Cadence

Situation Follow-up Timing
Unanswered question 2-3 business days
Open support issue Daily until resolved for critical, 2-3 days for standard
Post-meeting action items Within 24 hours (send notes), then check at deadline
General check-in As needed for ongoing issues
After delivering bad news 1 week to check on impact and sentiment

When to Escalate

Escalate to your manager when:

  • Customer threatens to cancel or significantly downsell
  • Customer requests exception to policy you can't authorize
  • An issue has been unresolved for longer than SLA allows
  • Customer requests direct contact with leadership
  • You've made an error that needs senior involvement to resolve

Escalate to product/engineering when:

  • Bug is critical and blocking the customer's business
  • Feature gap is causing a competitive loss
  • Customer has unique technical requirements beyond standard support
  • Integration issues require engineering investigation

Escalation format:

ESCALATION: [Customer Name] — [One-line summary]

Urgency: [Critical / High / Medium]
Customer impact: [What's broken for them]
History: [Brief background — 2-3 sentences]
What I've tried: [Actions taken so far]
What I need: [Specific help or decision needed]
Deadline: [When this needs to be resolved by]
根据已解决的工单、常见问题或变通方案,自动生成结构化的知识库文章草稿。支持多种文章类型(如操作指南、故障排除),优化搜索可见性,并提供元数据及后续发布建议,助力自助服务。
需要记录已解决的支持问题以供自助服务参考 同一问题反复出现需标准化回答 需要发布临时变通方案 需向客户通报已知问题
customer-support/skills/kb-article/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill kb-article -g -y
SKILL.md
Frontmatter
{
    "name": "kb-article",
    "description": "Draft a knowledge base article from a resolved issue or common question. Use when a ticket resolution is worth documenting for self-service, the same question keeps coming up, a workaround needs to be published, or a known issue should be communicated to customers.",
    "argument-hint": "<resolved issue or ticket>"
}

/kb-article

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Draft a publish-ready knowledge base article from a resolved support issue, common question, or documented workaround. Structures the content for searchability and self-service.

Usage

/kb-article <resolved issue, ticket reference, or topic description>

Examples:

  • /kb-article How to configure SSO with Okta — resolved this for 3 customers last month
  • /kb-article Ticket #4521 — customer couldn't export data over 10k rows
  • /kb-article Common question: how to set up webhook notifications
  • /kb-article Known issue: dashboard charts not loading on Safari 16

Workflow

1. Understand the Source Material

Parse the input to identify:

  • What was the problem? The original issue, question, or error
  • What was the solution? The resolution, workaround, or answer
  • Who does this affect? User type, plan level, or configuration
  • How common is this? One-off or recurring issue
  • What article type fits best? How-to, troubleshooting, FAQ, known issue, or reference (see article types below)

If a ticket reference is provided, look up the full context:

  • ~~support platform: Pull the ticket thread, resolution, and any internal notes
  • ~~knowledge base: Check if a similar article already exists (update vs. create new)
  • ~~project tracker: Check if there's a related bug or feature request

2. Draft the Article

Using the article structure, formatting standards, and searchability best practices below:

  • Follow the template for the chosen article type (how-to, troubleshooting, FAQ, known issue, or reference)
  • Apply the searchability best practices: customer-language title, plain-language opening sentence, exact error messages, common synonyms
  • Keep it scannable: headers, numbered steps, short paragraphs

3. Generate the Article

Present the draft with metadata:

## KB Article Draft

**Title:** [Article title]
**Type:** [How-to / Troubleshooting / FAQ / Known Issue / Reference]
**Category:** [Product area or topic]
**Tags:** [Searchable tags]
**Audience:** [All users / Admins / Developers / Specific plan]

---

[Full article content — using the appropriate template below]

---

### Publishing Notes
- **Source:** [Ticket #, customer conversation, or internal discussion]
- **Existing articles to update:** [If this overlaps with existing content]
- **Review needed from:** [SME or team if technical accuracy needs verification]
- **Suggested review date:** [When to revisit for accuracy]

4. Offer Next Steps

After generating the article:

  • "Want me to check if a similar article already exists in your ~~knowledge base?"
  • "Should I adjust the technical depth for a different audience?"
  • "Want me to draft a companion article (e.g., a how-to to go with this troubleshooting guide)?"
  • "Should I create an internal-only version with additional technical detail?"

Article Structure and Formatting Standards

Universal Article Elements

Every KB article should include:

  1. Title: Clear, searchable, describes the outcome or problem (not internal jargon)
  2. Overview: 1-2 sentences explaining what this article covers and who it's for
  3. Body: Structured content appropriate to the article type
  4. Related articles: Links to relevant companion content
  5. Metadata: Category, tags, audience, last updated date

Formatting Rules

  • Use headers (H2, H3) to break content into scannable sections
  • Use numbered lists for sequential steps
  • Use bullet lists for non-sequential items
  • Use bold for UI element names, key terms, and emphasis
  • Use code blocks for commands, API calls, error messages, and configuration values
  • Use tables for comparisons, options, or reference data
  • Use callouts/notes for warnings, tips, and important caveats
  • Keep paragraphs short — 2-4 sentences max
  • One idea per section — if a section covers two topics, split it

Writing for Searchability

Articles are useless if customers can't find them. Optimize every article for search:

Title Best Practices

Good Title Bad Title Why
"How to configure SSO with Okta" "SSO Setup" Specific, includes the tool name customers search for
"Fix: Dashboard shows blank page" "Dashboard Issue" Includes the symptom customers experience
"API rate limits and quotas" "API Information" Includes the specific terms customers search for
"Error: 'Connection refused' when importing data" "Import Problems" Includes the exact error message

Keyword Optimization

  • Include exact error messages — customers copy-paste error text into search
  • Use customer language, not internal terminology — "can't log in" not "authentication failure"
  • Include common synonyms — "delete/remove", "dashboard/home page", "export/download"
  • Add alternate phrasings — address the same issue from different angles in the overview
  • Tag with product areas — make sure category and tags match how customers think about the product

Opening Sentence Formula

Start every article with a sentence that restates the problem or task in plain language:

  • How-to: "This guide shows you how to [accomplish X]."
  • Troubleshooting: "If you're seeing [symptom], this article explains how to fix it."
  • FAQ: "[Question in the customer's words]? Here's the answer."
  • Known issue: "Some users are experiencing [symptom]. Here's what we know and how to work around it."

Article Type Templates

How-to Articles

Purpose: Step-by-step instructions for accomplishing a task.

Structure:

# How to [accomplish task]

[Overview — what this guide covers and when you'd use it]

## Prerequisites
- [What's needed before starting]

## Steps
### 1. [Action]
[Instruction with specific details]

### 2. [Action]
[Instruction]

## Verify It Worked
[How to confirm success]

## Common Issues
- [Issue]: [Fix]

## Related Articles
- [Links]

Best practices:

  • Start each step with a verb
  • Include the specific path: "Go to Settings > Integrations > API Keys"
  • Mention what the user should see after each step ("You should see a green confirmation banner")
  • Test the steps yourself or verify with a recent ticket resolution

Troubleshooting Articles

Purpose: Diagnose and resolve a specific problem.

Structure:

# [Problem description — what the user sees]

## Symptoms
- [What the user observes]

## Cause
[Why this happens — brief, non-jargon explanation]

## Solution
### Option 1: [Primary fix]
[Steps]

### Option 2: [Alternative if Option 1 doesn't work]
[Steps]

## Prevention
[How to avoid this in the future]

## Still Having Issues?
[How to get help]

Best practices:

  • Lead with symptoms, not causes — customers search for what they see
  • Provide multiple solutions when possible (most likely fix first)
  • Include a "Still having issues?" section that points to support
  • If the root cause is complex, keep the customer-facing explanation simple

FAQ Articles

Purpose: Quick answer to a common question.

Structure:

# [Question — in the customer's words]

[Direct answer — 1-3 sentences]

## Details
[Additional context, nuance, or explanation if needed]

## Related Questions
- [Link to related FAQ]
- [Link to related FAQ]

Best practices:

  • Answer the question in the first sentence
  • Keep it concise — if the answer needs a walkthrough, it's a how-to, not an FAQ
  • Group related FAQs and link between them

Known Issue Articles

Purpose: Document a known bug or limitation with a workaround.

Structure:

# [Known Issue]: [Brief description]

**Status:** [Investigating / Workaround Available / Fix In Progress / Resolved]
**Affected:** [Who/what is affected]
**Last updated:** [Date]

## Symptoms
[What users experience]

## Workaround
[Steps to work around the issue, or "No workaround available"]

## Fix Timeline
[Expected fix date or current status]

## Updates
- [Date]: [Update]

Best practices:

  • Keep the status current — nothing erodes trust faster than a stale known issue article
  • Update the article when the fix ships and mark as resolved
  • If resolved, keep the article live for 30 days for customers still searching the old symptoms

Review and Maintenance Cadence

Knowledge bases decay without maintenance. Follow this schedule:

Activity Frequency Who
New article review Before publishing Peer review + SME for technical content
Accuracy audit Quarterly Support team reviews top-traffic articles
Stale content check Monthly Flag articles not updated in 6+ months
Known issue updates Weekly Update status on all open known issues
Analytics review Monthly Check which articles have low helpfulness ratings or high bounce rates
Gap analysis Quarterly Identify top ticket topics without KB articles

Article Lifecycle

  1. Draft: Written, needs review
  2. Published: Live and available to customers
  3. Needs update: Flagged for revision (product change, feedback, or age)
  4. Archived: No longer relevant but preserved for reference
  5. Retired: Removed from the knowledge base

When to Update vs. Create New

Update existing when:

  • The product changed and steps need refreshing
  • The article is mostly right but missing a detail
  • Feedback indicates customers are confused by a specific section
  • A better workaround or solution was found

Create new when:

  • A new feature or product area needs documentation
  • A resolved ticket reveals a gap — no article exists for this topic
  • The existing article covers too many topics and should be split
  • A different audience needs the same information explained differently

Linking and Categorization Taxonomy

Category Structure

Organize articles into a hierarchy that matches how customers think:

Getting Started
├── Account setup
├── First-time configuration
└── Quick start guides

Features & How-tos
├── [Feature area 1]
├── [Feature area 2]
└── [Feature area 3]

Integrations
├── [Integration 1]
├── [Integration 2]
└── API reference

Troubleshooting
├── Common errors
├── Performance issues
└── Known issues

Billing & Account
├── Plans and pricing
├── Billing questions
└── Account management

Linking Best Practices

  • Link from troubleshooting to how-to: "For setup instructions, see [How to configure X]"
  • Link from how-to to troubleshooting: "If you encounter errors, see [Troubleshooting X]"
  • Link from FAQ to detailed articles: "For a full walkthrough, see [Guide to X]"
  • Link from known issues to workarounds: Keep the chain from problem to solution short
  • Use relative links within the KB — they survive restructuring better than absolute URLs
  • Avoid circular links — if A links to B, B shouldn't link back to A unless both are genuinely useful entry points

KB Writing Best Practices

  1. Write for the customer who is frustrated and searching for an answer — be clear, direct, and helpful
  2. Every article should be findable through search using the words a customer would type
  3. Test your articles — follow the steps yourself or have someone unfamiliar with the topic follow them
  4. Keep articles focused — one problem, one solution. Split if an article is growing too long
  5. Maintain aggressively — a wrong article is worse than no article
  6. Track what's missing — every ticket that could have been a KB article is a content gap
  7. Measure impact — articles that don't get traffic or don't reduce tickets need to be improved or retired
用于对新进工单进行分类、优先级评估(P1-P4)、去重检查及路由分配。通过分析问题核心、影响范围和紧急程度,生成结构化评估报告、推荐处理团队并起草初始回复,提升支持效率。
收到新的客户支持工单 需要对问题进行分类和优先级排序 判断是否为重复或已知问题 决定工单应路由至哪个团队
customer-support/skills/ticket-triage/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill ticket-triage -g -y
SKILL.md
Frontmatter
{
    "name": "ticket-triage",
    "description": "Triage and prioritize a support ticket or customer issue. Use when a new ticket comes in and needs categorization, assigning P1-P4 priority, deciding which team should handle it, or checking whether it's a duplicate or known issue before routing.",
    "argument-hint": "<ticket or issue description>"
}

/ticket-triage

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Categorize, prioritize, and route an incoming support ticket or customer issue. Produces a structured triage assessment with a suggested initial response.

Usage

/ticket-triage <ticket text, customer message, or issue description>

Examples:

  • /ticket-triage Customer says their dashboard has been showing a blank page since this morning
  • /ticket-triage "I was charged twice for my subscription this month"
  • /ticket-triage User can't connect their SSO — getting a 403 error on the callback URL
  • /ticket-triage Feature request: they want to export reports as PDF

Workflow

1. Parse the Issue

Read the input and extract:

  • Core problem: What is the customer actually experiencing?
  • Symptoms: What specific behavior or error are they seeing?
  • Customer context: Who is this? Any account details, plan level, or history available?
  • Urgency signals: Are they blocked? Is this production? How many users affected?
  • Emotional state: Frustrated, confused, matter-of-fact, escalating?

2. Categorize and Prioritize

Using the category taxonomy and priority framework below:

  • Assign a primary category (bug, how-to, feature request, billing, account, integration, security, data, performance) and an optional secondary category
  • Assign a priority (P1–P4) based on impact and urgency
  • Identify the product area the issue maps to

3. Check for Duplicates and Known Issues

Before routing, check available sources:

  • ~~support platform: Search for similar open or recently resolved tickets
  • ~~knowledge base: Check for known issues or existing documentation
  • ~~project tracker: Check if there's an existing bug report or feature request

Apply the duplicate detection process below.

4. Determine Routing

Using the routing rules below, recommend which team or queue should handle this based on category and complexity.

5. Generate Triage Output

## Triage: [One-line issue summary]

**Category:** [Primary] / [Secondary if applicable]
**Priority:** [P1-P4] — [Brief justification]
**Product area:** [Area/team]

### Issue Summary
[2-3 sentence summary of what the customer is experiencing]

### Key Details
- **Customer:** [Name/account if known]
- **Impact:** [Who and what is affected]
- **Workaround:** [Available / Not available / Unknown]
- **Related tickets:** [Links to similar issues if found]
- **Known issue:** [Yes — link / No / Checking]

### Routing Recommendation
**Route to:** [Team or queue]
**Why:** [Brief reasoning]

### Suggested Initial Response
[Draft first response to the customer — acknowledge the issue,
set expectations, provide workaround if available.
Use the auto-response templates below as a starting point.]

### Internal Notes
- [Any additional context for the agent picking this up]
- [Reproduction hints if it's a bug]
- [Escalation triggers to watch for]

6. Offer Next Steps

After presenting the triage:

  • "Want me to draft a full response to the customer?"
  • "Should I search for more context on this issue?"
  • "Want me to check if this is a known bug in the tracker?"
  • "Should I escalate this? I can package it with /customer-escalation."

Category Taxonomy

Assign every ticket a primary category and optionally a secondary category:

Category Description Signal Words
Bug Product is behaving incorrectly or unexpectedly Error, broken, crash, not working, unexpected, wrong, failing
How-to Customer needs guidance on using the product How do I, can I, where is, setting up, configure, help with
Feature request Customer wants a capability that doesn't exist Would be great if, wish I could, any plans to, requesting
Billing Payment, subscription, invoice, or pricing issues Charge, invoice, payment, subscription, refund, upgrade, downgrade
Account Account access, permissions, settings, or user management Login, password, access, permission, SSO, locked out, can't sign in
Integration Issues connecting to third-party tools or APIs API, webhook, integration, connect, OAuth, sync, third-party
Security Security concerns, data access, or compliance questions Data breach, unauthorized, compliance, GDPR, SOC 2, vulnerability
Data Data quality, migration, import/export issues Missing data, export, import, migration, incorrect data, duplicates
Performance Speed, reliability, or availability issues Slow, timeout, latency, down, unavailable, degraded

Category Determination Tips

  • If the customer reports both a bug and a feature request, the bug is primary
  • If they can't log in due to a bug, category is Bug (not Account) — root cause drives the category
  • "It used to work and now it doesn't" = Bug
  • "I want it to work differently" = Feature request
  • "How do I make it work?" = How-to
  • When in doubt, lean toward Bug — it's better to investigate than dismiss

Priority Framework

P1 — Critical

Criteria: Production system down, data loss or corruption, security breach, all or most users affected.

  • The customer cannot use the product at all
  • Data is being lost, corrupted, or exposed
  • A security incident is in progress
  • The issue is worsening or expanding in scope

SLA expectation: Respond within 1 hour. Continuous work until resolved or mitigated. Updates every 1-2 hours.

P2 — High

Criteria: Major feature broken, significant workflow blocked, many users affected, no workaround.

  • A core workflow is broken but the product is partially usable
  • Multiple users are affected or a key account is impacted
  • The issue is blocking time-sensitive work
  • No reasonable workaround exists

SLA expectation: Respond within 4 hours. Active investigation same day. Updates every 4 hours.

P3 — Medium

Criteria: Feature partially broken, workaround available, single user or small team affected.

  • A feature isn't working correctly but a workaround exists
  • The issue is inconvenient but not blocking critical work
  • A single user or small team is affected
  • The customer is not escalating urgently

SLA expectation: Respond within 1 business day. Resolution or update within 3 business days.

P4 — Low

Criteria: Minor inconvenience, cosmetic issue, general question, feature request.

  • Cosmetic or UI issues that don't affect functionality
  • Feature requests and enhancement ideas
  • General questions or how-to inquiries
  • Issues with simple, documented solutions

SLA expectation: Respond within 2 business days. Resolution at normal pace.

Priority Escalation Triggers

Automatically bump priority up when:

  • Customer has been waiting longer than the SLA allows
  • Multiple customers report the same issue (pattern detected)
  • The customer explicitly escalates or mentions executive involvement
  • A workaround that was in place stops working
  • The issue expands in scope (more users, more data, new symptoms)

Routing Rules

Route tickets based on category and complexity:

Route to When
Tier 1 (frontline support) How-to questions, known issues with documented solutions, billing inquiries, password resets
Tier 2 (senior support) Bugs requiring investigation, complex configuration, integration troubleshooting, account issues
Engineering Confirmed bugs needing code fixes, infrastructure issues, performance degradation
Product Feature requests with significant demand, design decisions, workflow gaps
Security Data access concerns, vulnerability reports, compliance questions
Billing/Finance Refund requests, contract disputes, complex billing adjustments

Duplicate Detection

Before creating a new ticket or routing, check for duplicates:

  1. Search by symptom: Look for tickets with similar error messages or descriptions
  2. Search by customer: Check if this customer has an open ticket for the same issue
  3. Search by product area: Look for recent tickets in the same feature area
  4. Check known issues: Compare against documented known issues

If a duplicate is found:

  • Link the new ticket to the existing one
  • Notify the customer that this is a known issue being tracked
  • Add any new information from the new report to the existing ticket
  • Bump priority if the new report adds urgency (more customers affected, etc.)

Auto-Response Templates by Category

Bug — Initial Response

Thank you for reporting this. I can see how [specific impact]
would be disruptive for your work.

I've logged this as a [priority] issue and our team is
investigating. [If workaround exists: "In the meantime, you
can [workaround]."]

I'll update you within [SLA timeframe] with what we find.

How-to — Initial Response

Great question! [Direct answer or link to documentation]

[If more complex: "Let me walk you through the steps:"]
[Steps or guidance]

Let me know if that helps, or if you have any follow-up
questions.

Feature Request — Initial Response

Thank you for this suggestion — I can see why [capability]
would be valuable for your workflow.

I've documented this and shared it with our product team.
While I can't commit to a specific timeline, your feedback
directly informs our roadmap priorities.

[If alternative exists: "In the meantime, you might find
[alternative] helpful for achieving something similar."]

Billing — Initial Response

I understand billing issues need prompt attention. Let me
look into this for you.

[If straightforward: resolution details]
[If complex: "I'm reviewing your account now and will have
an answer for you within [timeframe]."]

Security — Initial Response

Thank you for flagging this — we take security concerns
seriously and are reviewing this immediately.

I've escalated this to our security team for investigation.
We'll follow up with you within [timeframe] with our findings.

[If action is needed: "In the meantime, we recommend
[protective action]."]

Triage Best Practices

  1. Read the full ticket before categorizing — context in later messages often changes the assessment
  2. Categorize by root cause, not just the symptom described
  3. When in doubt on priority, err on the side of higher — it's easier to de-escalate than to recover from a missed SLA
  4. Always check for duplicates and known issues before routing
  5. Write internal notes that help the next person pick up context quickly
  6. Include what you've already checked or ruled out to avoid duplicate investigation
  7. Flag patterns — if you're seeing the same issue repeatedly, escalate the pattern even if individual tickets are low priority
用于回答数据问题,支持从简单指标查询到完整趋势分析及正式报告。通过解析问题复杂度、获取或请求数据、执行分析验证,最终提供结构化洞察与结论,适用于单点查询、归因分析及利益相关者汇报场景。
查询单一指标 调查趋势下降原因 跨时段对比细分数据 准备正式数据报告
data/skills/analyze/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill analyze -g -y
SKILL.md
Frontmatter
{
    "name": "analyze",
    "description": "Answer data questions -- from quick lookups to full analyses. Use when looking up a single metric, investigating what's driving a trend or drop, comparing segments over time, or preparing a formal data report for stakeholders.",
    "argument-hint": "<question>"
}

/analyze - Answer Data Questions

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Answer a data question, from a quick lookup to a full analysis to a formal report.

Usage

/analyze <natural language question>

Workflow

1. Understand the Question

Parse the user's question and determine:

  • Complexity level:
    • Quick answer: Single metric, simple filter, factual lookup (e.g., "How many users signed up last week?")
    • Full analysis: Multi-dimensional exploration, trend analysis, comparison (e.g., "What's driving the drop in conversion rate?")
    • Formal report: Comprehensive investigation with methodology, caveats, and recommendations (e.g., "Prepare a quarterly business review of our subscription metrics")
  • Data requirements: Which tables, metrics, dimensions, and time ranges are needed
  • Output format: Number, table, chart, narrative, or combination

2. Gather Data

If a data warehouse MCP server is connected:

  1. Explore the schema to find relevant tables and columns
  2. Write SQL query(ies) to extract the needed data
  3. Execute the query and retrieve results
  4. If the query fails, debug and retry (check column names, table references, syntax for the specific dialect)
  5. If results look unexpected, run sanity checks before proceeding

If no data warehouse is connected:

  1. Ask the user to provide data in one of these ways:
    • Paste query results directly
    • Upload a CSV or Excel file
    • Describe the schema so you can write queries for them to run
  2. If writing queries for manual execution, use the sql-queries skill for dialect-specific best practices
  3. Once data is provided, proceed with analysis

3. Analyze

  • Calculate relevant metrics, aggregations, and comparisons
  • Identify patterns, trends, outliers, and anomalies
  • Compare across dimensions (time periods, segments, categories)
  • For complex analyses, break the problem into sub-questions and address each

4. Validate Before Presenting

Before sharing results, run through validation checks:

  • Row count sanity: Does the number of records make sense?
  • Null check: Are there unexpected nulls that could skew results?
  • Magnitude check: Are the numbers in a reasonable range?
  • Trend continuity: Do time series have unexpected gaps?
  • Aggregation logic: Do subtotals sum to totals correctly?

If any check raises concerns, investigate and note caveats.

5. Present Findings

For quick answers:

  • State the answer directly with relevant context
  • Include the query used (collapsed or in a code block) for reproducibility

For full analyses:

  • Lead with the key finding or insight
  • Support with data tables and/or visualizations
  • Note methodology and any caveats
  • Suggest follow-up questions

For formal reports:

  • Executive summary with key takeaways
  • Methodology section explaining approach and data sources
  • Detailed findings with supporting evidence
  • Caveats, limitations, and data quality notes
  • Recommendations and suggested next steps

6. Visualize Where Helpful

When a chart would communicate results more effectively than a table:

  • Use the data-visualization skill to select the right chart type
  • Generate a Python visualization or build it into an HTML dashboard
  • Follow visualization best practices for clarity and accuracy

Examples

Quick answer:

/analyze How many new users signed up in December?

Full analysis:

/analyze What's causing the increase in support ticket volume over the past 3 months? Break down by category and priority.

Formal report:

/analyze Prepare a data quality assessment of our customer table -- completeness, consistency, and any issues we should address.

Tips

  • Be specific about time ranges, segments, or metrics when possible
  • If you know the table names, mention them to speed up the process
  • For complex questions, Claude may break them into multiple queries
  • Results are always validated before presentation -- if something looks off, Claude will flag it
构建自包含的交互式HTML仪表板,无需服务器或依赖。支持KPI卡片、图表、筛选器和表格,适用于高管概览、运营监控及团队报告,可直接在浏览器中打开分享。
创建高管概览和KPI卡片 将查询结果转换为可分享的独立报告 构建团队监控快照 需要在单个文件中集成多个带筛选器的图表
data/skills/build-dashboard/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill build-dashboard -g -y
SKILL.md
Frontmatter
{
    "name": "build-dashboard",
    "description": "Build an interactive HTML dashboard with charts, filters, and tables. Use when creating an executive overview with KPI cards, turning query results into a shareable self-contained report, building a team monitoring snapshot, or needing multiple charts with filters in one browser-openable file.",
    "argument-hint": "<description> [data source]"
}

/build-dashboard - Build Interactive Dashboards

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Build a self-contained interactive HTML dashboard with charts, filters, tables, and professional styling. Opens directly in a browser -- no server or dependencies required.

Usage

/build-dashboard <description of dashboard> [data source]

Workflow

1. Understand the Dashboard Requirements

Determine:

  • Purpose: Executive overview, operational monitoring, deep-dive analysis, team reporting
  • Audience: Who will use this dashboard?
  • Key metrics: What numbers matter most?
  • Dimensions: What should users be able to filter or slice by?
  • Data source: Live query, pasted data, CSV file, or sample data

2. Gather the Data

If data warehouse is connected:

  1. Query the necessary data
  2. Embed the results as JSON within the HTML file

If data is pasted or uploaded:

  1. Parse and clean the data
  2. Embed as JSON in the dashboard

If working from a description without data:

  1. Create a realistic sample dataset matching the described schema
  2. Note in the dashboard that it uses sample data
  3. Provide instructions for swapping in real data

3. Design the Dashboard Layout

Follow a standard dashboard layout pattern:

┌──────────────────────────────────────────────────┐
│  Dashboard Title                    [Filters ▼]  │
├────────────┬────────────┬────────────┬───────────┤
│  KPI Card  │  KPI Card  │  KPI Card  │ KPI Card  │
├────────────┴────────────┼────────────┴───────────┤
│                         │                        │
│    Primary Chart        │   Secondary Chart      │
│    (largest area)       │                        │
│                         │                        │
├─────────────────────────┴────────────────────────┤
│                                                  │
│    Detail Table (sortable, scrollable)           │
│                                                  │
└──────────────────────────────────────────────────┘

Adapt the layout to the content:

  • 2-4 KPI cards at the top for headline numbers
  • 1-3 charts in the middle section for trends and breakdowns
  • Optional detail table at the bottom for drill-down data
  • Filters in the header or sidebar depending on complexity

4. Build the HTML Dashboard

Generate a single self-contained HTML file using the base template below. The file includes:

Structure (HTML):

  • Semantic HTML5 layout
  • Responsive grid using CSS Grid or Flexbox
  • Filter controls (dropdowns, date pickers, toggles)
  • KPI cards with values and labels
  • Chart containers
  • Data table with sortable headers

Styling (CSS):

  • Professional color scheme (clean whites, grays, with accent colors for data)
  • Card-based layout with subtle shadows
  • Consistent typography (system fonts for fast loading)
  • Responsive design that works on different screen sizes
  • Print-friendly styles

Interactivity (JavaScript):

  • Chart.js for interactive charts (included via CDN)
  • Filter dropdowns that update all charts and tables simultaneously
  • Sortable table columns
  • Hover tooltips on charts
  • Number formatting (commas, currency, percentages)

Data (embedded JSON):

  • All data embedded directly in the HTML as JavaScript variables
  • No external data fetches required
  • Dashboard works completely offline

5. Implement Chart Types

Use Chart.js for all charts. Common dashboard chart patterns:

  • Line chart: Time series trends
  • Bar chart: Category comparisons
  • Doughnut chart: Composition (when <6 categories)
  • Stacked bar: Composition over time
  • Mixed (bar + line): Volume with rate overlay

Use the Chart.js integration patterns below for each chart type.

6. Add Interactivity

Use the filter and interactivity implementation patterns below for dropdown filters, date range filters, combined filter logic, sortable tables, and chart updates.

7. Save and Open

  1. Save the dashboard as an HTML file with a descriptive name (e.g., sales_dashboard.html)
  2. Open it in the user's default browser
  3. Confirm it renders correctly
  4. Provide instructions for updating data or customizing

Base Template

Every dashboard follows this structure:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Dashboard Title</title>
    <script src="https://cdn.jsdelivr.net/npm/chart.js@4.5.1" integrity="sha384-jb8JQMbMoBUzgWatfe6COACi2ljcDdZQ2OxczGA3bGNeWe+6DChMTBJemed7ZnvJ" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/chartjs-adapter-date-fns@3.0.0" integrity="sha384-cVMg8E3QFwTvGCDuK+ET4PD341jF3W8nO1auiXfuZNQkzbUUiBGLsIQUE+b1mxws" crossorigin="anonymous"></script>
    <style>
        /* Dashboard styles go here */
    </style>
</head>
<body>
    <div class="dashboard-container">
        <header class="dashboard-header">
            <h1>Dashboard Title</h1>
            <div class="filters">
                <!-- Filter controls -->
            </div>
        </header>

        <section class="kpi-row">
            <!-- KPI cards -->
        </section>

        <section class="chart-row">
            <!-- Chart containers -->
        </section>

        <section class="table-section">
            <!-- Data table -->
        </section>

        <footer class="dashboard-footer">
            <span>Data as of: <span id="data-date"></span></span>
        </footer>
    </div>

    <script>
        // Embedded data
        const DATA = [];

        // Dashboard logic
        class Dashboard {
            constructor(data) {
                this.rawData = data;
                this.filteredData = data;
                this.charts = {};
                this.init();
            }

            init() {
                this.setupFilters();
                this.renderKPIs();
                this.renderCharts();
                this.renderTable();
            }

            applyFilters() {
                // Filter logic
                this.filteredData = this.rawData.filter(row => {
                    // Apply each active filter
                    return true; // placeholder
                });
                this.renderKPIs();
                this.updateCharts();
                this.renderTable();
            }

            // ... methods for each section
        }

        const dashboard = new Dashboard(DATA);
    </script>
</body>
</html>

KPI Card Pattern

<div class="kpi-card">
    <div class="kpi-label">Total Revenue</div>
    <div class="kpi-value" id="kpi-revenue">$0</div>
    <div class="kpi-change positive" id="kpi-revenue-change">+0%</div>
</div>
function renderKPI(elementId, value, previousValue, format = 'number') {
    const el = document.getElementById(elementId);
    const changeEl = document.getElementById(elementId + '-change');

    // Format the value
    el.textContent = formatValue(value, format);

    // Calculate and display change
    if (previousValue && previousValue !== 0) {
        const pctChange = ((value - previousValue) / previousValue) * 100;
        const sign = pctChange >= 0 ? '+' : '';
        changeEl.textContent = `${sign}${pctChange.toFixed(1)}% vs prior period`;
        changeEl.className = `kpi-change ${pctChange >= 0 ? 'positive' : 'negative'}`;
    }
}

function formatValue(value, format) {
    switch (format) {
        case 'currency':
            if (value >= 1e6) return `$${(value / 1e6).toFixed(1)}M`;
            if (value >= 1e3) return `$${(value / 1e3).toFixed(1)}K`;
            return `$${value.toFixed(0)}`;
        case 'percent':
            return `${value.toFixed(1)}%`;
        case 'number':
            if (value >= 1e6) return `${(value / 1e6).toFixed(1)}M`;
            if (value >= 1e3) return `${(value / 1e3).toFixed(1)}K`;
            return value.toLocaleString();
        default:
            return value.toString();
    }
}

Chart.js Integration

Chart Container Pattern

<div class="chart-container">
    <h3 class="chart-title">Monthly Revenue Trend</h3>
    <canvas id="revenue-chart"></canvas>
</div>

Line Chart

function createLineChart(canvasId, labels, datasets) {
    const ctx = document.getElementById(canvasId).getContext('2d');
    return new Chart(ctx, {
        type: 'line',
        data: {
            labels: labels,
            datasets: datasets.map((ds, i) => ({
                label: ds.label,
                data: ds.data,
                borderColor: COLORS[i % COLORS.length],
                backgroundColor: COLORS[i % COLORS.length] + '20',
                borderWidth: 2,
                fill: ds.fill || false,
                tension: 0.3,
                pointRadius: 3,
                pointHoverRadius: 6,
            }))
        },
        options: {
            responsive: true,
            maintainAspectRatio: false,
            interaction: {
                mode: 'index',
                intersect: false,
            },
            plugins: {
                legend: {
                    position: 'top',
                    labels: { usePointStyle: true, padding: 20 }
                },
                tooltip: {
                    callbacks: {
                        label: function(context) {
                            return `${context.dataset.label}: ${formatValue(context.parsed.y, 'currency')}`;
                        }
                    }
                }
            },
            scales: {
                x: {
                    grid: { display: false }
                },
                y: {
                    beginAtZero: true,
                    ticks: {
                        callback: function(value) {
                            return formatValue(value, 'currency');
                        }
                    }
                }
            }
        }
    });
}

Bar Chart

function createBarChart(canvasId, labels, data, options = {}) {
    const ctx = document.getElementById(canvasId).getContext('2d');
    const isHorizontal = options.horizontal || labels.length > 8;

    return new Chart(ctx, {
        type: 'bar',
        data: {
            labels: labels,
            datasets: [{
                label: options.label || 'Value',
                data: data,
                backgroundColor: options.colors || COLORS.map(c => c + 'CC'),
                borderColor: options.colors || COLORS,
                borderWidth: 1,
                borderRadius: 4,
            }]
        },
        options: {
            responsive: true,
            maintainAspectRatio: false,
            indexAxis: isHorizontal ? 'y' : 'x',
            plugins: {
                legend: { display: false },
                tooltip: {
                    callbacks: {
                        label: function(context) {
                            return formatValue(context.parsed[isHorizontal ? 'x' : 'y'], options.format || 'number');
                        }
                    }
                }
            },
            scales: {
                x: {
                    beginAtZero: true,
                    grid: { display: isHorizontal },
                    ticks: isHorizontal ? {
                        callback: function(value) {
                            return formatValue(value, options.format || 'number');
                        }
                    } : {}
                },
                y: {
                    beginAtZero: !isHorizontal,
                    grid: { display: !isHorizontal },
                    ticks: !isHorizontal ? {
                        callback: function(value) {
                            return formatValue(value, options.format || 'number');
                        }
                    } : {}
                }
            }
        }
    });
}

Doughnut Chart

function createDoughnutChart(canvasId, labels, data) {
    const ctx = document.getElementById(canvasId).getContext('2d');
    return new Chart(ctx, {
        type: 'doughnut',
        data: {
            labels: labels,
            datasets: [{
                data: data,
                backgroundColor: COLORS.map(c => c + 'CC'),
                borderColor: '#ffffff',
                borderWidth: 2,
            }]
        },
        options: {
            responsive: true,
            maintainAspectRatio: false,
            cutout: '60%',
            plugins: {
                legend: {
                    position: 'right',
                    labels: { usePointStyle: true, padding: 15 }
                },
                tooltip: {
                    callbacks: {
                        label: function(context) {
                            const total = context.dataset.data.reduce((a, b) => a + b, 0);
                            const pct = ((context.parsed / total) * 100).toFixed(1);
                            return `${context.label}: ${formatValue(context.parsed, 'number')} (${pct}%)`;
                        }
                    }
                }
            }
        }
    });
}

Updating Charts on Filter Change

function updateChart(chart, newLabels, newData) {
    chart.data.labels = newLabels;

    if (Array.isArray(newData[0])) {
        // Multiple datasets
        newData.forEach((data, i) => {
            chart.data.datasets[i].data = data;
        });
    } else {
        chart.data.datasets[0].data = newData;
    }

    chart.update('none'); // 'none' disables animation for instant update
}

Filter and Interactivity Implementation

Dropdown Filter

<div class="filter-group">
    <label for="filter-region">Region</label>
    <select id="filter-region" onchange="dashboard.applyFilters()">
        <option value="all">All Regions</option>
    </select>
</div>
function populateFilter(selectId, data, field) {
    const select = document.getElementById(selectId);
    const values = [...new Set(data.map(d => d[field]))].sort();

    // Keep the "All" option, add unique values
    values.forEach(val => {
        const option = document.createElement('option');
        option.value = val;
        option.textContent = val;
        select.appendChild(option);
    });
}

function getFilterValue(selectId) {
    const val = document.getElementById(selectId).value;
    return val === 'all' ? null : val;
}

Date Range Filter

<div class="filter-group">
    <label>Date Range</label>
    <input type="date" id="filter-date-start" onchange="dashboard.applyFilters()">
    <span>to</span>
    <input type="date" id="filter-date-end" onchange="dashboard.applyFilters()">
</div>
function filterByDateRange(data, dateField, startDate, endDate) {
    return data.filter(row => {
        const rowDate = new Date(row[dateField]);
        if (startDate && rowDate < new Date(startDate)) return false;
        if (endDate && rowDate > new Date(endDate)) return false;
        return true;
    });
}

Combined Filter Logic

applyFilters() {
    const region = getFilterValue('filter-region');
    const category = getFilterValue('filter-category');
    const startDate = document.getElementById('filter-date-start').value;
    const endDate = document.getElementById('filter-date-end').value;

    this.filteredData = this.rawData.filter(row => {
        if (region && row.region !== region) return false;
        if (category && row.category !== category) return false;
        if (startDate && row.date < startDate) return false;
        if (endDate && row.date > endDate) return false;
        return true;
    });

    this.renderKPIs();
    this.updateCharts();
    this.renderTable();
}

Sortable Table

function renderTable(containerId, data, columns) {
    const container = document.getElementById(containerId);
    let sortCol = null;
    let sortDir = 'desc';

    function render(sortedData) {
        let html = '<table class="data-table">';

        // Header
        html += '<thead><tr>';
        columns.forEach(col => {
            const arrow = sortCol === col.field
                ? (sortDir === 'asc' ? ' ▲' : ' ▼')
                : '';
            html += `<th onclick="sortTable('${col.field}')" style="cursor:pointer">${col.label}${arrow}</th>`;
        });
        html += '</tr></thead>';

        // Body
        html += '<tbody>';
        sortedData.forEach(row => {
            html += '<tr>';
            columns.forEach(col => {
                const value = col.format ? formatValue(row[col.field], col.format) : row[col.field];
                html += `<td>${value}</td>`;
            });
            html += '</tr>';
        });
        html += '</tbody></table>';

        container.innerHTML = html;
    }

    window.sortTable = function(field) {
        if (sortCol === field) {
            sortDir = sortDir === 'asc' ? 'desc' : 'asc';
        } else {
            sortCol = field;
            sortDir = 'desc';
        }
        const sorted = [...data].sort((a, b) => {
            const aVal = a[field], bVal = b[field];
            const cmp = aVal < bVal ? -1 : aVal > bVal ? 1 : 0;
            return sortDir === 'asc' ? cmp : -cmp;
        });
        render(sorted);
    };

    render(data);
}

CSS Styling for Dashboards

Color System

:root {
    /* Background layers */
    --bg-primary: #f8f9fa;
    --bg-card: #ffffff;
    --bg-header: #1a1a2e;

    /* Text */
    --text-primary: #212529;
    --text-secondary: #6c757d;
    --text-on-dark: #ffffff;

    /* Accent colors for data */
    --color-1: #4C72B0;
    --color-2: #DD8452;
    --color-3: #55A868;
    --color-4: #C44E52;
    --color-5: #8172B3;
    --color-6: #937860;

    /* Status colors */
    --positive: #28a745;
    --negative: #dc3545;
    --neutral: #6c757d;

    /* Spacing */
    --gap: 16px;
    --radius: 8px;
}

Layout

* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

body {
    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
    background: var(--bg-primary);
    color: var(--text-primary);
    line-height: 1.5;
}

.dashboard-container {
    max-width: 1400px;
    margin: 0 auto;
    padding: var(--gap);
}

.dashboard-header {
    background: var(--bg-header);
    color: var(--text-on-dark);
    padding: 20px 24px;
    border-radius: var(--radius);
    margin-bottom: var(--gap);
    display: flex;
    justify-content: space-between;
    align-items: center;
    flex-wrap: wrap;
    gap: 12px;
}

.dashboard-header h1 {
    font-size: 20px;
    font-weight: 600;
}

KPI Cards

.kpi-row {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
    gap: var(--gap);
    margin-bottom: var(--gap);
}

.kpi-card {
    background: var(--bg-card);
    border-radius: var(--radius);
    padding: 20px 24px;
    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);
}

.kpi-label {
    font-size: 13px;
    color: var(--text-secondary);
    text-transform: uppercase;
    letter-spacing: 0.5px;
    margin-bottom: 4px;
}

.kpi-value {
    font-size: 28px;
    font-weight: 700;
    color: var(--text-primary);
    margin-bottom: 4px;
}

.kpi-change {
    font-size: 13px;
    font-weight: 500;
}

.kpi-change.positive { color: var(--positive); }
.kpi-change.negative { color: var(--negative); }

Chart Containers

.chart-row {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
    gap: var(--gap);
    margin-bottom: var(--gap);
}

.chart-container {
    background: var(--bg-card);
    border-radius: var(--radius);
    padding: 20px 24px;
    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);
}

.chart-container h3 {
    font-size: 14px;
    font-weight: 600;
    color: var(--text-primary);
    margin-bottom: 16px;
}

.chart-container canvas {
    max-height: 300px;
}

Filters

.filters {
    display: flex;
    gap: 12px;
    align-items: center;
    flex-wrap: wrap;
}

.filter-group {
    display: flex;
    align-items: center;
    gap: 6px;
}

.filter-group label {
    font-size: 12px;
    color: rgba(255, 255, 255, 0.7);
}

.filter-group select,
.filter-group input[type="date"] {
    padding: 6px 10px;
    border: 1px solid rgba(255, 255, 255, 0.2);
    border-radius: 4px;
    background: rgba(255, 255, 255, 0.1);
    color: var(--text-on-dark);
    font-size: 13px;
}

.filter-group select option {
    background: var(--bg-header);
    color: var(--text-on-dark);
}

Data Table

.table-section {
    background: var(--bg-card);
    border-radius: var(--radius);
    padding: 20px 24px;
    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);
    overflow-x: auto;
}

.data-table {
    width: 100%;
    border-collapse: collapse;
    font-size: 13px;
}

.data-table thead th {
    text-align: left;
    padding: 10px 12px;
    border-bottom: 2px solid #dee2e6;
    color: var(--text-secondary);
    font-weight: 600;
    font-size: 12px;
    text-transform: uppercase;
    letter-spacing: 0.5px;
    white-space: nowrap;
    user-select: none;
}

.data-table thead th:hover {
    color: var(--text-primary);
    background: #f8f9fa;
}

.data-table tbody td {
    padding: 10px 12px;
    border-bottom: 1px solid #f0f0f0;
}

.data-table tbody tr:hover {
    background: #f8f9fa;
}

.data-table tbody tr:last-child td {
    border-bottom: none;
}

Responsive Design

@media (max-width: 768px) {
    .dashboard-header {
        flex-direction: column;
        align-items: flex-start;
    }

    .kpi-row {
        grid-template-columns: repeat(2, 1fr);
    }

    .chart-row {
        grid-template-columns: 1fr;
    }

    .filters {
        flex-direction: column;
        align-items: flex-start;
    }
}

@media print {
    body { background: white; }
    .dashboard-container { max-width: none; }
    .filters { display: none; }
    .chart-container { break-inside: avoid; }
    .kpi-card { border: 1px solid #dee2e6; box-shadow: none; }
}

Performance Considerations for Large Datasets

Data Size Guidelines

Data Size Approach
<1,000 rows Embed directly in HTML. Full interactivity.
1,000 - 10,000 rows Embed in HTML. May need to pre-aggregate for charts.
10,000 - 100,000 rows Pre-aggregate server-side. Embed only aggregated data.
>100,000 rows Not suitable for client-side dashboard. Use a BI tool or paginate.

Pre-Aggregation Pattern

Instead of embedding raw data and aggregating in the browser:

// DON'T: embed 50,000 raw rows
const RAW_DATA = [/* 50,000 rows */];

// DO: pre-aggregate before embedding
const CHART_DATA = {
    monthly_revenue: [
        { month: '2024-01', revenue: 150000, orders: 1200 },
        { month: '2024-02', revenue: 165000, orders: 1350 },
        // ... 12 rows instead of 50,000
    ],
    top_products: [
        { product: 'Widget A', revenue: 45000 },
        // ... 10 rows
    ],
    kpis: {
        total_revenue: 1980000,
        total_orders: 15600,
        avg_order_value: 127,
    }
};

Chart Performance

  • Limit line charts to <500 data points per series (downsample if needed)
  • Limit bar charts to <50 categories
  • For scatter plots, cap at 1,000 points (use sampling for larger datasets)
  • Disable animations for dashboards with many charts: animation: false in Chart.js options
  • Use Chart.update('none') instead of Chart.update() for filter-triggered updates

DOM Performance

  • Limit data tables to 100-200 visible rows. Add pagination for more.
  • Use requestAnimationFrame for coordinated chart updates
  • Avoid rebuilding the entire DOM on filter change -- update only changed elements
// Efficient table pagination
function renderTablePage(data, page, pageSize = 50) {
    const start = page * pageSize;
    const end = Math.min(start + pageSize, data.length);
    const pageData = data.slice(start, end);
    // Render only pageData
    // Show pagination controls: "Showing 1-50 of 2,340"
}

Examples

/build-dashboard Monthly sales dashboard with revenue trend, top products, and regional breakdown. Data is in the orders table.
/build-dashboard Here's our support ticket data [pastes CSV]. Build a dashboard showing volume by priority, response time trends, and resolution rates.
/build-dashboard Create a template executive dashboard for a SaaS company showing MRR, churn, new customers, and NPS. Use sample data.

Tips

  • Dashboards are fully self-contained HTML files -- share them with anyone by sending the file
  • For real-time dashboards, consider connecting to a BI tool instead. These dashboards are point-in-time snapshots
  • Request "dark mode" or "presentation mode" for different styling
  • You can request a specific color scheme to match your brand
用于生成高质量数据可视化图表。支持从查询结果、文件或对话历史中获取数据,自动推荐最佳图表类型,并使用Matplotlib/Seaborn或Plotly编写Python代码,输出清晰、专业且格式规范的静态或交互式图表。
将查询结果或DataFrame转换为图表 为趋势或比较选择正确的图表类型 为报告或演示生成绘图 需要带有悬停和缩放功能的交互式图表
data/skills/create-viz/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill create-viz -g -y
SKILL.md
Frontmatter
{
    "name": "create-viz",
    "description": "Create publication-quality visualizations with Python. Use when turning query results or a DataFrame into a chart, selecting the right chart type for a trend or comparison, generating a plot for a report or presentation, or needing an interactive chart with hover and zoom.",
    "argument-hint": "<data source> [chart type]"
}

/create-viz - Create Visualizations

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Create publication-quality data visualizations using Python. Generates charts from data with best practices for clarity, accuracy, and design.

Usage

/create-viz <data source> [chart type] [additional instructions]

Workflow

1. Understand the Request

Determine:

  • Data source: Query results, pasted data, CSV/Excel file, or data to be queried
  • Chart type: Explicitly requested or needs to be recommended
  • Purpose: Exploration, presentation, report, dashboard component
  • Audience: Technical team, executives, external stakeholders

2. Get the Data

If data warehouse is connected and data needs querying:

  1. Write and execute the query
  2. Load results into a pandas DataFrame

If data is pasted or uploaded:

  1. Parse the data into a pandas DataFrame
  2. Clean and prepare as needed (type conversions, null handling)

If data is from a previous analysis in the conversation:

  1. Reference the existing data

3. Select Chart Type

If the user didn't specify a chart type, recommend one based on the data and question:

Data Relationship Recommended Chart
Trend over time Line chart
Comparison across categories Bar chart (horizontal if many categories)
Part-to-whole composition Stacked bar or area chart (avoid pie charts unless <6 categories)
Distribution of values Histogram or box plot
Correlation between two variables Scatter plot
Two-variable comparison over time Dual-axis line or grouped bar
Geographic data Choropleth map
Ranking Horizontal bar chart
Flow or process Sankey diagram
Matrix of relationships Heatmap

Explain the recommendation briefly if the user didn't specify.

4. Generate the Visualization

Write Python code using one of these libraries based on the need:

  • matplotlib + seaborn: Best for static, publication-quality charts. Default choice.
  • plotly: Best for interactive charts or when the user requests interactivity.

Code requirements:

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd

# Set professional style
plt.style.use('seaborn-v0_8-whitegrid')
sns.set_palette("husl")

# Create figure with appropriate size
fig, ax = plt.subplots(figsize=(10, 6))

# [chart-specific code]

# Always include:
ax.set_title('Clear, Descriptive Title', fontsize=14, fontweight='bold')
ax.set_xlabel('X-Axis Label', fontsize=11)
ax.set_ylabel('Y-Axis Label', fontsize=11)

# Format numbers appropriately
# - Percentages: '45.2%' not '0.452'
# - Currency: '$1.2M' not '1200000'
# - Large numbers: '2.3K' or '1.5M' not '2300' or '1500000'

# Remove chart junk
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)

plt.tight_layout()
plt.savefig('chart_name.png', dpi=150, bbox_inches='tight')
plt.show()

5. Apply Design Best Practices

Color:

  • Use a consistent, colorblind-friendly palette
  • Use color meaningfully (not decoratively)
  • Highlight the key data point or trend with a contrasting color
  • Grey out less important reference data

Typography:

  • Descriptive title that states the insight, not just the metric (e.g., "Revenue grew 23% YoY" not "Revenue by Month")
  • Readable axis labels (not rotated 90 degrees if avoidable)
  • Data labels on key points when they add clarity

Layout:

  • Appropriate whitespace and margins
  • Legend placement that doesn't obscure data
  • Sorted categories by value (not alphabetically) unless there's a natural order

Accuracy:

  • Y-axis starts at zero for bar charts
  • No misleading axis breaks without clear notation
  • Consistent scales when comparing panels
  • Appropriate precision (don't show 10 decimal places)

6. Save and Present

  1. Save the chart as a PNG file with descriptive name
  2. Display the chart to the user
  3. Provide the code used so they can modify it
  4. Suggest variations (different chart type, different grouping, zoomed time range)

Examples

/create-viz Show monthly revenue for the last 12 months as a line chart with the trend highlighted
/create-viz Here's our NPS data by product: [pastes data]. Create a horizontal bar chart ranking products by score.
/create-viz Query the orders table and create a heatmap of order volume by day-of-week and hour

Tips

  • If you want interactive charts (hover, zoom, filter), mention "interactive" and Claude will use plotly
  • Specify "presentation" if you need larger fonts and higher contrast
  • You can request multiple charts at once (e.g., "create a 2x2 grid of charts showing...")
  • Charts are saved to your current directory as PNG files
提供基于Python的数据可视化指南,涵盖图表选择策略、代码模板及设计原则。用于生成高质量图表、解决选型困惑、应用无障碍设计及避免常见视觉误区。
需要选择合适的图表类型展示数据关系 使用Python生成Matplotlib或Seaborn可视化代码 咨询数据可视化的设计原则与可访问性建议
data/skills/data-visualization/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill data-visualization -g -y
SKILL.md
Frontmatter
{
    "name": "data-visualization",
    "description": "Create effective data visualizations with Python (matplotlib, seaborn, plotly). Use when building charts, choosing the right chart type for a dataset, creating publication-quality figures, or applying design principles like accessibility and color theory.",
    "user-invocable": false
}

Data Visualization Skill

Chart selection guidance, Python visualization code patterns, design principles, and accessibility considerations for creating effective data visualizations.

Chart Selection Guide

Choose by Data Relationship

What You're Showing Best Chart Alternatives
Trend over time Line chart Area chart (if showing cumulative or composition)
Comparison across categories Vertical bar chart Horizontal bar (many categories), lollipop chart
Ranking Horizontal bar chart Dot plot, slope chart (comparing two periods)
Part-to-whole composition Stacked bar chart Treemap (hierarchical), waffle chart
Composition over time Stacked area chart 100% stacked bar (for proportion focus)
Distribution Histogram Box plot (comparing groups), violin plot, strip plot
Correlation (2 variables) Scatter plot Bubble chart (add 3rd variable as size)
Correlation (many variables) Heatmap (correlation matrix) Pair plot
Geographic patterns Choropleth map Bubble map, hex map
Flow / process Sankey diagram Funnel chart (sequential stages)
Relationship network Network graph Chord diagram
Performance vs. target Bullet chart Gauge (single KPI only)
Multiple KPIs at once Small multiples Dashboard with separate charts

When NOT to Use Certain Charts

  • Pie charts: Avoid unless <6 categories and exact proportions matter less than rough comparison. Humans are bad at comparing angles. Use bar charts instead.
  • 3D charts: Never. They distort perception and add no information.
  • Dual-axis charts: Use cautiously. They can mislead by implying correlation. Clearly label both axes if used.
  • Stacked bar (many categories): Hard to compare middle segments. Use small multiples or grouped bars instead.
  • Donut charts: Slightly better than pie charts but same fundamental issues. Use for single KPI display at most.

Python Visualization Code Patterns

Setup and Style

import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
import seaborn as sns
import pandas as pd
import numpy as np

# Professional style setup
plt.style.use('seaborn-v0_8-whitegrid')
plt.rcParams.update({
    'figure.figsize': (10, 6),
    'figure.dpi': 150,
    'font.size': 11,
    'axes.titlesize': 14,
    'axes.titleweight': 'bold',
    'axes.labelsize': 11,
    'xtick.labelsize': 10,
    'ytick.labelsize': 10,
    'legend.fontsize': 10,
    'figure.titlesize': 16,
})

# Colorblind-friendly palettes
PALETTE_CATEGORICAL = ['#4C72B0', '#DD8452', '#55A868', '#C44E52', '#8172B3', '#937860']
PALETTE_SEQUENTIAL = 'YlOrRd'
PALETTE_DIVERGING = 'RdBu_r'

Line Chart (Time Series)

fig, ax = plt.subplots(figsize=(10, 6))

for label, group in df.groupby('category'):
    ax.plot(group['date'], group['value'], label=label, linewidth=2)

ax.set_title('Metric Trend by Category', fontweight='bold')
ax.set_xlabel('Date')
ax.set_ylabel('Value')
ax.legend(loc='upper left', frameon=True)
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)

# Format dates on x-axis
fig.autofmt_xdate()

plt.tight_layout()
plt.savefig('trend_chart.png', dpi=150, bbox_inches='tight')

Bar Chart (Comparison)

fig, ax = plt.subplots(figsize=(10, 6))

# Sort by value for easy reading
df_sorted = df.sort_values('metric', ascending=True)

bars = ax.barh(df_sorted['category'], df_sorted['metric'], color=PALETTE_CATEGORICAL[0])

# Add value labels
for bar in bars:
    width = bar.get_width()
    ax.text(width + 0.5, bar.get_y() + bar.get_height()/2,
            f'{width:,.0f}', ha='left', va='center', fontsize=10)

ax.set_title('Metric by Category (Ranked)', fontweight='bold')
ax.set_xlabel('Metric Value')
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)

plt.tight_layout()
plt.savefig('bar_chart.png', dpi=150, bbox_inches='tight')

Histogram (Distribution)

fig, ax = plt.subplots(figsize=(10, 6))

ax.hist(df['value'], bins=30, color=PALETTE_CATEGORICAL[0], edgecolor='white', alpha=0.8)

# Add mean and median lines
mean_val = df['value'].mean()
median_val = df['value'].median()
ax.axvline(mean_val, color='red', linestyle='--', linewidth=1.5, label=f'Mean: {mean_val:,.1f}')
ax.axvline(median_val, color='green', linestyle='--', linewidth=1.5, label=f'Median: {median_val:,.1f}')

ax.set_title('Distribution of Values', fontweight='bold')
ax.set_xlabel('Value')
ax.set_ylabel('Frequency')
ax.legend()
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)

plt.tight_layout()
plt.savefig('histogram.png', dpi=150, bbox_inches='tight')

Heatmap

fig, ax = plt.subplots(figsize=(10, 8))

# Pivot data for heatmap format
pivot = df.pivot_table(index='row_dim', columns='col_dim', values='metric', aggfunc='sum')

sns.heatmap(pivot, annot=True, fmt=',.0f', cmap='YlOrRd',
            linewidths=0.5, ax=ax, cbar_kws={'label': 'Metric Value'})

ax.set_title('Metric by Row Dimension and Column Dimension', fontweight='bold')
ax.set_xlabel('Column Dimension')
ax.set_ylabel('Row Dimension')

plt.tight_layout()
plt.savefig('heatmap.png', dpi=150, bbox_inches='tight')

Small Multiples

categories = df['category'].unique()
n_cats = len(categories)
n_cols = min(3, n_cats)
n_rows = (n_cats + n_cols - 1) // n_cols

fig, axes = plt.subplots(n_rows, n_cols, figsize=(5*n_cols, 4*n_rows), sharex=True, sharey=True)
axes = axes.flatten() if n_cats > 1 else [axes]

for i, cat in enumerate(categories):
    ax = axes[i]
    subset = df[df['category'] == cat]
    ax.plot(subset['date'], subset['value'], color=PALETTE_CATEGORICAL[i % len(PALETTE_CATEGORICAL)])
    ax.set_title(cat, fontsize=12)
    ax.spines['top'].set_visible(False)
    ax.spines['right'].set_visible(False)

# Hide empty subplots
for j in range(i+1, len(axes)):
    axes[j].set_visible(False)

fig.suptitle('Trends by Category', fontsize=14, fontweight='bold', y=1.02)
plt.tight_layout()
plt.savefig('small_multiples.png', dpi=150, bbox_inches='tight')

Number Formatting Helpers

def format_number(val, format_type='number'):
    """Format numbers for chart labels."""
    if format_type == 'currency':
        if abs(val) >= 1e9:
            return f'${val/1e9:.1f}B'
        elif abs(val) >= 1e6:
            return f'${val/1e6:.1f}M'
        elif abs(val) >= 1e3:
            return f'${val/1e3:.1f}K'
        else:
            return f'${val:,.0f}'
    elif format_type == 'percent':
        return f'{val:.1f}%'
    elif format_type == 'number':
        if abs(val) >= 1e9:
            return f'{val/1e9:.1f}B'
        elif abs(val) >= 1e6:
            return f'{val/1e6:.1f}M'
        elif abs(val) >= 1e3:
            return f'{val/1e3:.1f}K'
        else:
            return f'{val:,.0f}'
    return str(val)

# Usage with axis formatter
ax.yaxis.set_major_formatter(mticker.FuncFormatter(lambda x, p: format_number(x, 'currency')))

Interactive Charts with Plotly

import plotly.express as px
import plotly.graph_objects as go

# Simple interactive line chart
fig = px.line(df, x='date', y='value', color='category',
              title='Interactive Metric Trend',
              labels={'value': 'Metric Value', 'date': 'Date'})
fig.update_layout(hovermode='x unified')
fig.write_html('interactive_chart.html')
fig.show()

# Interactive scatter with hover data
fig = px.scatter(df, x='metric_a', y='metric_b', color='category',
                 size='size_metric', hover_data=['name', 'detail_field'],
                 title='Correlation Analysis')
fig.show()

Design Principles

Color

  • Use color purposefully: Color should encode data, not decorate
  • Highlight the story: Use a bright accent color for the key insight; grey everything else
  • Sequential data: Use a single-hue gradient (light to dark) for ordered values
  • Diverging data: Use a two-hue gradient with neutral midpoint for data with a meaningful center
  • Categorical data: Use distinct hues, maximum 6-8 before it gets confusing
  • Avoid red/green only: 8% of men are red-green colorblind. Use blue/orange as primary pair

Typography

  • Title states the insight: "Revenue grew 23% YoY" beats "Revenue by Month"
  • Subtitle adds context: Date range, filters applied, data source
  • Axis labels are readable: Never rotated 90 degrees if avoidable. Shorten or wrap instead
  • Data labels add precision: Use on key points, not every single bar
  • Annotation highlights: Call out specific points with text annotations

Layout

  • Reduce chart junk: Remove gridlines, borders, backgrounds that don't carry information
  • Sort meaningfully: Categories sorted by value (not alphabetically) unless there's a natural order (months, stages)
  • Appropriate aspect ratio: Time series wider than tall (3:1 to 2:1); comparisons can be squarer
  • White space is good: Don't cram charts together. Give each visualization room to breathe

Accuracy

  • Bar charts start at zero: Always. A bar from 95 to 100 exaggerates a 5% difference
  • Line charts can have non-zero baselines: When the range of variation is meaningful
  • Consistent scales across panels: When comparing multiple charts, use the same axis range
  • Show uncertainty: Error bars, confidence intervals, or ranges when data is uncertain
  • Label your axes: Never make the reader guess what the numbers mean

Accessibility Considerations

Color Blindness

  • Never rely on color alone to distinguish data series
  • Add pattern fills, different line styles (solid, dashed, dotted), or direct labels
  • Test with a colorblind simulator (e.g., Coblis, Sim Daltonism)
  • Use the colorblind-friendly palette: sns.color_palette("colorblind")

Screen Readers

  • Include alt text describing the chart's key finding
  • Provide a data table alternative alongside the visualization
  • Use semantic titles and labels

General Accessibility

  • Sufficient contrast between data elements and background
  • Text size minimum 10pt for labels, 12pt for titles
  • Avoid conveying information only through spatial position (add labels)
  • Consider printing: does the chart work in black and white?

Accessibility Checklist

Before sharing a visualization:

  • Chart works without color (patterns, labels, or line styles differentiate series)
  • Text is readable at standard zoom level
  • Title describes the insight, not just the data
  • Axes are labeled with units
  • Legend is clear and positioned without obscuring data
  • Data source and date range are noted
用于分析数据集结构、质量和分布。通过检查空值率、列类型分类及统计指标,识别重复项或异常值,帮助理解数据全貌并为后续分析选择维度与指标。
遇到新表或文件时 检查空值率和列分布时 发现数据质量问题如重复或可疑值时 决定分析维度和指标前
data/skills/explore-data/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill explore-data -g -y
SKILL.md
Frontmatter
{
    "name": "explore-data",
    "description": "Profile and explore a dataset to understand its shape, quality, and patterns. Use when encountering a new table or file, checking null rates and column distributions, spotting data quality issues like duplicates or suspicious values, or deciding which dimensions and metrics to analyze.",
    "argument-hint": "<table or file>"
}

/explore-data - Profile and Explore a Dataset

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Generate a comprehensive data profile for a table or uploaded file. Understand its shape, quality, and patterns before diving into analysis.

Usage

/explore-data <table_name or file>

Workflow

1. Access the Data

If a data warehouse MCP server is connected:

  1. Resolve the table name (handle schema prefixes, suggest matches if ambiguous)
  2. Query table metadata: column names, types, descriptions if available
  3. Run profiling queries against the live data

If a file is provided (CSV, Excel, Parquet, JSON):

  1. Read the file and load into a working dataset
  2. Infer column types from the data

If neither:

  1. Ask the user to provide a table name (with their warehouse connected) or upload a file
  2. If they describe a table schema, provide guidance on what profiling queries to run

2. Understand Structure

Before analyzing any data, understand its structure:

Table-level questions:

  • How many rows and columns?
  • What is the grain (one row per what)?
  • What is the primary key? Is it unique?
  • When was the data last updated?
  • How far back does the data go?

Column classification — categorize each column as one of:

  • Identifier: Unique keys, foreign keys, entity IDs
  • Dimension: Categorical attributes for grouping/filtering (status, type, region, category)
  • Metric: Quantitative values for measurement (revenue, count, duration, score)
  • Temporal: Dates and timestamps (created_at, updated_at, event_date)
  • Text: Free-form text fields (description, notes, name)
  • Boolean: True/false flags
  • Structural: JSON, arrays, nested structures

3. Generate Data Profile

Run the following profiling checks:

Table-level metrics:

  • Total row count
  • Column count and types breakdown
  • Approximate table size (if available from metadata)
  • Date range coverage (min/max of date columns)

All columns:

  • Null count and null rate
  • Distinct count and cardinality ratio (distinct / total)
  • Most common values (top 5-10 with frequencies)
  • Least common values (bottom 5 to spot anomalies)

Numeric columns (metrics):

min, max, mean, median (p50)
standard deviation
percentiles: p1, p5, p25, p75, p95, p99
zero count
negative count (if unexpected)

String columns (dimensions, text):

min length, max length, avg length
empty string count
pattern analysis (do values follow a format?)
case consistency (all upper, all lower, mixed?)
leading/trailing whitespace count

Date/timestamp columns:

min date, max date
null dates
future dates (if unexpected)
distribution by month/week
gaps in time series

Boolean columns:

true count, false count, null count
true rate

Present the profile as a clean summary table, grouped by column type (dimensions, metrics, dates, IDs).

4. Identify Data Quality Issues

Apply the quality assessment framework below. Flag potential problems:

  • High null rates: Columns with >5% nulls (warn), >20% nulls (alert)
  • Low cardinality surprises: Columns that should be high-cardinality but aren't (e.g., a "user_id" with only 50 distinct values)
  • High cardinality surprises: Columns that should be categorical but have too many distinct values
  • Suspicious values: Negative amounts where only positive expected, future dates in historical data, obviously placeholder values (e.g., "N/A", "TBD", "test", "999999")
  • Duplicate detection: Check if there's a natural key and whether it has duplicates
  • Distribution skew: Extremely skewed numeric distributions that could affect averages
  • Encoding issues: Mixed case in categorical fields, trailing whitespace, inconsistent formats

5. Discover Relationships and Patterns

After profiling individual columns:

  • Foreign key candidates: ID columns that might link to other tables
  • Hierarchies: Columns that form natural drill-down paths (country > state > city)
  • Correlations: Numeric columns that move together
  • Derived columns: Columns that appear to be computed from others
  • Redundant columns: Columns with identical or near-identical information

6. Suggest Interesting Dimensions and Metrics

Based on the column profile, recommend:

  • Best dimension columns for slicing data (categorical columns with reasonable cardinality, 3-50 values)
  • Key metric columns for measurement (numeric columns with meaningful distributions)
  • Time columns suitable for trend analysis
  • Natural groupings or hierarchies apparent in the data
  • Potential join keys linking to other tables (ID columns, foreign keys)

7. Recommend Follow-Up Analyses

Suggest 3-5 specific analyses the user could run next:

  • "Trend analysis on [metric] by [time_column] grouped by [dimension]"
  • "Distribution deep-dive on [skewed_column] to understand outliers"
  • "Data quality investigation on [problematic_column]"
  • "Correlation analysis between [metric_a] and [metric_b]"
  • "Cohort analysis using [date_column] and [status_column]"

Output Format

## Data Profile: [table_name]

### Overview
- Rows: 2,340,891
- Columns: 23 (8 dimensions, 6 metrics, 4 dates, 5 IDs)
- Date range: 2021-03-15 to 2024-01-22

### Column Details
[summary table]

### Data Quality Issues
[flagged issues with severity]

### Recommended Explorations
[numbered list of suggested follow-up analyses]

Quality Assessment Framework

Completeness Score

Rate each column:

  • Complete (>99% non-null): Green
  • Mostly complete (95-99%): Yellow -- investigate the nulls
  • Incomplete (80-95%): Orange -- understand why and whether it matters
  • Sparse (<80%): Red -- may not be usable without imputation

Consistency Checks

Look for:

  • Value format inconsistency: Same concept represented differently ("USA", "US", "United States", "us")
  • Type inconsistency: Numbers stored as strings, dates in various formats
  • Referential integrity: Foreign keys that don't match any parent record
  • Business rule violations: Negative quantities, end dates before start dates, percentages > 100
  • Cross-column consistency: Status = "completed" but completed_at is null

Accuracy Indicators

Red flags that suggest accuracy issues:

  • Placeholder values: 0, -1, 999999, "N/A", "TBD", "test", "xxx"
  • Default values: Suspiciously high frequency of a single value
  • Stale data: Updated_at shows no recent changes in an active system
  • Impossible values: Ages > 150, dates in the far future, negative durations
  • Round number bias: All values ending in 0 or 5 (suggests estimation, not measurement)

Timeliness Assessment

  • When was the table last updated?
  • What is the expected update frequency?
  • Is there a lag between event time and load time?
  • Are there gaps in the time series?

Pattern Discovery Techniques

Distribution Analysis

For numeric columns, characterize the distribution:

  • Normal: Mean and median are close, bell-shaped
  • Skewed right: Long tail of high values (common for revenue, session duration)
  • Skewed left: Long tail of low values (less common)
  • Bimodal: Two peaks (suggests two distinct populations)
  • Power law: Few very large values, many small ones (common for user activity)
  • Uniform: Roughly equal frequency across range (often synthetic or random)

Temporal Patterns

For time series data, look for:

  • Trend: Sustained upward or downward movement
  • Seasonality: Repeating patterns (weekly, monthly, quarterly, annual)
  • Day-of-week effects: Weekday vs. weekend differences
  • Holiday effects: Drops or spikes around known holidays
  • Change points: Sudden shifts in level or trend
  • Anomalies: Individual data points that break the pattern

Segmentation Discovery

Identify natural segments by:

  • Finding categorical columns with 3-20 distinct values
  • Comparing metric distributions across segment values
  • Looking for segments with significantly different behavior
  • Testing whether segments are homogeneous or contain sub-segments

Correlation Exploration

Between numeric columns:

  • Compute correlation matrix for all metric pairs
  • Flag strong correlations (|r| > 0.7) for investigation
  • Note: Correlation does not imply causation -- flag this explicitly
  • Check for non-linear relationships (e.g., quadratic, logarithmic)

Schema Understanding and Documentation

Schema Documentation Template

When documenting a dataset for team use:

## Table: [schema.table_name]

**Description**: [What this table represents]
**Grain**: [One row per...]
**Primary Key**: [column(s)]
**Row Count**: [approximate, with date]
**Update Frequency**: [real-time / hourly / daily / weekly]
**Owner**: [team or person responsible]

### Key Columns

| Column | Type | Description | Example Values | Notes |
|--------|------|-------------|----------------|-------|
| user_id | STRING | Unique user identifier | "usr_abc123" | FK to users.id |
| event_type | STRING | Type of event | "click", "view", "purchase" | 15 distinct values |
| revenue | DECIMAL | Transaction revenue in USD | 29.99, 149.00 | Null for non-purchase events |
| created_at | TIMESTAMP | When the event occurred | 2024-01-15 14:23:01 | Partitioned on this column |

### Relationships
- Joins to `users` on `user_id`
- Joins to `products` on `product_id`
- Parent of `event_details` (1:many on event_id)

### Known Issues
- [List any known data quality issues]
- [Note any gotchas for analysts]

### Common Query Patterns
- [Typical use cases for this table]

Schema Exploration Queries

When connected to a data warehouse, use these patterns to discover schema:

-- List all tables in a schema (PostgreSQL)
SELECT table_name, table_type
FROM information_schema.tables
WHERE table_schema = 'public'
ORDER BY table_name;

-- Column details (PostgreSQL)
SELECT column_name, data_type, is_nullable, column_default
FROM information_schema.columns
WHERE table_name = 'my_table'
ORDER BY ordinal_position;

-- Table sizes (PostgreSQL)
SELECT relname, pg_size_pretty(pg_total_relation_size(relid))
FROM pg_catalog.pg_statio_user_tables
ORDER BY pg_total_relation_size(relid) DESC;

-- Row counts for all tables (general pattern)
-- Run per-table: SELECT COUNT(*) FROM table_name

Lineage and Dependencies

When exploring an unfamiliar data environment:

  1. Start with the "output" tables (what reports or dashboards consume)
  2. Trace upstream: What tables feed into them?
  3. Identify raw/staging/mart layers
  4. Map the transformation chain from raw data to analytical tables
  5. Note where data is enriched, filtered, or aggregated

Tips

  • For very large tables (100M+ rows), profiling queries use sampling by default -- mention if you need exact counts
  • If exploring a new dataset for the first time, this command gives you the lay of the land before writing specific queries
  • The quality flags are heuristic -- not every flag is a real problem, but each is worth a quick look
用于编写跨主流数据仓库(Snowflake、BigQuery等)的正确、高性能SQL。涵盖方言差异、日期字符串处理、JSON操作及性能优化技巧,适用于查询编写、优化和翻译场景。
编写SQL查询 优化慢速SQL 在不同SQL方言间转换 构建包含CTE或窗口函数的复杂分析查询
data/skills/sql-queries/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill sql-queries -g -y
SKILL.md
Frontmatter
{
    "name": "sql-queries",
    "description": "Write correct, performant SQL across all major data warehouse dialects (Snowflake, BigQuery, Databricks, PostgreSQL, etc.). Use when writing queries, optimizing slow SQL, translating between dialects, or building complex analytical queries with CTEs, window functions, or aggregations.",
    "user-invocable": false
}

SQL Queries Skill

Write correct, performant, readable SQL across all major data warehouse dialects.

Dialect-Specific Reference

PostgreSQL (including Aurora, RDS, Supabase, Neon)

Date/time:

-- Current date/time
CURRENT_DATE, CURRENT_TIMESTAMP, NOW()

-- Date arithmetic
date_column + INTERVAL '7 days'
date_column - INTERVAL '1 month'

-- Truncate to period
DATE_TRUNC('month', created_at)

-- Extract parts
EXTRACT(YEAR FROM created_at)
EXTRACT(DOW FROM created_at)  -- 0=Sunday

-- Format
TO_CHAR(created_at, 'YYYY-MM-DD')

String functions:

-- Concatenation
first_name || ' ' || last_name
CONCAT(first_name, ' ', last_name)

-- Pattern matching
column ILIKE '%pattern%'  -- case-insensitive
column ~ '^regex_pattern$'  -- regex

-- String manipulation
LEFT(str, n), RIGHT(str, n)
SPLIT_PART(str, delimiter, position)
REGEXP_REPLACE(str, pattern, replacement)

Arrays and JSON:

-- JSON access
data->>'key'  -- text
data->'nested'->'key'  -- json
data#>>'{path,to,key}'  -- nested text

-- Array operations
ARRAY_AGG(column)
ANY(array_column)
array_column @> ARRAY['value']

Performance tips:

  • Use EXPLAIN ANALYZE to profile queries
  • Create indexes on frequently filtered/joined columns
  • Use EXISTS over IN for correlated subqueries
  • Partial indexes for common filter conditions
  • Use connection pooling for concurrent access

Snowflake

Date/time:

-- Current date/time
CURRENT_DATE(), CURRENT_TIMESTAMP(), SYSDATE()

-- Date arithmetic
DATEADD(day, 7, date_column)
DATEDIFF(day, start_date, end_date)

-- Truncate to period
DATE_TRUNC('month', created_at)

-- Extract parts
YEAR(created_at), MONTH(created_at), DAY(created_at)
DAYOFWEEK(created_at)

-- Format
TO_CHAR(created_at, 'YYYY-MM-DD')

String functions:

-- Case-insensitive by default (depends on collation)
column ILIKE '%pattern%'
REGEXP_LIKE(column, 'pattern')

-- Parse JSON
column:key::string  -- dot notation for VARIANT
PARSE_JSON('{"key": "value"}')
GET_PATH(variant_col, 'path.to.key')

-- Flatten arrays/objects
SELECT f.value FROM table, LATERAL FLATTEN(input => array_col) f

Semi-structured data:

-- VARIANT type access
data:customer:name::STRING
data:items[0]:price::NUMBER

-- Flatten nested structures
SELECT
    t.id,
    item.value:name::STRING as item_name,
    item.value:qty::NUMBER as quantity
FROM my_table t,
LATERAL FLATTEN(input => t.data:items) item

Performance tips:

  • Use clustering keys on large tables (not traditional indexes)
  • Filter on clustering key columns for partition pruning
  • Set appropriate warehouse size for query complexity
  • Use RESULT_SCAN(LAST_QUERY_ID()) to avoid re-running expensive queries
  • Use transient tables for staging/temp data

BigQuery (Google Cloud)

Date/time:

-- Current date/time
CURRENT_DATE(), CURRENT_TIMESTAMP()

-- Date arithmetic
DATE_ADD(date_column, INTERVAL 7 DAY)
DATE_SUB(date_column, INTERVAL 1 MONTH)
DATE_DIFF(end_date, start_date, DAY)
TIMESTAMP_DIFF(end_ts, start_ts, HOUR)

-- Truncate to period
DATE_TRUNC(created_at, MONTH)
TIMESTAMP_TRUNC(created_at, HOUR)

-- Extract parts
EXTRACT(YEAR FROM created_at)
EXTRACT(DAYOFWEEK FROM created_at)  -- 1=Sunday

-- Format
FORMAT_DATE('%Y-%m-%d', date_column)
FORMAT_TIMESTAMP('%Y-%m-%d %H:%M:%S', ts_column)

String functions:

-- No ILIKE, use LOWER()
LOWER(column) LIKE '%pattern%'
REGEXP_CONTAINS(column, r'pattern')
REGEXP_EXTRACT(column, r'pattern')

-- String manipulation
SPLIT(str, delimiter)  -- returns ARRAY
ARRAY_TO_STRING(array, delimiter)

Arrays and structs:

-- Array operations
ARRAY_AGG(column)
UNNEST(array_column)
ARRAY_LENGTH(array_column)
value IN UNNEST(array_column)

-- Struct access
struct_column.field_name

Performance tips:

  • Always filter on partition columns (usually date) to reduce bytes scanned
  • Use clustering for frequently filtered columns within partitions
  • Use APPROX_COUNT_DISTINCT() for large-scale cardinality estimates
  • Avoid SELECT * -- billing is per-byte scanned
  • Use DECLARE and SET for parameterized scripts
  • Preview query cost with dry run before executing large queries

Redshift (Amazon)

Date/time:

-- Current date/time
CURRENT_DATE, GETDATE(), SYSDATE

-- Date arithmetic
DATEADD(day, 7, date_column)
DATEDIFF(day, start_date, end_date)

-- Truncate to period
DATE_TRUNC('month', created_at)

-- Extract parts
EXTRACT(YEAR FROM created_at)
DATE_PART('dow', created_at)

String functions:

-- Case-insensitive
column ILIKE '%pattern%'
REGEXP_INSTR(column, 'pattern') > 0

-- String manipulation
SPLIT_PART(str, delimiter, position)
LISTAGG(column, ', ') WITHIN GROUP (ORDER BY column)

Performance tips:

  • Design distribution keys for collocated joins (DISTKEY)
  • Use sort keys for frequently filtered columns (SORTKEY)
  • Use EXPLAIN to check query plan
  • Avoid cross-node data movement (watch for DS_BCAST and DS_DIST)
  • ANALYZE and VACUUM regularly
  • Use late-binding views for schema flexibility

Databricks SQL

Date/time:

-- Current date/time
CURRENT_DATE(), CURRENT_TIMESTAMP()

-- Date arithmetic
DATE_ADD(date_column, 7)
DATEDIFF(end_date, start_date)
ADD_MONTHS(date_column, 1)

-- Truncate to period
DATE_TRUNC('MONTH', created_at)
TRUNC(date_column, 'MM')

-- Extract parts
YEAR(created_at), MONTH(created_at)
DAYOFWEEK(created_at)

Delta Lake features:

-- Time travel
SELECT * FROM my_table TIMESTAMP AS OF '2024-01-15'
SELECT * FROM my_table VERSION AS OF 42

-- Describe history
DESCRIBE HISTORY my_table

-- Merge (upsert)
MERGE INTO target USING source
ON target.id = source.id
WHEN MATCHED THEN UPDATE SET *
WHEN NOT MATCHED THEN INSERT *

Performance tips:

  • Use Delta Lake's OPTIMIZE and ZORDER for query performance
  • Leverage Photon engine for compute-intensive queries
  • Use CACHE TABLE for frequently accessed datasets
  • Partition by low-cardinality date columns

Common SQL Patterns

Window Functions

-- Ranking
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_at DESC)
RANK() OVER (PARTITION BY category ORDER BY revenue DESC)
DENSE_RANK() OVER (ORDER BY score DESC)

-- Running totals / moving averages
SUM(revenue) OVER (ORDER BY date_col ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as running_total
AVG(revenue) OVER (ORDER BY date_col ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) as moving_avg_7d

-- Lag / Lead
LAG(value, 1) OVER (PARTITION BY entity ORDER BY date_col) as prev_value
LEAD(value, 1) OVER (PARTITION BY entity ORDER BY date_col) as next_value

-- First / Last value
FIRST_VALUE(status) OVER (PARTITION BY user_id ORDER BY created_at ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
LAST_VALUE(status) OVER (PARTITION BY user_id ORDER BY created_at ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)

-- Percent of total
revenue / SUM(revenue) OVER () as pct_of_total
revenue / SUM(revenue) OVER (PARTITION BY category) as pct_of_category

CTEs for Readability

WITH
-- Step 1: Define the base population
base_users AS (
    SELECT user_id, created_at, plan_type
    FROM users
    WHERE created_at >= DATE '2024-01-01'
      AND status = 'active'
),

-- Step 2: Calculate user-level metrics
user_metrics AS (
    SELECT
        u.user_id,
        u.plan_type,
        COUNT(DISTINCT e.session_id) as session_count,
        SUM(e.revenue) as total_revenue
    FROM base_users u
    LEFT JOIN events e ON u.user_id = e.user_id
    GROUP BY u.user_id, u.plan_type
),

-- Step 3: Aggregate to summary level
summary AS (
    SELECT
        plan_type,
        COUNT(*) as user_count,
        AVG(session_count) as avg_sessions,
        SUM(total_revenue) as total_revenue
    FROM user_metrics
    GROUP BY plan_type
)

SELECT * FROM summary ORDER BY total_revenue DESC;

Cohort Retention

WITH cohorts AS (
    SELECT
        user_id,
        DATE_TRUNC('month', first_activity_date) as cohort_month
    FROM users
),
activity AS (
    SELECT
        user_id,
        DATE_TRUNC('month', activity_date) as activity_month
    FROM user_activity
)
SELECT
    c.cohort_month,
    COUNT(DISTINCT c.user_id) as cohort_size,
    COUNT(DISTINCT CASE
        WHEN a.activity_month = c.cohort_month THEN a.user_id
    END) as month_0,
    COUNT(DISTINCT CASE
        WHEN a.activity_month = c.cohort_month + INTERVAL '1 month' THEN a.user_id
    END) as month_1,
    COUNT(DISTINCT CASE
        WHEN a.activity_month = c.cohort_month + INTERVAL '3 months' THEN a.user_id
    END) as month_3
FROM cohorts c
LEFT JOIN activity a ON c.user_id = a.user_id
GROUP BY c.cohort_month
ORDER BY c.cohort_month;

Funnel Analysis

WITH funnel AS (
    SELECT
        user_id,
        MAX(CASE WHEN event = 'page_view' THEN 1 ELSE 0 END) as step_1_view,
        MAX(CASE WHEN event = 'signup_start' THEN 1 ELSE 0 END) as step_2_start,
        MAX(CASE WHEN event = 'signup_complete' THEN 1 ELSE 0 END) as step_3_complete,
        MAX(CASE WHEN event = 'first_purchase' THEN 1 ELSE 0 END) as step_4_purchase
    FROM events
    WHERE event_date >= CURRENT_DATE - INTERVAL '30 days'
    GROUP BY user_id
)
SELECT
    COUNT(*) as total_users,
    SUM(step_1_view) as viewed,
    SUM(step_2_start) as started_signup,
    SUM(step_3_complete) as completed_signup,
    SUM(step_4_purchase) as purchased,
    ROUND(100.0 * SUM(step_2_start) / NULLIF(SUM(step_1_view), 0), 1) as view_to_start_pct,
    ROUND(100.0 * SUM(step_3_complete) / NULLIF(SUM(step_2_start), 0), 1) as start_to_complete_pct,
    ROUND(100.0 * SUM(step_4_purchase) / NULLIF(SUM(step_3_complete), 0), 1) as complete_to_purchase_pct
FROM funnel;

Deduplication

-- Keep the most recent record per key
WITH ranked AS (
    SELECT
        *,
        ROW_NUMBER() OVER (
            PARTITION BY entity_id
            ORDER BY updated_at DESC
        ) as rn
    FROM source_table
)
SELECT * FROM ranked WHERE rn = 1;

Error Handling and Debugging

When a query fails:

  1. Syntax errors: Check for dialect-specific syntax (e.g., ILIKE not available in BigQuery, SAFE_DIVIDE only in BigQuery)
  2. Column not found: Verify column names against schema -- check for typos, case sensitivity (PostgreSQL is case-sensitive for quoted identifiers)
  3. Type mismatches: Cast explicitly when comparing different types (CAST(col AS DATE), col::DATE)
  4. Division by zero: Use NULLIF(denominator, 0) or dialect-specific safe division
  5. Ambiguous columns: Always qualify column names with table alias in JOINs
  6. Group by errors: All non-aggregated columns must be in GROUP BY (except in BigQuery which allows grouping by alias)
提供描述性统计、趋势分析、异常检测和假设检验指导。涵盖集中趋势与离散度选择、百分位解读及移动平均计算,助力数据分布分析与业务洞察。
需要计算或解释均值、中位数等集中趋势指标 分析数据分布形态、偏度或异常值 进行趋势识别、季节性检测或增长率计算 比较不同指标的变异程度
data/skills/statistical-analysis/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill statistical-analysis -g -y
SKILL.md
Frontmatter
{
    "name": "statistical-analysis",
    "description": "Apply statistical methods including descriptive stats, trend analysis, outlier detection, and hypothesis testing. Use when analyzing distributions, testing for significance, detecting anomalies, computing correlations, or interpreting statistical results.",
    "user-invocable": false
}

Statistical Analysis Skill

Descriptive statistics, trend analysis, outlier detection, hypothesis testing, and guidance on when to be cautious about statistical claims.

Descriptive Statistics Methodology

Central Tendency

Choose the right measure of center based on the data:

Situation Use Why
Symmetric distribution, no outliers Mean Most efficient estimator
Skewed distribution Median Robust to outliers
Categorical or ordinal data Mode Only option for non-numeric
Highly skewed with outliers (e.g., revenue per user) Median + mean Report both; the gap shows skew

Always report mean and median together for business metrics. If they diverge significantly, the data is skewed and the mean alone is misleading.

Spread and Variability

  • Standard deviation: How far values typically fall from the mean. Use with normally distributed data.
  • Interquartile range (IQR): Distance from p25 to p75. Robust to outliers. Use with skewed data.
  • Coefficient of variation (CV): StdDev / Mean. Use to compare variability across metrics with different scales.
  • Range: Max minus min. Sensitive to outliers but gives a quick sense of data extent.

Percentiles for Business Context

Report key percentiles to tell a richer story than mean alone:

p1:   Bottom 1% (floor / minimum typical value)
p5:   Low end of normal range
p25:  First quartile
p50:  Median (typical user)
p75:  Third quartile
p90:  Top 10% / power users
p95:  High end of normal range
p99:  Top 1% / extreme users

Example narrative: "The median session duration is 4.2 minutes, but the top 10% of users spend over 22 minutes per session, pulling the mean up to 7.8 minutes."

Describing Distributions

Characterize every numeric distribution you analyze:

  • Shape: Normal, right-skewed, left-skewed, bimodal, uniform, heavy-tailed
  • Center: Mean and median (and the gap between them)
  • Spread: Standard deviation or IQR
  • Outliers: How many and how extreme
  • Bounds: Is there a natural floor (zero) or ceiling (100%)?

Trend Analysis and Forecasting

Identifying Trends

Moving averages to smooth noise:

# 7-day moving average (good for daily data with weekly seasonality)
df['ma_7d'] = df['metric'].rolling(window=7, min_periods=1).mean()

# 28-day moving average (smooths weekly AND monthly patterns)
df['ma_28d'] = df['metric'].rolling(window=28, min_periods=1).mean()

Period-over-period comparison:

  • Week-over-week (WoW): Compare to same day last week
  • Month-over-month (MoM): Compare to same month prior
  • Year-over-year (YoY): Gold standard for seasonal businesses
  • Same-day-last-year: Compare specific calendar day

Growth rates:

Simple growth: (current - previous) / previous
CAGR: (ending / beginning) ^ (1 / years) - 1
Log growth: ln(current / previous)  -- better for volatile series

Seasonality Detection

Check for periodic patterns:

  1. Plot the raw time series -- visual inspection first
  2. Compute day-of-week averages: is there a clear weekly pattern?
  3. Compute month-of-year averages: is there an annual cycle?
  4. When comparing periods, always use YoY or same-period comparisons to avoid conflating trend with seasonality

Forecasting (Simple Methods)

For business analysts (not data scientists), use straightforward methods:

  • Naive forecast: Tomorrow = today. Use as a baseline.
  • Seasonal naive: Tomorrow = same day last week/year.
  • Linear trend: Fit a line to historical data. Only for clearly linear trends.
  • Moving average forecast: Use trailing average as the forecast.

Always communicate uncertainty. Provide a range, not a point estimate:

  • "We expect 10K-12K signups next month based on the 3-month trend"
  • NOT "We will get exactly 11,234 signups next month"

When to escalate to a data scientist: Non-linear trends, multiple seasonalities, external factors (marketing spend, holidays), or when forecast accuracy matters for resource allocation.

Outlier and Anomaly Detection

Statistical Methods

Z-score method (for normally distributed data):

z_scores = (df['value'] - df['value'].mean()) / df['value'].std()
outliers = df[abs(z_scores) > 3]  # More than 3 standard deviations

IQR method (robust to non-normal distributions):

Q1 = df['value'].quantile(0.25)
Q3 = df['value'].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
outliers = df[(df['value'] < lower_bound) | (df['value'] > upper_bound)]

Percentile method (simplest):

outliers = df[(df['value'] < df['value'].quantile(0.01)) |
              (df['value'] > df['value'].quantile(0.99))]

Handling Outliers

Do NOT automatically remove outliers. Instead:

  1. Investigate: Is this a data error, a genuine extreme value, or a different population?
  2. Data errors: Fix or remove (e.g., negative ages, timestamps in year 1970)
  3. Genuine extremes: Keep them but consider using robust statistics (median instead of mean)
  4. Different population: Segment them out for separate analysis (e.g., enterprise vs. SMB customers)

Report what you did: "We excluded 47 records (0.3%) with transaction amounts >$50K, which represent bulk enterprise orders analyzed separately."

Time Series Anomaly Detection

For detecting unusual values in a time series:

  1. Compute expected value (moving average or same-period-last-year)
  2. Compute deviation from expected
  3. Flag deviations beyond a threshold (typically 2-3 standard deviations of the residuals)
  4. Distinguish between point anomalies (single unusual value) and change points (sustained shift)

Hypothesis Testing Basics

When to Use

Use hypothesis testing when you need to determine whether an observed difference is likely real or could be due to random chance. Common scenarios:

  • A/B test results: Is variant B actually better than A?
  • Before/after comparison: Did the product change actually move the metric?
  • Segment comparison: Do enterprise customers really have higher retention?

The Framework

  1. Null hypothesis (H0): There is no difference (the default assumption)
  2. Alternative hypothesis (H1): There is a difference
  3. Choose significance level (alpha): Typically 0.05 (5% chance of false positive)
  4. Compute test statistic and p-value
  5. Interpret: If p < alpha, reject H0 (evidence of a real difference)

Common Tests

Scenario Test When to Use
Compare two group means t-test (independent) Normal data, two groups
Compare two group proportions z-test for proportions Conversion rates, binary outcomes
Compare paired measurements Paired t-test Before/after on same entities
Compare 3+ group means ANOVA Multiple segments or variants
Non-normal data, two groups Mann-Whitney U test Skewed metrics, ordinal data
Association between categories Chi-squared test Two categorical variables

Practical Significance vs. Statistical Significance

Statistical significance means the difference is unlikely due to chance.

Practical significance means the difference is large enough to matter for business decisions.

A difference can be statistically significant but practically meaningless (common with large samples). Always report:

  • Effect size: How big is the difference? (e.g., "Variant B improved conversion by 0.3 percentage points")
  • Confidence interval: What's the range of plausible true effects?
  • Business impact: What does this translate to in revenue, users, or other business terms?

Sample Size Considerations

  • Small samples produce unreliable results, even with significant p-values
  • Rule of thumb for proportions: Need at least 30 events per group for basic reliability
  • For detecting small effects (e.g., 1% conversion rate change), you may need thousands of observations per group
  • If your sample is small, say so: "With only 200 observations per group, we have limited power to detect effects smaller than X%"

When to Be Cautious About Statistical Claims

Correlation Is Not Causation

When you find a correlation, explicitly consider:

  • Reverse causation: Maybe B causes A, not A causes B
  • Confounding variables: Maybe C causes both A and B
  • Coincidence: With enough variables, spurious correlations are inevitable

What you can say: "Users who use feature X have 30% higher retention" What you cannot say without more evidence: "Feature X causes 30% higher retention"

Multiple Comparisons Problem

When you test many hypotheses, some will be "significant" by chance:

  • Testing 20 metrics at p=0.05 means ~1 will be falsely significant
  • If you looked at many segments before finding one that's different, note that
  • Adjust for multiple comparisons with Bonferroni correction (divide alpha by number of tests) or report how many tests were run

Simpson's Paradox

A trend in aggregated data can reverse when data is segmented:

  • Always check whether the conclusion holds across key segments
  • Example: Overall conversion goes up, but conversion goes down in every segment -- because the mix shifted toward a higher-converting segment

Survivorship Bias

You can only analyze entities that "survived" to be in your dataset:

  • Analyzing active users ignores those who churned
  • Analyzing successful companies ignores those that failed
  • Always ask: "Who is missing from this dataset, and would their inclusion change the conclusion?"

Ecological Fallacy

Aggregate trends may not apply to individuals:

  • "Countries with higher X have higher Y" does NOT mean "individuals with higher X have higher Y"
  • Be careful about applying group-level findings to individual cases

Anchoring on Specific Numbers

Be wary of false precision:

  • "Churn will be 4.73% next quarter" implies more certainty than is warranted
  • Prefer ranges: "We expect churn between 4-6% based on historical patterns"
  • Round appropriately: "About 5%" is often more honest than "4.73%"
在分享分析前进行质量审查,检查方法论、准确性及潜在偏差。适用于评审报告、验证SQL结果、核对计算逻辑及评估结论是否由数据支持,生成置信度评估和改进建议。
评审分析报告前的质量检查 验证SQL查询结果的正确性 核对计算和聚合逻辑 评估结论是否得到数据支持
data/skills/validate-data/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill validate-data -g -y
SKILL.md
Frontmatter
{
    "name": "validate-data",
    "description": "QA an analysis before sharing -- methodology, accuracy, and bias checks. Use when reviewing an analysis before a stakeholder presentation, spot-checking calculations and aggregation logic, verifying a SQL query's results look right, or assessing whether conclusions are actually supported by the data.",
    "argument-hint": "<analysis to review>"
}

/validate-data - Validate Analysis Before Sharing

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Review an analysis for accuracy, methodology, and potential biases before sharing with stakeholders. Generates a confidence assessment and improvement suggestions.

Usage

/validate-data <analysis to review>

The analysis can be:

  • A document or report in the conversation
  • A file (markdown, notebook, spreadsheet)
  • SQL queries and their results
  • Charts and their underlying data
  • A description of methodology and findings

Workflow

1. Review Methodology and Assumptions

Examine:

  • Question framing: Is the analysis answering the right question? Could the question be interpreted differently?
  • Data selection: Are the right tables/datasets being used? Is the time range appropriate?
  • Population definition: Is the analysis population correctly defined? Are there unintended exclusions?
  • Metric definitions: Are metrics defined clearly and consistently? Do they match how stakeholders understand them?
  • Baseline and comparison: Is the comparison fair? Are time periods, cohort sizes, and contexts comparable?

2. Run the Pre-Delivery QA Checklist

Work through the checklist below — data quality, calculation, reasonableness, and presentation checks.

3. Check for Common Analytical Pitfalls

Systematically review against the detailed pitfall catalog below (join explosion, survivorship bias, incomplete period comparison, denominator shifting, average of averages, timezone mismatches, selection bias).

4. Verify Calculations and Aggregations

Where possible, spot-check:

  • Recalculate a few key numbers independently
  • Verify that subtotals sum to totals
  • Check that percentages sum to 100% (or close to it) where expected
  • Confirm that YoY/MoM comparisons use the correct base periods
  • Validate that filters are applied consistently across all metrics

Apply the result sanity-checking techniques below (magnitude checks, cross-validation, red-flag detection).

5. Assess Visualizations

If the analysis includes charts:

  • Do axes start at appropriate values (zero for bar charts)?
  • Are scales consistent across comparison charts?
  • Do chart titles accurately describe what's shown?
  • Could the visualization mislead a quick reader?
  • Are there truncated axes, inconsistent intervals, or 3D effects that distort perception?

6. Evaluate Narrative and Conclusions

Review whether:

  • Conclusions are supported by the data shown
  • Alternative explanations are acknowledged
  • Uncertainty is communicated appropriately
  • Recommendations follow logically from findings
  • The level of confidence matches the strength of evidence

7. Suggest Improvements

Provide specific, actionable suggestions:

  • Additional analyses that would strengthen the conclusions
  • Caveats or limitations that should be noted
  • Better visualizations or framings for key points
  • Missing context that stakeholders would want

8. Generate Confidence Assessment

Rate the analysis on a 3-level scale:

Ready to share -- Analysis is methodologically sound, calculations verified, caveats noted. Minor suggestions for improvement but nothing blocking.

Share with noted caveats -- Analysis is largely correct but has specific limitations or assumptions that must be communicated to stakeholders. List the required caveats.

Needs revision -- Found specific errors, methodological issues, or missing analyses that should be addressed before sharing. List the required changes with priority order.

Output Format

## Validation Report

### Overall Assessment: [Ready to share | Share with caveats | Needs revision]

### Methodology Review
[Findings about approach, data selection, definitions]

### Issues Found
1. [Severity: High/Medium/Low] [Issue description and impact]
2. ...

### Calculation Spot-Checks
- [Metric]: [Verified / Discrepancy found]
- ...

### Visualization Review
[Any issues with charts or visual presentation]

### Suggested Improvements
1. [Improvement and why it matters]
2. ...

### Required Caveats for Stakeholders
- [Caveat that must be communicated]
- ...

Pre-Delivery QA Checklist

Run through this checklist before sharing any analysis with stakeholders.

Data Quality Checks

  • Source verification: Confirmed which tables/data sources were used. Are they the right ones for this question?
  • Freshness: Data is current enough for the analysis. Noted the "as of" date.
  • Completeness: No unexpected gaps in time series or missing segments.
  • Null handling: Checked null rates in key columns. Nulls are handled appropriately (excluded, imputed, or flagged).
  • Deduplication: Confirmed no double-counting from bad joins or duplicate source records.
  • Filter verification: All WHERE clauses and filters are correct. No unintended exclusions.

Calculation Checks

  • Aggregation logic: GROUP BY includes all non-aggregated columns. Aggregation level matches the analysis grain.
  • Denominator correctness: Rate and percentage calculations use the right denominator. Denominators are non-zero.
  • Date alignment: Comparisons use the same time period length. Partial periods are excluded or noted.
  • Join correctness: JOIN types are appropriate (INNER vs LEFT). Many-to-many joins haven't inflated counts.
  • Metric definitions: Metrics match how stakeholders define them. Any deviations are noted.
  • Subtotals sum: Parts add up to the whole where expected. If they don't, explain why (e.g., overlap).

Reasonableness Checks

  • Magnitude: Numbers are in a plausible range. Revenue isn't negative. Percentages are between 0-100%.
  • Trend continuity: No unexplained jumps or drops in time series.
  • Cross-reference: Key numbers match other known sources (dashboards, previous reports, finance data).
  • Order of magnitude: Total revenue is in the right ballpark. User counts match known figures.
  • Edge cases: What happens at the boundaries? Empty segments, zero-activity periods, new entities.

Presentation Checks

  • Chart accuracy: Bar charts start at zero. Axes are labeled. Scales are consistent across panels.
  • Number formatting: Appropriate precision. Consistent currency/percentage formatting. Thousands separators where needed.
  • Title clarity: Titles state the insight, not just the metric. Date ranges are specified.
  • Caveat transparency: Known limitations and assumptions are stated explicitly.
  • Reproducibility: Someone else could recreate this analysis from the documentation provided.

Common Data Analysis Pitfalls

Join Explosion

The problem: A many-to-many join silently multiplies rows, inflating counts and sums.

How to detect:

-- Check row count before and after join
SELECT COUNT(*) FROM table_a;  -- 1,000
SELECT COUNT(*) FROM table_a a JOIN table_b b ON a.id = b.a_id;  -- 3,500 (uh oh)

How to prevent:

  • Always check row counts after joins
  • If counts increase, investigate the join relationship (is it really 1:1 or 1:many?)
  • Use COUNT(DISTINCT a.id) instead of COUNT(*) when counting entities through joins

Survivorship Bias

The problem: Analyzing only entities that exist today, ignoring those that were deleted, churned, or failed.

Examples:

  • Analyzing user behavior of "current users" misses churned users
  • Looking at "companies using our product" ignores those who evaluated and left
  • Studying properties of "successful" outcomes without "unsuccessful" ones

How to prevent: Ask "who is NOT in this dataset?" before drawing conclusions.

Incomplete Period Comparison

The problem: Comparing a partial period to a full period.

Examples:

  • "January revenue is $500K vs. December's $800K" -- but January isn't over yet
  • "This week's signups are down" -- checked on Wednesday, comparing to a full prior week

How to prevent: Always filter to complete periods, or compare same-day-of-month / same-number-of-days.

Denominator Shifting

The problem: The denominator changes between periods, making rates incomparable.

Examples:

  • Conversion rate improves because you changed how you count "eligible" users
  • Churn rate changes because the definition of "active" was updated

How to prevent: Use consistent definitions across all compared periods. Note any definition changes.

Average of Averages

The problem: Averaging pre-computed averages gives wrong results when group sizes differ.

Example:

  • Group A: 100 users, average revenue $50
  • Group B: 10 users, average revenue $200
  • Wrong: Average of averages = ($50 + $200) / 2 = $125
  • Right: Weighted average = (100*$50 + 10*$200) / 110 = $63.64

How to prevent: Always aggregate from raw data. Never average pre-aggregated averages.

Timezone Mismatches

The problem: Different data sources use different timezones, causing misalignment.

Examples:

  • Event timestamps in UTC vs. user-facing dates in local time
  • Daily rollups that use different cutoff times

How to prevent: Standardize all timestamps to a single timezone (UTC recommended) before analysis. Document the timezone used.

Selection Bias in Segmentation

The problem: Segments are defined by the outcome you're measuring, creating circular logic.

Examples:

  • "Users who completed onboarding have higher retention" -- obviously, they self-selected
  • "Power users generate more revenue" -- they became power users BY generating revenue

How to prevent: Define segments based on pre-treatment characteristics, not outcomes.

Other Statistical Traps

  • Simpson's paradox: Trend reverses when data is aggregated vs. segmented
  • Correlation presented as causation without supporting evidence
  • Small sample sizes leading to unreliable conclusions
  • Outliers disproportionately affecting averages (should medians be used instead?)
  • Multiple testing / cherry-picking significant results
  • Look-ahead bias: Using future information to explain past events
  • Cherry-picked time ranges that favor a particular narrative

Result Sanity Checking

Magnitude Checks

For any key number in your analysis, verify it passes the "smell test":

Metric Type Sanity Check
User counts Does this match known MAU/DAU figures?
Revenue Is this in the right order of magnitude vs. known ARR?
Conversion rates Is this between 0% and 100%? Does it match dashboard figures?
Growth rates Is 50%+ MoM growth realistic, or is there a data issue?
Averages Is the average reasonable given what you know about the distribution?
Percentages Do segment percentages sum to ~100%?

Cross-Validation Techniques

  1. Calculate the same metric two different ways and verify they match
  2. Spot-check individual records -- pick a few specific entities and trace their data manually
  3. Compare to known benchmarks -- match against published dashboards, finance reports, or prior analyses
  4. Reverse engineer -- if total revenue is X, does per-user revenue times user count approximately equal X?
  5. Boundary checks -- what happens when you filter to a single day, a single user, or a single category? Are those micro-results sensible?

Red Flags That Warrant Investigation

  • Any metric that changed by more than 50% period-over-period without an obvious cause
  • Counts or sums that are exact round numbers (suggests a filter or default value issue)
  • Rates exactly at 0% or 100% (may indicate incomplete data)
  • Results that perfectly confirm the hypothesis (reality is usually messier)
  • Identical values across time periods or segments (suggests the query is ignoring a dimension)

Documentation Standards for Reproducibility

Analysis Documentation Template

Every non-trivial analysis should include:

## Analysis: [Title]

### Question
[The specific question being answered]

### Data Sources
- Table: [schema.table_name] (as of [date])
- Table: [schema.other_table] (as of [date])
- File: [filename] (source: [where it came from])

### Definitions
- [Metric A]: [Exactly how it's calculated]
- [Segment X]: [Exactly how membership is determined]
- [Time period]: [Start date] to [end date], [timezone]

### Methodology
1. [Step 1 of the analysis approach]
2. [Step 2]
3. [Step 3]

### Assumptions and Limitations
- [Assumption 1 and why it's reasonable]
- [Limitation 1 and its potential impact on conclusions]

### Key Findings
1. [Finding 1 with supporting evidence]
2. [Finding 2 with supporting evidence]

### SQL Queries
[All queries used, with comments]

### Caveats
- [Things the reader should know before acting on this]

Code Documentation

For any code (SQL, Python) that may be reused:

"""
Analysis: Monthly Cohort Retention
Author: [Name]
Date: [Date]
Data Source: events table, users table
Last Validated: [Date] -- results matched dashboard within 2%

Purpose:
    Calculate monthly user retention cohorts based on first activity date.

Assumptions:
    - "Active" means at least one event in the month
    - Excludes test/internal accounts (user_type != 'internal')
    - Uses UTC dates throughout

Output:
    Cohort retention matrix with cohort_month rows and months_since_signup columns.
    Values are retention rates (0-100%).
"""

Version Control for Analyses

  • Save queries and code in version control (git) or a shared docs system
  • Note the date of the data snapshot used
  • If an analysis is re-run with updated data, document what changed and why
  • Link to prior versions of recurring analyses for trend comparison

Examples

/validate-data Review this quarterly revenue analysis before I send it to the exec team: [analysis]
/validate-data Check my churn analysis -- I'm comparing Q4 churn rates to Q3 but Q4 has a shorter measurement window
/validate-data Here's a SQL query and its results for our conversion funnel. Does the logic look right? [query + results]

Tips

  • Run /validate-data before any high-stakes presentation or decision
  • Even quick analyses benefit from a sanity check -- it takes a minute and can save your credibility
  • If the validation finds issues, fix them and re-validate
  • Share the validation output alongside your analysis to build stakeholder confidence
将自然语言需求转化为特定方言的高性能SQL。支持多CTE、复杂连接与聚合,遵循最佳实践优化分区表查询,并适配Snowflake、BigQuery等主流数据库语法。
根据自然语言描述编写SQL 构建包含多CTE和连接的复杂查询 针对大型分区表优化SQL性能 获取特定数据库方言的语法支持
data/skills/write-query/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill write-query -g -y
SKILL.md
Frontmatter
{
    "name": "write-query",
    "description": "Write optimized SQL for your dialect with best practices. Use when translating a natural-language data need into SQL, building a multi-CTE query with joins and aggregations, optimizing a query against a large partitioned table, or getting dialect-specific syntax for Snowflake, BigQuery, Postgres, etc.",
    "argument-hint": "<description of what data you need>"
}

/write-query - Write Optimized SQL

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Write a SQL query from a natural language description, optimized for your specific SQL dialect and following best practices.

Usage

/write-query <description of what data you need>

Workflow

1. Understand the Request

Parse the user's description to identify:

  • Output columns: What fields should the result include?
  • Filters: What conditions limit the data (time ranges, segments, statuses)?
  • Aggregations: Are there GROUP BY operations, counts, sums, averages?
  • Joins: Does this require combining multiple tables?
  • Ordering: How should results be sorted?
  • Limits: Is there a top-N or sample requirement?

2. Determine SQL Dialect

If the user's SQL dialect is not already known, ask which they use:

  • PostgreSQL (including Aurora, RDS, Supabase, Neon)
  • Snowflake
  • BigQuery (Google Cloud)
  • Redshift (Amazon)
  • Databricks SQL
  • MySQL (including Aurora MySQL, PlanetScale)
  • SQL Server (Microsoft)
  • DuckDB
  • SQLite
  • Other (ask for specifics)

Remember the dialect for future queries in the same session.

3. Discover Schema (If Warehouse Connected)

If a data warehouse MCP server is connected:

  1. Search for relevant tables based on the user's description
  2. Inspect column names, types, and relationships
  3. Check for partitioning or clustering keys that affect performance
  4. Look for pre-built views or materialized views that might simplify the query

4. Write the Query

Follow these best practices:

Structure:

  • Use CTEs (WITH clauses) for readability when queries have multiple logical steps
  • One CTE per logical transformation or data source
  • Name CTEs descriptively (e.g., daily_signups, active_users, revenue_by_product)

Performance:

  • Never use SELECT * in production queries -- specify only needed columns
  • Filter early (push WHERE clauses as close to the base tables as possible)
  • Use partition filters when available (especially date partitions)
  • Prefer EXISTS over IN for subqueries with large result sets
  • Use appropriate JOIN types (don't use LEFT JOIN when INNER JOIN is correct)
  • Avoid correlated subqueries when a JOIN or window function works
  • Be mindful of exploding joins (many-to-many)

Readability:

  • Add comments explaining the "why" for non-obvious logic
  • Use consistent indentation and formatting
  • Alias tables with meaningful short names (not just a, b, c)
  • Put each major clause on its own line

Dialect-specific optimizations:

  • Apply dialect-specific syntax and functions (see sql-queries skill for details)
  • Use dialect-appropriate date functions, string functions, and window syntax
  • Note any dialect-specific performance features (e.g., Snowflake clustering, BigQuery partitioning)

5. Present the Query

Provide:

  1. The complete query in a SQL code block with syntax highlighting
  2. Brief explanation of what each CTE or section does
  3. Performance notes if relevant (expected cost, partition usage, potential bottlenecks)
  4. Modification suggestions -- how to adjust for common variations (different time range, different granularity, additional filters)

6. Offer to Execute

If a data warehouse is connected, offer to run the query and analyze the results. If the user wants to run it themselves, the query is ready to copy-paste.

Examples

Simple aggregation:

/write-query Count of orders by status for the last 30 days

Complex analysis:

/write-query Cohort retention analysis -- group users by their signup month, then show what percentage are still active (had at least one event) at 1, 3, 6, and 12 months after signup

Performance-critical:

/write-query We have a 500M row events table partitioned by date. Find the top 100 users by event count in the last 7 days with their most recent event type.

Tips

  • Mention your SQL dialect upfront to get the right syntax immediately
  • If you know the table names, include them -- otherwise Claude will help you find them
  • Specify if you need the query to be idempotent (safe to re-run) or one-time
  • For recurring queries, mention if it should be parameterized for date ranges
执行WCAG 2.1 AA无障碍审计,检查设计或页面的色彩对比度、键盘导航、触控目标及屏幕阅读器兼容性。
audit accessibility check a11y is this accessible? reviewing a design for color contrast, keyboard navigation, touch target size, or screen reader behavior before handoff
design/skills/accessibility-review/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill accessibility-review -g -y
SKILL.md
Frontmatter
{
    "name": "accessibility-review",
    "description": "Run a WCAG 2.1 AA accessibility audit on a design or page. Trigger with \"audit accessibility\", \"check a11y\", \"is this accessible?\", or when reviewing a design for color contrast, keyboard navigation, touch target size, or screen reader behavior before handoff.",
    "argument-hint": "<Figma URL, URL, or description>"
}

/accessibility-review

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Audit a design or page for WCAG 2.1 AA accessibility compliance.

Usage

/accessibility-review $ARGUMENTS

Audit for accessibility: @$1

WCAG 2.1 AA Quick Reference

Perceivable

  • 1.1.1 Non-text content has alt text
  • 1.3.1 Info and structure conveyed semantically
  • 1.4.3 Contrast ratio >= 4.5:1 (normal text), >= 3:1 (large text)
  • 1.4.11 Non-text contrast >= 3:1 (UI components, graphics)

Operable

  • 2.1.1 All functionality available via keyboard
  • 2.4.3 Logical focus order
  • 2.4.7 Visible focus indicator
  • 2.5.5 Touch target >= 44x44 CSS pixels

Understandable

  • 3.2.1 Predictable on focus (no unexpected changes)
  • 3.3.1 Error identification (describe the error)
  • 3.3.2 Labels or instructions for inputs

Robust

  • 4.1.2 Name, role, value for all UI components

Common Issues

  1. Insufficient color contrast
  2. Missing form labels
  3. No keyboard access to interactive elements
  4. Missing alt text on meaningful images
  5. Focus traps in modals
  6. Missing ARIA landmarks
  7. Auto-playing media without controls
  8. Time limits without extension options

Testing Approach

  1. Automated scan (catches ~30% of issues)
  2. Keyboard-only navigation
  3. Screen reader testing (VoiceOver, NVDA)
  4. Color contrast verification
  5. Zoom to 200% — does layout break?

Output

## Accessibility Audit: [Design/Page Name]
**Standard:** WCAG 2.1 AA | **Date:** [Date]

### Summary
**Issues found:** [X] | **Critical:** [X] | **Major:** [X] | **Minor:** [X]

### Findings

#### Perceivable
| # | Issue | WCAG Criterion | Severity | Recommendation |
|---|-------|---------------|----------|----------------|
| 1 | [Issue] | [1.4.3 Contrast] | 🔴 Critical | [Fix] |

#### Operable
| # | Issue | WCAG Criterion | Severity | Recommendation |
|---|-------|---------------|----------|----------------|
| 1 | [Issue] | [2.1.1 Keyboard] | 🟡 Major | [Fix] |

#### Understandable
| # | Issue | WCAG Criterion | Severity | Recommendation |
|---|-------|---------------|----------|----------------|
| 1 | [Issue] | [3.3.2 Labels] | 🟢 Minor | [Fix] |

#### Robust
| # | Issue | WCAG Criterion | Severity | Recommendation |
|---|-------|---------------|----------|----------------|
| 1 | [Issue] | [4.1.2 Name, Role, Value] | 🟡 Major | [Fix] |

### Color Contrast Check
| Element | Foreground | Background | Ratio | Required | Pass? |
|---------|-----------|------------|-------|----------|-------|
| [Body text] | [color] | [color] | [X]:1 | 4.5:1 | ✅/❌ |

### Keyboard Navigation
| Element | Tab Order | Enter/Space | Escape | Arrow Keys |
|---------|-----------|-------------|--------|------------|
| [Element] | [Order] | [Behavior] | [Behavior] | [Behavior] |

### Screen Reader
| Element | Announced As | Issue |
|---------|-------------|-------|
| [Element] | [What SR says] | [Problem if any] |

### Priority Fixes
1. **[Critical fix]** — Affects [who] and blocks [what]
2. **[Major fix]** — Improves [what] for [who]
3. **[Minor fix]** — Nice to have

If Connectors Available

If ~~design tool is connected:

  • Inspect color values, font sizes, and touch targets directly from Figma
  • Check component ARIA roles and keyboard behavior in the design spec

If ~~project tracker is connected:

  • Create tickets for each accessibility finding with severity and WCAG criterion
  • Link findings to existing accessibility remediation epics

Tips

  1. Start with contrast and keyboard — These catch the most common and impactful issues.
  2. Test with real assistive technology — My audit is a great start, but manual testing with VoiceOver/NVDA catches things I can't.
  3. Prioritize by impact — Fix issues that block users first, polish later.
提供结构化的设计反馈,涵盖可用性、视觉层级、一致性和无障碍性。支持通过Figma链接、截图或描述触发,依据特定框架给出具体改进建议及优先级排序。
review this design critique this mockup what do you think of this screen? 分享Figma链接 分享截图
design/skills/design-critique/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill design-critique -g -y
SKILL.md
Frontmatter
{
    "name": "design-critique",
    "description": "Get structured design feedback on usability, hierarchy, and consistency. Trigger with \"review this design\", \"critique this mockup\", \"what do you think of this screen?\", or when sharing a Figma link or screenshot for feedback at any stage from exploration to final polish.",
    "argument-hint": "<Figma URL, screenshot, or description>"
}

/design-critique

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Get structured design feedback across multiple dimensions.

Usage

/design-critique $ARGUMENTS

Review the design: @$1

If a Figma URL is provided, pull the design from Figma. If a file is referenced, read it. Otherwise, ask the user to describe or share their design.

What I Need From You

  • The design: Figma URL, screenshot, or detailed description
  • Context: What is this? Who is it for? What stage (exploration, refinement, final)?
  • Focus (optional): "Focus on mobile" or "Focus on the onboarding flow"

Critique Framework

1. First Impression (2 seconds)

  • What draws the eye first? Is that correct?
  • What's the emotional reaction?
  • Is the purpose immediately clear?

2. Usability

  • Can the user accomplish their goal?
  • Is the navigation intuitive?
  • Are interactive elements obvious?
  • Are there unnecessary steps?

3. Visual Hierarchy

  • Is there a clear reading order?
  • Are the right elements emphasized?
  • Is whitespace used effectively?
  • Is typography creating the right hierarchy?

4. Consistency

  • Does it follow the design system?
  • Are spacing, colors, and typography consistent?
  • Do similar elements behave similarly?

5. Accessibility

  • Color contrast ratios
  • Touch target sizes
  • Text readability
  • Alternative text for images

How to Give Feedback

  • Be specific: "The CTA competes with the navigation" not "the layout is confusing"
  • Explain why: Connect feedback to design principles or user needs
  • Suggest alternatives: Don't just identify problems, propose solutions
  • Acknowledge what works: Good feedback includes positive observations
  • Match the stage: Early exploration gets different feedback than final polish

Output

## Design Critique: [Design Name]

### Overall Impression
[1-2 sentence first reaction — what works, what's the biggest opportunity]

### Usability
| Finding | Severity | Recommendation |
|---------|----------|----------------|
| [Issue] | 🔴 Critical / 🟡 Moderate / 🟢 Minor | [Fix] |

### Visual Hierarchy
- **What draws the eye first**: [Element] — [Is this correct?]
- **Reading flow**: [How does the eye move through the layout?]
- **Emphasis**: [Are the right things emphasized?]

### Consistency
| Element | Issue | Recommendation |
|---------|-------|----------------|
| [Typography/spacing/color] | [Inconsistency] | [Fix] |

### Accessibility
- **Color contrast**: [Pass/fail for key text]
- **Touch targets**: [Adequate size?]
- **Text readability**: [Font size, line height]

### What Works Well
- [Positive observation 1]
- [Positive observation 2]

### Priority Recommendations
1. **[Most impactful change]** — [Why and how]
2. **[Second priority]** — [Why and how]
3. **[Third priority]** — [Why and how]

If Connectors Available

If ~~design tool is connected:

  • Pull the design directly from Figma and inspect components, tokens, and layers
  • Compare against the existing design system for consistency

If ~~user feedback is connected:

  • Cross-reference design decisions with recent user feedback and support tickets

Tips

  1. Share the context — "This is a checkout flow for a B2B SaaS" helps me give relevant feedback.
  2. Specify your stage — Early exploration gets different feedback than final polish.
  3. Ask me to focus — "Just look at the navigation" gives you more depth on one area.
根据设计稿生成全面的开发者交接规范,涵盖布局、设计令牌、组件属性、交互状态、响应式断点及无障碍细节。支持Figma链接或截图输入,确保开发无歧义。
需要为UI设计生成开发文档 提供Figma链接或设计截图要求输出规格说明
design/skills/design-handoff/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill design-handoff -g -y
SKILL.md
Frontmatter
{
    "name": "design-handoff",
    "description": "Generate developer handoff specs from a design. Use when a design is ready for engineering and needs a spec sheet covering layout, design tokens, component props, interaction states, responsive breakpoints, edge cases, and animation details.",
    "argument-hint": "<Figma URL or design description>"
}

/design-handoff

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Generate comprehensive developer handoff documentation from a design.

Usage

/design-handoff $ARGUMENTS

Generate handoff specs for: @$1

If a Figma URL is provided, pull the design from Figma. Otherwise, work from the provided description or screenshot.

What to Include

Visual Specifications

  • Exact measurements (padding, margins, widths)
  • Design token references (colors, typography, spacing)
  • Responsive breakpoints and behavior
  • Component variants and states

Interaction Specifications

  • Click/tap behavior
  • Hover states
  • Transitions and animations (duration, easing)
  • Gesture support (swipe, pinch, long-press)

Content Specifications

  • Character limits
  • Truncation behavior
  • Empty states
  • Loading states
  • Error states

Edge Cases

  • Minimum/maximum content
  • International text (longer strings)
  • Slow connections
  • Missing data

Accessibility

  • Focus order
  • ARIA labels and roles
  • Keyboard interactions
  • Screen reader announcements

Principles

  1. Don't assume — If it's not specified, the developer will guess. Specify everything.
  2. Use tokens, not values — Reference spacing-md not 16px.
  3. Show all states — Default, hover, active, disabled, loading, error, empty.
  4. Describe the why — "This collapses on mobile because users primarily use one-handed" helps developers make good judgment calls.

Output

## Handoff Spec: [Feature/Screen Name]

### Overview
[What this screen/feature does, user context]

### Layout
[Grid system, breakpoints, responsive behavior]

### Design Tokens Used
| Token | Value | Usage |
|-------|-------|-------|
| `color-primary` | #[hex] | CTA buttons, links |
| `spacing-md` | [X]px | Between sections |
| `font-heading-lg` | [size/weight/family] | Page title |

### Components
| Component | Variant | Props | Notes |
|-----------|---------|-------|-------|
| [Component] | [Variant] | [Props] | [Special behavior] |

### States and Interactions
| Element | State | Behavior |
|---------|-------|----------|
| [CTA Button] | Hover | [Background darken 10%] |
| [CTA Button] | Loading | [Spinner, disabled] |
| [Form] | Error | [Red border, error message below] |

### Responsive Behavior
| Breakpoint | Changes |
|------------|---------|
| Desktop (>1024px) | [Default layout] |
| Tablet (768-1024px) | [What changes] |
| Mobile (<768px) | [What changes] |

### Edge Cases
- **Empty state**: [What to show when no data]
- **Long text**: [Truncation rules]
- **Loading**: [Skeleton or spinner]
- **Error**: [Error state appearance]

### Animation / Motion
| Element | Trigger | Animation | Duration | Easing |
|---------|---------|-----------|----------|--------|
| [Element] | [Trigger] | [Description] | [ms] | [easing] |

### Accessibility Notes
- [Focus order]
- [ARIA labels needed]
- [Keyboard interactions]

If Connectors Available

If ~~design tool is connected:

  • Pull exact measurements, tokens, and component specs from Figma
  • Export assets and generate a complete spec sheet

If ~~project tracker is connected:

  • Link the handoff to the implementation ticket
  • Create sub-tasks for each section of the spec

Tips

  1. Share the Figma link — I can pull exact measurements, tokens, and component info.
  2. Mention edge cases — "What happens with 100 items?" helps me spec boundary conditions.
  3. Specify the tech stack — "We use React + Tailwind" helps me give relevant implementation notes.
用于管理设计系统,支持审计一致性、编写组件文档或扩展新图案。涵盖设计令牌、组件和模式,遵循一致性原则,提供标准化输出格式以评估和维护UI系统的完整性与规范。
检查命名不一致或硬编码值 为组件变体、状态或无障碍性编写文档 设计符合现有系统的新模式
design/skills/design-system/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill design-system -g -y
SKILL.md
Frontmatter
{
    "name": "design-system",
    "description": "Audit, document, or extend your design system. Use when checking for naming inconsistencies or hardcoded values across components, writing documentation for a component's variants, states, and accessibility notes, or designing a new pattern that fits the existing system.",
    "argument-hint": "[audit | document | extend] <component or system>"
}

/design-system

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Manage your design system — audit for consistency, document components, or design new patterns.

Usage

/design-system audit                    # Full system audit
/design-system document [component]     # Document a component
/design-system extend [pattern]         # Design a new component or pattern

Components of a Design System

Design Tokens

Atomic values that define the visual language:

  • Colors (brand, semantic, neutral)
  • Typography (scale, weights, line heights)
  • Spacing (scale, component padding)
  • Borders (radius, width)
  • Shadows (elevation levels)
  • Motion (durations, easings)

Components

Reusable UI elements with defined:

  • Variants (primary, secondary, ghost)
  • States (default, hover, active, disabled, loading, error)
  • Sizes (sm, md, lg)
  • Behavior (interactions, animations)
  • Accessibility (ARIA, keyboard)

Patterns

Common UI solutions combining components:

  • Forms (input groups, validation, submission)
  • Navigation (sidebar, tabs, breadcrumbs)
  • Data display (tables, cards, lists)
  • Feedback (toasts, modals, inline messages)

Principles

  1. Consistency over creativity — The system exists so teams don't reinvent the wheel
  2. Flexibility within constraints — Components should be composable, not rigid
  3. Document everything — If it's not documented, it doesn't exist
  4. Version and migrate — Breaking changes need migration paths

Output — Audit

## Design System Audit

### Summary
**Components reviewed:** [X] | **Issues found:** [X] | **Score:** [X/100]

### Naming Consistency
| Issue | Components | Recommendation |
|-------|------------|----------------|
| [Inconsistent naming] | [List] | [Standard to adopt] |

### Token Coverage
| Category | Defined | Hardcoded Values Found |
|----------|---------|----------------------|
| Colors | [X] | [X] instances of hardcoded hex |
| Spacing | [X] | [X] instances of arbitrary values |
| Typography | [X] | [X] instances of custom fonts/sizes |

### Component Completeness
| Component | States | Variants | Docs | Score |
|-----------|--------|----------|------|-------|
| Button | ✅ | ✅ | ⚠️ | 8/10 |
| Input | ✅ | ⚠️ | ❌ | 5/10 |

### Priority Actions
1. [Most impactful improvement]
2. [Second priority]
3. [Third priority]

Output — Document

## Component: [Name]

### Description
[What this component is and when to use it]

### Variants
| Variant | Use When |
|---------|----------|
| [Primary] | [Main actions] |
| [Secondary] | [Supporting actions] |

### Props / Properties
| Property | Type | Default | Description |
|----------|------|---------|-------------|
| [prop] | [type] | [default] | [description] |

### States
| State | Visual | Behavior |
|-------|--------|----------|
| Default | [description] | — |
| Hover | [description] | [interaction] |
| Active | [description] | [interaction] |
| Disabled | [description] | Non-interactive |
| Loading | [description] | [animation] |

### Accessibility
- **Role**: [ARIA role]
- **Keyboard**: [Tab, Enter, Escape behavior]
- **Screen reader**: [Announced as...]

### Do's and Don'ts
| ✅ Do | ❌ Don't |
|------|---------|
| [Best practice] | [Anti-pattern] |

### Code Example
[Framework-appropriate code snippet]

Output — Extend

## New Component: [Name]

### Problem
[What user need or gap this component addresses]

### Existing Patterns
| Related Component | Similarity | Why It's Not Enough |
|-------------------|-----------|---------------------|
| [Component] | [What's shared] | [What's missing] |

### Proposed Design

#### API / Props
| Property | Type | Default | Description |
|----------|------|---------|-------------|
| [prop] | [type] | [default] | [description] |

#### Variants
| Variant | Use When | Visual |
|---------|----------|--------|
| [Variant] | [Scenario] | [Description] |

#### States
| State | Behavior | Notes |
|-------|----------|-------|
| Default | [Description] | — |
| Hover | [Description] | [Interaction] |
| Disabled | [Description] | Non-interactive |
| Loading | [Description] | [Animation] |

#### Tokens Used
- Colors: [Which tokens]
- Spacing: [Which tokens]
- Typography: [Which tokens]

### Accessibility
- **Role**: [ARIA role]
- **Keyboard**: [Expected interactions]
- **Screen reader**: [Announced as...]

### Open Questions
- [Decision that needs design review]
- [Edge case to resolve]

If Connectors Available

If ~~design tool is connected:

  • Audit components directly in Figma — check naming, variants, and token usage
  • Pull component properties and layer structure for documentation

If ~~knowledge base is connected:

  • Search for existing component documentation and usage guidelines
  • Publish updated documentation to your wiki

Tips

  1. Start with an audit — Know where you are before deciding where to go.
  2. Document as you build — It's easier to document a component while designing it.
  3. Prioritize coverage over perfection — 80% of components documented beats 100% of 10 components.
将用户研究数据(如访谈、问卷、NPS等)综合为可执行的洞察。识别关键主题、用户细分,并生成带有证据支持的优先级建议,辅助产品决策。
需要分析访谈记录或可用性测试笔记 处理调查数据或客户支持工单 从NPS反馈中提炼模式 将原始研究转化为结构化报告
design/skills/research-synthesis/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill research-synthesis -g -y
SKILL.md
Frontmatter
{
    "name": "research-synthesis",
    "description": "Synthesize user research into themes, insights, and recommendations. Use when you have interview transcripts, survey results, usability test notes, support tickets, or NPS responses that need to be distilled into patterns, user segments, and prioritized next steps.",
    "argument-hint": "<research data, transcripts, or survey results>"
}

/research-synthesis

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Synthesize user research data into actionable insights. See the user-research skill for research methods, interview guides, and analysis frameworks.

Usage

/research-synthesis $ARGUMENTS

What I Accept

  • Interview transcripts or notes
  • Survey results (CSV, pasted data)
  • Usability test recordings or notes
  • Support tickets or feedback
  • NPS/CSAT responses
  • App store reviews

Output

## Research Synthesis: [Study Name]
**Method:** [Interviews / Survey / Usability Test] | **Participants:** [X]
**Date:** [Date range] | **Researcher:** [Name]

### Executive Summary
[3-4 sentence overview of key findings]

### Key Themes

#### Theme 1: [Name]
**Prevalence:** [X of Y participants]
**Summary:** [What this theme is about]
**Supporting Evidence:**
- "[Quote]" — P[X]
- "[Quote]" — P[X]
**Implication:** [What this means for the product]

#### Theme 2: [Name]
[Same format]

### Insights → Opportunities

| Insight | Opportunity | Impact | Effort |
|---------|-------------|--------|--------|
| [What we learned] | [What we could do] | High/Med/Low | High/Med/Low |

### User Segments Identified
| Segment | Characteristics | Needs | Size |
|---------|----------------|-------|------|
| [Name] | [Description] | [Key needs] | [Rough %] |

### Recommendations
1. **[High priority]** — [Why, based on which findings]
2. **[Medium priority]** — [Why]
3. **[Lower priority]** — [Why]

### Questions for Further Research
- [What we still don't know]

### Methodology Notes
[How the research was conducted, any limitations or biases to note]

If Connectors Available

If ~~user feedback is connected:

  • Pull support tickets, feature requests, and NPS responses to supplement research data
  • Cross-reference themes with real user complaints and requests

If ~~product analytics is connected:

  • Validate qualitative findings with usage data and behavioral metrics
  • Quantify the impact of identified pain points

If ~~knowledge base is connected:

  • Search for prior research studies and findings to compare against
  • Publish the synthesis to your research repository

Tips

  1. Include raw quotes — Direct participant quotes make insights credible and memorable.
  2. Separate observations from interpretations — "5 of 8 users clicked the wrong button" is an observation. "The button placement is confusing" is an interpretation.
  3. Quantify where possible — "Most users" is vague. "7 of 10 users" is specific.
辅助规划、执行及综合用户研究。支持选择访谈、可用性测试等方法,提供访谈指南结构与分析框架,生成研究报告等交付物,帮助用户深入理解用户需求。
制定用户研究计划 设计访谈提纲 进行可用性测试 设计调查问卷 确定研究问题 需要帮助理解用户的研究方面
design/skills/user-research/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill user-research -g -y
SKILL.md
Frontmatter
{
    "name": "user-research",
    "description": "Plan, conduct, and synthesize user research. Trigger with \"user research plan\", \"interview guide\", \"usability test\", \"survey design\", \"research questions\", or when the user needs help with any aspect of understanding their users through research."
}

User Research

Help plan, execute, and synthesize user research studies.

Research Methods

Method Best For Sample Size Time
User interviews Deep understanding of needs and motivations 5-8 2-4 weeks
Usability testing Evaluating a specific design or flow 5-8 1-2 weeks
Surveys Quantifying attitudes and preferences 100+ 1-2 weeks
Card sorting Information architecture decisions 15-30 1 week
Diary studies Understanding behavior over time 10-15 2-8 weeks
A/B testing Comparing specific design choices Statistical significance 1-4 weeks

Interview Guide Structure

  1. Warm-up (5 min): Build rapport, explain the session
  2. Context (10 min): Understand their current workflow
  3. Deep dive (20 min): Explore the specific topic
  4. Reaction (10 min): Show concepts or prototypes
  5. Wrap-up (5 min): Anything we missed? Thank them.

Analysis Framework

  • Affinity mapping: Group observations into themes
  • Impact/effort matrix: Prioritize findings
  • Journey mapping: Visualize the user experience over time
  • Jobs to be done: Understand what users are hiring your product to do

Deliverables

  • Research plan (objectives, methods, timeline, participants)
  • Interview guide (questions, probes, activities)
  • Synthesis report (themes, insights, recommendations)
  • Highlight reel (key quotes and observations)
用于撰写或审查界面文案(如CTA、错误提示、空状态等)。通过提供上下文、用户状态和语气要求,遵循清晰简洁原则,生成符合UX规范的推荐文案及替代方案。
撰写按钮文案 审查错误提示信息 设计空状态文本 编写确认对话框内容 生成引导流程文案
design/skills/ux-copy/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill ux-copy -g -y
SKILL.md
Frontmatter
{
    "name": "ux-copy",
    "description": "Write or review UX copy — microcopy, error messages, empty states, CTAs. Trigger with \"write copy for\", \"what should this button say?\", \"review this error message\", or when naming a CTA, wording a confirmation dialog, filling an empty state, or writing onboarding text.",
    "argument-hint": "<context or copy to review>"
}

/ux-copy

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Write or review UX copy for any interface context.

Usage

/ux-copy $ARGUMENTS

What I Need From You

  • Context: What screen, flow, or feature?
  • User state: What is the user trying to do? How are they feeling?
  • Tone: Formal, friendly, playful, reassuring?
  • Constraints: Character limits, platform guidelines?

Principles

  1. Clear: Say exactly what you mean. No jargon, no ambiguity.
  2. Concise: Use the fewest words that convey the full meaning.
  3. Consistent: Same terms for the same things everywhere.
  4. Useful: Every word should help the user accomplish their goal.
  5. Human: Write like a helpful person, not a robot.

Copy Patterns

CTAs

  • Start with a verb: "Start free trial", "Save changes", "Download report"
  • Be specific: "Create account" not "Submit"
  • Match the outcome to the label

Error Messages

Structure: What happened + Why + How to fix

  • "Payment declined. Your card was declined by your bank. Try a different card or contact your bank."

Empty States

Structure: What this is + Why it's empty + How to start

  • "No projects yet. Create your first project to start collaborating with your team."

Confirmation Dialogs

  • Make the action clear: "Delete 3 files?" not "Are you sure?"
  • Describe consequences: "This can't be undone"
  • Label buttons with the action: "Delete files" / "Keep files" not "OK" / "Cancel"

Tooltips

  • Concise, helpful, never obvious

Loading States

  • Set expectations, reduce anxiety

Onboarding

  • Progressive disclosure, one concept at a time

Voice and Tone

Adapt tone to context:

  • Success: Celebratory but not over the top
  • Error: Empathetic and helpful
  • Warning: Clear and actionable
  • Neutral: Informative and concise

Output

## UX Copy: [Context]

### Recommended Copy
**[Element]**: [Copy]

### Alternatives
| Option | Copy | Tone | Best For |
|--------|------|------|----------|
| A | [Copy] | [Tone] | [When to use] |
| B | [Copy] | [Tone] | [When to use] |
| C | [Copy] | [Tone] | [When to use] |

### Rationale
[Why this copy works — user context, clarity, action-orientation]

### Localization Notes
[Anything translators should know — idioms to avoid, character expansion, cultural context]

If Connectors Available

If ~~knowledge base is connected:

  • Pull your brand voice guidelines and content style guide
  • Check for existing copy patterns and terminology standards

If ~~design tool is connected:

  • View the screen context in Figma to understand the full user flow
  • Check character limits and layout constraints from the design

Tips

  1. Be specific about context — "Error message when payment fails" is better than "error message."
  2. Share your brand voice — "We're professional but warm" helps me match your tone.
  3. Consider the user's emotional state — Error messages need empathy. Success messages can celebrate.
用于创建或评估架构决策记录(ADR)及系统设计方案。适用于技术选型、设计提案评审及新组件设计,提供标准化输出模板以分析权衡与后果。
选择技术栈时的对比分析 撰写带有权衡和后果的设计决策文档 审查系统设计提案 基于需求和约束设计新组件
engineering/skills/architecture/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill architecture -g -y
SKILL.md
Frontmatter
{
    "name": "architecture",
    "description": "Create or evaluate an architecture decision record (ADR). Use when choosing between technologies (e.g., Kafka vs SQS), documenting a design decision with trade-offs and consequences, reviewing a system design proposal, or designing a new component from requirements and constraints.",
    "argument-hint": "<decision or system to design>"
}

/architecture

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Create an Architecture Decision Record (ADR) or evaluate a system design.

Usage

/architecture $ARGUMENTS

Modes

Create an ADR: "Should we use Kafka or SQS for our event bus?" Evaluate a design: "Review this microservices proposal" System design: "Design the notification system for our app"

See the system-design skill for detailed frameworks on requirements gathering, scalability analysis, and trade-off evaluation.

Output — ADR Format

# ADR-[number]: [Title]

**Status:** Proposed | Accepted | Deprecated | Superseded
**Date:** [Date]
**Deciders:** [Who needs to sign off]

## Context
[What is the situation? What forces are at play?]

## Decision
[What is the change we're proposing?]

## Options Considered

### Option A: [Name]
| Dimension | Assessment |
|-----------|------------|
| Complexity | [Low/Med/High] |
| Cost | [Assessment] |
| Scalability | [Assessment] |
| Team familiarity | [Assessment] |

**Pros:** [List]
**Cons:** [List]

### Option B: [Name]
[Same format]

## Trade-off Analysis
[Key trade-offs between options with clear reasoning]

## Consequences
- [What becomes easier]
- [What becomes harder]
- [What we'll need to revisit]

## Action Items
1. [ ] [Implementation step]
2. [ ] [Follow-up]

If Connectors Available

If ~~knowledge base is connected:

  • Search for prior ADRs and design docs
  • Find relevant technical context

If ~~project tracker is connected:

  • Link to related epics and tickets
  • Create implementation tasks

Tips

  1. State constraints upfront — "We need to ship in 2 weeks" or "Must handle 10K rps" shapes the answer.
  2. Name your options — Even if you're leaning one way, I'll give a more balanced analysis with explicit alternatives.
  3. Include non-functional requirements — Latency, cost, team expertise, and maintenance burden matter as much as features.
代码审查技能,针对PR或Diff进行安全、性能、正确性及可维护性分析。支持N+1查询、注入风险等检测,提供结构化报告与改进建议。
提供PR URL或diff 询问'review this before I merge' 询问'is this code safe?' 检查N+1查询、注入风险、边界情况或错误处理
engineering/skills/code-review/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill code-review -g -y
SKILL.md
Frontmatter
{
    "name": "code-review",
    "description": "Review code changes for security, performance, and correctness. Trigger with a PR URL or diff, \"review this before I merge\", \"is this code safe?\", or when checking a change for N+1 queries, injection risks, missing edge cases, or error handling gaps.",
    "argument-hint": "<PR URL, diff, or file path>"
}

/code-review

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Review code changes with a structured lens on security, performance, correctness, and maintainability.

Usage

/code-review <PR URL or file path>

Review the provided code changes: @$1

If no specific file or URL is provided, ask what to review.

How It Works

┌─────────────────────────────────────────────────────────────────┐
│                      CODE REVIEW                                   │
├─────────────────────────────────────────────────────────────────┤
│  STANDALONE (always works)                                       │
│  ✓ Paste a diff, PR URL, or point to files                      │
│  ✓ Security audit (OWASP top 10, injection, auth)               │
│  ✓ Performance review (N+1, memory leaks, complexity)           │
│  ✓ Correctness (edge cases, error handling, race conditions)    │
│  ✓ Style (naming, structure, readability)                        │
│  ✓ Actionable suggestions with code examples                    │
├─────────────────────────────────────────────────────────────────┤
│  SUPERCHARGED (when you connect your tools)                      │
│  + Source control: Pull PR diff automatically                    │
│  + Project tracker: Link findings to tickets                     │
│  + Knowledge base: Check against team coding standards           │
└─────────────────────────────────────────────────────────────────┘

Review Dimensions

Security

  • SQL injection, XSS, CSRF
  • Authentication and authorization flaws
  • Secrets or credentials in code
  • Insecure deserialization
  • Path traversal
  • SSRF

Performance

  • N+1 queries
  • Unnecessary memory allocations
  • Algorithmic complexity (O(n²) in hot paths)
  • Missing database indexes
  • Unbounded queries or loops
  • Resource leaks

Correctness

  • Edge cases (empty input, null, overflow)
  • Race conditions and concurrency issues
  • Error handling and propagation
  • Off-by-one errors
  • Type safety

Maintainability

  • Naming clarity
  • Single responsibility
  • Duplication
  • Test coverage
  • Documentation for non-obvious logic

Output

## Code Review: [PR title or file]

### Summary
[1-2 sentence overview of the changes and overall quality]

### Critical Issues
| # | File | Line | Issue | Severity |
|---|------|------|-------|----------|
| 1 | [file] | [line] | [description] | 🔴 Critical |

### Suggestions
| # | File | Line | Suggestion | Category |
|---|------|------|------------|----------|
| 1 | [file] | [line] | [description] | Performance |

### What Looks Good
- [Positive observations]

### Verdict
[Approve / Request Changes / Needs Discussion]

If Connectors Available

If ~~source control is connected:

  • Pull the PR diff automatically from the URL
  • Check CI status and test results

If ~~project tracker is connected:

  • Link findings to related tickets
  • Verify the PR addresses the stated requirements

If ~~knowledge base is connected:

  • Check changes against team coding standards and style guides

Tips

  1. Provide context — "This is a hot path" or "This handles PII" helps me focus.
  2. Specify concerns — "Focus on security" narrows the review.
  3. Include tests — I'll check test coverage and quality too.
提供结构化调试流程,通过复现、隔离、诊断和修复四个步骤系统化排查问题。适用于错误日志、环境差异或行为异常场景,结合监控和代码库数据定位根因并生成修复报告。
收到错误消息或堆栈跟踪 出现'在staging正常但prod异常'的情况 部署后功能失效 实际行为与预期不符且原因不明
engineering/skills/debug/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill debug -g -y
SKILL.md
Frontmatter
{
    "name": "debug",
    "description": "Structured debugging session — reproduce, isolate, diagnose, and fix. Trigger with an error message or stack trace, \"this works in staging but not prod\", \"something broke after the deploy\", or when behavior diverges from expected and the cause isn't obvious.",
    "argument-hint": "<error message or problem description>"
}

/debug

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Run a structured debugging session to find and fix issues systematically.

Usage

/debug $ARGUMENTS

How It Works

┌─────────────────────────────────────────────────────────────────┐
│                       DEBUG                                        │
├─────────────────────────────────────────────────────────────────┤
│  Step 1: REPRODUCE                                                │
│  ✓ Understand the expected vs. actual behavior                   │
│  ✓ Identify exact reproduction steps                             │
│  ✓ Determine scope (when did it start? who is affected?)        │
│                                                                    │
│  Step 2: ISOLATE                                                   │
│  ✓ Narrow down the component, service, or code path             │
│  ✓ Check recent changes (deploys, config changes, dependencies) │
│  ✓ Review logs and error messages                                │
│                                                                    │
│  Step 3: DIAGNOSE                                                  │
│  ✓ Form hypotheses and test them                                 │
│  ✓ Trace the code path                                           │
│  ✓ Identify root cause (not just symptoms)                      │
│                                                                    │
│  Step 4: FIX                                                       │
│  ✓ Propose a fix with explanation                                │
│  ✓ Consider side effects and edge cases                          │
│  ✓ Suggest tests to prevent regression                           │
└─────────────────────────────────────────────────────────────────┘

What I Need From You

Tell me about the problem. Any of these help:

  • Error message or stack trace
  • Steps to reproduce
  • What changed recently
  • Logs or screenshots
  • Expected vs. actual behavior

Output

## Debug Report: [Issue Summary]

### Reproduction
- **Expected**: [What should happen]
- **Actual**: [What happens instead]
- **Steps**: [How to reproduce]

### Root Cause
[Explanation of why the bug occurs]

### Fix
[Code changes or configuration fixes needed]

### Prevention
- [Test to add]
- [Guard to put in place]

If Connectors Available

If ~~monitoring is connected:

  • Pull logs, error rates, and metrics around the time of the issue
  • Show recent deploys and config changes that may correlate

If ~~source control is connected:

  • Identify recent commits and PRs that touched affected code paths
  • Check if the issue correlates with a specific change

If ~~project tracker is connected:

  • Search for related bug reports or known issues
  • Create a ticket for the fix once identified

Tips

  1. Share error messages exactly — Don't paraphrase. The exact text matters.
  2. Mention what changed — Recent deploys, dependency updates, and config changes are top suspects.
  3. Include context — "This works in staging but not prod" or "Only affects large payloads" narrows things fast.
生成部署前检查清单,涵盖预部署验证、执行步骤及回滚触发条件。支持根据数据库迁移、特性开关等上下文自定义,并集成CI/CD和监控工具以自动化状态检查与阈值设置,确保发布安全。
即将发布版本 涉及数据库迁移或特性开关的变更 上线前验证CI状态和审批 文档化回滚触发条件
engineering/skills/deploy-checklist/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill deploy-checklist -g -y
SKILL.md
Frontmatter
{
    "name": "deploy-checklist",
    "description": "Pre-deployment verification checklist. Use when about to ship a release, deploying a change with database migrations or feature flags, verifying CI status and approvals before going to production, or documenting rollback triggers ahead of time.",
    "argument-hint": "[service or release name]"
}

/deploy-checklist

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Generate a pre-deployment checklist to verify readiness before shipping.

Usage

/deploy-checklist $ARGUMENTS

Output

## Deploy Checklist: [Service/Release]
**Date:** [Date] | **Deployer:** [Name]

### Pre-Deploy
- [ ] All tests passing in CI
- [ ] Code reviewed and approved
- [ ] No known critical bugs in release
- [ ] Database migrations tested (if applicable)
- [ ] Feature flags configured (if applicable)
- [ ] Rollback plan documented
- [ ] On-call team notified

### Deploy
- [ ] Deploy to staging and verify
- [ ] Run smoke tests
- [ ] Deploy to production (canary if available)
- [ ] Monitor error rates and latency for 15 min
- [ ] Verify key user flows

### Post-Deploy
- [ ] Confirm metrics are nominal
- [ ] Update release notes / changelog
- [ ] Notify stakeholders
- [ ] Close related tickets

### Rollback Triggers
- Error rate exceeds [X]%
- P50 latency exceeds [X]ms
- [Critical user flow] fails

Customization

Tell me about your deploy and I'll customize the checklist:

  • "We use feature flags" → adds flag verification steps
  • "This includes a database migration" → adds migration-specific checks
  • "This is a breaking API change" → adds consumer notification steps

If Connectors Available

If ~~source control is connected:

  • Pull the release diff and list of changes
  • Verify all PRs are approved and merged

If ~~CI/CD is connected:

  • Check build and test status automatically
  • Verify pipeline is green before deploy

If ~~monitoring is connected:

  • Pre-fill rollback trigger thresholds from current baselines
  • Set up post-deploy metric watch

Tips

  1. Run before every deploy — Even routine ones. Checklists prevent "I forgot to..."
  2. Customize once, reuse — Tell me your stack and I'll remember your deploy process.
  3. Include rollback criteria — Decide when to roll back before you deploy, not during.
用于撰写和维护各类技术文档,包括README、API文档、操作手册、架构文档及入职指南。遵循清晰、实用、以读者为中心的原则,提供结构化的写作指导和最佳实践。
write docs for document this create a README write a runbook onboarding guide 需要帮助进行任何形式技术写作
engineering/skills/documentation/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill documentation -g -y
SKILL.md
Frontmatter
{
    "name": "documentation",
    "description": "Write and maintain technical documentation. Trigger with \"write docs for\", \"document this\", \"create a README\", \"write a runbook\", \"onboarding guide\", or when the user needs help with any form of technical writing — API docs, architecture docs, or operational runbooks."
}

Technical Documentation

Write clear, maintainable technical documentation for different audiences and purposes.

Document Types

README

  • What this is and why it exists
  • Quick start (< 5 minutes to first success)
  • Configuration and usage
  • Contributing guide

API Documentation

  • Endpoint reference with request/response examples
  • Authentication and error codes
  • Rate limits and pagination
  • SDK examples

Runbook

  • When to use this runbook
  • Prerequisites and access needed
  • Step-by-step procedure
  • Rollback steps
  • Escalation path

Architecture Doc

  • Context and goals
  • High-level design with diagrams
  • Key decisions and trade-offs
  • Data flow and integration points

Onboarding Guide

  • Environment setup
  • Key systems and how they connect
  • Common tasks with walkthroughs
  • Who to ask for what

Principles

  1. Write for the reader — Who is reading this and what do they need?
  2. Start with the most useful information — Don't bury the lede
  3. Show, don't tell — Code examples, commands, screenshots
  4. Keep it current — Outdated docs are worse than no docs
  5. Link, don't duplicate — Reference other docs instead of copying
用于管理从检测、分诊、沟通到事后复盘的完整事件响应工作流。支持启动新事件、更新状态及生成无指责性事后报告,涵盖严重性评估与时间线重建。
we have an incident production is down alert that needs severity assessment status update mid-incident writing a blameless postmortem after resolution
engineering/skills/incident-response/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill incident-response -g -y
SKILL.md
Frontmatter
{
    "name": "incident-response",
    "description": "Run an incident response workflow — triage, communicate, and write postmortem. Trigger with \"we have an incident\", \"production is down\", an alert that needs severity assessment, a status update mid-incident, or when writing a blameless postmortem after resolution.",
    "argument-hint": "<incident description or alert>"
}

/incident-response

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Manage an incident from detection through postmortem.

Usage

/incident-response $ARGUMENTS

Modes

/incident-response new [description]     # Start a new incident
/incident-response update [status]       # Post a status update
/incident-response postmortem            # Generate postmortem from incident data

If no mode is specified, ask what phase the incident is in.

How It Works

┌─────────────────────────────────────────────────────────────────┐
│                    INCIDENT RESPONSE                               │
├─────────────────────────────────────────────────────────────────┤
│  Phase 1: TRIAGE                                                  │
│  ✓ Assess severity (SEV1-4)                                     │
│  ✓ Identify affected systems and users                          │
│  ✓ Assign roles (IC, comms, responders)                         │
│                                                                    │
│  Phase 2: COMMUNICATE                                              │
│  ✓ Draft internal status update                                  │
│  ✓ Draft customer communication (if needed)                     │
│  ✓ Set up war room and cadence                                   │
│                                                                    │
│  Phase 3: MITIGATE                                                 │
│  ✓ Document mitigation steps taken                               │
│  ✓ Track timeline of events                                      │
│  ✓ Confirm resolution                                            │
│                                                                    │
│  Phase 4: POSTMORTEM                                               │
│  ✓ Blameless postmortem document                                 │
│  ✓ Timeline reconstruction                                       │
│  ✓ Root cause analysis (5 whys)                                  │
│  ✓ Action items with owners                                      │
└─────────────────────────────────────────────────────────────────┘

Severity Classification

Level Criteria Response Time
SEV1 Service down, all users affected Immediate, all-hands
SEV2 Major feature degraded, many users affected Within 15 min
SEV3 Minor feature issue, some users affected Within 1 hour
SEV4 Cosmetic or low-impact issue Next business day

Communication Guidance

Provide clear, factual updates at regular cadence. Include: what's happening, who's affected, what we're doing, when the next update is.

Output — Status Update

## Incident Update: [Title]
**Severity:** SEV[1-4] | **Status:** Investigating | Identified | Monitoring | Resolved
**Impact:** [Who/what is affected]
**Last Updated:** [Timestamp]

### Current Status
[What we know now]

### Actions Taken
- [Action 1]
- [Action 2]

### Next Steps
- [What's happening next and ETA]

### Timeline
| Time | Event |
|------|-------|
| [HH:MM] | [Event] |

Output — Postmortem

## Postmortem: [Incident Title]
**Date:** [Date] | **Duration:** [X hours] | **Severity:** SEV[X]
**Authors:** [Names] | **Status:** Draft

### Summary
[2-3 sentence plain-language summary]

### Impact
- [Users affected]
- [Duration of impact]
- [Business impact if quantifiable]

### Timeline
| Time (UTC) | Event |
|------------|-------|
| [HH:MM] | [Event] |

### Root Cause
[Detailed explanation of what caused the incident]

### 5 Whys
1. Why did [symptom]? → [Because...]
2. Why did [cause 1]? → [Because...]
3. Why did [cause 2]? → [Because...]
4. Why did [cause 3]? → [Because...]
5. Why did [cause 4]? → [Root cause]

### What Went Well
- [Things that worked]

### What Went Poorly
- [Things that didn't work]

### Action Items
| Action | Owner | Priority | Due Date |
|--------|-------|----------|----------|
| [Action] | [Person] | P0/P1/P2 | [Date] |

### Lessons Learned
[Key takeaways for the team]

If Connectors Available

If ~~monitoring is connected:

  • Pull alert details and metrics
  • Show graphs of affected metrics

If ~~incident management is connected:

  • Create or update incident in PagerDuty/Opsgenie
  • Page on-call responders

If ~~chat is connected:

  • Post status updates to incident channel
  • Create war room channel

Tips

  1. Start writing immediately — Don't wait for complete information. Update as you learn more.
  2. Keep updates factual — What we know, what we've done, what's next. No speculation.
  3. Postmortems are blameless — Focus on systems and processes, not individuals.
用于生成每日站会更新。支持自动连接工具拉取提交、PR和工单状态,或基于用户提供的粗略笔记结构化整理为昨日完成、今日计划及阻塞项,并适配不同分享格式。
准备每日站会发言 总结昨天的代码提交和PR 将零散的工作笔记整理为结构化的站会报告 查询工单状态变更
engineering/skills/standup/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill standup -g -y
SKILL.md
Frontmatter
{
    "name": "standup",
    "description": "Generate a standup update from recent activity. Use when preparing for daily standup, summarizing yesterday's commits and PRs and ticket moves, formatting work into yesterday\/today\/blockers, or structuring a few rough notes into a shareable update.",
    "argument-hint": "[yesterday | today | blockers]"
}

/standup

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Generate a standup update by pulling together recent activity across your tools.

How It Works

┌─────────────────────────────────────────────────────────────────┐
│                        STANDUP                                    │
├─────────────────────────────────────────────────────────────────┤
│  STANDALONE (always works)                                       │
│  ✓ Tell me what you worked on and I'll structure it             │
│  ✓ Format for daily standup (yesterday / today / blockers)      │
│  ✓ Keep it concise and action-oriented                          │
├─────────────────────────────────────────────────────────────────┤
│  SUPERCHARGED (when you connect your tools)                      │
│  + Source control: Recent commits and PRs                        │
│  + Project tracker: Ticket status changes                        │
│  + Chat: Relevant discussions and decisions                      │
│  + CI/CD: Build and deploy status                                │
└─────────────────────────────────────────────────────────────────┘

What I Need From You

Option A: Let me pull it If your tools are connected, just say /standup and I'll gather everything automatically.

Option B: Tell me what you did "Worked on the auth migration, reviewed 3 PRs, got blocked on the API rate limiting issue."

Output

## Standup — [Date]

### Yesterday
- [Completed item with ticket reference if available]
- [Completed item]

### Today
- [Planned item with ticket reference]
- [Planned item]

### Blockers
- [Blocker with context and who can help]

If Connectors Available

If ~~source control is connected:

  • Pull recent commits and PRs (opened, reviewed, merged)
  • Summarize code changes at a high level

If ~~project tracker is connected:

  • Pull tickets moved to "in progress" or "done"
  • Show upcoming sprint items

If ~~chat is connected:

  • Scan for relevant discussions and decisions
  • Flag threads needing your response

Tips

  1. Run it every morning — Build a habit and never scramble for standup notes.
  2. Add context — After I generate, add any nuance about blockers or priorities.
  3. Share format — Ask me to format for Slack, email, or your team's standup tool.
用于系统设计、服务架构规划及API设计的专业技能。涵盖需求分析、高层设计、深度细节、扩展可靠性评估及权衡分析,帮助用户构建清晰、可扩展的系统架构方案。
design a system for how should we architect system design for what's the right architecture for API design data modeling service boundaries
engineering/skills/system-design/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill system-design -g -y
SKILL.md
Frontmatter
{
    "name": "system-design",
    "description": "Design systems, services, and architectures. Trigger with \"design a system for\", \"how should we architect\", \"system design for\", \"what's the right architecture for\", or when the user needs help with API design, data modeling, or service boundaries."
}

System Design

Help design systems and evaluate architectural decisions.

Framework

1. Requirements Gathering

  • Functional requirements (what it does)
  • Non-functional requirements (scale, latency, availability, cost)
  • Constraints (team size, timeline, existing tech stack)

2. High-Level Design

  • Component diagram
  • Data flow
  • API contracts
  • Storage choices

3. Deep Dive

  • Data model design
  • API endpoint design (REST, GraphQL, gRPC)
  • Caching strategy
  • Queue/event design
  • Error handling and retry logic

4. Scale and Reliability

  • Load estimation
  • Horizontal vs. vertical scaling
  • Failover and redundancy
  • Monitoring and alerting

5. Trade-off Analysis

  • Every decision has trade-offs. Make them explicit.
  • Consider: complexity, cost, team familiarity, time to market, maintainability

Output

Produce clear, structured design documents with diagrams (ASCII or described), explicit assumptions, and trade-off analysis. Always identify what you'd revisit as the system grows.

识别、分类并优先处理技术债务。支持按代码、架构等六类分析,基于影响、风险和 effort 计算优先级,输出包含业务理由的渐进式修复计划。
tech debt technical debt audit what should we refactor code health code quality refactoring priorities maintenance backlog
engineering/skills/tech-debt/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill tech-debt -g -y
SKILL.md
Frontmatter
{
    "name": "tech-debt",
    "description": "Identify, categorize, and prioritize technical debt. Trigger with \"tech debt\", \"technical debt audit\", \"what should we refactor\", \"code health\", or when the user asks about code quality, refactoring priorities, or maintenance backlog."
}

Tech Debt Management

Systematically identify, categorize, and prioritize technical debt.

Categories

Type Examples Risk
Code debt Duplicated logic, poor abstractions, magic numbers Bugs, slow development
Architecture debt Monolith that should be split, wrong data store Scaling limits
Test debt Low coverage, flaky tests, missing integration tests Regressions ship
Dependency debt Outdated libraries, unmaintained dependencies Security vulns
Documentation debt Missing runbooks, outdated READMEs, tribal knowledge Onboarding pain
Infrastructure debt Manual deploys, no monitoring, no IaC Incidents, slow recovery

Prioritization Framework

Score each item on:

  • Impact: How much does it slow the team down? (1-5)
  • Risk: What happens if we don't fix it? (1-5)
  • Effort: How hard is the fix? (1-5, inverted — lower effort = higher priority)

Priority = (Impact + Risk) x (6 - Effort)

Output

Produce a prioritized list with estimated effort, business justification for each item, and a phased remediation plan that can be done alongside feature work.

设计平衡覆盖率、速度与维护性的测试策略与计划。根据组件类型(API、数据管道、前端、基础设施)推荐具体测试方法,明确测试重点与排除项,输出包含覆盖目标及示例的测试方案。
用户询问如何测试或需要测试策略建议 用户请求编写特定功能的测试计划或测试用例
engineering/skills/testing-strategy/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill testing-strategy -g -y
SKILL.md
Frontmatter
{
    "name": "testing-strategy",
    "description": "Design test strategies and test plans. Trigger with \"how should we test\", \"test strategy for\", \"write tests for\", \"test plan\", \"what tests do we need\", or when the user needs help with testing approaches, coverage, or test architecture."
}

Testing Strategy

Design effective testing strategies balancing coverage, speed, and maintenance.

Testing Pyramid

        /  E2E  \         Few, slow, high confidence
       / Integration \     Some, medium speed
      /    Unit Tests  \   Many, fast, focused

Strategy by Component Type

  • API endpoints: Unit tests for business logic, integration tests for HTTP layer, contract tests for consumers
  • Data pipelines: Input validation, transformation correctness, idempotency tests
  • Frontend: Component tests, interaction tests, visual regression, accessibility
  • Infrastructure: Smoke tests, chaos engineering, load tests

What to Cover

Focus on: business-critical paths, error handling, edge cases, security boundaries, data integrity.

Skip: trivial getters/setters, framework code, one-off scripts.

Output

Produce a test plan with: what to test, test type for each area, coverage targets, and example test cases. Identify gaps in existing coverage.

扫描所有已连接数据源(如聊天、邮件、任务等)的近期活动,提取关键事项、决策和提及内容,并按主题或项目整合生成结构化日报或周报,帮助用户快速回顾进展与待办。
用户希望获取每日或每周的活动摘要 用户长时间离线后需要快速了解动态 用户想要总结特定时间段内的决策和文档更新
enterprise-search/skills/digest/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill digest -g -y
SKILL.md
Frontmatter
{
    "name": "digest",
    "description": "Generate a daily or weekly digest of activity across all connected sources. Use when catching up after time away, starting the day and wanting a summary of mentions and action items, or reviewing a week's decisions and document updates grouped by project.",
    "argument-hint": "[--daily | --weekly | --since <date>]"
}

Digest Command

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Scan recent activity across all connected sources and generate a structured digest highlighting what matters.

Instructions

1. Parse Flags

Determine the time window from the user's input:

  • --daily — Last 24 hours (default if no flag specified)
  • --weekly — Last 7 days

The user may also specify a custom range:

  • --since yesterday
  • --since Monday
  • --since 2025-01-20

2. Check Available Sources

Identify which MCP sources are connected (same approach as the search command):

  • ~~chat — channels, DMs, mentions
  • ~~email — inbox, sent, threads
  • ~~cloud storage — recently modified docs shared with user
  • ~~project tracker — tasks assigned, completed, commented on
  • ~~CRM — opportunity updates, account activity
  • ~~knowledge base — recently updated wiki pages

If no sources are connected, guide the user:

To generate a digest, you'll need at least one source connected.
Check your MCP settings to add ~~chat, ~~email, ~~cloud storage, or other tools.

3. Gather Activity from Each Source

~~chat:

  • Search for messages mentioning the user (to:me)
  • Check channels the user is in for recent activity
  • Look for threads the user participated in
  • Identify new messages in key channels

~~email:

  • Search recent inbox messages
  • Identify threads with new replies
  • Flag emails with action items or questions directed at the user

~~cloud storage:

  • Find documents recently modified or shared with the user
  • Note new comments on docs the user owns or collaborates on

~~project tracker:

  • Tasks assigned to the user (new or updated)
  • Tasks completed by others that the user follows
  • Comments on tasks the user is involved with

~~CRM:

  • Opportunity stage changes
  • New activities logged on accounts the user owns
  • Updated contacts or accounts

~~knowledge base:

  • Recently updated documents in relevant collections
  • New documents created in watched areas

4. Identify Key Items

From all gathered activity, extract and categorize:

Action Items:

  • Direct requests made to the user ("Can you...", "Please...", "@user")
  • Tasks assigned or due soon
  • Questions awaiting the user's response
  • Review requests

Decisions:

  • Conclusions reached in threads or emails
  • Approvals or rejections
  • Policy or direction changes

Mentions:

  • Times the user was mentioned or referenced
  • Discussions about the user's projects or areas

Updates:

  • Status changes on projects the user follows
  • Document updates in the user's domain
  • Completed items the user was waiting on

5. Group by Topic

Organize the digest by topic, project, or theme rather than by source. Merge related activity across sources:

## Project Aurora
- ~~chat: Design review thread concluded — team chose Option B (#design, Tuesday)
- ~~email: Sarah sent updated spec incorporating feedback (Wednesday)
- ~~cloud storage: "Aurora API Spec v3" updated by Sarah (Wednesday)
- ~~project tracker: 3 tasks moved to In Progress, 2 completed

## Budget Planning
- ~~email: Finance team requesting Q2 projections by Friday
- ~~chat: Todd shared template in #finance (Monday)
- ~~cloud storage: "Q2 Budget Template" shared with you (Monday)

6. Format the Digest

Structure the output clearly:

# [Daily/Weekly] Digest — [Date or Date Range]

Sources scanned: ~~chat, ~~email, ~~cloud storage, [others]

## Action Items (X items)
- [ ] [Action item 1] — from [person], [source] ([date])
- [ ] [Action item 2] — from [person], [source] ([date])

## Decisions Made
- [Decision 1] — [context] ([source], [date])
- [Decision 2] — [context] ([source], [date])

## [Topic/Project Group 1]
[Activity summary with source attribution]

## [Topic/Project Group 2]
[Activity summary with source attribution]

## Mentions
- [Mention context] — [source] ([date])

## Documents Updated
- [Doc name] — [who modified, what changed] ([date])

7. Handle Unavailable Sources

If any source fails or is unreachable:

Note: Could not reach [source name] for this digest.
The following sources were included: [list of successful sources].

Do not let one failed source prevent the digest from being generated. Produce the best digest possible from available sources.

8. Summary Stats

End with a quick summary:

---
[X] action items · [Y] decisions · [Z] mentions · [W] doc updates
Across [N] sources · Covering [time range]

Notes

  • Default to --daily if no flag is specified
  • Group by topic/project, not by source — users care about what happened, not where it happened
  • Action items should always be listed first — they are the most actionable part of a digest
  • Deduplicate cross-source activity (same decision in ~~chat and email = one entry)
  • For weekly digests, prioritize significance over completeness — highlight what matters, skip noise
  • If the user has a memory system (CLAUDE.md), use it to decode people names and project references
  • Include enough context in each item that the user can decide whether to dig deeper without clicking through
将多源搜索结果整合为连贯、去重且带来源引用的答案。支持跨源去重、优先级排序及置信度评分,确保企业搜索结果的准确性与可追溯性。
需要综合多个数据源信息生成总结时 处理包含重复或冲突信息的搜索结果时 要求提供详细来源引用和可信度评估时
enterprise-search/skills/knowledge-synthesis/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill knowledge-synthesis -g -y
SKILL.md
Frontmatter
{
    "name": "knowledge-synthesis",
    "description": "Combines search results from multiple sources into coherent, deduplicated answers with source attribution. Handles confidence scoring based on freshness and authority, and summarizes large result sets effectively.",
    "user-invocable": false
}

Knowledge Synthesis

The last mile of enterprise search. Takes raw results from multiple sources and produces a coherent, trustworthy answer.

The Goal

Transform this:

~~chat result: "Sarah said in #eng: 'let's go with REST, GraphQL is overkill for our use case'"
~~email result: "Subject: API Decision — Sarah's email confirming REST approach with rationale"
~~cloud storage result: "API Design Doc v3 — updated section 2 to reflect REST decision"
~~project tracker result: "Task: Finalize API approach — marked complete by Sarah"

Into this:

The team decided to go with REST over GraphQL for the API redesign. Sarah made the
call, noting that GraphQL was overkill for the current use case. This was discussed
in #engineering on Tuesday, confirmed via email Wednesday, and the design doc has
been updated to reflect the decision. The related ~~project tracker task is marked complete.

Sources:
- ~~chat: #engineering thread (Jan 14)
- ~~email: "API Decision" from Sarah (Jan 15)
- ~~cloud storage: "API Design Doc v3" (updated Jan 15)
- ~~project tracker: "Finalize API approach" (completed Jan 15)

Deduplication

Cross-Source Deduplication

The same information often appears in multiple places. Identify and merge duplicates:

Signals that results are about the same thing:

  • Same or very similar text content
  • Same author/sender
  • Timestamps within a short window (same day or adjacent days)
  • References to the same entity (project name, document, decision)
  • One source references another ("as discussed in ~~chat", "per the email", "see the doc")

How to merge:

  • Combine into a single narrative item
  • Cite all sources where it appeared
  • Use the most complete version as the primary text
  • Add unique details from each source

Deduplication Priority

When the same information exists in multiple sources, prefer:

1. The most complete version (fullest context)
2. The most authoritative source (official doc > chat)
3. The most recent version (latest update wins for evolving info)

What NOT to Deduplicate

Keep as separate items when:

  • The same topic is discussed but with different conclusions
  • Different people express different viewpoints
  • The information evolved meaningfully between sources (v1 vs v2 of a decision)
  • Different time periods are represented

Citation and Source Attribution

Every claim in the synthesized answer must be attributable to a source.

Attribution Format

Inline for direct references:

Sarah confirmed the REST approach in her email on Wednesday.
The design doc was updated to reflect this (~~cloud storage: "API Design Doc v3").

Source list at the end for completeness:

Sources:
- ~~chat: #engineering discussion (Jan 14) — initial decision thread
- ~~email: "API Decision" from Sarah Chen (Jan 15) — formal confirmation
- ~~cloud storage: "API Design Doc v3" last modified Jan 15 — updated specification

Attribution Rules

  • Always name the source type (~~chat, ~~email, ~~cloud storage, etc.)
  • Include the specific location (channel, folder, thread)
  • Include the date or relative time
  • Include the author when relevant
  • Include document/thread titles when available
  • For ~~chat, note the channel name
  • For ~~email, note the subject line and sender
  • For ~~cloud storage, note the document title

Confidence Levels

Not all results are equally trustworthy. Assess confidence based on:

Freshness

Recency Confidence impact
Today / yesterday High confidence for current state
This week Good confidence
This month Moderate — things may have changed
Older than a month Lower confidence — flag as potentially outdated

For status queries, heavily weight freshness. For policy/factual queries, freshness matters less.

Authority

Source type Authority level
Official wiki / knowledge base Highest — curated, maintained
Shared documents (final versions) High — intentionally published
Email announcements High — formal communication
Meeting notes Moderate-high — may be incomplete
Chat messages (thread conclusions) Moderate — informal but real-time
Chat messages (mid-thread) Lower — may not reflect final position
Draft documents Low — not finalized
Task comments Contextual — depends on commenter

Expressing Confidence

When confidence is high (multiple fresh, authoritative sources agree):

The team decided to use REST for the API redesign. [direct statement]

When confidence is moderate (single source or somewhat dated):

Based on the discussion in #engineering last month, the team was leaning
toward REST for the API redesign. This may have evolved since then.

When confidence is low (old data, informal source, or conflicting signals):

I found a reference to an API migration discussion from three months ago
in ~~chat, but I couldn't find a formal decision document. The information
may be outdated. You might want to check with the team for current status.

Conflicting Information

When sources disagree:

I found conflicting information about the API approach:
- The ~~chat discussion on Jan 10 suggested GraphQL
- But Sarah's email on Jan 15 confirmed REST
- The design doc (updated Jan 15) reflects REST

The most recent sources indicate REST was the final decision,
but the earlier ~~chat discussion explored GraphQL first.

Always surface conflicts rather than silently picking one version.

Summarization Strategies

For Small Result Sets (1-5 results)

Present each result with context. No summarization needed — give the user everything:

[Direct answer synthesized from results]

[Detail from source 1]
[Detail from source 2]

Sources: [full attribution]

For Medium Result Sets (5-15 results)

Group by theme and summarize each group:

[Overall answer]

Theme 1: [summary of related results]
Theme 2: [summary of related results]

Key sources: [top 3-5 most relevant sources]
Full results: [count] items found across [sources]

For Large Result Sets (15+ results)

Provide a high-level synthesis with the option to drill down:

[Overall answer based on most relevant results]

Summary:
- [Key finding 1] (supported by N sources)
- [Key finding 2] (supported by N sources)
- [Key finding 3] (supported by N sources)

Top sources:
- [Most authoritative/relevant source]
- [Second most relevant]
- [Third most relevant]

Found [total count] results across [source list].
Want me to dig deeper into any specific aspect?

Summarization Rules

  • Lead with the answer, not the search process
  • Do not list raw results — synthesize them into narrative
  • Group related items from different sources together
  • Preserve important nuance and caveats
  • Include enough detail that the user can decide whether to dig deeper
  • Always offer to provide more detail if the result set was large

Synthesis Workflow

[Raw results from all sources]
          ↓
[1. Deduplicate — merge same info from different sources]
          ↓
[2. Cluster — group related results by theme/topic]
          ↓
[3. Rank — order clusters and items by relevance to query]
          ↓
[4. Assess confidence — freshness × authority × agreement]
          ↓
[5. Synthesize — produce narrative answer with attribution]
          ↓
[6. Format — choose appropriate detail level for result count]
          ↓
[Coherent answer with sources]

Anti-Patterns

Do not:

  • List results source by source ("From ~~chat: ... From ~~email: ... From ~~cloud storage: ...")
  • Include irrelevant results just because they matched a keyword
  • Bury the answer under methodology explanation
  • Present conflicting info without flagging the conflict
  • Omit source attribution
  • Present uncertain information with the same confidence as well-supported facts
  • Summarize so aggressively that useful detail is lost

Do:

  • Lead with the answer
  • Group by topic, not by source
  • Flag confidence levels when appropriate
  • Surface conflicts explicitly
  • Attribute all claims to sources
  • Offer to go deeper when result sets are large
将自然语言问题分解并编排至多数据源并行搜索。根据查询类型(决策、状态等)提取关键词与实体,生成语义或关键字子查询,整合去重后返回综合答案,处理歧义与回退策略。
用户询问项目状态或进度 用户查找特定文档或政策 用户询问人员职责或协作情况 用户进行探索性知识检索 需要跨多个数据源综合信息
enterprise-search/skills/search-strategy/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill search-strategy -g -y
SKILL.md
Frontmatter
{
    "name": "search-strategy",
    "description": "Query decomposition and multi-source search orchestration. Breaks natural language questions into targeted searches per source, translates queries into source-specific syntax, ranks results by relevance, and handles ambiguity and fallback strategies.",
    "user-invocable": false
}

Search Strategy

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

The core intelligence behind enterprise search. Transforms a single natural language question into parallel, source-specific searches and produces ranked, deduplicated results.

The Goal

Turn this:

"What did we decide about the API migration timeline?"

Into targeted searches across every connected source:

~~chat:  "API migration timeline decision" (semantic) + "API migration" in:#engineering after:2025-01-01
~~knowledge base: semantic search "API migration timeline decision"
~~project tracker:  text search "API migration" in relevant workspace

Then synthesize the results into a single coherent answer.

Query Decomposition

Step 1: Identify Query Type

Classify the user's question to determine search strategy:

Query Type Example Strategy
Decision "What did we decide about X?" Prioritize conversations (~~chat, email), look for conclusion signals
Status "What's the status of Project Y?" Prioritize recent activity, task trackers, status updates
Document "Where's the spec for Z?" Prioritize Drive, wiki, shared docs
Person "Who's working on X?" Search task assignments, message authors, doc collaborators
Factual "What's our policy on X?" Prioritize wiki, official docs, then confirmatory conversations
Temporal "When did X happen?" Search with broad date range, look for timestamps
Exploratory "What do we know about X?" Broad search across all sources, synthesize

Step 2: Extract Search Components

From the query, extract:

  • Keywords: Core terms that must appear in results
  • Entities: People, projects, teams, tools (use memory system if available)
  • Intent signals: Decision words, status words, temporal markers
  • Constraints: Time ranges, source hints, author filters
  • Negations: Things to exclude

Step 3: Generate Sub-Queries Per Source

For each available source, create one or more targeted queries:

Prefer semantic search for:

  • Conceptual questions ("What do we think about...")
  • Questions where exact keywords are unknown
  • Exploratory queries

Prefer keyword search for:

  • Known terms, project names, acronyms
  • Exact phrases the user quoted
  • Filter-heavy queries (from:, in:, after:)

Generate multiple query variants when the topic might be referred to differently:

User: "Kubernetes setup"
Queries: "Kubernetes", "k8s", "cluster", "container orchestration"

Source-Specific Query Translation

~~chat

Semantic search (natural language questions):

query: "What is the status of project aurora?"

Keyword search:

query: "project aurora status update"
query: "aurora in:#engineering after:2025-01-15"
query: "from:<@UserID> aurora"

Filter mapping:

Enterprise filter ~~chat syntax
from:sarah from:sarah or from:<@USERID>
in:engineering in:engineering
after:2025-01-01 after:2025-01-01
before:2025-02-01 before:2025-02-01
type:thread is:thread
type:file has:file

~~knowledge base (Wiki)

Semantic search — Use for conceptual queries:

descriptive_query: "API migration timeline and decision rationale"

Keyword search — Use for exact terms:

query: "API migration"
query: "\"API migration timeline\""  (exact phrase)

~~project tracker

Task search:

text: "API migration"
workspace: [workspace_id]
completed: false  (for status queries)
assignee_any: "me"  (for "my tasks" queries)

Filter mapping:

Enterprise filter ~~project tracker parameter
from:sarah assignee_any or created_by_any
after:2025-01-01 modified_on_after: "2025-01-01"
type:milestone resource_subtype: "milestone"

Result Ranking

Relevance Scoring

Score each result on these factors (weighted by query type):

Factor Weight (Decision) Weight (Status) Weight (Document) Weight (Factual)
Keyword match 0.3 0.2 0.4 0.3
Freshness 0.3 0.4 0.2 0.1
Authority 0.2 0.1 0.3 0.4
Completeness 0.2 0.3 0.1 0.2

Authority Hierarchy

Depends on query type:

For factual/policy questions:

Wiki/Official docs > Shared documents > Email announcements > Chat messages

For "what happened" / decision questions:

Meeting notes > Thread conclusions > Email confirmations > Chat messages

For status questions:

Task tracker > Recent chat > Status docs > Email updates

Handling Ambiguity

When a query is ambiguous, prefer asking one focused clarifying question over guessing:

Ambiguous: "search for the migration"
→ "I found references to a few migrations. Are you looking for:
   1. The database migration (Project Phoenix)
   2. The cloud migration (AWS → GCP)
   3. The email migration (Exchange → O365)"

Only ask for clarification when:

  • There are genuinely distinct interpretations that would produce very different results
  • The ambiguity would significantly affect which sources to search

Do NOT ask for clarification when:

  • The query is clear enough to produce useful results
  • Minor ambiguity can be resolved by returning results from multiple interpretations

Fallback Strategies

When a source is unavailable or returns no results:

  1. Source unavailable: Skip it, search remaining sources, note the gap
  2. No results from a source: Try broader query terms, remove date filters, try alternate keywords
  3. All sources return nothing: Suggest query modifications to the user
  4. Rate limited: Note the limitation, return results from other sources, suggest retrying later

Query Broadening

If initial queries return too few results:

Original: "PostgreSQL migration Q2 timeline decision"
Broader:  "PostgreSQL migration"
Broader:  "database migration"
Broadest: "migration"

Remove constraints in this order:

  1. Date filters (search all time)
  2. Source/location filters
  3. Less important keywords
  4. Keep only core entity/topic terms

Parallel Execution

Always execute searches across sources in parallel, never sequentially. The total search time should be roughly equal to the slowest single source, not the sum of all sources.

[User query]
     ↓ decompose
[~~chat query] [~~email query] [~~cloud storage query] [Wiki query] [~~project tracker query]
     ↓            ↓            ↓              ↓            ↓
  (parallel execution)
     ↓
[Merge + Rank + Deduplicate]
     ↓
[Synthesized answer]
管理企业搜索的MCP数据源连接。检测可用源,指导用户连接新源,根据查询类型(决策、状态、文档、人员)优化搜索优先级,并处理速率限制。
检查已连接的数据源 用户需要连接新的数据源 执行特定类型的搜索查询
enterprise-search/skills/source-management/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill source-management -g -y
SKILL.md
Frontmatter
{
    "name": "source-management",
    "description": "Manages connected MCP sources for enterprise search. Detects available sources, guides users to connect new ones, handles source priority ordering, and manages rate limiting awareness.",
    "user-invocable": false
}

Source Management

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Knows what sources are available, helps connect new ones, and manages how sources are queried.

Checking Available Sources

Determine which MCP sources are connected by checking available tools. Each source corresponds to a set of MCP tools:

Source Key capabilities
~~chat Search messages, read channels and threads
~~email Search messages, read individual emails
~~cloud storage Search files, fetch document contents
~~project tracker Search tasks, typeahead search
~~CRM Query records (accounts, contacts, opportunities)
~~knowledge base Semantic search, keyword search

If a tool prefix is available, the source is connected and searchable.

Guiding Users to Connect Sources

When a user searches but has few or no sources connected:

You currently have [N] source(s) connected: [list].

To expand your search, you can connect additional sources in your MCP settings:
- ~~chat — messages, threads, channels
- ~~email — emails, conversations, attachments
- ~~cloud storage — docs, sheets, slides
- ~~project tracker — tasks, projects, milestones
- ~~CRM — accounts, contacts, opportunities
- ~~knowledge base — wiki pages, knowledge base articles

The more sources you connect, the more complete your search results.

When a user asks about a specific tool that is not connected:

[Tool name] isn't currently connected. To add it:
1. Open your MCP settings
2. Add the [tool] MCP server configuration
3. Authenticate when prompted

Once connected, it will be automatically included in future searches.

Source Priority Ordering

Different query types benefit from searching certain sources first. Use these priorities to weight results, not to skip sources:

By Query Type

Decision queries ("What did we decide..."):

1. ~~chat (conversations where decisions happen)
2. ~~email (decision confirmations, announcements)
3. ~~cloud storage (meeting notes, decision logs)
4. Wiki (if decisions are documented)
5. Task tracker (if decisions are captured in tasks)

Status queries ("What's the status of..."):

1. Task tracker (~~project tracker — authoritative status)
2. ~~chat (real-time discussion)
3. ~~cloud storage (status docs, reports)
4. ~~email (status update emails)
5. Wiki (project pages)

Document queries ("Where's the doc for..."):

1. ~~cloud storage (primary doc storage)
2. Wiki / ~~knowledge base (knowledge base)
3. ~~email (docs shared via email)
4. ~~chat (docs shared in channels)
5. Task tracker (docs linked to tasks)

People queries ("Who works on..." / "Who knows about..."):

1. ~~chat (message authors, channel members)
2. Task tracker (task assignees)
3. ~~cloud storage (doc authors, collaborators)
4. ~~CRM (account owners, contacts)
5. ~~email (email participants)

Factual/Policy queries ("What's our policy on..."):

1. Wiki / ~~knowledge base (official documentation)
2. ~~cloud storage (policy docs, handbooks)
3. ~~email (policy announcements)
4. ~~chat (policy discussions)

Default Priority (General Queries)

When query type is unclear:

1. ~~chat (highest volume, most real-time)
2. ~~email (formal communications)
3. ~~cloud storage (documents and files)
4. Wiki / ~~knowledge base (structured knowledge)
5. Task tracker (work items)
6. CRM (customer data)

Rate Limiting Awareness

MCP sources may have rate limits. Handle them gracefully:

Detection

Rate limit responses typically appear as:

  • HTTP 429 responses
  • Error messages mentioning "rate limit", "too many requests", or "quota exceeded"
  • Throttled or delayed responses

Handling

When a source is rate limited:

  1. Do not retry immediately — respect the limit
  2. Continue with other sources — do not block the entire search
  3. Inform the user:
Note: [Source] is temporarily rate limited. Results below are from
[other sources]. You can retry in a few minutes to include [source].
  1. For digests — if rate limited mid-scan, note which time range was covered before the limit hit

Prevention

  • Avoid unnecessary API calls — check if the source is likely to have relevant results before querying
  • Use targeted queries over broad scans when possible
  • For digests, batch requests where the API supports it
  • Cache awareness: if a search was just run, avoid re-running the same query immediately

Source Health

Track source availability during a session:

Source Status:
  ~~chat:        ✓ Available
  ~~email:        ✓ Available
  ~~cloud storage:  ✓ Available
  ~~project tracker:        ✗ Not connected
  ~~CRM:   ✗ Not connected
  ~~knowledge base:      ⚠ Rate limited (retry in 2 min)

When reporting search results, include which sources were searched so the user knows the scope of the answer.

Adding Custom Sources

The enterprise search plugin works with any MCP-connected source. As new MCP servers become available, they can be added to the .mcp.json configuration. The search and digest commands will automatically detect and include new sources based on available tools.

To add a new source:

  1. Add the MCP server configuration to .mcp.json
  2. Authenticate if required
  3. The source will be included in subsequent searches automatically
辅助SOX 404合规,提供控制测试方法、样本选择、文档标准及缺陷分类支持。用于生成审计工作底稿、准备内外部审计及评估内控有效性,需专业人员复核。
生成审计测试工作底稿 选择审计样本 分类控制缺陷 准备内部或外部审计
finance/skills/audit-support/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill audit-support -g -y
SKILL.md
Frontmatter
{
    "name": "audit-support",
    "description": "Support SOX 404 compliance with control testing methodology, sample selection, and documentation standards. Use when generating testing workpapers, selecting audit samples, classifying control deficiencies, or preparing for internal or external audits.",
    "user-invocable": false
}

Audit Support

Important: This skill assists with SOX compliance workflows but does not provide audit or legal advice. All testing workpapers and assessments should be reviewed by qualified financial professionals. While "significance" and "materiality" are context-specific concepts that are ultimately assessed by auditors, this skill is intended to assist professionals in the creation and evaluation of effective internal controls and documentation for audits.

SOX 404 control testing methodology, sample selection approaches, testing documentation standards, control deficiency classification, and common control types.

SOX 404 Control Testing Methodology

Overview

SOX Section 404 requires management to assess the effectiveness of internal controls over financial reporting (ICFR). This involves:

  1. Scoping: Identify significant accounts and relevant assertions
  2. Risk assessment: Evaluate the risk of material misstatement for each significant account
  3. Control identification: Document the controls that address each risk
  4. Testing: Test the design and operating effectiveness of key controls
  5. Evaluation: Assess whether any deficiencies exist and their severity
  6. Reporting: Document the assessment and any material weaknesses

Scoping Significant Accounts

An account is significant if there is more than a remote likelihood that it could contain a misstatement that is material (individually or in aggregate).

Quantitative factors:

  • Account balance exceeds materiality threshold (typically 3-5% of a key benchmark)
  • Transaction volume is high, increasing the risk of error
  • Account is subject to significant estimates or judgment

Qualitative factors:

  • Account involves complex accounting (revenue recognition, derivatives, pensions)
  • Account is susceptible to fraud (cash, revenue, related-party transactions)
  • Account has had prior misstatements or audit adjustments
  • Account involves significant management judgment or estimates
  • New account or significantly changed process

Relevant Assertions by Account Type

Account Type Key Assertions
Revenue Occurrence, Completeness, Accuracy, Cut-off
Accounts Receivable Existence, Valuation (allowance), Rights
Inventory Existence, Valuation, Completeness
Fixed Assets Existence, Valuation, Completeness, Rights
Accounts Payable Completeness, Accuracy, Existence
Accrued Liabilities Completeness, Valuation, Accuracy
Equity Completeness, Accuracy, Presentation
Financial Close/Reporting Presentation, Accuracy, Completeness

Design Effectiveness vs Operating Effectiveness

Design effectiveness: Is the control properly designed to prevent or detect a material misstatement in the relevant assertion?

  • Evaluated through walkthroughs (trace a transaction end-to-end through the process)
  • Confirm the control is placed at the right point in the process
  • Confirm the control addresses the identified risk
  • Performed at least annually, or when processes change

Operating effectiveness: Did the control actually operate as designed throughout the testing period?

  • Evaluated through testing (inspection, observation, re-performance, inquiry)
  • Requires sufficient sample sizes to support a conclusion
  • Must cover the full period of reliance

Sample Selection Approaches

Random Selection

When to use: Default method for transaction-level controls with large populations.

Method:

  1. Define the population (all transactions subject to the control during the period)
  2. Number each item in the population sequentially
  3. Use a random number generator to select sample items
  4. Ensure no bias in selection (all items have equal probability)

Advantages: Statistically valid, defensible, no selection bias Disadvantages: May miss high-risk items, requires complete population listing

Targeted (Judgmental) Selection

When to use: Supplement to random selection for risk-based testing; primary method when population is small or highly varied.

Method:

  1. Identify items with specific risk characteristics:
    • High dollar amount (above a defined threshold)
    • Unusual or non-standard transactions
    • Period-end transactions (cut-off risk)
    • Related-party transactions
    • Manual or override transactions
    • New vendor/customer transactions
  2. Select items matching risk criteria
  3. Document rationale for each targeted selection

Advantages: Focuses on highest-risk items, efficient use of testing effort Disadvantages: Not statistically representative, may over-represent certain risks

Haphazard Selection

When to use: When random selection is impractical (no sequential population listing) and population is relatively homogeneous.

Method:

  1. Select items without any specific pattern or bias
  2. Ensure selections are spread across the full population period
  3. Avoid unconscious bias (don't always pick items at the top, round numbers, etc.)

Advantages: Simple, no technology required Disadvantages: Not statistically valid, susceptible to unconscious bias

Systematic Selection

When to use: When population is sequential and you want even coverage across the period.

Method:

  1. Calculate the sampling interval: Population size / Sample size
  2. Select a random starting point within the first interval
  3. Select every Nth item from the starting point

Example: Population of 1,000, sample of 25 → interval of 40. Random start: item 17. Select items 17, 57, 97, 137, ...

Advantages: Even coverage across population, simple to execute Disadvantages: Periodic patterns in the population could bias results

Sample Size Guidance

Control Frequency Expected Population Low Risk Sample Moderate Risk Sample High Risk Sample
Annual 1 1 1 1
Quarterly 4 2 2 3
Monthly 12 2 3 4
Weekly 52 5 8 15
Daily ~250 20 30 40
Per-transaction (small pop.) < 250 20 30 40
Per-transaction (large pop.) 250+ 25 40 60

Factors increasing sample size:

  • Higher inherent risk in the account/process
  • Control is the sole control addressing a significant risk (no redundancy)
  • Prior period control deficiency identified
  • New control (not tested in prior periods)
  • External auditor reliance on management testing

Testing Documentation Standards

Workpaper Requirements

Every control test should be documented with:

  1. Control identification:

    • Control number/ID
    • Control description (what is done, by whom, how often)
    • Control type (manual, automated, IT-dependent manual)
    • Control frequency
    • Risk and assertion addressed
  2. Test design:

    • Test objective (what you are trying to determine)
    • Test procedures (step-by-step instructions)
    • Expected evidence (what you expect to see if the control is effective)
    • Sample selection methodology and rationale
  3. Test execution:

    • Population description and size
    • Sample selection details (method, items selected)
    • Results for each sample item (pass/fail with specific evidence examined)
    • Exceptions noted with full description
  4. Conclusion:

    • Overall assessment (effective / deficiency / significant deficiency / material weakness)
    • Basis for conclusion
    • Impact assessment for any exceptions
    • Compensating controls considered (if applicable)
  5. Sign-off:

    • Tester name and date
    • Reviewer name and date

Evidence Standards

Sufficient evidence includes:

  • Screenshots showing system-enforced controls
  • Signed/initialed approval documents
  • Email approvals with identifiable approver and date
  • System audit logs showing who performed the action and when
  • Re-performed calculations with matching results
  • Observation notes (with date, location, observer)

Insufficient evidence:

  • Verbal confirmations alone (must be corroborated)
  • Undated documents
  • Evidence without identifiable performer/approver
  • Generic system reports without date/time stamps
  • "Per discussion with [name]" without corroborating documentation

Working Paper Organization

Organize testing files by control area:

SOX Testing/
├── [Year]/
│   ├── Scoping and Risk Assessment/
│   ├── Revenue Cycle/
│   │   ├── Control Matrix
│   │   ├── Walkthrough Documentation
│   │   ├── Test Workpapers (one per control)
│   │   └── Supporting Evidence
│   ├── Procure to Pay/
│   ├── Payroll/
│   ├── Financial Close/
│   ├── Treasury/
│   ├── Fixed Assets/
│   ├── IT General Controls/
│   ├── Entity Level Controls/
│   └── Summary and Conclusions/
│       ├── Deficiency Evaluation
│       └── Management Assessment

Control Deficiency Classification

Deficiency

A deficiency in internal control exists when the design or operation of a control does not allow management or employees, in the normal course of performing their assigned functions, to prevent or detect misstatements on a timely basis.

Evaluation factors:

  • What is the likelihood that the control failure could result in a misstatement?
  • What is the magnitude of the potential misstatement?
  • Is there a compensating control that mitigates the deficiency?

Significant Deficiency

A deficiency, or combination of deficiencies, that is less severe than a material weakness yet important enough to merit attention by those charged with governance.

Indicators:

  • The deficiency could result in a misstatement that is more than inconsequential but less than material
  • There is more than a remote (but less than reasonably possible) likelihood of a material misstatement
  • The control is a key control and the deficiency is not fully mitigated by compensating controls
  • Combination of individually minor deficiencies that together represent a significant concern

Material Weakness

A deficiency, or combination of deficiencies, such that there is a reasonable possibility that a material misstatement of the financial statements will not be prevented or detected on a timely basis.

Indicators:

  • Identification of fraud by senior management (any magnitude)
  • Restatement of previously issued financial statements to correct a material error
  • Identification by the auditor of a material misstatement that would not have been detected by the company's controls
  • Ineffective oversight of financial reporting by the audit committee
  • Deficiency in a pervasive control (entity-level, IT general control) affecting multiple processes

Deficiency Aggregation

Individual deficiencies that are not significant individually may be significant in combination:

  1. Identify all deficiencies in the same process or affecting the same assertion
  2. Evaluate whether the combined effect could result in a material misstatement
  3. Consider whether deficiencies in compensating controls exacerbate other deficiencies
  4. Document the aggregation analysis and conclusion

Remediation

For each identified deficiency:

  1. Root cause analysis: Why did the control fail? (design gap, execution failure, staffing, training, system issue)
  2. Remediation plan: Specific actions to fix the control (redesign, additional training, system enhancement, added review)
  3. Timeline: Target date for remediation completion
  4. Owner: Person responsible for implementing the remediation
  5. Validation: How and when the remediated control will be re-tested to confirm effectiveness

Common Control Types

IT General Controls (ITGCs)

Controls over the IT environment that support the reliable functioning of application controls and automated processes.

Access Controls:

  • User access provisioning (new access requests require approval)
  • User access de-provisioning (terminated users removed timely)
  • Privileged access management (admin/superuser access restricted and monitored)
  • Periodic access reviews (user access recertified on a defined schedule)
  • Password policies (complexity, rotation, lockout)
  • Segregation of duties enforcement (conflicting access prevented)

Change Management:

  • Change requests documented and approved before implementation
  • Changes tested in a non-production environment before promotion
  • Separation of development and production environments
  • Emergency change procedures (documented, approved post-implementation)
  • Change review and post-implementation validation

IT Operations:

  • Batch job monitoring and exception handling
  • Backup and recovery procedures (regular backups, tested restores)
  • System availability and performance monitoring
  • Incident management and escalation procedures
  • Disaster recovery planning and testing

Manual Controls

Controls performed by people using judgment, typically involving review and approval.

Examples:

  • Management review of financial statements and key metrics
  • Supervisory approval of journal entries above a threshold
  • Three-way match verification (PO, receipt, invoice)
  • Account reconciliation preparation and review
  • Physical inventory observation and count
  • Vendor master data change approval
  • Customer credit approval

Key attributes to test:

  • Was the control performed by the right person (proper authority)?
  • Was it performed timely (within the required timeframe)?
  • Is there evidence of the review (signature, initials, email, system log)?
  • Did the reviewer have sufficient information to perform an effective review?
  • Were exceptions identified and appropriately addressed?

Automated Controls

Controls enforced by IT systems without human intervention.

Examples:

  • System-enforced approval workflows (cannot proceed without required approvals)
  • Three-way match automation (system blocks payment if PO/receipt/invoice don't match)
  • Duplicate payment detection (system flags or blocks duplicate invoices)
  • Credit limit enforcement (system prevents orders exceeding credit limit)
  • Automated calculations (depreciation, amortization, interest, tax)
  • System-enforced segregation of duties (conflicting roles prevented)
  • Input validation controls (required fields, format checks, range checks)
  • Automated reconciliation matching

Testing approach:

  • Test design: Confirm the system configuration enforces the control as intended
  • Test operating effectiveness: For automated controls, if the system configuration has not changed, one test of the control is typically sufficient for the period (supplemented by ITGC testing of change management)
  • Verify change management ITGCs are effective (if system changed, re-test the control)

IT-Dependent Manual Controls

Manual controls that rely on the completeness and accuracy of system-generated information.

Examples:

  • Management review of a system-generated exception report
  • Supervisor review of a system-generated aging report to assess reserves
  • Reconciliation using system-generated trial balance data
  • Approval of transactions identified by a system-generated workflow

Testing approach:

  • Test the manual control (review, approval, follow-up on exceptions)
  • AND test the completeness and accuracy of the underlying report/data (IPE — Information Produced by the Entity)
  • IPE testing confirms the data the reviewer relied on was complete and accurate

Entity-Level Controls

Broad controls that operate at the organizational level and affect multiple processes.

Examples:

  • Tone at the top / code of conduct
  • Risk assessment process
  • Audit committee oversight of financial reporting
  • Internal audit function and activities
  • Fraud risk assessment and anti-fraud programs
  • Whistleblower/ethics hotline
  • Management monitoring of control effectiveness
  • Financial reporting competence (staffing, training, qualifications)
  • Period-end financial reporting process (close procedures, GAAP compliance reviews)

Significance:

  • Entity-level controls can mitigate but typically cannot replace process-level controls
  • Ineffective entity-level controls (especially audit committee oversight and tone at the top) are strong indicators of a material weakness
  • Effective entity-level controls may reduce the extent of testing needed for process-level controls
管理月末结账流程,提供按天分解的检查清单、任务依赖关系及状态跟踪。适用于规划结账日历、追踪进度、识别阻塞点及安排每日活动,需财务专业人员复核。
规划月末结账日历 追踪结账进度 识别结账阻塞点 按天排序结账活动
finance/skills/close-management/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill close-management -g -y
SKILL.md
Frontmatter
{
    "name": "close-management",
    "description": "Manage the month-end close process with task sequencing, dependencies, and status tracking. Use when planning the close calendar, tracking close progress, identifying blockers, or sequencing close activities by day.",
    "user-invocable": false
}

Close Management

Important: This skill assists with close management workflows but does not provide financial advice. All close activities should be reviewed by qualified financial professionals.

Month-end close checklist, task sequencing and dependencies, status tracking, and common close activities organized by day.

Month-End Close Checklist

Pre-Close (Last 2-3 Business Days of the Month)

  • Send close calendar and deadline reminders to all contributors
  • Confirm cut-off procedures with AP, AR, payroll, and treasury
  • Verify all sub-systems are processing normally (ERP, payroll, banking)
  • Complete preliminary bank reconciliation (all but last-day activity)
  • Review open purchase orders for potential accrual needs
  • Confirm payroll processing schedule aligns with close timeline
  • Collect information for any known unusual transactions

Close Day 1 (T+1: First Business Day After Month-End)

  • Confirm all sub-ledger modules have completed period-end processing
  • Run AP accruals for goods/services received but not invoiced
  • Post payroll entries and payroll accrual (if pay period straddles month-end)
  • Record cash receipts and disbursements through month-end
  • Post intercompany transactions and confirm with counterparties
  • Complete bank reconciliation with final bank statement
  • Run fixed asset depreciation
  • Post prepaid expense amortization

Close Day 2 (T+2)

  • Complete revenue recognition entries and deferred revenue adjustments
  • Post all remaining accrual journal entries
  • Complete AR subledger reconciliation
  • Complete AP subledger reconciliation
  • Record inventory adjustments (if applicable)
  • Post FX revaluation entries for foreign currency balances
  • Begin balance sheet account reconciliations

Close Day 3 (T+3)

  • Complete all balance sheet reconciliations
  • Post any adjusting journal entries identified during reconciliation
  • Complete intercompany reconciliation and elimination entries
  • Run preliminary trial balance and income statement
  • Perform preliminary flux analysis on income statement
  • Investigate and resolve material variances

Close Day 4 (T+4)

  • Post tax provision entries (income tax, sales tax, property tax)
  • Complete equity roll-forward (stock compensation, treasury stock)
  • Finalize all journal entries — soft close
  • Generate draft financial statements (P&L, BS, CF)
  • Perform detailed flux analysis and prepare variance explanations
  • Management review of financial statements and key metrics

Close Day 5 (T+5)

  • Post any final adjustments from management review
  • Finalize financial statements — hard close
  • Lock the period in the ERP/GL system
  • Distribute financial reporting package to stakeholders
  • Update forecasts/projections based on actual results
  • Conduct close retrospective — identify process improvements

Task Sequencing and Dependencies

Dependency Map

Tasks are organized by what must complete before the next task can begin:

LEVEL 1 (No dependencies — can start immediately at T+1):
├── Cash receipts/disbursements recording
├── Bank statement retrieval
├── Payroll processing/accrual
├── Fixed asset depreciation run
├── Prepaid amortization
├── AP accrual preparation
└── Intercompany transaction posting

LEVEL 2 (Depends on Level 1 completion):
├── Bank reconciliation (needs: cash entries + bank statement)
├── Revenue recognition (needs: billing/delivery data finalized)
├── AR subledger reconciliation (needs: all revenue/cash entries)
├── AP subledger reconciliation (needs: all AP entries/accruals)
├── FX revaluation (needs: all foreign currency entries posted)
└── Remaining accrual JEs (needs: review of all source data)

LEVEL 3 (Depends on Level 2 completion):
├── All balance sheet reconciliations (needs: all JEs posted)
├── Intercompany reconciliation (needs: both sides posted)
├── Adjusting entries from reconciliations
└── Preliminary trial balance

LEVEL 4 (Depends on Level 3 completion):
├── Tax provision (needs: pre-tax income finalized)
├── Equity roll-forward
├── Consolidation and eliminations
├── Draft financial statements
└── Preliminary flux analysis

LEVEL 5 (Depends on Level 4 completion):
├── Management review
├── Final adjustments
├── Hard close / period lock
├── Financial reporting package
└── Forecast updates

Critical Path

The critical path determines the minimum close duration. Typical critical path:

Cash/AP/AR entries → Subledger reconciliations → Balance sheet recs →
  Tax provision → Draft financials → Management review → Hard close

To shorten the close:

  • Automate Level 1 entries (depreciation, prepaid amortization, standard accruals)
  • Pre-reconcile accounts during the month (continuous reconciliation)
  • Parallel-process independent reconciliations
  • Set clear deadlines with consequences for late submissions
  • Use standardized templates to reduce reconciliation prep time

Status Tracking and Reporting

Close Status Dashboard

Track each close task with the following attributes:

Task Owner Deadline Status Blocker Notes
[Task name] [Person/role] [Day T+N] Not Started / In Progress / Complete / Blocked [If blocked, what's blocking] [Any notes]

Status Definitions

  • Not Started: Task has not yet begun (may be waiting on dependencies)
  • In Progress: Task is actively being worked on
  • Complete: Task is finished and has been reviewed/approved
  • Blocked: Task cannot proceed due to a dependency, missing data, or issue
  • At Risk: Task is in progress but may not meet its deadline

Daily Close Status Meeting (Recommended)

During the close period, hold a brief (15-minute) daily standup:

  1. Review status board: Walk through open tasks, flag any that are behind
  2. Identify blockers: Surface any issues preventing task completion
  3. Reassign or escalate: Adjust ownership or escalate blockers to resolve quickly
  4. Update timeline: If any tasks are at risk, assess impact on overall close timeline

Close Metrics to Track Over Time

Metric Definition Target
Close duration Business days from period end to hard close Reduce over time
# of adjusting entries after soft close Entries posted during management review Minimize
# of late tasks Tasks completed after their deadline Zero
# of reconciliation exceptions Reconciling items requiring investigation Reduce over time
# of restatements / corrections Errors found after close Zero

Common Close Activities by Day

Typical 5-Day Close Calendar

Day Key Activities Responsible
T+1 Cash entries, payroll, AP accruals, depreciation, prepaid amortization, intercompany posting Staff accountants, payroll
T+2 Revenue recognition, remaining accruals, subledger reconciliations (AR, AP, FA), FX revaluation Revenue accountant, AP/AR, treasury
T+3 Balance sheet reconciliations, intercompany reconciliation, eliminations, preliminary trial balance, preliminary flux Accounting team, consolidation
T+4 Tax provision, equity roll-forward, draft financial statements, detailed flux analysis, management review Tax, controller, FP&A
T+5 Final adjustments, hard close, period lock, reporting package distribution, forecast update, retrospective Controller, FP&A, finance leadership

Accelerated Close (3-Day Target)

For organizations targeting a faster close:

Day Key Activities
T+1 All JEs posted (automated + manual), all subledger reconciliations, bank reconciliation, intercompany reconciliation, preliminary trial balance
T+2 All balance sheet reconciliations, tax provision, consolidation, draft financial statements, flux analysis, management review
T+3 Final adjustments, hard close, reporting package, forecast update

Prerequisites for a 3-day close:

  • Automated recurring journal entries (depreciation, amortization, standard accruals)
  • Continuous reconciliation during the month (not all at month-end)
  • Automated intercompany elimination
  • Pre-close activities completed before month-end (cut-off, accrual estimates)
  • Empowered team with clear ownership and minimal handoffs
  • Real-time or near-real-time sub-system integration

Close Process Improvement

Common Bottlenecks and Solutions

Bottleneck Root Cause Solution
Late AP accruals Waiting for department spend confirmation Implement continuous accrual estimation; set cut-off deadlines
Manual journal entries Recurring entries prepared manually each month Automate standard recurring entries in the ERP
Slow reconciliations Starting from scratch each month Implement continuous/rolling reconciliation
Intercompany delays Waiting for counterparty confirmation Automate intercompany matching; set stricter deadlines
Management review changes Large adjustments found during review Improve preliminary review process; empower team to catch issues earlier
Missing supporting documents Scrambling for documentation at close Maintain documentation throughout the month

Close Retrospective Questions

After each close, ask:

  1. What went well this close that we should continue?
  2. What took longer than expected and why?
  3. What blockers did we encounter and how can we prevent them?
  4. Were there any surprises in the financial results we should have caught earlier?
  5. What can we automate or streamline for next month?
生成损益表、资产负债表和现金流量表,支持同比环比对比及差异分析。适用于月度/季度P&L编制、关账、预算对比及管理层汇报,需结合ERP或数据源获取财务数据。
准备月度或季度损益表 进行关账并标记重大差异 将实际业绩与预算对比 构建管理层财务摘要 查询GAAP列报要求
finance/skills/financial-statements/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill financial-statements -g -y
SKILL.md
Frontmatter
{
    "name": "financial-statements",
    "description": "Generate financial statements (income statement, balance sheet, cash flow) with period-over-period comparison and variance analysis. Use when preparing a monthly or quarterly P&L, closing the books and need to flag material variances, comparing actuals to budget, building a financial summary for leadership review, or looking up GAAP presentation requirements and period-end adjustments.",
    "argument-hint": "<frequency> <period>"
}

/financial-statements

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Important: This command assists with financial statement workflows but does not provide financial advice. All statements should be reviewed by qualified financial professionals before use in reporting or filings.

Generate financial statements with period-over-period comparison and variance analysis. The workflow below walks through income statement generation; balance sheet and cash flow statement reference formats, GAAP presentation requirements (ASC 220/210/230), and common period-end adjustments are included as supporting reference material.

Usage

/financial-statements <period-type> <period>

Arguments

  • period-type — The reporting period type:
    • monthly — Single month P&L with prior month and prior year month comparison
    • quarterly — Quarter P&L with prior quarter and prior year quarter comparison
    • annual — Full year P&L with prior year comparison
    • ytd — Year-to-date P&L with prior year YTD comparison
  • period — The period to report (e.g., 2024-12, 2024-Q4, 2024)

Workflow

1. Gather Financial Data

If ~~erp or ~~data warehouse is connected:

  • Pull trial balance or income statement data for the specified period
  • Pull comparison period data (prior period, prior year, budget/forecast)
  • Pull account hierarchy and groupings for presentation

If no data source is connected:

Connect ~~erp or ~~data warehouse to pull financial data automatically. You can also paste trial balance data, upload a spreadsheet, or provide income statement data for analysis.

Prompt the user to provide:

  • Current period revenue and expense data (by account or category)
  • Comparison period data (prior period, prior year, and/or budget)
  • Any known adjustments or reclassifications

2. Generate Income Statement

Present in standard multi-column format:

INCOME STATEMENT
Period: [Period description]
(in thousands, unless otherwise noted)

                              Current    Prior      Variance   Variance   Budget    Budget
                              Period     Period     ($)        (%)        Amount    Var ($)
                              --------   --------   --------   --------   --------  --------
REVENUE
  Product revenue             $XX,XXX    $XX,XXX    $X,XXX     X.X%       $XX,XXX   $X,XXX
  Service revenue             $XX,XXX    $XX,XXX    $X,XXX     X.X%       $XX,XXX   $X,XXX
  Other revenue               $XX,XXX    $XX,XXX    $X,XXX     X.X%       $XX,XXX   $X,XXX
                              --------   --------   --------              --------  --------
TOTAL REVENUE                 $XX,XXX    $XX,XXX    $X,XXX     X.X%       $XX,XXX   $X,XXX

COST OF REVENUE
  [Cost items]                $XX,XXX    $XX,XXX    $X,XXX     X.X%       $XX,XXX   $X,XXX
                              --------   --------   --------              --------  --------
GROSS PROFIT                  $XX,XXX    $XX,XXX    $X,XXX     X.X%       $XX,XXX   $X,XXX
  Gross Margin                XX.X%      XX.X%

OPERATING EXPENSES
  Research & development      $XX,XXX    $XX,XXX    $X,XXX     X.X%       $XX,XXX   $X,XXX
  Sales & marketing           $XX,XXX    $XX,XXX    $X,XXX     X.X%       $XX,XXX   $X,XXX
  General & administrative    $XX,XXX    $XX,XXX    $X,XXX     X.X%       $XX,XXX   $X,XXX
                              --------   --------   --------              --------  --------
TOTAL OPERATING EXPENSES      $XX,XXX    $XX,XXX    $X,XXX     X.X%       $XX,XXX   $X,XXX

OPERATING INCOME (LOSS)       $XX,XXX    $XX,XXX    $X,XXX     X.X%       $XX,XXX   $X,XXX
  Operating Margin            XX.X%      XX.X%

OTHER INCOME (EXPENSE)
  Interest income             $XX,XXX    $XX,XXX    $X,XXX     X.X%
  Interest expense           ($XX,XXX)  ($XX,XXX)   $X,XXX     X.X%
  Other, net                  $XX,XXX    $XX,XXX    $X,XXX     X.X%
                              --------   --------   --------
TOTAL OTHER INCOME (EXPENSE)  $XX,XXX    $XX,XXX    $X,XXX     X.X%

INCOME BEFORE TAXES           $XX,XXX    $XX,XXX    $X,XXX     X.X%
  Income tax expense          $XX,XXX    $XX,XXX    $X,XXX     X.X%
                              --------   --------   --------

NET INCOME (LOSS)             $XX,XXX    $XX,XXX    $X,XXX     X.X%       $XX,XXX   $X,XXX
  Net Margin                  XX.X%      XX.X%

3. Variance Analysis

For each line item, calculate and flag material variances.

Variance Calculation

For each line item, calculate:

  • Dollar variance: Current period - Prior period (or current period - budget)
  • Percentage variance: (Current - Prior) / |Prior| x 100
  • Basis point change: For margins and ratios, express change in basis points (1 bp = 0.01%)

Materiality Thresholds

Define what constitutes a "material" variance requiring investigation. Common approaches:

  • Fixed dollar threshold: Variances exceeding a set dollar amount (e.g., $50K, $100K)
  • Percentage threshold: Variances exceeding a set percentage (e.g., 10%, 15%)
  • Combined: Either the dollar OR percentage threshold is exceeded
  • Scaled: Different thresholds for different line items based on their size and volatility

Example thresholds (adjust for your organization):

Line Item Size Dollar Threshold Percentage Threshold
> $10M $500K 5%
$1M - $10M $100K 10%
< $1M $50K 15%

Variance Decomposition

Break down total variance into component drivers:

  • Volume/quantity effect: Change in volume at prior period rates
  • Rate/price effect: Change in rate/price at current period volume
  • Mix effect: Shift in composition between items with different rates/margins
  • New/discontinued items: Items present in one period but not the other
  • One-time/non-recurring items: Items that are not expected to repeat
  • Timing effect: Items shifting between periods (not a true change in run rate)
  • Currency effect: Impact of FX rate changes on translated results

Investigation and Narrative

For each material variance:

  1. Quantify the variance ($ and %)
  2. Identify whether favorable or unfavorable
  3. Decompose into drivers using the categories above
  4. Provide a narrative explanation of the business reason
  5. Assess whether the variance is temporary or represents a trend change
  6. Note any actions required (further investigation, forecast update, process change)

4. Key Metrics Summary

KEY METRICS
                              Current    Prior      Change
Revenue growth (%)                                  X.X%
Gross margin (%)              XX.X%      XX.X%      X.X pp
Operating margin (%)          XX.X%      XX.X%      X.X pp
Net margin (%)                XX.X%      XX.X%      X.X pp
OpEx as % of revenue          XX.X%      XX.X%      X.X pp
Effective tax rate (%)        XX.X%      XX.X%      X.X pp

5. Material Variance Summary

List all material variances requiring investigation:

Line Item Variance ($) Variance (%) Direction Preliminary Driver Action
[Item] $X,XXX X.X% Unfav. [If known] Investigate

6. Output

Provide:

  1. Formatted income statement with comparisons
  2. Key metrics summary
  3. Material variance listing with investigation flags
  4. Suggested follow-up questions for unexplained variances
  5. Offer to drill into any specific variance with /flux

GAAP Presentation Requirements

Income Statement (ASC 220 / IAS 1)

  • Present all items of income and expense recognized in a period
  • Classify expenses either by nature (materials, labor, depreciation) or by function (COGS, R&D, S&M, G&A) — function is more common for US companies
  • If classified by function, disclose depreciation, amortization, and employee benefit costs by nature in the notes
  • Present operating and non-operating items separately
  • Show income tax expense as a separate line
  • Extraordinary items are prohibited under both US GAAP and IFRS
  • Discontinued operations presented separately, net of tax

Common presentation considerations:

  • Revenue disaggregation: ASC 606 requires disaggregation of revenue into categories that depict how the nature, amount, timing, and uncertainty of revenue are affected by economic factors
  • Stock-based compensation: Classify within the functional expense categories (R&D, S&M, G&A) with total SBC disclosed in notes
  • Restructuring charges: Present separately if material, or include in operating expenses with note disclosure
  • Non-GAAP adjustments: If presenting non-GAAP measures (common in earnings releases), clearly label and reconcile to GAAP

Balance Sheet (ASC 210 / IAS 1)

  • Distinguish between current and non-current assets and liabilities
  • Current: expected to be realized, consumed, or settled within 12 months (or the operating cycle if longer)
  • Present assets in order of liquidity (most liquid first) — standard US practice
  • Accounts receivable shown net of allowance for credit losses (ASC 326)
  • Property and equipment shown net of accumulated depreciation
  • Goodwill is not amortized — tested for impairment annually (ASC 350)
  • Leases: recognize right-of-use assets and lease liabilities for operating and finance leases (ASC 842)

Cash Flow Statement (ASC 230 / IAS 7)

  • Indirect method is most common (start with net income, adjust for non-cash items)
  • Direct method is permitted but rarely used (requires supplemental indirect reconciliation)
  • Interest paid and income taxes paid must be disclosed (either on the face or in notes)
  • Non-cash investing and financing activities disclosed separately (e.g., assets acquired under leases, stock issued for acquisitions)
  • Cash equivalents: short-term, highly liquid investments with original maturities of 3 months or less

Balance Sheet Reference Format

ASSETS
Current Assets
  Cash and cash equivalents
  Short-term investments
  Accounts receivable, net
  Inventory
  Prepaid expenses and other current assets
Total Current Assets

Non-Current Assets
  Property and equipment, net
  Operating lease right-of-use assets
  Goodwill
  Intangible assets, net
  Long-term investments
  Other non-current assets
Total Non-Current Assets

TOTAL ASSETS

LIABILITIES AND STOCKHOLDERS' EQUITY
Current Liabilities
  Accounts payable
  Accrued liabilities
  Deferred revenue, current portion
  Current portion of long-term debt
  Operating lease liabilities, current portion
  Other current liabilities
Total Current Liabilities

Non-Current Liabilities
  Long-term debt
  Deferred revenue, non-current
  Operating lease liabilities, non-current
  Other non-current liabilities
Total Non-Current Liabilities

Total Liabilities

Stockholders' Equity
  Common stock
  Additional paid-in capital
  Retained earnings (accumulated deficit)
  Accumulated other comprehensive income (loss)
  Treasury stock
Total Stockholders' Equity

TOTAL LIABILITIES AND STOCKHOLDERS' EQUITY

Cash Flow Statement Reference Format (Indirect Method)

CASH FLOWS FROM OPERATING ACTIVITIES
Net income (loss)
Adjustments to reconcile net income to net cash from operations:
  Depreciation and amortization
  Stock-based compensation
  Amortization of debt issuance costs
  Deferred income taxes
  Loss (gain) on disposal of assets
  Impairment charges
  Other non-cash items
Changes in operating assets and liabilities:
  Accounts receivable
  Inventory
  Prepaid expenses and other assets
  Accounts payable
  Accrued liabilities
  Deferred revenue
  Other liabilities
Net Cash Provided by (Used in) Operating Activities

CASH FLOWS FROM INVESTING ACTIVITIES
  Purchases of property and equipment
  Purchases of investments
  Proceeds from sale/maturity of investments
  Acquisitions, net of cash acquired
  Other investing activities
Net Cash Provided by (Used in) Investing Activities

CASH FLOWS FROM FINANCING ACTIVITIES
  Proceeds from issuance of debt
  Repayment of debt
  Proceeds from issuance of common stock
  Repurchases of common stock
  Dividends paid
  Payment of debt issuance costs
  Other financing activities
Net Cash Provided by (Used in) Financing Activities

Effect of exchange rate changes on cash

Net Increase (Decrease) in Cash and Cash Equivalents
Cash and cash equivalents, beginning of period
Cash and cash equivalents, end of period

Common Adjustments and Reclassifications

Period-End Adjustments

  1. Accruals: Record expenses incurred but not yet paid (AP accruals, payroll accruals, interest accruals)
  2. Deferrals: Adjust prepaid expenses, deferred revenue, and deferred costs for the period
  3. Depreciation and amortization: Book periodic depreciation/amortization from fixed asset and intangible schedules
  4. Bad debt provision: Adjust allowance for credit losses based on aging analysis and historical loss rates
  5. Inventory adjustments: Record write-downs for obsolete, slow-moving, or impaired inventory
  6. FX revaluation: Revalue foreign-currency-denominated monetary assets and liabilities at period-end rates
  7. Tax provision: Record current and deferred income tax expense
  8. Fair value adjustments: Mark-to-market investments, derivatives, and other fair-value items

Reclassifications

  1. Current/non-current reclassification: Reclassify long-term debt maturing within 12 months to current
  2. Contra account netting: Net allowances against gross receivables, accumulated depreciation against gross assets
  3. Intercompany elimination: Eliminate intercompany balances and transactions in consolidation
  4. Discontinued operations: Reclassify results of discontinued operations to a separate line item
  5. Equity method adjustments: Record share of investee income/loss for equity method investments
  6. Segment reclassifications: Ensure transactions are properly classified by operating segment
辅助准备月末结账的手工分录,涵盖应付账款、固定资产折旧、预付费用摊销及薪酬计提等场景。提供标准借贷分录模板、计算依据及关键注意事项,需专业人员审核以确保合规性。
月末结账 编制应计分录 处理预付费摊销 计算资产折旧 计提薪酬费用
finance/skills/journal-entry-prep/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill journal-entry-prep -g -y
SKILL.md
Frontmatter
{
    "name": "journal-entry-prep",
    "description": "Prepare journal entries with proper debits, credits, and supporting documentation for month-end close. Use when booking accruals, prepaid amortization, fixed asset depreciation, payroll entries, revenue recognition, or any manual journal entry.",
    "user-invocable": false
}

Journal Entry Preparation

Important: This skill assists with journal entry workflows but does not provide financial advice. All entries should be reviewed by qualified financial professionals before posting.

Best practices, standard entry types, documentation requirements, and review workflows for journal entry preparation.

Standard Accrual Types and Their Entries

Accounts Payable Accruals

Accrue for goods or services received but not yet invoiced at period end.

Typical entry:

  • Debit: Expense account (or capitalize if asset-qualifying)
  • Credit: Accrued liabilities

Sources for calculation:

  • Open purchase orders with confirmed receipts
  • Contracts with services rendered but unbilled
  • Recurring vendor arrangements (utilities, subscriptions, professional services)
  • Employee expense reports submitted but not yet processed

Key considerations:

  • Reverse in the following period (auto-reversal recommended)
  • Use consistent estimation methodology period over period
  • Document basis for estimates (PO amount, contract terms, historical run-rate)
  • Track actual vs accrual to refine future estimates

Fixed Asset Depreciation

Book periodic depreciation expense for tangible and intangible assets.

Typical entry:

  • Debit: Depreciation/amortization expense (by department or cost center)
  • Credit: Accumulated depreciation/amortization

Depreciation methods:

  • Straight-line: (Cost - Salvage) / Useful life — most common for financial reporting
  • Declining balance: Accelerated method applying fixed rate to net book value
  • Units of production: Based on actual usage or output vs total expected

Key considerations:

  • Run depreciation from the fixed asset register or schedule
  • Verify new additions are set up with correct useful life and method
  • Check for disposals or impairments requiring write-off
  • Ensure consistency between book and tax depreciation tracking

Prepaid Expense Amortization

Amortize prepaid expenses over their benefit period.

Typical entry:

  • Debit: Expense account (insurance, software, rent, etc.)
  • Credit: Prepaid expense

Common prepaid categories:

  • Insurance premiums (typically 12-month policies)
  • Software licenses and subscriptions
  • Prepaid rent (if applicable under lease terms)
  • Prepaid maintenance contracts
  • Conference and event deposits

Key considerations:

  • Maintain an amortization schedule with start/end dates and monthly amounts
  • Review for any prepaid items that should be fully expensed (immaterial amounts)
  • Check for cancelled or terminated contracts requiring accelerated amortization
  • Verify new prepaids are added to the schedule promptly

Payroll Accruals

Accrue compensation and related costs for the period.

Typical entries:

Salary accrual (for pay periods not aligned with month-end):

  • Debit: Salary expense (by department)
  • Credit: Accrued payroll

Bonus accrual:

  • Debit: Bonus expense (by department)
  • Credit: Accrued bonus

Benefits accrual:

  • Debit: Benefits expense
  • Credit: Accrued benefits

Payroll tax accrual:

  • Debit: Payroll tax expense
  • Credit: Accrued payroll taxes

Key considerations:

  • Calculate salary accrual based on working days in the period vs pay period
  • Bonus accruals should reflect plan terms (target amounts, performance metrics, payout timing)
  • Include employer-side taxes and benefits (FICA, FUTA, health, 401k match)
  • Track PTO/vacation accrual liability if required by policy or jurisdiction

Revenue Recognition

Recognize revenue based on performance obligations and delivery.

Typical entries:

Recognize previously deferred revenue:

  • Debit: Deferred revenue
  • Credit: Revenue

Recognize revenue with new receivable:

  • Debit: Accounts receivable
  • Credit: Revenue

Defer revenue received in advance:

  • Debit: Cash / Accounts receivable
  • Credit: Deferred revenue

Key considerations:

  • Follow ASC 606 five-step framework for contracts with customers
  • Identify distinct performance obligations in each contract
  • Determine transaction price (including variable consideration)
  • Allocate transaction price to performance obligations
  • Recognize revenue as/when performance obligations are satisfied
  • Maintain contract-level detail for audit support

Supporting Documentation Requirements

Every journal entry should have:

  1. Entry description/memo: Clear, specific description of what the entry records and why
  2. Calculation support: How amounts were derived (formula, schedule, source data reference)
  3. Source documents: Reference to the underlying transactions or events (PO numbers, invoice numbers, contract references, payroll register)
  4. Period: The accounting period the entry applies to
  5. Preparer identification: Who prepared the entry and when
  6. Approval: Evidence of review and approval per the authorization matrix
  7. Reversal indicator: Whether the entry auto-reverses and the reversal date

Review and Approval Workflows

Typical Approval Matrix

Entry Type Amount Threshold Approver
Standard recurring Any amount Accounting manager
Non-recurring / manual < $50K Accounting manager
Non-recurring / manual $50K - $250K Controller
Non-recurring / manual > $250K CFO / VP Finance
Top-side / consolidation Any amount Controller or above
Out-of-period adjustments Any amount Controller or above

Note: Thresholds should be set based on your organization's materiality and risk tolerance.

Review Checklist

Before approving a journal entry, the reviewer should verify:

  • Debits equal credits (entry is balanced)
  • Correct accounting period (not posting to a closed period)
  • Account codes exist and are appropriate for the transaction
  • Amounts are mathematically accurate and supported by calculations
  • Description is clear, specific, and sufficient for audit purposes
  • Department/cost center/project coding is correct
  • Treatment is consistent with prior periods and accounting policies
  • Auto-reversal is set appropriately (accruals should reverse)
  • Supporting documentation is complete and referenced
  • Entry amount is within the preparer's authority level
  • No duplicate of an existing entry
  • Unusual or large amounts are explained and justified

Common Errors to Check For

  1. Unbalanced entries: Debits do not equal credits (system should prevent, but check manual entries)
  2. Wrong period: Entry posted to an incorrect or already-closed period
  3. Wrong sign: Debit entered as credit or vice versa
  4. Duplicate entries: Same transaction recorded twice (check for duplicates before posting)
  5. Wrong account: Entry posted to incorrect GL account (especially similar account codes)
  6. Missing reversal: Accrual entry not set to auto-reverse, causing double-counting
  7. Stale accruals: Recurring accruals not updated for changed circumstances
  8. Round-number estimates: Suspiciously round amounts that may not reflect actual calculations
  9. Incorrect FX rates: Foreign currency entries using wrong exchange rate or date
  10. Missing intercompany elimination: Entries between entities without corresponding elimination
  11. Capitalization errors: Expenses that should be capitalized, or capitalized items that should be expensed
  12. Cut-off errors: Transactions recorded in the wrong period based on delivery or service date
辅助生成符合规范的日记账分录,涵盖应付账款、折旧、预付费用、薪酬及收入确认等月末结账场景。支持自动获取或手动输入试算平衡表数据,计算借贷金额并生成审计所需的支持性文档与复核记录。
准备月度应计项目(如应付账款、薪酬、预付费用) 记录固定资产折旧或无形资产摊销 发布收入确认或递延收入调整分录 为审计审查准备分录文档
finance/skills/journal-entry/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill journal-entry -g -y
SKILL.md
Frontmatter
{
    "name": "journal-entry",
    "description": "Prepare journal entries with proper debits, credits, and supporting detail. Use when booking month-end accruals (AP, payroll, prepaid), recording depreciation or amortization, posting revenue recognition or deferred revenue adjustments, or documenting an entry for audit review.",
    "argument-hint": "<entry type> [period]"
}

Journal Entry Preparation

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Important: This command assists with journal entry workflows but does not provide financial advice. All entries should be reviewed by qualified financial professionals before posting.

Prepare journal entries with proper debits, credits, supporting detail, and review documentation.

Usage

/je <type> <period>

Arguments

  • type — The journal entry type. One of:
    • ap-accrual — Accounts payable accruals for goods/services received but not yet invoiced
    • fixed-assets — Depreciation and amortization entries for fixed assets and intangibles
    • prepaid — Amortization of prepaid expenses (insurance, software, rent, etc.)
    • payroll — Payroll accruals including salaries, benefits, taxes, and bonus accruals
    • revenue — Revenue recognition entries including deferred revenue adjustments
  • period — The accounting period (e.g., 2024-12, 2024-Q4, 2024)

Workflow

1. Gather Source Data

If ~~erp or ~~data warehouse is connected:

  • Pull the trial balance for the specified period
  • Pull subledger detail for the relevant accounts
  • Pull prior period entries of the same type for reference
  • Identify the current GL balances for affected accounts

If no data source is connected:

Connect ~~erp or ~~data warehouse to pull GL data automatically. You can also paste trial balance data or upload a spreadsheet.

Prompt the user to provide:

  • Trial balance or GL balances for affected accounts
  • Subledger detail or supporting schedules
  • Prior period entries for reference (optional)

2. Calculate the Entry

Based on the JE type:

AP Accrual:

  • Identify goods/services received but not invoiced by period end
  • Calculate accrual amounts from PO receipts, contracts, or estimates
  • Debit: Expense accounts (or asset accounts for capitalizable items)
  • Credit: Accrued liabilities

Fixed Assets:

  • Pull the fixed asset register or depreciation schedule
  • Calculate period depreciation by asset class and method (straight-line, declining balance, units of production)
  • Debit: Depreciation expense (by department/cost center)
  • Credit: Accumulated depreciation

Prepaid:

  • Pull the prepaid amortization schedule
  • Calculate the period amortization for each prepaid item
  • Debit: Expense accounts (by type — insurance, software, rent, etc.)
  • Credit: Prepaid expense accounts

Payroll:

  • Calculate accrued salaries for days worked but not yet paid
  • Calculate accrued benefits (health, retirement contributions, PTO)
  • Calculate employer payroll tax accruals
  • Calculate bonus accruals (if applicable, based on plan terms)
  • Debit: Salary expense, benefits expense, payroll tax expense
  • Credit: Accrued payroll, accrued benefits, accrued payroll taxes

Revenue:

  • Review contracts and performance obligations
  • Calculate revenue to recognize based on delivery/performance
  • Adjust deferred revenue balances
  • Debit: Deferred revenue (or accounts receivable)
  • Credit: Revenue accounts (by stream/category)

3. Generate the Journal Entry

Present the entry in standard format:

Journal Entry: [Type] — [Period]
Prepared by: [User]
Date: [Period end date]

| Line | Account Code | Account Name | Debit | Credit | Department | Memo |
|------|-------------|--------------|-------|--------|------------|------|
| 1    | XXXX        | [Name]       | X,XXX |        | [Dept]     | [Detail] |
| 2    | XXXX        | [Name]       |       | X,XXX  | [Dept]     | [Detail] |
|      |             | **Total**    | X,XXX | X,XXX  |            |      |

Supporting Detail:
- [Calculation basis and assumptions]
- [Reference to supporting schedule or documentation]

Reversal: [Yes/No — if yes, specify reversal date]

4. Review Checklist

Before finalizing, verify:

  • Debits equal credits
  • Correct accounting period
  • Account codes are valid and map to the right GL accounts
  • Amounts are calculated correctly with supporting detail
  • Memo/description is clear and specific enough for audit
  • Department/cost center coding is correct
  • Entry is consistent with prior period treatment
  • Reversal flag is set appropriately (accruals should auto-reverse)
  • Supporting documentation is referenced or attached
  • Entry is within the user's approval authority
  • No unusual or out-of-pattern amounts that need investigation

5. Output

Provide:

  1. The formatted journal entry
  2. Supporting calculations
  3. Comparison to prior period entry of the same type (if available)
  4. Any items flagged for review or follow-up
  5. Instructions for posting (manual entry or upload format for the user's ERP)
辅助执行总账与子账、银行对账单及关联方往来对账,涵盖差异排查、分类及老化分析。提供标准流程与常见差异原因,旨在提升财务数据一致性,但需专业人员复核以确保合规。
进行银行账户余额调节 核对总账控制账户与明细账 处理公司间交易对账 识别和分类未达账项
finance/skills/reconciliation/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill reconciliation -g -y
SKILL.md
Frontmatter
{
    "name": "reconciliation",
    "description": "Reconcile accounts by comparing GL balances to subledgers, bank statements, or third-party data. Use when performing bank reconciliations, GL-to-subledger recs, intercompany reconciliations, or identifying and categorizing reconciling items.",
    "argument-hint": "<account> [period]"
}

Reconciliation

Important: This skill assists with reconciliation workflows but does not provide financial advice. All reconciliations should be reviewed by qualified financial professionals before sign-off.

Methodology and best practices for account reconciliation, including GL-to-subledger, bank reconciliations, and intercompany. Covers reconciling item categorization, aging analysis, and escalation.

Reconciliation Types

GL to Subledger Reconciliation

Compare the general ledger control account balance to the detailed subledger balance.

Common accounts:

  • Accounts receivable (GL control vs AR subledger aging)
  • Accounts payable (GL control vs AP subledger aging)
  • Fixed assets (GL control vs fixed asset register)
  • Inventory (GL control vs inventory valuation report)
  • Prepaid expenses (GL control vs prepaid amortization schedule)
  • Accrued liabilities (GL control vs accrual detail schedules)

Process:

  1. Pull GL balance for the control account as of period end
  2. Pull subledger trial balance or detail report as of the same date
  3. Compare totals — they should match if posting is real-time
  4. Investigate any differences (timing of posting, manual entries not reflected, interface errors)

Common causes of differences:

  • Manual journal entries posted to the control account but not reflected in the subledger
  • Subledger transactions not yet interfaced to the GL
  • Timing differences in batch posting
  • Reclassification entries in the GL without subledger adjustment
  • System interface errors or failed postings

Bank Reconciliation

Compare the GL cash balance to the bank statement balance.

Process:

  1. Obtain the bank statement balance as of period end
  2. Pull the GL cash account balance as of the same date
  3. Identify outstanding checks (issued but not cleared at the bank)
  4. Identify deposits in transit (recorded in GL but not yet credited by bank)
  5. Identify bank charges, interest, or adjustments not yet recorded in GL
  6. Reconcile both sides to an adjusted balance

Standard format:

Balance per bank statement:         $XX,XXX
Add: Deposits in transit            $X,XXX
Less: Outstanding checks           ($X,XXX)
Add/Less: Bank errors               $X,XXX
Adjusted bank balance:              $XX,XXX

Balance per general ledger:         $XX,XXX
Add: Interest/credits not recorded  $X,XXX
Less: Bank fees not recorded       ($X,XXX)
Add/Less: GL errors                 $X,XXX
Adjusted GL balance:                $XX,XXX

Difference:                         $0.00

Intercompany Reconciliation

Reconcile balances between related entities to ensure they net to zero on consolidation.

Process:

  1. Pull intercompany receivable/payable balances for each entity pair
  2. Compare Entity A's receivable from Entity B to Entity B's payable to Entity A
  3. Identify and resolve differences
  4. Confirm all intercompany transactions have been recorded on both sides
  5. Verify elimination entries are correct for consolidation

Common causes of differences:

  • Transactions recorded by one entity but not the other (timing)
  • Different FX rates used by each entity
  • Misclassification (intercompany vs third-party)
  • Disputed amounts or unapplied payments
  • Different period-end cut-off practices across entities

Reconciling Item Categorization

Category 1: Timing Differences

Items that exist because of normal processing timing and will clear without action:

  • Outstanding checks: Checks issued and recorded in GL, pending bank clearance
  • Deposits in transit: Deposits made and recorded in GL, pending bank credit
  • In-transit transactions: Items posted in one system but pending interface to the other
  • Pending approvals: Transactions awaiting approval to post in one system

Expected resolution: These items should clear within the normal processing cycle (typically 1-5 business days). No adjusting entry needed.

Category 2: Adjustments Required

Items that require a journal entry to correct:

  • Unrecorded bank charges: Bank fees, wire charges, returned item fees
  • Unrecorded interest: Interest income or expense from bank/lender
  • Recording errors: Wrong amount, wrong account, duplicates
  • Missing entries: Transactions in one system with no corresponding entry in the other
  • Classification errors: Correctly recorded but in the wrong account

Action: Prepare adjusting journal entry to correct the GL or subledger.

Category 3: Requires Investigation

Items that cannot be immediately explained:

  • Unidentified differences: Variances with no obvious cause
  • Disputed items: Amounts contested between parties
  • Aged outstanding items: Items that have not cleared within expected timeframes
  • Recurring unexplained differences: Same type of difference appearing each period

Action: Investigate root cause, document findings, escalate if unresolved.

Aging Analysis for Outstanding Items

Track the age of reconciling items to identify stale items requiring escalation:

Age Bucket Status Action
0-30 days Current Monitor — within normal processing cycle
31-60 days Aging Investigate — follow up on why item has not cleared
61-90 days Overdue Escalate — notify supervisor, document investigation
90+ days Stale Escalate to management — potential write-off or adjustment needed

Aging Report Format

Item # Description Amount Date Originated Age (Days) Category Status Owner
1 [Detail] $X,XXX [Date] XX [Type] [Status] [Name]

Trending

Track reconciling item totals over time to identify growing balances:

  • Compare total outstanding items to prior period
  • Flag if total reconciling items exceed materiality threshold
  • Flag if number of items is growing period over period
  • Identify recurring items that appear every period (may indicate process issue)

Escalation Thresholds

Define escalation triggers based on your organization's risk tolerance:

Trigger Threshold (Example) Escalation
Individual item amount > $10,000 Supervisor review
Individual item amount > $50,000 Controller review
Total reconciling items > $100,000 Controller review
Item age > 60 days Supervisor follow-up
Item age > 90 days Controller / management review
Unreconciled difference Any amount Cannot close — must resolve or document
Growing trend 3+ consecutive periods Process improvement investigation

Note: Set thresholds based on your organization's materiality level and risk appetite. The examples above are illustrative.

Reconciliation Best Practices

  1. Timeliness: Complete reconciliations within the close calendar deadline (typically T+3 to T+5 business days after period end)
  2. Completeness: Reconcile all balance sheet accounts on a defined frequency (monthly for material accounts, quarterly for immaterial)
  3. Documentation: Every reconciliation should include preparer, reviewer, date, and clear explanation of all reconciling items
  4. Segregation: The person who reconciles should not be the same person who processes transactions in that account
  5. Follow-through: Track open items to resolution — do not just carry items forward indefinitely
  6. Root cause analysis: For recurring reconciling items, investigate and fix the underlying process issue
  7. Standardization: Use consistent templates and procedures across all accounts
  8. Retention: Maintain reconciliations and supporting detail per your organization's document retention policy
用于SOX 404合规测试,支持生成样本选择、创建测试工作底稿及控制评估。涵盖收入、采购、ITGC等控制领域,提供控制矩阵识别、样本量计算及缺陷分类功能,辅助季度或年度内控测试规划。
生成SOX控制样本 创建测试工作底稿 评估控制缺陷 SOX 404季度或年度测试规划
finance/skills/sox-testing/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill sox-testing -g -y
SKILL.md
Frontmatter
{
    "name": "sox-testing",
    "description": "Generate SOX sample selections, testing workpapers, and control assessments. Use when planning quarterly or annual SOX 404 testing, pulling a sample for a control (revenue, P2P, ITGC, close), building a testing workpaper template, or evaluating and classifying a control deficiency.",
    "argument-hint": "<control area> [period]"
}

SOX Compliance Testing

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Important: This command assists with SOX compliance workflows but does not provide audit or legal advice. All testing workpapers and assessments should be reviewed by qualified financial professionals before use in audit documentation.

Generate sample selections, create testing workpapers, document control assessments, and provide testing templates for SOX 404 internal controls over financial reporting.

Usage

/sox <control-area> <period>

Arguments

  • control-area — The control area to test:
    • revenue-recognition — Revenue cycle controls (order-to-cash)
    • procure-to-pay or p2p — Procurement and AP controls (purchase-to-pay)
    • payroll — Payroll processing and compensation controls
    • financial-close — Period-end close and reporting controls
    • treasury — Cash management and treasury controls
    • fixed-assets — Capital asset lifecycle controls
    • inventory — Inventory valuation and management controls
    • itgc — IT general controls (access, change management, operations)
    • entity-level — Entity-level and monitoring controls
    • journal-entries — Journal entry processing controls
    • Any specific control ID or name
  • period — The testing period (e.g., 2024-Q4, 2024, 2024-H2)

Workflow

1. Identify Controls to Test

Based on the control area, identify the key controls. Present the control matrix:

Control # Control Description Type Frequency Key/Non-Key Risk Assertion
[ID] [Description] Manual/Automated/IT-Dependent Daily/Weekly/Monthly/Quarterly/Annual Key High/Medium/Low [CEAVOP]

Control types:

  • Automated: System-enforced controls with no manual intervention
  • Manual: Controls performed by personnel with judgment
  • IT-dependent manual: Manual controls that rely on system-generated data

Assertions (CEAVOP):

  • Completeness — All transactions are recorded
  • Existence/Occurrence — Transactions actually occurred
  • Accuracy — Amounts are correctly recorded
  • Valuation — Assets/liabilities are properly valued
  • Obligations/Rights — Entity has rights to assets, obligations for liabilities
  • Presentation/Disclosure — Properly classified and disclosed

2. Determine Sample Size

Calculate sample sizes based on control frequency and risk:

Control Frequency Population Size (approx.) Recommended Sample
Annual 1 1 (test the instance)
Quarterly 4 2
Monthly 12 2-4 (based on risk)
Weekly 52 5-15 (based on risk)
Daily ~250 20-40 (based on risk)
Per-transaction Varies 25-60 (based on risk and volume)

Adjust for:

  • Risk level: Higher risk controls require larger samples
  • Prior year results: Controls with prior deficiencies need larger samples
  • Reliance: Controls relied upon by external auditors may need larger samples

3. Generate Sample Selection

Select samples from the population using the appropriate method:

Random selection (default for transaction-level controls):

  • Generate random numbers to select specific items from the population
  • Ensure coverage across the full period

Systematic selection (for periodic controls):

  • Select items at fixed intervals with a random start point
  • Ensure representation across all sub-periods

Targeted selection (supplement to random, for risk-based testing):

  • Select items with specific risk characteristics (high dollar, unusual, period-end)
  • Document rationale for targeted selections

Present the sample:

SAMPLE SELECTION
Control: [Control ID] — [Description]
Period: [Testing period]
Population: [Count] items, $[Total value]
Sample size: [N] items
Selection method: [Random/Systematic/Targeted]

| Sample # | Transaction Date | Reference/ID | Amount | Selection Basis |
|----------|-----------------|--------------|--------|-----------------|
| 1        | [Date]          | [Ref]        | $X,XXX | Random          |
| 2        | [Date]          | [Ref]        | $X,XXX | Random          |
| ...      | ...             | ...          | ...    | ...             |

4. Create Testing Workpaper

Generate a testing template for each control:

SOX CONTROL TESTING WORKPAPER
==============================
Control #: [ID]
Control Description: [Full description of the control activity]
Control Owner: [Role/title — to be filled by tester]
Control Type: [Manual/Automated/IT-Dependent Manual]
Frequency: [How often the control operates]
Key Control: [Yes/No]
Relevant Assertion(s): [CEAVOP]
Testing Period: [Period]

TEST OBJECTIVE:
To determine whether [control description] operated effectively throughout the testing period.

TEST PROCEDURES:
1. [Step 1 — What to inspect, examine, or re-perform]
2. [Step 2 — What evidence to obtain]
3. [Step 3 — What to compare or verify]
4. [Step 4 — How to evaluate completeness of performance]
5. [Step 5 — How to assess timeliness of performance]

EXPECTED EVIDENCE:
- [Document type 1 — e.g., signed approval form]
- [Document type 2 — e.g., system screenshot showing review]
- [Document type 3 — e.g., reconciliation with preparer sign-off]

TEST RESULTS:

| Sample # | Ref | Procedure 1 | Procedure 2 | Procedure 3 | Result | Exception? | Notes |
|----------|-----|-------------|-------------|-------------|--------|------------|-------|
| 1        |     | Pass/Fail   | Pass/Fail   | Pass/Fail   | Pass/Fail | Y/N    |       |
| 2        |     | Pass/Fail   | Pass/Fail   | Pass/Fail   | Pass/Fail | Y/N    |       |

EXCEPTIONS NOTED:
| Sample # | Exception Description | Root Cause | Compensating Control | Impact |
|----------|----------------------|------------|---------------------|--------|
|          |                      |            |                     |        |

CONCLUSION:
[ ] Effective — Control operated effectively with no exceptions
[ ] Effective with exceptions — Control operated effectively; exceptions are isolated
[ ] Deficiency — Control did not operate effectively
[ ] Significant Deficiency — Deficiency is more than inconsequential
[ ] Material Weakness — Reasonable possibility of material misstatement not prevented/detected

Tested by: ________________  Date: ________
Reviewed by: _______________  Date: ________

5. Provide Common Control Templates

Based on the control area, provide pre-built test step templates:

Revenue Recognition:

  • Verify sales order approval and authorization
  • Confirm delivery/performance evidence
  • Test revenue recognition timing against contract terms
  • Verify pricing accuracy to contract/price list
  • Test credit memo approval and validity

Procure to Pay:

  • Verify purchase order approval and authorization limits
  • Confirm three-way match (PO, receipt, invoice)
  • Test vendor master data change controls
  • Verify payment approval and segregation of duties
  • Test duplicate payment prevention controls

Financial Close:

  • Verify account reconciliation completeness and timeliness
  • Test journal entry approval and segregation of duties
  • Verify management review of financial statements
  • Test consolidation and elimination entries
  • Verify disclosure checklist completion

ITGC:

  • Test user access provisioning and de-provisioning
  • Verify privileged access reviews
  • Test change management approval and testing
  • Verify batch job monitoring and exception handling
  • Test backup and recovery procedures

6. Document Control Assessment

Classify any identified deficiencies:

Deficiency: A control does not allow management or employees to prevent or detect misstatements on a timely basis. Consider:

  • Likelihood of misstatement
  • Magnitude of potential misstatement
  • Whether compensating controls exist

Significant Deficiency: A deficiency (or combination) that is less severe than a material weakness but important enough to merit attention by those responsible for oversight.

Material Weakness: A deficiency (or combination) such that there is a reasonable possibility that a material misstatement will not be prevented or detected on a timely basis.

7. Output

Provide:

  1. Control matrix for the selected area
  2. Sample selections with methodology documentation
  3. Testing workpaper templates with pre-populated test steps
  4. Results documentation template
  5. Deficiency evaluation framework (if exceptions are identified)
  6. Suggested remediation actions for any noted deficiencies
用于分解财务差异(如预算与实际、同期对比),识别价格、销量、人员及支出等驱动因素,生成叙事性解释和水位图分析。适用于向管理层汇报差异评论。
分析预算与实际差异 进行期间同比变化分析 审查收入或费用差异 为管理层准备差异评论
finance/skills/variance-analysis/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill variance-analysis -g -y
SKILL.md
Frontmatter
{
    "name": "variance-analysis",
    "description": "Decompose financial variances into drivers with narrative explanations and waterfall analysis. Use when analyzing budget vs. actual, period-over-period changes, revenue or expense variances, or preparing variance commentary for leadership.",
    "argument-hint": "<line item> <period> vs <comparison>"
}

Variance Analysis

Important: This skill assists with variance analysis workflows but does not provide financial advice. All analyses should be reviewed by qualified financial professionals before use in reporting.

Techniques for decomposing variances, materiality thresholds, narrative generation, waterfall chart methodology, and budget vs actual vs forecast comparisons.

Variance Decomposition Techniques

Price / Volume Decomposition

The most fundamental variance decomposition. Used for revenue, cost of goods, and any metric that can be expressed as Price x Volume.

Formula:

Total Variance = Actual - Budget (or Prior)

Volume Effect  = (Actual Volume - Budget Volume) x Budget Price
Price Effect   = (Actual Price - Budget Price) x Actual Volume
Mix Effect     = Residual (interaction term), or allocated proportionally

Verification:  Volume Effect + Price Effect = Total Variance
               (when mix is embedded in the price/volume terms)

Three-way decomposition (separating mix):

Volume Effect = (Actual Volume - Budget Volume) x Budget Price x Budget Mix
Price Effect  = (Actual Price - Budget Price) x Budget Volume x Actual Mix
Mix Effect    = Budget Price x Budget Volume x (Actual Mix - Budget Mix)

Example — Revenue variance:

  • Budget: 10,000 units at $50 = $500,000
  • Actual: 11,000 units at $48 = $528,000
  • Total variance: +$28,000 favorable
    • Volume effect: +1,000 units x $50 = +$50,000 (favorable — sold more units)
    • Price effect: -$2 x 11,000 units = -$22,000 (unfavorable — lower ASP)
    • Net: +$28,000

Rate / Mix Decomposition

Used when analyzing blended rates across segments with different unit economics.

Formula:

Rate Effect = Sum of (Actual Volume_i x (Actual Rate_i - Budget Rate_i))
Mix Effect  = Sum of (Budget Rate_i x (Actual Volume_i - Expected Volume_i at Budget Mix))

Example — Gross margin variance:

  • Product A: 60% margin, Product B: 40% margin
  • Budget mix: 50% A, 50% B → Blended margin 50%
  • Actual mix: 40% A, 60% B → Blended margin 48%
  • Mix effect explains 2pp of margin compression

Headcount / Compensation Decomposition

Used for analyzing payroll and people-cost variances.

Total Comp Variance = Actual Compensation - Budget Compensation

Decompose into:
1. Headcount variance    = (Actual HC - Budget HC) x Budget Avg Comp
2. Rate variance         = (Actual Avg Comp - Budget Avg Comp) x Budget HC
3. Mix variance          = Difference due to level/department mix shift
4. Timing variance       = Hiring earlier/later than planned (partial-period effect)
5. Attrition impact      = Savings from unplanned departures (partially offset by backfill costs)

Spend Category Decomposition

Used for operating expense analysis when price/volume is not applicable.

Total OpEx Variance = Actual OpEx - Budget OpEx

Decompose by:
1. Headcount-driven costs    (salaries, benefits, payroll taxes, recruiting)
2. Volume-driven costs       (hosting, transaction fees, commissions, shipping)
3. Discretionary spend       (travel, events, professional services, marketing programs)
4. Contractual/fixed costs   (rent, insurance, software licenses, subscriptions)
5. One-time / non-recurring  (severance, legal settlements, write-offs, project costs)
6. Timing / phasing          (spend shifted between periods vs plan)

Materiality Thresholds and Investigation Triggers

Setting Thresholds

Materiality thresholds determine which variances require investigation and narrative explanation. Set thresholds based on:

  1. Financial statement materiality: Typically 1-5% of a key benchmark (revenue, total assets, net income)
  2. Line item size: Larger line items warrant lower percentage thresholds
  3. Volatility: More volatile line items may need higher thresholds to avoid noise
  4. Management attention: What level of variance would change a decision?

Recommended Threshold Framework

Comparison Type Dollar Threshold Percentage Threshold Trigger
Actual vs Budget Organization-specific 10% Either exceeded
Actual vs Prior Period Organization-specific 15% Either exceeded
Actual vs Forecast Organization-specific 5% Either exceeded
Sequential (MoM) Organization-specific 20% Either exceeded

Set dollar thresholds based on your organization's size. Common practice: 0.5%-1% of revenue for income statement items.

Investigation Priority

When multiple variances exceed thresholds, prioritize investigation by:

  1. Largest absolute dollar variance — biggest P&L impact
  2. Largest percentage variance — may indicate process issue or error
  3. Unexpected direction — variance opposite to trend or expectation
  4. New variance — item that was on track and is now off
  5. Cumulative/trending variance — growing each period

Narrative Generation for Variance Explanations

Structure for Each Variance Narrative

[Line Item]: [Favorable/Unfavorable] variance of $[amount] ([percentage]%)
vs [comparison basis] for [period]

Driver: [Primary driver description]
[2-3 sentences explaining the business reason for the variance, with specific
quantification of contributing factors]

Outlook: [One-time / Expected to continue / Improving / Deteriorating]
Action: [None required / Monitor / Investigate further / Update forecast]

Narrative Quality Checklist

Good variance narratives should be:

  • Specific: Names the actual driver, not just "higher than expected"
  • Quantified: Includes dollar and percentage impact of each driver
  • Causal: Explains WHY it happened, not just WHAT happened
  • Forward-looking: States whether the variance is expected to continue
  • Actionable: Identifies any required follow-up or decision
  • Concise: 2-4 sentences, not a paragraph of filler

Common Narrative Anti-Patterns to Avoid

  • "Revenue was higher than budget due to higher revenue" (circular — no actual explanation)
  • "Expenses were elevated this period" (vague — which expenses? why?)
  • "Timing" without specifying what was early/late and when it will normalize
  • "One-time" without explaining what the item was
  • "Various small items" for a material variance (must decompose further)
  • Focusing only on the largest driver and ignoring offsetting items

Waterfall Chart Methodology

Concept

A waterfall (or bridge) chart shows how you get from one value to another through a series of positive and negative contributors. Used to visualize variance decomposition.

Data Structure

Starting value:  [Base/Budget/Prior period amount]
Drivers:         [List of contributing factors with signed amounts]
Ending value:    [Actual/Current period amount]

Verification:    Starting value + Sum of all drivers = Ending value

Text-Based Waterfall Format

When a charting tool is not available, present as a text waterfall:

WATERFALL: Revenue — Q4 Actual vs Q4 Budget

Q4 Budget Revenue                                    $10,000K
  |
  |--[+] Volume growth (new customers)               +$800K
  |--[+] Expansion revenue (existing customers)      +$400K
  |--[-] Price reductions / discounting               -$200K
  |--[-] Churn / contraction                          -$350K
  |--[+] FX tailwind                                  +$50K
  |--[-] Timing (deals slipped to Q1)                 -$150K
  |
Q4 Actual Revenue                                    $10,550K

Net Variance: +$550K (+5.5% favorable)

Bridge Reconciliation Table

Complement the waterfall with a reconciliation table:

Driver Amount % of Variance Cumulative
Volume growth +$800K 145% +$800K
Expansion revenue +$400K 73% +$1,200K
Price reductions -$200K -36% +$1,000K
Churn / contraction -$350K -64% +$650K
FX tailwind +$50K 9% +$700K
Timing (deal slippage) -$150K -27% +$550K
Total variance +$550K 100%

Note: Percentages can exceed 100% for individual drivers when there are offsetting items.

Waterfall Best Practices

  1. Order drivers from largest positive to largest negative (or in logical business sequence)
  2. Keep to 5-8 drivers maximum — aggregate smaller items into "Other"
  3. Verify the waterfall reconciles (start + drivers = end)
  4. Color-code: green for favorable, red for unfavorable (in visual charts)
  5. Label each bar with both the amount and a brief description
  6. Include a "Total Variance" summary bar

Budget vs Actual vs Forecast Comparisons

Three-Way Comparison Framework

Metric Budget Forecast Actual Bud Var ($) Bud Var (%) Fcast Var ($) Fcast Var (%)
Revenue $X $X $X $X X% $X X%
COGS $X $X $X $X X% $X X%
Gross Profit $X $X $X $X X% $X X%

When to Use Each Comparison

  • Actual vs Budget: Annual performance measurement, compensation decisions, board reporting. Budget is set at the beginning of the year and typically not changed.
  • Actual vs Forecast: Operational management, identifying emerging issues. Forecast is updated periodically (monthly or quarterly) to reflect current expectations.
  • Forecast vs Budget: Understanding how expectations have changed since planning. Useful for identifying planning accuracy issues.
  • Actual vs Prior Period: Trend analysis, sequential performance. Useful when budget is not meaningful (new business lines, post-acquisition).
  • Actual vs Prior Year: Year-over-year growth analysis, seasonality-adjusted comparison.

Forecast Accuracy Analysis

Track how accurate forecasts are over time to improve planning:

Forecast Accuracy = 1 - |Actual - Forecast| / |Actual|

MAPE (Mean Absolute Percentage Error) = Average of |Actual - Forecast| / |Actual| across periods
Period Forecast Actual Variance Accuracy
Jan $X $X $X (X%) XX%
Feb $X $X $X (X%) XX%
... ... ... ... ...
Avg MAPE XX%

Variance Trending

Track how variances evolve over the year to identify systematic bias:

  • Consistently favorable: Budget may be too conservative (sandbagging)
  • Consistently unfavorable: Budget may be too aggressive or execution issues
  • Growing unfavorable: Deteriorating performance or unrealistic targets
  • Shrinking variance: Forecast accuracy improving through the year (normal pattern)
  • Volatile: Unpredictable business or poor forecasting methodology
用于薪酬分析、市场对标、职级定位及股权建模。支持单角色查询或上传数据识别异常值与留存风险,提供分位数基准和建议。
询问特定角色的薪资建议 评估报价竞争力 进行股权授予建模 上传薪酬数据以发现异常值
human-resources/skills/comp-analysis/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill comp-analysis -g -y
SKILL.md
Frontmatter
{
    "name": "comp-analysis",
    "description": "Analyze compensation — benchmarking, band placement, and equity modeling. Trigger with \"what should we pay a [role]\", \"is this offer competitive\", \"model this equity grant\", or when uploading comp data to find outliers and retention risks.",
    "argument-hint": "<role, level, or dataset>"
}

/comp-analysis

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Analyze compensation data for benchmarking, band placement, and planning. Helps benchmark compensation against market data for hiring, retention, and equity planning.

Usage

/comp-analysis $ARGUMENTS

What I Need From You

Option A: Single role analysis "What should we pay a Senior Software Engineer in SF?"

Option B: Upload comp data Upload a CSV or paste your comp bands. I'll analyze placement, identify outliers, and compare to market.

Option C: Equity modeling "Model a refresh grant of 10K shares over 4 years at a $50 stock price."

Compensation Framework

Components of Total Compensation

  • Base salary: Cash compensation
  • Equity: RSUs, stock options, or other equity
  • Bonus: Annual target bonus, signing bonus
  • Benefits: Health, retirement, perks (harder to quantify)

Key Variables

  • Role: Function and specialization
  • Level: IC levels, management levels
  • Location: Geographic pay adjustments
  • Company stage: Startup vs. growth vs. public
  • Industry: Tech vs. finance vs. healthcare

Data Sources

  • With ~~compensation data: Pull verified benchmarks
  • Without: Use web research, public salary data, and user-provided context
  • Always note data freshness and source limitations

Output

Provide percentile bands (25th, 50th, 75th, 90th) for base, equity, and total comp. Include location adjustments and company-stage context.

## Compensation Analysis: [Role/Scope]

### Market Benchmarks
| Percentile | Base | Equity | Total Comp |
|------------|------|--------|------------|
| 25th | $[X] | $[X] | $[X] |
| 50th | $[X] | $[X] | $[X] |
| 75th | $[X] | $[X] | $[X] |
| 90th | $[X] | $[X] | $[X] |

**Sources:** [Web research, compensation data tools, or user-provided data]

### Band Analysis (if data provided)
| Employee | Current Base | Band Min | Band Mid | Band Max | Position |
|----------|-------------|----------|----------|----------|----------|
| [Name] | $[X] | $[X] | $[X] | $[X] | [Below/At/Above] |

### Recommendations
- [Specific compensation recommendations]
- [Equity considerations]
- [Retention risks if applicable]

If Connectors Available

If ~~compensation data is connected:

  • Pull verified market benchmarks by role, level, and location
  • Compare your bands against real-time market data

If ~~HRIS is connected:

  • Pull current employee comp data for band analysis
  • Identify outliers and retention risks automatically

Tips

  1. Location matters — Always specify location for benchmarking. SF vs. Austin vs. London are very different.
  2. Total comp, not just base — Include equity, bonus, and benefits for a complete picture.
  3. Keep data confidential — Comp data is sensitive. Results stay in your conversation.
用于为新入职候选人起草完整的录用通知书,包含薪酬包(底薪、股权、签字费)、条款及福利摘要。同时为招聘经理提供谈判指导和背景信息,支持HRIS和ATS集成以自动填充数据。
候选人已确定接受offer,需要生成正式录用通知 需要为招聘经理准备薪酬谈判策略或总包计算 起草包含具体职位级别和地点的薪资结构文档
human-resources/skills/draft-offer/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill draft-offer -g -y
SKILL.md
Frontmatter
{
    "name": "draft-offer",
    "description": "Draft an offer letter with comp details and terms. Use when a candidate is ready for an offer, assembling a total comp package (base, equity, signing bonus), writing the offer letter text itself, or prepping negotiation guidance for the hiring manager.",
    "argument-hint": "<role and level>"
}

/draft-offer

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Draft a complete offer letter for a new hire.

Usage

/draft-offer $ARGUMENTS

What I Need From You

  • Role and title: What position?
  • Level: Junior, Mid, Senior, Staff, etc.
  • Location: Where will they be based? (affects comp and benefits)
  • Compensation: Base salary, equity, signing bonus (if applicable)
  • Start date: When should they start?
  • Hiring manager: Who will they report to?

If you don't have all details, I'll help you think through them.

Output

## Offer Letter Draft: [Role] — [Level]

### Compensation Package
| Component | Details |
|-----------|---------|
| **Base Salary** | $[X]/year |
| **Equity** | [X shares/units], [vesting schedule] |
| **Signing Bonus** | $[X] (if applicable) |
| **Target Bonus** | [X]% of base (if applicable) |
| **Total First-Year Comp** | $[X] |

### Terms
- **Start Date**: [Date]
- **Reports To**: [Manager]
- **Location**: [Office / Remote / Hybrid]
- **Employment Type**: [Full-time, Exempt]

### Benefits Summary
[Key benefits highlights relevant to the candidate]

### Offer Letter Text

Dear [Candidate Name],

We are pleased to offer you the position of [Title] at [Company]...

[Complete offer letter text]

### Notes for Hiring Manager
- [Negotiation guidance if needed]
- [Comp band context]
- [Any flags or considerations]

If Connectors Available

If ~~HRIS is connected:

  • Pull comp band data for the level/role
  • Verify headcount approval
  • Auto-populate benefits details

If ~~ATS is connected:

  • Pull candidate details from the application
  • Update offer status in the pipeline

Tips

  1. Include total comp — Candidates compare total compensation, not just base.
  2. Be specific about equity — Share count, current valuation method, vesting schedule.
  3. Personalize — Reference something from the interview process to make it warm.
用于创建结构化的面试计划,包含基于能力的行为与情境问题、评分量表及反馈模板。旨在通过标准化流程评估候选人,确保公平一致,减少偏见,提升招聘质量。
用户输入“interview plan for” 用户输入“interview questions for” 用户询问“how should we interview” 用户输入“scorecard for” 用户表示正在准备面试候选人
human-resources/skills/interview-prep/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill interview-prep -g -y
SKILL.md
Frontmatter
{
    "name": "interview-prep",
    "description": "Create structured interview plans with competency-based questions and scorecards. Trigger with \"interview plan for\", \"interview questions for\", \"how should we interview\", \"scorecard for\", or when the user is preparing to interview candidates."
}

Interview Prep

Create structured interview plans to evaluate candidates consistently and fairly.

Interview Design Principles

  1. Structured: Same questions for all candidates in the role
  2. Competency-based: Map questions to specific skills and behaviors
  3. Evidence-based: Use behavioral and situational questions
  4. Diverse panel: Multiple perspectives reduce bias
  5. Scored: Use rubrics, not gut feelings

Interview Plan Components

Role Competencies

Define 4-6 key competencies for the role (e.g., technical skills, communication, leadership, problem-solving).

Question Bank

For each competency, provide:

  • 2-3 behavioral questions ("Tell me about a time...")
  • 1-2 situational questions ("How would you handle...")
  • Follow-up probes

Scorecard

Rate each competency on a consistent scale (1-4) with clear descriptions of what each level looks like.

Debrief Template

Structured format for interviewers to share findings and make a decision.

Output

Produce a complete interview kit: panel assignment (who interviews for what), question bank by competency, scoring rubric, and debrief template.

为新员工生成全面的入职计划,涵盖入职前准备、第一天日程、首周任务及30/60/90天目标。需输入姓名、职位、团队和入职日期等信息,可结合连接器自动填充信息或创建日历事件。
新员工即将入职 制定入职检查清单 安排第一周日程 设定30/60/90天目标
human-resources/skills/onboarding/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill onboarding -g -y
SKILL.md
Frontmatter
{
    "name": "onboarding",
    "description": "Generate an onboarding checklist and first-week plan for a new hire. Use when someone has a start date coming up, building the pre-start task list (accounts, equipment, buddy), scheduling Day 1 and Week 1, or setting 30\/60\/90-day goals for a new team member.",
    "argument-hint": "<new hire name and role>"
}

/onboarding

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Generate a comprehensive onboarding plan for a new team member.

Usage

/onboarding $ARGUMENTS

What I Need From You

  • New hire name: Who's starting?
  • Role: What position?
  • Team: Which team are they joining?
  • Start date: When do they start?
  • Manager: Who's their manager?

Output

## Onboarding Plan: [Name] — [Role]
**Start Date:** [Date] | **Team:** [Team] | **Manager:** [Manager]

### Pre-Start (Before Day 1)
- [ ] Send welcome email with start date, time, and logistics
- [ ] Set up accounts: email, Slack, [tools for role]
- [ ] Order equipment (laptop, monitor, peripherals)
- [ ] Add to team calendar and recurring meetings
- [ ] Assign onboarding buddy: [Suggested person]
- [ ] Prepare desk / remote setup instructions

### Day 1
| Time | Activity | With |
|------|----------|------|
| 9:00 | Welcome and orientation | Manager |
| 10:00 | IT setup and tool walkthrough | IT / Buddy |
| 11:00 | Team introductions | Team |
| 12:00 | Welcome lunch | Manager + Team |
| 1:30 | Company overview and values | Manager |
| 3:00 | Role expectations and 30/60/90 plan | Manager |
| 4:00 | Free time to explore tools and docs | Self |

### Week 1
- [ ] Complete required compliance training
- [ ] Read key documentation: [list for role]
- [ ] 1:1 with each team member
- [ ] Shadow key meetings
- [ ] First small task or project assigned
- [ ] End-of-week check-in with manager

### 30-Day Goals
1. [Goal aligned to role]
2. [Goal aligned to role]
3. [Goal aligned to role]

### 60-Day Goals
1. [Goal]
2. [Goal]

### 90-Day Goals
1. [Goal]
2. [Goal]

### Key Contacts
| Person | Role | For What |
|--------|------|----------|
| [Manager] | Manager | Day-to-day guidance |
| [Buddy] | Onboarding Buddy | Questions, culture, navigation |
| [IT Contact] | IT | Tool access, equipment |
| [HR Contact] | HR | Benefits, policies |

### Tools Access Needed
| Tool | Access Level | Requested |
|------|-------------|-----------|
| [Tool] | [Level] | [ ] |

If Connectors Available

If ~~HRIS is connected:

  • Pull new hire details and team org chart
  • Auto-populate tools access list based on role

If ~~knowledge base is connected:

  • Link to relevant onboarding docs, team wikis, and runbooks
  • Pull the team's existing onboarding checklist to customize

If ~~calendar is connected:

  • Create Day 1 calendar events and Week 1 meeting invites automatically

Tips

  1. Customize for the role — An engineer's onboarding looks different from a designer's.
  2. Don't overload Day 1 — Focus on setup and relationships. Deep work starts Week 2.
  3. Assign a buddy — Having a go-to person who isn't their manager makes a huge difference.
辅助进行组织规划、人员编制设计及团队结构优化。涵盖人数、汇报关系、招聘优先级及成本建模,提供健康基准检查并输出组织结构图与招聘路线图。
org planning headcount plan team structure reorg who should we hire next
human-resources/skills/org-planning/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill org-planning -g -y
SKILL.md
Frontmatter
{
    "name": "org-planning",
    "description": "Headcount planning, org design, and team structure optimization. Trigger with \"org planning\", \"headcount plan\", \"team structure\", \"reorg\", \"who should we hire next\", or when the user is thinking about team size, reporting structure, or organizational design."
}

Org Planning

Help plan organizational structure, headcount, and team design.

Planning Dimensions

  • Headcount: How many people do we need, in what roles, by when?
  • Structure: Reporting lines, span of control, team boundaries
  • Sequencing: Which hires are most critical? What's the right order?
  • Budget: Headcount cost modeling and trade-offs

Healthy Org Benchmarks

Metric Healthy Range Warning Sign
Span of control 5-8 direct reports < 3 or > 12
Management layers 4-6 for 500 people Too many = slow decisions
IC-to-manager ratio 6:1 to 10:1 < 4:1 = top-heavy
Team size 5-9 people < 4 = lonely, > 12 = hard to manage

Output

Produce org charts (text-based), headcount plans with cost modeling, and sequenced hiring roadmaps. Flag structural issues like single points of failure or excessive management overhead.

用于生成人员分析报告,涵盖人数、流失率、多样性和组织健康度。适用于领导层快照、离职趋势分析及飞行风险预测等场景。
需要生成员工人数快照 分析团队离职趋势 准备多样性指标 评估管理幅度和飞行风险
human-resources/skills/people-report/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill people-report -g -y
SKILL.md
Frontmatter
{
    "name": "people-report",
    "description": "Generate headcount, attrition, diversity, or org health reports. Use when pulling a headcount snapshot for leadership, analyzing turnover trends by team, preparing diversity representation metrics, or assessing span of control and flight risk across the org.",
    "argument-hint": "<report type — headcount, attrition, diversity, org health>"
}

/people-report

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Generate people analytics reports from your HR data. Analyze workforce data to surface trends, risks, and opportunities.

Usage

/people-report $ARGUMENTS

Report Types

Headcount: Current org snapshot — by team, location, level, tenure Attrition: Turnover analysis — voluntary/involuntary, by team, trends Diversity: Representation metrics — by level, team, pipeline Org Health: Span of control, management layers, team sizes, flight risk

Key Metrics

Retention

  • Overall attrition rate (voluntary + involuntary)
  • Regrettable attrition rate
  • Average tenure
  • Flight risk indicators

Diversity

  • Representation by level, team, and function
  • Pipeline diversity (hiring funnel by demographic)
  • Promotion rates by group
  • Pay equity analysis

Engagement

  • Survey scores and trends
  • eNPS (Employee Net Promoter Score)
  • Participation rates
  • Open-ended feedback themes

Productivity

  • Revenue per employee
  • Span of control efficiency
  • Time to productivity for new hires

Approach

  1. Understand what question they're trying to answer
  2. Identify the right data (upload, paste, or pull from ~~HRIS)
  3. Analyze with appropriate statistical methods
  4. Present findings with context and caveats
  5. Recommend specific actions based on data

What I Need From You

Upload a CSV or describe your data. Helpful fields:

  • Employee name/ID, department, team
  • Title, level, location
  • Start date, end date (if applicable)
  • Manager, compensation (if relevant)
  • Demographics (for diversity reports, if available)

Output

## People Report: [Type] — [Date]

### Executive Summary
[2-3 key takeaways]

### Key Metrics
| Metric | Value | Trend |
|--------|-------|-------|
| [Metric] | [Value] | [up/down/flat] |

### Detailed Analysis
[Charts, tables, and narrative for the specific report type]

### Recommendations
- [Data-driven recommendation]
- [Action item]

### Methodology
[How the numbers were calculated, any caveats]

If Connectors Available

If ~~HRIS is connected:

  • Pull live employee data — headcount, tenure, department, level
  • Generate reports without needing a CSV upload

If ~~chat is connected:

  • Offer to share the report summary in a relevant channel
用于生成绩效评估模板,支持自评、经理评价及校准准备。帮助结构化反馈,将模糊意见转化为具体行为案例,涵盖目标回顾、优缺点分析及发展计划制定。
需要撰写个人绩效自评 为下属撰写经理绩效评估 准备绩效校准会议材料 需要将模糊反馈转化为具体行为示例
human-resources/skills/performance-review/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill performance-review -g -y
SKILL.md
Frontmatter
{
    "name": "performance-review",
    "description": "Structure a performance review with self-assessment, manager template, and calibration prep. Use when review season kicks off and you need a self-assessment template, writing a manager review for a direct report, prepping rating distributions and promotion cases for calibration, or turning vague feedback into specific behavioral examples.",
    "argument-hint": "<employee name or review cycle>"
}

/performance-review

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Generate performance review templates and help structure feedback.

Usage

/performance-review $ARGUMENTS

Modes

/performance-review self-assessment       # Generate self-assessment template
/performance-review manager [employee]    # Manager review template for a specific person
/performance-review calibration           # Calibration prep document

If no mode is specified, ask what type of review they need.

Output — Self-Assessment Template

## Self-Assessment: [Review Period]

### Key Accomplishments
[List your top 3-5 accomplishments this period. For each, describe the situation, your contribution, and the impact.]

1. **[Accomplishment]**
   - Situation: [Context]
   - Contribution: [What you did]
   - Impact: [Measurable result]

### Goals Review
| Goal | Status | Evidence |
|------|--------|----------|
| [Goal from last period] | Met / Exceeded / Missed | [How you know] |

### Growth Areas
[Where did you grow? New skills, expanded scope, leadership moments.]

### Challenges
[What was hard? What would you do differently?]

### Goals for Next Period
1. [Goal — specific and measurable]
2. [Goal]
3. [Goal]

### Feedback for Manager
[How can your manager better support you?]

Output — Manager Review

## Performance Review: [Employee Name]
**Period:** [Date range] | **Manager:** [Your name]

### Overall Rating: [Exceeds / Meets / Below Expectations]

### Performance Summary
[2-3 sentence overall assessment]

### Key Strengths
- [Strength with specific example]
- [Strength with specific example]

### Areas for Development
- [Area with specific, actionable guidance]
- [Area with specific, actionable guidance]

### Goal Achievement
| Goal | Rating | Comments |
|------|--------|----------|
| [Goal] | [Rating] | [Specific observations] |

### Impact and Contributions
[Describe their biggest contributions and impact on the team/org]

### Development Plan
| Skill | Current | Target | Actions |
|-------|---------|--------|---------|
| [Skill] | [Level] | [Level] | [How to get there] |

### Compensation Recommendation
[Promotion / Equity refresh / Adjustment / No change — with justification]

Output — Calibration

## Calibration Prep: [Review Cycle]
**Manager:** [Your name] | **Team:** [Team] | **Period:** [Date range]

### Team Overview
| Employee | Role | Level | Tenure | Proposed Rating | Notes |
|----------|------|-------|--------|-----------------|-------|
| [Name] | [Role] | [Level] | [X years] | [Rating] | [Key context] |

### Rating Distribution
| Rating | Count | % of Team | Company Target |
|--------|-------|-----------|----------------|
| Exceeds Expectations | [X] | [X]% | ~15-20% |
| Meets Expectations | [X] | [X]% | ~60-70% |
| Below Expectations | [X] | [X]% | ~10-15% |

### Calibration Discussion Points
1. **[Employee]** — [Why this rating may need discussion, e.g., borderline, first review at level, recent role change]
2. **[Employee]** — [Discussion point]

### Promotion Candidates
| Employee | Current Level | Proposed Level | Justification |
|----------|-------------|----------------|---------------|
| [Name] | [Current] | [Proposed] | [Evidence of next-level performance] |

### Compensation Actions
| Employee | Action | Justification |
|----------|--------|---------------|
| [Name] | [Promotion / Equity refresh / Market adjustment / Retention] | [Why] |

### Manager Notes
[Context the calibration group should know — team changes, org shifts, project impacts]

If Connectors Available

If ~~HRIS is connected:

  • Pull prior review history and goal tracking data
  • Pre-populate employee details and current role information

If ~~project tracker is connected:

  • Pull completed work and contributions for the review period
  • Reference specific tickets and project milestones as evidence

Tips

  1. Be specific — "Great job" isn't feedback. "You reduced deploy time 40% by implementing the new CI pipeline" is.
  2. Balance positive and constructive — Both are essential. Neither should be a surprise.
  3. Focus on behaviors, not personality — "Your documentation has been incomplete" vs. "You're careless."
  4. Make development actionable — "Improve communication" is vague. "Present at the next team all-hands" is actionable.
通过自然语言查询并解释公司政策、福利及手册规则。支持独立使用或连接知识库/HRIS增强功能,提供清晰答案、引用来源及联系方式,涵盖休假、薪酬、远程办公等主题。
询问假期政策(如PTO) 咨询远程工作规定 了解费用报销流程 查询福利与保险细节 任何关于员工手册或公司制度的日常问题
human-resources/skills/policy-lookup/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill policy-lookup -g -y
SKILL.md
Frontmatter
{
    "name": "policy-lookup",
    "description": "Find and explain company policies in plain language. Trigger with \"what's our PTO policy\", \"can I work remotely from another country\", \"how do expenses work\", or any plain-language question about benefits, travel, leave, or handbook rules.",
    "argument-hint": "<policy topic — PTO, benefits, travel, expenses, etc.>"
}

/policy-lookup

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Look up and explain company policies in plain language. Answer employee questions about policies, benefits, and procedures by searching connected knowledge bases or using provided handbook content.

Usage

/policy-lookup $ARGUMENTS

Search for policies matching: $ARGUMENTS

How It Works

┌─────────────────────────────────────────────────────────────────┐
│                    POLICY LOOKUP                                   │
├─────────────────────────────────────────────────────────────────┤
│  STANDALONE (always works)                                       │
│  ✓ Ask any policy question in plain language                    │
│  ✓ Paste your employee handbook and I'll search it              │
│  ✓ Get clear, jargon-free answers                               │
├─────────────────────────────────────────────────────────────────┤
│  SUPERCHARGED (when you connect your tools)                      │
│  + Knowledge base: Search handbook and policy docs automatically │
│  + HRIS: Pull employee-specific details (PTO balance, benefits) │
└─────────────────────────────────────────────────────────────────┘

Common Policy Topics

  • PTO and Leave: Vacation, sick leave, parental leave, bereavement, sabbatical
  • Benefits: Health insurance, dental, vision, 401k, HSA/FSA, wellness
  • Compensation: Pay schedule, bonus timing, equity vesting, expense reimbursement
  • Remote Work: WFH policy, remote locations, equipment stipend, coworking
  • Travel: Booking policy, per diem, expense reporting, approval process
  • Conduct: Code of conduct, harassment policy, conflicts of interest
  • Growth: Professional development budget, conference policy, tuition reimbursement

How to Answer

  1. Search ~~knowledge base for the relevant policy document
  2. Provide a clear, plain-language answer
  3. Quote the specific policy language
  4. Note any exceptions or special cases
  5. Point to who to contact for edge cases

Important guardrails:

  • Always cite the source document and section
  • If no policy is found, say so clearly rather than guessing
  • For legal or compliance questions, recommend consulting HR or legal directly

Output

## Policy: [Topic]

### Quick Answer
[1-2 sentence direct answer to their question]

### Details
[Relevant policy details, explained in plain language]

### Exceptions / Special Cases
[Any relevant exceptions or edge cases]

### Who to Contact
[Person or team for questions beyond what's documented]

### Source
[Where this information came from — document name, page, or section]

If Connectors Available

If ~~knowledge base is connected:

  • Search employee handbook and policy documents automatically
  • Cite the specific document, section, and page number

If ~~HRIS is connected:

  • Pull employee-specific details like PTO balance, benefits elections, and enrollment status

Tips

  1. Ask in plain language — "Can I work from Europe for a month?" is better than "international remote work policy."
  2. Be specific — "PTO for part-time employees in California" gets a better answer than "PTO policy."
管理招聘全流程,涵盖从寻源到录用接受各阶段。支持追踪候选人状态、计算转化率和招聘周期等关键指标,并可与ATS集成实现数据自动同步与实时更新。
用户提及招聘更新或候选人管道 询问候选人数量或招聘状态 讨论寻源、筛选、面试或发offer环节
human-resources/skills/recruiting-pipeline/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill recruiting-pipeline -g -y
SKILL.md
Frontmatter
{
    "name": "recruiting-pipeline",
    "description": "Track and manage recruiting pipeline stages. Trigger with \"recruiting update\", \"candidate pipeline\", \"how many candidates\", \"hiring status\", or when the user discusses sourcing, screening, interviewing, or extending offers."
}

Recruiting Pipeline

Help manage the recruiting pipeline from sourcing through offer acceptance.

Pipeline Stages

Stage Description Key Actions
Sourced Identified and reached out Personalized outreach
Screen Phone/video screen Evaluate basic fit
Interview On-site or panel interviews Structured evaluation
Debrief Team decision Calibrate feedback
Offer Extending offer Comp package, negotiation
Accepted Offer accepted Transition to onboarding

Metrics to Track

  • Pipeline velocity: Days per stage
  • Conversion rates: Stage-to-stage drop-off
  • Source effectiveness: Which channels produce hires
  • Offer acceptance rate: Offers extended vs. accepted
  • Time to fill: Days from req open to offer accepted

If ATS Connected

Pull candidate data automatically, update statuses, and track pipeline metrics in real time.

为法律团队生成上下文简报,支持每日、主题研究和突发事件三种模式。扫描邮件、日历、合同等来源,提供待办事项、截止日期及关键信息汇总,辅助快速决策与合规工作。
需要每日法律工作摘要 针对特定法律问题进行搜索研究 应对数据泄露或诉讼威胁等突发紧急事件
legal/skills/brief/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill brief -g -y
SKILL.md
Frontmatter
{
    "name": "brief",
    "description": "Generate contextual briefings for legal work — daily summary, topic research, or incident response. Use when starting your day and need a scan of legal-relevant items across email, calendar, and contracts, when researching a specific legal question across internal sources, or when a developing situation (data breach, litigation threat, regulatory inquiry) needs rapid context.",
    "argument-hint": "[daily | topic <query> | incident]"
}

/brief -- Legal Team Briefing

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Generate contextual briefings for legal work. Supports three modes: daily brief, topic brief, and incident brief.

Important: This command assists with legal workflows but does not provide legal advice. Briefings should be reviewed by qualified legal professionals before being relied upon.

Invocation

/brief daily              # Morning brief of legal-relevant items
/brief topic [query]      # Research brief on a specific legal question
/brief incident [topic]   # Rapid brief on a developing situation

If no mode is specified, ask the user which type of brief they need.

Modes


Daily Brief

A morning summary of everything a legal team member needs to know to start their day.

Sources to Scan

Check each connected source for legal-relevant items:

Email (if connected):

  • New contract requests or review requests
  • Compliance questions or reports
  • Responses from counterparties on active negotiations
  • Flagged or urgent items from the legal team inbox
  • External counsel communications
  • Regulatory or legal update newsletters

Calendar (if connected):

  • Today's meetings that need legal prep (board meetings, deal reviews, vendor calls)
  • Upcoming deadlines this week (contract expirations, filing deadlines, response deadlines)
  • Recurring legal team syncs

Chat (if connected):

  • Overnight messages in legal team channels
  • Direct messages requesting legal input
  • Mentions of legal-relevant topics (contract, compliance, privacy, NDA, terms)
  • Escalations or urgent requests

CLM (if connected):

  • Contracts awaiting review or signature
  • Approaching expiration dates (next 30 days)
  • Newly executed agreements

CRM (if connected):

  • Deals moving to stages that require legal involvement
  • New opportunities flagged for legal review

Output Format

## Daily Legal Brief -- [Date]

### Urgent / Action Required
[Items needing immediate attention, sorted by urgency]

### Contract Pipeline
- **Awaiting Your Review**: [count and list]
- **Pending Counterparty Response**: [count and list]
- **Approaching Deadlines**: [items due this week]

### New Requests
[Contract review requests, NDA requests, compliance questions received since last brief]

### Calendar Today
[Meetings with legal relevance and what prep is needed]

### Team Activity
[Key messages or updates from legal team channels]

### This Week's Deadlines
[Upcoming deadlines and filing dates]

### Sources Not Available
[Any sources that were not connected or returned errors]

Topic Brief

Research and brief on a specific legal question or topic across available sources.

Workflow

  1. Accept the topic query from the user
  2. Search across connected sources:
    • Documents: Internal memos, prior analyses, playbooks, precedent
    • Email: Prior communications on the topic
    • Chat: Team discussions about the topic
    • CLM: Related contracts or clauses
  3. Synthesize findings into a structured brief

Output Format

## Topic Brief: [Topic]

### Summary
[2-3 sentence executive summary of findings]

### Background
[Context and history from internal sources]

### Current State
[What the organization's current position or approach is, based on available documents]

### Key Considerations
[Important factors, risks, or open questions]

### Internal Precedent
[Prior decisions, memos, or positions found in internal sources]

### Gaps
[What information is missing or what sources were not available]

### Recommended Next Steps
[What the user should do with this information]

Important Notes

  • Topic briefs synthesize what is available in connected sources; they do not substitute for formal legal research
  • If the topic requires current legal authority or case law, recommend the user consult a legal research platform (Westlaw, Lexis, etc.) or outside counsel
  • Always note the limitations of the sources searched

Incident Brief

Rapid briefing for developing situations that require immediate legal attention (data breaches, litigation threats, regulatory inquiries, IP disputes, etc.).

Workflow

  1. Accept the incident topic or description
  2. Rapidly scan all connected sources for relevant context:
    • Email: Communications about the incident
    • Chat: Real-time discussions and escalations
    • Documents: Relevant policies, response plans, insurance coverage
    • Calendar: Scheduled response meetings
    • CLM: Affected contracts, indemnification provisions, insurance requirements
  3. Compile into an actionable incident brief

Output Format

## Incident Brief: [Topic]
**Prepared**: [timestamp]
**Classification**: [severity assessment if determinable]

### Situation Summary
[What is known about the incident]

### Timeline
[Chronological summary of events based on available sources]

### Immediate Legal Considerations
[Regulatory notification requirements, preservation obligations, privilege concerns]

### Relevant Agreements
[Contracts, insurance policies, or other agreements that may be implicated]

### Internal Response
[What response activity has already occurred based on email/chat]

### Key Contacts
[Relevant internal and external contacts identified from sources]

### Recommended Immediate Actions
1. [Most urgent action]
2. [Second priority]
3. [etc.]

### Information Gaps
[What is not yet known and needs to be determined]

### Sources Checked
[What was searched and what was not available]

Important Notes for Incident Briefs

  • Speed matters. Produce the brief quickly with available information rather than waiting for complete information
  • Flag any litigation hold or preservation obligations immediately
  • Note privilege considerations (mark the brief as attorney-client privileged / work product if appropriate)
  • If the incident may involve a data breach, flag applicable notification deadlines (e.g., 72 hours for GDPR)
  • Recommend outside counsel engagement if the matter is significant

General Notes

  • If sources are unavailable, note the gaps prominently so the user knows what was not checked
  • For daily briefs, learn the user's preferences over time (what they find useful, what they want filtered out)
  • Briefs should be actionable: every item should have a clear next step or reason for inclusion
  • Keep briefs concise. Link to source materials rather than reproducing them in full
用于对拟议行动、产品功能或业务举措进行合规性审查,识别适用法规、所需审批及风险领域。适用于涉及个人数据、营销或具有监管影响的项目启动前评估,提供结构化风险评估与行动建议。
启动涉及个人数据处理的功能 营销或产品提出具有监管影响的方案 需要确认审批流程和管辖权要求
legal/skills/compliance-check/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill compliance-check -g -y
SKILL.md
Frontmatter
{
    "name": "compliance-check",
    "description": "Run a compliance check on a proposed action, product feature, or business initiative, surfacing applicable regulations, required approvals, and risk areas. Use when launching a feature that touches personal data, when marketing or product proposes something with regulatory implications, or when you need to know which approvals and jurisdictional requirements apply before proceeding.",
    "argument-hint": "<action or initiative to check>"
}

/compliance-check -- Compliance Review

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Run a compliance check on a proposed action, product feature, marketing campaign, or business initiative.

Important: This command assists with legal workflows but does not provide legal advice. Compliance assessments should be reviewed by qualified legal professionals. Regulatory requirements change frequently; always verify current requirements with authoritative sources.

Usage

/compliance-check $ARGUMENTS

What I Need From You

Describe what you're planning to do. Examples:

  • "We want to launch a referral program with cash rewards"
  • "We're adding biometric authentication to our mobile app"
  • "We need to process EU customer data in our US data center"
  • "Marketing wants to use customer testimonials in ads"

Output

## Compliance Check: [Initiative]

### Summary
[Quick assessment: Proceed / Proceed with conditions / Requires further review]

### Applicable Regulations and Policies
| Regulation/Policy | Relevance | Key Requirements |
|-------------------|-----------|-----------------|
| [GDPR / CCPA / HIPAA / etc.] | [How it applies] | [What you need to do] |

### Requirements
| # | Requirement | Status | Action Needed |
|---|-------------|--------|---------------|
| 1 | [Requirement] | [Met / Not Met / Unknown] | [What to do] |

### Risk Areas
| Risk | Severity | Mitigation |
|------|----------|------------|
| [Risk] | [High/Med/Low] | [How to address] |

### Recommended Actions
1. [Most important action]
2. [Second priority]
3. [Third priority]

### Approvals Needed
| Approver | Why | Status |
|----------|-----|--------|
| [Person/Team] | [Reason] | [Pending] |

### Further Review Recommended
[Areas where outside counsel or specialist review is advised]

Privacy Regulation Overview

GDPR (General Data Protection Regulation)

Scope: Applies to processing of personal data of individuals in the EU/EEA, regardless of where the processing organization is located.

Key Obligations for In-House Legal Teams:

  • Lawful basis: Identify and document lawful basis for each processing activity (consent, contract, legitimate interest, legal obligation, vital interest, public task)
  • Data subject rights: Respond to access, rectification, erasure, portability, restriction, and objection requests within 30 days (extendable by 60 days for complex requests)
  • Data protection impact assessments (DPIAs): Required for processing likely to result in high risk to individuals
  • Breach notification: Notify supervisory authority within 72 hours of becoming aware of a personal data breach; notify affected individuals without undue delay if high risk
  • Records of processing: Maintain Article 30 records of processing activities
  • International transfers: Ensure appropriate safeguards for transfers outside EEA (SCCs, adequacy decisions, BCRs)
  • DPO requirement: Appoint a Data Protection Officer if required (public authority, large-scale processing of special categories, large-scale systematic monitoring)

Common In-House Legal Touchpoints:

  • Reviewing vendor DPAs for GDPR compliance
  • Advising product teams on privacy by design requirements
  • Responding to supervisory authority inquiries
  • Managing cross-border data transfer mechanisms
  • Reviewing consent mechanisms and privacy notices

CCPA / CPRA (California Consumer Privacy Act / California Privacy Rights Act)

Scope: Applies to businesses that collect personal information of California residents and meet revenue, data volume, or data sale thresholds.

Key Obligations:

  • Right to know: Consumers can request disclosure of personal information collected, used, and shared
  • Right to delete: Consumers can request deletion of their personal information
  • Right to opt-out: Consumers can opt out of the sale or sharing of personal information
  • Right to correct: Consumers can request correction of inaccurate personal information (CPRA addition)
  • Right to limit use of sensitive personal information: Consumers can limit use of sensitive PI to specific purposes (CPRA addition)
  • Non-discrimination: Cannot discriminate against consumers who exercise their rights
  • Privacy notice: Must provide a privacy notice at or before collection describing categories of PI collected and purposes
  • Service provider agreements: Contracts with service providers must restrict use of PI to the specified business purpose

Response Timelines:

  • Acknowledge receipt within 10 business days
  • Respond substantively within 45 calendar days (extendable by 45 days with notice)

Other Key Regulations to Monitor

Regulation Jurisdiction Key Differentiators
LGPD (Brazil) Brazil Similar to GDPR; requires DPO appointment; National Data Protection Authority (ANPD) enforcement
POPIA (South Africa) South Africa Information Regulator oversight; required registration of processing
PIPEDA (Canada) Canada (federal) Consent-based framework; OPC oversight; being modernized
PDPA (Singapore) Singapore Do Not Call registry; mandatory breach notification; PDPC enforcement
Privacy Act (Australia) Australia Australian Privacy Principles (APPs); notifiable data breaches scheme
PIPL (China) China Strict cross-border transfer rules; data localization requirements; CAC oversight
UK GDPR United Kingdom Post-Brexit UK version; ICO oversight; similar to EU GDPR with UK-specific adequacy

DPA Review Checklist

When reviewing a Data Processing Agreement or Data Processing Addendum, verify the following:

Required Elements (GDPR Article 28)

  • Subject matter and duration: Clearly defined scope and term of processing
  • Nature and purpose: Specific description of what processing will occur and why
  • Type of personal data: Categories of personal data being processed
  • Categories of data subjects: Whose personal data is being processed
  • Controller obligations and rights: Controller's instructions and oversight rights

Processor Obligations

  • Process only on documented instructions: Processor commits to process only per controller's instructions (with exception for legal requirements)
  • Confidentiality: Personnel authorized to process have committed to confidentiality
  • Security measures: Appropriate technical and organizational measures described (Article 32 reference)
  • Sub-processor requirements:
    • Written authorization requirement (general or specific)
    • If general authorization: notification of changes with opportunity to object
    • Sub-processors bound by same obligations via written agreement
    • Processor remains liable for sub-processor performance
  • Data subject rights assistance: Processor will assist controller in responding to data subject requests
  • Security and breach assistance: Processor will assist with security obligations, breach notification, DPIAs, and prior consultation
  • Deletion or return: On termination, delete or return all personal data (at controller's choice) and delete existing copies unless legal retention required
  • Audit rights: Controller has right to conduct audits and inspections (or accept third-party audit reports)
  • Breach notification: Processor will notify controller of personal data breaches without undue delay (ideally within 24-48 hours; must enable controller to meet 72-hour regulatory deadline)

International Transfers

  • Transfer mechanism identified: SCCs, adequacy decision, BCRs, or other valid mechanism
  • SCCs version: Using current EU SCCs (June 2021 version) if applicable
  • Correct module: Appropriate SCC module selected (C2P, C2C, P2P, P2C)
  • Transfer impact assessment: Completed if transferring to countries without adequacy decisions
  • Supplementary measures: Technical, organizational, or contractual measures to address gaps identified in transfer impact assessment
  • UK addendum: If UK personal data is in scope, UK International Data Transfer Addendum included

Practical Considerations

  • Liability: DPA liability provisions align with (or don't conflict with) the main services agreement
  • Termination alignment: DPA term aligns with the services agreement
  • Data locations: Processing locations specified and acceptable
  • Security standards: Specific security standards or certifications required (SOC 2, ISO 27001, etc.)
  • Insurance: Adequate insurance coverage for data processing activities

Common DPA Issues

Issue Risk Standard Position
Blanket sub-processor authorization without notification Loss of control over processing chain Require notification with right to object
Breach notification timeline > 72 hours May prevent timely regulatory notification Require notification within 24-48 hours
No audit rights (or audit rights only via third-party reports) Cannot verify compliance Accept SOC 2 Type II + right to audit upon cause
Data deletion timeline not specified Data retained indefinitely Require deletion within 30-90 days of termination
No data processing locations specified Data could be processed anywhere Require disclosure of processing locations
Outdated SCCs Invalid transfer mechanism Require current EU SCCs (2021 version)

Data Subject Request Handling

Request Intake

When a data subject request is received:

  1. Identify the request type:

    • Access (copy of personal data)
    • Rectification (correction of inaccurate data)
    • Erasure / deletion ("right to be forgotten")
    • Restriction of processing
    • Data portability (structured, machine-readable format)
    • Objection to processing
    • Opt-out of sale/sharing (CCPA/CPRA)
    • Limit use of sensitive personal information (CPRA)
  2. Identify applicable regulation(s):

    • Where is the data subject located?
    • Which laws apply based on your organization's presence and activities?
    • What are the specific requirements and timelines?
  3. Verify identity:

    • Confirm the requester is who they claim to be
    • Use reasonable verification measures proportionate to the sensitivity of the data
    • Do not require excessive documentation
  4. Log the request:

    • Date received
    • Request type
    • Requester identity
    • Applicable regulation
    • Response deadline
    • Assigned handler

Response Timelines

Regulation Initial Acknowledgment Substantive Response Extension
GDPR Not specified (best practice: promptly) 30 days +60 days (with notice)
CCPA/CPRA 10 business days 45 calendar days +45 days (with notice)
UK GDPR Not specified (best practice: promptly) 30 days +60 days (with notice)
LGPD Not specified 15 days Limited extensions

Exemptions and Exceptions

Before fulfilling a request, check whether any exemptions apply:

Common exemptions across regulations:

  • Legal claims defense or establishment
  • Legal obligations requiring retention
  • Public interest or official authority
  • Freedom of expression and information (for erasure requests)
  • Archiving in the public interest or scientific/historical research

Organization-specific considerations:

  • Litigation hold: Data subject to a legal hold cannot be deleted
  • Regulatory retention: Financial records, employment records, and other categories may have mandatory retention periods
  • Third-party rights: Fulfilling the request might adversely affect the rights of others

Response Process

  1. Gather all personal data of the requester across systems
  2. Apply any exemptions and document the basis
  3. Prepare response: fulfill the request or explain why (in whole or part) it cannot be fulfilled
  4. If denying (in whole or part): cite the specific legal basis for denial
  5. Inform the requester of their right to lodge a complaint with the supervisory authority
  6. Document the response and retain records of the request and response

Regulatory Monitoring Basics

What to Monitor

Maintain awareness of developments in:

  • Regulatory guidance: New or updated guidance from supervisory authorities (ICO, CNIL, FTC, state AGs, etc.)
  • Enforcement actions: Fines, orders, and settlements that signal regulatory priorities
  • Legislative changes: New privacy laws, amendments to existing laws, implementing regulations
  • Industry standards: Updates to ISO 27001, SOC 2, NIST frameworks, and sector-specific requirements
  • Cross-border transfer developments: Adequacy decisions, SCC updates, data localization requirements

Monitoring Approach

  1. Subscribe to regulatory authority communications (newsletters, RSS feeds, official announcements)
  2. Track relevant legal publications for analysis of new developments
  3. Review industry association updates for sector-specific guidance
  4. Maintain a regulatory calendar of known upcoming deadlines, effective dates, and compliance milestones
  5. Brief the legal team on material developments that affect the organization's processing activities

Escalation Criteria

Escalate regulatory developments to senior counsel or leadership when:

  • A new regulation or guidance directly affects the organization's core business activities
  • An enforcement action in the organization's sector signals heightened regulatory scrutiny
  • A compliance deadline is approaching that requires organizational changes
  • A data transfer mechanism the organization relies on is challenged or invalidated
  • A regulatory authority initiates an inquiry or investigation involving the organization

Tips

  1. Be specific — "We want to email all our users" is better than "marketing campaign."
  2. Include the geography — Compliance requirements vary by jurisdiction.
  3. Mention the data — What personal data is involved? This drives most compliance requirements.
专为法务团队设计的会议准备技能,用于生成结构化合规会议简报并跟踪行动项。适用于合同谈判、董事会及合规审查等场景,通过整合日历、邮件等多源信息辅助决策,但不提供法律建议。
准备合同谈判或董事会会议 需要整理合规审查背景资料 会议后需追踪行动事项
legal/skills/meeting-briefing/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill meeting-briefing -g -y
SKILL.md
Frontmatter
{
    "name": "meeting-briefing",
    "description": "Prepare structured briefings for meetings with legal relevance and track resulting action items. Use when preparing for contract negotiations, board meetings, compliance reviews, or any meeting where legal context, background research, or action tracking is needed."
}

Meeting Briefing Skill

You are a meeting preparation assistant for an in-house legal team. You gather context from connected sources, prepare structured briefings for meetings with legal relevance, and help track action items that arise from meetings.

Important: You assist with legal workflows but do not provide legal advice. Meeting briefings should be reviewed for accuracy and completeness before use.

Meeting Prep Methodology

Step 1: Identify the Meeting

Determine the meeting context from the user's request or calendar:

  • Meeting title and type: What kind of meeting is this? (deal review, board meeting, vendor call, team sync, client meeting, regulatory discussion)
  • Participants: Who will be attending? What are their roles and interests?
  • Agenda: Is there a formal agenda? What topics will be covered?
  • Your role: What is the legal team member's role in this meeting? (advisor, presenter, observer, negotiator)
  • Preparation time: How much time is available to prepare?

Step 2: Assess Preparation Needs

Based on the meeting type, determine what preparation is needed:

Meeting Type Key Prep Needs
Deal Review Contract status, open issues, counterparty history, negotiation strategy, approval requirements
Board / Committee Legal updates, risk register highlights, pending matters, regulatory developments, resolution drafts
Vendor Call Agreement status, open issues, performance metrics, relationship history, negotiation objectives
Team Sync Workload status, priority matters, resource needs, upcoming deadlines
Client / Customer Agreement terms, support history, open issues, relationship context
Regulatory / Government Matter background, compliance status, prior communications, counsel briefing
Litigation / Dispute Case status, recent developments, strategy, settlement parameters
Cross-Functional Legal implications of business decisions, risk assessment, compliance requirements

Step 3: Gather Context from Connected Sources

Pull relevant information from each connected source:

Calendar

  • Meeting details (time, duration, location/link, attendees)
  • Prior meetings with the same participants (last 3 months)
  • Related meetings or follow-ups scheduled
  • Competing commitments or time constraints

Email

  • Recent correspondence with or about meeting participants
  • Prior meeting follow-up threads
  • Open action items from previous interactions
  • Relevant documents shared via email

Chat (e.g., Slack, Teams)

  • Recent discussions about the meeting topic
  • Messages from or about meeting participants
  • Team discussions about related matters
  • Relevant decisions or context shared in channels

Documents (e.g., Box, Egnyte, SharePoint)

  • Meeting agendas and prior meeting notes
  • Relevant agreements, memos, or briefings
  • Shared documents with meeting participants
  • Draft materials for the meeting

CLM (if connected)

  • Relevant contracts with the counterparty
  • Contract status and open negotiation items
  • Approval workflow status
  • Amendment or renewal history

CRM (if connected)

  • Account or opportunity information
  • Relationship history and context
  • Deal stage and key milestones
  • Stakeholder map

Step 4: Synthesize into Briefing

Organize gathered information into a structured briefing (see template below).

Step 5: Identify Preparation Gaps

Flag anything that could not be found or verified:

  • Sources that were not available
  • Information that appears outdated
  • Questions that remain unanswered
  • Documents that could not be located

Briefing Template

## Meeting Brief

### Meeting Details
- **Meeting**: [title]
- **Date/Time**: [date and time with timezone]
- **Duration**: [expected duration]
- **Location**: [physical location or video link]
- **Your Role**: [advisor / presenter / negotiator / observer]

### Participants
| Name | Organization | Role | Key Interests | Notes |
|---|---|---|---|---|
| [name] | [org] | [role] | [what they care about] | [relevant context] |

### Agenda / Expected Topics
1. [Topic 1] - [brief context]
2. [Topic 2] - [brief context]
3. [Topic 3] - [brief context]

### Background and Context
[2-3 paragraph summary of the relevant history, current state, and why this meeting is happening]

### Key Documents
- [Document 1] - [brief description and where to find it]
- [Document 2] - [brief description and where to find it]

### Open Issues
| Issue | Status | Owner | Priority | Notes |
|---|---|---|---|---|
| [issue 1] | [status] | [who] | [H/M/L] | [context] |

### Legal Considerations
[Specific legal issues, risks, or considerations relevant to the meeting topics]

### Talking Points
1. [Key point to make, with supporting context]
2. [Key point to make, with supporting context]
3. [Key point to make, with supporting context]

### Questions to Raise
- [Question 1] - [why this matters]
- [Question 2] - [why this matters]

### Decisions Needed
- [Decision 1] - [options and recommendation]
- [Decision 2] - [options and recommendation]

### Red Lines / Non-Negotiables
[If this is a negotiation meeting: positions that cannot be conceded]

### Prior Meeting Follow-Up
[Outstanding action items from previous meetings with these participants]

### Preparation Gaps
[Information that could not be found or verified; questions for the user]

Meeting-Type Specific Guidance

Deal Review Meetings

Additional briefing sections:

  • Deal summary: Parties, deal value, structure, timeline
  • Contract status: Where in the review/negotiation process; outstanding issues
  • Approval requirements: What approvals are needed and from whom
  • Counterparty dynamics: Their likely positions, recent communications, relationship temperature
  • Comparable deals: Prior similar transactions and their terms (if available)

Board and Committee Meetings

Additional briefing sections:

  • Legal department update: Summary of matters, wins, new matters, closed matters
  • Risk highlights: Top risks from the risk register with changes since last report
  • Regulatory update: Material regulatory developments affecting the business
  • Pending approvals: Resolutions or approvals needed from the board/committee
  • Litigation summary: Active matters, reserves, settlements, new filings

Regulatory Meetings

Additional briefing sections:

  • Regulatory body context: Which regulator, what division, their current priorities and enforcement patterns
  • Matter history: Prior interactions, submissions, correspondence timeline
  • Compliance posture: Current compliance status on the relevant topics
  • Counsel coordination: Outside counsel involvement, prior advice received
  • Privilege considerations: What can and cannot be discussed; any privilege risks

Action Item Tracking

During/After the Meeting

Help the user capture and organize action items from the meeting:

## Action Items from [Meeting Name] - [Date]

| # | Action Item | Owner | Deadline | Priority | Status |
|---|---|---|---|---|---|
| 1 | [specific, actionable task] | [name] | [date] | [H/M/L] | Open |
| 2 | [specific, actionable task] | [name] | [date] | [H/M/L] | Open |

Action Item Best Practices

  • Be specific: "Send redline of Section 4.2 to counterparty counsel" not "Follow up on contract"
  • Assign an owner: Every action item must have exactly one owner (not a team or group)
  • Set a deadline: Every action item needs a specific date, not "soon" or "ASAP"
  • Note dependencies: If an action item depends on another action or external input, note it
  • Distinguish types:
    • Legal team actions (things the legal team needs to do)
    • Business team actions (things to communicate to business stakeholders)
    • External actions (things the counterparty or outside counsel needs to do)
    • Follow-up meetings (meetings that need to be scheduled)

Follow-Up

After the meeting:

  1. Distribute action items to all participants (via email or the appropriate channel)
  2. Set calendar reminders for deadlines
  3. Update relevant systems (CLM, matter management, risk register) with meeting outcomes
  4. File meeting notes in the appropriate document repository
  5. Flag urgent items that need immediate attention

Tracking Cadence

  • High priority items: Check daily until completed
  • Medium priority items: Check at next team sync or weekly review
  • Low priority items: Check at next scheduled meeting or monthly review
  • Overdue items: Escalate to the owner and their manager; flag in next relevant meeting
根据组织谈判手册审查合同,逐条分析条款,标记偏差,生成修订建议并提供商业影响分析。适用于供应商或客户协议审查、谈判策略准备及优先级红线制定,辅助法律工作流但不提供法律建议。
需要审查合同条款是否符合内部谈判策略 准备谈判策略并识别需修改的关键条款 评估合同偏离标准条款的商业风险
legal/skills/review-contract/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill review-contract -g -y
SKILL.md
Frontmatter
{
    "name": "review-contract",
    "description": "Review a contract against your organization's negotiation playbook — flag deviations, generate redlines, provide business impact analysis. Use when reviewing vendor or customer agreements, when you need clause-by-clause analysis against standard positions, or when preparing a negotiation strategy with prioritized redlines and fallback positions.",
    "argument-hint": "<contract file or text>"
}

/review-contract -- Contract Review Against Playbook

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Review a contract against your organization's negotiation playbook. Analyze each clause, flag deviations, generate redline suggestions, and provide business impact analysis.

Important: You assist with legal workflows but do not provide legal advice. All analysis should be reviewed by qualified legal professionals before being relied upon.

Invocation

/review-contract <contract file or URL>

Review the contract: @$1

Workflow

Step 1: Accept the Contract

Accept the contract in any of these formats:

  • File upload: PDF, DOCX, or other document format
  • URL: Link to a contract in your CLM, cloud storage (e.g., Box, Egnyte, SharePoint), or other document system
  • Pasted text: Contract text pasted directly into the conversation

If no contract is provided, prompt the user to supply one.

Step 2: Gather Context

Ask the user for context before beginning the review:

  1. Which side are you on? (vendor/supplier, customer/buyer, licensor, licensee, partner -- or other)
  2. Deadline: When does this need to be finalized? (Affects prioritization of issues)
  3. Focus areas: Any specific concerns? (e.g., "data protection is critical", "we need flexibility on term", "IP ownership is the key issue")
  4. Deal context: Any relevant business context? (e.g., deal size, strategic importance, existing relationship)

If the user provides partial context, proceed with what you have and note assumptions.

Step 3: Load the Playbook

Look for the organization's contract review playbook in local settings (e.g., legal.local.md or similar configuration files).

The playbook should define:

  • Standard positions: The organization's preferred terms for each major clause type
  • Acceptable ranges: Terms that can be agreed to without escalation
  • Escalation triggers: Terms that require senior counsel review or outside counsel involvement

If no playbook is configured:

  • Inform the user that no playbook was found
  • Offer two options:
    1. Help the user set up their playbook (walk through defining positions for key clauses)
    2. Proceed with a generic review using widely-accepted commercial standards as the baseline
  • If proceeding generically, clearly note that the review is based on general commercial standards, not the organization's specific positions

Step 4: Clause-by-Clause Analysis

Apply the following review process:

  1. Identify the contract type: SaaS agreement, professional services, license, partnership, procurement, etc. The contract type affects which clauses are most material.
  2. Determine the user's side: Vendor, customer, licensor, licensee, partner. This fundamentally changes the analysis (e.g., limitation of liability protections favor different parties).
  3. Read the entire contract before flagging issues. Clauses interact with each other (e.g., an uncapped indemnity may be partially mitigated by a broad limitation of liability).
  4. Analyze each material clause against the playbook position.
  5. Consider the contract holistically: Are the overall risk allocation and commercial terms balanced?

Analyze the contract systematically, covering at minimum:

Clause Category Key Review Points
Limitation of Liability Cap amount, carveouts, mutual vs. unilateral, consequential damages
Indemnification Scope, mutual vs. unilateral, cap, IP infringement, data breach
IP Ownership Pre-existing IP, developed IP, work-for-hire, license grants, assignment
Data Protection DPA requirement, processing terms, sub-processors, breach notification, cross-border transfers
Confidentiality Scope, term, carveouts, return/destruction obligations
Representations & Warranties Scope, disclaimers, survival period
Term & Termination Duration, renewal, termination for convenience, termination for cause, wind-down
Governing Law & Dispute Resolution Jurisdiction, venue, arbitration vs. litigation
Insurance Coverage requirements, minimums, evidence of coverage
Assignment Consent requirements, change of control, exceptions
Force Majeure Scope, notification, termination rights
Payment Terms Net terms, late fees, taxes, price escalation

For each clause, assess against the playbook (or generic standards) and note whether it is present, absent, or unusual.

Detailed Clause Guidance

Limitation of Liability

Key elements to review:

  • Cap amount (fixed dollar amount, multiple of fees, or uncapped)
  • Whether the cap is mutual or applies differently to each party
  • Carveouts from the cap (what liabilities are uncapped)
  • Whether consequential, indirect, special, or punitive damages are excluded
  • Whether the exclusion is mutual
  • Carveouts from the consequential damages exclusion
  • Whether the cap applies per-claim, per-year, or aggregate

Common issues:

  • Cap set at a fraction of fees paid (e.g., "fees paid in the prior 3 months" on a low-value contract)
  • Asymmetric carveouts favoring the drafter
  • Broad carveouts that effectively eliminate the cap (e.g., "any breach of Section X" where Section X covers most obligations)
  • No consequential damages exclusion for one party's breaches
Indemnification

Key elements to review:

  • Whether indemnification is mutual or unilateral
  • Scope: what triggers the indemnification obligation (IP infringement, data breach, bodily injury, breach of reps and warranties)
  • Whether indemnification is capped (often subject to the overall liability cap, or sometimes uncapped)
  • Procedure: notice requirements, right to control defense, right to settle
  • Whether the indemnitee must mitigate
  • Relationship between indemnification and the limitation of liability clause

Common issues:

  • Unilateral indemnification for IP infringement when both parties contribute IP
  • Indemnification for "any breach" (too broad; essentially converts the liability cap to uncapped liability)
  • No right to control defense of claims
  • Indemnification obligations that survive termination indefinitely
Intellectual Property

Key elements to review:

  • Ownership of pre-existing IP (each party should retain their own)
  • Ownership of IP developed during the engagement
  • Work-for-hire provisions and their scope
  • License grants: scope, exclusivity, territory, sublicensing rights
  • Open source considerations
  • Feedback clauses (grants on suggestions or improvements)

Common issues:

  • Broad IP assignment that could capture the customer's pre-existing IP
  • Work-for-hire provisions extending beyond the deliverables
  • Unrestricted feedback clauses granting perpetual, irrevocable licenses
  • License scope broader than needed for the business relationship
Data Protection

Key elements to review:

  • Whether a Data Processing Agreement/Addendum (DPA) is required
  • Data controller vs. data processor classification
  • Sub-processor rights and notification obligations
  • Data breach notification timeline (72 hours for GDPR)
  • Cross-border data transfer mechanisms (SCCs, adequacy decisions, binding corporate rules)
  • Data deletion or return obligations on termination
  • Data security requirements and audit rights
  • Purpose limitation for data processing

Common issues:

  • No DPA when personal data is being processed
  • Blanket authorization for sub-processors without notification
  • Breach notification timeline longer than regulatory requirements
  • No cross-border transfer protections when data moves internationally
  • Inadequate data deletion provisions
Term and Termination

Key elements to review:

  • Initial term and renewal terms
  • Auto-renewal provisions and notice periods
  • Termination for convenience: available? notice period? early termination fees?
  • Termination for cause: cure period? what constitutes cause?
  • Effects of termination: data return, transition assistance, survival clauses
  • Wind-down period and obligations

Common issues:

  • Long initial terms with no termination for convenience
  • Auto-renewal with short notice windows (e.g., 30-day notice for annual renewal)
  • No cure period for termination for cause
  • Inadequate transition assistance provisions
  • Survival clauses that effectively extend the agreement indefinitely
Governing Law and Dispute Resolution

Key elements to review:

  • Choice of law (governing jurisdiction)
  • Dispute resolution mechanism (litigation, arbitration, mediation first)
  • Venue and jurisdiction for litigation
  • Arbitration rules and seat (if arbitration)
  • Jury waiver
  • Class action waiver
  • Prevailing party attorney's fees

Common issues:

  • Unfavorable jurisdiction (unusual or remote venue)
  • Mandatory arbitration with rules favorable to the drafter
  • Waiver of jury trial without corresponding protections
  • No escalation process before formal dispute resolution

Step 5: Flag Deviations

Classify each deviation from the playbook using a three-tier system:

GREEN -- Acceptable

The clause aligns with or is better than the organization's standard position. Minor variations that are commercially reasonable and do not increase risk materially.

Examples:

  • Liability cap at 18 months of fees when standard is 12 months (better for the customer)
  • Mutual NDA term of 2 years when standard is 3 years (shorter but reasonable)
  • Governing law in a well-established commercial jurisdiction close to the preferred one

Action: Note for awareness. No negotiation needed.

YELLOW -- Negotiate

The clause falls outside the standard position but within a negotiable range. The term is common in the market but not the organization's preference. Requires attention and likely negotiation, but not escalation.

Examples:

  • Liability cap at 6 months of fees when standard is 12 months (below standard but negotiable)
  • Unilateral indemnification for IP infringement when standard is mutual (common market position but not preferred)
  • Auto-renewal with 60-day notice when standard is 90 days
  • Governing law in an acceptable but not preferred jurisdiction

Action: Generate specific redline language. Provide fallback position. Estimate business impact of accepting vs. negotiating.

  • Include: Specific redline language to bring the term back to standard position
  • Include: Fallback position if the counterparty pushes back
  • Include: Business impact of accepting as-is vs. negotiating

RED -- Escalate

The clause falls outside acceptable range, triggers a defined escalation criterion, or poses material risk. Requires senior counsel review, outside counsel involvement, or business decision-maker sign-off.

Examples:

  • Uncapped liability or no limitation of liability clause
  • Unilateral broad indemnification with no cap
  • IP assignment of pre-existing IP
  • No DPA offered when personal data is processed
  • Unreasonable non-compete or exclusivity provisions
  • Governing law in a problematic jurisdiction with mandatory arbitration

Action: Explain the specific risk. Provide market-standard alternative language. Estimate exposure. Recommend escalation path.

  • Include: Why this is a RED flag (specific risk)
  • Include: What the standard market position looks like
  • Include: Business impact and potential exposure
  • Include: Recommended escalation path

Step 6: Generate Redline Suggestions

For each YELLOW and RED deviation, provide:

  • Current language: Quote the relevant contract text
  • Suggested redline: Specific alternative language
  • Rationale: Brief explanation suitable for sharing with the counterparty
  • Priority: Whether this is a must-have or nice-to-have in negotiation

Redline Generation Best Practices

When generating redline suggestions:

  1. Be specific: Provide exact language, not vague guidance. The redline should be ready to insert.
  2. Be balanced: Propose language that is firm on critical points but commercially reasonable. Overly aggressive redlines slow negotiations.
  3. Explain the rationale: Include a brief, professional rationale suitable for sharing with the counterparty's counsel.
  4. Provide fallback positions: For YELLOW items, include a fallback position if the primary ask is rejected.
  5. Prioritize: Not all redlines are equal. Indicate which are must-haves and which are nice-to-haves.
  6. Consider the relationship: Adjust tone and approach based on whether this is a new vendor, strategic partner, or commodity supplier.

Redline Format

For each redline:

**Clause**: [Section reference and clause name]
**Current language**: "[exact quote from the contract]"
**Proposed redline**: "[specific alternative language with additions in bold and deletions struck through conceptually]"
**Rationale**: [1-2 sentences explaining why, suitable for external sharing]
**Priority**: [Must-have / Should-have / Nice-to-have]
**Fallback**: [Alternative position if primary redline is rejected]

Step 7: Business Impact Summary

Provide a summary section covering:

  • Overall risk assessment: High-level view of the contract's risk profile
  • Top 3 issues: The most important items to address
  • Negotiation strategy: Recommended approach (which issues to lead with, what to concede)
  • Timeline considerations: Any urgency factors affecting the negotiation approach

Negotiation Priority Framework

When presenting redlines, organize by negotiation priority:

Tier 1 -- Must-Haves (Deal Breakers) Issues where the organization cannot proceed without resolution:

  • Uncapped or materially insufficient liability protections
  • Missing data protection requirements for regulated data
  • IP provisions that could jeopardize core assets
  • Terms that conflict with regulatory obligations

Tier 2 -- Should-Haves (Strong Preferences) Issues that materially affect risk but have negotiation room:

  • Liability cap adjustments within range
  • Indemnification scope and mutuality
  • Termination flexibility
  • Audit and compliance rights

Tier 3 -- Nice-to-Haves (Concession Candidates) Issues that improve the position but can be conceded strategically:

  • Preferred governing law (if alternative is acceptable)
  • Notice period preferences
  • Minor definitional improvements
  • Insurance certificate requirements

Negotiation strategy: Lead with Tier 1 items. Trade Tier 3 concessions to secure Tier 2 wins. Never concede on Tier 1 without escalation.

Step 8: CLM Routing (If Connected)

If a Contract Lifecycle Management system is connected via MCP:

  • Recommend the appropriate approval workflow based on contract type and risk level
  • Suggest the correct routing path (e.g., standard approval, senior counsel, outside counsel)
  • Note any required approvals based on contract value or risk flags

If no CLM is connected, skip this step.

Output Format

Structure the output as:

## Contract Review Summary

**Document**: [contract name/identifier]
**Parties**: [party names and roles]
**Your Side**: [vendor/customer/etc.]
**Deadline**: [if provided]
**Review Basis**: [Playbook / Generic Standards]

## Key Findings

[Top 3-5 issues with severity flags]

## Clause-by-Clause Analysis

### [Clause Category] -- [GREEN/YELLOW/RED]
**Contract says**: [summary of the provision]
**Playbook position**: [your standard]
**Deviation**: [description of gap]
**Business impact**: [what this means practically]
**Redline suggestion**: [specific language, if YELLOW or RED]

[Repeat for each major clause]

## Negotiation Strategy

[Recommended approach, priorities, concession candidates]

## Next Steps

[Specific actions to take]

Notes

  • If the contract is in a language other than English, note this and ask if the user wants a translation or review in the original language
  • For very long contracts (50+ pages), offer to focus on the most material sections first and then do a complete review
  • Always remind the user that this analysis should be reviewed by qualified legal counsel before being relied upon for legal decisions
用于准备和路由文档进行电子签名。执行签署前检查清单,配置签署顺序及人员,并发送执行。适用于合同定稿后验证实体名称、附件及签名栏,或设置串行/并行签署流程的场景。
合同定稿准备签署 验证实体名称和附件 设置电子签名信封
legal/skills/signature-request/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill signature-request -g -y
SKILL.md
Frontmatter
{
    "name": "signature-request",
    "description": "Prepare and route a document for e-signature — run a pre-signature checklist, configure signing order, and send for execution. Use when a contract is finalized and ready to sign, when verifying entity names, exhibits, and signature blocks before sending, or when setting up an envelope with sequential or parallel signers.",
    "argument-hint": "<document or contract to send>"
}

/signature-request -- E-Signature Routing

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Prepare a document for electronic signature — verify completeness, set signing order, and route for execution.

Important: This command assists with legal workflows but does not provide legal advice. Verify documents are in final form before sending for signature.

Usage

/signature-request $ARGUMENTS

Prepare for signature: @$1

Workflow

Step 1: Accept the Document

Accept the document in any format:

  • File upload: PDF, DOCX
  • URL: Link to a document in ~~cloud storage or ~~CLM
  • Reference: "The Acme Corp MSA we finalized yesterday"

Step 2: Pre-Signature Checklist

Before routing for signature, verify:

## Pre-Signature Checklist

- [ ] Document is in final, agreed form (no open redlines)
- [ ] All exhibits and schedules are attached
- [ ] Correct legal entity names on signature blocks
- [ ] Dates are correct or left blank for execution date
- [ ] Signature blocks match the authorized signers
- [ ] Any required internal approvals have been obtained
- [ ] Document has been reviewed by appropriate counsel

Step 3: Configure Signing

Gather signing details:

  • Signers: Who needs to sign? (names, emails, titles)
  • Signing order: Sequential or parallel?
  • Internal approval: Does anyone need to approve before the counterparty signs?
  • CC recipients: Who should receive a copy of the executed document?

Step 4: Route for Signature

If ~~e-signature is connected:

  • Create the signature envelope/request
  • Set signing fields and order
  • Add any required initials or date fields
  • Send for signature

If not connected:

  • Generate a signing instruction document
  • Provide the document formatted for wet signature or manual e-sign
  • List all signers with contact information

Output

## Signature Request: [Document Title]

### Document Details
- **Type**: [MSA / NDA / SOW / Amendment / etc.]
- **Parties**: [Party A] and [Party B]
- **Pages**: [X]

### Pre-Signature Check: [PASS / ISSUES FOUND]
[List any issues that need attention before sending]

### Signing Configuration
| Order | Signer | Email | Role |
|-------|--------|-------|------|
| 1 | [Name] | [email] | [Party A Authorized Signatory] |
| 2 | [Name] | [email] | [Party B Authorized Signatory] |

### CC Recipients
- [Name] — [email]

### Status
[Sent for signature / Ready to send / Issues to resolve first]

### Next Steps
- [What to expect after sending]
- [Expected turnaround time]
- [Follow-up if not signed within X days]

Tips

  1. Check entity names carefully — The most common signing error is incorrect legal entity names.
  2. Verify authority — Make sure each signer is authorized to bind their organization.
  3. Keep a copy — Executed copies should be filed in ~~cloud storage or ~~CLM immediately after execution.
用于快速预审非保密协议(NDA),根据标准清单将其分类为绿色(批准)、黄色(顾问审查)或红色(全面法律审查)。适用于销售/BD传入的NDA筛查、嵌入条款检测及签署权限判断。
收到新的NDA文件 需要筛查NDA中的非招揽或非竞争条款 判断NDA是否符合标准授权签署条件
legal/skills/triage-nda/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill triage-nda -g -y
SKILL.md
Frontmatter
{
    "name": "triage-nda",
    "description": "Rapidly triage an incoming NDA and classify it as GREEN (standard approval), YELLOW (counsel review), or RED (full legal review). Use when a new NDA arrives from sales or business development, when screening for embedded non-solicits, non-competes, or missing carveouts, or when deciding whether an NDA can be signed under standard delegation.",
    "argument-hint": "<NDA file or text>"
}

/triage-nda -- NDA Pre-Screening

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Triage the NDA: @$1

Rapidly triage incoming NDAs against standard screening criteria. Classify the NDA for routing: standard approval, counsel review, or full legal review.

Important: You assist with legal workflows but do not provide legal advice. All analysis should be reviewed by qualified legal professionals before being relied upon.

Invocation

/triage-nda

Workflow

Step 1: Accept the NDA

Accept the NDA in any format:

  • File upload: PDF, DOCX, or other document format
  • URL: Link to the NDA in a document system
  • Pasted text: NDA text pasted directly

If no NDA is provided, prompt the user to supply one.

Step 2: Load NDA Playbook

Look for NDA screening criteria in local settings (e.g., legal.local.md).

The NDA playbook should define:

  • Mutual vs. unilateral requirements
  • Acceptable term lengths
  • Required carveouts
  • Prohibited provisions
  • Organization-specific requirements

If no NDA playbook is configured:

  • Proceed with reasonable market-standard defaults
  • Note clearly that defaults are being used
  • Defaults applied:
    • Mutual obligations required (unless the organization is only disclosing)
    • Term: 2-3 years standard, up to 5 years for trade secrets
    • Standard carveouts required: independently developed, publicly available, rightfully received from third party, required by law
    • No non-solicitation or non-compete provisions
    • No residuals clause (or narrowly scoped if present)
    • Governing law in a reasonable commercial jurisdiction

Step 3: Quick Screen

Evaluate the NDA against each screening criterion systematically.

1. Agreement Structure

  • Type identified: Mutual NDA, Unilateral (disclosing party), or Unilateral (receiving party)
  • Appropriate for context: Is the NDA type appropriate for the business relationship? (e.g., mutual for exploratory discussions, unilateral for one-way disclosures)
  • Standalone agreement: Confirm the NDA is a standalone agreement, not a confidentiality section embedded in a larger commercial agreement

2. Definition of Confidential Information

  • Reasonable scope: Not overbroad (avoid "all information of any kind whether or not marked as confidential")
  • Marking requirements: If marking is required, is it workable? (Written marking within 30 days of oral disclosure is standard)
  • Exclusions present: Standard exclusions defined (see Standard Carveouts below)
  • No problematic inclusions: Does not define publicly available information or independently developed materials as confidential

3. Obligations of Receiving Party

  • Standard of care: Reasonable care or at least the same care as for own confidential information
  • Use restriction: Limited to the stated purpose
  • Disclosure restriction: Limited to those with need to know who are bound by similar obligations
  • No onerous obligations: No requirements that are impractical (e.g., encrypting all communications, maintaining physical logs)

4. Standard Carveouts

All of the following carveouts should be present:

  • Public knowledge: Information that is or becomes publicly available through no fault of the receiving party
  • Prior possession: Information already known to the receiving party before disclosure
  • Independent development: Information independently developed without use of or reference to confidential information
  • Third-party receipt: Information rightfully received from a third party without restriction
  • Legal compulsion: Right to disclose when required by law, regulation, or legal process (with notice to the disclosing party where legally permitted)

5. Permitted Disclosures

  • Employees: Can share with employees who need to know
  • Contractors/advisors: Can share with contractors, advisors, and professional consultants under similar confidentiality obligations
  • Affiliates: Can share with affiliates (if needed for the business purpose)
  • Legal/regulatory: Can disclose as required by law or regulation

6. Term and Duration

  • Agreement term: Reasonable period for the business relationship (1-3 years is standard)
  • Confidentiality survival: Obligations survive for a reasonable period after termination (2-5 years is standard; trade secrets may be longer)
  • Not perpetual: Avoid indefinite or perpetual confidentiality obligations (exception: trade secrets, which may warrant longer protection)

7. Return and Destruction

  • Obligation triggered: On termination or upon request
  • Reasonable scope: Return or destroy confidential information and all copies
  • Retention exception: Allows retention of copies required by law, regulation, or internal compliance/backup policies
  • Certification: Certification of destruction is reasonable; sworn affidavit is onerous

8. Remedies

  • Injunctive relief: Acknowledgment that breach may cause irreparable harm and equitable relief may be appropriate is standard
  • No pre-determined damages: Avoid liquidated damages clauses in NDAs
  • Not one-sided: Remedies provisions apply equally to both parties (in mutual NDAs)

9. Problematic Provisions to Flag

  • No non-solicitation: NDA should not contain employee non-solicitation provisions
  • No non-compete: NDA should not contain non-compete provisions
  • No exclusivity: NDA should not restrict either party from entering similar discussions with others
  • No standstill: NDA should not contain standstill or similar restrictive provisions (unless M&A context)
  • No residuals clause (or narrowly scoped): If a residuals clause is present, it should be limited to information retained in unaided memory of individuals and should not apply to trade secrets or patented information
  • No IP assignment or license: NDA should not grant any intellectual property rights
  • No audit rights: Unusual in standard NDAs

10. Governing Law and Jurisdiction

  • Reasonable jurisdiction: A well-established commercial jurisdiction
  • Consistent: Governing law and jurisdiction should be in the same or related jurisdictions
  • No mandatory arbitration (in standard NDAs): Litigation is generally preferred for NDA disputes

Step 4: Classify

Based on the screening results, assign a classification:

GREEN -- Standard Approval

All of the following must be true:

  • NDA is mutual (or unilateral in the appropriate direction)
  • All standard carveouts are present
  • Term is within standard range (1-3 years, survival 2-5 years)
  • No non-solicitation, non-compete, or exclusivity provisions
  • No residuals clause, or residuals clause is narrowly scoped
  • Reasonable governing law jurisdiction
  • Standard remedies (no liquidated damages)
  • Permitted disclosures include employees, contractors, and advisors
  • Return/destruction provisions include retention exception for legal/compliance
  • Definition of confidential information is reasonably scoped

Routing: Approve via standard delegation of authority. No counsel review required.

  • Action: Proceed to signature with standard delegation of authority

YELLOW -- Counsel Review Needed

One or more of the following are present, but the NDA is not fundamentally problematic:

  • Definition of confidential information is broader than preferred but not unreasonable
  • Term is longer than standard but within market range (e.g., 5 years for agreement term, 7 years for survival)
  • Missing one standard carveout that could be added without difficulty
  • Residuals clause present but narrowly scoped to unaided memory
  • Governing law in an acceptable but non-preferred jurisdiction
  • Minor asymmetry in a mutual NDA (e.g., one party has slightly broader permitted disclosures)
  • Marking requirements present but workable
  • Return/destruction lacks explicit retention exception (likely implied but should be added)
  • Unusual but non-harmful provisions (e.g., obligation to notify of potential breach)

Routing: Flag specific issues for counsel review. Counsel can likely resolve with minor redlines in a single review pass.

  • Action: Counsel can likely resolve in a single review pass

RED -- Significant Issues

One or more of the following are present:

  • Unilateral when mutual is required (or wrong direction for the relationship)
  • Missing critical carveouts (especially independent development or legal compulsion)
  • Non-solicitation or non-compete provisions embedded in the NDA
  • Exclusivity or standstill provisions without appropriate business context
  • Unreasonable term (10+ years, or perpetual without trade secret justification)
  • Overbroad definition that could capture public information or independently developed materials
  • Broad residuals clause that effectively creates a license to use confidential information
  • IP assignment or license grant hidden in the NDA
  • Liquidated damages or penalty provisions
  • Audit rights without reasonable scope or notice requirements
  • Highly unfavorable jurisdiction with mandatory arbitration
  • The document is not actually an NDA (contains substantive commercial terms, exclusivity, or other obligations beyond confidentiality)

Routing: Full legal review required. Do not sign. Requires negotiation, counterproposal with the organization's standard form NDA, or rejection.

  • Action: Do not sign; requires negotiation or counterproposal

Step 5: Generate Triage Report

Output a structured report:

## NDA Triage Report

**Classification**: [GREEN / YELLOW / RED]
**Parties**: [party names]
**Type**: [Mutual / Unilateral (disclosing) / Unilateral (receiving)]
**Term**: [duration]
**Governing Law**: [jurisdiction]
**Review Basis**: [Playbook / Default Standards]

## Screening Results

| Criterion | Status | Notes |
|-----------|--------|-------|
| Mutual Obligations | [PASS/FLAG/FAIL] | [details] |
| Definition Scope | [PASS/FLAG/FAIL] | [details] |
| Term | [PASS/FLAG/FAIL] | [details] |
| Standard Carveouts | [PASS/FLAG/FAIL] | [details] |
| [etc.] | | |

## Issues Found

### [Issue 1 -- YELLOW/RED]
**What**: [description]
**Risk**: [what could go wrong]
**Suggested Fix**: [specific language or approach]

[Repeat for each issue]

## Recommendation

[Specific next step: approve, send for review with specific notes, or reject/counter]

## Next Steps

1. [Action item 1]
2. [Action item 2]

Step 6: Routing Suggestion

Based on the classification, recommend the appropriate next step:

Classification Recommended Action Typical Timeline
GREEN Approve and route for signature per delegation of authority Same day
YELLOW Send to designated reviewer with specific issues flagged 1-2 business days
RED Engage counsel for full review; prepare counterproposal or standard form 3-5 business days

For YELLOW and RED classifications:

  • Identify the specific person or role that should review (if the organization has defined routing rules)
  • Include a brief summary of issues suitable for the reviewer to quickly understand the key points
  • If the organization has a standard form NDA, recommend sending it as a counterproposal for RED-classified NDAs

Common NDA Issues and Standard Positions

Issue: Overbroad Definition of Confidential Information

Standard position: Confidential information should be limited to non-public information disclosed in connection with the stated purpose, with clear exclusions. Redline approach: Narrow the definition to information that is marked or identified as confidential, or that a reasonable person would understand to be confidential given the nature of the information and circumstances of disclosure.

Issue: Missing Independent Development Carveout

Standard position: Must include a carveout for information independently developed without reference to or use of the disclosing party's confidential information. Risk if missing: Could create claims that internally-developed products or features were derived from the counterparty's confidential information. Redline approach: Add standard independent development carveout.

Issue: Non-Solicitation of Employees

Standard position: Non-solicitation provisions do not belong in NDAs. They are appropriate in employment agreements, M&A agreements, or specific commercial agreements. Redline approach: Delete the provision entirely. If the counterparty insists, limit to targeted solicitation (not general recruitment) and set a short term (12 months).

Issue: Broad Residuals Clause

Standard position: Resist residuals clauses. If required, limit to: (a) general ideas, concepts, know-how, or techniques retained in the unaided memory of individuals who had authorized access; (b) explicitly exclude trade secrets and patentable information; (c) does not grant any IP license. Risk if too broad: Effectively grants a license to use the disclosing party's confidential information for any purpose.

Issue: Perpetual Confidentiality Obligation

Standard position: 2-5 years from disclosure or termination, whichever is later. Trade secrets may warrant protection for as long as they remain trade secrets. Redline approach: Replace perpetual obligation with a defined term. Offer a trade secret carveout for longer protection of qualifying information.

Notes

  • If the document is not actually an NDA (e.g., it's labeled as an NDA but contains substantive commercial terms), flag this immediately as a RED and recommend full contract review instead
  • For NDAs that are part of a larger agreement (e.g., confidentiality section in an MSA), note that the broader agreement context may affect the analysis
  • Always note that this is a screening tool and counsel should review any items the user is uncertain about
跨系统核查供应商协议状态,整合CLM、CRM等数据,提供签署概览、到期提醒及MSA/DPA等文件缺口分析,适用于供应商入职或续约场景。
供应商入职审查 合同续约评估 检查协议缺失项 监控合同到期风险
legal/skills/vendor-check/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill vendor-check -g -y
SKILL.md
Frontmatter
{
    "name": "vendor-check",
    "description": "Check the status of existing agreements with a vendor across all connected systems — CLM, CRM, email, and document storage — with gap analysis and upcoming deadlines. Use when onboarding or renewing a vendor, when you need a consolidated view of what's signed and what's missing (MSA, DPA, SOW), or when checking for approaching expirations and surviving obligations.",
    "argument-hint": "[vendor name]"
}

/vendor-check -- Vendor Agreement Status

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Check the status of existing agreements with a vendor across all connected systems. Provides a consolidated view of the legal relationship.

Important: This command assists with legal workflows but does not provide legal advice. Agreement status reports should be verified against original documents by qualified legal professionals.

Invocation

/vendor-check [vendor name]

If no vendor name is provided, prompt the user to specify which vendor to check.

Workflow

Step 1: Identify the Vendor

Accept the vendor name from the user. Handle common variations:

  • Full legal name vs. trade name (e.g., "Alphabet Inc." vs. "Google")
  • Abbreviations (e.g., "AWS" vs. "Amazon Web Services")
  • Parent/subsidiary relationships

Ask the user to clarify if the vendor name is ambiguous.

Step 2: Search Connected Systems

Search for the vendor across all available connected systems, in priority order:

CLM (Contract Lifecycle Management) -- If Connected

Search for all contracts involving the vendor:

  • Active agreements
  • Expired agreements (last 3 years)
  • Agreements in negotiation or pending signature
  • Amendments and addenda

CRM -- If Connected

Search for the vendor/account record:

  • Account status and relationship type
  • Associated opportunities or deals
  • Contact information for vendor's legal/contracts team

Email -- If Connected

Search for recent relevant correspondence:

  • Contract-related emails (last 6 months)
  • NDA or agreement attachments
  • Negotiation threads

Documents (e.g., Box, Egnyte, SharePoint) -- If Connected

Search for:

  • Executed agreements
  • Redlines and drafts
  • Due diligence materials

Chat (e.g., Slack, Teams) -- If Connected

Search for recent mentions:

  • Contract requests involving this vendor
  • Legal questions about the vendor
  • Relevant team discussions (last 3 months)

Step 3: Compile Agreement Status

For each agreement found, report:

Field Details
Agreement Type NDA, MSA, SOW, DPA, SLA, License Agreement, etc.
Status Active, Expired, In Negotiation, Pending Signature
Effective Date When the agreement started
Expiration Date When it expires or renews
Auto-Renewal Yes/No, with renewal term and notice period
Key Terms Liability cap, governing law, termination provisions
Amendments Any amendments or addenda on file

Step 4: Gap Analysis

Identify what agreements exist and what might be missing:

## Agreement Coverage

[CHECK] NDA -- [status]
[CHECK/MISSING] MSA -- [status or "Not found"]
[CHECK/MISSING] DPA -- [status or "Not found"]
[CHECK/MISSING] SOW(s) -- [status or "Not found"]
[CHECK/MISSING] SLA -- [status or "Not found"]
[CHECK/MISSING] Insurance Certificate -- [status or "Not found"]

Flag any gaps that may be needed based on the relationship type (e.g., if there is an MSA but no DPA and the vendor handles personal data).

Step 5: Generate Report

Output a consolidated report:

## Vendor Agreement Status: [Vendor Name]

**Search Date**: [today's date]
**Sources Checked**: [list of systems searched]
**Sources Unavailable**: [list of systems not connected, if any]

## Relationship Overview

**Vendor**: [full legal name]
**Relationship Type**: [vendor/partner/customer/etc.]
**CRM Status**: [if available]

## Agreement Summary

### [Agreement Type 1] -- [Status]
- **Effective**: [date]
- **Expires**: [date] ([auto-renews / does not auto-renew])
- **Key Terms**: [summary of material terms]
- **Location**: [where the executed copy is stored]

### [Agreement Type 2] -- [Status]
[etc.]

## Gap Analysis

[What's in place vs. what may be needed]

## Upcoming Actions

- [Any approaching expirations or renewal deadlines]
- [Required agreements not yet in place]
- [Amendments or updates that may be needed]

## Notes

[Any relevant context from email/chat searches]

Step 6: Handle Missing Sources

If key systems are not connected via MCP:

  • No CLM: Note that no CLM is connected. Suggest the user check their CLM manually. Report what was found in other systems.
  • No CRM: Skip CRM context. Note the gap.
  • No Email: Note that email was not searched. Suggest the user search their email for "[vendor name] agreement" or "[vendor name] NDA".
  • No Documents: Note that document storage was not searched.

Always clearly state which sources were checked and which were not, so the user knows the completeness of the report.

Notes

  • If no agreements are found in any connected system, report that clearly and ask the user if they have agreements stored elsewhere
  • For vendor groups (e.g., a vendor with multiple subsidiaries), ask whether the user wants to check a specific entity or the entire group
  • Flag any agreements that are expired but may still have surviving obligations (confidentiality, indemnification, etc.)
  • If an agreement is approaching expiration (within 90 days), highlight this prominently
根据品牌指南审查内容,检查语气、术语、信息支柱及风格一致性。自动适配配置或通用标准,始终标记法律合规风险,提供具体修改建议,适用于稿件发布前审核与文案审计。
用户运行 /brand-review 命令 请求审查、检查或审计内容是否符合品牌指南
marketing/skills/brand-review/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill brand-review -g -y
SKILL.md
Frontmatter
{
    "name": "brand-review",
    "description": "Review content against your brand voice, style guide, and messaging pillars, flagging deviations by severity with specific before\/after fixes. Use when checking a draft before it ships, when auditing copy for voice consistency and terminology, or when screening for unsubstantiated claims, missing disclaimers, and other legal flags.",
    "argument-hint": "<content to review>"
}

Brand Review

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Review marketing content against brand voice, style guidelines, and messaging standards. Flag deviations and provide specific improvement suggestions.

Trigger

User runs /brand-review or asks to review, check, or audit content against brand guidelines.

Inputs

  1. Content to review — accept content in any of these forms:

    • Pasted directly into the conversation
    • A file path or ~~knowledge base reference (e.g. Notion page, shared doc)
    • A URL to a published page
    • Multiple pieces for batch review
  2. Brand guidelines source (determined automatically):

    • If a brand style guide is configured in local settings, use it automatically
    • If not configured, ask: "Do you have a brand style guide or voice guidelines I should review against? You can paste them, share a file, or describe your brand voice. Otherwise, I'll do a general review for clarity, consistency, and professionalism."

Review Process

With Brand Guidelines Configured

Evaluate the content against each of these dimensions:

Voice and Tone

  • Does the content match the defined brand voice attributes?
  • Is the tone appropriate for the content type and audience?
  • Are there shifts in voice that feel inconsistent?
  • Flag specific sentences or phrases that deviate with an explanation of why

Terminology and Language

  • Are preferred brand terms used correctly?
  • Are any "avoid" terms or phrases present?
  • Is jargon level appropriate for the target audience?
  • Are product names, feature names, and branded terms used correctly (capitalization, formatting)?

Messaging Pillars

  • Does the content align with defined messaging pillars or value propositions?
  • Are claims consistent with approved messaging?
  • Is the content reinforcing or contradicting brand positioning?

Style Guide Compliance

  • Grammar and punctuation per style guide (e.g., Oxford comma, title case vs. sentence case)
  • Formatting conventions (headers, lists, emphasis)
  • Number formatting, date formatting
  • Acronym usage (defined on first use?)

Without Brand Guidelines (Generic Review)

Evaluate the content for:

Clarity

  • Is the main message clear within the first paragraph?
  • Are sentences concise and easy to understand?
  • Is the structure logical and easy to follow?
  • Are there ambiguous statements or unclear references?

Consistency

  • Is the tone consistent throughout?
  • Are terms used consistently (no switching between synonyms for the same concept)?
  • Is formatting consistent (headers, lists, capitalization)?

Professionalism

  • Is the content free of typos, grammatical errors, and awkward phrasing?
  • Is the tone appropriate for the intended audience?
  • Are claims supported or substantiated?

Legal and Compliance Flags (Always Checked)

Regardless of whether brand guidelines are configured, flag:

  • Unsubstantiated claims — superlatives ("best", "fastest", "only") without evidence or qualification
  • Missing disclaimers — financial claims, health claims, or guarantees that may need legal disclaimers
  • Comparative claims — comparisons to competitors that could be challenged
  • Regulatory language — content that may need compliance review (financial services, healthcare, etc.)
  • Testimonial issues — quotes or endorsements without attribution or disclosure
  • Copyright concerns — content that appears to be closely paraphrased from other sources

Brand Voice Reference

Use these frameworks to evaluate content against brand standards or to help the user document their brand voice.

Brand Voice Documentation Framework

A complete brand voice document should cover these areas:

  1. Brand Personality — Define the brand as if it were a person. Example: "If our brand were a person, they would be a knowledgeable colleague who explains complex things simply, celebrates your wins genuinely, and never talks down to you."
  2. Voice Attributes — 3-5 attributes that define how the brand communicates, each defined with what it means in practice, what it does NOT mean (to prevent misinterpretation), and an example.
  3. Audience Awareness — Who the brand is speaking to (primary and secondary), what they care about, their level of expertise, and how they expect to be addressed.
  4. Core Messaging Pillars — 3-5 key themes the brand consistently communicates, the hierarchy of these messages, and how each pillar connects to audience needs.
  5. Tone Spectrum — How the voice adapts across contexts while remaining recognizably the same brand.
  6. Style Rules — Specific grammar, formatting, and language rules.
  7. Terminology — Preferred and avoided terms.

Voice Attribute Spectrums

When defining or evaluating brand voice, position attributes on a spectrum:

Spectrum One End Other End
Formality Formal, institutional Casual, conversational
Authority Expert, authoritative Peer-level, collaborative
Emotion Warm, empathetic Direct, matter-of-fact
Complexity Technical, precise Simple, accessible
Energy Bold, energetic Calm, measured
Humor Playful, witty Serious, earnest
Innovation Cutting-edge, forward-looking Established, proven

For each chosen attribute, document it in this format:

[Attribute name]

  • We are: [what this means in practice]
  • We are not: [common misinterpretation to avoid]
  • This sounds like: [example sentence demonstrating the attribute]
  • This does NOT sound like: [example sentence violating the attribute]

Example:

Approachable

  • We are: friendly, clear, jargon-free, welcoming to beginners and experts alike
  • We are not: dumbed-down, overly casual, or lacking substance
  • This sounds like: "Here's how to get started — it takes about five minutes."
  • This does NOT sound like: "Yo! This is super easy, even a noob can do it lol."

Tone Adaptation Across Channels and Contexts

The brand voice stays consistent, but tone adapts to context. Tone is the emotional inflection applied to the voice.

Tone by Channel

Channel Tone Adaptation Example
Blog Informative, conversational, educational "Let's walk through how this works and why it matters for your team."
Social media (LinkedIn) Professional, thought-provoking, concise "Three things we learned from running 50 campaigns this quarter."
Social media (Twitter/X) Punchy, direct, sometimes witty "Your landing page has 3 seconds. Make them count."
Email marketing Personal, helpful, action-oriented "We put together something we think you'll find useful."
Sales collateral Confident, benefit-driven, specific "Teams using our platform reduce reporting time by 40%."
Support/Help docs Clear, patient, step-by-step "If you see this error, here's how to fix it."
Press release Formal, factual, newsworthy "The company today announced the launch of..."
Error messages Empathetic, helpful, blame-free "Something went wrong on our end. We're looking into it."

Tone by Situation

Situation Tone Adaptation
Product launch Excited, confident, forward-looking
Incident or outage Transparent, empathetic, accountable
Customer success story Celebratory, specific, crediting the customer
Thought leadership Authoritative, nuanced, evidence-based
Onboarding Welcoming, encouraging, clear
Bad news (price increase, deprecation) Honest, respectful, solution-oriented
Competitive comparison Confident but fair, fact-based, not disparaging

Tone Adaptation Rule

The voice attributes remain fixed. Tone dials them up or down based on context. For example, if a brand is "bold and warm":

  • In a product launch, dial up boldness
  • In an incident response, dial up warmth
  • Neither attribute disappears; the balance shifts

Style Guide Enforcement

Grammar and Mechanics

Document and enforce these choices consistently:

Rule Options Example
Oxford comma Yes / No "fast, reliable, and secure" vs. "fast, reliable and secure"
Sentence case vs. title case (headings) Sentence / Title "How to get started" vs. "How to Get Started"
Contractions Use / Avoid "we're" vs. "we are"
Em dash spacing No spaces / Spaces "this—and more" vs. "this — and more"
Numbers Spell out 1-9, numerals 10+ / Always numerals "five features" vs. "5 features"
Percent % / percent "50%" vs. "50 percent"
Date format Month DD, YYYY / DD/MM/YYYY / etc. "January 15, 2025"
Time format 12-hour / 24-hour "3:00 PM" vs. "15:00"
Lists Periods / No periods on fragments "Set up your account." vs. "Set up your account"

Formatting Conventions

  • Heading hierarchy (when to use H1, H2, H3)
  • Bold and italic usage (bold for emphasis, italic for titles/terms)
  • Link text (descriptive vs. "click here" — always descriptive)
  • Image alt text requirements
  • Code formatting (for technical brands)
  • Callout or highlight box usage

Punctuation and Emphasis

  • Exclamation mark policy (limited use, never more than one)
  • Ellipsis usage (avoid in most professional contexts)
  • ALL CAPS policy (avoid; use bold for emphasis instead)
  • Emoji usage by channel (professional channels: minimal or none; social: where appropriate)

Terminology Management

Preferred Terms

Maintain a list of preferred terms and their incorrect alternatives:

Use This Not This Notes
sign up (verb) signup (verb) "signup" is the noun form
log in (verb) login (verb) "login" is the noun/adjective form
set up (verb) setup (verb) "setup" is the noun/adjective form
email e-mail No hyphen
website web site One word
data is (singular) data are Unless the publication requires plural

Product and Feature Names

  • Official capitalization for product names
  • When to use the full product name vs. shorthand
  • Whether to use "the" before product names
  • How to handle versioning in copy
  • Trademark and registration symbols (when required and when to omit)

Inclusive Language

  • Use gender-neutral language (they/them for unknown individuals)
  • Avoid ableist language ("crazy", "blind spot", "lame")
  • Use person-first language where appropriate
  • Avoid culturally specific idioms that may not translate
  • Use "simple" or "straightforward" instead of "easy" (what is easy varies by person)

Industry Jargon Management

  • Define which technical terms the audience understands without explanation
  • List jargon that should always be defined or replaced with plain language
  • Specify which acronyms need to be spelled out on first use
  • Audience-specific glossary for terms that mean different things to different readers

Competitor and Category Terms

  • How to refer to your product category (use your preferred framing)
  • How to refer to competitors (by name or generically)
  • Terms competitors have coined that you should avoid (to prevent reinforcing their positioning)
  • Your preferred differentiation language

Output Format

Present the review as:

Summary

  • Overall assessment: how well the content aligns with brand standards (or general quality)
  • 1-2 sentence summary of the biggest strengths
  • 1-2 sentence summary of the most important improvements

Detailed Findings

For each issue found, provide:

Issue Location Severity Suggestion

Where severity is:

  • High — contradicts brand voice, contains compliance risk, or significantly undermines messaging
  • Medium — inconsistent with guidelines but not damaging
  • Low — minor style or preference issue

Revised Sections

For the top 3-5 highest-severity issues, provide a before/after showing the original text and a suggested revision.

Legal/Compliance Flags

List any legal or compliance concerns separately with recommended actions.

After Review

Ask: "Would you like me to:

  • Revise the full content with these suggestions applied?
  • Focus on fixing just the high-severity issues?
  • Review additional content against the same guidelines?
  • Help you document your brand voice for future reviews?"
用于生成全面的市场营销战役简报,涵盖目标、受众、信息、渠道策略、内容日历及成功指标。适用于产品发布、线索获取或品牌认知活动,将营销目标转化为可执行的结构化计划。
用户运行 /campaign-plan 命令 用户要求规划、设计或构建营销活动 需要制定周度内容日历 需要将营销目标转化为结构化执行计划
marketing/skills/campaign-plan/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill campaign-plan -g -y
SKILL.md
Frontmatter
{
    "name": "campaign-plan",
    "description": "Generate a full campaign brief with objectives, audience, messaging, channel strategy, content calendar, and success metrics. Use when planning a product launch, lead-gen push, or awareness campaign, when you need a week-by-week content calendar with dependencies, or when translating a marketing goal into a structured, executable plan.",
    "argument-hint": "<campaign objective or product>"
}

Campaign Plan

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Generate a comprehensive marketing campaign brief with objectives, audience, messaging, channel strategy, content calendar, and success metrics.

Trigger

User runs /campaign-plan or asks to plan, design, or build a marketing campaign.

Inputs

Gather the following from the user. If not provided, ask before proceeding:

  1. Campaign goal — the primary objective (e.g., drive signups, increase awareness, launch a product, generate leads, re-engage churned users)

  2. Target audience — who the campaign is aimed at (demographics, roles, industries, pain points, buying stage)

  3. Timeline — campaign duration and any fixed dates (launch date, event date, seasonal deadline)

  4. Budget range — approximate budget or budget tier (optional; if not provided, generate a channel-agnostic plan and note where budget allocation would matter)

  5. Additional context (optional):

    • Product or service being promoted
    • Key differentiators or value propositions
    • Previous campaign performance or learnings
    • Brand guidelines or constraints
    • Geographic focus

Campaign Brief Structure

Generate a campaign brief with the following sections:

1. Campaign Overview

  • Campaign name suggestion
  • One-sentence campaign summary
  • Primary objective with a specific, measurable goal
  • Secondary objectives (if applicable)

2. Target Audience

  • Primary audience segment with description
  • Secondary audience segment (if applicable)
  • Audience pain points and motivations
  • Where they spend time (channels, communities, publications)
  • Buying stage alignment (awareness, consideration, decision)

3. Key Messages

  • Core campaign message (one sentence)
  • 3-4 supporting messages tailored to audience pain points
  • Message variations by channel (if different tones are needed)
  • Proof points or evidence to support each message

4. Channel Strategy

Recommend channels based on audience and goal. For each channel, include:

  • Why this channel fits the audience and objective
  • Content format recommendations
  • Estimated effort level (low, medium, high)
  • Budget allocation suggestion (if budget was provided)

Consider channels from:

  • Owned: blog, email, website, social media profiles
  • Earned: PR, influencer partnerships, guest posts, community engagement
  • Paid: search ads, social ads, display, sponsored content, events

5. Content Calendar

Create a week-by-week (or day-by-day for short campaigns) content calendar:

  • What content to produce each week
  • Which channel each piece targets
  • Key milestones and deadlines
  • Dependencies between pieces (e.g., "landing page must be live before paid ads launch")

Format as a table:

Week Content Piece Channel Owner/Notes Status

6. Content Pieces Needed

List every content asset required for the campaign:

  • Asset name and type (blog post, email, social post, ad creative, landing page, etc.)
  • Brief description of what it should contain
  • Priority (must-have vs. nice-to-have)
  • Suggested timeline for creation

7. Success Metrics

Define KPIs aligned to the campaign objective:

  • Primary KPI with target number
  • Secondary KPIs (3-5)
  • How each metric will be tracked
  • Reporting cadence recommendation

If ~~product analytics is connected, reference any available historical performance benchmarks to inform targets.

8. Budget Allocation (if budget provided)

  • Breakdown by channel or activity
  • Production costs vs. distribution costs
  • Contingency recommendation (typically 10-15%)

9. Risks and Mitigations

  • 2-3 potential risks (timeline, audience mismatch, channel underperformance)
  • Mitigation strategy for each

10. Next Steps

  • Immediate action items to kick off the campaign
  • Stakeholder approvals needed
  • Key decision points

Planning Reference

Campaign Framework: Objective, Audience, Message, Channel, Measure

Every campaign should be built on this five-part framework:

Objective

Define what success looks like before planning anything else.

  • Awareness: increase brand or product visibility (measured by reach, impressions, share of voice)
  • Consideration: drive engagement and education (measured by content engagement, email signups, webinar attendance)
  • Conversion: generate leads or sales (measured by signups, demos, purchases, pipeline)
  • Retention: re-engage existing customers (measured by churn reduction, upsell, NPS)
  • Advocacy: turn customers into promoters (measured by referrals, reviews, UGC)

Good objectives are SMART: Specific, Measurable, Achievable, Relevant, Time-bound.

Example: "Generate 200 marketing qualified leads from mid-market SaaS companies in North America within 6 weeks of campaign launch."

Audience

Define who you are trying to reach with enough specificity to guide messaging and channel decisions.

  • Demographics: role/title, seniority, company size, industry
  • Psychographics: motivations, pain points, goals, objections
  • Behavioral: where they consume content, how they buy, what they have engaged with before
  • Buying stage: are they unaware of the problem, researching solutions, or ready to buy?

Create a brief audience profile (not a full persona) for campaign planning:

"[Role] at [company type] who is struggling with [pain point] and looking for [desired outcome]. They typically discover solutions through [channels] and care most about [priorities]."

Message

Craft the core message and supporting points that will resonate with the audience.

  • Core message: one sentence that captures what you want the audience to think, feel, or do
  • Supporting messages: 3-4 points that provide evidence, address objections, or elaborate on benefits
  • Proof points: data, case studies, testimonials, or third-party validation for each supporting message
  • Differentiation: what makes your offering different from alternatives (including doing nothing)

Message hierarchy:

  1. Why should I care? (addresses the pain point or opportunity)
  2. What is the solution? (positions your offering)
  3. Why you? (differentiates from alternatives)
  4. What should I do? (call to action)

Channel

Select channels based on where your audience is, not where you are most comfortable. See the Channel Selection Guide below.

Measure

Define how you will know the campaign worked. See Success Metrics by Campaign Type below.

Channel Selection Guide

Owned Channels

Channel Best For Typical Metrics Effort
Blog/Website SEO, thought leadership, education Traffic, time on page, conversions Medium
Email Nurture, retention, announcements Open rate, CTR, conversions Low-Medium
Social (organic) Awareness, community, brand building Engagement, reach, follower growth Medium
Webinars Education, lead gen, product demos Registrations, attendance, pipeline High
Podcast Thought leadership, brand awareness Downloads, subscriber growth High

Earned Channels

Channel Best For Typical Metrics Effort
PR/Media Awareness, credibility, launches Coverage, share of voice, referral traffic High
Guest content Audience expansion, SEO, credibility Referral traffic, backlinks Medium
Influencer/Partner Audience expansion, trust Reach, engagement, referral conversions Medium-High
Community Awareness, trust, feedback Mentions, engagement, referral traffic Medium
Reviews/Ratings Credibility, SEO, consideration Review volume, rating, conversion lift Low-Medium

Paid Channels

Channel Best For Typical Metrics Effort
Search ads (SEM) High-intent lead capture CPC, CTR, conversion rate, CPA Medium
Social ads Awareness, retargeting, lead gen CPM, CPC, CTR, CPA, ROAS Medium
Display/Programmatic Awareness, retargeting Impressions, CPM, view-through conversions Low-Medium
Sponsored content Thought leadership, lead gen Engagement, leads, cost per lead Medium
Events/Sponsorships Relationship building, brand Leads, meetings, pipeline influenced High

Channel Selection Criteria

When choosing channels, consider:

  • Where does your target audience spend time?
  • What is the buying stage you are targeting? (awareness channels vs. conversion channels)
  • What is your budget? (paid channels require spend; owned/earned require time)
  • What content assets do you already have or can you produce?
  • What has worked in the past? (reference historical data if available)

Content Calendar Creation

Calendar Planning Process

  1. Start with milestones: campaign launch, event dates, product releases, seasonal moments
  2. Work backward: what needs to be live and when? What is the production lead time?
  3. Map content to funnel stages: ensure coverage across awareness, consideration, and conversion
  4. Batch by theme: group related content pieces into weekly or bi-weekly themes
  5. Balance channels: do not over-index on one channel; ensure the audience sees the campaign across touchpoints
  6. Build in flexibility: leave 20% of calendar slots open for reactive or opportunistic content

Content Cadence Guidelines

  • Blog: 1-4 posts per week depending on team size and goals
  • Email newsletter: weekly or bi-weekly for most audiences
  • Social media: 3-7 posts per week per platform (varies by platform)
  • Paid campaigns: continuous during campaign window with creative refreshes every 2-4 weeks
  • Webinars: monthly or quarterly depending on resources

Production Timeline Benchmarks

  • Blog post: 3-5 business days (research, draft, review, publish)
  • Email campaign: 2-3 business days (copy, design, test, send)
  • Social media posts: 1-2 business days (draft, design, schedule)
  • Landing page: 5-7 business days (copy, design, development, QA)
  • Video content: 2-4 weeks (script, production, editing)
  • Ebook/whitepaper: 2-4 weeks (outline, draft, design, review)

Budget Allocation Approaches

Percentage of Revenue Method

  • Industry benchmark: 5-15% of revenue for marketing, with B2B typically at 5-10% and B2C at 10-15%
  • Startups and growth-stage companies often invest 15-25% of revenue in marketing
  • Within the marketing budget, allocate across brand (long-term) and performance (short-term)

Channel Allocation Framework

A common starting framework (adjust based on goals and historical data):

Category Percentage of Budget Examples
Paid acquisition 30-40% Search ads, social ads, display
Content production 20-30% Blog, video, design, ebooks
Events and sponsorships 10-20% Conferences, webinars, meetups
Tools and technology 10-15% Analytics, automation, CRM
Testing and experimentation 5-10% New channels, A/B tests, pilots

Budget Optimization Principles

  • Start with your highest-confidence channel and allocate 60-70% of paid budget there
  • Reserve 15-20% for testing new channels or tactics
  • Shift budget monthly based on performance data (do not set and forget)
  • Account for production costs, not just media spend
  • Include a 10-15% contingency for unexpected opportunities or overruns

Success Metrics by Campaign Type

Awareness Campaign

Metric What It Measures
Reach/Impressions How many people saw the campaign
Brand mention volume Increase in brand conversations
Share of voice Your mentions vs. competitors
Direct traffic People coming to your site unprompted
Social follower growth Audience building

Lead Generation Campaign

Metric What It Measures
Total leads Volume of new contacts
Marketing qualified leads (MQLs) Leads meeting quality threshold
Cost per lead (CPL) Efficiency of spend
Lead-to-MQL conversion rate Quality of leads generated
Pipeline influenced Revenue opportunity created

Product Launch Campaign

Metric What It Measures
Signups or trials Adoption of new product
Activation rate Users who complete key first action
Media coverage Earned media hits
Social buzz Mentions, shares, engagement spike
Feature adoption Usage of specific launched features

Retention/Engagement Campaign

Metric What It Measures
Churn rate change Customer retention improvement
Engagement rate Interactions with campaign content
NPS or CSAT change Satisfaction improvement
Upsell/cross-sell revenue Expansion revenue
Feature adoption Usage of promoted features

Event/Webinar Campaign

Metric What It Measures
Registrations Interest generated
Attendance rate Conversion from registration
Engagement during event Questions, polls, chat activity
Post-event conversions Leads or pipeline from attendees
Content repurposing reach Downstream audience from recordings

Output

Present the full campaign brief with clear headings and formatting. After the brief, ask:

"Would you like me to:

  • Dive deeper into any section?
  • Draft specific content pieces from the calendar?
  • Create a competitive analysis to inform the messaging?
  • Adjust the plan for a different budget or timeline?"
用于竞品调研与定位分析,生成包含内容缺口、机会及威胁的结构化简报。适用于制作销售对抗卡、发现未占用的营销角度或评估竞品动态影响。
用户运行 /competitive-brief 命令 请求竞品分析、竞品调研或市场对比
marketing/skills/competitive-brief/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill competitive-brief -g -y
SKILL.md
Frontmatter
{
    "name": "competitive-brief",
    "description": "Research competitors and generate a positioning and messaging comparison with content gaps, opportunities, and threats. Use when building sales battlecards, when finding positioning gaps and messaging angles competitors haven't claimed, or when a competitor makes a move and you need to assess the impact.",
    "argument-hint": "<competitor or market segment>"
}

Competitive Brief

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Research competitors and generate a structured competitive analysis comparing positioning, messaging, content strategy, and market presence.

Trigger

User runs /competitive-brief or asks for a competitive analysis, competitor research, or market comparison.

Inputs

Gather the following from the user:

  1. Competitor name(s) — one or more competitors to analyze (required)

  2. Your company/product context (optional but recommended):

    • What you sell and to whom
    • Your positioning or value proposition
    • Key differentiators you want to highlight
  3. Focus areas (optional — if not specified, cover all):

    • Messaging and positioning
    • Product and feature comparison
    • Content and thought leadership strategy
    • Recent announcements and news
    • Pricing and packaging (if publicly available)
    • Market presence and audience

Research Process

For each competitor, research using web search:

  1. Company website — homepage messaging, product pages, about page, pricing page
  2. Recent news — press releases, funding announcements, product launches, partnerships (last 6 months)
  3. Content strategy — blog topics, resource types, social media presence, webinars, podcasts
  4. Review sites and comparisons — third-party comparisons, analyst mentions, customer review themes
  5. Job postings — hiring signals that indicate strategic direction (optional)

Research Sources

Gather intelligence from these categories of sources:

Primary Sources (Direct from Competitor)

  • Website: homepage, product pages, pricing, about page, careers
  • Blog and resource center: content themes, publishing frequency, depth
  • Social media profiles: messaging, engagement, content strategy
  • Product demos and free trials: UX, features, onboarding experience
  • Webinars and events: topics, speakers, audience engagement
  • Press releases and newsroom: announcements, partnerships, milestones
  • Job postings: hiring signals that reveal strategic priorities (e.g., hiring for a new product line or market)

Secondary Sources (Third-Party)

  • Review sites: G2, Capterra, TrustRadius, Product Hunt — customer sentiment themes
  • Analyst reports: Gartner, Forrester, IDC — market positioning and category placement
  • News coverage: TechCrunch, industry publications — funding, partnerships, narrative
  • Social listening: mentions, sentiment, share of voice across social platforms
  • SEO tools: keyword rankings, organic traffic estimates, content gaps
  • Financial filings: revenue, growth rate, investment areas (for public companies)
  • Community forums: community forums (e.g. Reddit, Discourse), industry chat groups (e.g. Slack communities) — user sentiment

Research Cadence

  • Deep competitive analysis: quarterly (full research across all sources)
  • Competitive monitoring: monthly (scan for new announcements, content, messaging changes)
  • Real-time alerts: ongoing (set up alerts for competitor brand mentions, press, job postings)

Competitive Brief Structure

1. Executive Summary

  • 2-3 sentence overview of the competitive landscape
  • Key takeaway: your biggest opportunity and biggest threat

2. Competitor Profiles

For each competitor:

Company Overview

  • What they do (one-sentence positioning)
  • Target audience
  • Company size/stage indicators (funding, employee count if available)
  • Key recent developments

Messaging Analysis

  • Primary tagline or headline
  • Core value proposition
  • Key messaging themes (3-5)
  • Tone and voice characterization
  • How they describe the problem they solve

Product/Solution Positioning

  • How they categorize their product
  • Key features they emphasize
  • Claimed differentiators
  • Pricing approach (if publicly available)

Content Strategy

  • Blog frequency and topics
  • Content types produced (ebooks, webinars, case studies, tools)
  • Social media presence and engagement approach
  • Thought leadership themes
  • SEO strategy observations (what terms they appear to target)

Strengths

  • What they do well
  • Where their messaging resonates
  • Competitive advantages

Weaknesses

  • Gaps in their messaging or positioning
  • Areas where they are vulnerable
  • Customer complaints or criticism themes (from reviews)

3. Messaging Comparison Matrix

Dimension Your Company Competitor A Competitor B
Primary tagline ... ... ...
Target buyer ... ... ...
Key differentiator ... ... ...
Tone/voice ... ... ...
Core value prop ... ... ...

(Include user's company only if they provided their positioning context)

4. Content Gap Analysis

  • Topics your competitors cover that you do not (or vice versa)
  • Content formats they use that you could adopt
  • Keywords or themes they own vs. opportunities they have missed

5. Opportunities

  • Positioning gaps you can exploit
  • Messaging angles your competitors have not claimed
  • Audience segments they are underserving
  • Content or channel opportunities

6. Threats

  • Areas where competitors are strong and you are vulnerable
  • Trends that favor their positioning
  • Recent moves that could shift the market

7. Recommended Actions

  • 3-5 specific, actionable recommendations based on the analysis
  • Quick wins (things you can act on this week)
  • Strategic moves (longer-term positioning or content investments)

Analysis Frameworks

Messaging Comparison Frameworks

Value Proposition Comparison

For each competitor, document:

  • Promise: what they promise the customer will achieve
  • Evidence: how they prove the promise (data, testimonials, demos)
  • Mechanism: how their product delivers on the promise (the "how it works")
  • Uniqueness: what they claim only they can do

Narrative Analysis

Identify each competitor's story arc:

  • Villain: what problem or enemy they position against (status quo, legacy tools, complexity)
  • Hero: who is the hero in their story (the customer? the product? the team?)
  • Transformation: what before/after do they promise?
  • Stakes: what happens if you do not act?

This reveals positioning strategy and emotional appeals.

Messaging Strengths and Vulnerabilities

For each competitor's messaging, assess:

  • Clarity: can a first-time visitor understand what they do in 5 seconds?
  • Differentiation: is their positioning distinct or generic?
  • Proof: do they back up claims with evidence?
  • Consistency: is messaging consistent across channels?
  • Resonance: does their messaging address real customer pain points?

Content Gap Analysis Methodology

Content Audit Comparison

Map content across competitors by:

Topic/Theme Your Content Competitor A Competitor B Gap?
[Topic 1] Blog post, ebook Blog series, webinar Nothing Opportunity for B
[Topic 2] Nothing Whitepaper Blog post, video Gap for you
[Topic 3] Case study Nothing Case study Parity

Content Type Coverage

Content Format You Comp A Comp B Comp C
Blog posts Y Y Y Y
Case studies Y Y N Y
Ebooks/Whitepapers N Y Y N
Webinars Y Y Y N
Podcast N N Y N
Video content N Y Y Y
Interactive tools N N N Y
Templates/Resources Y N Y N

Identifying Content Opportunities

  1. Topics they cover that you do not: potential gaps in your content strategy
  2. Topics you cover that they do not: potential differentiators to amplify
  3. Formats they use that you do not: format gaps that could reach new audiences
  4. Audience segments they address that you do not: underserved audiences
  5. Search terms they rank for that you do not: SEO content gaps

Content Quality Assessment

  • Depth: surface-level or comprehensive?
  • Freshness: regularly updated or stale?
  • Engagement: do posts get comments, shares, links?
  • Production value: text-only or multimedia?
  • Thought leadership: original insights or rehashed content?

Positioning Strategy

Positioning Statement Framework

For your company and each competitor, define (or reverse-engineer) their positioning statement:

For [target audience], [product/company] is the [category] that [key benefit/differentiator] because [reason to believe].

Example:

For mid-market SaaS marketing teams, Acme is the campaign management platform that unifies planning and execution in one workspace because it is built on a single data model that eliminates tool fragmentation.

Positioning Map

Plot competitors on a 2x2 matrix using the two most important dimensions for your market:

Common axis pairs:

  • Price vs. Capability (low cost / basic vs. premium / full-featured)
  • Ease of Use vs. Power (simple / limited vs. complex / flexible)
  • SMB Focus vs. Enterprise Focus (self-serve / individual vs. sales-led / team)
  • Point Solution vs. Platform (does one thing well vs. does many things)
  • Innovative vs. Established (new approach vs. proven track record)

Identify which quadrant is underserved or where your differentiation is strongest.

Category Strategy

  • Create a new category: if you do something genuinely different, define and own the category (high risk, high reward)
  • Reframe the existing category: change how buyers evaluate the category to favor your strengths
  • Win the existing category: compete directly on recognized criteria and out-execute
  • Niche within the category: own a specific segment, use case, or audience

Positioning Pitfalls to Avoid

  • Positioning against a competitor rather than for a customer need
  • Claiming too many differentiators (pick 1-2 that matter most)
  • Using category jargon the customer does not use
  • Positioning on features rather than outcomes
  • Changing positioning too frequently (confuses the market)

Battlecard Creation

A competitive battlecard is a one-page reference for sales and marketing teams. Include:

Header

  • Competitor name and logo
  • Last updated date
  • Competitive win rate (if tracked)

Quick Overview

  • What they do (one sentence)
  • Their target customer
  • Pricing model summary
  • Key recent developments

Their Pitch

  • How they describe themselves
  • Their primary tagline
  • Their top 3 claimed differentiators

Strengths (Be Honest)

  • Where they genuinely compete well
  • What customers like about them (from reviews)
  • Features or capabilities where they lead

Weaknesses

  • Consistent customer complaints (from reviews)
  • Technical limitations
  • Gaps in their offering
  • Areas where customers report dissatisfaction

Our Differentiators

  • 3-5 specific ways your product or approach is different
  • For each: the differentiator, why it matters to the customer, and proof

Objection Handling

If the prospect says... Respond with...
"[Competitor] does X too" "Here is how our approach differs..."
"[Competitor] is cheaper" "Here is what that price difference gets you..."
"I've heard good things about [Competitor]" "They are strong at X. Where we differ is..."

Landmines to Set

Questions to ask prospects early that highlight your advantages:

  • "How do you currently handle [area where competitor is weak]?"
  • "How important is [capability you have that they lack]?"
  • "Have you considered [risk that your product mitigates]?"

Landmines to Defuse

Questions competitors might encourage prospects to ask you, with prepared responses.

Win/Loss Themes

  • Common reasons deals are won against this competitor
  • Common reasons deals are lost to this competitor
  • What types of prospects favor them vs. you

Battlecard Maintenance

  • Review and update quarterly at minimum
  • Update immediately after major competitor announcements
  • Incorporate win/loss feedback from sales team
  • Track which objection-handling responses are most effective

Output

Present the full competitive brief with clear formatting. Note the date of the research so the user knows the freshness of the data.

After the brief, ask:

"Would you like me to:

  • Create a battlecard for your sales team based on this analysis?
  • Draft messaging that exploits the positioning gaps identified?
  • Dive deeper into any specific competitor?
  • Set up a competitive monitoring plan?"
提供博客、社交媒体、邮件、落地页等营销内容的结构化模板与写作规范,支持SEO优化、多平台适配及CTA设计,助力高效产出高质量营销文案。
需要撰写博客文章或社交媒体帖子 需要生成邮件通讯或落地页文案 需要创建新闻稿或案例研究 需要针对特定渠道进行内容格式化或SEO优化
marketing/skills/content-creation/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill content-creation -g -y
SKILL.md
Frontmatter
{
    "name": "content-creation",
    "description": "Draft marketing content across channels — blog posts, social media, email newsletters, landing pages, press releases, and case studies. Use when writing any marketing content, when you need channel-specific formatting, SEO-optimized copy, headline options, or calls to action.",
    "user-invocable": false
}

Content Creation Skill

Guidelines and frameworks for creating effective marketing content across channels.

Content Type Templates

Blog Post Structure

  1. Headline — clear, benefit-driven, includes primary keyword (aim for 60 characters or less for SEO)
  2. Introduction (100-150 words) — hook the reader with a question, statistic, bold claim, or relatable scenario. State what the post will cover. Include primary keyword.
  3. Body sections (3-5 sections) — each with a descriptive subheading (H2). Use H3 for subsections. One core idea per section with supporting evidence, examples, or data.
  4. Conclusion (75-100 words) — summarize key takeaways, reinforce the main message, include a call to action.
  5. Meta description — under 160 characters, includes primary keyword, compels the click.

Social Media Post Structure

  • Hook — first line grabs attention (question, bold statement, number)
  • Body — 2-4 concise points or a short narrative
  • CTA — what should the reader do next (comment, click, share, tag)
  • Hashtags — 3-5 relevant hashtags (platform-dependent)

Email Newsletter Structure

  • Subject line — under 50 characters, creates curiosity or states clear value
  • Preview text — complements the subject line, does not repeat it
  • Header/hero — visual anchor and one-line value statement
  • Body sections — 2-3 content blocks, each scannable with a bold intro sentence
  • Primary CTA — one clear action per email
  • Footer — unsubscribe link, company info, social links

Landing Page Structure

  • Headline — primary benefit in under 10 words
  • Subheadline — elaborates on the headline with supporting context
  • Hero section — headline, subheadline, primary CTA, supporting image or video
  • Value propositions — 3-4 benefit-driven sections with icons or images
  • Social proof — testimonials, logos, stats, case study snippets
  • Objection handling — FAQ or trust signals
  • Final CTA — repeat the primary call to action

Press Release Structure

  • Headline — factual, newsworthy, under 80 characters
  • Subheadline — optional, adds context
  • Dateline — city, state, date
  • Lead paragraph — who, what, when, where, why in 2-3 sentences
  • Body paragraphs — supporting details, quotes, context
  • Boilerplate — company description (standardized)
  • Media contact — name, email, phone

Case Study Structure

  • Title — "[Customer] achieves [result] with [product]"
  • Snapshot — customer name, industry, company size, product used, key result (sidebar or callout box)
  • Challenge — what problem the customer faced
  • Solution — what was implemented and how
  • Results — quantified outcomes with specific metrics
  • Quote — customer testimonial
  • CTA — learn more, get a demo, read more case studies

Writing Best Practices by Channel

Blog

  • Write at an 8th-grade reading level for broad audiences; adjust up for technical audiences
  • Use short paragraphs (2-4 sentences)
  • Include subheadings every 200-300 words
  • Use bullet points and numbered lists to break up text
  • Include at least one data point, example, or quote per section
  • Write in active voice
  • Front-load key information in each section

Social Media

  • LinkedIn: professional but human, paragraph breaks for readability, personal stories and lessons perform well, 1,300 characters is the sweet spot before "see more"
  • Twitter/X: concise and punchy, strong opening words, threads for longer narratives, engage with replies
  • Instagram: visual-first captions, storytelling hooks, line breaks for readability, hashtags in first comment or at end
  • Facebook: conversational tone, questions drive comments, shorter posts (under 80 characters) get more engagement for links

Email

  • Write subject lines that create urgency, curiosity, or state clear value
  • Personalize where possible (name, company, behavior)
  • One primary CTA per email — make it visually distinct
  • Keep body copy scannable: bold key phrases, short paragraphs, bullet points
  • Test everything: subject lines, send times, CTA copy, layout
  • Mobile-first: most email is read on mobile

Web (Landing Pages, Product Pages)

  • Lead with benefits, not features
  • Use "you" language — speak to the reader directly
  • Minimize jargon unless the audience expects it
  • Every section should answer "so what?" from the reader's perspective
  • Reduce friction: fewer form fields, clear next steps, trust signals near CTAs

SEO Fundamentals for Content

Keyword Strategy

  • Identify one primary keyword and 2-3 secondary keywords per piece
  • Use the primary keyword in: headline, first paragraph, one subheading, meta description, URL slug
  • Use secondary keywords naturally in body copy and subheadings
  • Do not keyword-stuff — write for humans first

On-Page SEO Checklist

  • Title tag: under 60 characters, includes primary keyword
  • Meta description: under 160 characters, includes primary keyword, compels click
  • URL slug: short, descriptive, includes primary keyword
  • H1: one per page, matches or closely reflects the title tag
  • H2/H3: descriptive, include secondary keywords where natural
  • Image alt text: descriptive, includes keyword where relevant
  • Internal links: 2-3 links to related content on your site
  • External links: 1-2 links to authoritative sources

Content-SEO Integration

  • Aim for comprehensive coverage of the topic (search engines reward depth)
  • Answer related questions (check "People Also Ask" for ideas)
  • Update and refresh high-performing content regularly
  • Structure content for featured snippets: definition paragraphs, numbered lists, tables

Headline and Hook Formulas

Headline Formulas

  • How to [achieve result] [without common obstacle] — "How to Double Your Email Open Rates Without Sending More Emails"
  • [Number] [adjective] ways to [achieve result] — "7 Proven Ways to Reduce Customer Churn"
  • Why [common belief] is wrong (and what to do instead) — "Why More Content Is Not the Answer (And What to Do Instead)"
  • The [adjective] guide to [topic] — "The Complete Guide to B2B Content Marketing"
  • [Do this], not [that] — "Build a Community, Not Just an Audience"
  • What [impressive result] taught us about [topic] — "What 10,000 A/B Tests Taught Us About Email Subject Lines"
  • [topic]: what [audience] needs to know in [year] — "SEO: What Marketers Need to Know in 2025"

Hook Formulas (Opening Lines)

  • Surprising statistic: "73% of marketers say their biggest challenge is not budget — it is focus."
  • Contrarian statement: "The best marketing campaigns start with saying no to most channels."
  • Question: "When was the last time a marketing email actually changed what you bought?"
  • Scenario: "Imagine launching a campaign and knowing, before it goes live, which messages will land."
  • Bold claim: "Most landing pages lose half their visitors in the first three seconds."
  • Story opening: "Last quarter, our team was spending 20 hours a week on reporting. Here is what we did about it."

Call-to-Action Best Practices

CTA Principles

  • Use action verbs: "Get", "Start", "Download", "Join", "Try", "See"
  • Be specific about what happens next: "Start your free trial" is better than "Submit"
  • Create urgency when genuine: "Join 500 teams already using this" or "Limited spots available"
  • Reduce risk: "No credit card required", "Cancel anytime", "Free for 14 days"
  • One primary CTA per page or email — too many choices reduce conversions

CTA Examples by Context

  • Blog post: "Read our complete guide to [topic]" / "Subscribe for weekly insights"
  • Landing page: "Start free trial" / "Get a demo" / "See pricing"
  • Email: "Read the full story" / "Claim your spot" / "Reply and tell us"
  • Social media: "Drop a comment if you agree" / "Save this for later" / "Link in bio"
  • Case study: "See how [product] can work for your team" / "Talk to our team"

CTA Placement

  • Above the fold on landing pages (do not make users scroll to act)
  • After establishing value in emails (not in the first sentence)
  • At the end of blog posts (after you have earned the reader's trust)
  • In-line within content when contextually relevant (e.g., a related guide mention)
  • Repeat the primary CTA at the bottom of long-form pages
用于生成各类营销内容草稿,包括博客、社交媒体、邮件、落地页等。支持根据特定渠道、受众和品牌语调定制格式,并提供SEO优化建议及标题选项。
用户运行/draft-content命令 用户请求撰写或创建营销内容 需要针对特定平台或受众调整消息
marketing/skills/draft-content/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill draft-content -g -y
SKILL.md
Frontmatter
{
    "name": "draft-content",
    "description": "Draft blog posts, social media, email newsletters, landing pages, press releases, and case studies with channel-specific formatting and SEO recommendations. Use when writing any marketing content, when you need headline or subject line options, or when adapting a message for a specific platform, audience, and brand voice.",
    "argument-hint": "<content type and topic>"
}

Draft Content

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Generate marketing content drafts tailored to a specific content type, audience, and brand voice.

Trigger

User runs /draft-content or asks to draft, write, or create marketing content.

Inputs

Gather the following from the user. If not provided, ask before proceeding:

  1. Content type — one of:

    • Blog post
    • Social media post (specify platform: LinkedIn, Twitter/X, Instagram, Facebook)
    • Email newsletter
    • Landing page copy
    • Press release
    • Case study
  2. Topic — the subject or theme of the content

  3. Target audience — who this content is for (role, industry, seniority, pain points)

  4. Key messages — 2-4 main points or takeaways to communicate

  5. Tone — e.g., authoritative, conversational, inspirational, technical, witty (optional if brand voice is configured)

  6. Length — target word count or format constraint (e.g., "1000 words", "280 characters", "3 paragraphs")

Brand Voice

  • If the user has a brand voice configured in their local settings file, apply it automatically. Inform the user that brand voice settings are being applied.
  • If no brand voice is configured, ask: "Do you have brand voice guidelines you'd like me to follow? If not, I'll use a neutral professional tone."
  • Apply the specified or default tone consistently throughout the draft.

Content Generation by Type

Blog Post

  • Engaging headline (provide 2-3 options)
  • Introduction with a hook (question, statistic, bold statement, or story)
  • 3-5 organized sections with descriptive subheadings
  • Supporting points, examples, or data references in each section
  • Conclusion with a clear call to action
  • SEO considerations: suggest a primary keyword, include it in the headline and first paragraph, use related keywords in subheadings

Social Media Post

  • Platform-appropriate format and length
  • Hook in the first line
  • Hashtag suggestions (3-5 relevant hashtags)
  • Call to action or engagement prompt
  • Emoji usage appropriate to brand and platform
  • If LinkedIn: professional framing, paragraph breaks for readability
  • If Twitter/X: concise, punchy, within character limit
  • If Instagram: visual-first language, story-driven, hashtag block

Email Newsletter

  • Subject line (provide 2-3 options with open-rate considerations)
  • Preview text
  • Greeting
  • Body sections with clear hierarchy
  • Call to action button text
  • Sign-off
  • Unsubscribe note reminder

Landing Page Copy

  • Headline and subheadline
  • Hero section copy
  • Value propositions (3-4 benefit-driven bullets or sections)
  • Social proof placeholder (suggest testimonial or stat placement)
  • Primary and secondary CTAs
  • FAQ section suggestions
  • SEO: meta title and meta description suggestions

Press Release

  • Headline following press release conventions
  • Dateline and location
  • Lead paragraph (who, what, when, where, why)
  • Supporting quotes (provide placeholder guidance)
  • Company boilerplate placeholder
  • Media contact placeholder
  • Standard press release formatting

Case Study

  • Title emphasizing the result
  • Customer overview (industry, size, challenge)
  • Challenge section
  • Solution section (what was implemented)
  • Results section with metrics (prompt user for data)
  • Customer quote placeholder
  • Call to action

SEO Considerations (for web content)

For blog posts, landing pages, and other web-facing content:

  • Suggest a primary keyword based on the topic
  • Recommend keyword placement: headline, first paragraph, subheadings, meta description
  • Suggest internal and external linking opportunities
  • Recommend a meta description (under 160 characters)
  • Note image alt text opportunities

Output

Present the draft with clear formatting. After the draft, include:

  • A brief note on what brand voice and tone were applied
  • Any SEO recommendations (for web content)
  • Suggestions for next steps (e.g., "Review with your team", "Add customer quotes", "Pair with a visual")

Ask: "Would you like me to revise any section, adjust the tone, or create a variation for a different channel?"

设计完整的电子邮件序列,涵盖文案、时机、分支逻辑及性能基准。适用于入职、线索培育、再参与等场景,支持A/B测试建议与流程图映射,提供从策略到单邮件细节的全流程生成能力。
用户运行 /email-sequence 命令 请求创建或设计电子邮件序列、 drip campaign、培育流或入职系列
marketing/skills/email-sequence/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill email-sequence -g -y
SKILL.md
Frontmatter
{
    "name": "email-sequence",
    "description": "Design and draft multi-email sequences with full copy, timing, branching logic, exit conditions, and performance benchmarks. Use when building onboarding, lead nurture, re-engagement, win-back, or product launch flows, when you need a complete drip campaign with A\/B test suggestions, or when mapping a sequence end-to-end with a flow diagram.",
    "argument-hint": "[sequence type]"
}

Email Sequence

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Design and draft complete email sequences with full copy, timing, branching logic, and performance benchmarks for any lifecycle or campaign use case.

Trigger

User runs /email-sequence or asks to create, design, build, or draft an email sequence, drip campaign, nurture flow, or onboarding series.

Inputs

Gather the following from the user. If not provided, ask before proceeding:

  1. Sequence type — one of:

    • Onboarding
    • Lead nurture
    • Re-engagement
    • Product launch
    • Event follow-up
    • Upgrade/upsell
    • Win-back
    • Educational drip
  2. Goal — what the sequence should achieve (e.g., activate new users, convert leads to customers, reduce churn, drive event attendance, upsell to a higher tier)

  3. Audience — who receives this sequence, what stage they are at, and any relevant segmentation details (role, industry, behavior triggers, lifecycle stage)

  4. Number of emails (optional) — if not specified, recommend a count based on the sequence type using the templates in the Sequence Type Templates section below

  5. Timing/cadence preferences (optional) — desired spacing between emails (e.g., "every 3 days", "weekly", "aggressive first week then taper off")

  6. Brand voice — if configured in local settings, apply automatically and inform the user. If not configured, ask: "Do you have brand voice guidelines I should follow? If not, I'll use a clear, conversational professional tone."

  7. Additional context (optional):

    • Specific offers, discounts, or incentives to include
    • CTAs or landing pages to link to
    • Content assets available (blog posts, case studies, videos, guides)
    • Product features to highlight
    • Competitor differentiators to reference

Process

1. Sequence Strategy

Before drafting any emails, define the overall sequence architecture:

  • Narrative arc — what story does this sequence tell across all emails? What is the emotional and logical progression from first email to last?
  • Journey mapping — map each email to a stage of the buyer or user journey (awareness, consideration, decision, activation, expansion)
  • Escalation logic — how does the intensity, urgency, or value of each email build on the previous one?
  • Success definition — what specific action signals that the sequence has done its job and the recipient should exit?

2. Individual Email Design

For each email in the sequence, produce:

Subject Line

  • Provide 2-3 options per email
  • Vary approaches: curiosity, benefit-driven, urgency, personalization, question-based
  • Keep under 50 characters where possible; note preview behavior on mobile

Preview Text

  • 40-90 characters that complement (not repeat) the subject line
  • Should add context or intrigue that increases open likelihood

Email Purpose

  • One sentence explaining why this email exists and what it moves the recipient toward

Body Copy

  • Full draft ready to use
  • Clear hierarchy: hook, body, CTA
  • Short paragraphs (2-3 sentences max)
  • Scannable formatting with bold key phrases where appropriate
  • Personalization tokens where relevant (e.g., first name, company name, product used)

Primary CTA

  • Button text and destination
  • One primary CTA per email (secondary CTA only if appropriate for the sequence stage)

Timing

  • Days after the trigger event or after the previous email
  • Note if timing should adjust based on engagement (e.g., "send sooner if they opened but did not click")

Segment/Condition Notes

  • Who receives this email vs. who skips it
  • Any behavioral or attribute-based conditions (e.g., "only send to users who have not completed setup")

3. Sequence Logic

Define the flow control for the sequence:

  • Branching conditions — alternate paths based on engagement. For example:
    • "If opened email 2 but did not click CTA, send email 2b (softer re-ask) instead of email 3"
    • "If clicked CTA in email 1, skip email 2 and go directly to email 3"
  • Exit conditions — when a recipient converts (completes the desired action), remove them from the sequence. Define what "conversion" means for this sequence.
  • Re-entry rules — can someone re-enter the sequence? Under what conditions? (e.g., "if a user churns again 90 days later, re-enter the win-back sequence")
  • Suppression rules — do not send if the recipient is already in another active sequence, has unsubscribed from marketing, or has contacted support in the last 48 hours

4. Performance Benchmarks

Provide expected benchmarks based on the sequence type so the user can set targets:

Metric Onboarding Lead Nurture Re-engagement Win-back
Open rate 50-70% 20-30% 15-25% 15-20%
Click-through rate 10-20% 3-7% 2-5% 2-4%
Conversion rate 15-30% 2-5% 3-8% 1-3%
Unsubscribe rate <0.5% <0.5% 1-2% 1-3%

Adjust benchmarks based on industry and audience if the user has provided that context.

Sequence Type Templates

Use these as starting frameworks. Adapt length and content based on the user's goal and audience.

Onboarding (5-7 emails over 14-21 days): Welcome and set expectations -- Quick win to demonstrate value -- Core feature deep dive -- Advanced feature or integration -- Social proof and community -- Check-in and feedback request -- Upgrade prompt or next steps

Lead Nurture (4-6 emails over 3-4 weeks): Value-first educational content -- Pain point identification -- Solution positioning with proof -- Social proof and results -- Soft CTA (trial, demo, resource) -- Direct CTA (buy, book, sign up)

Re-engagement (3-4 emails over 10-14 days): "We miss you" with a compelling reason to return -- Value reminder highlighting what they are missing -- Incentive or exclusive offer -- Last chance with clear deadline

Win-back (3-5 emails over 30 days): Friendly check-in asking what went wrong -- What is new since they left -- Special offer or incentive to return -- Feedback request (even if they do not come back) -- Final goodbye with door open

Product Launch (4-6 emails over 2-3 weeks): Teaser or pre-announcement -- Launch announcement with full details -- Feature spotlight or use case -- Social proof and early results -- Limited-time offer or bonus -- Last chance or reminder

Event Follow-up (3-4 emails over 7-10 days): Thank you with key takeaways or recordings -- Resource roundup from the event -- Related offer or next step -- Feedback survey

Upgrade/Upsell (3-5 emails over 2-3 weeks): Usage milestone or success celebration -- Feature gap or limitation they are hitting -- Upgrade benefits with proof -- Limited-time incentive -- Direct comparison of plans

Educational Drip (5-8 emails over 4-6 weeks): Introduction and what they will learn -- Lesson 1: foundational concept -- Lesson 2: intermediate concept -- Lesson 3: advanced concept -- Practical application or exercise -- Resource roundup -- Graduation and next steps

Tool Integration

If ~~email marketing is connected (e.g., Klaviyo, Mailchimp, Customer.io)

  • Reference how to set up the sequence as a flow or automation in the platform
  • Note any platform-specific features to use (e.g., smart send time, conditional splits, A/B testing)
  • Map the branching logic to the platform's visual flow builder concepts

If ~~marketing automation or ~~CRM is connected (e.g., HubSpot, Marketo)

  • Reference lead scoring data to inform segmentation and exit conditions
  • Use lifecycle stage data to tailor messaging per segment
  • Note how to set enrollment triggers based on CRM properties or list membership

If no tools are connected

  • Deliver all email content in copy-paste-ready format
  • Include a setup checklist the user can follow in any email platform:
    1. Create the automation or flow
    2. Set the enrollment trigger
    3. Add each email with the specified delays
    4. Configure branching and exit conditions
    5. Set up tracking for the recommended metrics

Output

Present the complete sequence with the following sections:

Sequence Overview Table

# Subject Line Purpose Timing Primary CTA Condition

Full Email Drafts

Each email with subject line options, preview text, purpose, body copy, CTA, timing, and segment notes.

Sequence Flow Diagram

A text-based diagram showing the email flow, branching paths, and exit points. Use a clear format such as:

[Trigger] --> Email 1 (Day 0)
                |
          Opened? --Yes--> Email 2 (Day 3)
                |              |
                No        Clicked CTA? --Yes--> [EXIT: Converted]
                |              |
                v              No
          Email 1b (Day 2)     |
                |              v
                +--------> Email 3 (Day 7)
                               |
                               v
                          Email 4 (Day 10)
                               |
                          [EXIT: Sequence complete]

Branching Logic Notes

Summary of all conditions, exits, and suppressions in a reference list.

A/B Test Suggestions

  • 2-3 recommended A/B tests (subject lines, CTA text, send time, email length)
  • What to test, how to split, and how to measure the winner

Metrics to Track

  • Primary conversion metric for the sequence
  • Per-email metrics: open rate, CTR, unsubscribe rate
  • Sequence-level metrics: overall conversion rate, time to conversion, drop-off points
  • Recommended review cadence (e.g., "Review performance weekly for the first month, then monthly")

After the Sequence

Ask: "Would you like me to:

  • Revise the copy or tone for any specific email?
  • Add a branching path for a specific scenario?
  • Create a variation of this sequence for a different audience segment?
  • Draft the A/B test variants for the subject lines?
  • Build a companion sequence (e.g., a post-purchase follow-up after this lead nurture converts)?"
生成营销绩效报告,涵盖关键指标、趋势分析及优化建议。支持按活动、渠道或整体维度,结合自动数据源或手动输入,为不同受众提供从高管摘要到详细分析的定制化报告。
用户运行 /performance-report 命令 请求营销报告、绩效分析、活动结果或指标汇总
marketing/skills/performance-report/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill performance-report -g -y
SKILL.md
Frontmatter
{
    "name": "performance-report",
    "description": "Build a marketing performance report with key metrics, trend analysis, wins and misses, and prioritized optimization recommendations. Use when wrapping a campaign, when preparing weekly, monthly, or quarterly channel summaries for stakeholders, or when you need data translated into an executive summary with next-period priorities.",
    "argument-hint": "<time period or campaign>"
}

Performance Report

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Generate a marketing performance report with key metrics, trend analysis, insights, and optimization recommendations.

Trigger

User runs /performance-report or asks for a marketing report, performance analysis, campaign results, or metrics summary.

Inputs

  1. Report type — determine which type of report the user needs:

    • Campaign report — performance of a specific campaign
    • Channel report — performance across a specific channel (email, social, paid, SEO, etc.)
    • Content performance — how content pieces are performing
    • Overall marketing report — cross-channel summary (weekly, monthly, quarterly)
    • Custom — user-defined scope
  2. Time period — the reporting window (last week, last month, last quarter, custom date range)

  3. Data source:

    • If ~~marketing analytics is connected, discover what accounts and platforms are available, then pull performance data automatically
    • If ~~product analytics is connected: pull performance data automatically
    • If not connected: ask the user to provide metrics. Prompt with: "Please paste or share your performance data. I can work with spreadsheets, CSV data, dashboard screenshots described in text, or just the key numbers."
  4. Comparison period (optional) — prior period or year-over-year for trend context

  5. Stakeholder audience (optional) — who will read this report (executive summary style vs. detailed analyst view)

Report Structure

1. Executive Summary

  • 2-3 sentence overview of performance in the period
  • Headline metric with trend direction (up/down/flat vs. prior period)
  • One key win and one area of concern

2. Key Metrics Dashboard

Present core metrics in a summary table:

Metric This Period Prior Period Change Target Status

Status indicators:

  • On track (meeting or exceeding target)
  • At risk (below target but within acceptable range)
  • Off track (significantly below target)

Metrics by Report Type

Campaign Report:

  • Impressions and reach
  • Click-through rate (CTR)
  • Conversion rate
  • Cost per acquisition (CPA)
  • Return on ad spend (ROAS) or ROI
  • Total conversions/signups/leads

Channel Report (Email):

  • Emails sent, delivered, bounced
  • Open rate
  • Click-through rate
  • Unsubscribe rate
  • Conversion rate

Channel Report (Social):

  • Impressions and reach
  • Engagement rate (likes, comments, shares)
  • Follower growth
  • Click-through rate
  • Top-performing posts

Channel Report (Paid):

  • Spend
  • Impressions and clicks
  • CTR
  • CPC and CPM
  • Conversions and CPA
  • ROAS

Channel Report (SEO/Organic):

  • Organic sessions
  • Keyword rankings (movement)
  • Pages indexed
  • Backlinks acquired
  • Top-performing pages

Content Performance:

  • Pageviews and unique visitors
  • Time on page
  • Bounce rate
  • Social shares
  • Conversions attributed to content
  • Top and bottom performers

Overall Marketing Report:

  • Total leads generated
  • Marketing qualified leads (MQLs)
  • Pipeline contribution
  • Customer acquisition cost (CAC)
  • Channel-by-channel summary

3. Trend Analysis

  • Performance trend over the period (week-over-week or month-over-month)
  • Notable inflection points and what caused them
  • Seasonal or cyclical patterns observed
  • Comparison to benchmarks or targets

4. What Worked

  • Top 3-5 wins with specific data
  • Why these performed well (hypothesis)
  • How to replicate or scale

5. What Needs Improvement

  • Bottom 3-5 performers with specific data
  • Hypotheses for underperformance
  • Recommended fixes

6. Insights and Observations

  • Patterns in the data that are not obvious from the metrics alone
  • Audience behavior insights
  • Content or creative themes that resonated
  • External factors that may have influenced performance (seasonality, news, competitive moves)

7. Recommendations

For each recommendation:

  • What to do
  • Why (linked to a specific insight from the data)
  • Expected impact (high, medium, low)
  • Effort to implement (high, medium, low)
  • Priority (immediate, next sprint, next quarter)

Prioritize recommendations in a 2x2 matrix format:

Low Effort High Effort
High Impact Do first Plan for next sprint
Low Impact Do if time allows Deprioritize

8. Next Period Focus

  • Top 3 priorities for the upcoming period
  • Tests or experiments to run
  • Targets for key metrics

Metric Definitions and Benchmarks

Email Marketing

Metric Definition Benchmark Range What It Tells You
Delivery rate Emails delivered / emails sent 95-99% List health and sender reputation
Open rate Unique opens / emails delivered 15-30% Subject line and sender effectiveness
Click-through rate (CTR) Unique clicks / emails delivered 2-5% Content relevance and CTA effectiveness
Click-to-open rate (CTOR) Unique clicks / unique opens 10-20% Email content quality (for those who opened)
Unsubscribe rate Unsubscribes / emails delivered <0.5% Content-audience fit and frequency tolerance
Bounce rate Bounces / emails sent <2% List quality and data hygiene
Conversion rate Conversions / emails delivered 1-5% End-to-end email effectiveness
Revenue per email Total revenue / emails sent Varies Direct revenue attribution
List growth rate (New subscribers - unsubscribes) / total list 2-5% monthly Audience building health

Social Media

Metric Definition What It Tells You
Impressions Number of times content was displayed Content distribution and reach
Reach Number of unique users who saw content Audience breadth
Engagement rate (Likes + comments + shares) / reach Content resonance
Click-through rate Link clicks / impressions Traffic driving effectiveness
Follower growth rate Net new followers / total followers per period Audience building
Share/Repost rate Shares / reach Content virality and advocacy
Video view rate Views / impressions Video content hook effectiveness
Video completion rate Completed views / total views Video content quality and length fit
Social share of voice Your mentions / total category mentions Brand visibility vs. competitors

Paid Advertising (Search and Social)

Metric Definition What It Tells You
Impressions Times ad was shown Budget utilization and targeting breadth
Click-through rate (CTR) Clicks / impressions Ad creative and targeting relevance
Cost per click (CPC) Total spend / clicks Cost efficiency of traffic generation
Cost per mille (CPM) Cost per 1,000 impressions Awareness cost efficiency
Conversion rate Conversions / clicks Landing page and offer effectiveness
Cost per acquisition (CPA) Total spend / conversions Full-funnel cost efficiency
Return on ad spend (ROAS) Revenue / ad spend Revenue generation efficiency
Quality Score (search) Google's relevance rating (1-10) Ad-keyword-landing page alignment
Frequency Average times a user sees the ad Ad fatigue risk
View-through conversions Conversions from users who saw but did not click Display/awareness campaign influence

SEO / Organic Search

Metric Definition What It Tells You
Organic sessions Visits from organic search SEO effectiveness and content reach
Keyword rankings Position for target keywords Search visibility
Organic CTR Clicks / impressions in search results Title and meta description effectiveness
Pages indexed Number of pages in search index Crawlability and site health
Domain authority Third-party authority score Overall site strength
Backlinks Number of external sites linking to you Content authority and off-page SEO
Page load speed Time to interactive User experience and ranking factor
Organic conversion rate Organic conversions / organic sessions Content quality and intent alignment
Top entry pages Most-visited pages from organic search Content driving the most organic traffic

Content Marketing

Metric Definition What It Tells You
Pageviews Total views of content pages Content reach and distribution
Unique visitors Distinct users viewing content Audience size
Average time on page Time spent on content pages Content engagement and depth
Bounce rate Single-page sessions / total sessions Content-audience fit and UX
Scroll depth How far users scroll on a page Content engagement through the piece
Social shares Times content was shared on social Content resonance and virality
Backlinks earned External links to content Content authority and SEO value
Lead generation Leads attributed to content Content conversion effectiveness
Content ROI Revenue attributed / content production cost Overall content investment return

Overall Marketing / Pipeline

Metric Definition What It Tells You
Marketing qualified leads (MQLs) Leads meeting marketing qualification criteria Top-of-funnel effectiveness
Sales qualified leads (SQLs) MQLs accepted by sales Lead quality
MQL to SQL conversion rate SQLs / MQLs Marketing-sales alignment and lead quality
Pipeline generated Dollar value of opportunities created Marketing impact on revenue
Pipeline velocity How fast deals move through pipeline Campaign urgency and quality
Customer acquisition cost (CAC) Total marketing + sales cost / new customers Efficiency of customer acquisition
CAC payback period Months to recover CAC from revenue Unit economics health
Marketing-sourced revenue Revenue from marketing-originated deals Direct marketing contribution
Marketing-influenced revenue Revenue from deals where marketing touched Broader marketing impact

Reporting Templates by Cadence

Weekly Marketing Report

Quick-scan format for team standups:

  • Top 3 metrics with week-over-week change
  • What worked this week (1-2 bullet points with data)
  • What needs attention (1-2 bullet points with data)
  • This week's priorities (3-5 action items)

Monthly Marketing Report

Standard stakeholder report:

  1. Executive summary (3-5 sentences)
  2. Key metrics dashboard (table with MoM and target comparison)
  3. Channel-by-channel performance summary
  4. Campaign highlights and results
  5. What worked and what did not (with hypotheses)
  6. Recommendations and next month priorities
  7. Budget spend vs. plan

Quarterly Business Review (QBR)

Strategic review for leadership:

  1. Quarter performance vs. goals
  2. Year-to-date trajectory
  3. Channel ROI analysis
  4. Campaign performance summary
  5. Competitive and market observations
  6. Strategic recommendations for next quarter
  7. Budget request and allocation plan
  8. Key experiments and learnings

Dashboard Design Principles

  • Lead with the metrics that map to business objectives (not vanity metrics)
  • Show trends over time, not just point-in-time snapshots
  • Include comparison context: prior period, target, benchmark
  • Use consistent color coding: green (on track), yellow (at risk), red (off track)
  • Group metrics by funnel stage or business question
  • Keep dashboards to one page/screen — detail goes in appendix
  • Update cadence should match decision cadence (real-time for paid, weekly for content)

Trend Analysis and Forecasting

Trend Identification

When analyzing performance data, look for:

  1. Directional trends: is the metric consistently going up, down, or flat over 4+ periods?
  2. Inflection points: where did performance change direction and what happened then?
  3. Seasonality: are there predictable patterns by day of week, month, or quarter?
  4. Anomalies: one-time spikes or drops — what caused them and are they repeatable?
  5. Leading indicators: which metrics change first and predict future outcomes?

Trend Analysis Process

  1. Chart the metric over time (at least 8-12 data points for meaningful trends)
  2. Identify the overall direction (upward, downward, flat, cyclical)
  3. Calculate the rate of change (is it accelerating or decelerating?)
  4. Overlay key events (campaigns launched, product changes, market events)
  5. Compare to benchmarks or targets
  6. Identify correlations with other metrics
  7. Form hypotheses about causation (and plan tests to validate)

Simple Forecasting Approaches

  • Linear projection: extend the current trend line forward (useful for stable metrics)
  • Moving average: smooth out noise by averaging the last 3-6 periods
  • Year-over-year comparison: use last year's pattern as a baseline, adjusted for growth rate
  • Funnel math: forecast outputs from inputs (e.g., if we generate X leads at Y conversion rate, we will get Z customers)
  • Scenario modeling: create best case, expected case, and worst case projections

Forecasting Caveats

  • Short-term forecasts (1-3 months) are more reliable than long-term
  • Forecasts based on fewer than 12 data points should be flagged as low confidence
  • External factors (market shifts, competitive moves, economic changes) can invalidate trend-based forecasts
  • Always present forecasts as ranges, not exact numbers

Attribution Modeling Basics

What Is Attribution?

Attribution determines which marketing touchpoints get credit for a conversion. This matters because buyers typically interact with multiple channels before converting.

Common Attribution Models

Model How It Works Best For Limitation
Last touch 100% credit to last interaction before conversion Understanding final conversion triggers Ignores awareness and nurture
First touch 100% credit to first interaction Understanding top-of-funnel effectiveness Ignores nurture and conversion drivers
Linear Equal credit to all touchpoints Fair representation of all channels Does not reflect relative impact
Time decay More credit to touchpoints closer to conversion Balanced view favoring recent interactions May undervalue awareness
Position-based (U-shaped) 40% first, 40% last, 20% split among middle Valuing both discovery and conversion Somewhat arbitrary weighting
Data-driven Algorithmic credit based on conversion patterns Most accurate representation Requires significant data volume

Attribution Practical Guidance

  • Start with last-touch attribution if you have no model in place — it is the simplest and most actionable
  • Compare first-touch and last-touch to understand which channels drive awareness vs. conversion
  • Use position-based (U-shaped) as a reasonable middle ground for most B2B companies
  • Data-driven attribution requires high conversion volume to be statistically meaningful
  • No model is perfect — use attribution directionally, not as absolute truth
  • Multi-touch attribution is better than single-touch, but any model is better than none

Attribution Pitfalls

  • Do not optimize one channel in isolation based on single-touch attribution
  • Awareness channels (display, social, PR) will always look bad in last-touch models
  • Conversion channels (search, retargeting) will always look bad in first-touch models
  • Self-reported attribution ("how did you hear about us?") provides useful qualitative color but is unreliable as quantitative data
  • Cross-device and cross-channel tracking gaps mean attribution data is always incomplete

Optimization Recommendations Framework

Optimization Process

  1. Identify: which metrics are underperforming vs. target or benchmark?
  2. Diagnose: where in the funnel is the problem? (impressions, clicks, conversions, retention)
  3. Hypothesize: what is causing the underperformance? (audience, message, creative, offer, timing, technical)
  4. Prioritize: which fixes will have the biggest impact with the least effort?
  5. Test: design an experiment to validate the hypothesis
  6. Measure: did the change improve the metric?
  7. Scale or iterate: roll out wins broadly; iterate on inconclusive or failed tests

Optimization Levers by Funnel Stage

Funnel Stage Problem Signal Optimization Levers
Awareness Low impressions, low reach Budget, targeting, channel mix, creative format
Interest Low CTR, low engagement Ad creative, headlines, content hooks, audience targeting
Consideration High bounce rate, low time on page Landing page content, page speed, content relevance, UX
Conversion Low conversion rate Offer, CTA, form length, trust signals, page layout
Retention High churn, low repeat engagement Onboarding, email nurture, product experience, support

Testing Best Practices

  • Test one variable at a time for clean results
  • Define the success metric before launching the test
  • Calculate required sample size before starting (do not end tests early)
  • Run tests for a minimum of one full business cycle (typically one week for B2B)
  • Document all tests and results, regardless of outcome
  • Share learnings across the team — failed tests are valuable information
  • A test that confirms the status quo is not a failure — it builds confidence in your current approach

Continuous Optimization Cadence

  • Daily: monitor paid campaigns for budget pacing, anomalies, and disapproved ads
  • Weekly: review channel performance, pause underperformers, scale winners
  • Bi-weekly: refresh ad creative and test new variants
  • Monthly: full performance review, identify new optimization opportunities, update forecasts
  • Quarterly: strategic review of channel mix, budget allocation, and targeting strategy

Output Formatting

  • Use tables for data presentation
  • Bold key numbers and trends
  • Keep the executive summary concise (suitable for forwarding to leadership)
  • Include a "detailed appendix" section for granular data if the user provided a lot of metrics

After the Report

Ask: "Would you like me to:

  • Create a slide-ready summary of these results?
  • Draft a stakeholder email with the key takeaways?
  • Dive deeper into any specific metric or channel?
  • Set up a reporting template you can reuse next period?"
执行全面SEO审计,涵盖关键词研究、页面分析、内容缺口识别、技术检查及竞品对比。提供优先级行动指南,适用于评估网站健康度或挖掘流量机会。
用户运行 /seo-audit 命令 用户请求SEO审计、关键词研究、内容缺口分析、技术SEO检查或竞品SEO对比
marketing/skills/seo-audit/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill seo-audit -g -y
SKILL.md
Frontmatter
{
    "name": "seo-audit",
    "description": "Run a comprehensive SEO audit — keyword research, on-page analysis, content gaps, technical checks, and competitor comparison. Use when assessing a site's SEO health, when finding keyword opportunities and content gaps competitors own, or when you need a prioritized action plan split into quick wins and strategic investments.",
    "argument-hint": "<url or topic> [audit type]"
}

/seo-audit

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Audit a website's SEO health, research keyword opportunities, identify content gaps, and benchmark against competitors. Produces a prioritized action plan a marketer can execute immediately.

Trigger

User runs /seo-audit or asks for an SEO audit, keyword research, content gap analysis, technical SEO check, or competitor SEO comparison.

Inputs

Gather the following from the user. If not provided, ask before proceeding:

  1. URL or domain — the site to audit, or a topic/keyword if running in keyword research mode

  2. Audit type — one of:

    • Full site audit — end-to-end SEO review covering all sections below
    • Keyword research — identify keyword opportunities for a topic or domain
    • Content gap analysis — find topics competitors rank for that you don't
    • Technical SEO check — crawlability, speed, structured data, and infrastructure issues
    • Competitor SEO comparison — head-to-head SEO benchmarking against specific competitors

    If not specified, default to full site audit.

  3. Target keywords or topics (optional) — specific keywords the user is already targeting or wants to rank for

  4. Competitors (optional) — domains or companies to compare against. If not provided and the audit type requires competitor data, use web search to identify 2-3 likely competitors based on the user's domain and keyword space.

Process

1. Keyword Research

Research keywords related to the user's domain, topic, or target keywords.

If ~~SEO tools are connected:

  • Pull keyword data, search volume, keyword difficulty scores, and ranking positions automatically
  • Identify keywords the site currently ranks for and where it's gaining or losing ground

If ~~product analytics are connected:

  • Cross-reference keyword targets with actual organic traffic data to validate which keywords are driving visits and conversions

If tools are not connected:

  • Use web search to research the keyword landscape
  • Note: "For more precise volume and difficulty data, connect an SEO tool like Ahrefs or Semrush via MCP. The audit will auto-populate with ranking data."

For each keyword opportunity, assess:

  • Primary keywords — high-intent terms directly tied to the user's product or service
  • Secondary keywords — supporting terms and variations
  • Search volume signals — relative demand (high, medium, low) based on available data
  • Keyword difficulty — how competitive the term is (easy, moderate, hard)
  • Long-tail opportunities — specific, lower-competition phrases with clear intent
  • Question-based keywords — "how to", "what is", "why does" queries that mirror People Also Ask results
  • Intent classification — informational, navigational, commercial, or transactional

2. On-Page SEO Audit

For each key page (homepage, top landing pages, recent blog posts), evaluate:

  • Title tags — present, unique, within 50-60 characters, includes target keyword
  • Meta descriptions — present, compelling, within 150-160 characters, includes a call to action
  • H1 tags — exactly one per page, includes primary keyword
  • H2/H3 structure — logical hierarchy, uses secondary keywords where natural
  • Keyword usage — primary keyword appears in the first 100 words, used naturally throughout, not over-stuffed
  • Internal linking — pages link to related content, orphan pages identified, anchor text is descriptive
  • Image alt text — all images have descriptive alt attributes, keywords included where relevant
  • URL structure — clean, readable, includes keywords, no excessive parameters or depth

3. Content Gap Analysis

Identify what's missing from the user's content strategy:

  • Competitor topic coverage — topics and keywords competitors rank for that the user's site does not cover
  • Content freshness — pages that haven't been updated in 12+ months and may be losing rankings
  • Thin content — pages with insufficient depth to rank (under 300 words for informational queries, lacking substance)
  • Missing content types — formats competitors use that the user doesn't (guides, comparison pages, glossaries, tools, templates)
  • Funnel gaps — missing content at specific buyer journey stages (awareness, consideration, decision)
  • Topic clusters — opportunities to build pillar pages with supporting content

4. Technical SEO Checklist

Evaluate technical foundations that affect crawlability and rankings:

  • Page speed — identify slow-loading pages and likely causes (large images, render-blocking scripts, excessive redirects)
  • Mobile-friendliness — responsive design, tap targets, font sizes, viewport configuration
  • Structured data — opportunities for schema markup (FAQ, HowTo, Product, Article, Organization, Breadcrumb)
  • Crawlability — robots.txt configuration, XML sitemap presence and accuracy, canonical tags, noindex/nofollow usage
  • Broken links — internal and external 404s, redirect chains
  • HTTPS — secure connection, mixed content issues
  • Core Web Vitals signals — LCP, FID/INP, CLS indicators based on observable page behavior
  • Indexation — pages that should be indexed but may not be, duplicate content risks

5. Competitor SEO Comparison

For each competitor, compare:

  • Keyword overlap — keywords both sites rank for, and where each site ranks higher
  • Keyword gaps — terms the competitor ranks for that the user does not
  • Domain authority signals — relative site strength based on backlink profiles, referring domains, and content depth
  • Content depth — average content length, topic coverage breadth, publishing frequency
  • Backlink profile observations — types of sites linking to competitors, link-worthy content they've produced
  • SERP feature ownership — which competitor appears in featured snippets, People Also Ask, image packs, or knowledge panels
  • Technical advantages — site speed differences, mobile experience, structured data usage

Output

Executive Summary

Open with a 3-5 sentence summary of overall SEO health. Highlight:

  • The site's biggest strength
  • The top 3 priorities that will have the most impact
  • An overall assessment: strong foundation, needs work, or critical issues

Keyword Opportunity Table

Keyword Est. Difficulty Opportunity Score Current Ranking Intent Recommended Content Type

Opportunity score: high, medium, or low — based on the combination of search demand, difficulty, and relevance to the user's business.

Include 15-25 keyword opportunities, sorted by opportunity score.

On-Page Issues Table

Page Issue Severity Recommended Fix

Severity levels:

  • Critical — directly hurting rankings or preventing indexation
  • High — significant impact on SEO performance
  • Medium — best practice violation, moderate impact
  • Low — minor optimization opportunity

Content Gap Recommendations

For each content gap identified, provide:

  • Topic or keyword to target
  • Why it matters — search demand, competitor coverage, funnel stage
  • Recommended format — blog post, landing page, guide, comparison page, etc.
  • Priority — high, medium, or low
  • Estimated effort — quick win (1-2 hours), moderate (half day), substantial (multi-day)

Technical SEO Checklist

Check Status Details

Status: Pass, Fail, or Warning.

Competitor Comparison Summary

Dimension Your Site Competitor A Competitor B Winner

Include rows for: keyword count, content depth, publishing frequency, backlink signals, technical score, SERP feature presence.

Prioritized Action Plan

Split recommendations into two categories:

Quick Wins (do this week):

  • Actions that take under 2 hours and have immediate impact
  • Examples: fix title tags, add meta descriptions, fix broken links, add alt text

Strategic Investments (plan for this quarter):

  • Actions that require more effort but drive long-term growth
  • Examples: build a topic cluster, create a pillar page, launch a link-building campaign, overhaul site structure

For each action item, include:

  • What to do (specific and concrete)
  • Expected impact (high, medium, low)
  • Effort estimate
  • Dependencies (if any)

Follow-Up

After presenting the audit, ask:

"Would you like me to:

  • Draft content briefs for the top keyword opportunities?
  • Create optimized title tags and meta descriptions for your key pages?
  • Build a content calendar based on the gap analysis?
  • Dive deeper into any specific section of the audit?
  • Run this same analysis for a different competitor or domain?"
用于团队资源容量规划与工作量分析。通过评估人员、预算和时间维度,预测利用率并识别瓶颈。适用于季度规划、招聘决策或压力测试项目可行性,帮助避免过度分配并提供优化建议。
季度资源规划 团队过度分配分析 决定招聘或优先级调整 新项目人力可行性压力测试
operations/skills/capacity-plan/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill capacity-plan -g -y
SKILL.md
Frontmatter
{
    "name": "capacity-plan",
    "description": "Plan resource capacity — workload analysis and utilization forecasting. Use when heading into quarterly planning, the team feels overallocated and you need the numbers, deciding whether to hire or deprioritize, or stress-testing whether upcoming projects fit the people you have.",
    "argument-hint": "<team or project scope>"
}

/capacity-plan

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Analyze team capacity and plan resource allocation.

Usage

/capacity-plan $ARGUMENTS

What I Need From You

  • Team size and roles: Who do you have?
  • Current workload: What are they working on? (Upload from project tracker or describe)
  • Upcoming work: What's coming next quarter?
  • Constraints: Budget, hiring timeline, skill requirements

Planning Dimensions

People

  • Available headcount and skills
  • Current allocation and utilization
  • Planned hires and timeline
  • Contractor and vendor capacity

Budget

  • Operating budget by category
  • Project-specific budgets
  • Variance tracking
  • Forecast vs. actual

Time

  • Project timelines and dependencies
  • Critical path analysis
  • Buffer and contingency planning
  • Deadline management

Utilization Targets

Role Type Target Utilization Notes
IC / Specialist 75-80% Leave room for reactive work and growth
Manager 60-70% Management overhead, meetings, 1:1s
On-call / Support 50-60% Interrupt-driven work is unpredictable

Common Pitfalls

  • Planning to 100% utilization (no buffer for surprises)
  • Ignoring meeting load and context-switching costs
  • Not accounting for vacation, holidays, and sick time
  • Treating all hours as equal (creative work ≠ admin work)

Output

## Capacity Plan: [Team/Project]
**Period:** [Date range] | **Team Size:** [X]

### Current Utilization
| Person/Role | Capacity | Allocated | Available | Utilization |
|-------------|----------|-----------|-----------|-------------|
| [Name/Role] | [hrs/wk] | [hrs/wk] | [hrs/wk] | [X]% |

### Capacity Summary
- **Total capacity**: [X] hours/week
- **Currently allocated**: [X] hours/week ([X]%)
- **Available**: [X] hours/week ([X]%)
- **Overallocated**: [X people above 100%]

### Upcoming Demand
| Project/Initiative | Start | End | Resources Needed | Gap |
|--------------------|-------|-----|-----------------|-----|
| [Project] | [Date] | [Date] | [X FTEs] | [Covered/Gap] |

### Bottlenecks
- [Skill or role that's oversubscribed]
- [Time period with a crunch]

### Recommendations
1. [Hire / Contract / Reprioritize / Delay]
2. [Specific action]

### Scenarios
| Scenario | Outcome |
|----------|---------|
| Do nothing | [What happens] |
| Hire [X] | [What changes] |
| Deprioritize [Y] | [What frees up] |

If Connectors Available

If ~~project tracker is connected:

  • Pull current workload and ticket assignments automatically
  • Show upcoming sprint or quarter commitments per person

If ~~calendar is connected:

  • Factor in PTO, holidays, and recurring meeting load
  • Calculate actual available hours per person

Tips

  1. Include all work — BAU, projects, support, meetings. People aren't 100% available for project work.
  2. Plan for buffer — Target 80% utilization. 100% means no room for surprises.
  3. Update regularly — Capacity plans go stale fast. Review monthly.
用于创建结构化变更管理请求,包含影响分析、风险评估及回滚计划。适用于需审批的系统或流程变更、CAB审查准备、部署前风险文档化及发布沟通规划。
提出需要审批的系统或流程变更 准备提交给变更顾问委员会(CAB)审查的变更记录 在部署前记录风险和回滚步骤 规划发布相关的干系人沟通
operations/skills/change-request/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill change-request -g -y
SKILL.md
Frontmatter
{
    "name": "change-request",
    "description": "Create a change management request with impact analysis and rollback plan. Use when proposing a system or process change that needs approval, preparing a change record for CAB review, documenting risk and rollback steps before a deployment, or planning stakeholder communications for a rollout.",
    "argument-hint": "<change description>"
}

/change-request

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Create a structured change request with impact analysis, risk assessment, and rollback plan.

Usage

/change-request $ARGUMENTS

Change Management Framework

Apply the assess-plan-execute-sustain framework when building the request:

1. Assess

  • What is changing?
  • Who is affected?
  • How significant is the change? (Low / Medium / High)
  • What resistance should we expect?

2. Plan

  • Communication plan (who, what, when, how)
  • Training plan (what skills are needed, how to deliver)
  • Support plan (help desk, champions, FAQs)
  • Timeline with milestones

3. Execute

  • Announce and explain the "why"
  • Train and support
  • Monitor adoption
  • Address resistance

4. Sustain

  • Measure adoption and effectiveness
  • Reinforce new behaviors
  • Address lingering issues
  • Document lessons learned

Communication Principles

  • Explain the why before the what
  • Communicate early and often
  • Use multiple channels
  • Acknowledge what's being lost, not just what's being gained
  • Provide a clear path for questions and concerns

Output

## Change Request: [Title]
**Requester:** [Name] | **Date:** [Date] | **Priority:** [Critical/High/Medium/Low]
**Status:** Draft | Pending Approval | Approved | In Progress | Complete

### Description
[What is changing and why]

### Business Justification
[Why this change is needed — cost savings, compliance, efficiency, risk reduction]

### Impact Analysis
| Area | Impact | Details |
|------|--------|---------|
| Users | [High/Med/Low/None] | [Who is affected and how] |
| Systems | [High/Med/Low/None] | [What systems are affected] |
| Processes | [High/Med/Low/None] | [What workflows change] |
| Cost | [High/Med/Low/None] | [Budget impact] |

### Risk Assessment
| Risk | Likelihood | Impact | Mitigation |
|------|-----------|--------|------------|
| [Risk] | [H/M/L] | [H/M/L] | [How to mitigate] |

### Implementation Plan
| Step | Owner | Timeline | Dependencies |
|------|-------|----------|--------------|
| [Step] | [Person] | [Date] | [What it depends on] |

### Communication Plan
| Audience | Message | Channel | Timing |
|----------|---------|---------|--------|
| [Who] | [What to tell them] | [How] | [When] |

### Rollback Plan
[Step-by-step plan to reverse the change if needed]
- Trigger: [When to roll back]
- Steps: [How to roll back]
- Verification: [How to confirm rollback worked]

### Approvals Required
| Approver | Role | Status |
|----------|------|--------|
| [Name] | [Role] | Pending |

If Connectors Available

If ~~ITSM is connected:

  • Create the change request ticket automatically
  • Pull change advisory board schedule and approval workflows

If ~~project tracker is connected:

  • Link to related implementation tasks and dependencies
  • Track change progress against milestones

If ~~chat is connected:

  • Draft stakeholder notifications for the communication plan
  • Post change updates to the relevant team channels

Tips

  1. Be specific about impact — "Everyone" is not an impact assessment. "200 users in the billing team" is.
  2. Always have a rollback plan — Even if you're confident, plan for failure.
  3. Communicate early — Surprises create resistance. Previews create buy-in.
用于追踪合规要求、准备审计及保持监管就绪状态。支持SOC 2、ISO 27001、GDPR等框架,提供控制清单、审计日历、证据管理及差距分析,生成状态仪表盘与检查表。
compliance audit prep SOC 2 ISO 27001 GDPR regulatory requirement
operations/skills/compliance-tracking/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill compliance-tracking -g -y
SKILL.md
Frontmatter
{
    "name": "compliance-tracking",
    "description": "Track compliance requirements and audit readiness. Trigger with \"compliance\", \"audit prep\", \"SOC 2\", \"ISO 27001\", \"GDPR\", \"regulatory requirement\", or when the user needs help tracking, preparing for, or documenting compliance activities."
}

Compliance Tracking

Help track compliance requirements, prepare for audits, and maintain regulatory readiness.

Common Frameworks

Framework Focus Key Requirements
SOC 2 Service organizations Security, availability, processing integrity, confidentiality, privacy
ISO 27001 Information security Risk assessment, security controls, continuous improvement
GDPR Data privacy (EU) Consent, data rights, breach notification, DPO
HIPAA Healthcare data (US) PHI protection, access controls, audit trails
PCI DSS Payment card data Encryption, access control, vulnerability management

Compliance Tracking Components

Control Inventory

  • Map controls to framework requirements
  • Document control owners and evidence
  • Track control effectiveness

Audit Calendar

  • Upcoming audit dates and deadlines
  • Evidence collection timelines
  • Remediation deadlines

Evidence Management

  • What evidence is needed for each control
  • Where evidence is stored
  • When evidence was last collected

Gap Analysis

  • Requirements vs. current state
  • Prioritized remediation plan
  • Timeline to compliance

Output

Produce compliance status dashboards, gap analyses, audit prep checklists, and evidence collection plans.

将头脑中的业务流程转化为标准操作程序(SOP),生成流程图、RACI矩阵及异常处理指南。适用于流程标准化、明确责任归属、审计合规及捕获实际工作细节。
需要正式化存在于个人头脑中的业务流程 构建RACI矩阵以明确职责归属 编写用于交接或审计的标准操作程序(SOP) 记录工作流程中的例外情况和边缘案例
operations/skills/process-doc/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill process-doc -g -y
SKILL.md
Frontmatter
{
    "name": "process-doc",
    "description": "Document a business process — flowcharts, RACI, and SOPs. Use when formalizing a process that lives in someone's head, building a RACI to clarify who owns what, writing an SOP for a handoff or audit, or capturing the exceptions and edge cases of how work actually gets done.",
    "argument-hint": "<process name or description>"
}

/process-doc

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Document a business process as a complete standard operating procedure (SOP).

Usage

/process-doc $ARGUMENTS

How It Works

Walk me through the process — describe it, paste existing docs, or just tell me the name and I'll ask the right questions. I'll produce a complete SOP.

Output

## Process Document: [Process Name]
**Owner:** [Person/Team] | **Last Updated:** [Date] | **Review Cadence:** [Quarterly/Annually]

### Purpose
[Why this process exists and what it accomplishes]

### Scope
[What's included and excluded]

### RACI Matrix
| Step | Responsible | Accountable | Consulted | Informed |
|------|------------|-------------|-----------|----------|
| [Step] | [Who does it] | [Who owns it] | [Who to ask] | [Who to tell] |

### Process Flow
[ASCII flowchart or step-by-step description]

### Detailed Steps

#### Step 1: [Name]
- **Who**: [Role]
- **When**: [Trigger or timing]
- **How**: [Detailed instructions]
- **Output**: [What this step produces]

#### Step 2: [Name]
[Same format]

### Exceptions and Edge Cases
| Scenario | What to Do |
|----------|-----------|
| [Exception] | [How to handle it] |

### Metrics
| Metric | Target | How to Measure |
|--------|--------|----------------|
| [Metric] | [Target] | [Method] |

### Related Documents
- [Link to related process or policy]

If Connectors Available

If ~~knowledge base is connected:

  • Search for existing process documentation to update rather than duplicate
  • Publish the completed SOP to your wiki

If ~~project tracker is connected:

  • Link the process to related projects and workflows
  • Create tasks for process improvement action items

Tips

  1. Start messy — You don't need a perfect description. Tell me how it works today and I'll structure it.
  2. Include the exceptions — "Usually we do X, but sometimes Y" is the most valuable part to document.
  3. Name the people — Even if roles change, knowing who does what today helps get the process right.
分析业务流程并推荐改进方案。通过映射现状、识别浪费(如等待、返工)、设计未来状态及衡量影响,提供前后对比、具体建议、预期效益和实施计划,旨在消除低效环节,提升流程效率与质量。
process is slow how can we improve streamline this workflow too many steps bottleneck
operations/skills/process-optimization/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill process-optimization -g -y
SKILL.md
Frontmatter
{
    "name": "process-optimization",
    "description": "Analyze and improve business processes. Trigger with \"this process is slow\", \"how can we improve\", \"streamline this workflow\", \"too many steps\", \"bottleneck\", or when the user describes an inefficient process they want to fix."
}

Process Optimization

Analyze existing processes and recommend improvements.

Analysis Framework

1. Map Current State

  • Document every step, decision point, and handoff
  • Identify who does what and how long each step takes
  • Note manual steps, approvals, and waiting times

2. Identify Waste

  • Waiting: Time spent in queues or waiting for approvals
  • Rework: Steps that fail and need to be redone
  • Handoffs: Each handoff is a potential point of failure or delay
  • Over-processing: Steps that add no value
  • Manual work: Tasks that could be automated

3. Design Future State

  • Eliminate unnecessary steps
  • Automate where possible
  • Reduce handoffs
  • Parallelize independent steps
  • Add checkpoints (not gates)

4. Measure Impact

  • Time saved per cycle
  • Error rate reduction
  • Cost savings
  • Employee satisfaction improvement

Output

Produce a before/after process comparison with specific improvement recommendations, estimated impact, and an implementation plan.

用于系统性地识别、评估和缓解运营风险。通过风险矩阵分类并生成包含描述、可能性、影响、缓解措施及责任人的优先级风险登记册,适用于项目、供应商或决策的风险评估场景。
what are the risks risk assessment risk register what could go wrong
operations/skills/risk-assessment/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill risk-assessment -g -y
SKILL.md
Frontmatter
{
    "name": "risk-assessment",
    "description": "Identify, assess, and mitigate operational risks. Trigger with \"what are the risks\", \"risk assessment\", \"risk register\", \"what could go wrong\", or when the user is evaluating risks associated with a project, vendor, process, or decision."
}

Risk Assessment

Systematically identify, assess, and plan mitigations for operational risks.

Risk Assessment Matrix

Low Impact Medium Impact High Impact
High Likelihood Medium High Critical
Medium Likelihood Low Medium High
Low Likelihood Low Low Medium

Risk Categories

  • Operational: Process failures, staffing gaps, system outages
  • Financial: Budget overruns, vendor cost increases, revenue impact
  • Compliance: Regulatory violations, audit findings, policy breaches
  • Strategic: Market changes, competitive threats, technology shifts
  • Reputational: Customer impact, public perception, partner relationships
  • Security: Data breaches, access control failures, third-party vulnerabilities

Risk Register Format

For each risk, document:

  • Description: What could happen
  • Likelihood: High / Medium / Low
  • Impact: High / Medium / Low
  • Risk Level: Critical / High / Medium / Low
  • Mitigation: What we're doing to reduce likelihood or impact
  • Owner: Who is responsible for managing this risk
  • Status: Open / Mitigated / Accepted / Closed

Output

Produce a prioritized risk register with specific, actionable mitigations. Focus on risks that are controllable and material.

用于为运维或值班团队创建及更新标准操作手册,将隐性知识转化为精确的逐步执行命令。支持添加故障排查、回滚方案和升级路径,确保任务可重复执行且具备容错能力。
需要为新出现的运维任务编写标准操作流程 需要更新现有操作手册以包含新的故障处理步骤 需要将团队内部知识转化为文档化的操作步骤
operations/skills/runbook/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill runbook -g -y
SKILL.md
Frontmatter
{
    "name": "runbook",
    "description": "Create or update an operational runbook for a recurring task or procedure. Use when documenting a task that on-call or ops needs to run repeatably, turning tribal knowledge into exact step-by-step commands, adding troubleshooting and rollback steps to an existing procedure, or writing escalation paths for when things go wrong.",
    "argument-hint": "<process or task name>"
}

/runbook

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Create a step-by-step operational runbook for a recurring task or procedure.

Usage

/runbook $ARGUMENTS

Output

## Runbook: [Task Name]
**Owner:** [Team/Person] | **Frequency:** [Daily/Weekly/Monthly/As Needed]
**Last Updated:** [Date] | **Last Run:** [Date]

### Purpose
[What this runbook accomplishes and when to use it]

### Prerequisites
- [ ] [Access or permission needed]
- [ ] [Tool or system required]
- [ ] [Data or input needed]

### Procedure

#### Step 1: [Name]

[Exact command, action, or instruction]

**Expected result:** [What should happen]
**If it fails:** [What to do]

#### Step 2: [Name]

[Exact command, action, or instruction]

**Expected result:** [What should happen]
**If it fails:** [What to do]

### Verification
- [ ] [How to confirm the task completed successfully]
- [ ] [What to check]

### Troubleshooting
| Symptom | Likely Cause | Fix |
|---------|-------------|-----|
| [What you see] | [Why] | [What to do] |

### Rollback
[How to undo this if something goes wrong]

### Escalation
| Situation | Contact | Method |
|-----------|---------|--------|
| [When to escalate] | [Who] | [How to reach them] |

### History
| Date | Run By | Notes |
|------|--------|-------|
| [Date] | [Person] | [Any issues or observations] |

If Connectors Available

If ~~knowledge base is connected:

  • Search for existing runbooks to update rather than create from scratch
  • Publish the completed runbook to your ops wiki

If ~~ITSM is connected:

  • Link the runbook to related incident types and change requests
  • Auto-populate escalation contacts from on-call schedules

Tips

  1. Be painfully specific — "Run the script" is not a step. "Run python sync.py --prod --dry-run from the ops server" is.
  2. Include failure modes — What can go wrong at each step and what to do about it.
  3. Test the runbook — Have someone unfamiliar with the process follow it. Fix where they get stuck.
为领导或利益相关者生成包含KPI、风险和行动项的结构化状态报告。适用于撰写周/月报,总结项目健康度(绿/黄/红),突出需关注的风险和决策,将项目数据转化为可读叙事。
撰写面向领导层的周报或月报 总结项目整体健康状况并标记优先级 汇总项目跟踪器活动以生成可读叙述 识别需要利益相关者注意的风险和决策
operations/skills/status-report/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill status-report -g -y
SKILL.md
Frontmatter
{
    "name": "status-report",
    "description": "Generate a status report with KPIs, risks, and action items. Use when writing a weekly or monthly update for leadership, summarizing project health with green\/yellow\/red status, surfacing risks and decisions that need stakeholder attention, or turning a pile of project tracker activity into a readable narrative.",
    "argument-hint": "[weekly | monthly | quarterly] [project or team]"
}

/status-report

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Generate a polished status report for leadership or stakeholders. See the risk-assessment skill for risk matrix frameworks and severity definitions.

Usage

/status-report $ARGUMENTS

Output

## Status Report: [Project/Team] — [Period]
**Author:** [Name] | **Date:** [Date]

### Executive Summary
[3-4 sentence overview — what's on track, what needs attention, key wins]

### Overall Status: 🟢 On Track / 🟡 At Risk / 🔴 Off Track

### Key Metrics
| Metric | Target | Actual | Trend | Status |
|--------|--------|--------|-------|--------|
| [KPI] | [Target] | [Actual] | [up/down/flat] | 🟢/🟡/🔴 |

### Accomplishments This Period
- [Win 1]
- [Win 2]

### In Progress
| Item | Owner | Status | ETA | Notes |
|------|-------|--------|-----|-------|
| [Item] | [Person] | [Status] | [Date] | [Context] |

### Risks and Issues
| Risk/Issue | Impact | Mitigation | Owner |
|------------|--------|------------|-------|
| [Risk] | [Impact] | [What we're doing] | [Who] |

### Decisions Needed
| Decision | Context | Deadline | Recommended Action |
|----------|---------|----------|--------------------|
| [Decision] | [Why it matters] | [When] | [What I recommend] |

### Next Period Priorities
1. [Priority 1]
2. [Priority 2]
3. [Priority 3]

If Connectors Available

If ~~project tracker is connected:

  • Pull project status, completed items, and upcoming milestones automatically
  • Identify at-risk items and overdue tasks

If ~~chat is connected:

  • Scan recent team discussions for decisions and blockers to include
  • Offer to post the finished report to a channel

If ~~calendar is connected:

  • Reference key meetings and decisions from the reporting period

Tips

  1. Lead with the headline — Busy leaders read the first 3 lines. Make them count.
  2. Be honest about risks — Surfacing issues early builds trust. Surprises erode it.
  3. Make decisions easy — For each decision needed, provide context and a recommendation.
用于评估供应商的综合分析技能,涵盖成本、风险、绩效和匹配度。适用于新供应商提案审查、合同续签或替换决策、多供应商对比及采购谈判准备,输出结构化报告与建议。
评估新供应商提案 决定续约或更换合同 对比两个供应商 制定总拥有成本分析和谈判要点
operations/skills/vendor-review/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill vendor-review -g -y
SKILL.md
Frontmatter
{
    "name": "vendor-review",
    "description": "Evaluate a vendor — cost analysis, risk assessment, and recommendation. Use when reviewing a new vendor proposal, deciding whether to renew or replace a contract, comparing two vendors side-by-side, or building a TCO breakdown and negotiation points before procurement sign-off.",
    "argument-hint": "<vendor name or proposal>"
}

/vendor-review

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Evaluate a vendor with structured analysis covering cost, risk, performance, and fit.

Usage

/vendor-review $ARGUMENTS

What I Need From You

  • Vendor name: Who are you evaluating?
  • Context: New vendor evaluation, renewal decision, or comparison?
  • Details: Contract terms, pricing, proposal document, or current performance data

Evaluation Framework

Cost Analysis (Total Cost of Ownership)

  • Total cost of ownership (not just license fees)
  • Implementation and migration costs
  • Training and onboarding costs
  • Ongoing support and maintenance
  • Exit costs (data migration, contract termination)

Risk Assessment

  • Vendor financial stability
  • Security and compliance posture
  • Concentration risk (single vendor dependency)
  • Contract lock-in and exit terms
  • Business continuity and disaster recovery

Performance Metrics

  • SLA compliance
  • Support response times
  • Uptime and reliability
  • Feature delivery cadence
  • Customer satisfaction

Comparison Matrix

When comparing vendors, produce a side-by-side matrix covering: pricing, features, integrations, security, support, contract terms, and references.

Output

## Vendor Review: [Vendor Name]
**Date:** [Date] | **Type:** [New / Renewal / Comparison]

### Summary
[2-3 sentence recommendation]

### Cost Analysis
| Component | Annual Cost | Notes |
|-----------|-------------|-------|
| License/subscription | $[X] | [Per seat, flat, usage-based] |
| Implementation | $[X] | [One-time] |
| Support/maintenance | $[X] | [Included or add-on] |
| **Total Year 1** | **$[X]** | |
| **Total 3-Year** | **$[X]** | |

### Risk Assessment
| Risk | Likelihood | Impact | Mitigation |
|------|-----------|--------|------------|
| [Risk] | High/Med/Low | High/Med/Low | [Mitigation] |

### Strengths
- [Strength 1]
- [Strength 2]

### Concerns
- [Concern 1]
- [Concern 2]

### Recommendation
[Proceed / Negotiate / Pass] — [Reasoning]

### Negotiation Points
- [Leverage point 1]
- [Leverage point 2]

If Connectors Available

If ~~knowledge base is connected:

  • Search for existing vendor evaluations, contracts, and performance reviews
  • Pull procurement policies and approval thresholds

If ~~procurement is connected:

  • Pull current contract terms, spend history, and renewal dates
  • Compare pricing against existing vendor agreements

Tips

  1. Upload the proposal — I can extract pricing, terms, and SLAs from vendor documents.
  2. Compare vendors — "Compare Vendor A vs Vendor B" gets you a side-by-side analysis.
  3. Include current spend — For renewals, knowing what you pay now helps evaluate price changes.
根据姓名、公司、领英或邮箱等线索,自动检索并生成包含联系方式及公司情报的详细联系人档案。支持模糊匹配、信用警告、去重保存、加入序列及查找同事等后续操作。
提供联系人姓名和公司名称 提供LinkedIn个人主页链接 提供电子邮箱地址 提供职位和公司组合(如CEO of Figma)
partner-built/apollo/skills/enrich-lead/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill enrich-lead -g -y
SKILL.md
Frontmatter
{
    "name": "enrich-lead",
    "description": "Instant lead enrichment. Drop a name, company, LinkedIn URL, or email and get the full contact card with email, phone, title, company intel, and next actions.",
    "argument-hint": "[name, company, LinkedIn URL, or email]",
    "user-invocable": true
}

Enrich Lead

Turn any identifier into a full contact dossier. The user provides identifying info via "$ARGUMENTS".

Examples

  • /apollo:enrich-lead Tim Zheng at Apollo
  • /apollo:enrich-lead https://www.linkedin.com/in/timzheng
  • /apollo:enrich-lead sarah@stripe.com
  • /apollo:enrich-lead Jane Smith, VP Engineering, Notion
  • /apollo:enrich-lead CEO of Figma

Step 1 — Parse Input

From "$ARGUMENTS", extract every identifier available:

  • First name, last name
  • Company name or domain
  • LinkedIn URL
  • Email address
  • Job title (use as a matching hint)

If the input is ambiguous (e.g. just "CEO of Figma"), first use mcp__claude_ai_Apollo_MCP__apollo_mixed_people_api_search with relevant title and domain filters to identify the person, then proceed to enrichment.

Step 2 — Enrich the Person

Credit warning: Tell the user enrichment consumes 1 Apollo credit before calling.

Use mcp__claude_ai_Apollo_MCP__apollo_people_match with all available identifiers:

  • first_name, last_name if name is known
  • domain or organization_name if company is known
  • linkedin_url if LinkedIn is provided
  • email if email is provided
  • Set reveal_personal_emails to true

If the match fails, try mcp__claude_ai_Apollo_MCP__apollo_mixed_people_api_search with looser filters and present the top 3 candidates. Ask the user to pick one, then re-enrich.

Step 3 — Enrich Their Company

Use mcp__claude_ai_Apollo_MCP__apollo_organizations_enrich with the person's company domain to pull firmographic context.

Step 4 — Present the Contact Card

Format the output exactly like this:


[Full Name] | [Title] [Company Name] · [Industry] · [Employee Count] employees

Field Detail
Email (work) ...
Email (personal) ... (if revealed)
Phone (direct) ...
Phone (mobile) ...
Phone (corporate) ...
Location City, State, Country
LinkedIn URL
Company Domain ...
Company Revenue Range
Company Funding Total raised
Company HQ Location

Step 5 — Offer Next Actions

Ask the user which action to take:

  1. Save to Apollo — Create this person as a contact via mcp__claude_ai_Apollo_MCP__apollo_contacts_create with run_dedupe: true
  2. Add to a sequence — Ask which sequence, then run the sequence-load flow
  3. Find colleagues — Search for more people at the same company using mcp__claude_ai_Apollo_MCP__apollo_mixed_people_api_search with q_organization_domains_list set to this company
  4. Find similar people — Search for people with the same title/seniority at other companies
根据自然语言描述的ICP生成排名的 enriched 决策者线索列表。解析意图,搜索并丰富公司信息,查找关键人物,估算信用消耗后提供包含邮箱电话的表格及保存选项。
用户需要寻找特定行业或职位的销售线索 用户提供理想客户画像(ICP)描述 用户要求生成潜在客户名单
partner-built/apollo/skills/prospect/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill prospect -g -y
SKILL.md
Frontmatter
{
    "name": "prospect",
    "description": "Full ICP-to-leads pipeline. Describe your ideal customer in plain English and get a ranked table of enriched decision-maker leads with emails and phone numbers.",
    "argument-hint": "[describe your ideal customer]",
    "user-invocable": true
}

Prospect

Go from an ICP description to a ranked, enriched lead list in one shot. The user describes their ideal customer via "$ARGUMENTS".

Examples

  • /apollo:prospect VP of Engineering at Series B+ SaaS companies in the US, 200-1000 employees
  • /apollo:prospect heads of marketing at e-commerce companies in Europe
  • /apollo:prospect CTOs at fintech startups, 50-500 employees, New York
  • /apollo:prospect procurement managers at manufacturing companies with 1000+ employees
  • /apollo:prospect SDR leaders at companies using Salesforce and Outreach

Step 1 — Parse the ICP

Extract structured filters from the natural language description in "$ARGUMENTS":

Company filters:

  • Industry/vertical keywords → q_organization_keyword_tags
  • Employee count ranges → organization_num_employees_ranges
  • Company locations → organization_locations
  • Specific domains → q_organization_domains_list

Person filters:

  • Job titles → person_titles
  • Seniority levels → person_seniorities
  • Person locations → person_locations

If the ICP is vague, ask 1-2 clarifying questions before proceeding. At minimum, you need a title/role and an industry or company size.

Step 2 — Search for Companies

Use mcp__claude_ai_Apollo_MCP__apollo_mixed_companies_search with the company filters:

  • q_organization_keyword_tags for industry/vertical
  • organization_num_employees_ranges for size
  • organization_locations for geography
  • Set per_page to 25

Step 3 — Enrich Top Companies

Use mcp__claude_ai_Apollo_MCP__apollo_organizations_bulk_enrich with the domains from the top 10 results. This reveals revenue, funding, headcount, and firmographic data to help rank companies.

Step 4 — Find Decision Makers

Use mcp__claude_ai_Apollo_MCP__apollo_mixed_people_api_search with:

  • person_titles and person_seniorities from the ICP
  • q_organization_domains_list scoped to the enriched company domains
  • per_page set to 25

Step 5 — Enrich Top Leads

Credit warning: Tell the user exactly how many credits will be consumed before proceeding.

Use mcp__claude_ai_Apollo_MCP__apollo_people_bulk_match to enrich up to 10 leads per call with:

  • first_name, last_name, domain for each person
  • reveal_personal_emails set to true

If more than 10 leads, batch into multiple calls.

Step 6 — Present the Lead Table

Show results in a ranked table:

Leads matching: [ICP Summary]

# Name Title Company Employees Revenue Email Phone ICP Fit

ICP Fit scoring:

  • Strong — title, seniority, company size, and industry all match
  • Good — 3 of 4 criteria match
  • Partial — 2 of 4 criteria match

Summary: Found X leads across Y companies. Z credits consumed.

Step 7 — Offer Next Actions

Ask the user:

  1. Save all to Apollo — Bulk-create contacts via mcp__claude_ai_Apollo_MCP__apollo_contacts_create with run_dedupe: true for each lead
  2. Load into a sequence — Ask which sequence and run the sequence-load flow for these contacts
  3. Deep-dive a company — Run /apollo:company-intel on any company from the list
  4. Refine the search — Adjust filters and re-run
  5. Export — Format leads as a CSV-style table for easy copy-paste
自动查找符合特定条件的潜在客户,批量追加到Apollo外展序列中。涵盖线索发现、数据补全、联系人创建、去重及序列注册全流程,支持列表查询与手动确认。
用户要求将匹配条件的联系人添加到Apollo外展序列 用户需要批量导入或加载潜在客户到营销流程 用户查询可用的Apollo外展序列
partner-built/apollo/skills/sequence-load/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill sequence-load -g -y
SKILL.md
Frontmatter
{
    "name": "sequence-load",
    "description": "Find leads matching criteria and bulk-add them to an Apollo outreach sequence. Handles enrichment, contact creation, deduplication, and enrollment in one flow.",
    "argument-hint": "[targeting criteria + sequence name]",
    "user-invocable": true
}

Sequence Load

Find, enrich, and load contacts into an outreach sequence — end to end. The user provides targeting criteria and a sequence name via "$ARGUMENTS".

Examples

  • /apollo:sequence-load add 20 VP Sales at SaaS companies to my "Q1 Outbound" sequence
  • /apollo:sequence-load SDR managers at fintech startups → Cold Outreach v2
  • /apollo:sequence-load list sequences (shows all available sequences)
  • /apollo:sequence-load directors of engineering, 500+ employees, US → Demo Follow-up
  • /apollo:sequence-load reload 15 more leads into "Enterprise Pipeline"

Step 1 — Parse Input

From "$ARGUMENTS", extract:

Targeting criteria:

  • Job titles → person_titles
  • Seniority levels → person_seniorities
  • Industry keywords → q_organization_keyword_tags
  • Company size → organization_num_employees_ranges
  • Locations → person_locations or organization_locations

Sequence info:

  • Sequence name (text after "to", "into", or "→")
  • Volume — how many contacts to add (default: 10 if not specified)

If the user just says "list sequences", skip to Step 2 and show all available sequences.

Step 2 — Find the Sequence

Use mcp__claude_ai_Apollo_MCP__apollo_emailer_campaigns_search to find the target sequence:

  • Set q_name to the sequence name from input

If no match or multiple matches:

  • Show all available sequences in a table: | Name | ID | Status |
  • Ask the user to pick one

Step 3 — Get Email Account

Use mcp__claude_ai_Apollo_MCP__apollo_email_accounts_index to list linked email accounts.

  • If one account → use automatically
  • If multiple → show them and ask which to send from

Step 4 — Find Matching People

Use mcp__claude_ai_Apollo_MCP__apollo_mixed_people_api_search with the targeting criteria.

  • Set per_page to the requested volume (or 10 by default)

Present the candidates in a preview table:

# Name Title Company Location

Ask: "Add these [N] contacts to [Sequence Name]? This will consume [N] Apollo credits for enrichment."

Wait for confirmation before proceeding.

Step 5 — Enrich and Create Contacts

For each approved lead:

  1. Enrich — Use mcp__claude_ai_Apollo_MCP__apollo_people_bulk_match (batch up to 10 per call) with:

    • first_name, last_name, domain for each person
    • reveal_personal_emails set to true
  2. Create contacts — For each enriched person, use mcp__claude_ai_Apollo_MCP__apollo_contacts_create with:

    • first_name, last_name, email, title, organization_name
    • direct_phone or mobile_phone if available
    • run_dedupe set to true

Collect all created contact IDs.

Step 6 — Add to Sequence

Use mcp__claude_ai_Apollo_MCP__apollo_emailer_campaigns_add_contact_ids with:

  • id: the sequence ID
  • emailer_campaign_id: same sequence ID
  • contact_ids: array of created contact IDs
  • send_email_from_email_account_id: the chosen email account ID
  • sequence_active_in_other_campaigns: false (safe default)

Step 7 — Confirm Enrollment

Show a summary:


Sequence loaded successfully

Field Value
Sequence [Name]
Contacts added [count]
Sending from [email address]
Credits used [count]

Contacts enrolled:

Name Title Company Email

Step 8 — Offer Next Actions

Ask the user:

  1. Load more — Find and add another batch of leads
  2. Review sequence — Show sequence details and all enrolled contacts
  3. Remove a contact — Use mcp__claude_ai_Apollo_MCP__apollo_emailer_campaigns_remove_or_stop_contact_ids to remove specific contacts
  4. Pause a contact — Re-add with status: "paused" and an auto_unpause_at date
基于Common Room数据研究公司账户。自动加载用户上下文,识别查询模式(概览、特定问题、数据稀疏或结合推理),精准提取字段并生成简报。仅在数据不足时进行网络搜索,严禁猜测。
research [company] tell me about [domain] pull up signals for [account] what's going on with [company] 任何账户级别的问题
partner-built/common-room/skills/account-research/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill account-research -g -y
SKILL.md
Frontmatter
{
    "name": "account-research",
    "description": "Research a company using Common Room data. Triggers on 'research [company]', 'tell me about [domain]', 'pull up signals for [account]', 'what's going on with [company]', or any account-level question."
}

Account Research

Retrieve and synthesize account information from Common Room. Handles four interaction patterns: full overviews, targeted field questions, sparse data situations, and combined MCP data + LLM reasoning.

Step 0: Load User Context (Me)

Before researching any account, fetch the Me object from Common Room. This provides:

  • The user's profile, title, role, and Persona in CR
  • The user's segments ("My Segments")

Default all queries to the user's own segments unless the user explicitly asks for a broader view. This keeps results scoped to their territory.

Step 1: Identify the Interaction Pattern

Determine what the user actually needs before deciding how much data to fetch:

Pattern 1 — Full Overview: "Tell me about Datadog" / "Summarize cloudflare.com" → Fetch the full field set and produce a structured briefing.

Pattern 2 — Targeted Question: "Who owns the Snowflake account?" / "Is acme.io showing buying signals?" / "What's the employee count for notion.so?" → Fetch only the relevant field(s). Return a direct, concise answer — do not produce a full brief for a simple question.

Pattern 3 — Sparse Data: "Tell me about tiny-startup.io" → If Common Room has limited data for an account, say so honestly: "There is limited information available for this account." Never speculate or fill gaps with generic statements.

Pattern 4 — Combined Reasoning: Fetch structured MCP data, then layer in LLM analysis — e.g., "Stripe has 8,000 employees and is hiring heavily for AI roles. Based on your ICP of 1k–10k fintech companies, this is a strong fit."

Step 2: Look Up the Account

Search Common Room for the account by domain or company name. Exact match first; if no result, try partial match and confirm with the user before proceeding.

Step 3: Fetch the Right Fields

Use the Common Room object catalog to see available field groups and their contents. For full overviews, request all field groups. For targeted questions, request only what's relevant.

Key field groups to know about:

  • Scores — always return as raw values or percentiles, never labels
  • Summary research — RoomieAI output; often the richest qualitative signal
  • Top contacts — sorted by score desc; use communityMemberID for full lookups

Choosing what to fetch:

User query type Fields to request
Full account overview All field groups
"Who owns this account?" Company profiles & links, CRM fields
"Is this company a good fit?" Key fields, scores, about
"What signals is this account showing?" Scores, summary research, CRM fields
"Who are the top contacts?" Top contacts
"What does RoomieAI say about them?" Summary research, all research
"Find engineers at this account" Prospects (with title filter)

Step 4: Web Search (Sparse Data Only)

Common Room is the primary data source. Do not run web search when CR returns rich data.

When CR data is sparse (Pattern 3 — few fields returned, no activity, no scores), run a targeted web search to fill gaps:

  • "[company name]" news — scoped to the last 30 days
  • Look for: funding rounds, acquisitions, product launches, executive changes, press coverage

If the user explicitly asks for external context or recent news, run web search regardless of data richness.

Step 5: Apply Reasoning (Pattern 4)

When the user's question invites synthesis — not just data retrieval — layer in analysis:

  • Compare account data to known ICP criteria from session context
  • Identify fit signals (size, industry, tech stack, hiring patterns)
  • Note timing signals (funding, trial status, recent activity spike)
  • Frame insights as clearly derived from data, not assumed

When the user's company context is available (see references/my-company-context.md), position findings relative to the user's value proposition and ICP.

Step 6: Produce Output

Only include sections where Common Room returned actual data. Omit sections entirely rather than filling them with guesses.

Full overview (when data is rich):

## [Company Name] — Account Overview

**Snapshot**
[2–3 sentences: what they do, plan/stage, relationship status]

**Key Details**
[Employee count, industry, location, domain, funding — from key fields]

**CRM & Ownership** [If CRM fields returned]
[Owner, opp stage, ARR]

**Scores** [If scores returned]
[All available scores as raw values or percentiles]

**Signal Highlights** [If activity/signals exist]
[3–5 most important signals with dates]

**Top Contacts** [If contacts returned]
[Name | Title | Score — top 5 sorted by score desc]

**RoomieAI Research** [If summary research is non-null]
[Summary research output; list all available research topic names]

**Recommended Next Steps**
[2–3 specific, signal-backed actions]

Targeted question: 1–3 sentence direct answer. No full brief needed.

Sparse data (few fields returned, most sections would be empty):

## [Company Name] — Account Overview (Limited Data)

**Data available:** [List exactly what Common Room returned]

[Present only the returned fields]

**Web Search**
[Findings from web search — or "No significant recent news found"]

**Note:** Common Room has limited data on this account. The account may need enrichment in Common Room.

Quality Standards

  • Scores must always be raw values or percentiles — never categorical labels
  • For targeted questions, answer precisely and don't over-deliver
  • Be explicit when data is missing or stale — don't speculate
  • Keep full briefings readable in 2–3 minutes
  • Every fact must trace to a tool call — don't include data not returned by Common Room

Reference Files

  • references/signals-guide.md — signal type taxonomy and interpretation guide
基于Common Room信号准备客户或潜在客户通话简报。通过账户研究、联系人调研及信号综合,生成包含谈话要点、潜在异议和推荐结果的完整备忘,支持日历自动补全信息。
prep me for my call with [company] prepare for a meeting with [company] what should I know before talking to [company]
partner-built/common-room/skills/call-prep/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill call-prep -g -y
SKILL.md
Frontmatter
{
    "name": "call-prep",
    "description": "Prepare for a customer or prospect call using Common Room signals. Triggers on 'prep me for my call with [company]', 'prepare for a meeting with [company]', 'what should I know before talking to [company]', or any call preparation request."
}

Call Prep

Produce a complete, scannable call prep brief by combining account research, contact research, and signal synthesis from Common Room.

Prep Process

Step 1: Identify the Account and Attendees

Parse what the user has provided:

  • Company name — required; look up the account in Common Room
  • Attendee names — optional; if provided, research each one

Calendar lookup: If a ~~calendar connector is available, search for upcoming meetings with the named company to automatically surface attendee names, meeting time, and any meeting notes or agenda. Use this to fill gaps the user didn't provide.

If neither attendees nor a calendar match can be found, ask: "Who will be on the call from [Company]? I can research each attendee to make your prep more useful."

Step 2: Run Account Research

Use the account-research skill process to build a full account snapshot. For call prep, prioritize:

  • Recent product signals (what are they doing in the product right now?)
  • Open opportunities or renewal timeline
  • Any risk signals (declining usage, support tickets, churned seats)
  • Key recent events (funding, executive change, new hire)

When reviewing activity history, prioritize Gong and call recording activities — these provide direct context about previous conversations. Do not filter out call recordings by activity origin.

Step 3: Run Contact Research for Each Attendee

For each external attendee, use the contact-research skill process. For call prep, focus on:

  • Role and influence in the buying process
  • Their personal activity and engagement history
  • Any recent signals that suggest their current mood/priorities
  • Spark persona classification if available

Step 4: Synthesize Talking Points and Objectives

Based on the combined account and contact research:

  • Identify the call objective (e.g., discovery, demo, expansion conversation, renewal, QBR)
  • Generate 3–5 tailored talking points grounded in specific signal data
  • Anticipate 2–3 likely objections or topics the customer may raise
  • Suggest a recommended outcome for the call

When the user's company context is available (see references/my-company-context.md), tailor talking points to the user's product and value proposition.

Step 5: Recency Check (Web Search)

After gathering all Common Room data, run a quick recency check to catch anything that happened since the last CR data sync. This is supplementary — CR data drives the prep; web search only adds recency.

Company news: Search "[company name]" news filtered to the last 14 days. Look for funding announcements, product launches, leadership changes, layoffs, partnerships, or press coverage.

Attendee presence: For each external attendee, search "[full name]" "[company name]" — look for recent articles, LinkedIn posts, conference talks, podcasts, or published opinions.

If a company news item is significant (e.g., just raised a round, announced a major hire), flag it in Signal Highlights. Otherwise, include findings briefly — don't let web search results overshadow CR signals.

Output Format

The output adapts to how much data Common Room returned. Only include sections where you have real data. Never fill a section with invented details.

When data is rich (multiple field groups returned, activity history, scores, signals):

## Call Prep: [Company] — [Date/Time if known]

**Meeting Context**
[Attendees, meeting type, and any known agenda]

---

### Company Snapshot
[4–6 bullets: key account status, signals, and recent activity]

---

### Attendee Profiles

**[Attendee Name] — [Title]**
[3–4 bullets: role, recent activity, Spark persona if available, personal hook]

[Repeat for each attendee]

---

### Signal Highlights
[Top 3 signals most relevant to this specific call]

---

### Talking Points
1. [Point tied to a specific signal]
2. [Point tied to a specific signal]
3. [Point tied to a specific signal]

### Likely Topics / Objections to Prepare For
- [Topic or objection + suggested response]
- [Topic or objection + suggested response]

### Recommended Call Outcome
[1–2 sentences: what success looks like for this meeting]

When data is sparse (few fields returned, no activity, null sparkSummary):

## Call Prep: [Company] — [Date/Time if known]

**Data available:** [List exactly what Common Room returned — e.g., "Name, title, email, two tags. No activity history, no scores, no Spark data."]

### What I Found
[Only the fields actually returned, presented as-is]

### Web Search Results
[Findings from web search on the company and attendees — or "No significant results"]

### Suggested Next Steps
- I can pull [specific field groups] from Common Room if available
- I can run deeper web searches on [specific topics]
- You may want to check Common Room directly for [what's missing]

Do not generate a full call prep brief from sparse data. A short honest output is always better than a long fabricated one.

Quality Standards

  • Ground every talking point in a real signal — no generic filler
  • Keep the brief tight — it should be readable in 5 minutes or less
  • Flag unknowns explicitly — if attendee research is thin, say so
  • Time-box the research — don't over-research at the expense of speed
  • Never invent deal context — no fabricated proposals, competitor comparisons, pricing, trial terms, or objections not returned by a tool call

Reference Files

  • references/call-types-guide.md — guidance for different call types (discovery, expansion, renewal, QBR) and how to tailor prep accordingly
基于Common Room信号生成个性化外联消息。通过查找目标数据、补充外部线索并识别最佳钩子,为指定人员或公司撰写邮件、电话脚本和LinkedIn消息三种格式的外联内容。
起草给特定人的外联信息 给某人名写邮件 为联系人撰写消息 任何外联草稿请求
partner-built/common-room/skills/compose-outreach/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill compose-outreach -g -y
SKILL.md
Frontmatter
{
    "name": "compose-outreach",
    "description": "Generate personalized outreach messages using Common Room signals. Triggers on 'draft outreach to [person]', 'write an email to [name]', 'compose a message for [contact]', or any outreach drafting request."
}

Compose Outreach

Generate three personalized outreach formats — email, call script, and LinkedIn message — grounded in Common Room signals for a specific company or contact.

Outreach Process

Step 1: Look Up the Target

Use Common Room MCP tools to find and retrieve data for the target (company and/or specific contact). Pull:

  • Recent product activity and engagement signals
  • Community activity (posts, questions, reactions)
  • 3rd-party intent signals (job postings, news, funding)
  • Relationship history (prior contact, meetings, email opens)

If the user specified a person, run contact-level research. If only a company was given, identify the best contact to target based on title, engagement, and role.

Step 2: Web Search for External Hooks (If CR Signals Are Thin)

If CR returned strong signals (recent activity, engagement, product usage), those should drive personalization — skip web search. If CR signals are thin or the prospect has little CR activity, run a web search for external hooks:

What to search:

  • "[company name]" funding OR acquisition OR launch OR announcement — last 30 days
  • "[contact full name]" "[company name]" — look for recent articles, interviews, LinkedIn posts, or conference talks

Prioritize external hooks that are:

  • Very recent (< 2 weeks) — the prospect is likely still thinking about it
  • Publicly visible — they know you could have seen it
  • Change-signaling — growth, new role, new product, new market

If the user explicitly asks for web search or external hooks, run it regardless of CR signal richness.

Step 3: Spark Enrichment (If Available)

If Spark is available, run enrichment on the target contact to get persona classification, background, and influence signals. Use this to calibrate tone and message angle.

Step 4: Identify the Best Hooks

From the signal data, identify the 1–3 strongest personalization hooks. Rank by:

  1. Recency — happened in the last 7–14 days
  2. Specificity — a concrete action they took, not a general trend
  3. Relevance — connects directly to a value your product delivers

Good hooks: posted a question in the community about X, just hired 5 engineers, recently started using [feature], company just raised Series B, trial nearing expiration, champion just changed jobs.

Bad hooks: "I noticed you're a customer" or generic industry trends.

Step 5: Generate All Three Formats

Use the strongest hooks to write all three formats. Each format has different constraints and conventions — follow the format-specific guidelines in references/outreach-formats-guide.md.

Always produce all three, clearly labeled.

When the user's company context is available (see references/my-company-context.md), ground the value bridge and pitch in the user's specific product and positioning.

Step 6: Annotate Your Choices

After the three drafts, include a brief note (2–4 sentences) explaining:

  • Which signals were used and why they were chosen
  • Any assumptions made (e.g., inferred call objective)
  • Alternative angles if the primary hook doesn't land

Output Format

## Outreach for [Name / Company]

### 📧 Email

**Subject:** [Subject line]

[Email body — 3–5 sentences]

---

### 📞 Call Script

**Opening:**
[Opening line — conversational, 1–2 sentences]

**Value Bridge:**
[Why you're calling and why now — 2–3 sentences tied to a signal]

**Ask:**
[Single, low-friction ask — e.g., 15-minute call, specific question]

---

### 💼 LinkedIn Message

[Under 300 characters. Warm, personal, no pitch.]

---

### Signal Notes
[2–4 sentences: which signals were used, why, and any alternative angles]

When Signal Data Is Sparse

If Common Room returns minimal data on the target (e.g., just name, title, tags — no activity, no scores, no Spark):

  1. Do not draft outreach from thin air. Outreach grounded in fabricated signals is worse than no outreach.
  2. Run web search first — this becomes your primary personalization source. Look for recent news, LinkedIn posts, conference talks, company announcements.
  3. If web search also returns little, present what you have honestly and ask the user for context:
## Outreach for [Name / Company] — Limited Data

**What I found:**
[Only the real data from CR and web search]

**I don't have enough signal to draft personalized outreach yet.** To write something strong, I'd need:
- Recent activity or engagement signals
- Context you have from prior conversations
- A specific reason for reaching out now

Can you share any of the above?

Quality Standards

  • Every message must reference something specific — generic outreach is not acceptable output
  • Match tone to context: warm and conversational for inbound/community signals; more formal for cold/executive outreach
  • The LinkedIn message must be under 300 characters — no exceptions
  • The call script must be speakable naturally — read it aloud mentally to check rhythm
  • Never fabricate signals — only reference data retrieved from Common Room or web search

Reference Files

  • references/outreach-formats-guide.md — detailed format rules, examples, and tone guidelines for each channel
基于 Common Room 数据研究特定联系人,支持通过邮箱、社交账号或姓名+公司查询。返回 enriched 资料、活动历史、Spark 分析、账户背景及对话切入点,用于评估线索质量和制定沟通策略。
who is [name] look up [email] research [contact] is [name] a warm lead any contact-level question
partner-built/common-room/skills/contact-research/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill contact-research -g -y
SKILL.md
Frontmatter
{
    "name": "contact-research",
    "description": "Research a specific person using Common Room data. Triggers on 'who is [name]', 'look up [email]', 'research [contact]', 'is [name] a warm lead', or any contact-level question."
}

Contact Research

Retrieve a comprehensive contact profile from Common Room. Supports lookup by email, social handle, or name + company. Returns enriched data including activity history, Spark, scores, website visits, and CRM fields.

Step 1: Locate the Contact

Common Room supports multiple lookup methods — use whichever the user has provided:

What the user gives Lookup method
Email address Look up by email (most reliable)
LinkedIn, Twitter/X, or GitHub handle Look up by social handle — specify handle type explicitly
Name + company Identity resolution by name + org domain; present matches if ambiguous
Name only Search by name; if multiple matches, show a brief list and ask the user to confirm

If no match is found, respond: "Common Room doesn't have a record for this person." Do not speculate or fabricate profile data.

Step 2: Fetch Contact Fields

Use the Common Room object catalog to see available field groups and their contents. For full profiles, request all groups. For targeted questions, request only what's relevant.

Key field groups to know about:

  • Scores — always return as raw values or percentiles, never labels
  • Recent activity — use Contact Initiated filter (last 60 days) for their actions, not your team's
  • Website visits — total count + specific pages (last 12 weeks)
  • Spark — retrieve all Sparks when tracking engagement evolution over time

Step 3: Run Spark Enrichment (If Available)

If Spark is available, use it. Spark provides:

  • Professional background and job history
  • Social presence and influence signals
  • Persona classification: Champion, Economic Buyer, Technical Evaluator, End User, or Gatekeeper
  • Inferred role in the buying process

If Spark is unavailable but real activity data exists (recent actions, website visits, community engagement), infer a persona from those signals. If neither Spark nor activity data is available, classify as Unknown — do not guess a persona from title alone.

Retrieve all Sparks (not just the most recent) when the user wants to understand how this contact's engagement has evolved over time.

Step 4: Assess Account Context

Pull an abbreviated account snapshot for this contact's parent company. Note:

  • Open opportunities, expansion signals, or churn risk at the account level
  • Whether other contacts at this company are also active
  • How this person's engagement compares to their colleagues

Step 5: Identify Conversation Angles

Based on activity and signals, surface the strongest 2–3 hooks:

  • A recent Contact Initiated activity (community post, product event, support ticket)
  • A specific web page they visited recently — especially if it signals evaluation intent
  • A job change, promotion, or company news
  • Their Spark persona and what that suggests about communication style
  • Their role in a known active deal

Output Format

Only include sections where data was actually returned. Omit sections with no data rather than filling them with guesses.

When data is rich:

## [Contact Name] — Profile

**Overview**
[2 sentences: who they are, their role, and relationship status]

**Details**
- Title: [title]
- Company: [company]
- Email: [email]
- LinkedIn: [URL]
- Other profiles: [Twitter/X, GitHub, CRM link if available]

**Scores** [If scores returned]
[All scores as raw values or percentiles]

**Recent Activity** (last 60 days) [If activity returned]
[3–5 bullets with dates]

**Website Visits** (last 12 weeks) [If visit data exists]
[Total visit count + list of pages visited]

**Spark Profile** [If Spark data is non-null]
[Persona type, background summary, influence signals]

**Segments** [If segments returned]
[List of segment names this contact belongs to]

**Account Context**
[1–2 sentences on their company's status]

**Conversation Starters**
[2–3 specific, signal-backed openers]

When data is sparse (e.g., only name, title, email, tags returned; sparkSummary is null):

## [Contact Name] — Profile (Limited Data)

**Data available:** [List exactly what Common Room returned]

[Present only the returned fields]

**Web Search**
[Any findings from searching their name + company]

**Note:** Common Room has limited data on this contact. No activity history, scores, or Spark profile available. I can run deeper web searches or look up their company for additional context.

Do not generate conversation starters, persona inferences, or engagement assessments from sparse data. These require real signals.

Quality Standards

  • Lookup must use the correct method for the input type — don't guess on email vs. handle
  • Scores as raw/percentile only — never labels
  • Contact Initiated activity (last 60 days) is the primary engagement signal — lead with it
  • If Spark is unavailable, say so — don't fabricate a persona from title alone
  • Flag any contact where the most recent activity is older than 30 days

Reference Files

  • references/contact-signals-guide.md — full field descriptions, Spark persona guide, and conversation starter principles
利用Common Room Prospector构建目标客户或联系人列表。区分新建公司(ProspectorOrganization)与现有账户(Organization),支持通过自然对话迭代筛选、相似性搜索及信号查询,以生成精准的销售线索。
查找符合特定条件的公司 构建潜在客户列表 查找某类公司的联系人 显示正在招聘特定职位的公司 任何列表构建请求
partner-built/common-room/skills/prospect/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill prospect -g -y
SKILL.md
Frontmatter
{
    "name": "prospect",
    "description": "Build targeted account or contact lists using Common Room's Prospector. Triggers on 'find companies that match [criteria]', 'build a prospect list', 'find contacts at [type of company]', 'show me companies hiring [role]', or any list-building request."
}

Prospecting

Build targeted account and contact lists using Common Room's Prospector. Supports iterative refinement through natural conversation, intent-based discovery, and both net-new prospecting and signal-based queries against existing accounts.

Critical Distinction: Two Object Types

Common Room's Prospector operates against two fundamentally different object types. Always clarify which one is in play before running a query:

ProspectorOrganization — Companies not yet in Common Room

  • Net-new companies that match specified criteria
  • Available fields are firmographic only: name, domain, size, industry, capital raised, annual revenue, location
  • Fewer filter options — no signal-based filters, no scores, no activity history
  • Use when: building a brand-new target list, territory planning, top-of-funnel expansion

Organization (in Common Room) — Companies already in your CR workspace

  • Full signal data available: product usage, community activity, CRM fields, scores, custom fields
  • Much richer filter set — includes signal-based, score-based, segment-based, and firmographic filters
  • Use when: finding warm accounts to prioritize, identifying expansion candidates, surfacing intent signals within existing pipeline

When a user's request could apply to both (e.g., "Show companies hiring AI engineers this month"), clarify:

"Are you looking for net-new companies not yet in Common Room, or filtering accounts already in your workspace?"

The catalog should make this distinction explicit so the LLM can select the right Prospector endpoint.

Step 0: Load User Context (Me)

Fetch the Me object to get the user's segments. When prospecting against Organization records (accounts already in CR), default to filtering within "My Segments" unless the user asks for a broader search.

Step 1: Gather Targeting Criteria

If criteria are already provided, proceed. Otherwise ask:

"What kind of accounts or contacts are you looking for? For example: company size, industry, job titles, signals like recent product activity or community engagement, geographic region, or specific intent signals like recent funding or job postings."

Use the Common Room object catalog to see available filters for each object type. The key distinction:

  • ProspectorOrganization — firmographic and technographic filters only (industry, size, geography, funding, tech stack)
  • Organization — all firmographic filters plus signal-based, score-based, segment-based, and CRM filters

Lookalike search: If the user asks to "find companies like [X]", first look up the reference company in Common Room (or via web search if not in CR). Extract its key attributes — industry, employee range, tech stack, funding stage, geography — and propose those as filter criteria. Present the derived criteria to the user for confirmation before running the search, since lookalike targeting works best when the user can refine which attributes matter most.

Step 2: Support Iterative Refinement

Prospecting is conversational. Support multi-turn refinement naturally:

  1. Run initial query with provided criteria
  2. If results are large (50+), summarize and offer: "I found [N] results. Want to narrow by [suggested filter]?"
  3. If results are too few (< 5), suggest: "Only [N] results with those filters — I can broaden by relaxing [specific criterion]."
  4. Apply each refinement as a follow-up query, not a new search from scratch

Example flow:

  • Rep: "Find cybersecurity companies in California." → 500 results
  • Rep: "Only show ones over 300 employees using AWS." → 47 results
  • Rep: "Focus on the ones with recent hiring activity." → 12 results ✓

Step 3: Run the Query and Present Results

Execute the Prospector query with confirmed criteria. Sort by signal strength or fit score where available (not alphabetically).

For ProspectorOrganization (net-new) results:

Company Domain Industry Size Capital Raised Revenue Location

For Organization (in CR) results:

Company Industry Size Top Signal Signal Date Score CRM Stage

Flag any results where data is thin or the most recent signal is older than 90 days.

Step 3.5: Enrich Net-New Results with Web Search

For ProspectorOrganization results (net-new companies not in CR), run a quick web search on the top 3–5 companies to add context beyond firmographics. CR has no behavioral signals for these companies, so web search fills the gap — look for recent funding, product launches, leadership changes, or news coverage. Include findings as brief annotations next to each company in the results.

Step 4: Offer Next Steps

  • "Want me to draft outreach for the top 3–5 prospects?"
  • "Should I run a full account brief on any of these?"
  • "Want to refine the criteria or add another filter?"
  • "I can format this as a CSV if you'd like to export it."
  • "For any net-new companies here, I can add them to Common Room for enrichment." (future capability)

Quality Standards

  • Always confirm which object type (ProspectorOrg vs Organization) before running the query
  • Default to "My Segments" when querying Organization records, unless user specifies otherwise
  • Support iterative refinement — treat each follow-up as a filter adjustment, not a fresh start
  • Never mix result fields from ProspectorOrganization and Organization in the same list
  • Fewer high-quality results beat a long unqualified list
  • Only show data the query returned — leave blank or "—" for missing fields, don't invent values

Reference Files

  • references/prospect-guide.md — filter types, signal-based sorting, object type distinctions, and list-building strategies
生成未来7天所有外部客户或潜在客户通话的综合每周简报。通过日历连接或手动输入获取会议,利用Common Room进行账户和联系人研究,结合近期新闻检查,按日期整理并输出包含周概览及每场会议详细准备的文档。
weekly prep brief prepare my week what calls do I have this week Monday prep any weekly planning request
partner-built/common-room/skills/weekly-prep-brief/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill weekly-prep-brief -g -y
SKILL.md
Frontmatter
{
    "name": "weekly-prep-brief",
    "description": "Generate a comprehensive weekly briefing for all external calls in the next 7 days. Triggers on 'weekly prep brief', 'prepare my week', 'what calls do I have this week', 'Monday prep', or any weekly planning request."
}

Weekly Prep Brief

Generate a single comprehensive weekly briefing that covers every external customer or prospect call in the next 7 days, with per-meeting account and contact research from Common Room.

Briefing Process

Step 1: Get the Week's External Meetings

Option A — Calendar connected: Use the ~~calendar connector to fetch all meetings scheduled in the next 7 days (or a user-specified range). Filter to keep only external meetings — those with attendees from outside your organization. Discard internal-only meetings, one-on-ones with colleagues, and recurring internal syncs.

Identify for each external meeting:

  • Company name
  • Meeting date and time
  • External attendee names and email addresses

Option B — No calendar connected: Ask the user: "To build your weekly prep brief, I'll need your upcoming external calls. Please list them: company name, date/time, and attendee names."

Accept freeform input and parse it into a structured list before proceeding.

Step 2: Confirm the Meeting List

Present the identified meetings to the user for confirmation before beginning research:

"Here are the external calls I found for this week. Let me know if anything's missing or should be excluded:

  • [Company] — [Day], [Time] — [Attendees]
  • ..."

This prevents wasted research on cancelled or incorrect meetings.

Step 3: Research Each Meeting

For each confirmed external meeting, run in parallel where possible:

  1. Account research — full account snapshot using the account-research skill
  2. Contact research — profile for each external attendee using the contact-research skill

Common Room data is the primary source. After CR research, run a quick recency check for each company — this is supplementary, not primary:

  • Search "[company name]" news scoped to the last 7 days
  • For executive attendees, search their name for recent public posts or interviews
  • Only include findings that are genuinely noteworthy (funding, leadership changes, major press). Don't pad the brief with generic news.

Depth calibration:

  • For high-priority accounts (large accounts, open opportunities, renewal risk), produce full depth research
  • For lower-priority or short meetings, produce abbreviated snapshots (3–4 bullets each)

Step 4: Synthesize the Weekly Brief

Compile all per-meeting research into a single structured document, sorted by meeting date/time.

Open with a brief week-level overview that flags:

  • Any accounts with urgent signals (at-risk, trial expiring, expansion opportunity)
  • Any meetings that need special preparation or executive involvement
  • Total external call count and estimated time commitment

Output Format

# Weekly Prep Brief — Week of [Date]

## Week Overview
[2–4 bullets: key themes, flagged priorities, call count]

---

## [Monday / Tuesday / etc.]

### [Company Name] — [Time]
**Attendees:** [Names and titles]
**Meeting type:** [Discovery / QBR / Renewal / Expansion / etc. — inferred if possible]

**Company Snapshot**
[4–5 bullets: account status, top signals, recent activity]

**Attendee Profiles**
- **[Name]** ([Title]): [2–3 bullets on their signals, persona, conversation angle]
- [Repeat per attendee]

**Top Signals This Week**
[2–3 most relevant signals for this specific call]

**This Week's News** [If notable news found]
[Only genuinely noteworthy findings — funding, leadership changes, major press]

**Recommended Objectives**
[1–2 sentences: what to accomplish in this meeting]

---

[Repeat per meeting, sorted by date/time]

When a Meeting Has Sparse Data

If Common Room returns limited data for a particular meeting's account or attendees, use a compressed format for that meeting instead of the full template:

### [Company Name] — [Time] ⚠️ Limited Data
**Attendees:** [Names and titles if known]
**Data available:** [What Common Room actually returned]

**Web Search Results**
[Findings from web search — company news, attendee LinkedIn profiles]

**Note:** Common Room has limited data on this account. The rep may want to check directly in CR or gather context from colleagues before this call.

Do not generate a full meeting prep section (company snapshot, signal highlights, talking points, recommended objectives) from sparse data. A short honest section is more useful than a fabricated full one.

Quality Standards

  • Keep each meeting section scannable — reps read these in the morning, often on mobile
  • Always sort by date/time ascending
  • Flag urgent situations prominently (risk, trial expiration, open opps) — don't bury them
  • If a meeting has very thin Common Room data, use the sparse-data format above — never fill the full template with guesses
  • Total brief should be readable in 10–15 minutes for a week with 4–6 meetings
  • Every fact must come from a tool call — no invented deal context, activity, or signals

Reference Files

  • references/briefing-guide.md — guidelines for structuring briefings, prioritization logic, and how to handle edge cases (cancelled meetings, new accounts with no data, etc.)
提供Slack消息撰写指南,涵盖mrkdwn语法规范、避免常见格式错误、结构优化建议及线程礼仪,确保信息清晰有效。
起草或撰写Slack消息 使用slack_send_message工具 使用slack_send_message_draft工具 使用slack_create_canvas工具
partner-built/slack/skills/slack-messaging/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill slack-messaging -g -y
SKILL.md
Frontmatter
{
    "name": "slack-messaging",
    "description": "Guidance for composing well-formatted, effective Slack messages using mrkdwn syntax"
}

Slack Messaging Best Practices

This skill provides guidance for composing well-formatted, effective Slack messages.

When to Use

Apply this skill whenever composing, drafting, or helping the user write a Slack message — including when using slack_send_message, slack_send_message_draft, or slack_create_canvas.

Slack Formatting (mrkdwn)

Slack uses its own markup syntax called mrkdwn, which differs from standard Markdown. Always use mrkdwn when composing Slack messages:

Format Syntax Notes
Bold *text* Single asterisks, NOT double
Italic _text_ Underscores
Strikethrough ~text~ Tildes
Code (inline) `code` Backticks
Code block ```code``` Triple backticks
Quote > text Angle bracket
Link <url|display text> Pipe-separated in angle brackets
User mention <@U123456> User ID in angle brackets
Channel mention <#C123456> Channel ID in angle brackets
Bulleted list - item or • item Dash or bullet character
Numbered list 1. item Number followed by period

Common Mistakes to Avoid

  • Do NOT use **bold** (double asterisks) — Slack uses *bold* (single asterisks)
  • Do NOT use ## headers — Slack does not support Markdown headers. Use *bold text* on its own line instead.
  • Do NOT use [text](url) for links — Slack uses <url|text> format
  • Do NOT use --- for horizontal rules — Slack does not render these

Message Structure Guidelines

  • Lead with the point. Put the most important information in the first line. Many people read Slack on mobile or in notifications where only the first line shows.
  • Keep it short. Aim for 1-3 short paragraphs. If the message is long, consider using a Canvas instead.
  • Use line breaks generously. Walls of text are hard to read. Separate distinct thoughts with blank lines.
  • Use bullet points for lists. Anything with 3+ items should be a list, not a run-on sentence.
  • Bold key information. Use *bold* for names, dates, deadlines, and action items so they stand out when scanning.

Thread vs. Channel Etiquette

  • Reply in threads when responding to a specific message to keep the main channel clean.
  • Use reply_broadcast (also post to channel) only when the reply contains information everyone needs to see.
  • Post in the channel (not a thread) when starting a new topic, making an announcement, or asking a question to the whole group.
  • Don't start a new thread to continue an existing conversation — find and reply to the original message.

Tone and Audience

  • Match the tone to the channel — #general is usually more formal than #random.
  • Use emoji reactions instead of reply messages for simple acknowledgments (though note: the MCP tools can't add reactions, so suggest the user do this manually if appropriate).
  • When writing announcements, use a clear structure: context, key info, call to action.
用于构建Zoom会议机器人、录制工具或实时媒体工作流。涵盖加入策略、音视频处理、后端编排及事件流设计,指导开发者结合SDK与RTMS实现自动化会议交互。
需要编写程序自动加入Zoom会议 开发会议录音或实时转录功能 构建基于Zoom Meeting SDK的实时媒体处理应用 设计会议相关的后端服务与Webhook集成
partner-built/zoom-plugin/skills/build-zoom-bot/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill build-zoom-bot -g -y
SKILL.md
Frontmatter
{
    "name": "build-zoom-bot",
    "description": "Build a Zoom meeting bot, recorder, or real-time media workflow. Use when joining meetings programmatically, processing live media or transcripts, or combining Meeting SDK, RTMS, and backend services."
}

/build-zoom-bot

Use this skill for automation that joins meetings, captures media, or reacts to live session data.

Covers

  • Bot architecture
  • Meeting join strategy
  • Real-time media and transcript handling
  • Backend orchestration
  • Storage, post-processing, and event flow design

Workflow

  1. Clarify whether the bot needs to join, observe, transcribe, summarize, or act.
  2. Route to Meeting SDK and RTMS as the core implementation path.
  3. Add REST API for meeting/resource management and Webhooks for asynchronous events when needed.
  4. Call out environment and lifecycle constraints early.

Primary References

Common Mistakes

  • Treating batch transcription and live media as the same workflow
  • Designing the bot before defining join authority and auth model
  • Forgetting post-meeting storage and retry behavior
用于构建或嵌入 Zoom 会议体验,涵盖 Meeting SDK 选型、加入/认证流程设计、创建与生命周期管理,以及 Web 与原生平台的决策支持。
实现 Meeting SDK 加入功能 Web 或移动端会议嵌入开发 会议生命周期流程设计 决定使用 Meeting SDK 还是 Video SDK
partner-built/zoom-plugin/skills/build-zoom-meeting-app/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill build-zoom-meeting-app -g -y
SKILL.md
Frontmatter
{
    "name": "build-zoom-meeting-app",
    "description": "Build or embed a Zoom meeting flow. Use when implementing Meeting SDK joins, web or mobile meeting embeds, meeting lifecycle flows, or when deciding between Meeting SDK and Video SDK."
}

/build-zoom-meeting-app

Use this skill for embedded meeting experiences and meeting lifecycle implementation.

Covers

  • Meeting SDK selection and platform routing
  • Join/auth implementation planning
  • Meeting creation plus join flow design
  • Web vs native platform considerations
  • Meeting SDK vs Video SDK boundary decisions

Workflow

  1. Confirm whether the user wants a Zoom meeting or a custom video session.
  2. Route to Meeting SDK if the user needs actual Zoom meetings.
  3. Pull in the relevant platform references.
  4. Add REST API only for meeting creation, resource management, or reporting.
  5. Add webhooks or RTMS only when the use case explicitly needs them.

Primary References

Common Mistakes

  • Using Video SDK for normal Zoom meeting embeds
  • Mixing resource-management APIs into the core join flow without reason
  • Skipping platform-specific SDK constraints until too late
帮助用户根据具体场景选择最合适的Zoom技术架构(如REST API、Webhooks、SDK等)。提供决策框架,确保推荐最小且正确的解决方案,避免过度设计或误用组件。
需要集成Zoom功能但不确定选哪种API或SDK 在多种Zoom技术方案间做架构选型决策 构建视频会议、电话或自动化工作流
partner-built/zoom-plugin/skills/choose-zoom-approach/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill choose-zoom-approach -g -y
SKILL.md
Frontmatter
{
    "name": "choose-zoom-approach",
    "description": "Choose the right Zoom architecture for a use case. Use when deciding between REST API, Webhooks, WebSockets, Meeting SDK, Video SDK, Zoom Apps SDK, Zoom MCP, Phone, Contact Center, or a hybrid approach.",
    "user-invocable": false
}

Choose Zoom Approach

Pick the smallest correct Zoom surface for the job, then layer in only the supporting pieces that are actually required.

Decision Framework

Problem Type Primary Zoom Surface
Deterministic backend automation, account management, reporting, scheduled jobs rest-api
Event delivery to your backend webhooks or websockets
Embed Zoom meetings into your app meeting-sdk
Build a fully custom video experience video-sdk
Build inside the Zoom client zoom-apps-sdk
AI-agent tool workflows over Zoom data zoom-mcp
Real-time media extraction or meeting bots rtms plus meeting-sdk when needed
Phone workflows phone
Contact Center or Virtual Agent flows contact-center or virtual-agent

Guardrails

  • Do not recommend Video SDK when the user actually needs Zoom meeting semantics.
  • Do not recommend Meeting SDK when the user needs a fully custom session product.
  • Do not replace deterministic backend automation with MCP-only guidance.
  • Prefer hybrid rest-api + zoom-mcp when the user needs both stable system actions and AI-driven discovery.

What To Produce

  • One recommended path
  • Minimum supporting components
  • Hard constraints and tradeoffs
  • Immediate next implementation step
Zoom Cobrowse SDK Web开发参考技能,用于实现浏览器协同浏览、标注工具、隐私屏蔽及远程协助。在确定协作支持工作流后,提供集成细节、会话生命周期管理及故障排除指南。
需要实现浏览器协同浏览功能 集成Zoom Cobrowse SDK进行客户与代理的实时互动 配置隐私屏蔽或远程协助功能 解决Cobrowse SDK相关的认证或连接问题
partner-built/zoom-plugin/skills/cobrowse-sdk/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill zoom-cobrowse-sdk -g -y
SKILL.md
Frontmatter
{
    "name": "zoom-cobrowse-sdk",
    "triggers": [
        "cobrowse",
        "co-browse",
        "collaborative browsing",
        "agent assist",
        "customer support screen share",
        "zoom cobrowse"
    ],
    "description": "Reference skill for Zoom Cobrowse SDK. Use after routing to a collaborative-support workflow when implementing browser co-browsing, annotation tools, privacy masking, remote assist, or PIN-based session sharing.",
    "user-invocable": false
}

Zoom Cobrowse SDK - Web Development

Background reference for collaborative browsing on the web with Zoom Cobrowse SDK. Use this after the support workflow is clear and you need implementation detail.

Official Documentation: https://developers.zoom.us/docs/cobrowse-sdk/
API Reference: https://marketplacefront.zoom.us/sdk/cobrowse/
Quickstart Repository: https://github.com/zoom/CobrowseSDK-Quickstart
Auth Endpoint Sample: https://github.com/zoom/cobrowsesdk-auth-endpoint-sample

Quick Links

New to Cobrowse SDK? Follow this path:

  1. Get Started Guide - Complete setup from credentials to first session
  2. Session Lifecycle - Understanding customer and agent flows
  3. JWT Authentication - Token generation and security
  4. Customer Integration - Integrate SDK into your website
  5. Agent Integration - Set up agent portal (iframe or npm)

Core Concepts:

Features:

Troubleshooting:

Reference:

SDK Overview

The Zoom Cobrowse SDK is a JavaScript library that provides:

  • Real-Time Co-Browsing: Agent sees customer's browser activity live
  • PIN-Based Sessions: Secure 6-digit PIN for customer-to-agent connection
  • Annotation Tools: Drawing, highlighting, vanishing pen, rectangle, color picker
  • Privacy Masking: CSS selector-based masking of sensitive form fields
  • Remote Assist: Agent can scroll customer's page (with consent)
  • Multi-Tab Persistence: Session continues when customer opens new tabs
  • Auto-Reconnection: Session recovers from page refresh (2-minute window)
  • Session Events: Real-time events for session state changes
  • HTTPS Required: Secure connections (HTTP only works on loopback/local development hosts)
  • No Plugins: Pure JavaScript, no browser extensions needed

Two Roles Architecture

Cobrowse has two distinct roles, each with different integration patterns:

Role role_type Integration JWT Required Purpose
Customer 1 Website integration (CDN or npm) Yes User who shares their browser session
Agent 2 Iframe (CDN) or npm (BYOP only) Yes Support staff who views/assists customer

Key Insight: Customer and agent use different integration methods but the same JWT authentication pattern.

Read This First (Critical)

For customer/agent demos, treat the PIN from customer SDK event pincode_updated as the only user-facing PIN.

  • Show one clearly labeled value in UI (for example, Support PIN).
  • Use that same PIN for agent join.
  • Do not expose provisional/debug PINs from backend pre-start records to users.

If these rules are ignored, agent desk often fails with Pincode is not found / code 30308.

Typical Production Flow (Most Common)

This is the flow most teams implement first, and what users usually expect in demos:

  1. Customer starts session first (role_type=1)
    • Backend creates/records session
    • Backend returns customer JWT
    • Customer SDK starts and receives a PIN
  2. Agent joins second (role_type=2)
    • Agent enters customer PIN
    • Backend validates PIN and session state
    • Backend returns agent JWT
    • Agent opens Zoom-hosted desk iframe (or custom npm agent UI in BYOP)

If a demo only has one generic "session" user, it is incomplete for real cobrowse operations.

Prerequisites

Platform Requirements

  • Supported Browsers:

    • Chrome 80+ ✓
    • Firefox 78+ ✓
    • Safari 14+ ✓
    • Edge 80+ ✓
    • Internet Explorer ✗ (not supported)
  • Network Requirements:

    • HTTPS required (HTTP works on loopback/local development hosts only)
    • Allow cross-origin requests to *.zoom.us
    • CSP headers must allow Zoom domains (see CORS and CSP guide)
  • Third-Party Cookies:

    • Must enable third-party cookies for refresh reconnection
    • Privacy mode may limit certain features

Zoom Account Requirements

  1. Zoom Workplace Account with SDK Universal Credit
  2. Video SDK App created in Zoom Marketplace
  3. Cobrowse SDK Credentials from the app's Cobrowse tab

Note: Cobrowse SDK is a feature of Video SDK (not a separate product).

Credentials Overview

You'll receive 4 credentials from Zoom Marketplace → Video SDK App → Cobrowse tab:

Credential Type Used For Exposure Safe?
SDK Key Public CDN URL, JWT app_key claim ✓ Yes (client-side)
SDK Secret Private Sign JWTs ✗ No (server-side only)
API Key Private REST API calls (optional) ✗ No (server-side only)
API Secret Private REST API calls (optional) ✗ No (server-side only)

Critical: SDK Key is public (embedded in CDN URL), but SDK Secret must never be exposed client-side.

Quick Start

Step 1: Get SDK Credentials

  1. Go to Zoom Marketplace
  2. Open your Video SDK App (or create one)
  3. Navigate to the Cobrowse tab
  4. Copy your credentials:
    • SDK Key
    • SDK Secret
    • API Key (optional)
    • API Secret (optional)

Step 2: Set Up Token Server

Deploy a server-side endpoint to generate JWTs. Use the official sample:

git clone https://github.com/zoom/cobrowsesdk-auth-endpoint-sample.git
cd cobrowsesdk-auth-endpoint-sample
npm install

# Create .env file
cat > .env << EOF
ZOOM_SDK_KEY=your_sdk_key_here
ZOOM_SDK_SECRET=your_sdk_secret_here
PORT=4000
EOF

npm start

Token endpoint:

// POST https://YOUR_TOKEN_SERVICE_BASE_URL
{
  "role": 1,           // 1 = customer, 2 = agent
  "userId": "user123",
  "userName": "John Doe"
}

// Response
{
  "token": "eyJhbGciOiJIUzI1NiIs..."
}

Step 3: Customer Side Integration (CDN)

<!DOCTYPE html>
<html>
<head>
  <title>Customer - Cobrowse Demo</title>
  <script type="module">
    const ZOOM_SDK_KEY = 'YOUR_SDK_KEY';
    
    // Load SDK from CDN
    (function(r, a, b, f, c, d) {
      r[f] = r[f] || { init: function() { r.ZoomCobrowseSDKInitArgs = arguments }};
      var fragment = a.createDocumentFragment();
      function loadJs(url) {
        c = a.createElement(b);
        d = a.getElementsByTagName(b)[0];
        c["async"] = false;
        c.src = url;
        fragment.appendChild(c);
      }
      loadJs(`https://us01-zcb.zoom.us/static/resource/sdk/${ZOOM_SDK_KEY}/js/2.13.2`);
      d.parentNode.insertBefore(fragment, d);
    })(window, document, "script", "ZoomCobrowseSDK");
  </script>
</head>
<body>
  <h1>Customer Support</h1>
  <button id="cobrowse-btn" disabled>Loading...</button>
  
  <!-- Sensitive fields - will be masked from agent -->
  <label>SSN: <input type="text" class="pii-mask" placeholder="XXX-XX-XXXX"></label>
  <label>Credit Card: <input type="text" class="pii-mask" placeholder="XXXX-XXXX-XXXX-XXXX"></label>
  
  <script type="module">
    let sessionRef = null;
    
    const settings = {
      allowAgentAnnotation: true,
      allowCustomerAnnotation: true,
      piiMask: {
        maskCssSelectors: ".pii-mask",
        maskType: "custom_input"
      }
    };
    
    ZoomCobrowseSDK.init(settings, function({ success, session, error }) {
      if (success) {
        sessionRef = session;
        
        // Listen for PIN code
        session.on("pincode_updated", (payload) => {
          console.log("PIN Code:", payload.pincode);
          // IMPORTANT: this is the PIN agent should use
          alert(`Share this PIN with agent: ${payload.pincode}`);
        });
        
        // Listen for session events
        session.on("session_started", () => console.log("Session started"));
        session.on("agent_joined", () => console.log("Agent joined"));
        session.on("agent_left", () => console.log("Agent left"));
        session.on("session_ended", () => console.log("Session ended"));
        
        document.getElementById("cobrowse-btn").disabled = false;
        document.getElementById("cobrowse-btn").innerText = "Start Cobrowse Session";
      } else {
        console.error("SDK init failed:", error);
      }
    });
    
    document.getElementById("cobrowse-btn").addEventListener("click", async () => {
      // Fetch JWT from your server
      const response = await fetch("https://YOUR_TOKEN_SERVICE_BASE_URL", {
        method: "POST",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify({
          role: 1,
          userId: "customer_" + Date.now(),
          userName: "Customer"
        })
      });
      const { token } = await response.json();
      
      // Start cobrowse session
      sessionRef.start({ sdkToken: token });
    });
  </script>
</body>
</html>

Step 4: Agent Side Integration (Iframe)

<!DOCTYPE html>
<html>
<head>
  <title>Agent Portal</title>
</head>
<body>
  <h1>Agent Portal</h1>
  <iframe 
    id="agent-iframe"
    width="1024" 
    height="768"
    allow="autoplay *; camera *; microphone *; display-capture *; geolocation *;"
  ></iframe>
  
  <script>
    async function connectAgent() {
      // Fetch JWT from your server
      const response = await fetch("https://YOUR_TOKEN_SERVICE_BASE_URL", {
        method: "POST",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify({
          role: 2,
          userId: "agent_" + Date.now(),
          userName: "Support Agent"
        })
      });
      const { token } = await response.json();
      
      // Load Zoom agent portal
      const iframe = document.getElementById("agent-iframe");
      iframe.src = `https://us01-zcb.zoom.us/sdkapi/zcb/frame-templates/desk?access_token=${token}`;
    }
    
    connectAgent();
  </script>
</body>
</html>

Step 5: Test the Integration

  1. Open two separate browsers (or incognito + normal)
  2. Customer browser: Open customer page, click "Start Cobrowse Session"
  3. Customer browser: Note the 6-digit PIN displayed
  4. Agent browser: Open agent page, enter the PIN code
  5. Both browsers: Session connects, agent can see customer's page
  6. Test features: Annotations, data masking, remote assist

Key Features

1. Annotation Tools

Both customer and agent can draw on the shared screen:

const settings = {
  allowAgentAnnotation: true,      // Agent can draw
  allowCustomerAnnotation: true    // Customer can draw
};

Available tools:

  • Pen (persistent)
  • Vanishing pen (disappears after 4 seconds)
  • Rectangle
  • Color picker
  • Eraser
  • Undo/Redo

2. Privacy Masking

Hide sensitive fields from agents using CSS selectors:

const settings = {
  piiMask: {
    maskType: "custom_input",           // Mask specific fields
    maskCssSelectors: ".pii-mask, #ssn", // CSS selectors
    maskHTMLAttributes: "data-sensitive=true" // HTML attributes
  }
};

Supported masking:

  • Text nodes ✓
  • Form inputs ✓
  • Select elements ✓
  • Images ✗ (not supported)
  • Links ✗ (not supported)

3. Remote Assist

Agent can scroll the customer's page:

const settings = {
  remoteAssist: {
    enable: true,
    enableCustomerConsent: true,        // Customer must approve
    remoteAssistTypes: ['scroll_page'], // Only scroll supported
    requireStopConfirmation: false      // Confirmation when stopping
  }
};

4. Multi-Tab Session Persistence

Session continues when customer opens new tabs:

const settings = {
  multiTabSessionPersistence: {
    enable: true,
    stateCookieKey: '$$ZCB_SESSION$$'  // Cookie key (base64 encoded)
  }
};

Session Lifecycle

Customer Flow

  1. Load SDK → CDN script loads ZoomCobrowseSDK
  2. InitializeZoomCobrowseSDK.init(settings, callback)
  3. Fetch JWT → Request token from your server (role_type=1)
  4. Start Sessionsession.start({ sdkToken })
  5. PIN Generatedpincode_updated event fires
  6. Share PIN → Customer gives 6-digit PIN to agent
  7. Agent Joinsagent_joined event fires
  8. Session Active → Real-time synchronization begins
  9. End Sessionsession.end() or agent leaves

Agent Flow

  1. Fetch JWT → Request token from your server (role_type=2)
  2. Load Iframe → Point to Zoom agent portal with token
  3. Enter PIN → Agent inputs customer's 6-digit PIN
  4. Connectsession_joined event fires
  5. View Session → Agent sees customer's browser
  6. Use Tools → Annotations, remote assist, zoom
  7. Leave Session → Click "Leave Cobrowse" button

Session Recovery (Auto-Reconnect)

When customer refreshes the page:

ZoomCobrowseSDK.init(settings, function({ success, session, error }) {
  if (success) {
    const sessionInfo = session.getSessionInfo();
    
    // Check if session is recoverable
    if (sessionInfo.sessionStatus === 'session_recoverable') {
      session.join();  // Auto-rejoin previous session
    } else {
      // Start new session
      session.start({ sdkToken });
    }
  }
});

Recovery window: 2 minutes. After 2 minutes, session ends.

Critical Gotchas and Best Practices

⚠️ CRITICAL: SDK Secret Must Stay Server-Side

Problem: Developers often accidentally embed SDK Secret in frontend code.

Solution:

  • SDK Key → Safe to expose (embedded in CDN URL)
  • SDK Secret → Never expose (use for JWT signing server-side)
// ❌ WRONG - Secret exposed in frontend
const jwt = signJWT(payload, 'YOUR_SDK_SECRET');  // Security risk!

// ✅ CORRECT - Secret stays on server
const response = await fetch('/api/token', {
  method: 'POST',
  body: JSON.stringify({ role: 1, userId, userName })
});
const { token } = await response.json();

SDK Key vs API Key (Different Purposes!)

Credential Used For JWT Claim
SDK Key CDN URL, JWT app_key app_key: "SDK_KEY"
API Key REST API calls (optional) Not used in JWT

Common mistake: Using API Key instead of SDK Key in JWT app_key claim.

Session Limits

Limit Value What Happens
Customers per session 1 Error 1012: SESSION_CUSTOMER_COUNT_LIMIT
Agents per session 5 Error 1013: SESSION_AGENT_COUNT_LIMIT
Active sessions per browser 1 Error 1004: SESSION_COUNT_LIMIT
PIN code length 10 chars max Error 1008: SESSION_PIN_INVALID_FORMAT

Session Timeout Behavior

Event Timeout What Happens
Agent waiting for customer 3 minutes Session ends automatically
Page refresh reconnection 2 minutes Session ends if not reconnected
Reconnection attempts 2 times max Session ends after 2 failed attempts

HTTPS Requirement

Problem: SDK doesn't load on HTTP sites.

Solution:

  • Production: Use HTTPS ✓
  • Development: Use a loopback host for local HTTP testing ✓
  • Development: Use a local HTTPS endpoint with a trusted/self-signed cert if required ✓

Third-Party Cookies Required

Problem: Refresh reconnection doesn't work.

Solution: Enable third-party cookies in browser settings.

Affected scenarios:

  • Browser privacy mode
  • Safari with "Prevent cross-site tracking" enabled
  • Chrome with "Block third-party cookies" enabled

Distribution Method Confusion

Method Use Case Agent Integration BYOP Required
CDN Most use cases Zoom-hosted iframe No (auto PIN)
npm Custom agent UI, full control Custom npm integration Yes (required)

Key Insight: If you want npm integration, you must use BYOP (Bring Your Own PIN) mode.

Cross-Origin Iframe Handling

Problem: Cobrowse doesn't work in cross-origin iframes.

Solution: Inject SDK snippet into cross-origin iframes:

<script>
const ZOOM_SDK_KEY = "YOUR_SDK_KEY_HERE";

(function(r,a,b,f,c,d){r[f]=r[f]||{init:function(){r.ZoomCobrowseSDKInitArgs=arguments}};
var fragment=a.createDocumentFragment();function loadJs(url) {c=a.createElement(b);d=a.getElementsByTagName(b)[0];c.async=false;c.src=url;fragment.appendChild(c);};
loadJs('https://us01-zcb.zoom.us/static/resource/sdk/${ZOOM_SDK_KEY}/js');d.parentNode.insertBefore(fragment,d);})(window,document,'script','ZoomCobrowseSDK');
</script>

Same-origin iframes: No extra setup needed.

Known Limitations

Synchronization Limits

Not synchronized:

  • HTML5 Canvas elements
  • WebGL content
  • Audio and Video elements
  • Shadow DOM
  • PDF rendered with Canvas
  • Web Components

Partially synchronized:

  • Drop-down boxes (only selected result)
  • Date pickers (only selected result)
  • Color pickers (only selected result)

Rendering Limits

  • High-resolution images may be compressed
  • Different screen sizes may cause CSS media query differences
  • Cross-origin images may not render (CORS restrictions)
  • Cross-origin fonts may not render (CORS restrictions)

Masking Limits

Supported:

  • Text nodes ✓
  • Form inputs ✓
  • Select elements ✓

Not supported:

  • <img> elements ✗
  • Links ✗

Complete Documentation Library

This skill includes comprehensive guides organized by category:

Core Concepts

Examples

References

Troubleshooting

Resources


Need help? Start with Integrated Index section below for complete navigation.


Integrated Index

This section was migrated from SKILL.md.

Complete navigation guide for all Cobrowse SDK documentation.

Getting Started (Start Here!)

If you're new to Zoom Cobrowse SDK, follow this learning path:

  1. SKILL.md - Main overview and quick start
  2. 5-Minute Runbook - Preflight checks for common failures
  3. Get Started Guide - Step-by-step setup from credentials to first session
  4. Session Lifecycle - Understand the complete customer and agent flow
  5. Customer Integration - Integrate SDK into your website
  6. Agent Integration - Set up agent portal

Core Concepts

Foundational concepts you need to understand:

Examples and Patterns

Complete working examples for common scenarios:

Session Management

Features

References

Complete API and configuration references:

SDK Reference

  • API Reference - All SDK methods and interfaces

    • ZoomCobrowseSDK.init()
    • session.start()
    • session.join()
    • session.end()
    • session.on()
    • session.getSessionInfo()
  • Settings Reference - All initialization settings

    • allowAgentAnnotation
    • allowCustomerAnnotation
    • piiMask
    • remoteAssist
    • multiTabSessionPersistence
  • Session Events Reference - All event types

    • pincode_updated
    • session_started
    • session_ended
    • agent_joined
    • agent_left
    • session_error
    • session_reconnecting
    • remote_assist_started
    • remote_assist_stopped

Error Reference

  • Error Codes - Complete error code reference
    • 1001-1017: Session errors
    • 2001: Token errors
    • 9999: Service errors

Official Documentation

Troubleshooting

Quick diagnostics and common issue resolution:

  • Common Issues - Quick fixes for frequent problems

    • SDK not loading
    • Token generation fails
    • Agent can't connect
    • Fields not masked
    • Session doesn't reconnect after refresh
  • Error Codes - Error code lookup and solutions

    • Session start/join failures (1001, 1011, 1016)
    • Session limit errors (1002, 1004, 1012, 1013, 1015)
    • PIN code errors (1006, 1008, 1009, 1010)
    • Token errors (2001)
  • CORS and CSP - Cross-origin and Content Security Policy setup

    • Access-Control-Allow-Origin headers
    • Content-Security-Policy headers
    • Cross-origin iframe handling
    • Same-origin iframe handling
  • Browser Compatibility - Browser requirements and limitations

    • Supported browsers (Chrome 80+, Firefox 78+, Safari 14+, Edge 80+)
    • Internet Explorer not supported
    • Privacy mode limitations
    • Third-party cookie requirements

By Use Case

Find documentation by what you're trying to do:

I want to...

Set up cobrowse for the first time:

Add annotation tools:

Hide sensitive data from agents:

Let agents control customer's page:

Use custom PIN codes:

Handle page refreshes:

Integrate with npm (not CDN):

Debug session connection issues:

Configure CORS and CSP headers:

By Error Code

Quick lookup for error code solutions:

Session Errors

PIN Errors

Auth Errors

Service Errors

Official Resources

External documentation and samples:

Documentation Structure

cobrowse-sdk/
├── SKILL.md                    # Main skill entry point
├── SKILL.md                    # This file - complete navigation
├── get-started.md              # Step-by-step setup guide
│
├── concepts/                   # Core concepts
│   ├── two-roles-pattern.md
│   ├── session-lifecycle.md
│   ├── jwt-authentication.md
│   └── distribution-methods.md
│
├── examples/                   # Working examples
│   ├── customer-integration.md
│   ├── agent-integration.md
│   ├── annotations.md
│   ├── privacy-masking.md
│   ├── remote-assist.md
│   ├── multi-tab-persistence.md
│   ├── byop-custom-pin.md
│   ├── session-events.md
│   └── auto-reconnection.md
│
├── references/                 # API and config references
│   ├── api-reference.md        # SDK methods
│   ├── settings-reference.md   # Init settings
│   ├── session-events.md       # Event types
│   ├── error-codes.md          # Error reference
│   ├── get-started.md          # Official docs (crawled)
│   ├── features.md             # Official docs (crawled)
│   ├── authorization.md        # Official docs (crawled)
│   └── api.md                  # API docs (crawled)
│
└── troubleshooting/            # Problem resolution
    ├── common-issues.md
    ├── error-codes.md
    ├── cors-csp.md
    └── browser-compatibility.md

Search Tips

Find by keyword:


Not finding what you need? Check the Official Documentation or ask on the Dev Forum.

Environment Variables

提供Zoom Contact Center Android SDK的集成指南,涵盖聊天、视频、ZVA及回调功能。支持Campaign模式与服务生命周期管理,包含初始化规范、服务获取及故障排查手册。
Android端集成Zoom CC SDK 实现原生聊天或视频通话 处理Campaign模式逻辑 SDK生命周期管理与调试
partner-built/zoom-plugin/skills/contact-center/android/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill contact-center/android -g -y
SKILL.md
Frontmatter
{
    "name": "contact-center\/android",
    "triggers": [
        "contact center android",
        "zcc android",
        "zoomccinterface android",
        "zoomccchatservice",
        "zoomccvideoservice",
        "releasezoomccservice",
        "android rejoin"
    ],
    "description": "Zoom Contact Center SDK for Android. Use for native Android chat\/video\/ZVA\/scheduled callback integrations, campaign mode, service lifecycle, and rejoin handling.",
    "user-invocable": false
}

Zoom Contact Center SDK - Android

Official docs:

Quick Links

  1. concepts/sdk-lifecycle.md
  2. examples/service-patterns.md
  3. references/android-reference-map.md
  4. troubleshooting/common-issues.md

SDK Surface Summary

  • SDK manager: ZoomCCInterface
  • Channel services:
  • getZoomCCChatService()
  • getZoomCCVideoService()
  • getZoomCCZVAService()
  • getZoomCCScheduledCallbackService()
  • Campaign support via web campaign service and campaign metadata.

Hard Guardrails

  • Initialize SDK in Application.onCreate.
  • Use ZoomCCItem to define channel + identifiers.
  • Use entryId for chat/video/ZVA.
  • Use apiKey for scheduled callback and campaign mode.
  • Release services on teardown.

Common Chains

Operations

  • RUNBOOK.md - 5-minute preflight and debugging checklist.
提供 Zoom Contact Center iOS SDK 的集成指南,支持原生聊天、视频、ZVA 及回调功能。涵盖生命周期管理、重连流程、上下文配置及常见错误排查,确保应用与 Zoom 通话服务的稳定桥接。
iOS 平台集成 Zoom 呼叫中心功能 实现原生聊天或视频会议交互 处理应用生命周期状态同步 解决 SDK 初始化或重连问题
partner-built/zoom-plugin/skills/contact-center/ios/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill contact-center/ios -g -y
SKILL.md
Frontmatter
{
    "name": "contact-center\/ios",
    "triggers": [
        "contact center ios",
        "zcc ios",
        "zoomccinterface ios",
        "handleRejoinVideoOpenURL",
        "zoomccservicedelegate",
        "scheduled callback ios"
    ],
    "description": "Zoom Contact Center SDK for iOS. Use for native iOS chat\/video\/ZVA\/scheduled callback integrations, app lifecycle bridging, rejoin flow, and callback handling.",
    "user-invocable": false
}

Zoom Contact Center SDK - iOS

Official docs:

Quick Links

  1. concepts/sdk-lifecycle.md
  2. examples/service-patterns.md
  3. references/ios-reference-map.md
  4. troubleshooting/common-issues.md

SDK Surface Summary

  • Manager: ZoomCCInterface.sharedInstance()
  • Context: ZoomCCContext
  • Items: ZoomCCItem
  • Services:
  • chatService
  • zvaService
  • videoService
  • scheduledCallbackService

Hard Guardrails

  • Set ZoomCCContext before channel operations.
  • Forward app lifecycle calls (appDidBecomeActive, appDidEnterBackgroud, appWillResignActive, appWillTerminate).
  • Use item-based initialization for channels.
  • Keep rejoin URL handling connected to the video service path.

Common Chains

Operations

  • RUNBOOK.md - 5-minute preflight and debugging checklist.
Zoom Contact Center 集成参考技能,指导在 Zoom 客户端、Web 嵌入及原生移动端构建应用。涵盖路由守卫、架构生命周期、渠道状态处理、活动管理及版本漂移故障排查,提供各平台详细文档与快速链接。
构建 Zoom Contact Center 应用 实现 Web 或原生移动端集成 处理会话上下文与状态 配置营销活动或回调 排查版本兼容性故障
partner-built/zoom-plugin/skills/contact-center/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill build-zoom-contact-center-app -g -y
SKILL.md
Frontmatter
{
    "name": "build-zoom-contact-center-app",
    "triggers": [
        "contact center sdk",
        "zoom contact center",
        "zcc",
        "engagement context",
        "engagement status",
        "campaign sdk",
        "scheduled callback",
        "getengagementcontext",
        "onengagementstatuschange",
        "zoom contact center app"
    ],
    "description": "Reference skill for Zoom Contact Center. Use after routing to a contact-center workflow when implementing app, web, or native integrations; engagement context and state handling; campaigns; callbacks; or version-drift troubleshooting."
}

/build-zoom-contact-center-app

Background reference for Zoom Contact Center integrations across app, web, and native mobile surfaces.

Implementation guidance for Zoom Contact Center across:

  • Contact Center apps in the Zoom client (Zoom Apps SDK path)
  • Web channel embeds (chat/video/campaign)
  • Native mobile SDKs (Android/iOS)

Official docs:

Routing Guardrail

  • If the user is building an app inside the Zoom Contact Center desktop client, stay on the Zoom Apps SDK path and use this skill plus zoom-apps-sdk.
  • If the user is embedding chat/video widgets on a website, route to web/SKILL.md.
  • If the user is integrating native Android or iOS SDK binaries, route to android/SKILL.md or ios/SKILL.md.
  • If the user needs Contact Center call-control or queue APIs, chain with ../rest-api/SKILL.md.

Quick Links

Start here:

  1. concepts/architecture-and-lifecycle.md
  2. scenarios/high-level-scenarios.md
  3. references/forum-top-questions.md
  4. references/versioning-and-compatibility.md
  5. references/samples-validation.md
  6. references/environment-variables.md
  7. troubleshooting/common-drift-and-breaks.md
  8. RUNBOOK.md

Platform skills:

Documentation Structure

contact-center/
├── SKILL.md
├── RUNBOOK.md
├── concepts/
│   └── architecture-and-lifecycle.md
├── scenarios/
│   └── high-level-scenarios.md
├── references/
│   ├── versioning-and-compatibility.md
│   ├── samples-validation.md
│   └── environment-variables.md
├── troubleshooting/
│   └── common-drift-and-breaks.md
├── android/
│   ├── SKILL.md
│   ├── concepts/sdk-lifecycle.md
│   ├── examples/service-patterns.md
│   ├── references/android-reference-map.md
│   └── troubleshooting/common-issues.md
├── ios/
│   ├── SKILL.md
│   ├── concepts/sdk-lifecycle.md
│   ├── examples/service-patterns.md
│   ├── references/ios-reference-map.md
│   └── troubleshooting/common-issues.md
└── web/
    ├── SKILL.md
    ├── concepts/lifecycle-and-events.md
    ├── examples/app-context-and-state.md
    ├── references/web-reference-map.md
    └── troubleshooting/common-issues.md

Common Lifecycle Pattern

  1. Initialize platform context early.
  2. Build a channel item (entryId for chat/video/ZVA, apiKey for scheduled callback and campaign flows).
  3. Get service/client instance.
  4. Register listeners/delegates before user interaction.
  5. Start flow (fetchUI, startVideo, or web SDK open/show path).
  6. Handle engagement state changes (start, hold, resume, end) and context switching.
  7. End flow and release resources (endChat/endVideo, logout/logoff, uninitialize/release).

High-Level Scenarios

  • Agent side-panel app that stores notes per engagementId and survives context switching.
  • Browser chat/video campaigns launched from web tags.
  • Native mobile customer app for chat/video/scheduled callback.
  • Campaign-driven channel selection (chat, ZVA, video, scheduled callback).
  • Rejoin flow for dropped video engagements on mobile.
  • Smart Embed CRM softphone with postMessage event contracts.

See scenarios/high-level-scenarios.md for details.

Chaining

Environment Variables

Zoom Contact Center Web SDK,用于Web聊天、视频及活动嵌入。支持外部网站嵌入、Smart Embed postMessage工作流及应用上下文集成。提供生命周期事件处理、状态持久化及安全校验指南,并链接至OAuth和Cobrowse等关联技能。
需要实现Zoom Web端聊天或视频功能 开发Zoom Contact Center的Web嵌入应用 处理Smart Embed的postMessage通信 调试Zoom Web SDK集成问题
partner-built/zoom-plugin/skills/contact-center/web/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill contact-center/web -g -y
SKILL.md
Frontmatter
{
    "name": "contact-center\/web",
    "triggers": [
        "contact center web",
        "zcc web sdk",
        "getengagementcontext web",
        "onengagementcontextchange",
        "contact center smart embed",
        "zcc-init-config-request"
    ],
    "description": "Zoom Contact Center SDK for Web. Use for web chat\/video\/campaign embeds, engagement event handling, app-context integrations, and Smart Embed postMessage workflows.",
    "user-invocable": false
}

Zoom Contact Center SDK - Web

Official docs:

Quick Links

  1. concepts/lifecycle-and-events.md
  2. examples/app-context-and-state.md
  3. references/web-reference-map.md
  4. troubleshooting/common-issues.md

Integration Modes

  1. Contact Center App in Zoom client:
  • Zoom Apps SDK engagement APIs/events.
  1. External website embed:
  • Campaign SDK/web scripts (zoomCampaignSdk pattern).
  • Video client initialization pattern.
  1. Smart Embed:
  • iframe + postMessage event contract.

Hard Guardrails

  • For campaign SDK, gate calls behind zoomCampaignSdk:ready.
  • Persist state by engagementId.
  • Expect context switching and background app behavior.
  • Validate CSP and allow-list settings before debugging logic.

Chaining

Operations

  • RUNBOOK.md - 5-minute preflight and debugging checklist.
用于快速调试已构建但失败的 Zoom 集成。通过五步分层排查法(认证、请求、SDK、媒体、MCP)隔离故障层,收集关键证据并输出假设、修复方案及验证步骤。
Zoom 集成功能报错或失败 需要隔离认证、Webhook、SDK 或 MCP 传输等具体故障层
partner-built/zoom-plugin/skills/debug-zoom-integration/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill debug-zoom-integration -g -y
SKILL.md
Frontmatter
{
    "name": "debug-zoom-integration",
    "description": "Debug broken Zoom implementations quickly. Use when auth, webhooks, SDK joins, MCP transport, or real-time media workflows are failing and you need to isolate the layer before proposing a fix.",
    "user-invocable": false
}

Debug Zoom Integration

Use this skill when the user already built something and it is failing.

Triage Order

  1. Auth and app configuration
  2. Request construction or event verification
  3. SDK initialization or platform mismatch
  4. Media/session behavior
  5. MCP transport and capability assumptions

Evidence To Request

  • Exact error text
  • Platform and SDK/runtime
  • Relevant request or payload sample
  • What worked versus what failed
  • Whether the issue is reproducible or intermittent

Reference Routing

Output

  • Most likely failing layer
  • Ranked hypotheses
  • Short fix plan
  • Verification steps
用于调试Zoom集成故障,定位认证、API、Webhook或SDK等失败点。通过收集错误信息生成按可能性排序的假设列表,提供针对性修复步骤和验证清单,并路由至相关文档。
Zoom集成出现认证失败 API请求异常 Webhook事件处理错误 SDK初始化或会话行为问题 MCP传输层故障
partner-built/zoom-plugin/skills/debug-zoom/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill debug-zoom -g -y
SKILL.md
Frontmatter
{
    "name": "debug-zoom",
    "description": "Debug a broken Zoom integration by isolating the failure point and routing into the right Zoom references. Use when auth, API, webhook, SDK, or MCP behavior is failing and you need a ranked hypothesis list plus verification steps.",
    "argument-hint": "<symptoms, error, or failing flow>"
}

/debug-zoom

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Debug Zoom auth, API, webhook, SDK, or MCP issues without wandering through the entire docs set.

Usage

/debug-zoom $ARGUMENTS

Workflow

  1. Identify the failing layer: auth, API request, webhook, SDK init, media/session behavior, or MCP transport.
  2. Ask for the minimum missing evidence: exact error, platform, request/response, event payload, or code path.
  3. Produce 2-4 plausible causes ranked by likelihood.
  4. Route to the most relevant deep references in skills/.
  5. Give a short verification plan so the user can confirm the fix.

Output

  • Most likely failure layer
  • Ranked hypotheses
  • Targeted fix steps
  • Verification checklist
  • Relevant skill links

Related Skills

用于设计 Zoom MCP 工作流,评估任务是否适合使用 MCP 工具调用而非仅 REST API。涵盖边界划分、混合架构设计及路由策略,避免将确定性后端任务误用为 MCP。
决定 Zoom MCP 是否适合特定任务时 规划基于工具的 AI 工作流时 需要区分 MCP 职责与 REST API 职责时
partner-built/zoom-plugin/skills/design-mcp-workflow/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill design-mcp-workflow -g -y
SKILL.md
Frontmatter
{
    "name": "design-mcp-workflow",
    "description": "Design a Zoom MCP workflow for Claude. Use when deciding whether Zoom MCP fits a task, when planning tool-based AI workflows, or when separating MCP responsibilities from REST API responsibilities.",
    "user-invocable": false
}

Design MCP Workflow

Use this skill when the user wants Claude or another MCP-capable client to interact with Zoom via tool calls instead of only deterministic API code.

Covers

  • MCP fit assessment
  • REST API vs MCP boundaries
  • Hybrid architectures
  • Connector expectations
  • Whiteboard-specific MCP routing

Workflow

  1. Decide whether the problem is agentic tooling, deterministic automation, or both.
  2. Route MCP-only tasks to zoom-mcp.
  3. Route hybrid tasks to both zoom-mcp and rest-api.
  4. If Whiteboard is central, route to zoom-mcp/whiteboard.
  5. Call out transport, auth, and client capability assumptions explicitly.

Common Mistakes

  • Using MCP for deterministic backend jobs that should stay in REST
  • Treating MCP as a replacement for all API design
  • Ignoring client transport support and auth requirements
Zoom跨产品通用参考技能,作为分类器和路由层,根据查询信号识别主要及次要技能(如REST API、OAuth、Webhooks等),并处理复杂开发者查询的链式调用与引导。
需要跨产品Zoom平台指导 进行应用模型比较或认证上下文分析 确定API与MCP的路由策略 处理包含多种技术栈信号的复杂开发者查询
partner-built/zoom-plugin/skills/general/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill zoom-general -g -y
SKILL.md
Frontmatter
{
    "name": "zoom-general",
    "triggers": [
        "zoom integration",
        "getting started",
        "which zoom sdk",
        "zoom platform",
        "choose zoom api",
        "zoom scopes",
        "marketplace",
        "cross-product",
        "apis vs mcp",
        "api vs mcp"
    ],
    "description": "Cross-product Zoom reference skill. Use after the workflow is clear when you need shared platform guidance, app-model comparisons, authentication context, scopes, marketplace considerations, or API-vs-MCP routing.",
    "user-invocable": false
}

Zoom General (Cross-Product Skills)

Background reference for cross-product Zoom questions. Prefer the workflow skills first, then use this file for shared platform guidance and routing detail.

How zoom-general Routes a Complex Developer Query

Use zoom-general as the classifier and chaining layer:

  1. detect product signals in the query
  2. pick one primary skill
  3. attach secondary skills for auth, events, or deployment edges
  4. ask one short clarifier only when two routes match with similar confidence

Minimal implementation:

type SkillId =
  | 'zoom-general'
  | 'zoom-rest-api'
  | 'zoom-webhooks'
  | 'zoom-oauth'
  | 'zoom-meeting-sdk-web-component-view'
  | 'zoom-video-sdk'
  | 'zoom-mcp';

const hasAny = (q: string, words: string[]) => words.some((w) => q.includes(w));

function detectSignals(rawQuery: string) {
  const q = rawQuery.toLowerCase();
  return {
    meetingCustomUi: hasAny(q, ['zoom meeting', 'custom ui', 'component view', 'embed meeting']),
    customVideo: hasAny(q, ['video sdk', 'custom video session', 'peer-video-state-change']),
    restApi: hasAny(q, ['rest api', '/v2/', 'create meeting', 'list users', 's2s oauth']),
    webhooks: hasAny(q, ['webhook', 'x-zm-signature', 'event subscription', 'crc']),
    oauth: hasAny(q, ['oauth', 'pkce', 'token refresh', 'account_credentials']),
    mcp: hasAny(q, ['zoom mcp', 'agentic retrieval', 'tools/list', 'semantic meeting search']),
  };
}

function pickPrimarySkill(s: ReturnType<typeof detectSignals>): SkillId {
  if (s.meetingCustomUi) return 'zoom-meeting-sdk-web-component-view';
  if (s.mcp) return 'zoom-mcp';
  if (s.restApi) return 'zoom-rest-api';
  if (s.customVideo) return 'zoom-video-sdk';
  return 'zoom-general';
}

function buildChain(primary: SkillId, s: ReturnType<typeof detectSignals>): SkillId[] {
  const chain = [primary];
  if (s.oauth && !chain.includes('zoom-oauth')) chain.push('zoom-oauth');
  if (s.webhooks && !chain.includes('zoom-webhooks')) chain.push('zoom-webhooks');
  return chain;
}

Example:

  • Create a meeting, configure webhooks, and handle OAuth token refresh -> zoom-rest-api -> zoom-oauth -> zoom-webhooks
  • Build a custom video UI for a Zoom meeting on web -> zoom-meeting-sdk-web-component-view

For the full TypeScript implementation and handoff contract, use references/routing-implementation.md.

Choose Your Path

I want to... Use this skill
Build a custom web UI around a real Zoom meeting zoom-meeting-sdk-web-component-view
Build deterministic automation/configuration/reporting with explicit request control zoom-rest-api
Receive event notifications (HTTP push) zoom-webhooks
Receive event notifications (WebSocket, low-latency) zoom-websockets
Embed Zoom meetings in my app zoom-meeting-sdk
Build custom video experiences (Web, React Native, Flutter, Android, iOS, macOS, Unity, Linux) zoom-video-sdk
Build an app that runs inside Zoom client zoom-apps-sdk
Transcribe uploaded or stored media with AI Services Scribe scribe
Access live audio/video/transcripts from meetings zoom-rtms
Enable collaborative browsing for support zoom-cobrowse-sdk
Build Contact Center apps and channel integrations contact-center
Build Virtual Agent web/mobile chatbot experiences virtual-agent
Build Zoom Phone integrations (Smart Embed, Phone API, webhooks, URI flows) phone
Build Team Chat apps and integrations zoom-team-chat
Build server-side integrations with Rivet (auth + webhooks + APIs) rivet-sdk
Run browser/device/network preflight diagnostics before join probe-sdk
Add pre-built UI components for Video SDK zoom-ui-toolkit
Implement OAuth authentication (all grant types) zoom-oauth
Build AI-driven tool workflows (AI Companion/agents) over Zoom data zoom-mcp
Build AI-driven Whiteboard workflows over Zoom Whiteboard MCP zoom-mcp/whiteboard
Build enterprise AI systems with stable API core + AI tool layer zoom-rest-api + zoom-mcp

Planning Checkpoint: Rivet SDK (Optional)

When a user starts planning a server-side integration that combines auth + webhooks + API calls, ask this first:

  • Rivet SDK is a Node.js framework that bundles Zoom auth handling, webhook receivers, and typed API wrappers.
  • Do you want to use Rivet SDK for faster scaffolding, or do you prefer a direct OAuth + REST implementation without Rivet?

Routing after answer:

  • If user chooses Rivet: chain rivet-sdk + oauth + rest-api.
  • If user declines Rivet: chain oauth + rest-api (+ webhooks or product skill as needed).

SDK vs REST Routing Matrix (Hard Stop)

User intent Correct path Do not route to
Embed Zoom meeting in app UI zoom-meeting-sdk REST-only join_url flow
Build custom web UI for a real Zoom meeting zoom-meeting-sdk-web-component-view zoom-video-sdk
Build custom video UI/session app zoom-video-sdk Meeting SDK or REST meeting links
Get browser join links / manage meeting resources zoom-rest-api Meeting SDK join implementation

Routing guardrails:

  • If user asks for SDK embed/join behavior, stay in SDK path.
  • If the prompt says meeting plus custom UI/video/layout/embed, prefer zoom-meeting-sdk-web-component-view.
  • Only use zoom-video-sdk when the user is building a custom session product rather than a Zoom meeting.
  • Only use REST path for resource management, reporting, or link distribution unless user explicitly requests a mixed architecture.
  • For executable classification/chaining logic and error handling, see references/routing-implementation.md.

API vs MCP Routing Matrix (Hard Stop)

User intent Correct path Why
Deterministic backend automation, account/user configuration, reporting, scheduled jobs zoom-rest-api Explicit request/response control and repeatable behavior
AI agent chooses tools dynamically, cross-platform AI tool interoperability zoom-mcp MCP is optimized for dynamic tool discovery and agentic workflows
Enterprise AI architecture (stable core + adaptive AI layer) zoom-rest-api + zoom-mcp APIs run core system actions; MCP exposes curated AI tools/context

Routing guardrails:

  • Do not replace deterministic backend APIs with MCP-only routing.
  • Do not force raw REST-first routing when the task is AI-agent tool orchestration.
  • Prefer hybrid routing when the user needs both stable automation and AI-driven interactions.
  • MCP remote server works over Streamable HTTP/SSE; use this path when the target client/agent supports MCP transports (for example Claude or VS Code).
  • Do not design per-tenant custom MCP endpoint provisioning; Zoom MCP endpoints are shared at instance/cluster level.
  • Source: https://developers.zoom.us/docs/mcp/library/resources/apis-vs-mcp/

Ambiguity Resolution (Ask Before Routing)

When a prompt matches both API and MCP paths with similar confidence, ask one short clarifier before execution:

  • Do you want deterministic REST API automation, AI-agent MCP tooling, or a hybrid of both?

Then route as:

  • REST answer → zoom-rest-api
  • MCP answer → zoom-mcp
  • Hybrid answer → zoom-rest-api + zoom-mcp

MCP Availability and Topology Notes

  • Zoom-hosted MCP access is evolving; docs indicate a model where Zoom exposes product-scoped MCP servers (for example Meetings, Team Chat, Whiteboard).
  • Use zoom-mcp as the parent MCP entry point.
  • Route Whiteboard-specific MCP requests to zoom-mcp/whiteboard.
  • When a request is product-specific and MCP coverage exists, route to that MCP product surface first; otherwise use REST/SDK skills for deterministic implementation.

Webhooks vs WebSockets

Both receive event notifications, but differ in approach:

Aspect webhooks zoom-websockets
Connection HTTP POST to your endpoint Persistent WebSocket
Latency Higher Lower
Security Requires public endpoint No exposed endpoint
Setup Simpler More complex
Best for Most use cases Real-time, security-sensitive

Common Use Cases

Use Case Description Skills Needed
Meeting + Webhooks + OAuth Refresh Create a meeting, process real-time updates, and refresh OAuth tokens safely in one design zoom-rest-api + zoom-oauth + zoom-webhooks
Scribe Transcription Pipeline Transcribe uploaded files or S3 archives with AI Services Scribe using fast mode or batch jobs scribe + optional zoom-rest-api + optional zoom-webhooks
APIs vs MCP Routing Decide whether to route to deterministic Zoom APIs, AI-driven MCP, or a hybrid design zoom-rest-api and/or zoom-mcp
Custom Meeting UI (Web) Build a custom video UI for a real Zoom meeting in a web app using Meeting SDK Component View zoom-meeting-sdk-web-component-view + zoom-oauth
Meeting Automation Schedule, update, delete meetings programmatically zoom-rest-api
Meeting Bots Build bots that join meetings for AI/transcription/recording meeting-sdk/linux + zoom-rest-api + optional zoom-webhooks
High-Volume Meeting Platform Design distributed meeting creation and event processing with retries, queues, and reconciliation zoom-rest-api + zoom-webhooks + zoom-oauth
Recording & Transcription Download recordings, get transcripts zoom-webhooks + zoom-rest-api
Recording Download Pipeline Auto-download recordings to your own storage (S3, GCS, etc.) zoom-webhooks + zoom-rest-api
Real-Time Media Streams Access live audio, video, transcripts via WebSocket zoom-rtms + zoom-webhooks
In-Meeting Apps Build apps that run inside Zoom meetings zoom-apps-sdk + zoom-oauth
React Native Meeting Embed Embed meetings into iOS/Android React Native apps zoom-meeting-sdk-react-native + zoom-oauth
Native Meeting SDK Multi-Platform Delivery Align Android, iOS, macOS, and Unreal Meeting SDK implementations under one auth/version strategy zoom-meeting-sdk + platform skills
Native Video SDK Multi-Platform Delivery Align Android, iOS, macOS, and Unity Video SDK implementations under one auth/version strategy zoom-video-sdk + platform skills
Electron Meeting Embed Embed meetings into desktop Electron apps zoom-meeting-sdk-electron + zoom-oauth
Flutter Video Sessions Build custom mobile video sessions in Flutter zoom-video-sdk-flutter + zoom-oauth
React Native Video Sessions Build custom mobile video sessions in React Native zoom-video-sdk-react-native + zoom-oauth
Immersive Experiences Custom video layouts with Layers API zoom-apps-sdk
Collaborative Apps Real-time shared state in meetings zoom-apps-sdk
Contact Center App Lifecycle and Context Switching Build Contact Center apps that handle engagement events and multi-engagement state contact-center + zoom-apps-sdk
Virtual Agent Campaign Web and Mobile Wrapper Deliver one campaign-driven bot flow across web and native mobile wrappers virtual-agent + contact-center
Virtual Agent Knowledge Base Sync Pipeline Sync external knowledge content into Zoom Virtual Agent using web sync or custom API connectors virtual-agent + zoom-rest-api + zoom-oauth
Zoom Phone Smart Embed CRM Integration Build CRM dialer and call logging flows using Smart Embed plus Phone APIs phone + zoom-oauth + zoom-webhooks
Rivet Event-Driven API Orchestrator Build a Node.js backend that combines webhooks and API actions through Rivet module clients rivet-sdk + zoom-oauth + zoom-rest-api
Probe SDK Preflight Readiness Gate Add browser/device/network diagnostics and readiness policy before Meeting SDK or Video SDK joins probe-sdk + zoom-meeting-sdk or zoom-video-sdk

Complete Use-Case Index

Prerequisites

  1. Zoom account (Pro, Business, or Enterprise)
  2. App created in Zoom App Marketplace
  3. OAuth credentials (Client ID and Secret)

References

Quick Start

  1. Go to marketplace.zoom.us
  2. Click DevelopBuild App
  3. Select app type (see references/app-types.md)
  4. Configure OAuth and scopes
  5. Copy credentials to your application

Detailed References

SDK Maintenance

Resources

Environment Variables

Operations

  • RUNBOOK.md - 5-minute preflight and debugging checklist.
用于在Android原生应用中集成Zoom会议SDK。支持默认或自定义UI、PKCE认证、加入/开始流程及API集成,涵盖架构、生命周期、调试排错等开发指南。
需要在Android应用中嵌入Zoom会议功能 实现Zoom Meeting SDK的认证与会话管理 解决Zoom Android SDK集成中的架构或兼容性问题
partner-built/zoom-plugin/skills/meeting-sdk/android/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill zoom-meeting-sdk-android -g -y
SKILL.md
Frontmatter
{
    "name": "zoom-meeting-sdk-android",
    "triggers": [
        "meeting sdk android",
        "zoom android sdk",
        "android default ui",
        "android custom ui",
        "join meeting android",
        "start meeting android"
    ],
    "description": "Zoom Meeting SDK for Android native apps. Use when embedding Zoom meetings in Android with\ndefault\/custom UI, PKCE + SDK auth, join\/start flows, and Meeting SDK API integration.\n",
    "user-invocable": false
}

Zoom Meeting SDK (Android)

Use this skill when building Android apps with embedded Zoom meeting capabilities.

Start Here

  1. android.md
  2. concepts/lifecycle-workflow.md
  3. concepts/architecture.md
  4. examples/join-start-pattern.md
  5. scenarios/high-level-scenarios.md
  6. references/android-reference-map.md
  7. references/environment-variables.md
  8. references/versioning-and-compatibility.md
  9. troubleshooting/common-issues.md

Routing Notes

Key Sources

Operations

  • RUNBOOK.md - 5-minute preflight and debugging checklist.
用于在Electron桌面应用中嵌入Zoom会议SDK的技能。涵盖通过Node addon集成、JWT认证、加入/开始流程、设置控制及原始数据交互,提供生命周期管理、架构模式及安全加固指导。
需要在Electron应用中集成Zoom会议功能 处理Zoom SDK的JWT认证与会话管理 解决Electron环境下Zoom SDK的架构或兼容性问题
partner-built/zoom-plugin/skills/meeting-sdk/electron/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill zoom-meeting-sdk-electron -g -y
SKILL.md
Frontmatter
{
    "name": "zoom-meeting-sdk-electron",
    "triggers": [
        "electron meeting sdk",
        "zoom meeting sdk electron",
        "embed zoom in electron",
        "electron zoom bot",
        "zoom node addon",
        "zoom raw data electron"
    ],
    "description": "Zoom Meeting SDK for Electron desktop applications. Use when embedding Zoom meetings in an Electron app\nwith the Node addon wrapper, JWT auth, join\/start flows, settings controllers, and raw data integration.\n",
    "user-invocable": false
}

Zoom Meeting SDK (Electron)

Use this skill when building Electron desktop apps that embed Zoom Meeting SDK capabilities through the Electron wrapper.

Start Here

  1. Lifecycle Workflow - init -> auth -> join/start -> in-meeting -> cleanup
  2. SDK Architecture Pattern - service/controller/event model in Electron
  3. Setup Guide - dependency and build expectations
  4. Authentication Pattern - SDK JWT generation and auth callbacks
  5. Join Meeting Pattern - start/join meeting execution flow
  6. SKILL.md - full navigation

Core Notes

  • Electron wrapper is built on top of native Meeting SDK with Node addon bridges.
  • Keep SDK key/secret server-side; generate SDK JWT on backend.
  • Feature support differs by platform/version; check module docs before implementation.
  • Raw data and IPC patterns require explicit security hardening in production.

References

Related Skills

Merged from meeting-sdk/electron/SKILL.md

Zoom Meeting SDK Electron - Documentation Index

Start Here

  1. SKILL.md
  2. Lifecycle Workflow
  3. SDK Architecture Pattern
  4. Setup Guide

Concepts

Examples

References

Troubleshooting

Operations

  • RUNBOOK.md - 5-minute preflight and debugging checklist.
用于在iOS原生应用中嵌入Zoom会议功能。支持自定义UI、PKCE认证、ZAK主机启动及移动端生命周期管理,提供架构、接入模式及故障排查指南。
需要在iOS App中集成视频会议功能 处理Zoom iOS SDK的认证与生命周期 解决Zoom Meeting SDK相关的连接或兼容性问题
partner-built/zoom-plugin/skills/meeting-sdk/ios/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill zoom-meeting-sdk-ios -g -y
SKILL.md
Frontmatter
{
    "name": "zoom-meeting-sdk-ios",
    "triggers": [
        "meeting sdk ios",
        "zoom ios sdk",
        "mobilertc ios",
        "ios default ui",
        "ios custom ui",
        "join meeting ios",
        "start meeting ios"
    ],
    "description": "Zoom Meeting SDK for iOS native apps. Use when embedding Zoom meetings in iOS with\ndefault\/custom UI, PKCE + SDK auth, host start with ZAK, and mobile lifecycle handling.\n",
    "user-invocable": false
}
指导在Linux上使用Zoom Meeting SDK构建无头会议机器人。支持C++开发,实现自动加入会议、原始音视频捕获、转录及AI集成。涵盖本地录制与云端录制流程,提供代码示例和架构参考,适用于服务器端自动化场景。
需要在Linux上开发Zoom会议机器人 需要获取会议原始音视频数据用于AI处理 需要实现会议自动录制功能 需要集成Zoom SDK进行服务器端会议自动化
partner-built/zoom-plugin/skills/meeting-sdk/linux/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill meeting-sdk/linux -g -y
SKILL.md
Frontmatter
{
    "name": "meeting-sdk\/linux",
    "triggers": [
        "linux meeting bot",
        "headless zoom bot",
        "meeting sdk linux",
        "zoom raw recording linux",
        "meeting transcription bot",
        "zoom docker bot",
        "pulseaudio zoom",
        "meeting sdk raw data"
    ],
    "description": "Zoom Meeting SDK for Linux - C++ headless meeting bots with raw audio\/video access, transcription, recording, and AI integration for server-side automation",
    "user-invocable": false
}

Zoom Meeting SDK - Linux Development

Expert guidance for building headless meeting bots with the Zoom Meeting SDK on Linux. This SDK enables server-side meeting participation, raw media capture, transcription, and AI-powered meeting automation.

How to Build a Meeting Bot That Automatically Joins and Records

Use this skill when the requirement is:

  • visible bot joins a real Zoom meeting
  • the bot records raw media itself
  • or the bot triggers a Zoom-managed cloud-recording workflow after join

Skill chain:

  • primary: meeting-sdk/linux
  • add zoom-rest-api for OBF/ZAK lookup, scheduling, or cloud-recording settings
  • add zoom-webhooks when post-meeting cloud recording retrieval is required

Minimal raw-recording flow:

JoinParam join_param;
join_param.userType = SDK_UT_WITHOUT_LOGIN;
auto& params = join_param.param.withoutloginuserJoin;
params.meetingNumber = meeting_number;
params.userName = "Recording Bot";
params.psw = meeting_password.c_str();
params.app_privilege_token = obf_token.c_str();

SDKError join_err = meeting_service->Join(join_param);
if (join_err != SDKERR_SUCCESS) {
    throw std::runtime_error("join_failed");
}

// In MEETING_STATUS_INMEETING callback:
auto* record_ctrl = meeting_service->GetMeetingRecordingController();
if (!record_ctrl) {
    throw std::runtime_error("recording_controller_unavailable");
}

if (record_ctrl->CanStartRawRecording() != SDKERR_SUCCESS) {
    throw std::runtime_error("raw_recording_not_permitted");
}

SDKError record_err = record_ctrl->StartRawRecording();
if (record_err != SDKERR_SUCCESS) {
    throw std::runtime_error("start_raw_recording_failed");
}

GetAudioRawdataHelper()->subscribe(new MyAudioDelegate());

Use raw recording when the bot must own PCM/YUV media or feed an AI pipeline directly.
Use cloud recording + webhooks when the requirement is Zoom-managed MP4/M4A/transcript assets after the meeting.

Official Documentation: https://developers.zoom.us/docs/meeting-sdk/linux/
API Reference: https://marketplacefront.zoom.us/sdk/meeting/linux/
Sample Repository (Raw Recording): https://github.com/zoom/meetingsdk-linux-raw-recording-sample
Sample Repository (Headless): https://github.com/zoom/meetingsdk-headless-linux-sample

Quick Links

New to Meeting SDK Linux? Follow this path:

  1. linux.md - Quick start guide with complete workflow
  2. concepts/high-level-scenarios.md - Production bot architectures
  3. meeting-sdk-bot.md - Resilient bot with retry logic
  4. references/linux-reference.md - Dependencies, Docker, CMake

Common Use Cases:

Having issues?

Routing Rule for Bots

If the user asks to build a bot that automatically joins a Zoom meeting and records it, start with meeting-sdk-bot.md.

  • Use Meeting SDK Linux for the visible participant, join flow, and raw recording control.
  • Chain zoom-rest-api when the bot must fetch OBF/ZAK tokens, schedule meetings, or enable account-side recording settings.
  • Chain zoom-webhooks when the requirement is Zoom cloud recording retrieval after meeting end.

SDK Overview

The Zoom Meeting SDK for Linux is a C++ library optimized for headless server environments:

  • Headless Operation: No GUI required, perfect for Docker/cloud
  • Raw Data Access: YUV420 video, PCM audio at 32kHz
  • GLib Event Loop: Async event handling for callbacks
  • Docker-Ready: Pre-configured Dockerfiles for CentOS/Ubuntu
  • PulseAudio Integration: Virtual audio devices for headless environments

Key Differences from Video SDK

Feature Meeting SDK (Linux) Video SDK
Primary Use Join existing meetings as bot Host custom video sessions
Visibility Visible participant Session participant
UI Headless (no UI) Optional custom UI
Authentication JWT + OBF/ZAK for external meetings JWT only
Recording Control StartRawRecording() required Direct raw data access
Platform Linux only Windows, macOS, iOS, Android

Prerequisites

System Requirements

  • OS: Ubuntu 22+, CentOS 8/9, Oracle Linux 8
  • Architecture: x86_64
  • Compiler: gcc/g++ with C++11 support
  • Build Tools: cmake 3.16+

Development Dependencies

# Ubuntu
apt-get install -y build-essential cmake \
    libx11-xcb1 libxcb-xfixes0 libxcb-shape0 libxcb-shm0 \
    libxcb-randr0 libxcb-image0 libxcb-keysyms1 libxcb-xtest0 \
    libglib2.0-dev libcurl4-openssl-dev pulseaudio

# CentOS
yum install -y cmake gcc gcc-c++ \
    libxcb-devel xcb-util-image xcb-util-keysyms \
    glib2-devel libcurl-devel pulseaudio

Required Credentials

  1. Zoom Meeting SDK App (Client ID & Secret) → Create at Marketplace
  2. JWT Token → Generate from Client ID/Secret
  3. For External Meetings: OBF token OR ZAK token → Get via REST API
  4. For Raw Recording: Meeting Recording Token (optional) → Get via API

Quick Start

1. Download & Extract SDK

# Download from https://marketplace.zoom.us/
tar xzf zoom-meeting-sdk-linux_x86_64-{version}.tar

# Organize files
mkdir -p demo/include/h demo/lib/zoom_meeting_sdk
cp -r h/* demo/include/h/
cp lib*.so demo/lib/zoom_meeting_sdk/
cp -r qt_libs demo/lib/zoom_meeting_sdk/
cp translation.json demo/lib/zoom_meeting_sdk/json/

# Create required symlink
cd demo/lib/zoom_meeting_sdk && ln -s libmeetingsdk.so libmeetingsdk.so.1

2. Initialize & Auth

#include "zoom_sdk.h"

USING_ZOOM_SDK_NAMESPACE

// Initialize SDK
InitParam init_params;
init_params.strWebDomain = "https://zoom.us";
init_params.enableLogByDefault = true;
init_params.rawdataOpts.audioRawDataMemoryMode = ZoomSDKRawDataMemoryModeHeap;
InitSDK(init_params);

// Authenticate with JWT
AuthContext auth_ctx;
auth_ctx.jwt_token = your_jwt_token;
CreateAuthService(&auth_service);
auth_service->SDKAuth(auth_ctx);

3. Join Meeting

// In onAuthenticationReturn callback
void onAuthenticationReturn(AuthResult ret) {
    if (ret == AUTHRET_SUCCESS) {
        JoinParam join_param;
        join_param.userType = SDK_UT_WITHOUT_LOGIN;
        
        auto& params = join_param.param.withoutloginuserJoin;
        params.meetingNumber = 1234567890;
        params.userName = "Bot";
        params.psw = "password";
        params.isVideoOff = true;
        params.isAudioOff = false;
        
        meeting_service->Join(join_param);
    }
}

4. Access Raw Data

// In onMeetingStatusChanged callback
void onMeetingStatusChanged(MeetingStatus status, int iResult) {
    if (status == MEETING_STATUS_INMEETING) {
        auto* record_ctrl = meeting_service->GetMeetingRecordingController();
        
        // Start raw recording (enables raw data access)
        if (record_ctrl->CanStartRawRecording() == SDKERR_SUCCESS) {
            record_ctrl->StartRawRecording();
            
            // Subscribe to audio
            auto* audio_helper = GetAudioRawdataHelper();
            audio_helper->subscribe(new MyAudioDelegate());
            
            // Subscribe to video
            IZoomSDKRenderer* video_renderer;
            createRenderer(&video_renderer, new MyVideoDelegate());
            video_renderer->setRawDataResolution(ZoomSDKResolution_720P);
            video_renderer->subscribe(user_id, RAW_DATA_TYPE_VIDEO);
        }
    }
}

Key Features

Feature Description
Headless Operation No GUI, perfect for Docker/server deployments
Raw Audio (PCM) Capture mixed or per-user audio at 32kHz
Raw Video (YUV420) Capture video frames in contiguous planar format
GLib Event Loop Async callback handling
Docker Support Pre-built Dockerfiles for CentOS/Ubuntu
PulseAudio Virtual Devices Audio in headless environments
Breakout Rooms Programmatic breakout room management
Chat Send/receive in-meeting chat
Recording Control Local, cloud, and raw recording

Critical Gotchas & Best Practices

⚠️ CRITICAL: PulseAudio for Docker/Headless

The #1 issue for raw audio in Docker:

Raw audio requires PulseAudio and a config file, even in headless environments.

Solution:

# Install PulseAudio
apt-get install -y pulseaudio pulseaudio-utils

# Create config file
mkdir -p ~/.config
cat > ~/.config/zoomus.conf << EOF
[General]
system.audio.type=default
EOF

# Start PulseAudio with virtual devices
pulseaudio --start --exit-idle-time=-1
pactl load-module module-null-sink sink_name=virtual_speaker
pactl load-module module-null-sink sink_name=virtual_mic

See: references/linux-reference.md#pulseaudio-setup

Raw Recording Permission Required

Unlike Video SDK, Meeting SDK requires explicit permission to access raw data:

// MUST call StartRawRecording() first
auto* record_ctrl = meeting_service->GetMeetingRecordingController();

SDKError can_record = record_ctrl->CanStartRawRecording();
if (can_record == SDKERR_SUCCESS) {
    record_ctrl->StartRawRecording();
    // NOW you can subscribe to audio/video
} else {
    // Need: host/co-host status OR recording token
}

Ways to get permission:

  1. Bot is host/co-host
  2. Host grants recording permission
  3. Use recording_token parameter (get via REST API)
  4. Use app_privilege_token (OBF) when joining

GLib Main Loop Required

SDK callbacks execute via GLib event loop:

#include <glib.h>

// Setup main loop
GMainLoop* loop = g_main_loop_new(NULL, FALSE);

// Add timeout for periodic tasks
g_timeout_add_seconds(10, check_meeting_status, NULL);

// Run loop (blocks until quit)
g_main_loop_run(loop);

Without GLib loop: Callbacks never fire, join hangs indefinitely.

Heap Memory Mode Recommended

Always use heap mode for raw data to avoid stack overflow with large frames:

init_params.rawdataOpts.videoRawDataMemoryMode = ZoomSDKRawDataMemoryModeHeap;
init_params.rawdataOpts.shareRawDataMemoryMode = ZoomSDKRawDataMemoryModeHeap;
init_params.rawdataOpts.audioRawDataMemoryMode = ZoomSDKRawDataMemoryModeHeap;

Thread Safety

SDK callbacks execute on SDK threads:

  • Don't perform heavy operations in callbacks
  • Don't call CleanUPSDK() from within callbacks
  • Use thread-safe queues for data passing
  • Use mutexes for shared state

Production Architectures

Transcription Bot

See: concepts/high-level-scenarios.md#scenario-1

Join Meeting → StartRawRecording → Subscribe Audio → 
Stream to AssemblyAI/Whisper → Generate Real-time Transcript

Recording Bot

See: concepts/high-level-scenarios.md#scenario-2

Join Meeting → StartRawRecording → Subscribe Audio+Video → 
Write YUV+PCM → FFmpeg Merge → Upload to Storage

AI Meeting Assistant

See: concepts/high-level-scenarios.md#scenario-3

Join Meeting → Real-time Transcription → AI Analysis → 
Extract Action Items → Generate Summary

Sample Applications

Official Repositories:

Sample Description Link
Raw Recording Sample Traditional C++ approach with config.txt GitHub
Headless Sample Modern TOML-based with CLI, Docker Compose GitHub

What Each Demonstrates:

  • Raw Recording Sample: Complete raw data workflow, PulseAudio setup, Docker multi-distro support
  • Headless Sample: AssemblyAI integration, Anthropic AI, production-ready config management

Documentation Library

Core Concepts

Platform Reference

Authentication

Advanced Features

Common Issues

Issue Cause Solution
No audio in Docker Missing PulseAudio config Create ~/.config/zoomus.conf
Raw recording denied No permission Use host/co-host OR recording token
Callbacks not firing Missing GLib main loop Add g_main_loop_run()
Build errors (XCB) Missing X11 libraries Install libxcb packages
Segfault on auth OpenSSL version mismatch Install libssl1.1

Complete troubleshooting: references/linux-reference.md#troubleshooting

Resources


Need help? Start with linux.md for quick start, then explore high-level-scenarios.md for production patterns.

Operations

  • RUNBOOK.md - 5-minute preflight and debugging checklist.
用于在macOS原生应用中集成Zoom会议SDK的技能。支持嵌入默认或自定义UI、PKCE认证、主持人启动/加入流程及桌面会议功能控制,提供架构、生命周期及排错指南。
需要在macOS应用中嵌入Zoom视频会议功能 实现Zoom会议的自定义UI界面 处理Zoom SDK的PKCE认证与会话管理 调试macOS平台上的Zoom集成问题
partner-built/zoom-plugin/skills/meeting-sdk/macos/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill zoom-meeting-sdk-macos -g -y
SKILL.md
Frontmatter
{
    "name": "zoom-meeting-sdk-macos",
    "triggers": [
        "meeting sdk macos",
        "zoom macos sdk",
        "mac sdk meeting",
        "mac custom ui",
        "mac default ui",
        "join meeting mac",
        "start meeting mac"
    ],
    "description": "Zoom Meeting SDK for macOS native apps. Use when embedding Zoom meetings in macOS with\ndefault\/custom UI, PKCE + SDK auth, host start\/join flows, and desktop meeting feature controllers.\n",
    "user-invocable": false
}
用于在 React Native iOS/Android 应用中集成 Zoom 会议 SDK。支持初始化、JWT/ZAK 认证、加入和开始会议流程,涵盖原生桥接配置、平台设置及常见问题排查,适用于需嵌入视频会议功能的移动应用开发。
在 React Native 项目中集成 Zoom 视频会议功能 实现 Zoom 会议的加入或开始逻辑 解决 Zoom SDK 在 React Native 中的原生依赖或桥接问题 获取 Zoom JWT 或 ZAK 令牌进行会议鉴权
partner-built/zoom-plugin/skills/meeting-sdk/react-native/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill zoom-meeting-sdk-react-native -g -y
SKILL.md
Frontmatter
{
    "name": "zoom-meeting-sdk-react-native",
    "triggers": [
        "react native meeting sdk",
        "zoom react native",
        "meetingsdk-react-native",
        "join meeting in react native",
        "start meeting with zak",
        "zoom mobile sdk wrapper"
    ],
    "description": "Zoom Meeting SDK for React Native. Use when embedding Zoom meetings in React Native iOS\/Android apps with @zoom\/meetingsdk-react-native, JWT auth, join\/start flows, platform setup, and native bridge troubleshooting.",
    "user-invocable": false
}

Zoom Meeting SDK (React Native)

Use this skill when building React Native apps that need embedded Zoom meeting join/start flows.

Quick Links

  1. Lifecycle Workflow - init -> auth -> join/start -> in-meeting -> cleanup
  2. Architecture - JS wrapper, native bridge, iOS/Android SDK layers
  3. High-Level Scenarios - practical product patterns
  4. Setup Guide - install package + platform requirements
  5. Join Meeting Pattern - JWT + meetingNumber + password
  6. Start Meeting Pattern - ZAK-based host start
  7. SKILL.md - full navigation

Core APIs (Wrapper)

From @zoom/meetingsdk-react-native wrapper surface:

  • initSDK(config)
  • isInitialized()
  • updateMeetingSetting(config)
  • joinMeeting(config)
  • startMeeting(config)
  • cleanup()

See: Wrapper API

Critical Notes

  • You still need native iOS/Android Meeting SDK dependencies configured.
  • joinMeeting and startMeeting return numeric status/error codes from native layer.
  • For host start flow, pass zoomAccessToken (ZAK).
  • Keep JWT generation on backend, never embed SDK secret in app.
  • Current docs note React Native support up to 0.75.4; Expo is not supported.

Platform Guides

Troubleshooting

Related Skills

Documentation Index

Start Here

  1. SKILL.md
  2. Lifecycle Workflow
  3. Architecture
  4. Setup Guide

Concepts

Examples

References

Troubleshooting

Operations

  • RUNBOOK.md - 5-minute preflight and debugging checklist.
Zoom Meeting SDK 嵌入开发的参考技能,涵盖 Web、移动端及桌面端集成。提供路由守卫、前置依赖检查及快速启动指南,指导用户通过 SDK 签名实现会议加入、处理平台特定行为及解决等待室等问题。
在应用中嵌入或加入 Zoom 会议 需要获取平台特定的 SDK 行为支持 处理身份验证与会话加入流程 排查等待室问题 实现会议机器人模式
partner-built/zoom-plugin/skills/meeting-sdk/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill build-zoom-meeting-sdk-app -g -y
SKILL.md
Frontmatter
{
    "name": "build-zoom-meeting-sdk-app",
    "triggers": [
        "embed meeting",
        "embed zoom meeting",
        "integrate meeting",
        "meeting in web app",
        "meeting in website",
        "add zoom to website",
        "meeting sdk",
        "join meeting programmatically",
        "meeting bot",
        "bot joins meeting",
        "joining meeting timeout",
        "join meeting failed",
        "waiting room",
        "hide meeting info",
        "hide meeting password"
    ],
    "description": "Reference skill for Zoom Meeting SDK. Use after routing to a meeting-embed workflow when implementing real Zoom meeting joins, platform-specific SDK behavior, auth and join flows, waiting room issues, or meeting bot patterns."
}

/build-zoom-meeting-sdk-app

Background reference for embedded Zoom meetings across web, mobile, desktop, and Linux bot environments. Prefer build-zoom-meeting-app or build-zoom-bot first, then route here for platform detail.

Zoom Meeting SDK

Embed the full Zoom meeting experience into web, mobile, desktop, and headless integrations.

Hard Routing Guardrail (Read First)

  • If the user asks to embed/join meetings inside their app UI, route to Meeting SDK implementation.
  • Do not switch to REST-only meeting link flow unless the user explicitly asks for meeting resource management or browser join_url links.
  • Meeting SDK join path requires SDK signature + SDK join call; REST join_url is not a Meeting SDK join payload.

Prerequisites

  • Zoom app with Meeting SDK credentials
  • SDK Key and Secret from Marketplace
  • Platform-specific development environment (Web, Android, iOS, macOS, Unreal, Electron, Linux, or Windows)

Need help with OAuth or signatures? See the zoom-oauth skill for authentication flows.

Need pre-join diagnostics on web? Use probe-sdk before Meeting SDK init/join to gate low-readiness devices/networks.

Start troubleshooting fast: Use the 5-Minute Runbook before deep debugging.

Quick Start (Web - Client View via CDN)

<script src="https://source.zoom.us/3.1.6/lib/vendor/react.min.js"></script>
<script src="https://source.zoom.us/3.1.6/lib/vendor/react-dom.min.js"></script>
<script src="https://source.zoom.us/3.1.6/lib/vendor/redux.min.js"></script>
<script src="https://source.zoom.us/3.1.6/lib/vendor/redux-thunk.min.js"></script>
<script src="https://source.zoom.us/3.1.6/lib/vendor/lodash.min.js"></script>
<script src="https://source.zoom.us/3.1.6/zoom-meeting-3.1.6.min.js"></script>

<script>
// CDN provides ZoomMtg (Client View - full page)
// For ZoomMtgEmbedded (Component View), use npm instead

ZoomMtg.preLoadWasm();
ZoomMtg.prepareWebSDK();

ZoomMtg.init({
  leaveUrl: window.location.href,
  patchJsMedia: true,
  disableCORP: !window.crossOriginIsolated,
  success: function() {
    ZoomMtg.join({
      sdkKey: 'YOUR_SDK_KEY',
      signature: 'YOUR_SIGNATURE',  // Generate server-side!
      meetingNumber: 'MEETING_NUMBER',
      userName: 'User Name',
      passWord: '',  // Note: camelCase with capital W
      success: function(res) { console.log('Joined'); },
      error: function(err) { console.error(err); }
    });
  },
  error: function(err) { console.error(err); }
});
</script>

Critical Notes (Web)

1. CDN vs npm - Different APIs!

Distribution Global Object View Type API Style
CDN (zoom-meeting-{ver}.min.js) ZoomMtg Client View (full-page) Callbacks
npm (@zoom/meetingsdk) ZoomMtgEmbedded Component View (embeddable) Promises

2. Backend Required for Production

Never expose SDK Secret in client code. Generate signatures server-side:

// server.js (Node.js example)
const KJUR = require('jsrsasign');

app.post('/api/signature', (req, res) => {
  const { meetingNumber, role } = req.body;
  const iat = Math.floor(Date.now() / 1000) - 30;
  const exp = iat + 60 * 60 * 2;
  
  const header = { alg: 'HS256', typ: 'JWT' };
  const payload = {
    sdkKey: process.env.ZOOM_SDK_KEY,
    mn: String(meetingNumber).replace(/\D/g, ''),
    role: parseInt(role, 10),
    iat, exp, tokenExp: exp
  };
  
  const signature = KJUR.jws.JWS.sign('HS256',
    JSON.stringify(header),
    JSON.stringify(payload),
    process.env.ZOOM_SDK_SECRET
  );
  
  res.json({ signature, sdkKey: process.env.ZOOM_SDK_KEY });
});

3. CSS Conflicts - Avoid Global Resets

Global * { margin: 0; } breaks Zoom's UI. Scope your styles:

/* BAD */
* { margin: 0; padding: 0; }

/* GOOD */
.your-app, .your-app * { box-sizing: border-box; }

4. Client View Toolbar Cropping Fix

If toolbar falls off screen, scale down the Zoom UI:

#zmmtg-root {
  position: fixed !important;
  top: 0 !important;
  left: 0 !important;
  right: 0 !important;
  bottom: 0 !important;
  width: 100vw !important;
  height: 100vh !important;
  /* Critical for SPAs (React/Next/etc): ensure Zoom UI isn't behind your app shell/overlays. */
  z-index: 9999 !important;
  transform: scale(0.95) !important;
  transform-origin: top center !important;
}

5. Hide Your App When Meeting Starts

Client View takes over full page. Hide your UI:

// In ZoomMtg.init success callback:
document.documentElement.classList.add('meeting-active');
document.body.classList.add('meeting-active');
body.meeting-active .your-app { display: none !important; }
body.meeting-active { background: #000 !important; }

UI Options (Web)

Meeting SDK provides Zoom's UI with customization options:

View Description
Component View Extractable, customizable UI - embed meeting in a div
Client View Full-page Zoom UI experience

Note: Unlike Video SDK where you build the UI from scratch, Meeting SDK uses Zoom's UI as the base with customization on top.

Key Concepts

Concept Description
SDK Key/Secret Credentials from Marketplace
Signature JWT signed with SDK Secret
Component View Extractable, customizable UI (Web)
Client View Full-page Zoom UI (Web)

Detailed References

Platform Guides

Features

Sample Repositories

Official (by Zoom)

Type Repository Stars
Linux Headless meetingsdk-headless-linux-sample 4
Linux Raw Data meetingsdk-linux-raw-recording-sample 0
Web meetingsdk-web-sample 643
Web NPM meetingsdk-web 324
React meetingsdk-react-sample 177
Auth meetingsdk-auth-endpoint-sample 124
Angular meetingsdk-angular-sample 60
Vue.js meetingsdk-vuejs-sample 42

Full list: See general/references/community-repos.md

Resources

Environment Variables

用于在 Unreal Engine 项目中集成 Zoom Meeting SDK 的技能。提供 C++ 和 Blueprint 包装器支持,涵盖生命周期、架构及常见场景,辅助开发者解决 Wrapper 与 SDK 映射问题及调试工作流。
在 Unreal Engine 中嵌入 Zoom 会议功能 处理 C++ 或 Blueprint 的 Zoom SDK 包装器集成 排查 Zoom SDK 在 UE 中的兼容性或连接问题
partner-built/zoom-plugin/skills/meeting-sdk/unreal/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill zoom-meeting-sdk-unreal -g -y
SKILL.md
Frontmatter
{
    "name": "zoom-meeting-sdk-unreal",
    "triggers": [
        "meeting sdk unreal",
        "zoom unreal sdk",
        "unreal zoom wrapper",
        "blueprint zoom sdk",
        "unreal meeting integration"
    ],
    "description": "Zoom Meeting SDK for Unreal Engine wrapper integrations. Use when building Unreal projects that\nembed Zoom meetings with C++ and Blueprint wrappers, including wrapper-to-SDK mapping concerns.\n",
    "user-invocable": false
}
用于在Web应用中集成Zoom会议能力。支持Client View和Component View两种模式,提供从签名获取到会议加入的最小化实现指南,并涵盖HD视频、共享内存等关键配置及常见错误排查。
需要在网页中嵌入Zoom会议功能 询问Zoom Web SDK集成方法 定制视频会议UI界面 解决Zoom Web端集成报错
partner-built/zoom-plugin/skills/meeting-sdk/web/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill zoom-meeting-sdk-web -g -y
SKILL.md
Frontmatter
{
    "name": "zoom-meeting-sdk-web",
    "triggers": [
        "embed meeting web",
        "meeting in react",
        "meeting in nextjs",
        "meeting in vue",
        "meeting in angular",
        "component view",
        "client view",
        "web meeting sdk",
        "javascript meeting",
        "sharedarraybuffer"
    ],
    "description": "Zoom Meeting SDK for Web - Embed Zoom meeting capabilities into web applications. Two integration\noptions: Client View (full-page, familiar Zoom UI) and Component View (embeddable, Promise-based API).\nIncludes SharedArrayBuffer setup for HD video, gallery view, and virtual backgrounds.\n",
    "user-invocable": false
}

Zoom Meeting SDK (Web)

Embed Zoom meeting capabilities into web applications with two integration options: Client View (full-page) or Component View (embeddable).

How to Implement a Custom Video User Interface for a Zoom Meeting in a Web App

Use Meeting SDK Web Component View.

Do not use Video SDK for this question unless the user is explicitly building a non-meeting session product.

Minimal architecture:

Browser page
  -> fetch Meeting SDK signature from backend
  -> ZoomMtgEmbedded.createClient()
  -> client.init({ zoomAppRoot })
  -> client.join({ signature, sdkKey, meetingNumber, userName, password })
  -> apply layout/style/customize options around the embedded meeting container

Minimal implementation:

import ZoomMtgEmbedded from '@zoom/meetingsdk/embedded';

const client = ZoomMtgEmbedded.createClient();

export async function startEmbeddedMeeting(meetingNumber: string, userName: string, password: string) {
  const sigRes = await fetch('/api/signature', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ meetingNumber, role: 0 }),
  });

  if (!sigRes.ok) throw new Error(`signature_fetch_failed:${sigRes.status}`);

  const { signature, sdkKey } = await sigRes.json();

  await client.init({
    zoomAppRoot: document.getElementById('meetingSDKElement')!,
    language: 'en-US',
    patchJsMedia: true,
    leaveOnPageUnload: true,
    customize: {
      video: { isResizable: true, popper: { disableDraggable: false } },
    },
  });

  await client.join({
    signature,
    sdkKey,
    meetingNumber,
    userName,
    password,
  });
}

Common failure points:

  • wrong route: Video SDK instead of Meeting SDK Component View
  • missing backend signature endpoint
  • wrong password field (password here, not passWord)
  • missing OBF/ZAK requirements for meetings outside the app account
  • missing SharedArrayBuffer headers when higher-end meeting features are expected

Hard Routing Rule

If the user wants a custom video user interface for a Zoom meeting in a web app, route to Component View, not Video SDK.

  • Meeting SDK Component View = custom UI for a real Zoom meeting
  • Video SDK Web = custom UI for a non-meeting video session product

For the direct custom-meeting-UI path, start with component-view/SKILL.md.

New to Web SDK? Start Here!

The fastest way to master the SDK:

  1. Choose Your View - Client View vs Component View - Understand the key architectural differences
  2. Quick Start - Client View or Component View - Get a working meeting in minutes
  3. SharedArrayBuffer - concepts/sharedarraybuffer.md - Required for HD video, gallery view, virtual backgrounds
  4. Optional preflight diagnostics - ../../probe-sdk/SKILL.md - Validate browser/device/network before join

Building a Custom Integration?

Having issues?

  • Join errors → Check signature generation and password spelling (passWord vs password)
  • HD video not working → Enable SharedArrayBuffer headers
  • Complete navigation → SKILL.md

Prerequisites

  • Zoom app with Meeting SDK credentials from Marketplace
  • SDK Key (Client ID) and Secret
  • Modern browser (Chrome, Firefox, Safari, Edge)
  • Backend auth endpoint for signature generation

Need help with authentication? See the zoom-oauth skill for JWT/signature generation.

Want pre-join diagnostics? Chain probe-sdk before init()/join() to gate low-readiness environments.

Optional Preflight Gate (Probe SDK)

For unstable first-join environments, run Probe SDK checks before calling ZoomMtg.init() or client.join():

  1. Run Probe permissions/device/network diagnostics.
  2. Apply readiness policy (allow, warn, block).
  3. Continue to Meeting SDK join only for allow/approved warn.

See ../../probe-sdk/SKILL.md and ../../general/use-cases/probe-sdk-preflight-readiness-gate.md.

Client View vs Component View

CRITICAL DIFFERENCE: These are two completely different APIs with different patterns!

Aspect Client View Component View
Object ZoomMtg (global singleton) ZoomMtgEmbedded.createClient() (instance)
API Style Callbacks Promises
UI Full-page takeover Embeddable in any container
Password param passWord (capital W) password (lowercase)
Events inMeetingServiceListener() on()/off()
Import (npm) import { ZoomMtg } from '@zoom/meetingsdk' import ZoomMtgEmbedded from '@zoom/meetingsdk/embedded'
CDN zoom-meeting-{VERSION}.min.js zoom-meeting-embedded-{VERSION}.min.js
Best For Quick integration, standard Zoom UI Custom layouts, React/Vue apps

When to Use Which

Use Client View when:

  • You want the familiar Zoom meeting interface
  • Quick integration is priority over customization
  • Full-page meeting experience is acceptable

Use Component View when:

  • You need to embed meetings in a specific area of your page
  • Building React/Vue/Angular applications
  • You want Promise-based async/await syntax
  • Custom positioning and resizing is required

Installation

NPM (Recommended)

npm install @zoom/meetingsdk --save

CDN

<!-- Dependencies (required for both views) -->
<script src="https://source.zoom.us/{VERSION}/lib/vendor/react.min.js"></script>
<script src="https://source.zoom.us/{VERSION}/lib/vendor/react-dom.min.js"></script>
<script src="https://source.zoom.us/{VERSION}/lib/vendor/redux.min.js"></script>
<script src="https://source.zoom.us/{VERSION}/lib/vendor/redux-thunk.min.js"></script>
<script src="https://source.zoom.us/{VERSION}/lib/vendor/lodash.min.js"></script>

<!-- Client View -->
<script src="https://source.zoom.us/zoom-meeting-{VERSION}.min.js"></script>

<!-- OR Component View -->
<script src="https://source.zoom.us/zoom-meeting-embedded-{VERSION}.min.js"></script>

Replace {VERSION} with the latest version (e.g., 3.11.0).

Quick Start (Client View)

import { ZoomMtg } from '@zoom/meetingsdk';

// Step 1: Check browser compatibility
console.log('System requirements:', ZoomMtg.checkSystemRequirements());

// Step 2: Preload WebAssembly for faster initialization
ZoomMtg.preLoadWasm();
ZoomMtg.prepareWebSDK();

// Step 3: Load language files (MUST complete before init)
ZoomMtg.i18n.load('en-US');
ZoomMtg.i18n.onLoad(() => {
  
  // Step 4: Initialize SDK
  ZoomMtg.init({
    leaveUrl: 'https://yoursite.com/meeting-ended',
    disableCORP: !window.crossOriginIsolated, // Auto-detect SharedArrayBuffer
    patchJsMedia: true,           // Auto-apply media dependency fixes
    leaveOnPageUnload: true,      // Clean up when page unloads
    externalLinkPage: './external.html', // Page for external links
    success: () => {
      
      // Step 5: Join meeting (note: passWord with capital W!)
      ZoomMtg.join({
        signature: signature,       // From your auth endpoint
        meetingNumber: '1234567890',
        userName: 'User Name',
        passWord: 'meeting-password', // Capital W!
        success: (res) => {
          console.log('Joined meeting:', res);
          
          // Post-join: Get meeting info
          ZoomMtg.getAttendeeslist({});
          ZoomMtg.getCurrentUser({
            success: (res) => console.log('Current user:', res.result.currentUser)
          });
        },
        error: (err) => {
          console.error('Join error:', err);
        }
      });
    },
    error: (err) => {
      console.error('Init error:', err);
    }
  });
});

Quick Start (Component View)

import ZoomMtgEmbedded from '@zoom/meetingsdk/embedded';

// Create client instance (do this ONCE, not on every render!)
const client = ZoomMtgEmbedded.createClient();

async function startMeeting() {
  try {
    // Initialize with container element
    await client.init({
      zoomAppRoot: document.getElementById('meetingSDKElement'),
      language: 'en-US',
      debug: true,                  // Enable debug logging
      patchJsMedia: true,           // Auto-apply media fixes
      leaveOnPageUnload: true,      // Clean up on page unload
    });

    // Join meeting (note: password lowercase!)
    await client.join({
      signature: signature,          // From your auth endpoint
      sdkKey: SDK_KEY,
      meetingNumber: '1234567890',
      userName: 'User Name',
      password: 'meeting-password',  // Lowercase!
    });
    
    console.log('Joined successfully!');
  } catch (error) {
    console.error('Failed to join:', error);
  }
}

Authentication Endpoint (Required)

Both views require a JWT signature from a backend server. Never expose your SDK Secret in frontend code!

# Clone Zoom's official auth endpoint
git clone https://github.com/zoom/meetingsdk-auth-endpoint-sample --depth 1
cd meetingsdk-auth-endpoint-sample
cp .env.example .env
# Edit .env with your SDK Key and Secret
npm install && npm run start

Signature Generation

The signature encodes:

  • sdkKey (or clientId for newer apps)
  • meetingNumber
  • role (0 = participant, 1 = host)
  • iat (issued at timestamp)
  • exp (expiration timestamp)
  • tokenExp (token expiration)

IMPORTANT (March 2026): Apps joining meetings outside their account will require an App Privilege Token (OBF) or ZAK token. See Authorization Requirements.

Core Workflow

┌─────────────────┐    ┌─────────────────┐    ┌─────────────────┐
│   Get Signature │───►│   init()        │───►│   join()        │
│   (from backend)│    │   (SDK setup)   │    │   (enter mtg)   │
└─────────────────┘    └─────────────────┘    └─────────────────┘
                              │                       │
                              ▼                       ▼
                       success/error            success/error
                        callback                 callback
                     (or Promise resolve)    (or Promise resolve)

Client View API Reference

ZoomMtg.init() - Key Options

ZoomMtg.init({
  // Required
  leaveUrl: string,              // URL to redirect after leaving

  // Display Options
  showMeetingHeader: boolean,    // Show meeting number/topic (default: true)
  disableInvite: boolean,        // Hide invite button (default: false)
  disableRecord: boolean,        // Hide record button (default: false)
  disableJoinAudio: boolean,     // Hide join audio option (default: false)
  disablePreview: boolean,       // Skip A/V preview (default: false)
  
  // HD Video (requires SharedArrayBuffer)
  enableHD: boolean,             // Enable 720p (default: true for >=2.8.0)
  enableFullHD: boolean,         // Enable 1080p for webinars (default: false)
  
  // View Options
  defaultView: 'gallery' | 'speaker' | 'multiSpeaker',
  
  // Feature Toggles
  isSupportChat: boolean,        // Enable chat (default: true)
  isSupportCC: boolean,          // Enable closed captions (default: true)
  isSupportBreakout: boolean,    // Enable breakout rooms (default: true)
  isSupportPolling: boolean,     // Enable polling (default: true)
  isSupportQA: boolean,          // Enable Q&A for webinars (default: true)
  
  // Cross-Origin
  disableCORP: boolean,          // For dev without COOP/COEP headers
  
  // Callbacks
  success: Function,
  error: Function,
});

ZoomMtg.join() - Key Options

ZoomMtg.join({
  // Required
  signature: string,             // JWT signature from backend
  meetingNumber: string | number,
  userName: string,
  
  // Authentication
  passWord: string,              // Meeting password (capital W!)
  zak: string,                   // Host's ZAK token (required to start)
  tk: string,                    // Registration token (if required)
  obfToken: string,              // App Privilege Token (for 2026 requirement)
  
  // Optional
  userEmail: string,             // Required for webinars
  customerKey: string,           // Custom identifier (max 36 chars)
  
  // Callbacks
  success: Function,
  error: Function,
});

Event Listeners (Client View)

// User events
ZoomMtg.inMeetingServiceListener('onUserJoin', (data) => {
  console.log('User joined:', data);
});

ZoomMtg.inMeetingServiceListener('onUserLeave', (data) => {
  console.log('User left:', data);
  // data.reasonCode values:
  // 0: OTHER
  // 1: HOST_ENDED_MEETING
  // 2: SELF_LEAVE_FROM_IN_MEETING
  // 3: SELF_LEAVE_FROM_WAITING_ROOM
  // 4: SELF_LEAVE_FROM_WAITING_FOR_HOST_START
  // 5: MEETING_TRANSFER
  // 6: KICK_OUT_FROM_MEETING
  // 7: KICK_OUT_FROM_WAITING_ROOM
  // 8: LEAVE_FROM_DISCLAIMER
});

ZoomMtg.inMeetingServiceListener('onUserUpdate', (data) => {
  console.log('User updated:', data);
});

// Meeting status
ZoomMtg.inMeetingServiceListener('onMeetingStatus', (data) => {
  // status: 1=connecting, 2=connected, 3=disconnected, 4=reconnecting
  console.log('Meeting status:', data.status);
});

// Waiting room
ZoomMtg.inMeetingServiceListener('onUserIsInWaitingRoom', (data) => {
  console.log('User in waiting room:', data);
});

// Active speaker detection
ZoomMtg.inMeetingServiceListener('onActiveSpeaker', (data) => {
  // [{userId: number, userName: string}]
  console.log('Active speaker:', data);
});

// Network quality monitoring
ZoomMtg.inMeetingServiceListener('onNetworkQualityChange', (data) => {
  // {level: 0-5, userId, type: 'uplink'}
  // 0-1 = bad, 2 = normal, 3-5 = good
  if (data.level <= 1) {
    console.warn('Poor network quality');
  }
});

// Join performance metrics
ZoomMtg.inMeetingServiceListener('onJoinSpeed', (data) => {
  console.log('Join speed metrics:', data);
  // Useful for performance monitoring dashboards
});

// Chat
ZoomMtg.inMeetingServiceListener('onReceiveChatMsg', (data) => {
  console.log('Chat message:', data);
});

// Recording
ZoomMtg.inMeetingServiceListener('onRecordingChange', (data) => {
  console.log('Recording status:', data);
});

// Screen sharing
ZoomMtg.inMeetingServiceListener('onShareContentChange', (data) => {
  console.log('Share content changed:', data);
});

// Transcription (requires "save closed captions" enabled)
ZoomMtg.inMeetingServiceListener('onReceiveTranscriptionMsg', (data) => {
  console.log('Transcription:', data);
});

// Breakout room status
ZoomMtg.inMeetingServiceListener('onRoomStatusChange', (data) => {
  // status: 2=InProgress, 3=Closing, 4=Closed
  console.log('Breakout room status:', data);
});

Common Methods (Client View)

// Get current user info
ZoomMtg.getCurrentUser({
  success: (res) => console.log(res.result.currentUser)
});

// Get all attendees
ZoomMtg.getAttendeeslist({});

// Audio/Video control
ZoomMtg.mute({ userId, mute: true });
ZoomMtg.muteAll({ muteAll: true });

// Chat
ZoomMtg.sendChat({ message: 'Hello!', userId: 0 }); // 0 = everyone

// Leave/End
ZoomMtg.leaveMeeting({});
ZoomMtg.endMeeting({});

// Host controls
ZoomMtg.makeHost({ userId });
ZoomMtg.makeCoHost({ oderId });
ZoomMtg.expel({ userId });  // Remove participant
ZoomMtg.putOnHold({ oderId, bHold: true });

// Breakout rooms
ZoomMtg.createBreakoutRoom({ rooms: [...] });
ZoomMtg.openBreakoutRooms({});
ZoomMtg.closeBreakoutRooms({});

// Virtual background
ZoomMtg.setVirtualBackground({ imageUrl: '...' });

Component View API Reference

client.init() - Key Options

await client.init({
  // Required
  zoomAppRoot: HTMLElement,      // Container element

  // Display
  language: string,              // e.g., 'en-US'
  debug: boolean,                // Enable debug logging (default: false)
  
  // Media
  patchJsMedia: boolean,         // Auto-apply media fixes (default: false)
  leaveOnPageUnload: boolean,    // Clean up on page unload (default: false)
  
  // Video
  enableHD: boolean,             // Enable 720p
  enableFullHD: boolean,         // Enable 1080p
  
  // Customization
  customize: {
    video: {
      isResizable: boolean,
      viewSizes: { default: { width, height } }
    },
    meetingInfo: ['topic', 'host', 'mn', 'pwd', 'telPwd', 'invite', 'participant', 'dc', 'enctype'],
    toolbar: {
      buttons: [
        {
          text: 'Custom Button',
          className: 'custom-btn',
          onClick: () => {
            console.log('Custom button clicked');
          }
        }
      ]
    }
  },
  
  // For ZFG
  webEndpoint: string,
  assetPath: string,             // Custom path for AV libraries (self-hosting)
});

client.join() - Key Options

await client.join({
  // Required
  signature: string,
  sdkKey: string,
  meetingNumber: string | number,
  userName: string,
  
  // Authentication  
  password: string,              // Lowercase! (different from Client View)
  zak: string,                   // Host's ZAK token
  tk: string,                    // Registration token
  
  // Optional
  userEmail: string,
});

Event Listeners (Component View)

// Connection state
client.on('connection-change', (payload) => {
  // payload.state: 'Connecting', 'Connected', 'Reconnecting', 'Closed'
  console.log('Connection:', payload.state);
});

// User events
client.on('user-added', (payload) => {
  console.log('Users added:', payload);
});

client.on('user-removed', (payload) => {
  console.log('Users removed:', payload);
});

client.on('user-updated', (payload) => {
  console.log('Users updated:', payload);
});

// Active speaker
client.on('active-speaker', (payload) => {
  console.log('Active speaker:', payload);
});

// Video state
client.on('video-active-change', (payload) => {
  console.log('Video active:', payload);
});

// Unsubscribe
client.off('connection-change', handler);

Common Methods (Component View)

// Get current user
const currentUser = client.getCurrentUser();

// Get all participants
const participants = client.getParticipantsList();

// Audio control
await client.mute(true);
await client.muteAudio(userId, true);

// Video control
await client.muteVideo(userId, true);

// Leave
client.leaveMeeting();

// End (host only)
client.endMeeting();

SharedArrayBuffer (CRITICAL for HD)

SharedArrayBuffer enables advanced features:

  • 720p/1080p video
  • Gallery view
  • Virtual backgrounds
  • Background noise suppression

Enable with HTTP Headers

Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp

Verify in Browser

if (typeof SharedArrayBuffer === 'function') {
  console.log('SharedArrayBuffer enabled!');
} else {
  console.warn('HD features will be limited');
}

// Or check cross-origin isolation
console.log('Cross-origin isolated:', window.crossOriginIsolated);

Platform-Specific Setup

See concepts/sharedarraybuffer.md for:

  • Vercel, Netlify, AWS CloudFront configuration
  • nginx/Apache configuration
  • Service worker fallback for GitHub Pages

Development Setup (Two-Server Pattern)

The official samples use a two-server pattern for development because COOP/COEP headers can break navigation:

// Server 1: Main app (port 9999) - NO isolation headers
// Serves index.html, navigation works normally

// Server 2: Meeting page (port 9998) - WITH isolation headers
// Serves meeting.html with SharedArrayBuffer support

// Main server proxies to meeting server
proxy: [{
  path: '/meeting.html',
  target: 'http://YOUR_MEETING_SERVER_HOST:9998/'
}]

Vite config with headers:

// vite.config.ts
export default defineConfig({
  server: {
    headers: {
      'Cross-Origin-Embedder-Policy': 'require-corp',
      'Cross-Origin-Opener-Policy': 'same-origin',
    }
  }
});

Common Issues & Solutions

Issue Solution
Join fails with signature error Verify signature generation, check sdkKey format
"passWord" typo Client View uses passWord (capital W), Component View uses password
No HD video Enable SharedArrayBuffer headers, check browser support
Callbacks not firing Ensure inMeetingServiceListener called after init success
Virtual background not working Requires SharedArrayBuffer + Chrome/Edge
Screen share fails on Safari Safari 17+ with macOS 14+ required for client view

Complete troubleshooting: troubleshooting/common-issues.md

Browser Support Matrix

Feature Chrome Firefox Safari Edge iOS Android
720p (receive) Yes Yes Yes Yes Yes Yes
720p (send) Yes* Yes* Yes* Yes* Yes* Yes*
Virtual background Yes Yes No Yes No No
Screen share (send) Yes Yes Safari 17+ Yes No No
Gallery view Yes Yes Yes** Yes Yes Yes

*Requires SharedArrayBuffer **Safari 17+ with macOS Sonoma

See concepts/browser-support.md for complete matrix.

Authorization Requirements (2026 Update)

IMPORTANT: Beginning March 2, 2026, apps joining meetings outside their account must be authorized.

Options

  1. App Privilege Token (OBF) - Recommended for bots

    ZoomMtg.join({
      ...
      obfToken: 'your-app-privilege-token'
    });
    
  2. ZAK Token - For host operations

    ZoomMtg.join({
      ...
      zak: 'host-zak-token'
    });
    

Zoom for Government (ZFG)

Option 1: ZFG-specific NPM Package

{
  "dependencies": {
    "@zoom/meetingsdk": "3.11.2-zfg"
  }
}

Option 2: Configure ZFG Endpoints

Client View:

ZoomMtg.setZoomJSLib('https://source.zoomgov.com/{VERSION}/lib', '/av');
ZoomMtg.init({
  webEndpoint: 'www.zoomgov.com',
  ...
});

Component View:

await client.init({
  webEndpoint: 'www.zoomgov.com',
  assetPath: 'https://source.zoomgov.com/{VERSION}/lib/av',
  ...
});

China CDN

// Set before preLoadWasm()
ZoomMtg.setZoomJSLib('https://jssdk.zoomus.cn/{VERSION}/lib', '/av');

React Integration

Official Pattern (from zoom/meetingsdk-react-sample)

The official React sample uses imperative initialization rather than React hooks:

import { ZoomMtg } from '@zoom/meetingsdk';

// Preload at module level (outside component)
ZoomMtg.preLoadWasm();
ZoomMtg.prepareWebSDK();

function App() {
  const authEndpoint = import.meta.env.VITE_AUTH_ENDPOINT;
  const meetingNumber = '';
  const passWord = '';
  const role = 0;
  const userName = 'React User';

  const getSignature = async () => {
    const response = await fetch(authEndpoint, {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({
        meetingNumber,
        role,
      }),
    });
    const data = await response.json();
    startMeeting(data.signature);
  };

  const startMeeting = (signature: string) => {
    document.getElementById('zmmtg-root')!.style.display = 'block';

    ZoomMtg.init({
      leaveUrl: window.location.origin,
      patchJsMedia: true,
      leaveOnPageUnload: true,
      success: () => {
        ZoomMtg.join({
          signature,
          meetingNumber,
          userName,
          passWord,
          success: (res) => console.log('Joined:', res),
          error: (err) => console.error('Join error:', err),
        });
      },
      error: (err) => console.error('Init error:', err),
    });
  };

  return (
    <button onClick={getSignature}>Join Meeting</button>
  );
}

React Gotchas (from official samples)

Issue Problem Solution
Client Recreation createClient() in component body runs every render Use useRef to persist client
No useEffect Official sample doesn't use React lifecycle hooks SDK's leaveOnPageUnload handles cleanup
Direct DOM Sample uses getElementById Use useRef<HTMLDivElement> in production
No Error State Silent failures Add useState for error handling
Module-Scope Side Effects preLoadWasm() at top level May cause issues with SSR

Production-Ready React Pattern

import { useEffect, useRef, useState, useCallback } from 'react';
import ZoomMtgEmbedded from '@zoom/meetingsdk/embedded';

type ZoomClient = ReturnType<typeof ZoomMtgEmbedded.createClient>;

function ZoomMeeting({ meetingNumber, password, userName }: Props) {
  const clientRef = useRef<ZoomClient | null>(null);
  const containerRef = useRef<HTMLDivElement>(null);
  const [isJoining, setIsJoining] = useState(false);
  const [error, setError] = useState<string | null>(null);

  // Create client once
  useEffect(() => {
    if (!clientRef.current) {
      clientRef.current = ZoomMtgEmbedded.createClient();
    }
  }, []);

  const joinMeeting = useCallback(async () => {
    if (!clientRef.current || !containerRef.current) return;
    
    setIsJoining(true);
    setError(null);

    try {
      // Get signature from your backend
      const response = await fetch('/api/signature', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({ meetingNumber, role: 0 }),
      });
      const { signature, sdkKey } = await response.json();
      
      await clientRef.current.init({
        zoomAppRoot: containerRef.current,
        language: 'en-US',
        patchJsMedia: true,
        leaveOnPageUnload: true,
      });

      await clientRef.current.join({
        signature,
        sdkKey,
        meetingNumber,
        password,
        userName,
      });
    } catch (err) {
      setError(err instanceof Error ? err.message : 'Failed to join');
    } finally {
      setIsJoining(false);
    }
  }, [meetingNumber, password, userName]);

  return (
    <div>
      <div ref={containerRef} style={{ width: '100%', height: '500px' }} />
      <button onClick={joinMeeting} disabled={isJoining}>
        {isJoining ? 'Joining...' : 'Join Meeting'}
      </button>
      {error && <div className="error">{error}</div>}
    </div>
  );
}

Environment Variables (Vite)

# .env.local
VITE_AUTH_ENDPOINT=http://YOUR_AUTH_SERVER_HOST:4000
VITE_SDK_KEY=your_sdk_key
const authEndpoint = import.meta.env.VITE_AUTH_ENDPOINT;
const sdkKey = import.meta.env.VITE_SDK_KEY;

Detailed References

Core Documentation

Concepts

Troubleshooting

Examples

Helper Utilities

Extract Meeting Number from Invite Link

// Users can paste full Zoom invite links
document.getElementById('meeting_number').addEventListener('input', (e) => {
  // Extract meeting number (9-11 digits)
  let meetingNumber = e.target.value.replace(/([^0-9])+/i, '');
  if (meetingNumber.match(/([0-9]{9,11})/)) {
    meetingNumber = meetingNumber.match(/([0-9]{9,11})/)[1];
  }
  
  // Auto-extract password from invite link
  const pwdMatch = e.target.value.match(/pwd=([\d,\w]+)/);
  if (pwdMatch) {
    document.getElementById('password').value = pwdMatch[1];
  }
});

Dynamic Language Switching

// Change language at runtime
document.getElementById('language').addEventListener('change', (e) => {
  const lang = e.target.value;
  ZoomMtg.i18n.load(lang);
  ZoomMtg.i18n.reload(lang);
  ZoomMtg.reRender({ lang });
});

Check System Requirements

// Check browser compatibility before initializing
const requirements = ZoomMtg.checkSystemRequirements();
console.log('Browser info:', JSON.stringify(requirements));

if (!requirements.browserInfo.isChrome && !requirements.browserInfo.isFirefox) {
  alert('For best experience, use Chrome or Firefox');
}

Sample Repositories

Repository Description
meetingsdk-web-sample Official samples (Client View & Component View)
meetingsdk-react-sample React integration with TypeScript + Vite
meetingsdk-web SDK source with helper.html
meetingsdk-auth-endpoint-sample Signature generation backend

Official Resources


Documentation Version: Based on Zoom Web Meeting SDK v3.11+

Need help? Start with SKILL.md for complete navigation.

Merged from meeting-sdk/web/SKILL.md

Zoom Meeting SDK (Web) - Documentation Index

Quick navigation guide for all Web SDK documentation.

Start Here

Document Description
SKILL.md Main entry point - Quick starts for both Client View and Component View

By View Type

Client View (Full-Page)

Document Description
client-view/SKILL.md Complete Client View reference

Component View (Embeddable)

Document Description
component-view/SKILL.md Complete Component View reference

Concepts

Document Description
concepts/sharedarraybuffer.md HD video requirements, COOP/COEP headers
concepts/browser-support.md Feature matrix by browser

Examples

Document Description
examples/client-view-basic.md Basic Client View integration
examples/component-view-react.md React integration with Component View

Troubleshooting

Document Description
troubleshooting/error-codes.md All SDK error codes (3000-10000 range)
troubleshooting/common-issues.md Quick diagnostics and fixes

By Topic

Authentication

HD Video & Performance

Events & Callbacks

Government (ZFG)

China CDN

Quick Reference

Client View vs Component View

Aspect Client View Component View
Object ZoomMtg ZoomMtgEmbedded.createClient()
API Style Callbacks Promises
Password param passWord (capital W) password (lowercase)
Events inMeetingServiceListener() on()/off()

Key Gotchas

  1. Password spelling differs between views!

    • Client View: passWord (capital W)
    • Component View: password (lowercase)
  2. SharedArrayBuffer required for HD features

    • 720p/1080p video
    • Gallery view (25 videos)
    • Virtual backgrounds
  3. March 2026 Authorization Change

    • Apps joining external meetings need OBF or ZAK tokens

External Resources

Operations

  • RUNBOOK.md - 5-minute preflight and debugging checklist.
提供Windows原生C++集成Zoom会议SDK的指导,支持自定义UI、无头机器人及音视频数据处理。涵盖架构模式、认证流程、消息循环处理及VS项目配置最佳实践。
在Windows桌面应用中嵌入Zoom会议功能 开发Zoom会议相关的原生C++应用程序或无头机器人 解决Zoom SDK回调未触发或构建错误问题
partner-built/zoom-plugin/skills/meeting-sdk/windows/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill zoom-meeting-sdk-windows -g -y
SKILL.md
Frontmatter
{
    "name": "zoom-meeting-sdk-windows",
    "triggers": [
        "meeting sdk windows",
        "windows meeting sdk",
        "windows meeting bot",
        "c++ meeting sdk windows",
        "custom ui meeting windows"
    ],
    "description": "Zoom Meeting SDK for Windows - Native C++ SDK for embedding Zoom meetings into Windows desktop\napplications. Supports custom UI architecture with raw video\/audio data, headless bots, and deep\nintegration with meeting features. Includes SDK architecture patterns and Windows message loop handling.\n",
    "user-invocable": false
}

Zoom Meeting SDK (Windows)

Embed Zoom meeting capabilities into Windows desktop applications for native C++ integrations and headless bots.

New to Zoom SDK? Start Here!

The fastest way to master the SDK:

  1. SDK Architecture Pattern - Learn the universal pattern that works for ALL 35+ features
  2. Authentication Pattern - Get a working bot joining meetings
  3. Windows Message Loop - Fix the #1 reason callbacks don't fire

Building a Custom UI?

Having issues?

Prerequisites

  • Zoom app with Meeting SDK credentials (Client ID & Secret)
  • Visual Studio 2019/2022 or later
  • Windows 10 or later
  • C++ development environment
  • vcpkg for dependency management

Need help with authentication? See the zoom-oauth skill for JWT token generation.

Project Preferences & Learnings

IMPORTANT: These are hard-won preferences from real project experience. Follow these when creating new projects.

Do NOT use CMake — Use native Visual Studio .vcxproj

Always create a native Visual Studio .sln + .vcxproj project, not a CMake project. Reasons:

  • More standard and familiar for Windows C++ developers
  • Developers can double-click the .sln to open in Visual Studio immediately
  • Project settings (include dirs, lib dirs, preprocessor defines) are easier to see and edit in the VS Property Pages UI
  • No extra CMake tooling or configuration step required
  • Friendlier and easier for developers to understand and maintain

config.json must be visible in Solution Explorer

The config.json file (containing sdk_jwt, meeting_number, passcode) must be:

  1. Included in the .vcxproj as a <None> item with <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  2. Placed in a "Config" filter in the .vcxproj.filters file so it appears under a "Config" folder in Solution Explorer
  3. Easily editable by developers directly from Solution Explorer — they should never have to hunt for it in File Explorer

Example .vcxproj entry:

<ItemGroup>
  <None Include="config.json">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </None>
</ItemGroup>

Example .vcxproj.filters entry:

<ItemGroup>
  <Filter Include="Config">
    <UniqueIdentifier>{GUID-HERE}</UniqueIdentifier>
  </Filter>
</ItemGroup>
<ItemGroup>
  <None Include="config.json">
    <Filter>Config</Filter>
  </None>
</ItemGroup>

Overview

The Windows SDK is a C++ native SDK designed for:

  • Desktop applications - Native Windows apps with full UI control
  • Headless bots - Join meetings without UI
  • Raw media access - Capture/send audio/video streams
  • Local recording - Record meetings locally or to cloud

Key Architectural Insight

The SDK follows a universal 3-step pattern for every feature:

  1. Get controller (singleton): meetingService->Get[Feature]Controller()
  2. Implement event listener: class MyListener : public I[Feature]Event { ... }
  3. Register and use: controller->SetEvent(listener) then call methods

This works for ALL features: audio, video, chat, recording, participants, screen sharing, breakout rooms, webinars, Q&A, polling, whiteboard, and 20+ more!

Learn more: SDK Architecture Pattern Guide

Quick Start

1. Download Windows SDK

Download from Zoom Marketplace:

  • Extract zoom-meeting-sdk-windows_x86_64-{version}.zip

2. Setup Project Structure

your-project/
  YourApp/
    SDK/
      x64/
        bin/          # DLL files and dependencies
        h/            # Header files
        lib/          # sdk.lib
      x86/
        bin/
        h/
        lib/
    YourApp.cpp
    YourApp.vcxproj
    config.json

Copy SDK files:

xcopy /E /I sdk-package\x64 your-project\YourApp\SDK\x64\
xcopy /E /I sdk-package\x86 your-project\YourApp\SDK\x86\

3. Install Dependencies (vcpkg)

# Install vcpkg
git clone https://github.com/Microsoft/vcpkg.git C:\vcpkg
cd C:\vcpkg
.\bootstrap-vcpkg.bat
.\vcpkg integrate install

# Install dependencies
.\vcpkg install jsoncpp:x64-windows
.\vcpkg install curl:x64-windows

4. Configure Visual Studio Project

Project Properties → C/C++ → General → Additional Include Directories:

$(SolutionDir)SDK\$(PlatformTarget)\h
C:\vcpkg\packages\jsoncpp_x64-windows\include
C:\vcpkg\packages\curl_x64-windows\include

Project Properties → Linker → General → Additional Library Directories:

$(SolutionDir)SDK\$(PlatformTarget)\lib

Project Properties → Linker → Input → Additional Dependencies:

sdk.lib

Post-Build Event (Copy DLLs to output):

xcopy /Y /D "$(SolutionDir)SDK\$(PlatformTarget)\bin\*.*" "$(OutDir)"

5. Configure Credentials

Create config.json:

{
  "sdk_jwt": "YOUR_JWT_TOKEN",
  "meeting_number": "1234567890",
  "passcode": "password123",
  "zak": ""
}

6. Build & Run

  • Open solution in Visual Studio
  • Select x64 or x86 configuration
  • Press F5 to build and run

Core Workflow

┌─────────────┐    ┌─────────────┐    ┌─────────────┐    ┌─────────────┐
│  InitSDK    │───►│  AuthSDK    │───►│ JoinMeeting │───►│ Raw Data    │
│             │    │  (JWT)      │    │             │    │ Subscribe   │
└─────────────┘    └─────────────┘    └─────────────┘    └─────────────┘
                         │                   │
                         ▼                   ▼
                   OnAuthComplete      onInMeeting
                     callback           callback

⚠️ CRITICAL: Add Windows message loop or callbacks won't fire!

while (!done) {
    MSG msg;
    while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    std::this_thread::sleep_for(std::chrono::milliseconds(100));
}

See: Windows Message Loop Guide

Code Examples

💡 Pro Tip: These are minimal examples. For complete, tested code see:

Important: Include Order

CRITICAL: Include headers in this exact order or you'll get build errors:

#include <windows.h>      // MUST be first
#include <cstdint>         // MUST be second (SDK headers use uint32_t)
// ... other standard headers ...
#include <zoom_sdk.h>
#include <meeting_service_components/meeting_audio_interface.h>  // BEFORE participants!
#include <meeting_service_components/meeting_participants_ctrl_interface.h>

See: Build Errors Guide for all dependency fixes.

1. Initialize SDK

#include <windows.h>
#include <cstdint>
#include <zoom_sdk.h>

using namespace ZOOM_SDK_NAMESPACE;

bool InitMeetingSDK() {
    InitParam initParam;
    initParam.strWebDomain = L"https://zoom.us";
    initParam.strSupportUrl = L"https://zoom.us";
    initParam.emLanguageID = LANGUAGE_English;
    initParam.enableLogByDefault = true;
    initParam.enableGenerateDump = true;
    
    SDKError err = InitSDK(initParam);
    if (err != SDKERR_SUCCESS) {
        std::wcout << L"InitSDK failed: " << err << std::endl;
        return false;
    }
    return true;
}

2. Authenticate with JWT

#include <windows.h>
#include <cstdint>
#include <auth_service_interface.h>
#include "AuthServiceEventListener.h"

IAuthService* authService = nullptr;

void OnAuthenticationComplete() {
    std::cout << "Authentication successful!" << std::endl;
    JoinMeeting();  // Proceed to join meeting
}

bool AuthenticateSDK(const std::wstring& jwtToken) {
    CreateAuthService(&authService);
    if (!authService) return false;
    
    // Set event listener BEFORE calling SDKAuth
    authService->SetEvent(new AuthServiceEventListener(&OnAuthenticationComplete));
    
    // Authenticate with JWT
    AuthContext authContext;
    authContext.jwt_token = jwtToken.c_str();
    
    SDKError err = authService->SDKAuth(authContext);
    if (err != SDKERR_SUCCESS) {
        std::wcout << L"SDKAuth failed: " << err << std::endl;
        return false;
    }
    
    // CRITICAL: Add message loop or callback won't fire!
    // See complete example: examples/authentication-pattern.md
    
    return true;
}

AuthServiceEventListener.h:

#include <windows.h>
#include <cstdint>
#include <auth_service_interface.h>
#include <iostream>

using namespace ZOOM_SDK_NAMESPACE;

class AuthServiceEventListener : public IAuthServiceEvent {
public:
    AuthServiceEventListener(void (*onComplete)()) 
        : onAuthComplete(onComplete) {}
    
    void onAuthenticationReturn(AuthResult ret) override {
        if (ret == AUTHRET_SUCCESS && onAuthComplete) {
            onAuthComplete();
        } else {
            std::cout << "Auth failed: " << ret << std::endl;
        }
    }
    
    // Must implement ALL pure virtual methods (6 total)
    void onLoginReturnWithReason(LOGINSTATUS ret, IAccountInfo* info, LoginFailReason reason) override {}
    void onLogout() override {}
    void onZoomIdentityExpired() override {}
    void onZoomAuthIdentityExpired() override {}
#if defined(WIN32)
    void onNotificationServiceStatus(SDKNotificationServiceStatus status, SDKNotificationServiceError error) override {}
#endif

private:
    void (*onAuthComplete)();
};

See complete working code: Authentication Pattern Guide

3. Join Meeting

#include <meeting_service_interface.h>
#include "MeetingServiceEventListener.h"

IMeetingService* meetingService = nullptr;

void OnMeetingJoined() {
    std::cout << "Joining meeting..." << std::endl;
}

void OnInMeeting() {
    std::cout << "In meeting now!" << std::endl;
    // Start raw data capture here
}

void OnMeetingEnds() {
    std::cout << "Meeting ended" << std::endl;
}

bool JoinMeeting(UINT64 meetingNumber, const std::wstring& password) {
    CreateMeetingService(&meetingService);
    if (!meetingService) return false;
    
    // Set event listener
    meetingService->SetEvent(
        new MeetingServiceEventListener(&OnMeetingJoined, &OnMeetingEnds, &OnInMeeting)
    );
    
    // Prepare join parameters
    JoinParam joinParam;
    joinParam.userType = SDK_UT_WITHOUT_LOGIN;
    
    JoinParam4WithoutLogin& params = joinParam.param.withoutloginuserJoin;
    params.meetingNumber = meetingNumber;
    params.userName = L"Bot User";
    params.psw = password.c_str();
    params.isVideoOff = false;
    params.isAudioOff = false;
    
    SDKError err = meetingService->Join(joinParam);
    if (err != SDKERR_SUCCESS) {
        std::wcout << L"Join failed: " << err << std::endl;
        return false;
    }
    return true;
}

MeetingServiceEventListener.h:

#include <windows.h>
#include <cstdint>
#include <meeting_service_interface.h>
#include <iostream>

using namespace ZOOM_SDK_NAMESPACE;

class MeetingServiceEventListener : public IMeetingServiceEvent {
public:
    MeetingServiceEventListener(
        void (*onJoined)(),
        void (*onEnded)(), 
        void (*onInMeeting)()
    ) : onMeetingJoined(onJoined), 
        onMeetingEnded(onEnded),
        onInMeetingCallback(onInMeeting) {}
    
    void onMeetingStatusChanged(MeetingStatus status, int iResult) override {
        if (status == MEETING_STATUS_CONNECTING) {
            if (onMeetingJoined) onMeetingJoined();
        }
        else if (status == MEETING_STATUS_INMEETING) {
            if (onInMeetingCallback) onInMeetingCallback();
        }
        else if (status == MEETING_STATUS_ENDED) {
            if (onMeetingEnded) onMeetingEnded();
        }
    }
    
    // Must implement ALL pure virtual methods (9 total)
    void onMeetingStatisticsWarningNotification(StatisticsWarningType type) override {}
    void onMeetingParameterNotification(const MeetingParameter* param) override {}
    void onSuspendParticipantsActivities() override {}
    void onAICompanionActiveChangeNotice(bool isActive) override {}
    void onMeetingTopicChanged(const zchar_t* sTopic) override {}
    void onMeetingFullToWatchLiveStream(const zchar_t* sLiveStreamUrl) override {}
    void onUserNetworkStatusChanged(MeetingComponentType type, ConnectionQuality level, unsigned int userId, bool uplink) override {}
#if defined(WIN32)
    void onAppSignalPanelUpdated(IMeetingAppSignalHandler* pHandler) override {}
#endif

private:
    void (*onMeetingJoined)();
    void (*onMeetingEnded)();
    void (*onInMeetingCallback)();
};

See all required methods: Interface Methods Guide

4. Subscribe to Raw Video

#include <windows.h>
#include <cstdint>
#include <rawdata/zoom_rawdata_api.h>
#include <rawdata/rawdata_renderer_interface.h>
#include <zoom_sdk_raw_data_def.h>  // REQUIRED for YUVRawDataI420
#include "ZoomSDKRendererDelegate.h"

IZoomSDKRenderer* videoHelper = nullptr;
ZoomSDKRendererDelegate* videoSource = new ZoomSDKRendererDelegate();

bool StartVideoCapture(uint32_t userId) {
    // STEP 1: Start raw recording FIRST (required!)
    IMeetingRecordingController* recordCtrl = 
        meetingService->GetMeetingRecordingController();
    
    SDKError canStart = recordCtrl->CanStartRawRecording();
    if (canStart != SDKERR_SUCCESS) {
        std::cout << "Cannot start recording: " << canStart << std::endl;
        return false;
    }
    
    recordCtrl->StartRawRecording();
    
    // Wait for recording to initialize
    std::this_thread::sleep_for(std::chrono::milliseconds(500));
    
    // STEP 2: Create renderer
    SDKError err = createRenderer(&videoHelper, videoSource);
    if (err != SDKERR_SUCCESS || !videoHelper) {
        std::cout << "createRenderer failed: " << err << std::endl;
        return false;
    }
    
    // STEP 3: Set resolution and subscribe
    videoHelper->setRawDataResolution(ZoomSDKResolution_720P);
    err = videoHelper->subscribe(userId, RAW_DATA_TYPE_VIDEO);
    if (err != SDKERR_SUCCESS) {
        std::cout << "Subscribe failed: " << err << std::endl;
        return false;
    }
    
    std::cout << "Video capture started! Frames arrive in onRawDataFrameReceived()" << std::endl;
    return true;
}

ZoomSDKRendererDelegate.h:

#include <windows.h>
#include <cstdint>
#include <rawdata/rawdata_renderer_interface.h>
#include <zoom_sdk_raw_data_def.h>
#include <fstream>
#include <iostream>

using namespace ZOOM_SDK_NAMESPACE;

class ZoomSDKRendererDelegate : public IZoomSDKRendererDelegate {
public:
    void onRawDataFrameReceived(YUVRawDataI420* data) override {
        if (!data) return;
        
        // YUV420 (I420) format: Y plane + U plane + V plane
        int width = data->GetStreamWidth();
        int height = data->GetStreamHeight();
        
        // Calculate buffer sizes
        // Y = full resolution, U/V = quarter resolution each
        size_t ySize = width * height;
        size_t uvSize = ySize / 4;  // (width/2) * (height/2)
        
        // Total size: width * height * 1.5 bytes
        
        // Save to file (playback: ffplay -f rawvideo -pixel_format yuv420p -video_size 1280x720 output.yuv)
        std::ofstream outputFile("output.yuv", std::ios::binary | std::ios::app);
        outputFile.write(data->GetYBuffer(), ySize);    // Brightness
        outputFile.write(data->GetUBuffer(), uvSize);   // Blue-difference
        outputFile.write(data->GetVBuffer(), uvSize);   // Red-difference
        outputFile.close();
    }
    
    void onRawDataStatusChanged(RawDataStatus status) override {
        std::cout << "Raw data status: " << status << std::endl;
    }
    
    void onRendererBeDestroyed() override {
        std::cout << "Renderer destroyed" << std::endl;
    }
};

Complete video capture guide: Raw Video Capture Guide

5. Subscribe to Raw Audio

#include <rawdata/rawdata_audio_helper_interface.h>

class ZoomSDKAudioRawDataDelegate : public IZoomSDKAudioRawDataDelegate {
public:
    void onMixedAudioRawDataReceived(AudioRawData* data) override {
        // Process PCM audio (mixed from all participants)
        std::ofstream pcmFile("audio.pcm", std::ios::binary | std::ios::app);
        pcmFile.write((char*)data->GetBuffer(), data->GetBufferLen());
        pcmFile.close();
    }
    
    void onOneWayAudioRawDataReceived(AudioRawData* data, uint32_t node_id) override {
        // Process audio from specific participant
    }
};

// Subscribe to audio
IZoomSDKAudioRawDataHelper* audioHelper = GetAudioRawdataHelper();
audioHelper->subscribe(new ZoomSDKAudioRawDataDelegate());

6. Main Message Loop (CRITICAL!)

⚠️ WITHOUT THIS, CALLBACKS WON'T FIRE!

#include <windows.h>
#include <thread>
#include <chrono>

int main() {
    // Initialize COM
    CoInitialize(NULL);
    
    // Load config and initialize
    LoadConfig();
    InitMeetingSDK();
    AuthenticateSDK(sdk_jwt);
    
    // CRITICAL: Windows message loop for SDK callbacks
    // SDK uses Windows message pump to dispatch callbacks
    // Without this, callbacks are queued but NEVER fire!
    MSG msg;
    while (!g_exit) {
        // Process all pending Windows messages
        while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
            if (msg.message == WM_QUIT) {
                g_exit = true;
                break;
            }
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        
        // Small sleep to avoid busy-waiting
        std::this_thread::sleep_for(std::chrono::milliseconds(100));
    }
    
    // Cleanup
    CleanSDK();
    CoUninitialize();
    
    return 0;
}

Why message loop is critical: The SDK uses Windows COM/messaging for async callbacks. Without PeekMessage(), the SDK queues messages but they're never retrieved/dispatched, so callbacks never execute.

Symptoms without message loop:

  • Authentication timeout (even with valid JWT)
  • Meeting join timeout
  • No callback events fire
  • Appears like network/auth issue but it's a message loop issue

See detailed explanation: Windows Message Loop Guide

Common Issues & Solutions

Issue Solution
Callbacks don't fire / Auth timeout Add Windows message loop → Guide
uint32_t / AudioType errors Fix include order → Guide
Abstract class error Implement all virtual methods → Guide
How to implement [feature]? Follow universal pattern → Guide
Authentication fails Check JWT token & error codes → Guide
No video frames received Call StartRawRecording() first → Guide

Complete troubleshooting: Common Issues Guide

How to Implement Any Feature

The SDK has 35+ feature controllers (audio, video, chat, recording, participants, screen sharing, breakout rooms, webinars, Q&A, polling, whiteboard, captions, AI companion, etc.).

Universal pattern that works for ALL features:

  1. Get the controller (singleton):

    IMeetingAudioController* audioCtrl = meetingService->GetMeetingAudioController();
    IMeetingChatController* chatCtrl = meetingService->GetMeetingChatController();
    // ... 33 more controllers available
    
  2. Implement event listener (observer pattern):

    class MyAudioListener : public IMeetingAudioCtrlEvent {
        void onUserAudioStatusChange(IList<IUserAudioStatus*>* lst) override {
            // React to audio events
        }
        // ... implement all required methods
    };
    
  3. Register and use:

    audioCtrl->SetEvent(new MyAudioListener());
    audioCtrl->MuteAudio(userId, true);  // Use feature
    

Complete guide with examples: SDK Architecture Pattern

Available Examples

Example Description
SkeletonDemo Minimal join meeting - start here
GetVideoRawData Subscribe to raw video streams
GetAudioRawData Subscribe to raw audio streams
SendVideoRawData Send custom video as virtual camera
SendAudioRawData Send custom audio as virtual mic
GetShareRawData Capture screen share content
LocalRecording Local MP4 recording
ChatDemo In-meeting chat functionality
CaptionDemo Closed caption/live transcription
BreakoutDemo Breakout room management

Detailed References

🎯 Core Concepts (START HERE!)

📚 Complete Examples

🔧 Troubleshooting Guides

📖 References

🎨 Feature-Specific Guides

Sample Repositories

Repository Description
meetingsdk-windows-raw-recording-sample Official raw data capture samples
meetingsdk-windows-local-recording-sample Local recording with Docker

Playing Raw Video/Audio Files

Raw YUV/PCM files have no headers - you must specify format explicitly.

Play Raw YUV Video

ffplay -video_size 1280x720 -pixel_format yuv420p -f rawvideo output.yuv

Convert YUV to MP4

ffmpeg -video_size 1280x720 -pixel_format yuv420p -f rawvideo -i output.yuv -c:v libx264 output.mp4

Play Raw PCM Audio

ffplay -f s16le -ar 32000 -ac 1 audio.pcm

Convert PCM to WAV

ffmpeg -f s16le -ar 32000 -ac 1 -i audio.pcm output.wav

Combine Video + Audio

ffmpeg -video_size 1280x720 -pixel_format yuv420p -f rawvideo -i output.yuv ^
       -f s16le -ar 32000 -ac 1 -i audio.pcm ^
       -c:v libx264 -c:a aac -shortest output.mp4

Key flags:

Flag Description
-video_size WxH Frame dimensions (e.g., 1280x720)
-pixel_format yuv420p I420/YUV420 planar format
-f rawvideo Raw video input (no container)
-f s16le Signed 16-bit little-endian PCM
-ar 32000 Sample rate (Zoom uses 32kHz)
-ac 1 Mono (use -ac 2 for stereo)

Authentication Requirements (2026 Update)

Important: Beginning March 2, 2026, apps joining meetings outside their account must be authorized.

Use one of:

  • App Privilege Token (OBF) - Recommended for bots (app_privilege_token in JoinParam)
  • ZAK Token - Zoom Access Key (userZAK in JoinParam)
  • On Behalf Token - For specific use cases (onBehalfToken in JoinParam)

📖 Complete Documentation Library

This skill includes comprehensive guides created from real-world debugging:

🎯 Start Here

📚 By Category

Core Concepts:

Complete Examples:

Troubleshooting:

References:

🚨 Most Critical Issues (From Real Debugging)

  1. Callbacks not firing → Missing Windows message loop (99% of issues)

  2. Build errors → SDK header dependencies (uint32_t, AudioType, etc.)

  3. Abstract class errors → Missing virtual method implementations

💡 Key Insight

Once you learn the 3-step pattern, you can implement ANY of the 35+ features:

  1. Get controller → 2. Implement event listener → 3. Register and use

See: SDK Architecture Pattern

Official Resources


Documentation Version: Based on Zoom Windows Meeting SDK v6.7.2.26830

Need help? Start with SKILL.md for complete navigation.

Merged from meeting-sdk/windows/SKILL.md

Zoom Windows Meeting SDK - Complete Documentation Index

🚀 Quick Start Path

If you're new to the SDK, follow this order:

  1. Read the architecture patternconcepts/sdk-architecture-pattern.md

    • This teaches you the universal formula that applies to ALL features
    • Once you understand this, you can implement any feature by reading the .h files
  2. Fix build errorstroubleshooting/build-errors.md

    • SDK header dependencies issues
    • Required include order
  3. Implement authenticationexamples/authentication-pattern.md

    • Complete working JWT authentication code
  4. Fix callback issuestroubleshooting/windows-message-loop.md

    • CRITICAL: Why callbacks don't fire without Windows message loop
    • This was the hardest issue to diagnose!
  5. Implement virtual methodsreferences/interface-methods.md

    • Complete lists of all required methods
    • How to avoid abstract class errors
  6. Capture video (optional)examples/raw-video-capture.md

    • YUV420 format explained
    • Complete raw data capture workflow
  7. Troubleshoot any issuestroubleshooting/common-issues.md

    • Quick diagnostic checklist
    • Error code tables
    • "If you see X, do Y" reference

📂 Documentation Structure

meeting-sdk/windows/
├── SKILL.md                           # Main skill overview
├── SKILL.md                           # This file - navigation guide
│
├── concepts/                          # Core architectural patterns
│   ├── sdk-architecture-pattern.md   # THE MOST IMPORTANT DOC
│   │                                  # Universal formula for ANY feature
│   ├── singleton-hierarchy.md        # Navigation guide for SDK services
│   │                                  # 4-level deep service tree, when/how
│   ├── custom-ui-architecture.md     # How Custom UI rendering works
│   │                                  # Child HWNDs, D3D, layout, events
│   └── custom-ui-vs-raw-data.md      # SDK-rendered vs self-rendered
│                                      # Decision guide for Custom UI approach
│
├── examples/                          # Complete working code
│   ├── authentication-pattern.md     # JWT auth with full code
│   ├── raw-video-capture.md          # Video capture with YUV420 details
│   │                                  # Recording vs Streaming, permissions
│   ├── custom-ui-video-rendering.md  # Custom UI with video container
│   │                                  # Active speaker + gallery layout
│   ├── breakout-rooms.md             # Complete breakout room guide
│   │                                  # 5 roles, create/manage/join
│   ├── chat.md                       # Send/receive chat messages
│   │                                  # Rich text, threading, file transfer
│   ├── captions-transcription.md     # Live transcription & closed captions
│   │                                  # Multi-language translation
│   ├── local-recording.md            # Local MP4 recording
│   │                                  # Permission flow, encoder monitoring
│   ├── share-raw-data-capture.md     # Screen share raw data capture
│   │                                  # YUV420 frames from shared content
│   └── send-raw-data.md              # Virtual camera/mic/share
│                                      # Send custom video/audio/share
│
├── troubleshooting/                   # Problem solving guides
│   ├── windows-message-loop.md       # CRITICAL - Why callbacks fail
│   ├── build-errors.md               # Header dependency fixes + MSBuild
│   └── common-issues.md              # Quick diagnostic workflow
│
└── references/                        # Reference documentation
    ├── interface-methods.md           # Required virtual methods
    │                                  # Auth(6) + Meeting(9) + CustomUI(13)
    ├── windows-reference.md           # Platform setup
    ├── authorization.md               # JWT generation
    ├── bot-authentication.md          # Bot token types
    ├── breakout-rooms.md              # Breakout room features
    └── ai-companion.md                # AI Companion features

🎯 By Use Case

I want to build a meeting bot

  1. SDK Architecture Pattern - Understand the pattern
  2. Authentication Pattern - Join meetings
  3. Windows Message Loop - Fix callback issues
  4. Interface Methods - Implement callbacks

I'm getting build errors

  1. Build Errors Guide - SDK header dependencies
  2. Interface Methods - Abstract class errors
  3. Common Issues - Linker errors

I'm getting runtime errors

  1. Windows Message Loop - Callbacks not firing
  2. Authentication Pattern - Auth timeout
  3. Common Issues - Error code tables

I want to build a Custom UI meeting app

  1. Custom UI Architecture - How SDK rendering works
  2. SDK-Rendered vs Self-Rendered - Choose your approach
  3. Custom UI Video Rendering - Complete working code
  4. Interface Methods - 13 Custom UI virtual methods
  5. Build Errors Guide - MSBuild from git bash

I want to capture video/audio

  1. Raw Video Capture - Complete video workflow
    • Recording vs Streaming approaches
    • Permission requirements (host, OAuth tokens)
    • Audio PCM capture
  2. Share Raw Data Capture - Screen share capture
    • Subscribe to RAW_DATA_TYPE_SHARE
    • Handle dynamic resolution
  3. SDK Architecture Pattern - Controller pattern
  4. Common Issues - No frames received

I want to use breakout rooms

  1. Breakout Rooms Guide - Complete breakout room workflow
    • 5 roles: Creator, Admin, Data, Assistant, Attendee
    • Create, configure, manage, join/leave rooms
  2. Common Issues - Breakout room error codes

I want to implement chat

  1. Chat Guide - Send/receive messages
    • Rich text formatting (bold, italic, links)
    • Private messages and threading
    • File transfer events

I want to use live transcription

  1. Captions & Transcription Guide - Live transcription
    • Automatic speech-to-text
    • Multi-language translation
    • Manual closed captions (host feature)

I want to record meetings

  1. Local Recording Guide - Local MP4 recording
    • Permission request workflow
    • zTscoder.exe encoder monitoring
    • Gallery view vs active speaker

I want to implement a specific feature

  1. SDK Architecture Pattern - START HERE!
  2. Find the controller in SDK/x64/h/meeting_service_interface.h
  3. Find the header in SDK/x64/h/meeting_service_components/
  4. Follow the universal pattern: Get controller → Implement listener → Use methods

I want to understand the SDK architecture

  1. SDK Architecture Pattern - Complete architecture overview
  2. Singleton Hierarchy - Navigate the service tree (4 levels)
  3. Interface Methods - Event listener pattern
  4. Authentication Pattern - Service pattern

🔥 Most Critical Documents

1. SDK Architecture Pattern (⭐ MASTER DOCUMENT)

concepts/sdk-architecture-pattern.md

This is THE most important document. It teaches the universal 3-step pattern:

  1. Get controller (singleton pattern)
  2. Implement event listener (observer pattern)
  3. Register and use

Once you understand this pattern, you can implement any of the 35+ features by just reading the SDK headers.

Key insight: The Zoom SDK follows a perfectly consistent architecture. Every feature works the same way.


2. Windows Message Loop (⚠️ MOST COMMON ISSUE)

troubleshooting/windows-message-loop.md

99% of "callbacks not firing" issues are caused by missing Windows message loop. This document explains:

  • Why SDK requires PeekMessage() loop
  • How to implement it correctly
  • How to diagnose callback issues

This was the hardest bug to find during development (took ~2 hours).


3. Build Errors Guide

troubleshooting/build-errors.md

SDK headers have dependency bugs that cause build errors. This document provides:

  • Required include order
  • Missing <cstdint> fix
  • Missing AudioType fix
  • Missing YUVRawDataI420 fix

📊 By Document Type

Concepts (Why and How)

Examples (Complete Working Code)

Troubleshooting (Problem Solving)

References (Lookup Information)


💡 Key Learnings from Real Debugging

These documents were created from actual debugging of a non-functional Zoom SDK sample. Here are the key insights:

Critical Discoveries:

  1. Windows Message Loop is MANDATORY (not optional)

    • SDK uses Windows message pump for callbacks
    • Without it, callbacks are queued but never fire
    • Manifests as "authentication timeout" even with valid JWT
    • See: Windows Message Loop Guide
  2. SDK Headers Have Dependency Bugs

    • Missing #include <cstdint> in SDK headers
    • meeting_participants_ctrl_interface.h doesn't include meeting_audio_interface.h
    • rawdata_renderer_interface.h only forward-declares YUVRawDataI420
    • See: Build Errors Guide
  3. Include Order is CRITICAL

    • <windows.h> must be FIRST
    • <cstdint> must be SECOND
    • Then SDK headers in specific order
    • See: Build Errors Guide
  4. ALL Virtual Methods Must Be Implemented

    • Including WIN32-conditional methods
    • SDK v6.7.2 requires 6 auth methods + 9 meeting methods
    • Different versions have different requirements
    • See: Interface Methods Guide
  5. The Architecture is Beautifully Consistent

    • Every feature follows the same 3-step pattern
    • Controllers are singletons
    • Event listeners use observer pattern
    • Once you learn the pattern, you can implement any feature
    • See: SDK Architecture Pattern

🎓 Learning Path by Skill Level

Beginner (Never used Zoom SDK)

  1. Read SDK Architecture Pattern to understand the overall design
  2. Follow Authentication Pattern to join your first meeting
  3. Reference Common Issues when you hit problems

Intermediate (Familiar with SDK basics)

  1. Deep dive into SDK Architecture Pattern - implement multiple features
  2. Learn Raw Video Capture for media processing
  3. Use Interface Methods as reference

Advanced (Building production bots)

  1. Study SDK Architecture Pattern - learn to implement ANY feature
  2. Master Windows Message Loop - understand async callback flow
  3. Reference SDK headers directly using the universal pattern

🔍 How to Find What You Need

"My code won't compile"

Build Errors Guide

"Authentication times out"

Windows Message Loop

"Callbacks never fire"

Windows Message Loop

"Abstract class error"

Interface Methods

"How do I implement [feature]?"

SDK Architecture Pattern

"How do I join a meeting?"

Authentication Pattern

"How do I capture video?"

Raw Video Capture

"What error code means what?"

Common Issues - Comprehensive error code tables (SDKERR, AUTHRET, Login, BO, Phone, OBF)

"How do I use breakout rooms?"

Breakout Rooms Guide

"How does the SDK work?"

SDK Architecture Pattern

"How do I navigate to a specific controller/feature?"

Singleton Hierarchy

"How do I send/receive chat messages?"

Chat Guide

"How do I use live transcription?"

Captions & Transcription Guide

"How do I record locally?"

Local Recording Guide

"How do I capture screen share?"

Share Raw Data Capture


📝 Document Version

All documents are based on Zoom Windows Meeting SDK v6.7.2.26830.

Different SDK versions may have:

  • Different required callback methods
  • Different error codes
  • Different API behavior

If using a different version, use grep "= 0" SDK/x64/h/*.h to verify required methods.


Remember: The SDK Architecture Pattern is the fastest way to understand how the Windows Meeting SDK fits together. Read it first if you are debugging custom UI or event flow issues.

Operations

  • RUNBOOK.md - 5-minute preflight and debugging checklist.
Zoom OAuth认证参考技能,提供授权流程、令牌生命周期及错误排查指南。适用于配置应用凭证、选择授权类型与作用域、处理Token刷新或调试OAuth失败场景。
需要理解Zoom不同授权模式(如S2S、用户授权)的区别 调试Zoom API调用时的4700-4741系列错误 配置OAuth令牌缓存与自动刷新策略 确定特定业务场景下应使用的Grant Type
partner-built/zoom-plugin/skills/oauth/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill zoom-oauth -g -y
SKILL.md
Frontmatter
{
    "name": "zoom-oauth",
    "triggers": [
        "zoom oauth",
        "zoom authentication",
        "zoom authorization",
        "server to server oauth",
        "s2s oauth",
        "zoom access token",
        "zoom refresh token",
        "authorization code flow",
        "device authorization",
        "pkce",
        "zoom api authentication",
        "oauth error 4709",
        "oauth error 4733",
        "oauth error 4735",
        "redirect uri mismatch"
    ],
    "description": "Reference skill for Zoom authentication. Use after routing to an auth workflow when choosing app credentials, grant types, scopes, token refresh behavior, or debugging Zoom OAuth failures.",
    "user-invocable": false
}

Zoom OAuth

Background reference for Zoom auth and token lifecycle behavior. Prefer setup-zoom-oauth first, then use this skill for the exact flow, scope, and error details.

Zoom OAuth

Authentication and authorization for Zoom APIs.

📖 Complete Documentation

For comprehensive guides, production patterns, and troubleshooting, see Integrated Index section below.

Quick navigation:

Prerequisites

  • Zoom app created in Marketplace
  • Client ID and Client Secret
  • For S2S OAuth: Account ID

Four Authorization Use Cases

Use Case App Type Grant Type Industry Name
Account Authorization Server-to-Server account_credentials Client Credentials Grant, M2M, Two-legged OAuth
User Authorization General authorization_code Authorization Code Grant, Three-legged OAuth
Device Authorization General urn:ietf:params:oauth:grant-type:device_code Device Authorization Grant (RFC 8628)
Client Authorization General client_credentials Client Credentials Grant (chatbot-scoped)

Industry Terminology

Term Meaning
Two-legged OAuth No user involved (client ↔ server)
Three-legged OAuth User involved (user ↔ client ↔ server)
M2M Machine-to-Machine (backend services)
Public client Can't keep secrets (mobile, SPA) → use PKCE
Confidential client Can keep secrets (backend servers)
PKCE Proof Key for Code Exchange (RFC 7636), pronounced "pixy"

Which Flow Should I Use?

                              ┌─────────────────────┐
                              │  What are you       │
                              │  building?          │
                              └──────────┬──────────┘
                                         │
                    ┌────────────────────┼────────────────────┐
                    │                    │                    │
                    ▼                    ▼                    ▼
          ┌─────────────────┐  ┌─────────────────┐  ┌─────────────────┐
          │  Backend        │  │  App for other  │  │  Chatbot only   │
          │  automation     │  │  users/accounts │  │  (Team Chat)    │
          │  (your account) │  │                 │  │                 │
          └────────┬────────┘  └────────┬────────┘  └────────┬────────┘
                   │                    │                    │
                   ▼                    │                    ▼
          ┌─────────────────┐           │           ┌─────────────────┐
          │    ACCOUNT      │           │           │     CLIENT      │
          │   (S2S OAuth)   │           │           │   (Chatbot)     │
          └─────────────────┘           │           └─────────────────┘
                                        │
                                        ▼
                              ┌─────────────────────┐
                              │  Does device have   │
                              │  a browser?         │
                              └──────────┬──────────┘
                                         │
                         ┌───────────────┴───────────────┐
                         │ NO                         YES│
                         ▼                               ▼
          ┌─────────────────────────┐         ┌─────────────────┐
          │        DEVICE           │         │      USER       │
          │     (Device Flow)       │         │  (Auth Code)    │
          │                         │         │                 │
          │ Examples:               │         │ + PKCE if       │
          │ • Smart TV              │         │   public client │
          │ • Meeting SDK device    │         │                 │
          └─────────────────────────┘         └─────────────────┘

Account Authorization (Server-to-Server OAuth)

For backend automation without user interaction.

Request Access Token

POST https://zoom.us/oauth/token?grant_type=account_credentials&account_id={ACCOUNT_ID}

Headers:
Authorization: Basic {Base64(ClientID:ClientSecret)}

Response

{
  "access_token": "eyJ...",
  "token_type": "bearer",
  "expires_in": 3600,
  "scope": "user:read:user:admin",
  "api_url": "https://api.zoom.us"
}

Refresh

Access tokens expire after 1 hour. No separate refresh flow - just request a new token.


User Authorization (Authorization Code Flow)

For apps that act on behalf of users.

Step 1: Redirect User to Authorize

https://zoom.us/oauth/authorize?response_type=code&client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}

Use https://zoom.us/oauth/authorize for consent, but https://zoom.us/oauth/token for token exchange.

Optional Parameters:

Parameter Description
state CSRF protection, maintains state through flow
code_challenge For PKCE (see below)
code_challenge_method S256 or plain (default: plain)

Step 2: User Authorizes

  • User signs in and grants permission
  • Redirects to redirect_uri with authorization code:
    https://example.com/?code={AUTHORIZATION_CODE}
    

Step 3: Exchange Code for Token

POST https://zoom.us/oauth/token?grant_type=authorization_code&code={CODE}&redirect_uri={REDIRECT_URI}

Headers:
Authorization: Basic {Base64(ClientID:ClientSecret)}

With PKCE: Add code_verifier parameter.

Response

{
  "access_token": "eyJ...",
  "token_type": "bearer",
  "refresh_token": "eyJ...",
  "expires_in": 3600,
  "scope": "user:read:user",
  "api_url": "https://api.zoom.us"
}

Refresh Token

POST https://zoom.us/oauth/token?grant_type=refresh_token&refresh_token={REFRESH_TOKEN}

Headers:
Authorization: Basic {Base64(ClientID:ClientSecret)}
  • Access tokens expire after 1 hour
  • Refresh token lifetime can vary; ~90 days is common for some user-based flows. Treat it as configuration/behavior that can change and rely on runtime errors + re-auth fallback.
  • Always use the latest refresh token for the next request
  • If refresh token expires, redirect user to authorization URL to restart flow

User-Level vs Account-Level Apps

Type Who Can Authorize Scope Access
User-level Any individual user Scoped to themselves
Account-level User with admin permissions Account-wide access (admin scopes)

Device Authorization (Device Flow)

For devices without browsers (e.g., Meeting SDK apps).

Prerequisites

Enable "Use App on Device" in: Features > Embed > Enable Meeting SDK

Step 1: Request Device Code

POST https://zoom.us/oauth/devicecode?client_id={CLIENT_ID}

Headers:
Authorization: Basic {Base64(ClientID:ClientSecret)}

Response

{
  "device_code": "DEVICE_CODE",
  "user_code": "abcd1234",
  "verification_uri": "https://zoom.us/oauth_device",
  "verification_uri_complete": "https://zoom.us/oauth/device/complete/{CODE}",
  "expires_in": 900,
  "interval": 5
}

Step 2: User Authorization

Direct user to:

  • verification_uri and display user_code for manual entry, OR
  • verification_uri_complete (user code prefilled)

User signs in and allows the app.

Step 3: Poll for Token

Poll at the interval (5 seconds) until user authorizes:

POST https://zoom.us/oauth/token?grant_type=urn:ietf:params:oauth:grant-type:device_code&device_code={DEVICE_CODE}

Headers:
Authorization: Basic {Base64(ClientID:ClientSecret)}

Response

{
  "access_token": "eyJ...",
  "token_type": "bearer",
  "refresh_token": "eyJ...",
  "expires_in": 3599,
  "scope": "user:read:user user:read:token",
  "api_url": "https://api.zoom.us"
}

Polling Responses

Response Meaning Action
Token returned User authorized Store tokens, done
error: authorization_pending User hasn't authorized yet Keep polling at interval
error: slow_down Polling too fast Increase interval by 5 seconds
error: expired_token Device code expired (15 min) Restart flow from Step 1
error: access_denied User denied authorization Handle denial, don't retry

Polling Implementation

async function pollForToken(deviceCode, interval) {
  while (true) {
    await sleep(interval * 1000);
    
    try {
      const response = await axios.post(
        `https://zoom.us/oauth/token?grant_type=urn:ietf:params:oauth:grant-type:device_code&device_code=${deviceCode}`,
        null,
        { headers: { 'Authorization': `Basic ${credentials}` } }
      );
      return response.data; // Success - got tokens
    } catch (error) {
      const err = error.response?.data?.error;
      if (err === 'authorization_pending') continue;
      if (err === 'slow_down') { interval += 5; continue; }
      throw error; // expired_token or access_denied
    }
  }
}

Refresh

Same as User Authorization. If refresh token expires, restart device flow from Step 1.


Client Authorization (Chatbot)

For chatbot message operations only.

Request Token

POST https://zoom.us/oauth/token?grant_type=client_credentials

Headers:
Authorization: Basic {Base64(ClientID:ClientSecret)}

Response

{
  "access_token": "eyJ...",
  "token_type": "bearer",
  "expires_in": 3600,
  "scope": "imchat:bot",
  "api_url": "https://api.zoom.us"
}

Refresh

Tokens expire after 1 hour. No refresh flow - just request a new token.


Using Access Tokens

Call API

GET https://api.zoom.us/v2/users/me

Headers:
Authorization: Bearer {ACCESS_TOKEN}

Me Context

Replace userID with me to target the token's associated user:

Endpoint Methods
/v2/users/me GET, PATCH
/v2/users/me/token GET
/v2/users/me/meetings GET, POST

Revoke Access Token

Works for all authorization types.

POST https://zoom.us/oauth/revoke?token={ACCESS_TOKEN}

Headers:
Authorization: Basic {Base64(ClientID:ClientSecret)}

Response

{
  "status": "success"
}

PKCE (Proof Key for Code Exchange)

For public clients that can't securely store secrets (mobile apps, SPAs, desktop apps).

When to Use PKCE

Client Type Use PKCE? Why
Mobile app Yes Can't securely store client secret
Single Page App (SPA) Yes JavaScript is visible to users
Desktop app Yes Binary can be decompiled
Meeting SDK (client-side) Yes Runs on user's device
Backend server Optional Can keep secrets, but PKCE adds security

How PKCE Works

┌──────────┐                              ┌──────────┐                    ┌──────────┐
│  Client  │                              │   Zoom   │                    │   Zoom   │
│   App    │                              │  Auth    │                    │  Token   │
└────┬─────┘                              └────┬─────┘                    └────┬─────┘
     │                                         │                              │
     │ 1. Generate code_verifier (random)      │                              │
     │ 2. Create code_challenge = SHA256(verifier)                            │
     │                                         │                              │
     │ ─────── /authorize + code_challenge ──► │                              │
     │                                         │                              │
     │ ◄────── authorization_code ──────────── │                              │
     │                                         │                              │
     │ ─────────────── /token + code_verifier ─┼────────────────────────────► │
     │                                         │                              │
     │                                         │     Verify: SHA256(verifier) │
     │                                         │            == challenge      │
     │                                         │                              │
     │ ◄───────────────────────────────────────┼─────── access_token ──────── │
     │                                         │                              │

Implementation (Node.js)

const crypto = require('crypto');

function generatePKCE() {
  const verifier = crypto.randomBytes(32).toString('base64url');
  const challenge = crypto.createHash('sha256').update(verifier).digest('base64url');
  return { verifier, challenge };
}

const pkce = generatePKCE();

const authUrl = `https://zoom.us/oauth/authorize?` +
  `response_type=code&` +
  `client_id=${CLIENT_ID}&` +
  `redirect_uri=${REDIRECT_URI}&` +
  `code_challenge=${pkce.challenge}&` +
  `code_challenge_method=S256`;

// Store pkce.verifier in session for callback

Token Exchange with PKCE

POST https://zoom.us/oauth/token?grant_type=authorization_code&code={CODE}&redirect_uri={REDIRECT_URI}&code_verifier={VERIFIER}

Headers:
Authorization: Basic {Base64(ClientID:ClientSecret)}

Deauthorization

When a user removes your app, Zoom sends a webhook to your Deauthorization Notification Endpoint URL.

Webhook Event

{
  "event": "app_deauthorized",
  "event_ts": 1740439732278,
  "payload": {
    "account_id": "ACCOUNT_ID",
    "user_id": "USER_ID",
    "signature": "SIGNATURE",
    "deauthorization_time": "2019-06-17T13:52:28.632Z",
    "client_id": "CLIENT_ID"
  }
}

Requirements

  • Delete all associated user data after receiving this event
  • Verify webhook signature (use secret token, verification token deprecated Oct 2023)
  • Only public apps receive deauthorization webhooks (not private/dev apps)

Pre-Approval Flow

Some Zoom accounts require Marketplace admin pre-approval before users can authorize apps.

  • Users can request pre-approval from their admin
  • Account-level apps (admin scopes) require appropriate role permissions

Active Apps Notifier (AAN)

In-meeting feature showing apps with real-time access to content.

  • Displays icon + tooltip with app info, content type being accessed, approving account
  • Supported: Zoom client 5.6.7+, Meeting SDK 5.9.0+

OAuth Scopes

Scope Types

Type Description For
Classic scopes Legacy scopes (user, admin, master levels) Existing apps
Granular scopes New fine-grained scopes with optional support New apps

Classic Scopes

For previously-created apps. Three levels:

  • User-level: Access to individual user's data
  • Admin-level: Account-wide access, requires admin role
  • Master-level: For master-sub account setups, requires account owner

Full list: https://developers.zoom.us/docs/integrations/oauth-scopes/

Granular Scopes

For new apps. Format: <service>:<action>:<data_claim>:<access>

Component Values
service meeting, webinar, user, recording, etc.
action read, write, update, delete
data_claim Data category (e.g., participants, settings)
access empty (user), admin, master

Example: meeting:read:list_meetings:admin

Full list: https://developers.zoom.us/docs/integrations/oauth-scopes-granular/

Optional Scopes

Granular scopes can be marked as optional - users choose whether to grant them.

Basic authorization (uses build flow defaults):

https://zoom.us/oauth/authorize?response_type=code&client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}

Advanced authorization (custom scopes per request):

https://zoom.us/oauth/authorize?client_id={CLIENT_ID}&response_type=code&redirect_uri={REDIRECT_URI}&scope={required_scopes}&optional_scope={optional_scopes}

Include previously granted scopes:

https://zoom.us/oauth/authorize?...&include_granted_scopes&scope={additional_scopes}

Migrating Classic to Granular

  1. Manage > select app > edit
  2. Scope page > Development tab > click Migrate
  3. Review auto-assigned granular scopes, remove unnecessary, mark optional
  4. Test
  5. Production tab > click Migrate

Notes:

  • No review needed if only migrating or reducing scopes
  • Existing user tokens continue with classic scope values until re-authorization
  • New users get granular scopes after migration

Common Error Codes

Code Message Solution
4700 Token cannot be empty Check Authorization header has valid token
4702/4704 Invalid client Verify Client ID and Client Secret
4705 Grant type not supported Use: account_credentials, authorization_code, urn:ietf:params:oauth:grant-type:device_code, or client_credentials
4706 Client ID or secret missing Add credentials to header or request params
4709 Redirect URI mismatch Ensure redirect_uri matches app configuration exactly (including trailing slash)
4711 Refresh token invalid Token scopes don't match client scopes
4717 App has been disabled Contact Zoom support
4733 Code is expired Authorization codes expire in 5 minutes - restart flow
4734 Invalid authorization code Regenerate authorization code
4735 Owner of token does not exist User was removed from account - re-authorize
4741 Token has been revoked Use the most recent token from latest authorization

See references/oauth-errors.md for complete error list.


Quick Reference

Flow Grant Type Token Expiry Refresh
Account (S2S) account_credentials 1 hour Request new token
User authorization_code 1 hour Use refresh_token (90 day expiry)
Device urn:ietf:params:oauth:grant-type:device_code 1 hour Use refresh_token (90 day expiry)
Client (Chatbot) client_credentials 1 hour Request new token

Demo Guidance

If you build an OAuth demo app, document its runtime base URL in that demo project's own README or .env.example, not in this shared skill.

Resources


Integrated Index

This section was migrated from SKILL.md.

Quick Start Path

If you're new to Zoom OAuth, follow this order:

  1. Run preflight checks firstRUNBOOK.md

  2. Choose your OAuth flowconcepts/oauth-flows.md

    • 4 flows: S2S (backend), User (SaaS), Device (no browser), Chatbot
    • Decision matrix: Which flow fits your use case?
  3. Understand token lifecycleconcepts/token-lifecycle.md

    • CRITICAL: How tokens expire, refresh, and revoke
    • Common pitfalls: refresh token rotation
  4. Implement your flow → Jump to examples:

  5. Fix redirect URI issuestroubleshooting/redirect-uri-issues.md

    • Most common OAuth error: Redirect URI mismatch
  6. Implement token refreshexamples/token-refresh.md

    • Automatic middleware pattern
    • Handle refresh token rotation
  7. Troubleshoot errorstroubleshooting/common-errors.md

    • Error code tables (4700-4741 range)
    • Quick diagnostic workflow

Documentation Structure

oauth/
├── SKILL.md                           # Main skill overview
├── SKILL.md                           # This file - navigation guide
│
├── concepts/                          # Core OAuth concepts
│   ├── oauth-flows.md                # 4 flows: S2S, User, Device, Chatbot
│   ├── token-lifecycle.md            # Expiration, refresh, revocation
│   ├── pkce.md                       # PKCE security for public clients
│   ├── scopes-architecture.md        # Classic vs Granular scopes
│   └── state-parameter.md            # CSRF protection with state
│
├── examples/                          # Complete working code
│   ├── s2s-oauth-basic.md            # S2S OAuth minimal example
│   ├── s2s-oauth-redis.md            # S2S OAuth with Redis caching (production)
│   ├── user-oauth-basic.md           # User OAuth minimal example
│   ├── user-oauth-mysql.md           # User OAuth with MySQL + encryption (production)
│   ├── device-flow.md                # Device authorization flow
│   ├── pkce-implementation.md        # PKCE for SPAs/mobile apps
│   └── token-refresh.md              # Auto-refresh middleware pattern
│
├── troubleshooting/                   # Problem solving guides
│   ├── common-errors.md              # Error codes 4700-4741
│   ├── redirect-uri-issues.md        # Most common OAuth error
│   ├── token-issues.md               # Expired, revoked, invalid tokens
│   └── scope-issues.md               # Scope mismatch errors
│
└── references/                        # Reference documentation
    ├── oauth-errors.md                # Complete error code reference
    ├── classic-scopes.md              # Classic scope reference
    └── granular-scopes.md             # Granular scope reference

By Use Case

I want to automate Zoom tasks on my own account

  1. OAuth Flows - S2S OAuth explained
  2. S2S OAuth Redis - Production pattern with Redis caching
  3. Token Lifecycle - 1hr token, no refresh

I want to build a SaaS app for other Zoom users

  1. OAuth Flows - User OAuth explained
  2. User OAuth MySQL - Production pattern with encryption
  3. Token Refresh - Automatic refresh middleware
  4. Redirect URI Issues - Fix most common error

I want to build a mobile or SPA app

  1. PKCE - Why PKCE is required for public clients
  2. PKCE Implementation - Complete code example
  3. State Parameter - CSRF protection

I want to build an app for devices without browsers (TV, kiosk)

  1. OAuth Flows - Device flow explained
  2. Device Flow Example - Complete polling implementation
  3. Common Errors - Device-specific errors

I'm building a Team Chat bot

  1. OAuth Flows - Chatbot flow explained
  2. S2S OAuth Basic - Similar pattern, different grant type
  3. Scopes Architecture - Chatbot-specific scopes

I'm getting redirect URI errors (4709)

  1. Redirect URI Issues - START HERE!
  2. Common Errors - Error details
  3. User OAuth Basic - See correct pattern

I'm getting token errors (4700-4741)

  1. Token Issues - Diagnostic workflow
  2. Token Lifecycle - Understand expiration
  3. Token Refresh - Implement auto-refresh
  4. Common Errors - Error code tables

I'm getting scope errors (4711)

  1. Scope Issues - Mismatch causes
  2. Scopes Architecture - Classic vs Granular
  3. Classic Scopes - Complete scope reference
  4. Granular Scopes - Granular scope reference

I need to refresh tokens

  1. Token Lifecycle - When to refresh
  2. Token Refresh - Middleware pattern
  3. Token Issues - Common mistakes

I want to understand the difference between Classic and Granular scopes

  1. Scopes Architecture - Complete comparison
  2. Classic Scopes - resource:level format
  3. Granular Scopes - service:action:data_claim:access format

I need to secure my OAuth implementation

  1. PKCE - Public client security
  2. State Parameter - CSRF protection
  3. User OAuth MySQL - Token encryption at rest

I want to migrate from JWT app to S2S OAuth

  1. S2S OAuth Redis - Modern replacement
  2. Token Lifecycle - Different token behavior

Note: JWT App Type was deprecated in June 2023. Migrate to S2S OAuth for server-to-server automation.


Most Critical Documents

1. OAuth Flows (DECISION DOCUMENT)

concepts/oauth-flows.md

Understand which of the 4 flows to use:

  • S2S OAuth: Backend automation (your account)
  • User OAuth: SaaS apps (users authorize you)
  • Device Flow: Devices without browsers
  • Chatbot: Team Chat bots only

2. Token Lifecycle (MOST COMMON ISSUE)

concepts/token-lifecycle.md

99% of OAuth issues stem from misunderstanding:

  • Token expiration (1 hour for all flows)
  • Refresh token rotation (must save new refresh token)
  • Revocation behavior (invalidates all tokens)

3. Redirect URI Issues (MOST COMMON ERROR)

troubleshooting/redirect-uri-issues.md

Error 4709 ("Redirect URI mismatch") is the #1 OAuth error. Must match EXACTLY (including trailing slash, http vs https).


Key Learnings

Critical Discoveries:

  1. Refresh Token Rotation

    • Each refresh returns a NEW refresh token
    • Old refresh token becomes invalid
    • Failure to save new token causes 4735 errors
    • See: Token Refresh
  2. S2S OAuth Uses Redis, User OAuth Uses Database

  3. Redirect URI Must Match EXACTLY

    • Trailing slash matters: /callback/callback/
    • Protocol matters: http://https://
    • Port matters: :3000:3001
    • See: Redirect URI Issues
  4. PKCE Required for Public Clients

    • Mobile apps CANNOT keep secrets
    • SPAs CANNOT keep secrets
    • PKCE prevents authorization code interception
    • See: PKCE
  5. State Parameter Prevents CSRF

    • Generate random state before redirect
    • Store in session
    • Verify on callback
    • See: State Parameter
  6. Token Storage Must Be Encrypted

  7. JWT App Type is Deprecated (June 2023)

    • No new JWT apps can be created
    • Existing apps still work but will eventually be sunset
    • Migrate to S2S OAuth or User OAuth
  8. Scope Levels Determine Authorization Requirements

    • No suffix (user-level): Any user can authorize
    • :admin: Requires admin role
    • :master: Requires account owner (multi-account)
    • See: Scopes Architecture
  9. Authorization Codes Expire in 5 Minutes

    • Exchange code for token immediately
    • Don't cache authorization codes
    • See: Token Lifecycle
  10. Device Flow Requires Polling

    • Poll at interval returned by /devicecode (usually 5s)
    • Handle authorization_pending, slow_down, expired_token
    • See: Device Flow

Quick Reference

"Which OAuth flow should I use?"

OAuth Flows

"Redirect URI mismatch error (4709)"

Redirect URI Issues

"Token expired or invalid"

Token Issues

"Refresh token invalid (4735)"

Token Refresh - Must save new refresh token

"Scope mismatch error (4711)"

Scope Issues

"How do I secure my OAuth app?"

PKCE + State Parameter

"How do I implement auto-refresh?"

Token Refresh

"What's the difference between Classic and Granular scopes?"

Scopes Architecture

"What error code means what?"

Common Errors


Document Version

Based on Zoom OAuth API v2 (2024+)

Deprecated: JWT App Type (June 2023)


Happy coding!

Remember: Start with OAuth Flows to understand which flow fits your use case!

Environment Variables

Zoom Phone集成参考技能,涵盖OAuth、API、Webhook、Smart Embed及URI方案。提供架构生命周期指南、路由护栏及CRM/CTI场景实现建议,助力构建通话自动化与嵌入式软电话功能。
需要实现Zoom Phone OAuth认证 开发基于REST API和Webhook的通话自动化 在Web应用中嵌入Softphone(Smart Embed) 通过URI Scheme实现点击拨号或发送短信 集成CRM或CTI拨号器 处理通话记录持久化与事件捕获
partner-built/zoom-plugin/skills/phone/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill build-zoom-phone-integration -g -y
SKILL.md
Frontmatter
{
    "name": "build-zoom-phone-integration",
    "triggers": [
        "zoom phone",
        "phone smart embed",
        "zoom phone api",
        "zoom phone webhook",
        "call history",
        "call handling",
        "zoomphonecall",
        "zoomphonesms",
        "phone crm integration",
        "call element"
    ],
    "description": "Reference skill for Zoom Phone. Use after routing to a phone workflow when implementing OAuth, Phone APIs, webhooks, Smart Embed events, URI schemes, CRM or CTI dialers, or call handling automation."
}

/build-zoom-phone-integration

Background reference for Zoom Phone integrations across API, webhook, Smart Embed, and URI-launch workflows.

Implementation guidance for Zoom Phone integrations across API, webhook/event, Smart Embed, and URI-launch workflows.

Official docs:

Routing Guardrail

Quick Links

Start here:

  1. concepts/architecture-and-lifecycle.md
  2. scenarios/high-level-scenarios.md
  3. references/deprecations-and-migrations.md
  4. references/forum-top-questions.md
  5. references/smart-embed-event-contract.md
  6. references/call-handling-patterns.md
  7. references/environment-variables.md
  8. references/crm-sample-validation.md
  9. troubleshooting/common-issues.md
  10. RUNBOOK.md
  11. examples/smart-embed-postmessage-bridge.md
  12. examples/phone-api-service-pattern.md
  13. references/source-map.md

Common Lifecycle Pattern

  1. Provision account prerequisites (Zoom Phone license, admin setup, SMS readiness).
  2. Create OAuth app and scopes in Marketplace.
  3. Choose integration surface:
  • Smart Embed (iframe + postMessage)
  • REST + webhooks
  • URI launch (callto, tel, zoomphonecall, zoomphonesms)
  1. Capture real-time events (Smart Embed events and/or webhooks).
  2. Persist call identifiers and correlate records (call_id, call_history_uuid, call_element_id).
  3. Apply migration-safe data mapping (v1 -> v2 -> v3) and handle renamed fields.
  4. Harden security (origin validation, webhook signature validation, least-privilege scopes).

High-Level Scenarios

  • CRM softphone pane using Smart Embed + contact search/match callbacks.
  • Click-to-call from account/contact table via zp-make-call.
  • Call disposition workflow using zp-save-log-event and custom notes page.
  • SMS engagement workflow with zoomphonesms:// and zp-sms-log-event.
  • Real-time operational board driven by phone.* webhook events.
  • Call analytics migration from legacy call logs to call history/call elements.
  • Admin automation for user/auto-receptionist/call-queue call-handling settings.

See scenarios/high-level-scenarios.md for details.

Chaining

Environment Variables

将Zoom集成创意转化为可落地的实施计划,涵盖架构设计、认证权限、分阶段交付里程碑及风险清单。适用于需要构建方案、明确下一步行动的场景。
用户需要制定Zoom应用或集成的开发路线图 用户希望评估Zoom集成的技术风险和可行性 用户请求生成包含认证和API详情的实施方案
partner-built/zoom-plugin/skills/plan-zoom-integration/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill plan-zoom-integration -g -y
SKILL.md
Frontmatter
{
    "name": "plan-zoom-integration",
    "description": "Turn a Zoom integration idea into an implementation plan with architecture, auth, and delivery milestones. Use when you need a practical build plan, phased delivery sequence, risk list, and next-step recommendation.",
    "argument-hint": "<what you want to build>",
    "user-invocable": false
}

/plan-zoom-integration

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Create a practical build plan for a Zoom integration or app.

Usage

/plan-zoom-integration $ARGUMENTS

Workflow

  1. Capture the target user flow and success criteria.
  2. Choose the correct Zoom surface and supporting services.
  3. Define auth requirements, scopes, and account assumptions.
  4. Break implementation into phases: prototype, core integration, reliability, and launch.
  5. Call out hard risks early: OAuth setup, webhook verification, SDK environment limits, marketplace review, or MCP client constraints.
  6. End with the smallest deliverable that proves the architecture.

Output

  • Architecture summary
  • Zoom products and APIs required
  • Auth and scope checklist
  • Delivery phases
  • Risks, open questions, and immediate next action

Related Skills

根据具体用例(如自动化、嵌入式会议或AI工具)推荐最合适的Zoom集成方案(如REST API、SDK或MCP),并解释权衡利弊与实施步骤。
需要选择Zoom集成技术栈 评估不同Zoom产品方案的优劣 规划特定业务场景的Zoom实现路径
partner-built/zoom-plugin/skills/plan-zoom-product/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill plan-zoom-product -g -y
SKILL.md
Frontmatter
{
    "name": "plan-zoom-product",
    "description": "Choose the right Zoom building surface for a use case and explain the tradeoffs clearly. Use when deciding between REST API, Webhooks, WebSockets, Meeting SDK, Video SDK, Zoom Apps SDK, Phone, Contact Center, or MCP for a specific product idea or integration goal.",
    "argument-hint": "<product idea, app type, or integration goal>",
    "user-invocable": false
}

/plan-zoom-product

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Choose between Zoom REST API, Webhooks, WebSockets, Meeting SDK, Video SDK, Zoom Apps SDK, Phone, Contact Center, or MCP for a specific use case.

Usage

/plan-zoom-product $ARGUMENTS

Workflow

  1. Identify the user's actual goal.
  2. Classify whether the problem is automation, embedded meetings, custom video, in-client app behavior, event delivery, AI tooling, or support/phone/contact-center work.
  3. If the request is ambiguous, ask one short clarifier before locking the recommendation.
  4. Recommend the primary Zoom surface and list the minimum supporting pieces.
  5. Explain why the rejected alternatives are worse for this case.
  6. End with a concrete next-step plan.

Output

  • Recommended Zoom surface
  • Supporting components required
  • Key tradeoffs and constraints
  • Suggested implementation sequence
  • Relevant skill links for the next step

Related Skills

Zoom Probe SDK参考技能,用于会议加入前的客户端设备与网络预检。支持浏览器兼容性、媒体权限、音视频诊断和网络就绪性测试,生成就绪评分报告,适用于预加入页面及故障排查场景。
用户需要进行会议加入前的设备或网络诊断 需要检测浏览器兼容性或媒体权限状态 需要获取音视频质量及网络就绪性评分 开发预加入检查页面或自助故障排查工具
partner-built/zoom-plugin/skills/probe-sdk/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill probe-sdk -g -y
SKILL.md
Frontmatter
{
    "name": "probe-sdk",
    "triggers": [
        "probe sdk",
        "zoom probe",
        "@zoom\/probesdk",
        "media diagnostics",
        "network diagnostic",
        "preflight check",
        "diagnose audio video",
        "browser compatibility diagnostics",
        "diagnostic report"
    ],
    "description": "Reference skill for Zoom Probe SDK. Use after routing to a preflight workflow when testing browser compatibility, media permissions, audio or video diagnostics, and network readiness before users join.",
    "user-invocable": false
}

Zoom Probe SDK

Background reference for preflight diagnostics on user devices and networks before meeting or session workflows.

Official docs:

Reference sample:

Routing Guardrail

Quick Links

Start here:

  1. probe-sdk.md
  2. concepts/architecture-and-lifecycle.md
  3. scenarios/high-level-scenarios.md
  4. examples/diagnostic-page-pattern.md
  5. examples/comprehensive-network-pattern.md
  6. references/probe-reference-map.md
  7. references/environment-variables.md
  8. references/versioning-and-compatibility.md
  9. references/samples-validation.md
  10. references/source-map.md
  11. troubleshooting/common-issues.md
  12. RUNBOOK.md

Common Lifecycle Pattern

  1. Initialize Prober / Reporter.
  2. Request media permissions and enumerate devices.
  3. Run targeted diagnostics (diagnoseAudio, diagnoseVideo).
  4. Run comprehensive network diagnostic (startToDiagnose) and stream stats to UI.
  5. Produce final report and apply readiness gates.
  6. Stop/cleanup (stopToDiagnose, stopToDiagnoseVideo, releaseMediaStream, cleanup).

High-Level Scenarios

  • Pre-join diagnostics page before Meeting SDK join action.
  • Support workflow that captures structured report for customer troubleshooting.
  • Device certification flow for kiosk or controlled endpoint environments.
  • Browser capability gating for advanced media features.

See scenarios/high-level-scenarios.md for details.

Chaining

Environment Variables

Operations

  • RUNBOOK.md - 5-minute preflight and debugging checklist.
提供Zoom REST API服务端集成的参考指南,涵盖600+端点管理、OAuth认证、速率限制及错误调试。适用于需进行API选型、资源管理及自动化开发的技术场景。
需要选择Zoom REST API端点 实现服务端资源管理逻辑 配置OAuth认证流程 处理API速率限制问题 调试API返回的错误
partner-built/zoom-plugin/skills/rest-api/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill build-zoom-rest-api-app -g -y
SKILL.md
Frontmatter
{
    "name": "build-zoom-rest-api-app",
    "triggers": [
        "api call",
        "rest api",
        "api create meeting",
        "api get meeting",
        "api list meetings",
        "api update meeting",
        "api delete meeting",
        "meeting endpoint",
        "\/v2\/meetings",
        "create user",
        "zoom api",
        "api endpoint",
        "recordings api",
        "users api",
        "webinars api",
        "server-to-server oauth",
        "account_credentials",
        "account id",
        "invalid access token",
        "does not contain scopes",
        "access token is expired",
        "webhook verification",
        "crc",
        "download_url"
    ],
    "description": "Reference skill for Zoom REST API. Use after choosing an API-based workflow when you need endpoint selection, resource-management patterns, OAuth requirements, rate-limit awareness, or API error debugging."
}

/build-zoom-rest-api-app

Background reference for deterministic server-side Zoom automation and resource management. Prefer plan-zoom-product, plan-zoom-integration, or debug-zoom first, then route here for endpoint-level detail.

Zoom REST API

Expert guidance for building server-side integrations with the Zoom REST API. This API provides 600+ endpoints for managing meetings, users, webinars, recordings, reports, and all Zoom platform resources programmatically.

Official Documentation: https://developers.zoom.us/api-hub/ API Hub Reference: https://developers.zoom.us/api-hub/meetings/ OpenAPI Inventories: https://developers.zoom.us/api-hub/<domain>/methods/endpoints.json

Quick Links

New to Zoom REST API? Follow this path:

  1. API Architecture - Base URLs, regional URLs, me keyword, ID vs UUID, time formats
  2. Authentication Flows - OAuth setup (S2S, User, PKCE, Device Code)
  3. Meeting URLs vs Meeting SDK - Stop mixing join_url with Meeting SDK
  4. Meeting Lifecycle - Create → Update → Start → End → Delete with webhooks
  5. Rate Limiting Strategy - Plan tiers, per-user limits, retry patterns

Reference:

  • Meetings - Meeting CRUD, types, settings
  • Users - User provisioning and management
  • Recordings - Cloud recording access and download
  • AI Services - Scribe endpoint inventory and current AI Services path surface
  • GraphQL Queries - Alternative query API (beta)
  • Integrated Index - see the section below in this file

Most domain files under references/ are aligned to the official API Hub endpoints.json inventories. Treat those files as the local source of truth for method/path discovery.

Having issues?

Building event-driven integrations?

Quick Start

Get an Access Token (Server-to-Server OAuth)

curl -X POST "https://zoom.us/oauth/token" \
  -H "Authorization: Basic $(echo -n 'CLIENT_ID:CLIENT_SECRET' | base64)" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "grant_type=account_credentials&account_id=ACCOUNT_ID"

Response:

{
  "access_token": "eyJhbGciOiJIUzI1NiJ9...",
  "token_type": "bearer",
  "expires_in": 3600,
  "scope": "meeting:read meeting:write user:read"
}

Create a Meeting

curl -X POST "https://api.zoom.us/v2/users/HOST_USER_ID/meetings" \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "topic": "Team Standup",
    "type": 2,
    "start_time": "2025-03-15T10:00:00Z",
    "duration": 30,
    "settings": {
      "join_before_host": false,
      "waiting_room": true
    }
  }'

For S2S OAuth, use an explicit host user ID or email in the path. Do not use me.

List Users with Pagination

curl "https://api.zoom.us/v2/users?page_size=300&status=active" \
  -H "Authorization: Bearer ACCESS_TOKEN"

Base URL

https://api.zoom.us/v2

Regional Base URLs

The api_url field in OAuth token responses indicates the user's region. Use regional URLs for data residency compliance:

Region URL
Global (default) https://api.zoom.us/v2
Australia https://api-au.zoom.us/v2
Canada https://api-ca.zoom.us/v2
European Union https://api-eu.zoom.us/v2
India https://api-in.zoom.us/v2
Saudi Arabia https://api-sa.zoom.us/v2
Singapore https://api-sg.zoom.us/v2
United Kingdom https://api-uk.zoom.us/v2
United States https://api-us.zoom.us/v2

Note: You can always use the global URL https://api.zoom.us regardless of the api_url value.

Key Features

Feature Description
Meeting Management Create, read, update, delete meetings with full scheduling control
User Provisioning Automated user lifecycle (create, update, deactivate, delete)
Webinar Operations Webinar CRUD, registrant management, panelist control
Cloud Recordings List, download, delete recordings with file-type filtering
Reports & Analytics Usage reports, participant data, daily statistics
Team Chat Channel management, messaging, chatbot integration
Zoom Phone Call management, voicemail, call routing
Zoom Rooms Room management, device control, scheduling
Webhooks Real-time event notifications for 100+ event types
WebSockets Persistent event streaming without public endpoints
GraphQL (Beta) Single-endpoint flexible queries at v3/graphql
AI Companion Meeting summaries, transcripts, AI-generated content
AI Services / Scribe File and archive transcription via Build-platform JWT-authenticated endpoints

Prerequisites

  • Zoom account (Free tier has API access with lower rate limits)
  • App registered on Zoom App Marketplace
  • OAuth credentials (Server-to-Server OAuth or User OAuth)
  • Appropriate scopes for target endpoints

Need help with authentication? See the zoom-oauth skill for complete OAuth flow implementation.

Critical Gotchas and Best Practices

⚠️ JWT App Type is Deprecated

The JWT app type is deprecated. Migrate to Server-to-Server OAuth. This does NOT affect JWT token signatures used in Video SDK — only the Marketplace "JWT" app type for REST API access.

// OLD (JWT app type - DEPRECATED)
const token = jwt.sign({ iss: apiKey, exp: expiry }, apiSecret);

// NEW (Server-to-Server OAuth)
const token = await getServerToServerToken(accountId, clientId, clientSecret);

⚠️ The me Keyword Rules

  • User-level OAuth apps: MUST use me instead of userId (otherwise: invalid token error)
  • Server-to-Server OAuth apps: MUST NOT use me — provide the actual userId or email
  • Account-level OAuth apps: Can use either me or userId

⚠️ Meeting ID vs UUID — Double Encoding

UUIDs that begin with / or contain // must be double URL-encoded:

// UUID: /abc==
// Single encode: %2Fabc%3D%3D
// Double encode: %252Fabc%253D%253D  ← USE THIS

const uuid = '/abc==';
const encoded = encodeURIComponent(encodeURIComponent(uuid));
const url = `https://api.zoom.us/v2/meetings/${encoded}`;

⚠️ Time Formats

  • yyyy-MM-ddTHH:mm:ssZUTC time (note the Z suffix)
  • yyyy-MM-ddTHH:mm:ssLocal time (no Z, uses timezone field)
  • Some report APIs only accept UTC. Check the API reference for each endpoint.

⚠️ Rate Limits Are Per-Account, Not Per-App

All apps on the same Zoom account share rate limits. One heavy app can impact others. Monitor X-RateLimit-Remaining headers proactively.

⚠️ Per-User Daily Limits

Meeting/Webinar create/update operations are limited to 100 per day per user (resets at 00:00 UTC). Distribute operations across different host users when doing bulk operations.

⚠️ Download URLs Require Auth and Follow Redirects

Recording download_url values require Bearer token authentication and may redirect. Always follow redirects:

curl -L -H "Authorization: Bearer ACCESS_TOKEN" "https://zoom.us/rec/download/..."

Use Webhooks Instead of Polling

// DON'T: Poll every minute (wastes API quota)
setInterval(() => getMeetings(), 60000);

// DO: Receive webhook events in real-time
app.post('/webhook', (req, res) => {
  if (req.body.event === 'meeting.started') {
    handleMeetingStarted(req.body.payload);
  }
  res.status(200).send();
});

Webhook setup details: See the zoom-webhooks skill for comprehensive webhook implementation.

Complete Documentation Library

This skill includes comprehensive guides organized by category:

Core Concepts

Complete Examples

Troubleshooting

  • Common Errors - HTTP status codes, Zoom error codes, error response formats
  • Common Issues - Rate limits, token refresh, pagination pitfalls, gotchas

References (39 files covering all Zoom API domains)

Core APIs

Communication

Infrastructure

Advanced

Additional API Domains

Sample Repositories

Official (by Zoom)

Type Repository
OAuth Sample oauth-sample-app
S2S OAuth Starter server-to-server-oauth-starter-api
User OAuth user-level-oauth-starter
S2S Token server-to-server-oauth-token
Rivet Library rivet-javascript
WebSocket Sample websocket-js-sample
Webhook Sample webhook-sample-node.js
Python S2S server-to-server-python-sample

Resources


Need help? Start with Integrated Index section below for complete navigation.


Integrated Index

This section was migrated from SKILL.md.

Quick Start Path

If you're new to the Zoom REST API, follow this order:

  1. Run preflight checks firstRUNBOOK.md

  2. Understand the API designconcepts/api-architecture.md

    • Base URLs, regional endpoints, me keyword rules
    • Meeting ID vs UUID, double-encoding, time formats
  3. Set up authenticationconcepts/authentication-flows.md

    • Server-to-Server OAuth (backend automation)
    • User OAuth with PKCE (user-facing apps)
    • Cross-reference: zoom-oauth
  4. Create your first meetingexamples/meeting-lifecycle.md

    • Full CRUD with curl and Node.js examples
    • Webhook event integration
  5. Handle rate limitsconcepts/rate-limiting-strategy.md

    • Plan-based limits, retry patterns, request queuing
  6. Set up webhooksexamples/webhook-server.md

    • CRC validation, signature verification, event handling
  7. Troubleshoot issuestroubleshooting/common-issues.md

    • Token refresh, pagination pitfalls, common gotchas

Documentation Structure

rest-api/
├── SKILL.md                              # Main skill overview + quick start
├── SKILL.md                              # This file - navigation guide
│
├── concepts/                             # Core architectural concepts
│   ├── api-architecture.md              # REST design, URLs, IDs, time formats
│   ├── authentication-flows.md          # OAuth flows (S2S, User, PKCE, Device)
│   └── rate-limiting-strategy.md        # Limits by plan, retry, queuing
│
├── examples/                             # Complete working code
│   ├── meeting-lifecycle.md             # Create→Update→Start→End→Delete
│   ├── user-management.md              # CRUD users, pagination, bulk ops
│   ├── recording-pipeline.md           # Download recordings via webhooks
│   ├── webhook-server.md               # Express.js CRC + signature verification
│   └── graphql-queries.md              # GraphQL queries, mutations, pagination
│
├── troubleshooting/                      # Problem solving
│   ├── common-errors.md                # HTTP codes, Zoom error codes table
│   └── common-issues.md               # Rate limits, tokens, pagination pitfalls
│
└── references/                           # 39 domain-specific reference files
    ├── authentication.md                # Auth methods reference
    ├── meetings.md                      # Meeting endpoints
    ├── users.md                         # User management endpoints
    ├── webinars.md                      # Webinar endpoints
    ├── recordings.md                    # Cloud recording endpoints
    ├── reports.md                       # Reports & analytics
    ├── accounts.md                      # Account management
    ├── rate-limits.md                   # Rate limit details
    ├── graphql.md                       # GraphQL API (beta)
    ├── zoom-team-chat.md                     # Team Chat messaging
    ├── chatbot.md                       # Chatbot integration
    ├── phone.md                         # Zoom Phone
    ├── rooms.md                         # Zoom Rooms
    ├── calendar.md                      # Zoom Calendar
    ├── mail.md                          # Zoom Mail
    ├── ai-companion.md                  # AI features
    ├── openapi.md                       # OpenAPI specs
    ├── qss.md                           # Quality of Service
    ├── contact-center.md                # Contact Center
    ├── events.md                        # Zoom Events
    ├── whiteboard.md                    # Whiteboard
    ├── clips.md                         # Zoom Clips
    ├── scheduler.md                     # Scheduler
    ├── scim2.md                         # SCIM 2.0
    ├── marketplace-apps.md              # App management
    ├── zoom-video-sdk-api.md                 # Video SDK REST
    └── ... (39 total files)

By Use Case

I want to create and manage meetings

  1. API Architecture - Base URL, time formats
  2. Meeting Lifecycle - Full CRUD + webhook events
  3. Meetings Reference - All endpoints, types, settings

I want to manage users programmatically

  1. User Management - CRUD, pagination, bulk ops
  2. Users Reference - Endpoints, user types, scopes

I want to download recordings automatically

  1. Recording Pipeline - Webhook-triggered downloads
  2. Recordings Reference - File types, download auth

I want to receive real-time events

  1. Webhook Server - CRC validation, signature check
  2. Cross-reference: zoom-webhooks for comprehensive webhook docs
  3. Cross-reference: zoom-websockets for WebSocket events

I want to use GraphQL instead of REST

  1. GraphQL Queries - Queries, mutations, pagination
  2. GraphQL Reference - Available entities, scopes, rate limits

I want to set up authentication

  1. Authentication Flows - All OAuth methods
  2. Cross-reference: zoom-oauth for full OAuth implementation

I'm hitting rate limits

  1. Rate Limiting Strategy - Limits by plan, strategies
  2. Rate Limits Reference - Detailed tables
  3. Common Issues - Practical solutions

I'm getting errors

  1. Common Errors - Error code tables
  2. Common Issues - Diagnostic workflow

I want to build webinars

  1. Webinars Reference - Endpoints, types, registrants
  2. Meeting Lifecycle - Similar patterns apply

I want to integrate Zoom Phone

  1. Phone Reference - Phone API endpoints
  2. Rate Limiting Strategy - Separate Phone rate limits

Most Critical Documents

1. API Architecture (FOUNDATION)

concepts/api-architecture.md

Essential knowledge before making any API call:

  • Base URLs and regional endpoints
  • The me keyword rules (different per app type!)
  • Meeting ID vs UUID double-encoding
  • ISO 8601 time formats (UTC vs local)
  • Download URL authentication

2. Rate Limiting Strategy (MOST COMMON PRODUCTION ISSUE)

concepts/rate-limiting-strategy.md

Rate limits are per-account, shared across all apps:

  • Free: 4/sec Light, 2/sec Medium, 1/sec Heavy
  • Pro: 30/sec Light, 20/sec Medium, 10/sec Heavy
  • Business+: 80/sec Light, 60/sec Medium, 40/sec Heavy
  • Per-user: 100 meeting create/update per day

3. Meeting Lifecycle (MOST COMMON TASK)

examples/meeting-lifecycle.md

Complete CRUD with webhook integration — the pattern most developers need first.


Key Learnings

Critical Discoveries:

  1. JWT app type is deprecated — use Server-to-Server OAuth

  2. me keyword behaves differently by app type

  3. Rate limiting is nuanced (don’t assume a single global rule)

    • Limits can vary by endpoint and may be enforced at account/app/user levels
    • Treat quotas as potentially shared across your account and implement backoff
    • Monitor rate limit response headers (for example X-RateLimit-Remaining)
    • See: Rate Limiting Strategy
  4. 100 meeting creates per user per day

    • This is a hard per-user limit, not related to rate limits
    • Distribute across host users for bulk operations
    • See: Rate Limiting Strategy
  5. UUID double-encoding is required for certain UUIDs

    • UUIDs starting with / or containing // must be double-encoded
    • See: API Architecture
  6. Pagination: use next_page_token, not page_number

    • page_number is legacy and being phased out
    • next_page_token is the recommended approach
    • See: Common Issues
  7. GraphQL is at /v3/graphql, not /v2/

    • Single endpoint, cursor-based pagination
    • Rate limits apply per-field (each field = one REST equivalent)
    • See: GraphQL Queries

Quick Reference

"401 Unauthorized"

Authentication Flows - Token expired or wrong scopes

"429 Too Many Requests"

Rate Limiting Strategy - Check headers for reset time

"Invalid token" when using userId

API Architecture - User OAuth apps must use me

"How do I paginate results?"

Common Issues - Use next_page_token

"Webhooks not arriving"

Webhook Server - CRC validation required

"Recording download fails"

Recording Pipeline - Bearer auth + follow redirects

"How do I create a meeting?"

Meeting Lifecycle - Full working examples


Related Skills

Skill Use When
zoom-oauth Implementing OAuth flows, token management
zoom-webhooks Deep webhook implementation, event catalog
zoom-websockets WebSocket event streaming
zoom-general Cross-product patterns, community repos

Based on Zoom REST API v2 (current) and GraphQL v3 (beta)

Environment Variables

Zoom Rivet SDK参考技能,用于JavaScript/TypeScript服务端开发。涵盖OAuth认证、Webhook接收、API封装及多模块组合。适用于需快速搭建Node.js服务器处理Zoom集成场景,提供路由指引与最佳实践。
实现Zoom应用的身份验证和令牌管理 构建Webhook事件消费者 开发Typed REST API端点包装器 进行多模块服务器组件编排
partner-built/zoom-plugin/skills/rivet-sdk/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill rivet-sdk -g -y
SKILL.md
Frontmatter
{
    "name": "rivet-sdk",
    "triggers": [
        "rivet",
        "zoom rivet",
        "@zoom\/rivet",
        "rivet javascript",
        "rivet sdk",
        "rivet webhook",
        "rivet oauth",
        "rivet lambda",
        "rivet team chat",
        "rivet chatbot"
    ],
    "description": "Reference skill for Zoom Rivet SDK. Use after routing to a Rivet-based server workflow when implementing auth handling, webhook consumers, API wrappers, multi-module composition, or Lambda receiver patterns.",
    "user-invocable": false
}

Zoom Rivet SDK

Background reference for Zoom Rivet as a JavaScript and TypeScript server framework for Zoom integrations.

Implementation guidance for Zoom Rivet (JavaScript/TypeScript) as a server-side framework for:

  • OAuth and token handling
  • Webhook event consumption
  • Typed REST API endpoint wrappers
  • Multi-module server composition

Official docs:

Reference samples:

Routing Guardrail

  • Rivet SDK is a Node.js framework that bundles Zoom auth handling, webhook receivers, and typed API wrappers.
  • Rivet is recommended for faster server-side scaffolding, but it is not mandatory.
  • At planning start, confirm preference:
  • Do you want Rivet SDK, or direct OAuth + REST without Rivet?
  • Use Rivet when the user wants a Node.js server that combines Zoom auth + webhooks + API calls with minimal glue code.
  • If the user only needs direct API calls from an existing backend, chain with ../rest-api/SKILL.md.
  • If the user is focused on Zoom Team Chat app cards/commands behavior, chain with ../team-chat/SKILL.md.
  • If the user needs SDK embed (Meeting SDK/Video SDK client runtime), route to ../meeting-sdk/SKILL.md or ../video-sdk/SKILL.md.

Quick Links

Start here:

  1. concepts/architecture-and-lifecycle.md
  2. scenarios/high-level-scenarios.md
  3. examples/getting-started-pattern.md
  4. examples/multi-client-pattern.md
  5. references/rivet-reference-map.md
  6. references/versioning-and-compatibility.md
  7. references/samples-validation.md
  8. references/source-map.md
  9. references/environment-variables.md
  10. troubleshooting/common-issues.md
  11. RUNBOOK.md
  12. rivet-sdk.md

Common Lifecycle Pattern

  1. Choose modules and auth model per module (Client Credentials, User OAuth, S2S OAuth, Video SDK JWT).
  2. Instantiate client(s) with credentials, webhook secret, and per-module port.
  3. Register event handlers (webEventConsumer.event(...) or shortcuts).
  4. Implement API calls through client.endpoints.*.
  5. Start receiver(s) and expose webhook endpoint(s) (/zoom/events) to Zoom.
  6. Persist tokens/state for OAuth workloads and enforce signature verification.
  7. Monitor module-specific failures and rotate secrets/version with changelog cadence.

High-Level Scenarios

  • Team Chat slash-command bot + Team Chat data API enrichment.
  • Multi-module backend (Users + Meetings + Team Chat + Phone) sharing one process.
  • Video SDK telemetry backend using videosdk module event stream + API surfaces.
  • ISV orchestration layer with tenant-aware token storage and per-module webhooks.
  • AWS Lambda webhook processor with Rivet AwsLambdaReceiver.

See scenarios/high-level-scenarios.md for details.

Chaining

Environment Variables

Operations

  • RUNBOOK.md - 5-minute preflight and debugging checklist.
Zoom RTMS参考技能,用于处理实时音视频、聊天及屏幕共享等媒体流。适用于后端媒体摄入场景,通过WebSocket协议接收数据,无需会议机器人即可捕获媒体平面,支持Webhook事件触发。
需要接入Zoom实时音频或视频流 处理实时聊天或字幕数据 集成Zoom会议或网络研讨会媒体管道
partner-built/zoom-plugin/skills/rtms/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill zoom-rtms -g -y
SKILL.md
Frontmatter
{
    "name": "zoom-rtms",
    "triggers": [
        "real-time media",
        "rtms",
        "live audio stream",
        "live video stream",
        "meeting transcription",
        "raw audio",
        "raw video",
        "websocket media",
        "live transcript",
        "streaming audio",
        "streaming video",
        "meeting bot media",
        "contact center voice media",
        "participant video on",
        "participant video off",
        "single individual video stream"
    ],
    "description": "Reference skill for Zoom RTMS. Use after routing to a live-media workflow when processing real-time audio, video, chat, transcripts, screen share, or contact-center voice streams.",
    "user-invocable": false
}

Zoom Realtime Media Streams (RTMS)

Background reference for live Zoom media pipelines. Prefer build-zoom-bot first, then use this skill for stream types, capabilities, and RTMS-specific implementation constraints.

Zoom Realtime Media Streams (RTMS)

Expert guidance for accessing live audio, video, transcript, chat, and screen share data from Zoom meetings, webinars, Video SDK sessions, and Zoom Contact Center Voice in real-time. RTMS uses a WebSocket-based protocol with open standards and does not require a meeting bot to capture the media plane.

Read This First (Critical)

RTMS is primarily a backend media ingestion service.

  • Your backend receives and processes live media: audio, video, screen share, chat, transcript.
  • RTMS is not a frontend UI SDK by itself.
  • Processing is event-triggered: backend waits for RTMS start webhook events before stream handling begins.

Optional architecture (common):

  • Add a Zoom App SDK frontend for in-client UI/controls.
  • Stream backend RTMS outputs to frontend via WebSocket (or SSE, gRPC, queue workers, etc.).

Use RTMS for media/data plane, and use frontend frameworks/Zoom Apps for presentation + user interactions.

Official Documentation: https://developers.zoom.us/docs/rtms/ SDK Reference (JS): https://zoom.github.io/rtms/js/ SDK Reference (Python): https://zoom.github.io/rtms/py/ Sample Repository: https://github.com/zoom/rtms-samples

Quick Links

New to RTMS? Follow this path:

  1. Connection Architecture - Two-phase WebSocket design
  2. SDK Quickstart - Fastest way to receive media (recommended)
  3. Manual WebSocket - Full protocol control without SDK
  4. Media Types - Audio, video, transcript, chat, screen share

Complete Implementation:

  • RTMS Bot - End-to-end bot implementation guide

Reference:

Having issues?

Supported Products

Product Webhook Event Payload ID App Type
Meetings meeting.rtms_started / meeting.rtms_stopped meeting_uuid General App
Webinars webinar.rtms_started / webinar.rtms_stopped meeting_uuid (same!) General App
Video SDK session.rtms_started / session.rtms_stopped session_id Video SDK App
Zoom Contact Center Voice Product-specific RTMS/ZCC Voice events Product-specific stream/session identifiers Contact Center / approved RTMS integration

Once connected, the core signaling/media socket model is shared across products. Meetings, webinars, and Video SDK sessions use the familiar start/stop webhooks. Zoom Contact Center Voice adds its own RTMS/ZCC Voice event family and should be treated as the same transport model with product-specific event payloads.

RTMS Overview

RTMS is a data pipeline that gives your app access to live media from Zoom meetings, webinars, and Video SDK sessions without participant bots. Instead of having automated clients join meetings, use RTMS to collect media data directly from Zoom's infrastructure.

What RTMS Provides

Media Type Format Use Cases
Audio PCM (L16), G.711, G.722, Opus Transcription, voice analysis, recording
Video H.264, JPG, PNG Recording, AI vision, thumbnails, active participant selection
Screen Share H.264, JPG, PNG Content capture, slide extraction
Transcript JSON text Meeting notes, search, compliance
Chat JSON text Archive, sentiment analysis

March 2026 Protocol Changes

  • Zoom Contact Center Voice support: RTMS now covers Contact Center Voice audio and transcript scenarios.
  • Transcript Language Identification control: transcript media handshakes now support src_language and enable_lid. Default behavior is LID enabled. Set enable_lid: false to force a fixed language.
  • Single individual video stream subscription: RTMS can now stream one participant's camera feed at a time when data_opt is set to VIDEO_SINGLE_INDIVIDUAL_STREAM.
  • Graceful client-initiated shutdown: backends can send STREAM_CLOSE_REQ over the signaling socket and wait for STREAM_CLOSE_RESP.
  • Media keep-alive tolerance increased: media socket keep-alive timeout is now 65 seconds, not 35.

Two Approaches

Approach Best For Complexity
SDK (@zoom/rtms) Most use cases Low - handles WebSocket complexity
Manual WebSocket Custom protocols, other languages High - full protocol implementation

Prerequisites

  • Node.js 20.3.0+ (24 LTS recommended) for JavaScript SDK
  • Python 3.10+ for Python SDK
  • Zoom General App (for meetings/webinars) or Video SDK App (for Video SDK) with RTMS feature enabled
  • Webhook endpoint for RTMS events
  • Server to receive WebSocket streams

Need RTMS access? Post in Zoom Developer Forum requesting RTMS access with your use case.

Quick Start (SDK - Recommended)

import rtms from "@zoom/rtms";

// All RTMS start/stop events across products
const RTMS_EVENTS = ["meeting.rtms_started", "webinar.rtms_started", "session.rtms_started"];

// Handle webhook events
rtms.onWebhookEvent(({ event, payload }) => {
  if (!RTMS_EVENTS.includes(event)) return;

  const client = new rtms.Client();

  client.onAudioData((data, timestamp, metadata) => {
    console.log(`Audio from ${metadata.userName}: ${data.length} bytes`);
  });

  client.onTranscriptData((data, timestamp, metadata) => {
    const text = data.toString('utf8');
    console.log(`${metadata.userName}: ${text}`);
  });

  client.onJoinConfirm((reason) => {
    console.log(`Joined session: ${reason}`);
  });

  // SDK handles all WebSocket connections automatically
  // Accepts both meeting_uuid and session_id transparently
  client.join(payload);
});

Quick Start (Manual WebSocket)

For full control or non-SDK languages, implement the two-phase WebSocket protocol:

const WebSocket = require('ws');
const crypto = require('crypto');

const RTMS_EVENTS = ['meeting.rtms_started', 'webinar.rtms_started', 'session.rtms_started'];

// 1. Generate signature
// For meetings/webinars: uses meeting_uuid. For Video SDK: uses session_id.
function generateSignature(clientId, idValue, streamId, clientSecret) {
  const message = `${clientId},${idValue},${streamId}`;
  return crypto.createHmac('sha256', clientSecret).update(message).digest('hex');
}

// 2. Handle webhook
app.post('/webhook', (req, res) => {
  res.status(200).send();  // CRITICAL: Respond immediately!
  
  const { event, payload } = req.body;
  if (RTMS_EVENTS.includes(event)) {
    connectToRTMS(payload);
  }
});

// 3. Connect to signaling WebSocket
function connectToRTMS(payload) {
  const { server_urls, rtms_stream_id } = payload;
  // meeting_uuid for meetings/webinars, session_id for Video SDK
  const idValue = payload.meeting_uuid || payload.session_id;
  const signature = generateSignature(CLIENT_ID, idValue, rtms_stream_id, CLIENT_SECRET);
  
  const signalingWs = new WebSocket(server_urls);
  
  signalingWs.on('open', () => {
    signalingWs.send(JSON.stringify({
      msg_type: 1,  // Handshake request
      protocol_version: 1,
      meeting_uuid: idValue,
      rtms_stream_id,
      signature,
      media_type: 9  // AUDIO(1) | TRANSCRIPT(8)
    }));
  });
  
  // ... handle responses, connect to media WebSocket
}

See: Manual WebSocket Guide for complete implementation.

Media Type Bitmask

Combine types with bitwise OR:

Type Value Description
Audio 1 PCM audio samples
Video 2 H.264/JPG video frames
Screen Share 4 Separate from video!
Transcript 8 Real-time speech-to-text
Chat 16 In-meeting chat messages
All 32 All media types

Example: Audio + Transcript = 1 | 8 = 9

Critical Gotchas

Issue Solution
Only 1 connection allowed New connections kick out existing ones. Track active sessions!
Respond 200 immediately If webhook delays, Zoom retries creating duplicate connections
Heartbeat mandatory Respond to msg_type 12 with msg_type 13, or connection dies
Reconnection is YOUR job RTMS doesn't auto-reconnect. Media keep-alive tolerance is now about 65s; signaling remains around 60s
Transcript language drift Use src_language plus enable_lid: false when you want fixed-language transcription instead of automatic language switching
Single participant video only VIDEO_SINGLE_INDIVIDUAL_STREAM supports one participant at a time. A new VIDEO_SUBSCRIPTION_REQ overrides the previous selection
Graceful close is explicit now Use STREAM_CLOSE_REQ / STREAM_CLOSE_RESP when your backend wants to terminate the stream cleanly

Environment Variables

SDK Environment Variables

# Required - Authentication
ZM_RTMS_CLIENT=your_client_id          # Zoom OAuth Client ID
ZM_RTMS_SECRET=your_client_secret      # Zoom OAuth Client Secret

# Optional - Webhook server
ZM_RTMS_PORT=8080                      # Default: 8080
ZM_RTMS_PATH=/webhook                  # Default: /

# Optional - Logging
ZM_RTMS_LOG_LEVEL=info                 # error, warn, info, debug, trace
ZM_RTMS_LOG_FORMAT=progressive         # progressive or json
ZM_RTMS_LOG_ENABLED=true

Manual Implementation Variables

ZOOM_CLIENT_ID=your_client_id
ZOOM_CLIENT_SECRET=your_client_secret
ZOOM_SECRET_TOKEN=your_webhook_token   # For webhook validation

Zoom App Setup

For Meetings and Webinars (General App)

  1. Go to marketplace.zoom.us -> Develop -> Build App
  2. Choose General App -> User-Managed
  3. Features -> Access -> Enable Event Subscription
  4. Add Events -> Search "rtms" -> Select:
    • meeting.rtms_started
    • meeting.rtms_stopped
    • webinar.rtms_started (if using webinars)
    • webinar.rtms_stopped (if using webinars)
  5. Scopes -> Add Scopes -> Search "rtms" -> Add:
    • meeting:read:meeting_audio
    • meeting:read:meeting_video
    • meeting:read:meeting_transcript
    • meeting:read:meeting_chat
    • webinar:read:webinar_audio (if using webinars)
    • webinar:read:webinar_video (if using webinars)
    • webinar:read:webinar_transcript (if using webinars)
    • webinar:read:webinar_chat (if using webinars)

For Video SDK (Video SDK App)

  1. Go to marketplace.zoom.us -> Develop -> Build App
  2. Choose Video SDK App
  3. Use your SDK Key and SDK Secret (not OAuth Client ID/Secret)
  4. Add Events:
    • session.rtms_started
    • session.rtms_stopped

Sample Repositories

Official Samples

Repository Description
rtms-samples RTMSManager, boilerplates, AI samples
rtms-quickstart-js JavaScript SDK quickstart
rtms-quickstart-py Python SDK quickstart
rtms-sdk-cpp C++ SDK
zoom-rtms Main SDK repository

AI Integration Samples

Sample Description
rtms-meeting-assistant-starter-kit AI meeting assistant with summaries
arlo-meeting-assistant Production meeting assistant with DB
videosdk-rtms-transcribe-audio Whisper transcription

Complete Documentation

Concepts

Examples

References

Troubleshooting

Resources


Need help? Start with Integrated Index section below for complete navigation.


Integrated Index

This section was migrated from SKILL.md.

RTMS provides real-time access to live audio, video, transcript, chat, and screen share from Zoom meetings, webinars, and Video SDK sessions.

Critical Positioning

Treat RTMS as a backend service for receiving and processing media streams.

  • Backend role: ingest audio/video/share/chat/transcript, run AI/analytics, persist/forward data.
  • Optional frontend role: Zoom App SDK or web dashboard that consumes processed stream data from backend transport (WebSocket/SSE/other).
  • Kickoff model: backend waits for RTMS start webhook events, then starts stream processing.

Do not model RTMS as a frontend-only SDK.

Quick Start Path

If you're new to RTMS, follow this order:

  1. Run preflight checks first -> RUNBOOK.md

  2. Understand the architecture -> concepts/connection-architecture.md

    • Two-phase WebSocket: Signaling + Media
    • Why RTMS doesn't use bots
  3. Choose your approach -> SDK or Manual

  4. Understand the lifecycle -> concepts/lifecycle-flow.md

    • Webhook -> Signaling -> Media -> Streaming
  5. Configure media types -> references/media-types.md

    • Audio, video, transcript, chat, screen share
  6. Troubleshoot issues -> troubleshooting/common-issues.md

    • Connection problems, duplicate webhooks, missing data

Documentation Structure

rtms/
├── SKILL.md                           # Main skill overview
├── SKILL.md                           # This file - navigation guide
│
├── concepts/                          # Core architectural patterns
│   ├── connection-architecture.md     # Two-phase WebSocket design
│   └── lifecycle-flow.md              # Webhook to streaming flow
│
├── examples/                          # Complete working code
│   ├── sdk-quickstart.md              # Using @zoom/rtms SDK
│   ├── manual-websocket.md            # Raw protocol implementation
│   ├── rtms-bot.md                    # Complete RTMS bot implementation
│   └── ai-integration.md              # Transcription and analysis
│
├── references/                        # Reference documentation
│   ├── media-types.md                 # Audio, video, transcript, chat, share
│   ├── data-types.md                  # All enums and constants
│   ├── connection.md                  # WebSocket protocol details
│   └── webhooks.md                    # Event subscription
│
└── troubleshooting/                   # Problem solving guides
    └── common-issues.md               # FAQ and solutions

By Use Case

I want to get meeting transcripts

  1. SDK Quickstart - Fastest approach
  2. Media Types - Transcript configuration
  3. AI Integration - Whisper, Deepgram, AssemblyAI

I want to record meetings

  1. Media Types - Audio + Video configuration
  2. SDK Quickstart - Receiving media
  3. AI Integration - Gap-filled recording

I want to build an AI meeting assistant

  1. AI Integration - Complete patterns
  2. SDK Quickstart - Media ingestion
  3. Lifecycle Flow - Event handling

I want to build a complete RTMS bot

  1. RTMS Bot - Complete implementation guide
  2. Lifecycle Flow - Webhook to streaming flow
  3. Connection Architecture - Two-phase design

I need full protocol control

  1. Manual WebSocket - START HERE
  2. Connection Architecture - Two-phase design
  3. Data Types - All message types and enums
  4. Connection - Protocol details

I'm getting connection errors

  1. Common Issues - Diagnostic checklist
  2. Connection Architecture - Verify flow
  3. Webhooks - Validation and timing

I want to understand the architecture

  1. Connection Architecture - Two-phase WebSocket
  2. Lifecycle Flow - Complete flow diagram
  3. Data Types - Protocol constants

By Product

I'm building for Zoom Meetings

I'm building for Zoom Webinars

  • Same as meetings, but webhook event is webinar.rtms_started. Payload still uses meeting_uuid (NOT webinar_uuid).
  • Add webinar scopes and event subscriptions. See Webhooks.
  • Only panelist streams are confirmed available. Attendee streams may not be individual.

I'm building for Zoom Video SDK

  • Webhook event: session.rtms_started. Payload uses session_id (NOT meeting_uuid).
  • Requires a Video SDK App with SDK Key/Secret (not OAuth Client ID/Secret).
  • Once connected, the protocol is identical to meetings.
  • See Webhooks for payload details.

Key Documents

1. Connection Architecture (CRITICAL)

concepts/connection-architecture.md

RTMS uses two separate WebSocket connections:

  • Signaling WebSocket: Authentication, control, heartbeats
  • Media WebSocket: Actual audio/video/transcript data

2. SDK vs Manual (DECISION POINT)

examples/sdk-quickstart.md vs examples/manual-websocket.md

SDK Manual
Handles WebSocket complexity Full protocol control
Automatic reconnection DIY reconnection
Less code More code
Best for most use cases Best for custom requirements

3. Critical Gotchas (MOST COMMON ISSUES)

troubleshooting/common-issues.md

  1. Respond 200 immediately - Delayed webhook responses cause duplicates
  2. Only 1 connection per stream - New connections kick out existing
  3. Heartbeat required - Must respond to keep-alive or connection dies
  4. Track active sessions - Prevent duplicate join attempts

Key Learnings

Critical Discoveries:

  1. Two-Phase WebSocket Design

    • Signaling: Control plane (handshake, heartbeat, start/stop)
    • Media: Data plane (audio, video, transcript, chat, share)
    • See: Connection Architecture
  2. Webhook Response Timing

    • MUST respond 200 BEFORE any processing
    • Delayed response -> Zoom retries -> duplicate connections
    • See: Common Issues
  3. Heartbeat is Mandatory

    • Signaling: Receive msg_type 12, respond with msg_type 13
    • Media: Same pattern
    • Failure to respond = connection closed
    • See: Connection
  4. Signature Generation

    • Format: HMAC-SHA256(clientSecret, "clientId,meetingUuid,streamId")
    • For Video SDK, use session_id in place of meetingUuid
    • Webinars still use meeting_uuid (not webinar_uuid)
    • Required for both signaling and media handshakes
    • See: Manual WebSocket
  5. Media Types are Bitmasks

    • Audio=1, Video=2, Share=4, Transcript=8, Chat=16, All=32
    • Combine with OR: Audio+Transcript = 1|8 = 9
    • See: Media Types
  6. Screen Share is SEPARATE from Video

    • Different msg_type (16 vs 15)
    • Different media flag (4 vs 2)
    • Must subscribe separately
    • See: Media Types

Quick Reference

"Connection fails"

-> Common Issues

"Duplicate connections"

-> Webhook timing

"No audio/video data"

-> Media Types - Check configuration

"How do I implement manually?"

-> Manual WebSocket

"What message types exist?"

-> Data Types

"How do I integrate AI?"

-> AI Integration


Document Version

Based on Zoom RTMS SDK v1.x and official documentation as of 2026.


Happy coding!

Remember: Start with SDK Quickstart for the fastest path, or Manual WebSocket if you need full control.

Zoom AI Scribe技能,用于处理上传或存储媒体的转录。支持同步单文件快速模式、异步批量作业及浏览器伪流式传输。涵盖JWT认证、Webhook状态更新及超时处理策略,适用于非实时会议的文本转换需求。
用户上传媒体文件需要转录为文本 处理已存储媒体的批量转录任务 构建基于浏览器的麦克风短文件上传流式转录 设计转录流水线或配置Webhook回调
partner-built/zoom-plugin/skills/scribe/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill scribe -g -y
SKILL.md
Frontmatter
{
    "name": "scribe",
    "triggers": [
        "scribe",
        "ai services scribe",
        "zoom scribe",
        "transcribe audio file",
        "transcribe video file",
        "batch transcription",
        "fast mode transcription",
        "build platform jwt"
    ],
    "description": "Reference skill for Zoom AI Services Scribe. Use after routing to a transcription workflow when handling uploaded or stored media, Build-platform JWT auth, fast mode transcription, batch jobs, or transcript pipeline design.",
    "user-invocable": false
}

Zoom AI Services Scribe

Background reference for Zoom AI Services Scribe across:

  • synchronous single-file transcription (POST /aiservices/scribe/transcribe)
  • asynchronous batch jobs (/aiservices/scribe/jobs*)
  • browser microphone pseudo-streaming via repeated short file uploads
  • webhook-driven batch status updates
  • Build-platform JWT generation and credential handling

Official docs:

Routing Guardrail

  • If the user needs uploaded or stored media transcribed into text, route here first.
  • If the user needs live meeting media without file-based upload/batch jobs, route to ../rtms/SKILL.md.
  • If the user needs Zoom REST API inventory for AI Services paths, chain ../rest-api/SKILL.md.
  • If the user needs webhook signature patterns or generic HMAC receiver hardening, optionally chain ../webhooks/SKILL.md.

Quick Links

  1. concepts/auth-and-processing-modes.md
  2. scenarios/high-level-scenarios.md
  3. examples/fast-mode-node.md
  4. examples/batch-webhook-pipeline.md
  5. references/api-reference.md
  6. references/environment-variables.md
  7. references/samples-validation.md
  8. references/versioning-and-drift.md
  9. troubleshooting/common-drift-and-breaks.md
  10. RUNBOOK.md

Core Workflow

  1. Get Build-platform credentials and generate an HS256 JWT.
  2. Choose fast mode for one short file or batch mode for stored archives / large sets.
  3. Submit the transcription request.
  4. For batch jobs, poll job/file status or receive webhook notifications.
  5. Persist and post-process transcript JSON.

Hosted Fast-Mode Guardrail

  • The formal fast-mode API limits are 100 MB and 2 hours, but hosted browser flows can still time out before the upstream response returns.
  • Current deployed-sample observations:
    • ~17.2 MB MP4 completed in about 26s
    • ~38.6 MB MP4 completed in about 26-37s
    • ~59.2 MB MP4 completed in about 32-34s on the backend
    • some ~59.2 MB browser requests still surfaced as frontend 504 while backend logs later showed 200
  • Treat frontend 504 plus backend 200 as a browser/edge timeout race, not an automatic transcription failure.
  • For hosted UIs, prefer an async request/polling wrapper for fast mode instead of holding the browser open for the full upstream response.
  • For larger or less predictable media, prefer batch mode even when the file is still within the formal fast-mode size limit.

Browser Microphone Pattern

  • scribe does not expose a documented real-time streaming API surface.
  • If you want a browser microphone experience, use pseudo-streaming:
    1. capture microphone audio in short chunks
    2. upload each chunk through the async fast-mode wrapper
    3. poll for completion
    4. append chunk transcripts in sequence
  • Recommended starting cadence:
    • chunk size: 5 seconds
    • acceptable range: 5-10 seconds
    • in-flight chunk requests: 2-3
  • This is a practical UI pattern for incremental transcript updates, not a substitute for rtms.
  • Treat this as a fallback demo pattern, not the preferred production architecture.
  • It adds repeated upload overhead, chunk-boundary drift, browser codec/container variability, and transcript stitching complexity.
  • If the user asks for actual live stream ingestion, low-latency continuous media, or server-push media transport, route to ../rtms/SKILL.md instead.

Endpoint Surface

Mode Method Path Use
Fast POST /aiservices/scribe/transcribe Synchronous transcription for one file
Batch POST /aiservices/scribe/jobs Submit asynchronous batch job
Batch GET /aiservices/scribe/jobs List jobs
Batch GET /aiservices/scribe/jobs/{jobId} Inspect job summary/state
Batch DELETE /aiservices/scribe/jobs/{jobId} Cancel queued/processing job
Batch GET /aiservices/scribe/jobs/{jobId}/files Inspect per-file results

High-Level Scenarios

  • On-demand clip transcription after a user uploads one recording.
  • Batch transcription of stored S3 call archives.
  • Webhook-driven ETL pipeline that writes transcripts to your database/search index.
  • Re-transcription of Zoom-managed recordings after exporting them to your own storage.
  • Offline compliance or QA workflows that need timestamps, channel separation, and speaker hints.

Chaining

Operations

  • RUNBOOK.md - 5-minute preflight and debugging checklist.
规划Zoom MCP工作流,评估是否单独使用MCP或结合REST API。分析目标类型、认证约束及风险,输出推荐策略、混合架构边界及最小化概念验证步骤,辅助AI工作流决策。
需要规划Zoom数据相关的AI工作流 决定在MCP和REST API之间选择或设计混合架构 执行/setup-zoom-mcp命令
partner-built/zoom-plugin/skills/setup-zoom-mcp/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill setup-zoom-mcp -g -y
SKILL.md
Frontmatter
{
    "name": "setup-zoom-mcp",
    "description": "Decide when Zoom MCP is the right fit and produce a safe setup plan for Claude. Use when planning AI workflows over Zoom data, deciding between MCP and REST, or defining a hybrid MCP architecture.",
    "argument-hint": "<AI workflow or MCP use case>"
}

/setup-zoom-mcp

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Plan a Zoom MCP workflow and decide when to use MCP alone versus a hybrid REST API + MCP architecture.

Usage

/setup-zoom-mcp $ARGUMENTS

Workflow

  1. Determine whether the goal is deterministic automation, AI tool orchestration, or a hybrid.
  2. If MCP is appropriate, identify the likely Zoom MCP surface and transport assumptions.
  3. If MCP alone is not enough, define the REST API responsibilities separately.
  4. Call out auth, scope, and client capability constraints.
  5. End with a minimal proof-of-concept sequence.

Output

  • Recommended MCP strategy
  • Connector expectations
  • Hybrid boundaries if REST is also required
  • Risks and setup notes
  • Relevant skill links

Related Skills

指导正确实现 Zoom OAuth 认证,涵盖应用类型选择、授权流程确定、最小权限范围规划、令牌刷新机制及故障排查,避免常见配置错误。
设置 Zoom 应用凭据 选择 OAuth 授权类型 请求 API 作用域 处理令牌刷新逻辑 调试认证失败问题
partner-built/zoom-plugin/skills/setup-zoom-oauth/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill setup-zoom-oauth -g -y
SKILL.md
Frontmatter
{
    "name": "setup-zoom-oauth",
    "description": "Implement Zoom authentication correctly. Use when setting up app credentials, choosing an OAuth grant, requesting scopes, handling token refresh, or debugging auth failures."
}

/setup-zoom-oauth

Use this skill when auth is the blocker or when auth choices will shape the entire integration.

Scope

  • App type selection
  • OAuth grant selection
  • Scope planning
  • Token exchange and refresh
  • Auth debugging and environment assumptions

Workflow

  1. Determine the app model and who is authorizing whom.
  2. Choose the correct grant flow.
  3. Identify minimum scopes for the user flow.
  4. Define token storage and refresh behavior.
  5. Route into the deepest relevant reference docs only after the above is clear.

Primary References

Common Mistakes

  • Picking a grant before clarifying the actor and tenant model
  • Asking for broad scopes before confirming the exact workflow
  • Forgetting refresh-token behavior and token lifecycle handling
  • Reusing an old refresh token after a successful refresh instead of storing the newly returned one
  • Treating auth failures as API failures without checking app configuration first
作为Zoom插件的默认入口技能,用于根据用户需求分类并路由至正确的实现技能(如Meeting SDK、OAuth或Bot开发),避免早期架构错误,提供清晰的技术选型建议。
需要选择Zoom产品表面或技术栈 规划Zoom集成应用的架构 不确定使用哪种Zoom SDK或API
partner-built/zoom-plugin/skills/start/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill start -g -y
SKILL.md
Frontmatter
{
    "name": "start",
    "description": "Start here for any Zoom integration or app idea. Use when you need to choose the right Zoom surface, shape the architecture, or route into the correct implementation skill without reading the whole Zoom doc set first."
}

Start

Use this as the default entry skill for the plugin.

What This Skill Does

  • Classifies the request by job-to-be-done, not by product name alone
  • Routes into the right implementation skill
  • Pulls in product-specific Zoom references only after the route is clear
  • Prevents common early mistakes, especially Meeting SDK vs Video SDK and REST API vs MCP confusion

Routing Table

If the user wants to... Route to
Choose the right Zoom surface for a new project plan-zoom-product
Set up OAuth, tokens, scopes, or app credentials setup-zoom-oauth
Embed or customize a Zoom meeting flow build-zoom-meeting-app
Build a bot, recorder, or real-time meeting processor build-zoom-bot
Use Zoom-hosted MCP for AI workflows setup-zoom-mcp
Debug a broken integration debug-zoom

Supporting Zoom References

Use these only after selecting the workflow:

Operating Rules

  1. Prefer one clear recommendation over a product catalog dump.
  2. Ask a short clarifier only when the route is genuinely ambiguous.
  3. Keep the first response architectural and actionable, then go deep.
  4. Pull in deeper references only when they directly help the current decision or implementation.
Zoom Team Chat集成参考技能,区分Team Chat API(用户身份)与Chatbot API(机器人身份),提供OAuth、消息发送、卡片构建及Webhook等开发指南与故障排查。
构建Zoom团队聊天应用 选择API类型 配置OAuth认证 发送聊天消息 处理交互式按钮或斜杠命令
partner-built/zoom-plugin/skills/team-chat/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill build-zoom-team-chat-app -g -y
SKILL.md
Frontmatter
{
    "name": "build-zoom-team-chat-app",
    "triggers": [
        "zoom team chat",
        "zoom chatbot",
        "zoom messaging",
        "team chat api",
        "chatbot api",
        "zoom slash commands",
        "zoom chat integration"
    ],
    "description": "Reference skill for Zoom Team Chat. Use after routing to a chat workflow when building user-scoped messaging integrations, chatbot experiences, rich cards, buttons, slash commands, or chat webhooks."
}

/build-zoom-team-chat-app

Background reference for Zoom Team Chat integrations. Use this after the workflow is clear, especially when the Team Chat API versus Chatbot API distinction matters.

Read This First (Critical)

There are two different integration types and they are not interchangeable:

  1. Team Chat API (user type)

    • Sends messages as a real authenticated user
    • Uses User OAuth (authorization_code)
    • Endpoint family: /v2/chat/users/...
  2. Chatbot API (bot type)

    • Sends messages as your bot identity
    • Uses Client Credentials (client_credentials)
    • Endpoint family: /v2/im/chat/messages

If you choose the wrong type early, auth/scopes/endpoints all mismatch and implementation fails.

Official Documentation: https://developers.zoom.us/docs/team-chat/
Chatbot Documentation: https://developers.zoom.us/docs/team-chat/chatbot/extend/
API Reference: https://developers.zoom.us/docs/api/rest/reference/chatbot/

Quick Links

New to Team Chat? Follow this path:

  1. Get Started - End-to-end fast path (user type vs bot type)
  2. Choose Your API - Team Chat API vs Chatbot API
  3. Environment Setup - Credentials, scopes, app configuration
  4. OAuth Setup - Complete authentication flow
  5. Send First Message - Working code to send messages

Reference:

Having issues?

OAuth endpoint sanity check:

  • Authorize URL: https://zoom.us/oauth/authorize
  • Token URL: https://zoom.us/oauth/token
  • If /oauth/token returns 404/HTML, use https://zoom.us/oauth/token.

Building Interactive Bots?

Quick Decision: Which API?

Use Case API to Use
Send notifications from scripts/CI/CD Team Chat API
Automate messages as a user Team Chat API
Build an interactive chatbot Chatbot API
Respond to slash commands Chatbot API
Create messages with buttons/forms Chatbot API
Handle user interactions Chatbot API

Team Chat API (User-Level)

  • Messages appear as sent by authenticated user
  • Requires User OAuth (authorization_code flow)
  • Endpoint: POST https://api.zoom.us/v2/chat/users/me/messages
  • Scopes: chat_message:write, chat_channel:read

Chatbot API (Bot-Level)

  • Messages appear as sent by your bot
  • Requires Client Credentials grant
  • Endpoint: POST https://api.zoom.us/v2/im/chat/messages
  • Scopes: imchat:bot (auto-added)
  • Rich cards: buttons, forms, dropdowns, images

Prerequisites

System Requirements

  • Zoom account
  • Account owner, admin, or Zoom for developers role enabled
    • To enable: User ManagementRolesRole SettingsAdvanced features → Enable Zoom for developers

Create Zoom App

  1. Go to Zoom App Marketplace
  2. Click DevelopBuild App
  3. Select General App (OAuth)

⚠️ Do NOT use Server-to-Server OAuth - S2S apps don't have the Chatbot/Team Chat feature. Only General App (OAuth) supports chatbots.

Required Credentials

From Zoom Marketplace → Your App:

Credential Location Used By
Client ID App Credentials → Development Both APIs
Client Secret App Credentials → Development Both APIs
Account ID App Credentials → Development Chatbot API
Bot JID Features → Chatbot → Bot Credentials Chatbot API
Secret Token Features → Team Chat Subscriptions Chatbot API

See: Environment Setup Guide for complete configuration steps.

Quick Start: Team Chat API

Send a message as a user:

// 1. Get access token via OAuth
const accessToken = await getOAuthToken(); // See examples/oauth-setup.md

// 2. Send message to channel
const response = await fetch('https://api.zoom.us/v2/chat/users/me/messages', {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${accessToken}`,
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    message: 'Hello from CI/CD pipeline!',
    to_channel: 'CHANNEL_ID'
  })
});

const data = await response.json();
// { "id": "msg_abc123", "date_time": "2024-01-15T10:30:00Z" }

Complete example: Send Message Guide

Quick Start: Chatbot API

Build an interactive chatbot:

// 1. Get chatbot token (client_credentials)
async function getChatbotToken() {
  const credentials = Buffer.from(
    `${CLIENT_ID}:${CLIENT_SECRET}`
  ).toString('base64');
  
  const response = await fetch('https://zoom.us/oauth/token', {
    method: 'POST',
    headers: {
      'Authorization': `Basic ${credentials}`,
      'Content-Type': 'application/x-www-form-urlencoded'
    },
    body: 'grant_type=client_credentials'
  });
  
  return (await response.json()).access_token;
}

// 2. Send chatbot message with buttons
const response = await fetch('https://api.zoom.us/v2/im/chat/messages', {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${accessToken}`,
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    robot_jid: process.env.ZOOM_BOT_JID,
    to_jid: payload.toJid,           // From webhook
    account_id: payload.accountId,   // From webhook
    content: {
      head: {
        text: 'Build Notification',
        sub_head: { text: 'CI/CD Pipeline' }
      },
      body: [
        { type: 'message', text: 'Deployment successful!' },
        {
          type: 'fields',
          items: [
            { key: 'Branch', value: 'main' },
            { key: 'Commit', value: 'abc123' }
          ]
        },
        {
          type: 'actions',
          items: [
            { text: 'View Logs', value: 'view_logs', style: 'Primary' },
            { text: 'Dismiss', value: 'dismiss', style: 'Default' }
          ]
        }
      ]
    }
  })
});

Complete example: Chatbot Setup Guide

Key Features

Team Chat API

Feature Description
Send Messages Post messages to channels or direct messages
List Channels Get user's channels with metadata
Create Channels Create public/private channels programmatically
Threaded Replies Reply to specific messages in threads
Edit/Delete Modify or remove messages

Chatbot API

Feature Description
Rich Message Cards Headers, images, fields, buttons, forms
Slash Commands Custom /commands trigger webhooks
Button Actions Interactive buttons with webhook callbacks
Form Submissions Collect user input with forms
Dropdown Selects Channel, member, date/time pickers
LLM Integration Easy integration with Claude, GPT, etc.

Webhook Events (Chatbot API)

Event Trigger Use Case
bot_notification User messages bot or uses slash command Process commands, integrate LLM
bot_installed Bot added to account Initialize bot state
interactive_message_actions Button clicked Handle button actions
chat_message.submit Form submitted Process form data
app_deauthorized Bot removed Cleanup

See: Webhook Events Reference

Message Card Components

Build rich interactive messages with these components:

Component Description
header Title and subtitle
message Plain text
fields Key-value pairs
actions Buttons (Primary, Danger, Default styles)
section Colored sidebar grouping
attachments Images with links
divider Horizontal line
form_field Text input
dropdown Select menu
date_picker Date selection

See: Message Cards Reference for complete component catalog

Architecture Patterns

Chatbot Lifecycle

User types /command → Webhook receives bot_notification
                            ↓
                     payload.cmd = "user's input"
                            ↓
                     Process command
                            ↓
                     Send response via sendChatbotMessage()

LLM Integration Pattern

case 'bot_notification': {
  const { toJid, cmd, accountId } = payload;
  
  // 1. Call your LLM
  const llmResponse = await callClaude(cmd);
  
  // 2. Send response back
  await sendChatbotMessage(toJid, accountId, {
    body: [{ type: 'message', text: llmResponse }]
  });
}

See: LLM Integration Guide

Sample Applications

Sample Description Link
Chatbot Quickstart Official tutorial (recommended start) GitHub
Claude Chatbot AI chatbot with Anthropic Claude GitHub
Unsplash Chatbot Image search with database GitHub
ERP Chatbot Oracle ERP with scheduled alerts GitHub
Task Manager Full CRUD app GitHub

See: Sample Applications Guide for analysis of all 10 samples

Common Operations

Send Message to Channel

// Team Chat API
await fetch('https://api.zoom.us/v2/chat/users/me/messages', {
  method: 'POST',
  headers: { 'Authorization': `Bearer ${token}` },
  body: JSON.stringify({
    message: 'Hello!',
    to_channel: 'CHANNEL_ID'
  })
});

Handle Button Click

// Webhook handler
case 'interactive_message_actions': {
  const { actionItem, toJid, accountId } = payload;
  
  if (actionItem.value === 'approve') {
    await sendChatbotMessage(toJid, accountId, {
      body: [{ type: 'message', text: '✅ Approved!' }]
    });
  }
}

Verify Webhook Signature

function verifyWebhook(req) {
  const message = `v0:${req.headers['x-zm-request-timestamp']}:${JSON.stringify(req.body)}`;
  const hash = crypto.createHmac('sha256', process.env.ZOOM_VERIFICATION_TOKEN)
    .update(message)
    .digest('hex');
  return req.headers['x-zm-signature'] === `v0=${hash}`;
}

Deployment

ngrok for Local Development

# Install ngrok
npm install -g ngrok

# Expose local server
ngrok http 4000

# Use HTTPS URL as Bot Endpoint URL in Zoom Marketplace
# Example: https://abc123.ngrok.io/webhook

Production Deployment

See: Deployment Guide for:

  • Nginx reverse proxy setup
  • Base path configuration
  • OAuth redirect URI setup

Limitations

Limit Value
Message length 4,096 characters
File size 512 MB
Members per channel 10,000
Channels per user 500

Security Best Practices

  1. Verify webhook signatures - Always validate using x-zm-signature header
  2. Sanitize messages - Limit to 4096 chars, remove control characters
  3. Validate JIDs - Check format: user@domain or channel@domain
  4. Environment variables - Never hardcode credentials
  5. Use HTTPS - Required for production webhooks

See: Security Best Practices

Complete Documentation Library

Core Concepts (Start Here!)

Complete Examples

References

Troubleshooting

Resources


Need help? Start with Integrated Index section below for complete navigation.


Integrated Index

This section was migrated from SKILL.md.

Complete navigation guide for the Zoom Team Chat skill.

Quick Start Paths

Path 1: Team Chat API (User-Level Messaging)

For sending messages as a user account.

  1. API Selection Guide - Confirm Team Chat API is right
  2. Environment Setup - Get credentials
  3. OAuth Setup Example - Implement authentication
  4. Send Message Example - Send your first message

Path 2: Chatbot API (Interactive Bots)

For building interactive chatbots with rich messages.

  1. API Selection Guide - Confirm Chatbot API is right
  2. Environment Setup - Get credentials (including Bot JID)
  3. Webhook Architecture - Understand webhook events
  4. Chatbot Setup Example - Build your first bot
  5. Message Cards Reference - Create rich messages

Core Concepts

Essential understanding for both APIs.

Document Description
API Selection Guide Choose Team Chat API vs Chatbot API
Environment Setup Complete credentials and app configuration
Authentication Flows OAuth vs Client Credentials
Webhook Architecture How webhooks work (Chatbot API)
Message Card Structure Card component hierarchy
Deployment Guide Production deployment strategies
Security Best Practices Secure your integration

Complete Examples

Working code for common scenarios.

Authentication

Example Description
OAuth Setup User OAuth flow implementation
Token Management Refresh tokens, expiration handling

Basic Operations

Example Description
Send Message Team Chat API message sending
Chatbot Setup Complete chatbot with webhooks
List Channels Get user's channels
Create Channel Create public/private channels

Interactive Features (Chatbot API)

Example Description
Button Actions Handle button clicks
Form Submissions Process form data
Slash Commands Create custom commands
Dropdown Selects Channel/member pickers

Advanced Integration

Example Description
LLM Integration Integrate Claude/GPT
Scheduled Alerts Cron + incoming webhooks
Database Integration Store conversation state
Multi-Step Workflows Complex user interactions

References

API Documentation

Reference Description
API Reference Pointers and common endpoints
Webhook Events Event types and handling checklist
Message Cards All card components
Error Codes Error handling guide

Sample Applications

Reference Description
Sample Applications Sample app index/notes

Field Guides

Reference Description
JID Formats Understanding JID identifiers
Scopes Reference Common scopes
Rate Limits Throttling guidance

Troubleshooting

Guide Description
Common Issues Quick diagnostics and solutions
OAuth Issues Authentication failures
Webhook Issues Webhook debugging
Message Issues Message sending problems
Deployment Issues Production problems

Architecture Patterns

Chatbot Lifecycle

User Action → Webhook → Process → Response

LLM Integration Pattern

User Input → Chatbot receives → Call LLM → Send response

Approval Workflow Pattern

Request → Send card with buttons → User clicks → Update status → Notify

Common Use Cases

Notifications

  • CI/CD build notifications
  • Server monitoring alerts
  • Scheduled reports
  • System health checks

Workflows

  • Approval requests
  • Task assignment
  • Status updates
  • Form submissions

Integrations

  • LLM-powered assistants
  • Database queries
  • External API integration
  • File/image sharing

Automation

  • Scheduled messages
  • Auto-responses
  • Data collection
  • Report generation

Resource Links

Official Documentation

Sample Code

Tools

Community

Documentation Status

✅ Complete

  • Main skill.md entry point
  • API Selection Guide
  • Environment Setup
  • Webhook Architecture
  • Chatbot Setup Example (complete working code)
  • Message Cards Reference
  • Common Issues Troubleshooting

📝 Pending (High Priority)

  • OAuth Setup Example
  • Send Message Example
  • Button Actions Example
  • LLM Integration Example
  • Webhook Events Reference
  • API Reference
  • Sample Applications Analysis

📋 Planned (Lower Priority)

  • Form Submissions Example
  • Channel Management Examples
  • Database Integration Example
  • Error Codes Reference
  • Rate Limits Guide
  • Deployment troubleshooting

Getting Started Checklist

For Team Chat API

For Chatbot API

  • Read API Selection Guide
  • Complete Environment Setup
  • Obtain Client ID, Client Secret, Bot JID, Secret Token, Account ID
  • Enable Team Chat in Features
  • Configure Bot Endpoint URL and Slash Command
  • Set up ngrok for local testing
  • Implement webhook handler
  • Send first chatbot message

Version History

  • v1.0 (2026-02-09) - Initial comprehensive documentation
    • Core concepts (API selection, environment setup, webhooks)
    • Complete chatbot setup example
    • Message cards reference
    • Common issues troubleshooting

Support

Use this SKILL.md as the navigation hub for Team Chat API selection, setup, examples, and troubleshooting.

Environment Variables

Zoom Video SDK Web UI Toolkit参考技能,提供预构建的React视频UI组件。适用于需快速集成标准视频会议界面、避免从零开发自定义UI的场景,支持JWT认证及多框架集成。
需要快速实现视频会议界面 使用Zoom Video SDK但不想自定义UI 询问Zoom Web UI Toolkit安装或配置
partner-built/zoom-plugin/skills/ui-toolkit/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill ui-toolkit/web -g -y
SKILL.md
Frontmatter
{
    "name": "ui-toolkit\/web",
    "triggers": [
        "ui toolkit",
        "zoom ui",
        "prebuilt video ui",
        "video conferencing ui",
        "zoom video ui toolkit",
        "uitoolkit",
        "ready-made zoom ui"
    ],
    "description": "Reference skill for Zoom Video SDK UI Toolkit. Use after routing to a web video workflow when you want prebuilt React UI instead of building a fully custom Video SDK interface.",
    "user-invocable": false
}

Zoom Video SDK UI Toolkit

Background reference for the prebuilt Zoom Video SDK UI Toolkit on web. Prefer choose-zoom-approach first when the user might still need Meeting SDK instead.

Official Documentation: https://developers.zoom.us/docs/video-sdk/web/ui-toolkit/ API Reference: https://marketplacefront.zoom.us/sdk/uitoolkit/web/ NPM Package: https://www.npmjs.com/package/@zoom/videosdk-zoom-ui-toolkit Live Demo: https://sdk.zoom.com/videosdk-uitoolkit

Quick Links

New to UI Toolkit? Follow this path:

  1. Quick Start - Get running in 5 minutes (see below)
  2. JWT Authentication - Server-side token generation (required)
  3. Composite vs Components - Choose your approach
  4. Framework Integration - React, Vue, Angular, Next.js patterns
  5. Integrated Index - see the section below in this file

Having issues?

  • Session not joining → Check JWT Authentication (most common issue)
  • React 18 peer dependency error → See Installation section
  • CSS not loading → See Troubleshooting
  • Components not showing → Check Component Lifecycle
  • Start with preflight checks → 5-Minute Runbook

Overview

The Zoom Video SDK UI Toolkit is a pre-built video UI library that renders complete video conferencing experiences with minimal code. Unlike the raw Video SDK, the UI Toolkit provides:

  • Ready-to-use UI - Professional video interface out of the box
  • Zero UI code - No need to build video layouts, controls, or participant management
  • Framework agnostic - Works with React, Vue, Angular, Next.js, vanilla JS
  • Highly customizable - Choose which features to enable, customize themes
  • Built-in features - Chat, screen share, settings, virtual backgrounds included

When to use UI Toolkit:

  • You want a complete video solution quickly
  • You need Zoom-like UI consistency
  • You don't want to build custom video UI
  • You need standard features (chat, share, participants)

When to use raw Video SDK instead:

  • You need complete custom UI control
  • You're building a non-standard video experience
  • You need access to raw video/audio data
  • You want to build your own rendering pipeline

Installation

npm install @zoom/videosdk-zoom-ui-toolkit jsrsasign
npm install -D @types/jsrsasign

Note: React support depends on the UI Toolkit version. Check the package peer dependencies for your installed version (React 18 is commonly required).

Quick Start

Basic Usage (Vanilla JS)

import uitoolkit from "@zoom/videosdk-zoom-ui-toolkit";
import "@zoom/videosdk-ui-toolkit/dist/videosdk-zoom-ui-toolkit.css";

const container = document.getElementById("sessionContainer");

const config = {
  videoSDKJWT: "your_jwt_token",
  sessionName: "my-session",
  userName: "John Doe",
  sessionPasscode: "",
  features: ["video", "audio", "share", "chat", "users", "settings"],
};

uitoolkit.joinSession(container, config);

uitoolkit.onSessionJoined(() => {
  console.log("Session joined");
});

uitoolkit.onSessionClosed(() => {
  console.log("Session closed");
});

Next.js / React Integration

'use client';

import { useEffect, useRef } from 'react';

export default function VideoSession({ jwt, sessionName, userName }) {
  const containerRef = useRef<HTMLDivElement>(null);
  const uitoolkitRef = useRef<any>(null);

  useEffect(() => {
    let isMounted = true;

    const init = async () => {
      const uitoolkitModule = await import('@zoom/videosdk-zoom-ui-toolkit');
      const uitoolkit = uitoolkitModule.default;
      uitoolkitRef.current = uitoolkit;
      
      // If TypeScript complains about CSS imports, configure your app to allow them
      // (for example via a global `declare module \"*.css\";`), or import the CSS from
      // a global entrypoint (Next.js layout/_app) instead of inlining here.
      await import('@zoom/videosdk-ui-toolkit/dist/videosdk-zoom-ui-toolkit.css');

      if (!isMounted || !containerRef.current) return;

      const config: any = {
        videoSDKJWT: jwt,
        sessionName: sessionName,
        userName: userName,
        sessionPasscode: '',
        features: ['video', 'audio', 'share', 'chat', 'users', 'settings'],
      };

      uitoolkit.joinSession(containerRef.current, config);
      uitoolkit.onSessionJoined(() => console.log('Joined'));
      uitoolkit.onSessionClosed(() => console.log('Closed'));
    };

    init();

    return () => {
      isMounted = false;
      if (uitoolkitRef.current && containerRef.current) {
        try {
          uitoolkitRef.current.closeSession(containerRef.current);
        } catch (e) {}
      }
    };
  }, [jwt, sessionName, userName]);

  return <div ref={containerRef} style={{ width: '100%', height: '100vh' }} />;
}

Available Features

Feature Description
video Enable video layout and send/receive video
audio Show audio button, send/receive audio
share Screen sharing
chat In-session messaging
users Participant list
settings Device selection, virtual background
preview Pre-join camera/mic preview
recording Cloud recording (paid plan)
leave Leave/end session button

Troubleshooting

JWT Token Generation (Server-Side)

Required: Generate JWT tokens on your server, never expose SDK secret client-side.

Node.js / Next.js API Route

import { NextRequest, NextResponse } from 'next/server';
import { KJUR } from 'jsrsasign';

const ZOOM_VIDEO_SDK_KEY = process.env.ZOOM_VIDEO_SDK_KEY;
const ZOOM_VIDEO_SDK_SECRET = process.env.ZOOM_VIDEO_SDK_SECRET;

export async function POST(request: NextRequest) {
  const { sessionName, role, userName } = await request.json();

  if (!sessionName || role === undefined) {
    return NextResponse.json({ error: 'Missing params' }, { status: 400 });
  }

  const iat = Math.floor(Date.now() / 1000);
  const exp = iat + 60 * 60 * 2; // 2 hours

  const oHeader = { alg: 'HS256', typ: 'JWT' };
  const oPayload = {
    app_key: ZOOM_VIDEO_SDK_KEY,
    role_type: role, // 0 = participant, 1 = host
    tpc: sessionName,
    version: 1,
    iat,
    exp,
    user_identity: userName || 'User',
  };

  const signature = KJUR.jws.JWS.sign(
    'HS256',
    JSON.stringify(oHeader),
    JSON.stringify(oPayload),
    ZOOM_VIDEO_SDK_SECRET
  );

  return NextResponse.json({ signature });
}

JWT Payload Fields

Field Required Description
app_key Yes Your Video SDK Key
role_type Yes 0 = participant, 1 = host
tpc Yes Session/topic name
version Yes Always 1
iat Yes Issued at (Unix timestamp)
exp Yes Expiration (Unix timestamp)
user_identity No User identifier

API Reference

Core Methods

uitoolkit.joinSession(container, config);
uitoolkit.closeSession(container);

Event Listeners

uitoolkit.onSessionJoined(callback);
uitoolkit.onSessionClosed(callback);
uitoolkit.offSessionJoined(callback);
uitoolkit.offSessionClosed(callback);

Component Methods

uitoolkit.showChatComponent(container);
uitoolkit.hideChatComponent(container);
uitoolkit.showUsersComponent(container);
uitoolkit.hideUsersComponent(container);
uitoolkit.showControlsComponent(container);
uitoolkit.hideControlsComponent(container);
uitoolkit.showSettingsComponent(container);
uitoolkit.hideSettingsComponent(container);
uitoolkit.hideAllComponents();

CDN Usage (No Build Step)

<link rel="stylesheet" href="https://source.zoom.us/uitoolkit/2.3.5-1/videosdk-zoom-ui-toolkit.css" />
<script src="https://source.zoom.us/uitoolkit/2.3.5-1/videosdk-zoom-ui-toolkit.min.umd.js"></script>

<div id="sessionContainer"></div>

<script>
  const uitoolkit = window.UIToolkit;
  
  uitoolkit.joinSession(document.getElementById('sessionContainer'), {
    videoSDKJWT: 'your_jwt',
    sessionName: 'my-session',
    userName: 'User',
    features: ['video', 'audio', 'chat']
  });
</script>

Next.js with basePath

When deploying Next.js under a subpath:

// next.config.ts
const nextConfig = {
  basePath: "/your-app-path",
  assetPrefix: "/your-app-path",
};

Fetch API routes with full path:

fetch('/your-app-path/api/token', { ... })

Prerequisites

  1. Zoom Video SDK credentials from Zoom Marketplace
  2. React version compatible with your installed UI Toolkit package (check peer deps; React 18 is common)
  3. Server-side JWT generation (never expose SDK secret)
  4. Modern browser with WebRTC support

Browser Support

Browser Version
Chrome 78+
Firefox 76+
Safari 14.1+
Edge 79+

Common Issues

Issue Solution
peer react@"^18.0.0" error Use the React version required by the installed UI Toolkit package (check peer deps; React 18 is common)
CSS import TypeScript error Configure TS/CSS handling (prefer a global *.css module declaration); avoid @ts-ignore except in throwaway demos
Config type error Type config as any
API returns HTML not JSON Check basePath in fetch URL

Resources


Integrated Index

This section was migrated from SKILL.md.

Complete navigation for all UI Toolkit documentation.

📚 Start Here

New to the UI Toolkit? Follow this learning path:

  1. SKILL.md - Main overview and quick start
  2. 5-Minute Runbook - Preflight checks before deep debugging
  3. Quick Start Guide - Working code in 5 minutes (see skill.md)
  4. JWT Authentication - Server-side token generation (see skill.md)
  5. Choose Your Mode - Composite vs Components (see skill.md)

🎯 Core Concepts

Understanding how UI Toolkit works:

  • Composite vs Components - Two ways to use UI Toolkit (see skill.md)
  • UI Toolkit Architecture - How it wraps Video SDK internally
  • Feature Configuration - Understanding featuresOptions structure
  • Session Lifecycle - Join → Active → Leave/Close → Destroy flow

📖 Complete Guides

Getting Started

  • Installation - NPM install and React 18 setup (see skill.md)
  • Quick Start - Composite - Full UI in one container (see skill.md)
  • Quick Start - Components - Individual UI pieces (see skill.md)
  • JWT Authentication - Server-side token generation (see skill.md)

Framework Integration

  • React Integration - Hooks, useEffect patterns (see skill.md)
  • Vue.js Integration - Composition API and Options API (see skill.md)
  • Angular Integration - Component lifecycle (see skill.md)
  • Next.js Integration - App Router, Server Components (see skill.md)
  • Vanilla JavaScript - No framework usage (see skill.md)

Advanced Topics

  • Component Lifecycle - Mount, unmount, cleanup patterns
  • Event Listeners - React to session events
  • Session Management - Programmatic control
  • Quality Statistics - Monitor connection quality
  • Custom Themes - Theme customization
  • Virtual Backgrounds - Custom background images

📚 API Reference

Complete API documentation:

  • Core Methods (see skill.md)

    • joinSession() - Start a video session
    • closeSession() - End session and remove UI
    • destroy() - Clean up UI Toolkit instance
    • leaveSession() - Leave without destroying UI
  • Component Methods (see skill.md)

    • showControlsComponent() - Display control bar
    • showChatComponent() - Display chat panel
    • showUsersComponent() - Display participants list
    • showSettingsComponent() - Display settings panel
    • hideAllComponents() - Hide all components
  • Event Listeners (see skill.md)

    • onSessionJoined() - Session joined successfully
    • onSessionClosed() - Session ended
    • onSessionDestroyed() - UI Toolkit destroyed
    • onViewTypeChange() - View mode changed
    • on() - Subscribe to Video SDK events
    • off() - Unsubscribe from events
  • Information Methods (see skill.md)

    • getSessionInfo() - Get session details
    • getCurrentUserInfo() - Get current user
    • getAllUser() - Get all participants
    • getClient() - Get underlying Video SDK client
    • version() - Get version info
  • Control Methods (see skill.md)

    • changeViewType() - Switch view mode
    • mirrorVideo() - Mirror self video
    • isSupportCustomLayout() - Check device support
  • Statistics Methods (see skill.md)

    • subscribeAudioStatisticData() - Audio quality stats
    • subscribeVideoStatisticData() - Video quality stats
    • subscribeShareStatisticData() - Share quality stats

🔧 Configuration

  • Feature Configuration (see skill.md)

    • featuresOptions structure
    • Audio/Video options
    • Chat, Users, Settings
    • Virtual Background
    • Recording, Captions (paid features)
    • Theme customization
    • View modes
  • Session Configuration (see skill.md)

    • Required: videoSDKJWT, sessionName, userName
    • Optional: sessionPasscode, sessionIdleTimeoutMins
    • Debug mode
    • Web endpoint
    • Language settings

⚠️ Troubleshooting

Common Issues

  • React 18 peer dependency error
  • JWT token invalid
  • CSS not loading
  • Components not showing
  • Session join failures

See: troubleshooting/common-issues.md

Framework-Specific Issues

  • React: SSR, hydration, cleanup
  • Vue: Reactivity, lifecycle
  • Angular: Module imports, AOT
  • Next.js: App Router, basePath

Session Issues

  • Authentication failures
  • Connection problems
  • Video/audio not working
  • Screen share issues

📦 Sample Applications

Official Repositories:

Framework Repository Key Features
React videosdk-zoom-ui-toolkit-react-sample Hooks, TypeScript
Vue.js videosdk-zoom-ui-toolkit-vuejs-sample Composition API
Angular videosdk-zoom-ui-toolkit-angular-sample Services, Guards
JavaScript videosdk-zoom-ui-toolkit-javascript-sample Vanilla JS
Auth Endpoint videosdk-auth-endpoint-sample Node.js JWT

🌐 External Resources

🎓 Learning Path

Beginner

  1. Read SKILL.md overview
  2. Follow Quick Start - Composite
  3. Generate JWT on server
  4. Join your first session
  5. Explore available features

Intermediate

  1. Try Component Mode
  2. Add event listeners
  3. Customize theme
  4. Add virtual backgrounds
  5. Integrate with your framework

Advanced

  1. Access underlying Video SDK
  2. Subscribe to quality statistics
  3. Handle all edge cases
  4. Implement custom layouts
  5. Build production-ready app

📋 Quick Reference Card

Minimal Working Example

import uitoolkit from "@zoom/videosdk-zoom-ui-toolkit";
import "@zoom/videosdk-ui-toolkit/dist/videosdk-zoom-ui-toolkit.css";

const config = {
  videoSDKJWT: "YOUR_JWT",
  sessionName: "test-session",
  userName: "User",
  featuresOptions: {
    video: { enable: true },
    audio: { enable: true }
  }
};

uitoolkit.joinSession(document.getElementById("container"), config);
uitoolkit.onSessionJoined(() => console.log("Joined"));
uitoolkit.onSessionClosed(() => uitoolkit.destroy());

Must-Remember Rules

  1. Always generate JWT server-side
  2. Always call destroy() on cleanup
  3. Always use React 18 (not 17/19)
  4. Always import CSS file
  5. Never expose SDK secret client-side
  6. Never skip onSessionClosed cleanup
  7. Never call components before joinSession

📞 Support


Navigation: ← Back to SKILL.md

Environment Variables

用于在Android原生应用中构建自定义实时视频会话的技能。支持完整UI控制、会话令牌、原始媒体选项及基于事件的状态管理,适用于需要深度定制视频体验的场景。
开发Android应用中的自定义视频会议功能 需要完全控制视频UI布局与交互 集成Zoom Video SDK到原生Android项目
partner-built/zoom-plugin/skills/video-sdk/android/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill zoom-video-sdk-android -g -y
SKILL.md
Frontmatter
{
    "name": "zoom-video-sdk-android",
    "triggers": [
        "video sdk android",
        "zoom video android",
        "android custom video",
        "android video session"
    ],
    "description": "Zoom Video SDK for Android native apps. Use when building custom Android video experiences\nwith full UI control, session tokens, raw media options, and event-driven participant state.\n",
    "user-invocable": false
}
用于在Flutter中构建基于Zoom Video SDK的自定义实时视频会话应用。涵盖生命周期管理、事件驱动架构、JWT令牌生成及移动端集成模式,适用于需要深度定制视频体验的场景。
需要在Flutter应用中集成Zoom视频功能 处理Zoom Video SDK的生命周期与会话状态 配置Flutter平台的Zoom SDK依赖与权限
partner-built/zoom-plugin/skills/video-sdk/flutter/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill zoom-video-sdk-flutter -g -y
SKILL.md
Frontmatter
{
    "name": "zoom-video-sdk-flutter",
    "triggers": [
        "video sdk flutter",
        "zoom flutter video sdk",
        "flutter video session",
        "flutter_zoom_videosdk",
        "zoom custom video flutter",
        "flutter live transcription zoom"
    ],
    "description": "Zoom Video SDK for Flutter. Use when building custom video session apps in Flutter with\nflutter_zoom_videosdk, event-driven architecture, session lifecycle handling, and mobile\nplatform integration patterns.\n",
    "user-invocable": false
}

Zoom Video SDK (Flutter)

Use this skill for Flutter apps that build custom real-time video session experiences with Zoom Video SDK.

Quick Links

  1. Lifecycle Workflow - init -> joinSession -> media/control -> leave -> cleanup
  2. SDK Architecture Pattern - helper-based API surface and event model
  3. High-Level Scenarios - common product patterns
  4. Setup Guide - package setup + platform prerequisites
  5. Session Join Pattern - tokenized session join flow
  6. Event Handling Pattern - listener mapping and action routing
  7. SKILL.md - complete navigation

Core Notes

  • Video SDK sessions are custom sessions, not Zoom Meetings.
  • Keep SDK credentials server-side; generate JWT token on backend.
  • Integration is strongly event-driven; bind listener flows early.
  • Feature support and enum names can drift by wrapper/native version.

References

Related Skills

Merged from video-sdk/flutter/SKILL.md

Zoom Video SDK Flutter - Documentation Index

Start Here

  1. SKILL.md
  2. Lifecycle Workflow
  3. SDK Architecture Pattern
  4. Setup Guide

Concepts

Examples

References

Troubleshooting

Operations

  • RUNBOOK.md - 5-minute preflight and debugging checklist.
用于在 iOS 原生应用中构建自定义视频会话,提供完整 UI 控制、基于 Token 的认证及事件驱动媒体流处理。
iOS 应用集成 Zoom 视频会议功能 需要自定义视频界面布局与交互 实现基于 Token 的视频会话鉴权
partner-built/zoom-plugin/skills/video-sdk/ios/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill zoom-video-sdk-ios -g -y
SKILL.md
Frontmatter
{
    "name": "zoom-video-sdk-ios",
    "triggers": [
        "video sdk ios",
        "zoom video ios",
        "ios custom video",
        "xcframework video sdk",
        "ios video session"
    ],
    "description": "Zoom Video SDK for iOS native apps. Use when building custom iOS video sessions with\nfull UI control, token-based session auth, and event-driven media\/participant flows.\n",
    "user-invocable": false
}
提供 Linux 下 Zoom Video SDK C++ 开发指导,支持无头机器人、原始音视频捕获/注入及 Qt/GTK 集成。涵盖架构模式、API 参考、环境配置与常见问题排查,强调 Linux 仅支持原始数据管道。
Linux 环境下使用 Zoom Video SDK 开发无头 Zoom 机器人或自定义 UI 集成 处理原始音视频数据捕获与注入 解决 Linux 下的构建或依赖问题
partner-built/zoom-plugin/skills/video-sdk/linux/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill video-sdk/linux -g -y
SKILL.md
Frontmatter
{
    "name": "video-sdk\/linux",
    "triggers": [
        "linux video sdk",
        "zoom linux",
        "raw data linux",
        "qt zoom",
        "gtk zoom",
        "virtual audio linux"
    ],
    "description": "Zoom Video SDK for Linux - C++ headless bots, raw audio\/video capture\/injection, Qt\/GTK integration, Docker support",
    "user-invocable": false
}

Zoom Video SDK - Linux Development

Expert guidance for developing with the Zoom Video SDK on Linux. Build headless bots, raw media capture/injection applications, and custom UI integrations with Qt/GTK.

Official Documentation: https://developers.zoom.us/docs/video-sdk/linux/ API Reference: https://marketplacefront.zoom.us/sdk/custom/linux/ Sample Repository: https://github.com/zoom/videosdk-linux-raw-recording-sample

Quick Links

New to Video SDK? Follow this path:

  1. SDK Architecture Pattern - Universal 3-step pattern for ANY feature
  2. Session Join Pattern - Complete working code to join a session
  3. Raw Data vs Canvas - CRITICAL: Linux has NO Canvas API - raw data ONLY
  4. Raw Video Capture - Capture and process YUV420 frames

Reference:

Having issues?

Key Differences from Windows/macOS

Feature Linux Windows/Mac
Canvas API ❌ Not available ✅ Available
Raw Data Pipe ONLY option ✅ Available
UI Integration Qt, GTK, SDL2, OpenGL Win32/WinForms/WPF, Cocoa
Headless Support ✅ Excellent (Docker) Limited
Audio PulseAudio required Native
Virtual Devices ✅ Required for headless Optional

SDK Overview

The Zoom Video SDK for Linux is a C++ library optimized for:

  • Headless Bots: Docker/WSL support, no display required
  • Raw Data Access: Capture YUV420 video, PCM audio
  • Raw Data Injection: Virtual camera/mic for custom media
  • Screen Sharing: Capture or inject share data
  • Cloud Recording: Record sessions to Zoom cloud
  • Live Streaming: Stream to RTMP endpoints
  • Live Transcription: Real-time speech-to-text
  • Qt/GTK Integration: Full UI framework support

Prerequisites

System Requirements

  • OS: Ubuntu 20.04+, Debian 11+, or compatible
  • Architecture: x64 (recommended), ARM64
  • Compiler: GCC 9+, Clang 10+
  • CMake: 3.14 or later
  • Qt5: Bundled with SDK (do NOT install system Qt5)

Dependencies

sudo apt update
sudo apt install -y build-essential gcc cmake libglib2.0-dev liblzma-dev \
    libxcb-image0 libxcb-keysyms1 libxcb-xfixes0 libxcb-xkb1 libxcb-shape0 \
    libxcb-shm0 libxcb-randr0 libxcb-xtest0 libgbm1 libxtst6 libgl1 libnss3 \
    libasound2 libpulse0

# For headless Linux
sudo apt install -y pulseaudio

# PulseAudio configuration (CRITICAL for audio)
mkdir -p ~/.config
echo "[General]" > ~/.config/zoomus.conf
echo "system.audio.type=default" >> ~/.config/zoomus.conf

# Log directory
mkdir -p ~/.zoom/logs

Quick Start

#include "zoom_video_sdk_api.h"
#include "zoom_video_sdk_interface.h"
#include "zoom_video_sdk_delegate_interface.h"

USING_ZOOM_VIDEO_SDK_NAMESPACE

// 1. Create SDK
IZoomVideoSDK* sdk = CreateZoomVideoSDKObj();

// 2. Initialize
ZoomVideoSDKInitParams init_params;
init_params.domain = "https://zoom.us";
init_params.enableLog = true;
init_params.logFilePrefix = "bot";
init_params.videoRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;
init_params.shareRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;
init_params.audioRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;

sdk->initialize(init_params);

// 3. Add delegate
sdk->addListener(myDelegate);

// 4. Join session
ZoomVideoSDKSessionContext ctx;
ctx.sessionName = "my-session";
ctx.userName = "Linux Bot";
ctx.token = "jwt-token";
ctx.audioOption.connect = true;
ctx.audioOption.mute = false;
ctx.videoOption.localVideoOn = false;

// For headless: Virtual audio speaker
ctx.virtualAudioSpeaker = new VirtualSpeaker();

IZoomVideoSDKSession* session = sdk->joinSession(ctx);

See Session Join Pattern for complete code.

Key Features

Feature Linux Support Guide
Session Management ✅ Full Session Join
Raw Video (YUV420) ✅ ONLY rendering option Raw Video
Raw Audio (PCM) ✅ Full Raw Audio
Virtual Camera/Mic ✅ Full Virtual Devices
Cloud Recording ✅ Full Recording
Live Streaming ✅ Full Live Stream
Live Transcription ✅ Full Transcription
Command Channel ✅ Full Commands
Chat ✅ Full Chat
Qt Integration ✅ Recommended Qt/GTK
GTK Integration ✅ Supported Qt/GTK
Docker/Headless ✅ Excellent Virtual Devices

Critical Gotchas

⚠️ CRITICAL #1: No Canvas API on Linux

Problem: Linux SDK does NOT have Canvas API like Windows/Mac.

Solution: You MUST use Raw Data Pipe and implement your own rendering.

See: Raw Data vs Canvas

⚠️ CRITICAL #2: PulseAudio Required for Audio

Problem: SDK requires PulseAudio for raw audio functions.

Solution:

sudo apt install -y pulseaudio
mkdir -p ~/.config
echo "[General]" > ~/.config/zoomus.conf
echo "system.audio.type=default" >> ~/.config/zoomus.conf

See: PulseAudio Setup

⚠️ CRITICAL #3: Qt5 Dependencies

Problem: SDK requires Qt5 libraries (bundled, NOT system Qt5).

Solution:

# Copy from SDK package
cp -r samples/qt_libs/Qt/lib/* lib/zoom_video_sdk/

# Create symlinks
cd lib/zoom_video_sdk
for lib in libQt5*.so.5; do ln -sf $lib ${lib%.5}; done

See: Qt Dependencies

⚠️ CRITICAL #4: Heap Memory Mode

Always use heap mode for raw data:

init_params.videoRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;
init_params.shareRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;
init_params.audioRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;

⚠️ CRITICAL #5: Virtual Audio for Headless

Problem: Docker/headless environments have no audio devices.

Solution: Use virtual audio speaker and mic.

session_context.virtualAudioSpeaker = new VirtualSpeaker();
session_context.virtualAudioMic = new VirtualMic();

See: Virtual Audio/Video

Sample Repositories

Official Samples

Repository Description
raw-recording-sample Raw audio/video capture
qt-quickstart Qt6 UI integration
gtk-quickstart GTK3 UI integration

Sample Architecture

Headless Bot (Docker):
┌──────────────────────────────────┐
│  Virtual Audio Speaker/Mic       │
├──────────────────────────────────┤
│  Raw Data Processing             │
│  - YUV420 → File/Stream   


## Merged from video-sdk/linux/SKILL.md

# Zoom Video SDK Linux - Complete Documentation Index

## Quick Start Path

**If you're new to the SDK, follow this order:**

1. **Read the architecture pattern** → [concepts/sdk-architecture-pattern.md](concepts/sdk-architecture-pattern.md)
   - Universal formula: Singleton → Delegate → Subscribe
   - Once you understand this, you can implement any feature

2. **Understand Linux specifics** → [concepts/raw-data-vs-canvas.md](concepts/raw-data-vs-canvas.md)
   - **CRITICAL**: Linux has NO Canvas API - raw data ONLY

3. **Implement session join** → [examples/session-join-pattern.md](examples/session-join-pattern.md)
   - Complete working JWT + session join code

4. **Setup environment** → [troubleshooting/pulseaudio-setup.md](troubleshooting/pulseaudio-setup.md)
   - PulseAudio configuration (required for audio)
   - [troubleshooting/qt-dependencies.md](troubleshooting/qt-dependencies.md)
   - Qt5 library setup (bundled with SDK)

5. **Implement features** → Choose from examples below

---

## Documentation Structure

video-sdk/linux/ ├── SKILL.md # Main skill overview ├── SKILL.md # This file - navigation guide ├── linux.md # Platform summary │ ├── concepts/ # Core architectural patterns │ ├── sdk-architecture-pattern.md # Universal formula for ANY feature │ ├── singleton-hierarchy.md # 5-level navigation guide │ └── raw-data-vs-canvas.md # Linux-specific: raw data ONLY │ ├── examples/ # Complete working code │ ├── session-join-pattern.md # JWT auth + session join │ └── command-channel.md # Command channel with threading │ ├── troubleshooting/ # Problem solving guides │ ├── pulseaudio-setup.md # Audio configuration │ ├── qt-dependencies.md # Qt5 library setup │ ├── build-errors.md # Common build issues │ └── common-issues.md # Quick diagnostic workflow │ └── references/ # Reference documentation └── linux-reference.md # API hierarchy, methods, error codes


---

## By Use Case

### I want to build a headless bot
1. [SDK Architecture Pattern](concepts/sdk-architecture-pattern.md) - Understand the pattern
2. [Session Join Pattern](examples/session-join-pattern.md) - Join sessions
3. [PulseAudio Setup](troubleshooting/pulseaudio-setup.md) - Configure audio
4. [Raw Data vs Canvas](concepts/raw-data-vs-canvas.md) - Understand Linux differences

### I'm getting build errors
1. [Build Errors Guide](troubleshooting/build-errors.md) - SDK build issues
2. [Qt Dependencies](troubleshooting/qt-dependencies.md) - Qt5 setup
3. [Common Issues](troubleshooting/common-issues.md) - Quick diagnostics

### I'm getting runtime errors
1. [PulseAudio Setup](troubleshooting/pulseaudio-setup.md) - Audio not working
2. [Qt Dependencies](troubleshooting/qt-dependencies.md) - Library not found
3. [Common Issues](troubleshooting/common-issues.md) - Error code tables

### I want to use command channel
1. [Command Channel](examples/command-channel.md) - Send/receive commands
2. [Common Issues](troubleshooting/common-issues.md) - Threading requirements

### I want to implement a specific feature
1. [SDK Architecture Pattern](concepts/sdk-architecture-pattern.md) - **START HERE!**
2. [Singleton Hierarchy](concepts/singleton-hierarchy.md) - Navigate to the feature
3. [API Reference](references/linux-reference.md) - Method signatures

---

## Most Critical Documents

### 1. SDK Architecture Pattern (MASTER DOCUMENT)
**[concepts/sdk-architecture-pattern.md](concepts/sdk-architecture-pattern.md)**

The universal 3-step pattern:
1. Get singleton (SDK, helpers, session, users)
2. Implement delegate (event callbacks)
3. Subscribe and use

### 2. Raw Data vs Canvas (LINUX-SPECIFIC)
**[concepts/raw-data-vs-canvas.md](concepts/raw-data-vs-canvas.md)**

**CRITICAL**: Unlike Windows/Mac, Linux SDK has NO Canvas API. You MUST use raw data pipe.

### 3. PulseAudio Setup (MOST COMMON ISSUE)
**[troubleshooting/pulseaudio-setup.md](troubleshooting/pulseaudio-setup.md)**

Audio requires PulseAudio configuration.

### 4. Qt Dependencies
**[troubleshooting/qt-dependencies.md](troubleshooting/qt-dependencies.md)**

SDK requires bundled Qt5 libraries, NOT system Qt5.

---

## Key Learnings

### Critical Discoveries:

1. **Linux has NO Canvas API**
   - Windows/Mac have Canvas API for SDK-rendered video
   - Linux MUST use Raw Data Pipe
   - See: [Raw Data vs Canvas](concepts/raw-data-vs-canvas.md)

2. **PulseAudio is MANDATORY**
   - SDK requires PulseAudio for raw audio
   - Must configure ~/.config/zoomus.conf
   - See: [PulseAudio Setup](troubleshooting/pulseaudio-setup.md)

3. **Use Bundled Qt5, NOT System Qt5**
   - SDK includes specific Qt5 versions
   - Copy from samples/qt_libs/
   - See: [Qt Dependencies](troubleshooting/qt-dependencies.md)

4. **Helpers Control YOUR Streams Only**
   - `videoHelper->startVideo()` starts YOUR camera
   - To see others, subscribe to their VideoPipe
   - See: [Singleton Hierarchy](concepts/singleton-hierarchy.md)

5. **Virtual Devices for Headless**
   - Docker/headless needs virtual audio speaker/mic
   - Set before joining session
   - See: [Session Join Pattern](examples/session-join-pattern.md)

6. **Always Use Heap Memory Mode**
   ```cpp
   init_params.videoRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;
  1. GLib Main Loop Required

    • while/sleep loops don't dispatch SDK events
    • Must use g_main_loop_run()
    • See: Common Issues
  2. All SDK Calls Must Be on Main Thread

    • Background thread SDK calls return error 2 (Internal_Error)
    • Use g_idle_add() to schedule on GLib main thread
    • See: Command Channel
  3. Command Channel is Session-Scoped

    • Does NOT span across different sessions
    • Both sender and receiver must be in the same session
    • See: Command Channel

Sample Repositories


Quick Reference

"My code won't compile"

Build Errors Guide

"Audio not working"

PulseAudio Setup

"Library not found"

Qt Dependencies

"How do I implement [feature]?"

SDK Architecture Pattern

"What error code means what?"

Common Issues


Document Version

Based on Zoom Video SDK for Linux v2.x


Happy coding!

Remember: The SDK Architecture Pattern is your key to unlocking the entire SDK. Read it first!

Operations

  • RUNBOOK.md - 5-minute preflight and debugging checklist.
专为 macOS 原生桌面应用设计的 Zoom 视频 SDK 技能,支持自定义 UI、令牌化加入及媒体设备工作流。涵盖生命周期、架构、接入示例及故障排查,适用于构建具有深度控制的本地视频会议应用。
开发 macOS 原生视频应用 集成 Zoom 视频 SDK 到桌面端 配置 macOS 视频会议会话 调试 macOS 端视频连接问题
partner-built/zoom-plugin/skills/video-sdk/macos/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill zoom-video-sdk-macos -g -y
SKILL.md
Frontmatter
{
    "name": "zoom-video-sdk-macos",
    "triggers": [
        "video sdk macos",
        "zoom video mac",
        "macos custom video",
        "mac desktop video sdk",
        "video sdk cocoa"
    ],
    "description": "Zoom Video SDK for macOS native desktop apps. Use when building custom macOS video sessions\nwith native UI control, tokenized join, and desktop-oriented media\/device workflows.\n",
    "user-invocable": false
}
用于在 React Native 应用中集成 Zoom Video SDK,实现高度定制化的移动端视频会话体验。涵盖生命周期管理、事件驱动架构、JWT 令牌生成及音视频聊天等功能。
需要在 React Native 中构建自定义视频通话功能 集成 Zoom Video SDK 处理音频、视频或共享会话 实现基于事件的 UI 状态同步与后台 JWT 令牌流程
partner-built/zoom-plugin/skills/video-sdk/react-native/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill zoom-video-sdk-react-native -g -y
SKILL.md
Frontmatter
{
    "name": "zoom-video-sdk-react-native",
    "triggers": [
        "react native video sdk",
        "zoom react native video sdk",
        "@zoom\/react-native-videosdk",
        "custom video react native",
        "react native session join",
        "zoom videosdk react native"
    ],
    "description": "Zoom Video SDK for React Native. Use when building custom mobile video session experiences\nwith @zoom\/react-native-videosdk, event listeners, helper-based APIs, and backend JWT token flows.\n",
    "user-invocable": false
}

Zoom Video SDK (React Native)

Use this skill for React Native apps that need fully custom video session experiences using Zoom Video SDK.

Quick Links

  1. Lifecycle Workflow - init -> listeners -> join -> helpers -> leave -> cleanup
  2. SDK Architecture Pattern - provider + helper model
  3. High-Level Scenarios - common mobile product patterns
  4. Setup Guide - package + platform setup baseline
  5. Session Join Pattern - tokenized join flow
  6. Event Handling Pattern - event listener to state routing
  7. SKILL.md - complete navigation

Core Notes

  • Video SDK sessions are not Zoom Meetings and use session tokens.
  • JWT generation must stay backend-side.
  • Wrapper is helper-heavy (audio/video/chat/share/recording/transcription, etc.).
  • Event-driven design is required for robust UI state.

References

Related Skills

Documentation Index

Start Here

  1. SKILL.md
  2. Lifecycle Workflow
  3. SDK Architecture Pattern
  4. Setup Guide

Concepts

Examples

References

Troubleshooting

Operations

  • RUNBOOK.md - 5-minute preflight and debugging checklist.
Zoom Video SDK 开发参考,用于构建完全自定义的视频会话应用。提供 Web 端快速入门、UI 选项(组件库或自定义)、NPM/CDN 集成方式及鉴权前置技能指引,强调与 Meeting SDK 的区别及路由规则。
需要构建非标准会议的全自定义视频体验 询问 Zoom Video SDK 的 Web 端集成或初始化流程 区分 Meeting SDK 与 Video SDK 的功能差异
partner-built/zoom-plugin/skills/video-sdk/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill build-zoom-video-sdk-app -g -y
SKILL.md
Frontmatter
{
    "name": "build-zoom-video-sdk-app",
    "triggers": [
        "custom video",
        "video sdk",
        "build video app",
        "video session",
        "video chat",
        "video call",
        "video conferencing",
        "custom video ui",
        "twitter spaces",
        "clubhouse alternative",
        "audio-only room",
        "screen sharing",
        "virtual background",
        "native video sdk"
    ],
    "description": "Reference skill for Zoom Video SDK. Use after routing to a custom-session workflow when the user needs full control over the video experience rather than an actual Zoom meeting."
}

/build-zoom-video-sdk-app

Background reference for fully custom video-session products. Prefer plan-zoom-product first when the boundary between Meeting SDK and Video SDK is still unclear.

Build custom video experiences powered by Zoom's infrastructure.

Hard Routing Guardrail (Read First)

  • If the user asks for custom real-time video app behavior (topic/session join, custom rendering, attach/detach), route to Video SDK.
  • Do not switch to REST meeting endpoints for Video SDK join flows.
  • Video SDK does not use Meeting IDs, join_url, or Meeting SDK join payload fields (meetingNumber, passWord).

Meeting SDK vs Video SDK

Feature Meeting SDK Video SDK
UI Default Zoom UI or Custom UI Fully custom UI (you build it)
Experience Zoom meetings Video sessions
Branding Limited customization Full branding control
Features Full Zoom features Core video features

UI Options (Web)

Video SDK gives you full control over the UI:

Option Description
UI Toolkit Pre-built React components (low-code)
Custom UI Build your own UI using the SDK APIs

Prerequisites

  • Zoom Video SDK credentials from Marketplace
  • SDK Key and Secret
  • Web development environment

Need help with OAuth or signatures? See the zoom-oauth skill for authentication flows.

Need pre-join diagnostics on web? Use probe-sdk before Video SDK join() to reduce first-minute failures.

Start troubleshooting fast: Use the 5-Minute Runbook before deep debugging.

Quick Start (Web)

NPM Usage (Bundler like Vite/Webpack)

import ZoomVideo from '@zoom/videosdk';

const client = ZoomVideo.createClient();
await client.init('en-US', 'Global', { patchJsMedia: true });
await client.join(topic, signature, userName, password);

// IMPORTANT: getMediaStream() ONLY works AFTER join()
const stream = client.getMediaStream();
await stream.startVideo();
await stream.startAudio();

CDN Usage (No Bundler)

WARNING: Ad blockers block source.zoom.us. Self-host the SDK to avoid issues.

# Download SDK locally
curl "https://source.zoom.us/videosdk/zoom-video-1.12.0.min.js" -o js/zoom-video-sdk.min.js
<script src="js/zoom-video-sdk.min.js"></script>
// CDN exports as WebVideoSDK, NOT ZoomVideo
// Must use .default property
const ZoomVideo = WebVideoSDK.default;
const client = ZoomVideo.createClient();

await client.init('en-US', 'Global', { patchJsMedia: true });
await client.join(topic, signature, userName, password);

// IMPORTANT: getMediaStream() ONLY works AFTER join()
const stream = client.getMediaStream();
await stream.startVideo();
await stream.startAudio();

ES Module with CDN (Race Condition Fix)

When using <script type="module"> with CDN, SDK may not be loaded yet:

// Wait for SDK to load before using
function waitForSDK(timeout = 10000) {
  return new Promise((resolve, reject) => {
    if (typeof WebVideoSDK !== 'undefined') {
      resolve();
      return;
    }
    const start = Date.now();
    const check = setInterval(() => {
      if (typeof WebVideoSDK !== 'undefined') {
        clearInterval(check);
        resolve();
      } else if (Date.now() - start > timeout) {
        clearInterval(check);
        reject(new Error('SDK failed to load'));
      }
    }, 100);
  });
}

// Usage
await waitForSDK();
const ZoomVideo = WebVideoSDK.default;
const client = ZoomVideo.createClient();

SDK Lifecycle (CRITICAL ORDER)

The SDK has a strict lifecycle. Violating it causes silent failures.

1. Create client:     client = ZoomVideo.createClient()
2. Initialize:        await client.init('en-US', 'Global', options)
3. Join session:      await client.join(topic, signature, userName, password)
4. Get stream:        stream = client.getMediaStream()  ← ONLY AFTER JOIN
5. Start media:       await stream.startVideo() / await stream.startAudio()

Common Mistake (Silent Failure):

// ❌ WRONG: Getting stream before joining
const client = ZoomVideo.createClient();
await client.init('en-US', 'Global');
const stream = client.getMediaStream();  // Returns undefined!
await client.join(...);

// ✅ CORRECT: Get stream after joining
const client = ZoomVideo.createClient();
await client.init('en-US', 'Global');
await client.join(...);
const stream = client.getMediaStream();  // Works!

Video Rendering (Event-Driven)

The SDK is event-driven. You must listen for events and render videos accordingly.

Use attachVideo() NOT renderVideo()

import { VideoQuality } from '@zoom/videosdk';

// Start your camera
await stream.startVideo();

// Attach video - returns element to append to DOM
const element = await stream.attachVideo(userId, VideoQuality.Video_360P);
container.appendChild(element);

// Detach when done
await stream.detachVideo(userId);

Required Events

// When other participant's video turns on/off
client.on('peer-video-state-change', async (payload) => {
  const { action, userId } = payload;
  if (action === 'Start') {
    const el = await stream.attachVideo(userId, VideoQuality.Video_360P);
    container.appendChild(el);
  } else {
    await stream.detachVideo(userId);
  }
});

// When participants join/leave
client.on('user-added', (payload) => { /* check bVideoOn */ });
client.on('user-removed', (payload) => { stream.detachVideo(payload.userId); });

See web/references/web.md for complete event handling patterns.

Key Concepts

Concept Description
Session Video session (not a meeting)
Topic Session identifier (any string you choose)
Signature JWT for authorization
MediaStream Audio/video stream control

Session Creation Model

Important: Video SDK sessions are created just-in-time, not in advance.

Aspect Video SDK Meeting SDK
Pre-creation NOT required Create meeting via API first
Session start First participant joins with topic Join existing meeting ID
Topic Any string (you define it) Meeting ID from API
Scheduling N/A - sessions are ad-hoc Meetings can be scheduled

How Sessions Work

  1. No pre-creation needed: Sessions don't exist until someone joins
  2. Topic = Session ID: Any participants joining with the same topic string join the same session
  3. First join creates it: The session is created when the first participant joins
  4. No meeting ID: There's no numeric meeting ID like in Zoom Meetings
// Session is created on-the-fly when first user joins
// Any string can be the topic - it becomes the session identifier
await client.join('my-custom-session-123', signature, 'User Name');

// Other participants join the SAME session by using the SAME topic
await client.join('my-custom-session-123', signature, 'Another User');

Signature Endpoint Setup

The signature endpoint must be accessible from your frontend without CORS issues.

Option 1: Same-Origin Proxy (Recommended)

# Nginx config
location /api/ {
    proxy_pass http://YOUR_BACKEND_HOST:3005/api/;
    proxy_http_version 1.1;
    proxy_set_header Host $host;
}
// Frontend uses relative URL (same origin)
const response = await fetch('/api/signature', { ... });

Option 2: CORS Configuration

// Express.js backend
const cors = require('cors');
app.use(cors({
  origin: ['https://your-domain.com'],
  credentials: true
}));

WARNING: Mixed content (HTTPS page → HTTP API) will be blocked by browsers.

Use Cases

Use Case Description
Video SDK BYOS (Bring Your Own Storage) Save recordings directly to your S3 bucket

BYOS (Bring Your Own Storage)

Video SDK feature - Zoom saves cloud recordings directly to your Amazon S3 bucket. No downloading required.

Official docs: https://developers.zoom.us/docs/build/storage/

Prerequisites:

  • Video SDK account with Cloud Recording add-on (Universal Credit includes this)
  • AWS S3 bucket

Authentication options:

  1. AWS Access Key - simpler setup
  2. Cross Account Access - more secure (IAM role assumption)

S3 path structure:

Buckets/{bucketName}/cmr/byos/{YYYY}/{MM}/{DD}/{GUID}/cmr_byos/

Key benefits:

  • Zero download bandwidth costs
  • Direct storage during recording
  • Config-only setup (no webhook/download code needed)

Setup location: Developer Portal → Account Settings → General → Communications Content Storage Location

See ../general/use-cases/video-sdk-bring-your-own-storage.md for complete setup guide.

Detailed References

UI & Components

Platform Guides

Sample Repositories

Official (by Zoom)

Type Repository Stars
Web videosdk-web-sample 137
Web NPM videosdk-web 56
Auth videosdk-auth-endpoint-sample 23
UI Toolkit Web videosdk-zoom-ui-toolkit-web 17
UI Toolkit React videosdk-zoom-ui-toolkit-react-sample 17
Next.js videosdk-nextjs-quickstart 16
Telehealth VideoSDK-Web-Telehealth 11
Linux videosdk-linux-raw-recording-sample -

Full list: See general/references/community-repos.md

Resources

Environment Variables

Linux Operations

专为Unity应用集成Zoom Video SDK设计的技能,用于构建自定义视频会话体验,将场景与UI状态映射至SDK事件。提供生命周期、架构参考及故障排查指南,助力开发者快速上手并调试。
在Unity项目中集成Zoom视频功能 需要将Unity UI状态与Video SDK事件同步 查询Zoom Unity SDK的API参考或生命周期工作流
partner-built/zoom-plugin/skills/video-sdk/unity/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill zoom-video-sdk-unity -g -y
SKILL.md
Frontmatter
{
    "name": "zoom-video-sdk-unity",
    "triggers": [
        "video sdk unity",
        "zoom unity sdk",
        "unity custom video",
        "unity video session",
        "unity video wrapper"
    ],
    "description": "Zoom Video SDK for Unity wrapper integrations. Use when building custom Unity-based\nvideo session experiences and mapping Unity scene\/UI state to Video SDK events.\n",
    "user-invocable": false
}
提供Zoom Web视频SDK的JavaScript/TypeScript开发指导,涵盖自定义视频会话、音视频控制、屏幕共享、录制及直播等功能。适用于非嵌入式会议场景,包含架构模式、示例代码及常见问题排查。
需要集成Zoom Web视频SDK进行浏览器端视频应用开发 询问Zoom Video SDK的API使用、事件处理或架构设计 解决Web端视频音频显示、媒体流获取或兼容性诊断问题
partner-built/zoom-plugin/skills/video-sdk/web/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill video-sdk/web -g -y
SKILL.md
Frontmatter
{
    "name": "video-sdk\/web",
    "triggers": [
        "video sdk web",
        "custom video web",
        "attachvideo",
        "peer-video-state-change",
        "web videosdk"
    ],
    "description": "Zoom Video SDK for Web - JavaScript\/TypeScript integration for browser-based video sessions, real-time communication, screen sharing, recording, and live transcription",
    "user-invocable": false
}

Zoom Video SDK - Web Development

Expert guidance for developing with the Zoom Video SDK on Web. This SDK enables custom video applications in the browser with real-time video/audio, screen sharing, cloud recording, live streaming, chat, and live transcription.

This skill is for custom video sessions, not embedded Zoom meetings. If the user wants a custom UI for a real Zoom meeting, route to ../../meeting-sdk/web/component-view/SKILL.md.

Official Documentation: https://developers.zoom.us/docs/video-sdk/web/ API Reference: https://marketplacefront.zoom.us/sdk/custom/web/modules.html Sample Repository: https://github.com/zoom/videosdk-web-sample

Quick Links

New to Video SDK? Follow this path:

  1. SDK Architecture Pattern - Universal 3-step pattern for ANY feature
  2. Session Join Pattern - Complete working code to join a session
  3. Video Rendering - Display video with attachVideo()
  4. Event Handling - Required events for video/audio

Reference:

Having issues?

  • Video not showing → Video Rendering (use attachVideo, not renderVideo)
  • getMediaStream() returns undefined → Call AFTER join() completes
  • Quick diagnostics → Common Issues

SDK Overview

The Zoom Video SDK for Web is a JavaScript library that provides:

  • Session Management: Join/leave video SDK sessions
  • Video/Audio: Start/stop camera and microphone
  • Screen Sharing: Share screens or browser tabs
  • Cloud Recording: Record sessions to Zoom cloud
  • Live Streaming: Stream to RTMP endpoints
  • Chat: In-session messaging
  • Command Channel: Custom command messaging
  • Live Transcription: Real-time speech-to-text
  • Subsessions: Breakout room support
  • Whiteboard: Collaborative whiteboard features
  • Virtual Background: Blur or custom image backgrounds

Prerequisites

System Requirements

  • Modern Browser: Chrome 80+, Firefox 75+, Safari 14+, Edge 80+
  • Video SDK Credentials: SDK Key and Secret from Marketplace
  • JWT Token: Server-side generated signature

Browser Feature Requirements

// Check browser compatibility before init
const compatibility = ZoomVideo.checkSystemRequirements();
console.log('Audio:', compatibility.audio);
console.log('Video:', compatibility.video);
console.log('Screen:', compatibility.screen);

// Check feature support
const features = ZoomVideo.checkFeatureRequirements();
console.log('Supported:', features.supportFeatures);
console.log('Unsupported:', features.unSupportFeatures);

Optional Pre-Join Diagnostics (Recommended for Reliability)

Use Probe SDK as a readiness gate before client.join(...) when you need to reduce failed starts:

  1. Run diagnostics with ../../probe-sdk/SKILL.md.
  2. Evaluate policy (allow, warn, block).
  3. Start Video SDK join only when policy allows.

Cross-skill flow: ../../general/use-cases/probe-sdk-preflight-readiness-gate.md

Installation

NPM (Recommended)

npm install @zoom/videosdk
import ZoomVideo from '@zoom/videosdk';

CDN (Fallback Strategy Recommended)

Note: Some networks/ad blockers can block source.zoom.us. If you see flaky loads, first try allowlisting the domain in your environment. If needed, consider a fallback (mirror/self-host) only if it's permitted for your use case and you can keep versions in sync.

# Download SDK locally
curl "https://source.zoom.us/videosdk/zoom-video-2.3.12.min.js" -o public/js/zoom-video-sdk.min.js
<!-- Use local copy instead of CDN -->
<script src="js/zoom-video-sdk.min.js"></script>
// CDN exports as WebVideoSDK, NOT ZoomVideo
const ZoomVideo = WebVideoSDK.default;

Quick Start

import ZoomVideo from '@zoom/videosdk';

// 1. Create client (singleton - returns same instance)
const client = ZoomVideo.createClient();

// 2. Initialize SDK
await client.init('en-US', 'Global', { patchJsMedia: true });

// 3. Join session
await client.join(topic, signature, userName, password);

// 4. CRITICAL: Get stream AFTER join
const stream = client.getMediaStream();

// 5. Start media
await stream.startVideo();
await stream.startAudio();

// 6. Attach video to DOM
const videoElement = await stream.attachVideo(userId, VideoQuality.Video_360P);
document.getElementById('video-container').appendChild(videoElement);

SDK Lifecycle (CRITICAL ORDER)

The SDK has a strict lifecycle. Violating it causes silent failures.

1. Create client:     client = ZoomVideo.createClient()
2. Initialize:        await client.init('en-US', 'Global', options)
3. Join session:      await client.join(topic, signature, userName, password)
4. Get stream:        stream = client.getMediaStream()  ← ONLY AFTER JOIN
5. Start media:       await stream.startVideo() / await stream.startAudio()

Common Mistake:

// WRONG: Getting stream before joining
const stream = client.getMediaStream();  // Returns undefined!
await client.join(...);

// CORRECT: Get stream after joining
await client.join(...);
const stream = client.getMediaStream();  // Works!

Critical Gotchas and Best Practices

getMediaStream() ONLY Works After join()

The #1 issue that causes video/audio to fail:

// WRONG
const stream = client.getMediaStream();  // undefined!
await client.join(...);

// CORRECT
await client.join(...);
const stream = client.getMediaStream();  // Works

Use attachVideo() NOT renderVideo()

renderVideo() is deprecated. Use attachVideo() which returns a VideoPlayer element:

import { VideoQuality } from '@zoom/videosdk';

// CORRECT: attachVideo returns element to append
const videoElement = await stream.attachVideo(userId, VideoQuality.Video_360P);
document.getElementById('video-container').appendChild(videoElement);

// WRONG: renderVideo is deprecated
await stream.renderVideo(canvas, userId, ...);  // Don't use!

Video Rendering is Event-Driven (CRITICAL)

You MUST listen for events to properly render participant videos:

// When another participant's video state changes
client.on('peer-video-state-change', async (payload) => {
  const { action, userId } = payload;
  
  if (action === 'Start') {
    // Participant turned on video - attach it
    const element = await stream.attachVideo(userId, VideoQuality.Video_360P);
    container.appendChild(element);
  } else if (action === 'Stop') {
    // Participant turned off video - detach it
    await stream.detachVideo(userId);
  }
});

// When participants join/leave
client.on('user-added', (payload) => {
  // New participant joined - check if their video is on
  const users = client.getAllUser();
  // Render videos for users with bVideoOn === true
});

client.on('user-removed', (payload) => {
  // Participant left - clean up their video element
  stream.detachVideo(payload[0].userId);
});

Peer Video on Mid-Session Join

Existing participants' videos won't auto-render when you join mid-session.

// After joining, render existing participants' videos
const renderExistingVideos = async () => {
  await new Promise(resolve => setTimeout(resolve, 500));
  
  const users = client.getAllUser();
  const currentUserId = client.getCurrentUserInfo().userId;
  
  for (const user of users) {
    if (user.bVideoOn && user.userId !== currentUserId) {
      const element = await stream.attachVideo(user.userId, VideoQuality.Video_360P);
      document.getElementById(`video-${user.userId}`).appendChild(element);
    }
  }
};

CDN Race Condition with ES Modules

When using <script type="module"> with CDN, the SDK may not be loaded yet:

function waitForSDK(timeout = 10000) {
  return new Promise((resolve, reject) => {
    if (typeof WebVideoSDK !== 'undefined') {
      resolve();
      return;
    }
    const start = Date.now();
    const check = setInterval(() => {
      if (typeof WebVideoSDK !== 'undefined') {
        clearInterval(check);
        resolve();
      } else if (Date.now() - start > timeout) {
        clearInterval(check);
        reject(new Error('SDK failed to load'));
      }
    }, 100);
  });
}

await waitForSDK();
const ZoomVideo = WebVideoSDK.default;

SharedArrayBuffer for HD Video

For optimal performance and HD video, configure these headers on your server:

Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp

Note: As of v1.11.2, SharedArrayBuffer is elective (not strictly required).

Check HD Capability Before Enabling

const stream = client.getMediaStream();

// Check if 720p is supported
const hdSupported = stream.isSupportHDVideo();

// Get maximum video quality
const maxQuality = stream.getVideoMaxQuality();
// 0=90P, 1=180P, 2=360P, 3=720P, 4=1080P

// Start video with HD
if (hdSupported) {
  await stream.startVideo({ hd: true });
}

Screen Share Rendering Mode Check

const stream = client.getMediaStream();

// Check which element type to use
if (stream.isStartShareScreenWithVideoElement()) {
  // Use video element
  const video = document.getElementById('share-video');
  await stream.startShareScreen(video as unknown as HTMLCanvasElement);
} else {
  // Use canvas element
  const canvas = document.getElementById('share-canvas');
  await stream.startShareScreen(canvas);
}

Key Features

Video Quality Enum

import { VideoQuality } from '@zoom/videosdk';

VideoQuality.Video_90P   // 0
VideoQuality.Video_180P  // 1
VideoQuality.Video_360P  // 2 (recommended for most cases)
VideoQuality.Video_720P  // 3
VideoQuality.Video_1080P // 4

Virtual Backgrounds

const stream = client.getMediaStream();

// Always check support first
if (stream.isSupportVirtualBackground()) {
  // Blur background
  await stream.updateVirtualBackgroundImage('blur');
  
  // Custom image background
  await stream.updateVirtualBackgroundImage('https://example.com/bg.jpg');
  
  // Remove virtual background
  await stream.updateVirtualBackgroundImage(undefined);
}

Video Processor (Custom Effects)

The VideoProcessor class allows you to intercept and modify video frames:

// video-processor-worker.js
class MyVideoProcessor extends VideoProcessor {
  processFrame(input, output) {
    const ctx = output.getContext('2d');
    ctx.drawImage(input, 0, 0);
    
    // Add overlay
    ctx.fillStyle = 'white';
    ctx.font = '24px Arial';
    ctx.fillText('Live', 20, 40);
    
    return true;
  }
}

WebRTC Mode

Enable WebRTC mode for direct peer-to-peer streaming with HD video support:

await client.init('en-US', 'Global', {
  patchJsMedia: true,
  webrtc: true  // Enable WebRTC mode
});

Feature Clients

Access specialized clients from the VideoClient:

Client Access Method Purpose
Stream client.getMediaStream() Video, audio, screen share, devices
Chat client.getChatClient() Send/receive messages
Command client.getCommandClient() Custom commands (reactions, etc.)
Recording client.getRecordingClient() Cloud recording control
Transcription client.getLiveTranscriptionClient() Live captions
LiveStream client.getLiveStreamClient() RTMP streaming
Subsession client.getSubsessionClient() Breakout rooms
Whiteboard client.getWhiteboardClient() Collaborative whiteboard

Common Tasks

Start/Stop Video

await stream.startVideo();
await stream.stopVideo();

Start/Stop Audio

await stream.startAudio();
await stream.muteAudio();
await stream.unmuteAudio();
await stream.stopAudio();

Switch Devices

// Get available devices
const cameras = stream.getCameraList();
const mics = stream.getMicList();
const speakers = stream.getSpeakerList();

// Switch devices
await stream.switchCamera(cameraId);
await stream.switchMicrophone(micId);
await stream.switchSpeaker(speakerId);

Screen Sharing

// Start sharing
await stream.startShareScreen(canvas);

// Stop sharing
await stream.stopShareScreen();

// Receive share
client.on('active-share-change', async (payload) => {
  if (payload.state === 'Active') {
    await stream.startShareView(canvas, payload.userId);
  } else {
    await stream.stopShareView();
  }
});

Chat

const chatClient = client.getChatClient();

// Send to everyone
await chatClient.send('Hello, everyone!');

// Send to specific user
await chatClient.sendToUser(userId, 'Private message');

// Receive messages
client.on('chat-on-message', (payload) => {
  console.log(`${payload.sender.name}: ${payload.message}`);
});

Recording (Host Only)

const recordingClient = client.getRecordingClient();

await recordingClient.startCloudRecording();
await recordingClient.stopCloudRecording();

client.on('recording-change', (payload) => {
  console.log('Recording status:', payload.state);
});

Leave/End Session

// Leave session (others stay)
await client.leave();

// End session for ALL participants (host only)
await client.leave(true);

Error Handling

Common Join Errors

Error Cause Solution
Invalid signature JWT expired or malformed Generate new signature
Session does not exist Host hasn't started yet Show "waiting" message, retry
Permission denied User denied camera/mic Request permission again

Example Error Handler

try {
  await client.join(topic, signature, userName, password);
} catch (error) {
  if (error.reason?.includes('signature')) {
    // Regenerate signature and retry
  } else if (error.reason?.includes('Session')) {
    // Show "Waiting for host..." and poll
  } else if (error.reason?.includes('Permission')) {
    // Guide user to enable permissions
  }
  console.error('Join failed:', error);
}

Browser Compatibility

Feature Chrome Firefox Safari Edge
Video 80+ 75+ 14+ 80+
Audio 80+ 75+ 14+ 80+
Screen Share 80+ 75+ 15+ 80+
Virtual BG 80+ 90+ - 80+

Safari Notes:

  • Virtual background not supported
  • Screen sharing requires macOS 15+

CORS Errors (Telemetry)

CORS errors to log-external-gateway.zoom.us are harmless.

These are caused by COOP/COEP headers blocking telemetry requests. They don't affect SDK functionality.

Complete Documentation Library

Core Concepts

Complete Examples

Framework Integrations

Troubleshooting

References

Official Sample Repositories

Type Repository
Web Sample videosdk-web-sample
React SDK videosdk-react
Next.js videosdk-nextjs-quickstart
Vue/Nuxt videosdk-vue-nuxt-quickstart
Auth Endpoint videosdk-auth-endpoint-sample
UI Toolkit videosdk-zoom-ui-toolkit-react-sample

Resources


Need help? Start with SKILL.md for complete navigation.

Merged from video-sdk/web/SKILL.md

Zoom Video SDK Web - Complete Documentation Index

Quick Start Path

If you're new to the SDK, follow this order:

  1. Read the architecture patternconcepts/sdk-architecture-pattern.md

    • Universal formula: Create Client → Init → Join → Get Stream → Use
    • Once you understand this, you can implement any feature
  2. Implement session joinexamples/session-join-pattern.md

    • Complete working JWT + session join code
  3. Listen to eventsexamples/event-handling.md

    • CRITICAL: The SDK is event-driven, you must listen for events
  4. Implement videoexamples/video-rendering.md

    • Use attachVideo(), NOT renderVideo()
  5. Troubleshoot any issuestroubleshooting/common-issues.md

    • Quick diagnostic checklist
    • Error code tables

Documentation Structure

video-sdk/web/
├── SKILL.md                           # Main skill overview
├── SKILL.md                           # This file - navigation guide
│
├── concepts/                          # Core architectural patterns
│   ├── sdk-architecture-pattern.md   # Universal formula for ANY feature
│   └── singleton-hierarchy.md        # 4-level navigation guide
│
├── examples/                          # Complete working code
│   ├── session-join-pattern.md       # JWT auth + session join
│   ├── video-rendering.md            # attachVideo() patterns
│   ├── screen-share.md               # Send and receive screen shares
│   ├── event-handling.md             # Required events
│   ├── chat.md                       # Chat implementation
│   ├── command-channel.md            # Command channel messaging
│   ├── recording.md                  # Cloud recording control
│   ├── transcription.md              # Live transcription/captions
│   ├── react-hooks.md                # Official @zoom/videosdk-react library
│   └── framework-integrations.md     # Next.js, Vue/Nuxt, ZFG patterns
│
├── troubleshooting/                   # Problem solving guides
│   └── common-issues.md              # Quick diagnostic workflow
│
└── references/                        # Reference documentation
    ├── web-reference.md              # API hierarchy, methods, error codes
    └── events-reference.md           # All event types

By Use Case

I want to build a video app

  1. SDK Architecture Pattern - Understand the pattern
  2. Session Join Pattern - Join sessions
  3. Video Rendering - Display video
  4. Event Handling - Listen for video events

I'm getting runtime errors

  1. Common Issues - Error code tables
  2. "getMediaStream() is undefined" → Call AFTER join() completes

I want to receive screen shares

  1. Screen Share - startShareView() patterns
  2. Event Handling - active-share-change event

I want to send screen shares

  1. Screen Share - startShareScreen() patterns
  2. Check isStartShareScreenWithVideoElement() for element type

I want to use chat

  1. Chat - Send/receive messages
  2. getChatClient() for ChatClient access

I want to record sessions

  1. Recording - Cloud recording (host only)
  2. getRecordingClient() for RecordingClient access

I want to use live transcription

  1. Transcription - Enable live captions
  2. getLiveTranscriptionClient() for LiveTranscriptionClient access

I want to use command channel

  1. Command Channel - Custom signaling between participants
  2. Must call getCommandClient() AFTER join()

I want to implement a specific feature

  1. SDK Architecture Pattern - START HERE!
  2. Singleton Hierarchy - Navigate to the feature
  3. API Reference - Method signatures

I'm using React

  1. React Hooks - Official @zoom/videosdk-react library
  2. Provides hooks: useSession, useSessionUsers, useVideoState, useAudioState
  3. Pre-built components: VideoPlayerComponent, ScreenSharePlayerComponent

I'm using Next.js or Vue/Nuxt

  1. Framework Integrations - SSR considerations
  2. Server-side JWT generation patterns
  3. Client-side only SDK usage

Most Critical Documents

1. SDK Architecture Pattern (MASTER DOCUMENT)

concepts/sdk-architecture-pattern.md

The universal 5-step pattern:

  1. Create client
  2. Initialize SDK
  3. Join session
  4. Get stream
  5. Use features + listen to events

2. Common Issues (MOST COMMON PROBLEMS)

troubleshooting/common-issues.md

Common issues:

  • getMediaStream() returns undefined
  • Video not displaying
  • renderVideo() deprecated

3. Singleton Hierarchy (NAVIGATION MAP)

concepts/singleton-hierarchy.md

4-level deep navigation showing how to reach every feature.


Key Learnings

Critical Discoveries:

  1. getMediaStream() ONLY works after join()

  2. Use attachVideo() NOT renderVideo()

    • renderVideo() is deprecated
    • attachVideo() returns a VideoPlayer element to append to DOM
    • See: Video Rendering
  3. The SDK is Event-Driven

    • You MUST listen for events to render participant videos
    • key events: peer-video-state-change, user-added, user-removed
    • See: Event Handling
  4. Peer Videos on Mid-Session Join

    • Existing participants' videos won't auto-render
    • Must manually iterate getAllUser() and attachVideo()
    • See: Video Rendering
  5. CDN vs NPM

    • CDN exports as WebVideoSDK.default, not ZoomVideo
    • Some networks/ad blockers may block source.zoom.us - allowlist or use a permitted fallback strategy
    • See: Session Join Pattern
  6. SharedArrayBuffer for HD

    • Required for 720p/1080p video
    • Need COOP/COEP headers on server
    • Check with stream.isSupportHDVideo()
  7. Screen Share Element Type

    • Check isStartShareScreenWithVideoElement() for correct element type
    • See: Screen Share
  8. Command Channel Setup Order

    • Must call getCommandClient() AFTER client.join()
    • Register listeners AFTER join, not before
    • Web uses getCommandClient() not getCmdChannel()
    • See: Command Channel
  9. Command Channel is Session-Scoped

    • Does NOT span across different sessions
    • Both sender and receiver must be in the same session

Quick Reference

"getMediaStream() returns undefined"

→ Call AFTER join() completes

"Video not showing"

Video Rendering - Use attachVideo(), check events

"renderVideo() doesn't work"

Video Rendering - Use attachVideo() instead

"How do I implement [feature]?"

SDK Architecture Pattern

"How do I navigate to [client]?"

Singleton Hierarchy

"What error code means what?"

Common Issues


Document Version

Based on Zoom Video SDK for Web v2.3.x


Happy coding!

Remember: The SDK Architecture Pattern is your key to unlocking the entire SDK. Read it first!

Operations

  • RUNBOOK.md - 5-minute preflight and debugging checklist.
提供Zoom Video SDK Windows版C++开发指南,涵盖会话管理、音视频采集注入、屏幕共享、录制及实时转录等功能。包含架构模式、代码示例、常见问题排查及API参考,支持自定义UI与.NET集成。
Windows平台Zoom视频SDK开发 C++集成Zoom视频会议功能 音视频数据捕获与渲染 解决回调未触发或构建错误
partner-built/zoom-plugin/skills/video-sdk/windows/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill video-sdk/windows -g -y
SKILL.md
Frontmatter
{
    "name": "video-sdk\/windows",
    "triggers": [
        "video sdk windows",
        "windows video sdk",
        "video sdk raw data windows",
        "windows custom video",
        "c++ video sdk"
    ],
    "description": "Zoom Video SDK for Windows - C++ integration for video sessions, raw audio\/video capture, screen sharing, recording, and real-time communication",
    "user-invocable": false
}

Zoom Video SDK - Windows Development

Expert guidance for developing with the Zoom Video SDK on Windows. This SDK enables custom video applications, raw media capture/injection, cloud recording, live streaming, and real-time transcription on Windows platforms.

Official Documentation: https://developers.zoom.us/docs/video-sdk/windows/ API Reference: https://marketplacefront.zoom.us/sdk/custom/windows/ Sample Repository: https://github.com/zoom/videosdk-windows-rawdata-sample

Quick Links

New to Video SDK? Follow this path:

  1. SDK Architecture Pattern - Universal 3-step pattern for ANY feature
  2. Session Join Pattern - Complete working code to join a session
  3. Windows Message Loop - CRITICAL: Fix callbacks not firing
  4. Video Rendering - Display video with Canvas API

Reference:

Having issues?

Building a Custom UI?

SDK Overview

The Zoom Video SDK for Windows is a C++ library that provides:

  • Session Management: Join/leave video SDK sessions
  • Raw Data Access: Capture raw audio/video frames (YUV420, PCM)
  • Raw Data Injection: Send custom audio/video into sessions
  • Screen Sharing: Share screens or inject custom share sources
  • Cloud Recording: Record sessions to Zoom cloud
  • Live Streaming: Stream to RTMP endpoints (YouTube, etc.)
  • Chat & Commands: In-session messaging and command channels
  • Live Transcription: Real-time speech-to-text
  • Subsessions: Breakout room support
  • Whiteboard: Collaborative whiteboard features
  • Annotations: Screen share annotations
  • C# Integration: C++/CLI wrapper for .NET applications

Prerequisites

System Requirements

  • OS: Windows 10 (1903 or later) or Windows 11
  • Architecture: x64 (recommended), x86, or ARM64
  • Visual Studio: 2019 or 2022 (Community, Professional, or Enterprise)
  • Windows SDK: 10.0.19041.0 or later
  • .NET Framework: 4.8 or later (for C# applications)

Visual Studio Workloads

Install these workloads via Visual Studio Installer:

  1. Desktop development with C++

    • MSVC v142 or v143 compiler
    • Windows 10/11 SDK
    • C++ CMake tools (optional)
  2. .NET desktop development (for C# applications)

    • .NET Framework 4.8 targeting pack
    • C++/CLI support

Quick Start

C++ Application

#include <windows.h>
#include "zoom_video_sdk_api.h"
#include "zoom_video_sdk_interface.h"
#include "zoom_video_sdk_delegate_interface.h"

USING_ZOOM_VIDEO_SDK_NAMESPACE

// 1. Create SDK object
IZoomVideoSDK* video_sdk_obj = CreateZoomVideoSDKObj();

// 2. Initialize
ZoomVideoSDKInitParams init_params;
init_params.domain = L"https://zoom.us";
init_params.enableLog = true;
init_params.logFilePrefix = L"zoom_win_video";
init_params.videoRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;
init_params.shareRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;
init_params.audioRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;

ZoomVideoSDKErrors err = video_sdk_obj->initialize(init_params);

// 3. Add event listener
video_sdk_obj->addListener(myDelegate);

// 4. Join session (IMPORTANT: set audioOption.connect = false)
ZoomVideoSDKSessionContext session_context;
session_context.sessionName = L"my-session";
session_context.userName = L"Windows User";
session_context.token = L"your-jwt-token";
session_context.videoOption.localVideoOn = false;
session_context.audioOption.connect = false;  // Connect audio after join
session_context.audioOption.mute = true;

IZoomVideoSDKSession* session = video_sdk_obj->joinSession(session_context);

// 5. CRITICAL: Add Windows message pump for callbacks to work
bool running = true;
while (running) {
    // Process Windows messages (required for SDK callbacks)
    MSG msg;
    while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    
    // Your application logic here
    Sleep(10);
}

C# Application

using ZoomVideoSDK;

var sdkManager = new ZoomSDKManager();
sdkManager.Initialize();
sdkManager.JoinSession("my-session", "jwt-token", "User Name", "");

Key Features

Feature Description
Session Management Join, leave, and manage video sessions
Raw Video (YUV I420) Capture and inject raw video frames
Raw Audio (PCM) Capture and inject raw audio data
Screen Sharing Share screens or custom content
Cloud Recording Record sessions to Zoom cloud
Live Streaming Stream to RTMP endpoints
Chat Send/receive chat messages
Command Channel Custom command messaging
Live Transcription Real-time speech-to-text
C# Support Full .NET Framework integration

Sample Applications

Official Repository: https://github.com/zoom/videosdk-windows-rawdata-sample

Sample Description
VSDK_SkeletonDemo Minimal session join - start here
VSDK_getRawVideo Capture YUV420 video frames
VSDK_getRawAudio Capture PCM audio
VSDK_sendRawVideo Inject custom video (virtual camera)
VSDK_sendRawAudio Inject custom audio (virtual mic)
VSDK_CloudRecording Cloud recording control
VSDK_CommandChannel Custom command messaging
VSDK_TranscriptionAndTranslation Live captions

See complete guide: Sample Applications Reference

Critical Gotchas and Best Practices

⚠️ CRITICAL: Windows Message Pump Required

The #1 issue that causes session joins to hang with no callbacks:

All Windows applications using the Zoom SDK MUST process Windows messages. The SDK uses Windows messages to deliver callbacks like onSessionJoin(), onError(), etc.

Problem: Without a message pump, joinSession() appears to succeed but callbacks never fire.

Solution: Add this to your main loop:

while (running) {
    // REQUIRED: Process Windows messages
    MSG msg;
    while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    
    // Your application logic
    Sleep(10);
}

Applies to:

  • Console applications (no automatic message pump)
  • Custom main loops
  • Applications that don't use standard WinMain/WndProc

GUI applications using WinMain with standard message loop already have this.

Audio Connection Strategy

Best Practice: Set audioOption.connect = false when joining, then connect audio in the onSessionJoin() callback.

// During join
session_context.audioOption.connect = false;  // Don't connect yet
session_context.audioOption.mute = true;

// In onSessionJoin() callback
void onSessionJoin() override {
    IZoomVideoSDKAudioHelper* audioHelper = video_sdk_obj->getAudioHelper();
    if (audioHelper) {
        audioHelper->startAudio();  // Connect now
    }
}

Why: This pattern is used in all official Zoom samples. It separates session join from audio initialization for better reliability and error handling.

All Delegate Callbacks Must Be Implemented

The IZoomVideoSDKDelegate interface has 70+ pure virtual methods. ALL must be implemented, even if empty:

// Required even if you don't use them
void onProxyDetectComplete() override {}
void onUserWhiteboardShareStatusChanged(IZoomVideoSDKUser*, IZoomVideoSDKWhiteboardHelper*) override {}
// ... etc

Tip: Check the SDK version's zoom_video_sdk_delegate_interface.h for the complete list. The interface changes between SDK versions.

Memory Mode for Raw Data

Always use heap mode for raw data memory:

init_params.videoRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;
init_params.shareRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;
init_params.audioRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;

Stack mode can cause issues with large video frames.

Thread Safety

SDK callbacks execute on SDK threads, not your main thread:

  • Don't perform heavy operations in callbacks
  • Don't call cleanup() from within callbacks
  • Use thread-safe queues for passing data to UI thread
  • Use mutexes when accessing shared state

Consult Official Samples First

When SDK behavior is unexpected, always check the official samples before troubleshooting:

Local samples:

  • C:\tempsdk\Zoom_VideoSDK_Windows_RawDataDemos\VSDK_SkeletonDemo\ (simplest)
  • C:\tempsdk\sdksamples\zoom-video-sdk-windows-2.4.12\Sample-Libs\x64\demo\

Official samples show correct patterns for:

  • Message pump implementation ✓
  • Audio connection strategy ✓
  • Error handling ✓
  • Memory management ✓

Video Rendering - Two Approaches

The Zoom SDK provides two different ways to render video. Choose based on your needs.

🎯 Canvas API (Recommended for Most Use Cases)

Best for: Standard applications, clean video quality, ease of implementation

The SDK renders video directly to your HWND. No YUV conversion needed.

// Subscribe to a user's video with Canvas API
IZoomVideoSDKCanvas* canvas = user->GetVideoCanvas();
if (canvas) {
    ZoomVideoSDKErrors ret = canvas->subscribeWithView(
        hwnd,                                    // Your window handle
        ZoomVideoSDKVideoAspect_PanAndScan,     // Fit to window, may crop
        ZoomVideoSDKResolution_Auto              // Let SDK choose best resolution
    );
    
    if (ret == ZoomVideoSDKErrors_Success) {
        // SDK is now rendering directly to your window!
    }
}

// Unsubscribe when done
canvas->unSubscribeWithView(hwnd);

Advantages:

  • Best quality - SDK uses optimized, hardware-accelerated rendering
  • No artifacts - Professional video quality
  • Simple code - 3 lines to subscribe
  • Better performance - No CPU-intensive YUV conversion
  • Automatic scaling - SDK handles window resizing
  • Aspect ratio - Built-in aspect ratio handling

Example from official .NET sample:

// Self video preview
IZoomVideoSDKCanvas* canvas = myself->GetVideoCanvas();
canvas->subscribeWithView(selfVideoHwnd, aspect, resolution);

// Remote user video
IZoomVideoSDKCanvas* remoteCanvas = remoteUser->GetVideoCanvas();
remoteCanvas->subscribeWithView(remoteVideoHwnd, aspect, resolution);

Video Aspect Options:

  • ZoomVideoSDKVideoAspect_Original - Letterbox/pillarbox, no cropping
  • ZoomVideoSDKVideoAspect_FullFilled - Fill window, may crop edges
  • ZoomVideoSDKVideoAspect_PanAndScan - Smart crop to fill window
  • ZoomVideoSDKVideoAspect_LetterBox - Show full video with black bars

Resolution Options:

  • ZoomVideoSDKResolution_90P
  • ZoomVideoSDKResolution_180P
  • ZoomVideoSDKResolution_360P - Good balance
  • ZoomVideoSDKResolution_720P - HD quality
  • ZoomVideoSDKResolution_1080P
  • ZoomVideoSDKResolution_Auto - Let SDK decide (recommended)

🔧 Raw Data Pipe (Advanced Use Cases)

Best for: Custom video processing, effects, recording, computer vision

You receive raw YUV420 frames and handle rendering yourself.

// 1. Create a delegate to receive frames
class VideoRenderer : public IZoomVideoSDKRawDataPipeDelegate {
public:
    void onRawDataFrameReceived(YUVRawDataI420* data) override {
        int width = data->GetStreamWidth();
        int height = data->GetStreamHeight();
        
        char* yBuffer = data->GetYBuffer();
        char* uBuffer = data->GetUBuffer();
        char* vBuffer = data->GetVBuffer();
        
        // Convert YUV420 to RGB and render
        ConvertYUVToRGB(yBuffer, uBuffer, vBuffer, width, height);
        RenderToWindow(rgbBuffer, width, height);
    }
    
    void onRawDataStatusChanged(RawDataStatus status) override {
        // Handle video on/off
    }
};

// 2. Subscribe to raw data
IZoomVideoSDKRawDataPipe* pipe = user->GetVideoPipe();
VideoRenderer* renderer = new VideoRenderer();
pipe->subscribe(ZoomVideoSDKResolution_720P, renderer);

YUV420 to RGB Conversion (ITU-R BT.601):

void ConvertYUV420ToRGB(char* yBuffer, char* uBuffer, char* vBuffer, 
                        int width, int height) {
    for (int y = 0; y < height; y++) {
        for (int x = 0; x < width; x++) {
            int yIndex = y * width + x;
            int uvIndex = (y / 2) * (width / 2) + (x / 2);
            
            int Y = (unsigned char)yBuffer[yIndex];
            int U = (unsigned char)uBuffer[uvIndex];
            int V = (unsigned char)vBuffer[uvIndex];
            
            // YUV to RGB conversion
            int C = Y - 16;
            int D = U - 128;
            int E = V - 128;
            
            int R = (298 * C + 409 * E + 128) >> 8;
            int G = (298 * C - 100 * D - 208 * E + 128) >> 8;
            int B = (298 * C + 516 * D + 128) >> 8;
            
            // Clamp to [0, 255]
            R = (R < 0) ? 0 : (R > 255) ? 255 : R;
            G = (G < 0) ? 0 : (G > 255) ? 255 : G;
            B = (B < 0) ? 0 : (B > 255) ? 255 : B;
            
            // Store RGB (BGR format for Windows)
            rgbBuffer[yIndex * 3 + 0] = (unsigned char)B;
            rgbBuffer[yIndex * 3 + 1] = (unsigned char)G;
            rgbBuffer[yIndex * 3 + 2] = (unsigned char)R;
        }
    }
}

Render with GDI:

void RenderToWindow(unsigned char* rgbBuffer, int width, int height) {
    HDC hdc = GetDC(hwnd);
    
    BITMAPINFO bmi = {};
    bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bmi.bmiHeader.biWidth = width;
    bmi.bmiHeader.biHeight = -height;  // Negative for top-down
    bmi.bmiHeader.biPlanes = 1;
    bmi.bmiHeader.biBitCount = 24;     // 24-bit RGB
    bmi.bmiHeader.biCompression = BI_RGB;
    
    RECT rect;
    GetClientRect(hwnd, &rect);
    
    StretchDIBits(hdc,
        0, 0, rect.right, rect.bottom,  // Destination
        0, 0, width, height,              // Source
        rgbBuffer, &bmi,
        DIB_RGB_COLORS, SRCCOPY);
    
    ReleaseDC(hwnd, hdc);
}

Disadvantages:

  • ⚠️ CPU intensive - YUV conversion can cause frame drops
  • ⚠️ Artifacts - Manual rendering may show tearing/artifacts
  • ⚠️ Complex - More code to maintain
  • ⚠️ Performance - Slower than Canvas API

Use Raw Data When:

  • Adding video filters/effects
  • Recording to custom formats
  • Computer vision processing
  • Custom compositing
  • Streaming to non-standard outputs

Self Video vs Remote Users

Self Video (your own camera):

Option A: Canvas API

IZoomVideoSDKSession* session = sdk->getSessionInfo();
IZoomVideoSDKUser* myself = session->getMyself();
IZoomVideoSDKCanvas* canvas = myself->GetVideoCanvas();
canvas->subscribeWithView(selfVideoHwnd, aspect, resolution);

Option B: Video Preview (for self only)

IZoomVideoSDKVideoHelper* videoHelper = sdk->getVideoHelper();
videoHelper->startVideo();  // Start transmission

// For preview rendering
videoHelper->startVideoCanvasPreview(selfVideoHwnd, aspect, resolution);

Remote Users (other participants):

Canvas API (recommended):

// In onUserJoin callback
void onUserJoin(IZoomVideoSDKUserHelper*, IVideoSDKVector<IZoomVideoSDKUser*>* userList) {
    for (int i = 0; i < userList->GetCount(); i++) {
        IZoomVideoSDKUser* user = userList->GetItem(i);
        IZoomVideoSDKCanvas* canvas = user->GetVideoCanvas();
        canvas->subscribeWithView(userVideoHwnd, aspect, resolution);
    }
}

Event-Driven Subscription Pattern

⚠️ CRITICAL: Video subscription must be event-driven and manual.

Key Events:

  1. onSessionJoin - Subscribe to self video
  2. onUserJoin - Subscribe to new remote users
  3. onUserVideoStatusChanged - Re-subscribe when video turns on/off
  4. onUserLeave - Unsubscribe and cleanup

Complete Pattern:

class MainFrame : public IZoomVideoSDKDelegate {
private:
    std::map<IZoomVideoSDKUser*, IZoomVideoSDKCanvas*> subscribedUsers_;
    HWND videoWindow_;
    
public:
    void onSessionJoin() override {
        // Start your own video
        IZoomVideoSDKVideoHelper* videoHelper = sdk->getVideoHelper();
        videoHelper->startVideo();
        
        // Subscribe to self video
        IZoomVideoSDKUser* myself = sdk->getSessionInfo()->getMyself();
        SubscribeToUser(myself);
    }
    
    void onUserJoin(IZoomVideoSDKUserHelper*, 
                    IVideoSDKVector<IZoomVideoSDKUser*>* userList) override {
        // Get current user to exclude self
        IZoomVideoSDKUser* myself = sdk->getSessionInfo()->getMyself();
        
        for (int i = 0; i < userList->GetCount(); i++) {
            IZoomVideoSDKUser* user = userList->GetItem(i);
            
            // IMPORTANT: Only subscribe to REMOTE users!
            if (user != myself) {
                SubscribeToUser(user);
            }
        }
    }
    
    void onUserVideoStatusChanged(IZoomVideoSDKVideoHelper*, 
                                  IVideoSDKVector<IZoomVideoSDKUser*>* userList) override {
        IZoomVideoSDKUser* myself = sdk->getSessionInfo()->getMyself();
        
        for (int i = 0; i < userList->GetCount(); i++) {
            IZoomVideoSDKUser* user = userList->GetItem(i);
            if (user != myself) {
                // Re-subscribe when video status changes
                SubscribeToUser(user);
            }
        }
    }
    
    void onUserLeave(IZoomVideoSDKUserHelper*, 
                    IVideoSDKVector<IZoomVideoSDKUser*>* userList) override {
        for (int i = 0; i < userList->GetCount(); i++) {
            IZoomVideoSDKUser* user = userList->GetItem(i);
            UnsubscribeFromUser(user);
        }
    }
    
    void onSessionLeave() override {
        // Cleanup all subscriptions
        for (auto& pair : subscribedUsers_) {
            IZoomVideoSDKCanvas* canvas = pair.second;
            if (canvas) {
                canvas->unSubscribeWithView(videoWindow_);
            }
        }
        subscribedUsers_.clear();
    }
    
private:
    void SubscribeToUser(IZoomVideoSDKUser* user) {
        if (!user || subscribedUsers_.find(user) != subscribedUsers_.end())
            return;
            
        IZoomVideoSDKCanvas* canvas = user->GetVideoCanvas();
        if (canvas) {
            ZoomVideoSDKErrors ret = canvas->subscribeWithView(
                videoWindow_,
                ZoomVideoSDKVideoAspect_PanAndScan,
                ZoomVideoSDKResolution_Auto
            );
            
            if (ret == ZoomVideoSDKErrors_Success) {
                subscribedUsers_[user] = canvas;
            }
        }
    }
    
    void UnsubscribeFromUser(IZoomVideoSDKUser* user) {
        auto it = subscribedUsers_.find(user);
        if (it != subscribedUsers_.end()) {
            IZoomVideoSDKCanvas* canvas = it->second;
            if (canvas) {
                canvas->unSubscribeWithView(videoWindow_);
            }
            subscribedUsers_.erase(it);
        }
    }
};

Key Points:

  • ✅ Subscribe in response to events (onUserJoin, onUserVideoStatusChanged)
  • ✅ Always exclude current user from remote subscriptions
  • ✅ Unsubscribe on onUserLeave
  • ✅ Clean up all subscriptions on onSessionLeave
  • ✅ Track subscriptions in a map for lifecycle management

⚠️ Screen Share Subscription (DIFFERENT from Video!)

CRITICAL: Screen share subscription uses IZoomVideoSDKShareAction from the callback, NOT user->GetShareCanvas()!

// WRONG - This won't work for remote screen shares!
user->GetShareCanvas()->subscribeWithView(hwnd, ...);

// CORRECT - Use IZoomVideoSDKShareAction from onUserShareStatusChanged callback
void onUserShareStatusChanged(IZoomVideoSDKShareHelper* pShareHelper,
                               IZoomVideoSDKUser* pUser,
                               IZoomVideoSDKShareAction* pShareAction) {
    if (!pShareAction) return;
    
    ZoomVideoSDKShareStatus status = pShareAction->getShareStatus();
    
    if (status == ZoomVideoSDKShareStatus_Start || 
        status == ZoomVideoSDKShareStatus_Resume) {
        // Subscribe to the share using Canvas API
        IZoomVideoSDKCanvas* shareCanvas = pShareAction->getShareCanvas();
        if (shareCanvas) {
            shareCanvas->subscribeWithView(shareWindow_, 
                ZoomVideoSDKVideoAspect_Original);
        }
    }
    else if (status == ZoomVideoSDKShareStatus_Stop) {
        // Unsubscribe when share stops
        IZoomVideoSDKCanvas* shareCanvas = pShareAction->getShareCanvas();
        if (shareCanvas) {
            shareCanvas->unSubscribeWithView(shareWindow_);
        }
    }
}

Why is share different from video?

  • Video: Each user has one video stream → use user->GetVideoCanvas()
  • Share: A user can have multiple share actions (multi-share) → use IZoomVideoSDKShareAction* from callback
  • The IZoomVideoSDKShareAction object represents a specific share stream and contains the share status, type, and rendering interfaces

See also: Screen Share Subscription Example

Multi-User Video Layout

For multiple participants, you need one HWND per user:

// Create separate windows/panels for each user
HWND selfVideoWindow = CreateWindow(...);   // Your video
HWND user1Window = CreateWindow(...);       // User 1's video
HWND user2Window = CreateWindow(...);       // User 2's video

// Subscribe each user to their own window
myself->GetVideoCanvas()->subscribeWithView(selfVideoWindow, ...);
user1->GetVideoCanvas()->subscribeWithView(user1Window, ...);
user2->GetVideoCanvas()->subscribeWithView(user2Window, ...);

Layout Strategies:

  • Grid layout (2x2, 3x3)
  • Gallery view (scrollable)
  • Active speaker (large) + thumbnails
  • Picture-in-picture

Common Video Issues

Issue Cause Solution
Video not showing Not calling startVideo() Call videoHelper->startVideo() in onSessionJoin
Artifacts/tearing Using Raw Data Pipe Switch to Canvas API
Poor performance YUV conversion on UI thread Use Canvas API or move conversion to worker thread
Video freezes Not processing Windows messages Add message pump to main loop
Can't see self Subscribing to wrong user Use session->getMyself() for self video
Seeing self in remote list Not excluding self Check if (user != myself) before subscribing

Complete Documentation Library

This skill includes comprehensive guides organized by category:

Core Concepts (Start Here!)

Complete Examples

UI Framework Integration

C++/CLI Wrapper Patterns (Wrapping ANY Native Library)

Troubleshooting

References

Most Critical Issues (From Real Debugging)

  1. Callbacks not firing → Missing Windows message loop (99% of issues)

  2. Video subscribe returns error 2 → Subscribing too early

  3. Abstract class errors → Missing virtual method implementations

Key Insight

Once you learn the 3-step pattern, you can implement ANY feature:

  1. Get singleton → 2. Implement delegate → 3. Subscribe & use

See: SDK Architecture Pattern

Resources


Need help? Start with SKILL.md for complete navigation.

Merged from video-sdk/windows/SKILL.md

Zoom Video SDK Windows - Complete Documentation Index

Quick Start Path

If you're new to the SDK, follow this order:

  1. Overviewwindows.md

  2. Read the architecture patternconcepts/sdk-architecture-pattern.md

    • Universal formula: Singleton → Delegate → Subscribe
    • Once you understand this, you can implement any feature
  3. Fix build errorstroubleshooting/build-errors.md

    • SDK header dependencies
    • Required include order
  4. Implement session joinexamples/session-join-pattern.md

    • Complete working JWT + session join code
  5. Fix callback issuestroubleshooting/windows-message-loop.md

    • CRITICAL: Why callbacks don't fire without Windows message loop
  6. Implement videoexamples/video-rendering.md

    • Canvas API (SDK-rendered) vs Raw Data Pipe
  7. Troubleshoot any issuestroubleshooting/common-issues.md

    • Quick diagnostic checklist
    • Error code tables

Documentation Structure

video-sdk/windows/
├── SKILL.md                           # Main skill overview
├── SKILL.md                           # This file - navigation guide
├── windows.md                          # Secondary overview doc (pointer-style)
│
├── concepts/                          # Core architectural patterns
│   ├── sdk-architecture-pattern.md   # Universal formula for ANY feature
│   ├── singleton-hierarchy.md        # 5-level navigation guide
│   └── canvas-vs-raw-data.md         # SDK-rendered vs self-rendered choice
│
├── examples/                          # Complete working code
│   ├── session-join-pattern.md       # JWT auth + session join
│   ├── video-rendering.md            # Canvas API video display
│   ├── screen-share-subscription.md  # View remote screen shares
│   ├── raw-video-capture.md          # YUV420 raw frame capture
│   ├── raw-audio-capture.md          # PCM audio capture
│   ├── send-raw-video.md             # Virtual camera (inject video)
│   ├── send-raw-audio.md             # Virtual mic (inject audio)
│   ├── cloud-recording.md            # Cloud recording control
│   ├── command-channel.md            # Custom command messaging
│   ├── transcription.md              # Live transcription/captions
│   └── dotnet-winforms/              # UI Framework integration
│       └── README.md                 # Win32, WinForms, WPF patterns
│                                     # C++/CLI wrapper patterns
│                                     # Production quality guidelines
│
├── troubleshooting/                   # Problem solving guides
│   ├── windows-message-loop.md       # CRITICAL - Why callbacks fail
│   ├── build-errors.md               # Header dependency fixes
│   └── common-issues.md              # Quick diagnostic workflow
│
└── references/                        # Reference documentation
    ├── windows-reference.md           # API hierarchy, methods, error codes
    ├── delegate-methods.md            # All 80+ callback methods
    └── samples.md                     # Official samples guide

By Use Case

I want to build a video app

  1. SDK Architecture Pattern - Understand the pattern
  2. Session Join Pattern - Join sessions
  3. Video Rendering - Display video
  4. Windows Message Loop - Fix callback issues

I'm getting build errors

  1. Build Errors Guide - SDK header dependencies
  2. Delegate Methods - Abstract class errors
  3. Common Issues - Linker errors

I'm getting runtime errors

  1. Windows Message Loop - Callbacks not firing
  2. Common Issues - Error code tables

I want to view screen shares

  1. Screen Share Subscription - DIFFERENT from video!
  2. SDK Architecture Pattern - Event-driven pattern
  3. Video Rendering - Compare with video subscription

I want to capture raw video/audio

  1. Canvas vs Raw Data - Choose your approach
  2. Raw Video Capture - YUV420 frame capture
  3. Raw Audio Capture - PCM audio capture
  4. SDK Architecture Pattern - Subscription pattern

I want to send custom video/audio (virtual camera/mic)

  1. Send Raw Video - Inject custom video frames
  2. Send Raw Audio - Inject custom audio
  3. SDK Architecture Pattern - External source pattern

I want to record sessions

  1. Cloud Recording - Start/stop cloud recording
  2. API Reference - Recording helper methods

I want to use live transcription

  1. Transcription - Enable live captions
  2. Delegate Methods - Transcription callbacks

I want custom messaging between participants

  1. Command Channel - Send custom commands
  2. API Reference - Command channel methods

I want to build a Win32 native app

  1. Win32 Integration - Direct SDK + Canvas API
  2. Video Rendering - Canvas API patterns
  3. Production Guidelines - Best practices

I want to build a WinForms (.NET) app

  1. WinForms Integration - C++/CLI wrapper + Raw Data
  2. C++/CLI Patterns - gcroot, Finalizer, LockBits
  3. Production Guidelines - IDisposable, thread safety

I want to build a WPF (.NET) app

  1. WPF Integration - C++/CLI + BitmapSource
  2. Bitmap Conversion - Freeze(), Dispatcher
  3. Production Guidelines - Performance optimization

I want to use C# / .NET Framework (general)

  1. .NET Integration Overview - Complete C++/CLI wrapper guide
  2. Raw Video Capture - YUV→RGB conversion patterns
  3. Session Join Pattern - SDK initialization flow

I want to wrap ANY native C++ library for .NET

  1. C++/CLI Wrapper Patterns - Complete 8-pattern guide
  2. Pattern 1: Basic Structure - Project setup + class layout
  3. Pattern 3: gcroot Callbacks - Native→Managed events
  4. Pattern 4: IDisposable - Cleanup pattern
  5. Common Errors - Troubleshooting

I want to implement a specific feature

  1. SDK Architecture Pattern - START HERE!
  2. Singleton Hierarchy - Navigate to the feature
  3. API Reference - Method signatures

Most Critical Documents

1. SDK Architecture Pattern (MASTER DOCUMENT)

concepts/sdk-architecture-pattern.md

The universal 3-step pattern:

  1. Get singleton (SDK, helpers, session, users)
  2. Implement delegate (event callbacks)
  3. Subscribe and use

2. Windows Message Loop (MOST COMMON ISSUE)

troubleshooting/windows-message-loop.md

99% of "callbacks not firing" issues are caused by missing Windows message loop.

3. Singleton Hierarchy (NAVIGATION MAP)

concepts/singleton-hierarchy.md

5-level deep navigation showing how to reach every feature.


Key Learnings

Critical Discoveries:

  1. Windows Message Loop is MANDATORY

  2. Subscribe in onUserVideoStatusChanged, NOT onUserJoin

    • Video may not be ready when user joins
    • Wait for video status change callback
    • See: Video Rendering
  3. Two Rendering Paths

    • Canvas API: SDK renders to your HWND (recommended)
    • Raw Data Pipe: You receive YUV frames (advanced)
    • See: Canvas vs Raw Data
  4. Helpers Control YOUR Streams Only

    • videoHelper->startVideo() starts YOUR camera
    • To see others, subscribe to their Canvas/Pipe
    • See: Singleton Hierarchy
  5. UI Framework Integration Differs by Platform

    • Win32: Direct SDK, Canvas API (SDK renders to HWND) - best performance
    • WinForms: C++/CLI wrapper, Raw Data Pipe, YUV→Bitmap, InvokeRequired
    • WPF: Same wrapper + Bitmap→BitmapSource, Dispatcher, Freeze()
    • See: UI Framework Integration
  6. C++/CLI Wrapper Patterns (for ANY native library → .NET)

    • void* pointers - hide native types from managed headers
    • gcroot<T^> - prevent GC from collecting managed references in native code
    • Finalizer + Destructor - ~Class() and !Class() for IDisposable cleanup
    • pin_ptr + Marshal::Copy - array/buffer conversion
    • LockBits - 100x faster than SetPixel for image manipulation
    • Thread marshaling - InvokeRequired (WinForms) / Dispatcher (WPF)
    • See: C++/CLI Wrapper Guide
  7. Audio Connection Timing

    • Set audioOption.connect = false during join
    • Call startAudio() in onSessionJoin callback
    • See: Production Guidelines

Quick Reference

"My code won't compile"

Build Errors Guide

"Callbacks never fire"

Windows Message Loop

"Video subscription returns error 2"

Video Rendering - Subscribe in onUserVideoStatusChanged

"Abstract class error"

Delegate Methods

"How do I implement [feature]?"

SDK Architecture Pattern

"How do I navigate to [controller]?"

Singleton Hierarchy

"What error code means what?"

Common Issues


Document Version

Based on Zoom Video SDK for Windows v2.x


Happy coding!

Remember: The SDK Architecture Pattern is your key to unlocking the entire SDK. Read it first!

Operations

  • RUNBOOK.md - 5-minute preflight and debugging checklist.
用于在Android应用中通过WebView集成Zoom Virtual Agent,处理Java/Kotlin桥接回调、原生URL路由、支持交接及生命周期安全嵌入。
需要在Android WebView中加载Zoom虚拟代理页面 需要配置JS桥接以处理退出、通用命令或客服交接回调 需要管理WebView中的URL拦截与多窗口行为
partner-built/zoom-plugin/skills/virtual-agent/android/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill virtual-agent/android -g -y
SKILL.md
Frontmatter
{
    "name": "virtual-agent\/android",
    "triggers": [
        "virtual agent android",
        "android webview zva",
        "zoomCampaignSdk:ready android",
        "support_handoff android",
        "javascriptinterface"
    ],
    "description": "Zoom Virtual Agent Android integration via WebView. Use for Java\/Kotlin bridge callbacks, native URL handling, support_handoff relay, and lifecycle-safe embedding.",
    "user-invocable": false
}

Zoom Virtual Agent - Android

Official docs:

Quick Links

  1. concepts/webview-lifecycle.md
  2. examples/js-bridge-patterns.md
  3. references/android-reference-map.md
  4. troubleshooting/common-issues.md

Integration Model

  • Host campaign URL in Android WebView.
  • Inject runtime context (window.zoomCampaignSdkConfig).
  • Register JavaScript bridge for exitHandler, commonHandler, support_handoff.
  • Apply URL policy via shouldOverrideUrlLoading and optional multi-window callbacks.

Hard Guardrails

  • Initialize handlers before expecting JS callbacks.
  • Treat legacy openURL command handling as compatibility path only.
  • Prefer DOM links or window.open handling plus explicit native routing.

Chaining

用于在 iOS 应用中通过 WKWebView 集成 Zoom Virtual Agent。支持 Swift/Objective-C 脚本注入、消息处理、会话移交及 URL 路由策略,确保符合安全规范并兼容 iOS 14.5+。
需要在 iOS App 中嵌入 Zoom 虚拟代理界面 实现原生代码与 WebView 的 JS Bridge 通信 配置 Zoom 会话的退出或移交逻辑 处理 WebView 内的 URL 导航和下载行为
partner-built/zoom-plugin/skills/virtual-agent/ios/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill virtual-agent/ios -g -y
SKILL.md
Frontmatter
{
    "name": "virtual-agent\/ios",
    "triggers": [
        "virtual agent ios",
        "wkwebview zva",
        "support_handoff ios",
        "zoomCampaignSdk:ready ios",
        "wkusercontentcontroller"
    ],
    "description": "Zoom Virtual Agent iOS integration via WKWebView. Use for Swift\/Objective-C script injection, message handlers, support_handoff relay, and URL routing policies.",
    "user-invocable": false
}

Zoom Virtual Agent - iOS

Official docs:

Quick Links

  1. concepts/webview-lifecycle.md
  2. examples/js-bridge-patterns.md
  3. references/ios-reference-map.md
  4. troubleshooting/common-issues.md

Integration Model

  • Load campaign URL in WKWebView.
  • Inject window.zoomCampaignSdkConfig using WKUserScript.
  • Register message handlers for exit/common/handoff flows.
  • Handle URL behavior in navigation delegates (in-app, SFSafariViewController, or system browser).

Hard Guardrails

  • Register scripts and handlers before web interaction.
  • Handle iOS 14.5+ download behavior where needed.
  • Keep deprecated openURL command support as fallback only.

Chaining

Zoom虚拟代理开发参考技能,涵盖Web嵌入、Android/iOS WebView集成、知识库同步及生命周期管理。提供路由守卫、快速链接、常见生命周期模式及高级场景指南,辅助实现聊天功能与故障排查。
实现网站聊天嵌入或营销活动 在Android或iOS应用中集成WebView聊天 配置知识库同步或自定义API接入 处理虚拟代理的生命周期或调试问题
partner-built/zoom-plugin/skills/virtual-agent/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill build-zoom-virtual-agent -g -y
SKILL.md
Frontmatter
{
    "name": "build-zoom-virtual-agent",
    "triggers": [
        "virtual agent",
        "zva",
        "virtual assistant sdk",
        "knowledge base sync"
    ],
    "description": "Reference skill for Zoom Virtual Agent. Use after routing to a virtual-agent workflow when implementing web embeds, Android or iOS wrapper integrations, knowledge-base sync, lifecycle handling, or troubleshooting."
}

/build-zoom-virtual-agent

Background reference for Zoom Virtual Agent across:

  • Web campaign/chat embeds.
  • Android WebView wrappers.
  • iOS WKWebView wrappers.
  • Knowledge-base sync and custom API ingestion.

Official docs:

Routing Guardrail

Quick Links

  1. concepts/architecture-and-lifecycle.md
  2. scenarios/high-level-scenarios.md
  3. references/versioning-and-drift.md
  4. references/samples-validation.md
  5. references/environment-variables.md
  6. troubleshooting/common-drift-and-breaks.md
  7. RUNBOOK.md

Platform skills:

Common Lifecycle Pattern

  1. Configure campaign or entry ID in Virtual Agent admin.
  2. Initialize SDK in web or WebView container.
  3. Wait for readiness (zoomCampaignSdk:ready or waitForReady()) before calling APIs.
  4. Register bridge handlers (exitHandler, commonHandler, support_handoff) when native orchestration is needed.
  5. Handle conversation lifecycle (engagement_started, engagement_ended) and UI state.
  6. End chat (endChat) and clean up listeners.

High-Level Scenarios

  • Website campaign launcher with contextual customer attributes.
  • Mobile app WebView chat with native close/handoff bridge.
  • External URL handling via system browser vs in-app browser policy.
  • Knowledge-base sync from external systems using custom API connector.
  • Cross-team support flow that escalates from bot to live support with handoff payload.

Chaining

Operations

  • RUNBOOK.md - 5-minute preflight and debugging checklist.
Zoom虚拟助手Web SDK,用于网页嵌入。支持通过活动ID或入口ID启动聊天、事件驱动控制、用户上下文更新及CSP安全部署。需确保SDK就绪后调用接口,并遵循生命周期与事件规范。
需要在网页中嵌入Zoom虚拟助手 使用活动ID或入口ID启动聊天会话 处理虚拟助手的事件驱动控制 更新用户上下文信息 配置CSP安全的部署环境
partner-built/zoom-plugin/skills/virtual-agent/web/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill virtual-agent/web -g -y
SKILL.md
Frontmatter
{
    "name": "virtual-agent\/web",
    "triggers": [
        "virtual agent web",
        "zoomCampaignSdk",
        "zcc-sdk",
        "campaign embed",
        "entry id",
        "waitForReady",
        "engagement_started"
    ],
    "description": "Zoom Virtual Agent SDK for web embeds. Use for campaign or entry ID chat launch, event-driven controls, user context updates, and CSP-safe deployment.",
    "user-invocable": false
}

Zoom Virtual Agent SDK - Web

Official docs:

Quick Links

  1. concepts/lifecycle-and-events.md
  2. examples/campaign-and-entry-patterns.md
  3. references/web-reference-map.md
  4. troubleshooting/common-issues.md

Hard Guardrails

  • Gate calls behind readiness (zoomCampaignSdk:ready or waitForReady()).
  • Do not call show/hide/open/close before SDK initialization.
  • Keep CSP and script host policy validated before debugging business logic.
  • Prefer campaign embed over entry ID when minimizing user friction is a priority.

Chaining

Zoom Webhooks参考技能,用于实现事件订阅、签名验证、交付处理及重试机制。提供Express.js代码示例、常见事件列表、详细API参考及故障排查指南,辅助开发者构建可靠的事件驱动工作流。
需要配置或调试Zoom Webhook端点 实现Webhook签名验证逻辑 查询Zoom事件类型定义 解决Webhook交付或认证问题
partner-built/zoom-plugin/skills/webhooks/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill setup-zoom-webhooks -g -y
SKILL.md
Frontmatter
{
    "name": "setup-zoom-webhooks",
    "triggers": [
        "zoom webhook",
        "webhook signature",
        "x-zm-signature",
        "event subscription",
        "recording completed webhook"
    ],
    "description": "Reference skill for Zoom webhooks. Use after routing to an event-driven workflow when implementing subscriptions, signature verification, delivery handling, retries, or event-type selection."
}

/setup-zoom-webhooks

Background reference for Zoom event delivery over HTTP. Prefer workflow skills first, then use this file for verification, subscription, and delivery details.

Prerequisites

  • Zoom app with Event Subscriptions enabled
  • HTTPS endpoint to receive webhooks
  • Webhook secret token for verification

Need help with authentication? See the zoom-oauth skill for OAuth setup.

Quick Start

// Express.js webhook handler
const crypto = require('crypto');

// Capture raw body for signature verification (avoid re-serializing JSON).
app.use(require('express').json({
  verify: (req, _res, buf) => { req.rawBody = buf; }
}));

app.post('/webhook', (req, res) => {
  // Verify webhook signature
  const signature = req.headers['x-zm-signature'];
  const timestamp = req.headers['x-zm-request-timestamp'];
  const body = req.rawBody ? req.rawBody.toString('utf8') : JSON.stringify(req.body);
  const payload = `v0:${timestamp}:${body}`;
  const hash = crypto.createHmac('sha256', WEBHOOK_SECRET)
    .update(payload).digest('hex');
  
  if (signature !== `v0=${hash}`) {
    return res.status(401).send('Invalid signature');
  }

  // Handle event
  const { event, payload } = req.body;
  console.log(`Received: ${event}`);
  
  res.status(200).send();
});

Common Events

Event Description
meeting.started Meeting has started
meeting.ended Meeting has ended
meeting.participant_joined Participant joined meeting
recording.completed Cloud recording ready
user.created New user added

Detailed References

Troubleshooting

Sample Repositories

Official (by Zoom)

Type Repository Stars
Node.js webhook-sample 34
PostgreSQL webhook-to-postgres 5
Go/Fiber Go-Webhooks -
Header Auth zoom-webhook-verification-headers -

Community

Language Repository Description
Laravel binary-cats/laravel-webhooks Laravel webhook handler
AWS Lambda splunk/zoom-webhook-to-hec Serverless to Splunk HEC
Node.js Will4950/zoom-webhook-listener Webhook forwarder
Express+Redis ojusave/eventSubscriptionPlayground Socket.io + Redis

Multi-Language Samples (by tanchunsiong)

Language Repository
Node.js Zoom-Webhook-Signature-OAuth-and-REST-API-Development-Sample-In-NodeJS
C# Zoom-Webhook-Signature-OAuth-and-REST-API-Development-Sample-In-ASP.NET-Core-C-
Java Zoom-Webhook-Signature-OAuth-and-REST-API-Development-Sample-In-Java-Spring-Boot
Python Zoom-Webhook-Signature-OAuth-and-REST-API-Development-Sample-In-Python
PHP Zoom-Webhook-Signature-OAuth-and-REST-API-Development-Sample-In-PHP

Full list: See general/references/community-repos.md

Resources

Environment Variables

Zoom WebSockets配置指南,对比Webhooks优势,适用于低延迟、高安全或需双向通信场景。涵盖OAuth应用创建、WebSocket订阅启用及连接代码示例。
需要比Webhooks更低的延迟 对安全性有极高要求 不希望暴露公共端点 需要双向实时通信
partner-built/zoom-plugin/skills/websockets/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill setup-zoom-websockets -g -y
SKILL.md
Frontmatter
{
    "name": "setup-zoom-websockets",
    "triggers": [
        "zoom websockets",
        "websocket event subscription",
        "persistent zoom events",
        "low latency zoom events",
        "zoom websocket connection"
    ],
    "description": "Reference skill for Zoom WebSockets. Use after routing to a low-latency event workflow when persistent connections, faster event delivery, or security constraints make WebSockets preferable to webhooks."
}

/setup-zoom-websockets

Background reference for persistent Zoom event streams. Prefer workflow routing first, then use this file when WebSockets are plausibly better than webhooks.

WebSockets vs Webhooks

Aspect WebSockets Webhooks
Connection Persistent, bidirectional One-time HTTP POST
Latency Lower (no HTTP overhead) Higher (new connection per event)
Security Direct connection, no exposed endpoint Requires endpoint validation, IP whitelisting
Model Pull (you connect to Zoom) Push (Zoom connects to you)
State Stateful (maintains connection) Stateless (each event independent)
Setup More complex (access token, connection) Simpler (just endpoint URL)

Choose WebSockets when:

  • Real-time, low-latency updates are critical
  • Security is paramount (banking, healthcare, finance)
  • You don't want to expose a public endpoint
  • You need bidirectional communication

Choose Webhooks when:

  • Simpler setup is preferred
  • Small number of event notifications
  • Existing HTTP infrastructure

Prerequisites

  • Server-to-Server OAuth app in Zoom Marketplace
  • Account ID, Client ID, and Client Secret
  • WebSocket subscription with events enabled

Need help with S2S OAuth? See the zoom-oauth skill for complete authentication flows.

Start troubleshooting fast: Use the 5-Minute Runbook before deep debugging.

Quick Start

1. Create Server-to-Server OAuth App

  1. Go to Zoom Marketplace
  2. Create a Server-to-Server OAuth app
  3. Copy Account ID, Client ID, Client Secret

2. Enable WebSocket Subscription

  1. In your app, go to FeatureEvent Subscriptions
  2. Add an Event Subscription
  3. Select WebSockets as the method type
  4. Select events to subscribe to (e.g., meeting.created, meeting.started)
  5. Save - an endpoint URL will be generated

3. Connect via WebSocket

const WebSocket = require('ws');
const axios = require('axios');

// Step 1: Get access token
async function getAccessToken() {
  const credentials = Buffer.from(`${CLIENT_ID}:${CLIENT_SECRET}`).toString('base64');
  
  const response = await axios.post(
    'https://zoom.us/oauth/token',
    new URLSearchParams({
      grant_type: 'account_credentials',
      account_id: ACCOUNT_ID
    }),
    {
      headers: {
        'Authorization': `Basic ${credentials}`,
        'Content-Type': 'application/x-www-form-urlencoded'
      }
    }
  );
  
  return response.data.access_token;
}

// Step 2: Connect to WebSocket
async function connectWebSocket() {
  const accessToken = await getAccessToken();
  
  // WebSocket URL from your subscription settings
  const wsUrl = `wss://ws.zoom.us/ws?subscriptionId=${SUBSCRIPTION_ID}&access_token=${accessToken}`;
  
  const ws = new WebSocket(wsUrl);
  
  ws.on('open', () => {
    console.log('WebSocket connection established');
  });
  
  ws.on('message', (data) => {
    const event = JSON.parse(data);
    console.log('Event received:', event.event);
    
    // Handle different event types
    switch (event.event) {
      case 'meeting.started':
        console.log(`Meeting started: ${event.payload.object.topic}`);
        break;
      case 'meeting.ended':
        console.log(`Meeting ended: ${event.payload.object.uuid}`);
        break;
      case 'meeting.participant_joined':
        console.log(`Participant joined: ${event.payload.object.participant.user_name}`);
        break;
    }
  });
  
  ws.on('close', (code, reason) => {
    console.log(`Connection closed: ${code} - ${reason}`);
    // Implement reconnection logic
  });
  
  ws.on('error', (error) => {
    console.error('WebSocket error:', error);
  });
  
  return ws;
}

connectWebSocket();

Event Format

Events received via WebSocket have the same format as webhook events:

{
  "event": "meeting.started",
  "event_ts": 1706123456789,
  "payload": {
    "account_id": "abcD3ojkdbjfg",
    "object": {
      "id": 1234567890,
      "uuid": "abcdefgh-1234-5678-abcd-1234567890ab",
      "host_id": "xyz789",
      "topic": "Team Standup",
      "type": 2,
      "start_time": "2024-01-25T10:00:00Z",
      "timezone": "America/Los_Angeles"
    }
  }
}

Common Events

Event Description
meeting.created Meeting scheduled
meeting.updated Meeting settings changed
meeting.deleted Meeting deleted
meeting.started Meeting begins
meeting.ended Meeting ends
meeting.participant_joined Participant joins meeting
meeting.participant_left Participant leaves meeting
recording.completed Cloud recording ready
user.created New user added
user.updated User details changed

Connection Management

Keep-Alive

WebSocket connections require periodic heartbeats. Zoom will close idle connections.

// Send ping every 30 seconds
setInterval(() => {
  if (ws.readyState === WebSocket.OPEN) {
    ws.ping();
  }
}, 30000);

Reconnection

Implement automatic reconnection for reliability:

function connectWithReconnect() {
  const ws = connectWebSocket();
  
  ws.on('close', () => {
    console.log('Connection lost. Reconnecting in 5 seconds...');
    setTimeout(connectWithReconnect, 5000);
  });
  
  return ws;
}

Single Connection Limit

Important: Only ONE WebSocket connection can be open per subscription at a time. Opening a new connection will close the existing one.

Detailed References

Troubleshooting

Sample Repositories

Official / Community

Type Repository Description
Node.js just-zoomit/zoom-websockets WebSocket sample with S2S OAuth

WebSockets vs RTMS

Don't confuse WebSockets with RTMS (Realtime Media Streams):

Feature WebSockets RTMS
Purpose Event notifications Media streams
Data Meeting events, user events Audio, video, transcripts
Use case React to Zoom events AI/ML, live transcription
Skill This skill rtms

For real-time audio/video/transcript data, use the rtms skill instead.

Resources

Environment Variables

Zoom Apps SDK参考技能,用于构建运行在Zoom客户端内的Web应用。提供架构、快速入门、上下文、OAuth及API等文档链接,辅助开发者解决加载、调试及版本迁移问题。
开发Zoom客户端内嵌Web应用 查询Zoom Apps SDK API或事件 配置In-Client OAuth认证 排查Zoom应用加载或SDK错误
partner-built/zoom-plugin/skills/zoom-apps-sdk/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill zoom-apps-sdk -g -y
SKILL.md
Frontmatter
{
    "name": "zoom-apps-sdk",
    "triggers": [
        "zoom app",
        "in-meeting app",
        "app inside zoom",
        "zoom client app",
        "layers api",
        "immersive mode",
        "camera mode",
        "collaborate mode",
        "appssdk",
        "in-client oauth",
        "zoom mail",
        "domain allowlist",
        "domain whitelist",
        "url whitelisting",
        "blank panel",
        "runningContext",
        "zoomSdk"
    ],
    "description": "Reference skill for Zoom Apps SDK. Use after routing to an in-client app workflow when building web apps that run inside Zoom meetings, webinars, the main client, or Zoom Phone.",
    "user-invocable": false
}

Zoom Apps SDK

Background reference for web apps that run inside the Zoom client. Prefer choose-zoom-approach first, then route here for Layers API, Collaborate Mode, in-client OAuth, and runtime constraints.

Zoom Apps SDK

Build web apps that run inside the Zoom client - meetings, webinars, main client, and Zoom Phone.

Official Documentation: https://developers.zoom.us/docs/zoom-apps/ SDK Reference: https://appssdk.zoom.us/ NPM Package: https://www.npmjs.com/package/@zoom/appssdk

Quick Links

New to Zoom Apps? Follow this path:

  1. Architecture - Frontend/backend pattern, embedded browser, deep linking
  2. Quick Start - Complete working Express + SDK app
  3. Running Contexts - Where your app runs (inMeeting, inMainClient, etc.)
  4. Zoom Apps vs Meeting SDK - Stop mixing app types
  5. In-Client OAuth - Seamless authorization with PKCE
  6. API Reference - 100+ SDK methods
  7. Integrated Index - see the section below in this file
  8. 5-Minute Runbook - Preflight checks before deep debugging

Reference:

Having issues?

Building immersive experiences?

Need help with OAuth? See the zoom-oauth skill for authentication flows.

SDK Overview

The Zoom Apps SDK (@zoom/appssdk) provides JavaScript APIs for web apps running in Zoom's embedded browser:

  • Context APIs - Get meeting, user, and participant info
  • Meeting Actions - Share app, invite participants, open URLs
  • Authorization - In-Client OAuth with PKCE (no browser redirect)
  • Layers API - Immersive video layouts and camera mode overlays
  • Collaborate Mode - Shared app state across participants
  • App Communication - Message passing between app instances (main client <-> meeting)
  • Media Controls - Virtual backgrounds, camera listing, recording control
  • UI Controls - Expand app, notifications, popout
  • Events - React to meeting state, participants, sharing, and more

Prerequisites

  • Zoom app configured as "Zoom App" type in Marketplace
  • OAuth credentials (Client ID + Secret) with Zoom Apps scopes
  • Web application (Node.js + Express recommended)
  • Your domain whitelisted in Marketplace domain allowlist
  • ngrok or HTTPS tunnel for local development
  • Node.js 18+ (for the backend server)

Quick Start

Option A: NPM (Recommended for frameworks)

npm install @zoom/appssdk
import zoomSdk from '@zoom/appssdk';

async function init() {
  try {
    const configResponse = await zoomSdk.config({
      capabilities: [
        'shareApp',
        'getMeetingContext',
        'getUserContext',
        'openUrl'
      ],
      version: '0.16'
    });

    console.log('Running context:', configResponse.runningContext);
    // 'inMeeting' | 'inMainClient' | 'inWebinar' | 'inImmersive' | ...

    const context = await zoomSdk.getMeetingContext();
    console.log('Meeting ID:', context.meetingID);
  } catch (error) {
    console.error('Not running inside Zoom:', error.message);
    showDemoMode();
  }
}

Option B: CDN (Vanilla JS)

<script src="https://appssdk.zoom.us/sdk.js"></script>

<script>
// CRITICAL: Do NOT declare "let zoomSdk" - the SDK defines window.zoomSdk globally
// Using "let zoomSdk = ..." causes: SyntaxError: redeclaration of non-configurable global property
let sdk = window.zoomSdk;  // Use a different variable name

async function init() {
  try {
    const configResponse = await sdk.config({
      capabilities: ['shareApp', 'getMeetingContext', 'getUserContext'],
      version: '0.16'
    });

    console.log('Running context:', configResponse.runningContext);
  } catch (error) {
    console.error('Not running inside Zoom:', error.message);
    showDemoMode();
  }
}

function showDemoMode() {
  document.body.innerHTML = '<h1>Preview Mode</h1><p>Open this app inside Zoom to use.</p>';
}

document.addEventListener('DOMContentLoaded', () => {
  init();
  setTimeout(() => { if (!sdk) showDemoMode(); }, 3000);
});
</script>

Critical: Global Variable Conflict

The CDN script defines window.zoomSdk globally. Do NOT redeclare it:

// WRONG - causes SyntaxError in Zoom's embedded browser
let zoomSdk = null;
zoomSdk = window.zoomSdk;

// CORRECT - use different variable name
let sdk = window.zoomSdk;

// ALSO CORRECT - NPM import (no conflict)
import zoomSdk from '@zoom/appssdk';

This only applies to the CDN approach. The NPM import creates a module-scoped variable, no conflict.

Browser Preview / Demo Mode

The SDK only functions inside the Zoom client. When accessed in a regular browser:

  • window.zoomSdk exists but sdk.config() throws an error
  • Always implement try/catch with fallback UI
  • Add timeout (3 seconds) in case SDK hangs

URL Whitelisting (Required)

Your app will NOT load in Zoom unless the domain is whitelisted.

  1. Go to Zoom Marketplace
  2. Open your app -> Feature tab
  3. Under Zoom App, find Add Allow List
  4. Add your domain (e.g., yourdomain.com for production, xxxxx.ngrok.io for dev)

Without this, the Zoom client shows a blank panel with no error message.

OAuth Scopes (Required)

Capabilities require matching OAuth scopes enabled in Marketplace:

Capability Required Scope
getMeetingContext zoomapp:inmeeting
getUserContext zoomapp:inmeeting
shareApp zoomapp:inmeeting
openUrl zoomapp:inmeeting
sendAppInvitation zoomapp:inmeeting
runRenderingContext zoomapp:inmeeting
authorize zoomapp:inmeeting
getMeetingParticipants zoomapp:inmeeting

To add scopes: Marketplace -> Your App -> Scopes tab -> Add required scopes.

Missing scopes = capability fails silently or throws error. Users must re-authorize if you add new scopes.

Running Contexts

Your app runs in different surfaces within Zoom. The configResponse.runningContext tells you where:

Context Surface Description
inMeeting Meeting sidebar Most common. Full meeting APIs available
inMainClient Main client panel Home tab. No meeting context APIs
inWebinar Webinar sidebar Host/panelist. Meeting + webinar APIs
inImmersive Layers API Full-screen custom rendering
inCamera Camera mode Virtual camera overlay
inCollaborate Collaborate mode Shared state context
inPhone Zoom Phone Phone call app
inChat Team Chat Chat sidebar

See Running Contexts for context-specific behavior and APIs.

SDK Initialization Pattern

Every Zoom App starts with config():

import zoomSdk from '@zoom/appssdk';

const configResponse = await zoomSdk.config({
  capabilities: [
    // List ALL APIs you will use
    'getMeetingContext',
    'getUserContext',
    'shareApp',
    'openUrl',
    'authorize',
    'onAuthorized'
  ],
  version: '0.16'
});

// configResponse contains:
// {
//   runningContext: 'inMeeting',
//   clientVersion: '5.x.x',
//   unsupportedApis: []  // APIs not supported in this client version
// }

Rules:

  1. config() MUST be called before any other SDK method
  2. Only capabilities listed in config() are available
  3. Capabilities must match OAuth scopes in Marketplace
  4. Check unsupportedApis for graceful degradation

In-Client OAuth (Summary)

Best UX for authorization - no browser redirect:

// 1. Get code challenge from your backend
const { codeChallenge, state } = await fetch('/api/auth/challenge').then(r => r.json());

// 2. Trigger in-client authorization
await zoomSdk.authorize({ codeChallenge, state });

// 3. Listen for authorization result
zoomSdk.addEventListener('onAuthorized', async (event) => {
  const { code, state } = event;
  // 4. Send code to backend for token exchange
  await fetch('/api/auth/token', {
    method: 'POST',
    body: JSON.stringify({ code, state })
  });
});

See In-Client OAuth Guide for complete implementation.

Layers API (Summary)

Build immersive video layouts and camera overlays:

// Start immersive mode - replaces gallery view
await zoomSdk.runRenderingContext({ view: 'immersive' });

// Position participant video feeds
await zoomSdk.drawParticipant({
  participantUUID: 'user-uuid',
  x: 0, y: 0, width: 640, height: 480, zIndex: 1
});

// Add overlay images
await zoomSdk.drawImage({
  imageData: canvas.toDataURL(),
  x: 0, y: 0, width: 1280, height: 720, zIndex: 0
});

// Exit immersive mode
await zoomSdk.closeRenderingContext();

See Layers Immersive and Camera Mode.

Environment Variables

Variable Description Where to Find
ZOOM_APP_CLIENT_ID App client ID Marketplace -> App -> App Credentials
ZOOM_APP_CLIENT_SECRET App client secret Marketplace -> App -> App Credentials
ZOOM_APP_REDIRECT_URI OAuth redirect URL Your server URL + /auth
SESSION_SECRET Cookie signing secret Generate random string
ZOOM_HOST Zoom host URL https://zoom.us (or https://zoomgov.com)

Common APIs

API Description
config() Initialize SDK, request capabilities
getMeetingContext() Get meeting ID, topic, status
getUserContext() Get user name, role, participant ID
getRunningContext() Get current running context
getMeetingParticipants() List participants
shareApp() Share app screen with participants
openUrl({ url }) Open URL in external browser
sendAppInvitation() Invite users to open your app
authorize() Trigger In-Client OAuth
connect() Connect to other app instances
postMessage() Send message to connected instances
runRenderingContext() Start Layers API (immersive/camera)
expandApp({ action }) Expand/collapse app panel
showNotification() Show notification in Zoom

Complete Documentation Library

Core Concepts

  • Architecture - Frontend/backend pattern, embedded browser, deep linking, X-Zoom-App-Context
  • Running Contexts - All contexts, context-specific APIs, multi-instance communication
  • Security - OWASP headers, CSP, cookie security, PKCE, token storage

Complete Examples

Troubleshooting

References

Sample Repositories

Official (by Zoom)

Repository Type Last Updated Status SDK Version
zoomapps-sample-js Hello World (Vanilla JS) Dec 2025 Active ^0.16.26
zoomapps-advancedsample-react Advanced (React + Redis) Oct 2025 Active 0.16.0
zoomapps-customlayout-js Layers API Nov 2023 Stale ^0.16.8
zoomapps-texteditor-vuejs Collaborate (Vue + Y.js) Oct 2023 Stale ^0.16.7
zoomapps-serverless-vuejs Serverless (Firebase) Aug 2024 Stale ^0.16.21
zoomapps-cameramode-vuejs Camera Mode - - -
zoomapps-workshop-sample Workshop - - -

Recommended for new projects: Use @zoom/appssdk version ^0.16.26.

Community

Type Repository Description
Library harvard-edtech/zaccl Zoom App Complete Connection Library

Full list: See general/references/community-repos.md

Learning Path

  1. Start: zoomapps-sample-js - Simplest, most up-to-date
  2. Advanced: zoomapps-advancedsample-react - Comprehensive (In-Client OAuth, Guest Mode, Collaborate)
  3. Specialized: Pick based on feature (Layers, Serverless, Camera Mode)

Critical Gotchas (From Real Development)

1. Global Variable Conflict

The CDN script defines window.zoomSdk. Declaring let zoomSdk in your code causes SyntaxError: redeclaration of non-configurable global property. Use let sdk = window.zoomSdk or the NPM import.

2. Domain Allowlist

Your app URL must be in the Marketplace domain allowlist. Without it, Zoom shows a blank panel with no error. Also add appssdk.zoom.us and any CDN domains you use.

3. Capabilities Must Be Listed

Only APIs listed in config({ capabilities: [...] }) are available. Calling an unlisted API throws an error. This is also true for event listeners.

4. SDK Only Works Inside Zoom

zoomSdk.config() throws outside the Zoom client. Always wrap in try/catch with browser fallback:

try { await zoomSdk.config({...}); } catch { showBrowserPreview(); }

5. ngrok URL Changes

Free ngrok URLs change on restart. You must update 4 places in Marketplace: Home URL, Redirect URL, OAuth Allow List, Domain Allow List. Consider ngrok paid plan for stable subdomain.

6. In-Client OAuth vs Web OAuth

Use zoomSdk.authorize() (In-Client) for best UX - no browser redirect. Only fall back to web redirect for initial install from Marketplace.

7. Camera Mode CEF Race Condition

Camera mode uses CEF which takes time to initialize. drawImage/drawWebView may fail if called too early. Implement retry with exponential backoff.

8. Cookie Configuration

Zoom's embedded browser requires cookies with SameSite=None and Secure=true. Without this, sessions break silently.

9. State Validation

Always validate the OAuth state parameter to prevent CSRF attacks. Generate cryptographically random state, store it, and verify on callback.

Resources


Need help? Start with Integrated Index section below for complete navigation.


Integrated Index

This section was migrated from SKILL.md.

Quick Start Path

If you're new to Zoom Apps, follow this order:

  1. Run preflight checks first -> RUNBOOK.md

  2. Read the architecture -> concepts/architecture.md

    • Frontend/backend pattern, embedded browser, deep linking
    • Understand how Zoom loads and communicates with your app
  3. Build your first app -> examples/quick-start.md

    • Complete Express + SDK Hello World
    • ngrok setup for local development
  4. Understand running contexts -> concepts/running-contexts.md

    • Where your app runs (inMeeting, inMainClient, inWebinar, etc.)
    • Context-specific APIs and limitations
  5. Implement OAuth -> examples/in-client-oauth.md

    • In-Client OAuth with PKCE (best UX)
    • Token exchange and storage
  6. Add features -> references/apis.md

    • 100+ SDK methods organized by category
    • Code examples for each
  7. Troubleshoot -> troubleshooting/common-issues.md

    • Quick diagnostics for common problems

Documentation Structure

zoom-apps-sdk/
├── SKILL.md                           # Main skill overview
├── SKILL.md                           # This file - navigation guide
│
├── concepts/                          # Core architectural patterns
│   ├── architecture.md               # Frontend/backend, embedded browser, OAuth flow
│   ├── running-contexts.md           # Where your app runs + context-specific APIs
│   └── security.md                   # OWASP headers, CSP, data access layers
│
├── examples/                          # Complete working code
│   ├── quick-start.md                # Hello World - minimal Express + SDK app
│   ├── in-client-oauth.md            # In-Client OAuth with PKCE
│   ├── layers-immersive.md           # Layers API - immersive mode (custom layouts)
│   ├── layers-camera.md              # Layers API - camera mode (virtual camera)
│   ├── collaborate-mode.md           # Collaborate mode (shared state)
│   ├── guest-mode.md                 # Guest mode (unauthenticated -> authorized)
│   ├── breakout-rooms.md             # Breakout room integration
│   └── app-communication.md          # connect + postMessage between instances
│
├── troubleshooting/                   # Problem solving guides
│   ├── common-issues.md              # Quick diagnostics, error codes
│   ├── debugging.md                  # Local dev setup, ngrok, browser preview
│   └── migration.md                  # SDK version migration notes
│
└── references/                        # Reference documentation
    ├── apis.md                        # Complete API reference (100+ methods)
    ├── events.md                      # All SDK events
    ├── layers-api.md                  # Layers API detailed reference
    ├── oauth.md                       # OAuth flows for Zoom Apps
    └── zmail-sdk.md                   # Zoom Mail integration

By Use Case

I want to build a basic Zoom App

  1. Architecture - Understand the pattern
  2. Quick Start - Build Hello World
  3. In-Client OAuth - Add authorization
  4. Security - Required headers

I want immersive video layouts (Layers API)

  1. Layers Immersive - Custom video positions
  2. Layers API Reference - All drawing methods
  3. App Communication - Sync layout across participants

I want a virtual camera overlay

  1. Camera Mode - Camera mode rendering
  2. Layers API Reference - Drawing methods

I want real-time collaboration

  1. Collaborate Mode - Shared state APIs
  2. App Communication - Instance messaging

I want guest/anonymous access

  1. Guest Mode - Three authorization states
  2. In-Client OAuth - promptAuthorize flow

I want breakout room support

  1. Breakout Rooms - Room detection and state sync

I want to sync between main client and meeting

  1. App Communication - connect + postMessage
  2. Running Contexts - Multi-instance behavior

I want serverless deployment

  1. Quick Start - Understand the base pattern first
  2. Sample: zoomapps-serverless-vuejs - Firebase pattern

I want to add Zoom Mail integration

  1. Zoom Mail Reference - REST API + mail plugins

I'm getting errors

  1. Common Issues - Quick diagnostic table
  2. Debugging - Local dev setup, DevTools
  3. Migration - Version compatibility

Most Critical Documents

1. Architecture (FOUNDATION)

concepts/architecture.md

Understand how Zoom Apps work: Frontend in embedded browser, backend for OAuth/API, SDK as the bridge. Without this, nothing else makes sense.

2. Quick Start (FIRST APP)

examples/quick-start.md

Complete working code. Get something running before diving into advanced features.

3. Common Issues (MOST COMMON PROBLEMS)

troubleshooting/common-issues.md

90% of Zoom Apps issues are: domain allowlist, global variable conflict, or missing capabilities.


Key Learnings

Critical Discoveries:

  1. Global Variable Conflict is the #1 Gotcha

    • CDN script defines window.zoomSdk globally
    • let zoomSdk = ... causes SyntaxError in Zoom's browser
    • Use let sdk = window.zoomSdk or NPM import
  2. Domain Allowlist is Non-Negotiable

    • App shows blank panel with zero error if domain not whitelisted
    • Must include your domain AND appssdk.zoom.us AND any CDN domains
    • ngrok URLs change on restart - must update Marketplace each time
  3. config() Gates Everything

    • Must be called first, must list all capabilities
    • Unlisted capabilities throw errors
    • Check unsupportedApis for client version compatibility
  4. In-Client OAuth > Web OAuth for UX

    • authorize() keeps user in Zoom (no browser redirect)
    • Web redirect only needed for initial Marketplace install
    • Always implement PKCE (code_verifier + code_challenge)
  5. Two App Instances Can Run Simultaneously

    • Main client instance + meeting instance
    • Use connect() + postMessage() to sync between them
    • Pre-meeting setup in main client, use in meeting
  6. Camera Mode Has CEF Quirks

    • CEF initialization takes time
    • Draw calls may fail if too early
    • Use retry with exponential backoff
  7. Cookie Settings Matter

    • SameSite=None + Secure=true required
    • Without this, sessions silently fail in embedded browser

Quick Reference

"App shows blank panel"

-> Domain Allowlist - add domain to Marketplace

"SyntaxError: redeclaration"

-> Global Variable - use let sdk = window.zoomSdk

"config() throws error"

-> Browser Preview - SDK only works inside Zoom

"API call fails silently"

-> OAuth Scopes - add required scopes in Marketplace

"How do I implement [feature]?"

-> API Reference - find the method, check capabilities needed

"How do I test locally?"

-> Debugging Guide - ngrok + Marketplace config


Document Version

Based on @zoom/appssdk v0.16.x (latest: 0.16.26+)


Happy coding!

Start with Architecture to understand the pattern, then Quick Start to build your first app.

指导使用 Zoom Whiteboard MCP 连接器,涵盖认证、端点、ID 映射及工具工作流。适用于涉及白板创建、列表查询及获取等特定操作,而非通用 Zoom MCP 场景。
用户请求管理 Zoom 白板内容 需要调用 Zoom Whiteboard MCP 工具如 list_whiteboards 涉及 Zoom 白板 ID 解析或 OAuth 配置
partner-built/zoom-plugin/skills/zoom-mcp/whiteboard/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill zoom-mcp/whiteboard -g -y
SKILL.md
Frontmatter
{
    "name": "zoom-mcp\/whiteboard",
    "triggers": [
        "whiteboard mcp",
        "zoom whiteboard mcp",
        "zoom mcp whiteboard",
        "zoom whiteboard tools",
        "list zoom whiteboards",
        "get zoom whiteboard",
        "zoom whiteboard id",
        "zoom wb\/db"
    ],
    "description": "Guidance for the bundled Zoom Whiteboard MCP connector. Use for Whiteboard MCP auth,\nendpoints, ID mapping, and tool workflows such as list_whiteboards and get_a_whiteboard.\nPrefer this skill when the request is specifically about Whiteboard MCP rather than general Zoom MCP.\n",
    "user-invocable": false
}

Zoom MCP Whiteboard

Dedicated guidance for Zoom's Whiteboard MCP server.

Endpoints

Transport URL
Streamable HTTP (recommended) https://mcp-us.zoom.us/mcp/whiteboard/streamable
SSE (fallback) https://mcp-us.zoom.us/mcp/whiteboard/sse

Authentication

  • User OAuth with Whiteboard scopes is the verified working path for list_whiteboards and get_a_whiteboard.
  • S2S OAuth can reach the Whiteboard MCP gateway and complete tools/list, but tool execution must be validated separately for your app and Whiteboard scopes.
  • Practical rule: start with user OAuth for Whiteboard MCP unless you have already proven your S2S app can mint and execute with the required Whiteboard scopes.
  • The bundled connector expects the token in ZOOM_WHITEBOARD_MCP_ACCESS_TOKEN.

Reference: references/authentication-and-identifiers.md

Required Scopes

Whiteboard MCP read scopes:

  • whiteboard:read:list_whiteboards
  • whiteboard:read:whiteboard

Write-capable Whiteboard metadata advertised by the gateway:

  • whiteboard:write:whiteboard

Whiteboard ID Mapping

For Whiteboard MCP, use the identifier from the URL segment after /wb/db/, not the numeric segment after /p/.

Example:

https://us05whiteboard.zoom.us/wb/db/6iktP8hJT3e5qaCuwFuAGg/p/180968285929472
                                     ^^^^^^^^^^^^^^^^^^^^^^   ^^^^^^^^^^^^^^^
                                     whiteboard_id            page/subresource id

Available Tools

The current Whiteboard MCP tool surface is:

  • create_a_whiteboard_for_brainstorming
  • list_whiteboards
  • create_a_whiteboard
  • get_a_whiteboard
  • create_a_whiteboard_by_script
  • update_a_whiteboard_metadata
  • create_a_whiteboard_for_meeting_summary
  • create_a_whiteboard_for_strategy_analysis

Some MCP clients namespace server tools in the UI. Treat the raw tool names above as authoritative.

Reference: references/tools.md

Read Workflow

  1. Use a user OAuth token with the Whiteboard read scopes.
  2. Call list_whiteboards to discover accessible whiteboards and confirm the correct whiteboard_id.
  3. Call get_a_whiteboard with that whiteboard_id.

Chaining

References

交互式PDF查看器,支持打开文档、标注、高亮、填写表单、签名盖章及协作审阅。适用于视觉交互场景,不用于纯文本提取或摘要。
用户要求展示或打开PDF文档 需要对PDF进行标注、高亮或填写表单 需要在PDF上添加签名、印章或审阅标记
pdf-viewer/skills/view-pdf/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill view-pdf -g -y
SKILL.md
Frontmatter
{
    "name": "view-pdf",
    "description": "Interactive PDF viewer. Use when the user wants to open, show, or view a PDF and collaborate on it visually — annotate, highlight, stamp, fill form fields, place signature\/initials, or review markup together. Not for summarization or text extraction (use native Read instead)."
}

PDF Viewer — Interactive Document Workflows

You have access to a local PDF server that renders documents in a live viewer and lets you annotate, fill forms, and place signatures with real-time visual feedback.

When to use this skill

Use the PDF viewer when the user wants interactivity:

  • "Show me this contract" / "Open this paper"
  • "Highlight the key terms and let me review"
  • "Help me fill out this form"
  • "Sign this on page 3" / "Add my initials to each page"
  • "Stamp this CONFIDENTIAL" / "Mark this as approved"
  • "Walk me through this document and annotate the important parts"

Do NOT use the viewer for pure ingestion:

  • "Summarize this PDF" → use the native Read tool directly
  • "What does page 5 say?" → use Read
  • "Extract the table from section 3" → use Read

The viewer's value is showing the user the document and collaborating on markup — not streaming text back to you.

Tools

list_pdfs

List available local PDFs and allowed local directories. No arguments.

display_pdf

Open a PDF in the interactive viewer. Call once per document.

  • url — local file path or HTTPS URL
  • page — initial page (optional, default 1)
  • elicit_form_inputs — if true, prompts the user to fill form fields before displaying (use for interactive form-filling)

Returns a viewUUID — pass this to every interact call. Calling display_pdf again creates a separate viewer; interact calls with the new UUID won't reach the one the user is looking at.

Also returns formFields (name, type, page, bounding box) if the PDF has fillable fields — use these coordinates for signature placement.

interact

All follow-up actions after display_pdf. Pass viewUUID plus one or more commands. Batch multiple commands in one call via the commands array — they run sequentially. End batches with get_screenshot to verify changes visually.

Annotation actions:

  • add_annotations — add markup (see types below)
  • update_annotations — modify existing (id + type required)
  • remove_annotations — delete by id array
  • highlight_text — auto-find text by query and highlight it (preferred over manual rects for text markup)

Navigation actions:

  • navigate (page), search (query), find (query, silent), search_navigate (matchIndex), zoom (scale 0.5–3.0)

Extraction actions:

  • get_text — extract text from page ranges (max 20 pages). Use for reading content to decide what to annotate, NOT for summarization.
  • get_screenshot — capture a page as an image (verify your annotations)

Form action:

  • fill_form — fill named fields: fields: [{name, value}, ...]

Annotation Types

All annotations need id (unique string), type, page (1-indexed). Coordinates are PDF points (1/72 inch), origin top-left, Y increases downward. US Letter is 612×792pt.

Type Key properties Use for
highlight rects, color?, content? Mark important text
underline rects, color? Emphasize terms
strikethrough rects, color? Mark deletions
note x, y, content, color? Sticky-note comments
freetext x, y, content, fontSize? Visible text on page
rectangle x, y, width, height, color?, fillColor? Box regions
circle x, y, width, height, color?, fillColor? Circle regions
line x1, y1, x2, y2, color? Draw lines/arrows
stamp x, y, label, color?, rotation? APPROVED, DRAFT, CONFIDENTIAL, etc.
image imageUrl, x?, y?, width?, height? Signatures, initials, logos

Image annotations accept a local file path or HTTPS URL (no data: URIs). Dimensions auto-detected if omitted. Users can also drag & drop images directly onto the viewer.

Interactive Workflows

Collaborative annotation (AI-driven)

  1. display_pdf to open the document
  2. interactget_text on relevant page range to understand content
  3. Propose a batch of annotations to the user (describe what you'll mark)
  4. On approval, interactadd_annotations + get_screenshot
  5. Show the user, ask for edits, iterate
  6. When done, remind them they can download the annotated PDF from the viewer toolbar

Form filling (visual, not programmatic)

Unlike headless form tools, this gives the user live visual feedback and handles forms with cryptic/unnamed fields where the label is printed on the page rather than in field metadata.

  1. display_pdf — inspect returned formFields (name, type, page, bounding box)
  2. If field names are cryptic (Text1, Field_7), get_screenshot the pages and match bounding boxes to visual labels
  3. Ask the user for values using the visual labels, or infer from context
  4. interactfill_form, then get_screenshot to show the result
  5. User confirms or edits directly in the viewer

For simple well-labeled forms, display_pdf with elicit_form_inputs: true prompts the user upfront instead.

Signing (visual, not certified)

  1. Ask for the signature/initials image path
  2. display_pdf, check formFields for signature-type fields or ask which page/position
  3. interactadd_annotations with type: "image" at the target coordinates
  4. get_screenshot to confirm placement

Disclaimer: This places a visual signature image. It is not a certified or cryptographic digital signature.

Supported Sources

  • Local files (paths under client MCP roots)
  • arXiv (/abs/ URLs auto-convert to PDF)
  • Any direct HTTPS PDF URL (bioRxiv, Zenodo, OSF, etc. — use the direct PDF link, not the landing page)

Out of Scope

  • Summarization / text extraction — use native Read instead
  • Certified digital signatures — image stamping only
  • PDF creation — this works on existing PDFs only
用于创建竞争分析简报,支持单个或多个竞品及功能领域对比。适用于产品策略制定、销售作战卡构建、投资者材料准备及差异化决策。涵盖竞品概况、功能对比、定位分析及战略建议。
需要创建竞争分析简报 进行竞品功能或定位对比 制定产品差异化策略 准备销售或投资者材料
product-management/skills/competitive-brief/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill competitive-brief -g -y
SKILL.md
Frontmatter
{
    "name": "competitive-brief",
    "description": "Create a competitive analysis brief for one or more competitors or a feature area. Use when informing product strategy or feature prioritization, building sales battle cards, prepping board or investor materials, or deciding where to differentiate vs. achieve parity.",
    "argument-hint": "<competitor or feature area>"
}

Competitive Brief

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Create a competitive analysis brief for one or more competitors or a feature area.

Usage

/competitive-brief $ARGUMENTS

Workflow

1. Scope the Analysis

Ask the user:

  • Competitor(s): Which specific competitor(s) to analyze? Or a feature area to compare across competitors?
  • Focus: Full product comparison, specific feature area, pricing/packaging, go-to-market, or positioning?
  • Context: What decision will this inform? (product strategy, sales enablement, investor/board materials, feature prioritization)

2. Research

Via web search:

  • Product pages and feature lists
  • Pricing pages and packaging
  • Recent product launches, blog posts, and changelogs
  • Press coverage and analyst reports
  • Customer reviews and ratings (G2, Capterra, TrustRadius)
  • Job postings (signal of strategic direction)
  • Social media and community discussions

If ~~knowledge base is connected:

  • Search for existing competitive analysis documents
  • Find win/loss reports or sales battle cards
  • Pull prior competitive research

If ~~chat is connected:

  • Search for competitive mentions in sales or product channels
  • Find recent deal feedback involving competitors

3. Generate the Brief

Competitor Overview

For each competitor:

  • Company summary: founding, size, funding/revenue if public, target market
  • Product positioning: how they describe themselves, who they target
  • Recent momentum: launches, funding, partnerships, customer wins

Feature Comparison

Compare capabilities across key areas relevant to the analysis. See Feature Comparison Matrices below for rating scales and matrix templates.

Positioning Analysis

Analyze how each competitor positions themselves — target customer, category claim, key differentiator, and value proposition. See Positioning Analysis Frameworks below for the positioning statement template and message architecture levels.

Strengths and Weaknesses

For each competitor:

  • Strengths: Where they genuinely excel. What customers praise.
  • Weaknesses: Where they fall short. What customers complain about.
  • Be honest and evidence-based — do not dismiss competitors or inflate their weaknesses.

Opportunities

Based on the analysis:

  • Where are there gaps in competitor offerings we could exploit?
  • What are customers asking for that no one provides well?
  • Where are competitors making bets we disagree with?
  • What market shifts could advantage our approach?

Threats

  • Where are competitors investing heavily?
  • What competitive moves could disrupt our position?
  • Where are we most vulnerable?
  • What would a "nightmare scenario" competitive move look like?

Strategic Implications

Tie the analysis back to product strategy:

  • What should we build, accelerate, or deprioritize based on this analysis?
  • Where should we differentiate vs. achieve parity?
  • How should we adjust positioning or messaging?
  • What should we monitor going forward?

4. Follow Up

After generating the brief:

  • Ask if the user wants to dive deeper on any section
  • Offer to create a one-page summary for executives
  • Offer to create sales battle cards for competitive deals
  • Offer to draft a "how to win against [competitor]" guide
  • Offer to set up a monitoring plan for competitive moves

Competitive Landscape Mapping

Identifying the Competitive Set

Define competitors at multiple levels:

Direct competitors: Products that solve the same problem for the same users in the same way.

  • These are the products your customers actively evaluate against you
  • They appear in your deals, in customer comparisons, in review site matchups

Indirect competitors: Products that solve the same problem but differently.

  • Different approach to the same user need (e.g., spreadsheets vs dedicated project management tool)
  • Include "non-consumption" — sometimes the competitor is doing nothing or using a manual process

Adjacent competitors: Products that do not compete today but could.

  • Companies with similar technology, customer base, or distribution that could expand into your space
  • Larger platforms that could add your functionality as a feature
  • Startups attacking a niche that could grow into your core market

Substitute solutions: Entirely different ways users solve the underlying need.

  • Hiring a person instead of buying software
  • Using a general-purpose tool (Excel, email) instead of a specialized one
  • Outsourcing the process entirely

Landscape Map

Position competitors on meaningful dimensions:

Common axes:

  • Breadth vs depth (suite vs point solution)
  • SMB vs enterprise (market segment focus)
  • Self-serve vs sales-led (go-to-market approach)
  • Simple vs powerful (product complexity)
  • Horizontal vs vertical (general purpose vs industry-specific)

Choose axes that reveal strategic positioning differences relevant to your market. The right axes make competitive dynamics visible.

Monitoring the Landscape

Track competitive movements over time:

  • Product launches and feature releases (changelogs, blog posts, press releases)
  • Pricing and packaging changes
  • Funding rounds and acquisitions
  • Key hires and job postings (signal strategic direction)
  • Customer wins and losses (especially your wins/losses)
  • Analyst and review coverage
  • Partnership announcements

Feature Comparison Matrices

Building a Feature Comparison

  1. Define capability areas: Group features into functional categories that matter to buyers (not your internal architecture). Use the categories buyers use when evaluating.
  2. List specific capabilities: Under each area, list the specific features or capabilities to compare.
  3. Rate each competitor: Use a consistent rating scale.

Rating Scale Options

Simple (recommended for most cases):

  • Strong: Market-leading capability. Deep functionality, well-executed.
  • Adequate: Functional capability. Gets the job done but not differentiated.
  • Weak: Exists but limited. Significant gaps or poor execution.
  • Absent: Does not have this capability.

Detailed (for deep-dive comparisons):

  • 5: Best-in-class. Defines the standard others aspire to.
  • 4: Strong. Fully-featured and well-executed.
  • 3: Adequate. Meets basic needs without differentiation.
  • 2: Limited. Exists but with significant gaps.
  • 1: Minimal. Barely functional or in early beta.
  • 0: Absent. Not available.

Comparison Matrix Template

| Capability Area | Our Product | Competitor A | Competitor B |
|----------------|-------------|-------------|-------------|
| [Area 1]       |             |             |             |
|   [Feature 1]  | Strong      | Adequate    | Absent      |
|   [Feature 2]  | Adequate    | Strong      | Weak        |
| [Area 2]       |             |             |             |
|   [Feature 3]  | Strong      | Strong      | Adequate    |

Tips for Feature Comparison

  • Rate based on real product experience, customer feedback, and reviews — not just marketing claims
  • Features exist on a spectrum. "Has feature X" is less useful than "How well does it do X?"
  • Weight the comparison by what matters to your target customers, not by total feature count
  • Update regularly — feature comparisons get stale fast
  • Be honest about where competitors are ahead. A comparison that always shows you winning is not credible.
  • Include the "why it matters" for each capability area. Not all features matter equally to buyers.

Positioning Analysis Frameworks

Positioning Statement Analysis

For each competitor, extract their positioning:

Template: For [target customer] who [need/problem], [Product] is a [category] that [key benefit]. Unlike [competitor/alternative], [Product] [key differentiator].

Sources for positioning:

  • Homepage headline and subheadline
  • Product description on app stores or review sites
  • Sales pitch decks (sometimes leaked or shared by prospects)
  • Analyst briefing materials
  • Earnings call language (for public companies)

Message Architecture Analysis

How does each competitor communicate value?

Level 1 — Category: What category do they claim? (CRM, project management, collaboration platform) Level 2 — Differentiator: What makes them different within that category? (AI-powered, all-in-one, developer-first) Level 3 — Value Proposition: What outcome do they promise? (Close deals faster, ship products faster, never miss a deadline) Level 4 — Proof Points: What evidence do they provide? (Customer logos, metrics, awards, case studies)

Positioning Gaps and Opportunities

Look for:

  • Unclaimed positions: Value propositions no competitor owns that matter to buyers
  • Crowded positions: Claims every competitor makes that have lost meaning
  • Emerging positions: New value propositions driven by market changes (AI, remote work, compliance)
  • Vulnerable positions: Claims competitors make that they cannot fully deliver on

Win/Loss Analysis Methodology

Conducting Win/Loss Analysis

Win/loss analysis reveals why you actually win and lose deals. It is the most actionable competitive intelligence.

Data sources:

  • CRM notes from sales team (available immediately, but biased)
  • Customer interviews shortly after decision (most valuable, least biased)
  • Churned customer surveys or exit interviews
  • Prospect surveys (for lost deals)

Win/Loss Interview Questions

For wins:

  • What problem were you trying to solve?
  • What alternatives did you evaluate? (Reveals competitive set)
  • Why did you choose us over alternatives?
  • What almost made you choose someone else?
  • What would we need to lose for you to reconsider?

For losses:

  • What problem were you trying to solve?
  • What did you end up choosing? Why?
  • Where did our product fall short?
  • What could we have done differently?
  • Would you reconsider us in the future? Under what conditions?

Analyzing Win/Loss Data

  • Track win/loss reasons over time. Are patterns changing?
  • Segment by deal type: enterprise vs SMB, new vs expansion, industry vertical
  • Identify the top 3-5 reasons for wins and losses
  • Distinguish between product reasons (features, quality) and non-product reasons (pricing, brand, relationship, timing)
  • Calculate competitive win rates by competitor: what % of deals involving each competitor do you win?

Common Win/Loss Patterns

  • Feature gap: Competitor has a specific capability you lack that is a dealbreaker
  • Integration advantage: Competitor integrates with tools the buyer already uses
  • Pricing structure: Not always cheaper — sometimes different pricing model (per-seat vs usage-based) fits better
  • Incumbent advantage: Buyer sticks with what they have because switching cost is too high
  • Sales execution: Better demo, faster response, more relevant case studies
  • Brand/trust: Buyer chooses the safer or more well-known option

Market Trend Identification

Sources for Trend Identification

  • Industry analyst reports: Gartner, Forrester, IDC for market sizing and trends
  • Venture capital: What are VCs funding? Investment themes signal where smart money sees opportunity.
  • Conference themes: What are industry events focusing on? What topics draw the biggest audiences?
  • Technology shifts: New platforms, APIs, or capabilities that enable new product categories
  • Regulatory changes: New regulations that create requirements or opportunities
  • Customer behavior changes: How are user expectations evolving? (e.g., mobile-first, AI-assisted, privacy-conscious)
  • Talent movement: Where are top people going? What skills are in demand?

Trend Analysis Framework

For each trend identified:

  1. What is changing?: Describe the trend clearly and specifically
  2. Why now?: What is driving this change? (Technology, regulation, behavior, economics)
  3. Who is affected?: Which customer segments or market categories?
  4. What is the timeline?: Is this happening now, in 1-2 years, or 3-5 years?
  5. What is the implication for us?: How should this influence our product strategy?
  6. What are competitors doing?: How are competitors responding to this trend?

Separating Signal from Noise

  • Signals: Trends backed by behavioral data, growing investment, regulatory action, or customer demand
  • Noise: Trends backed only by media hype, conference buzz, or competitor announcements without customer traction
  • Test trends against your own customer data: are YOUR customers asking for this or experiencing this change?
  • Be wary of "trend of the year" hype cycles. Many trends that dominate industry conversation do not materially affect your customers for years.

Strategic Response Options

For each significant trend:

  • Lead: Invest early and try to define the category or approach. High risk, high reward.
  • Fast follow: Wait for early signals of customer demand, then move quickly. Lower risk but harder to differentiate.
  • Monitor: Track the trend but do not invest yet. Set triggers for when to act.
  • Ignore: Explicitly decide this trend is not relevant to your strategy. Document why.

The right response depends on: your competitive position, your customer base, your resources, and how fast the trend is moving.

Output Format

Use tables for feature comparisons. Use clear headers for each section. Keep the strategic implications section concise and actionable — this is where the value is for the reader.

Tips

  • Be honest about competitor strengths. Dismissing competitors makes the analysis useless.
  • Focus on what matters to customers, not what matters to product teams. Customers do not care about architecture elegance.
  • Pricing is hard to compare fairly. Note the caveats (different packaging, usage-based vs seat-based, enterprise custom pricing).
  • Job postings are underrated competitive intelligence. A competitor hiring ML engineers signals a strategic direction.
  • Customer reviews are gold. They reveal what real users love and hate, unfiltered by marketing.
  • The most valuable part of competitive analysis is the "so what" — the strategic implications. Do not skip this.
  • Competitive analysis has a shelf life. Note the date and flag areas that change quickly.
用于定期或突发场景下的产品指标审查与分析。支持趋势识别、异常检测、目标对比及细分洞察,将原始数据转化为包含健康度评分和行动建议的结构化报告,辅助决策。
执行周/月/季度指标复盘 调查指标突然飙升或下跌 对比实际表现与目标差距 将原始数据转化为带行动建议的记分卡
product-management/skills/metrics-review/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill metrics-review -g -y
SKILL.md
Frontmatter
{
    "name": "metrics-review",
    "description": "Review and analyze product metrics with trend analysis and actionable insights. Use when running a weekly, monthly, or quarterly metrics review, investigating a sudden spike or drop, comparing performance against targets, or turning raw numbers into a scorecard with recommended actions.",
    "argument-hint": "<time period or metric focus>"
}

Metrics Review

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Review and analyze product metrics, identify trends, and surface actionable insights.

Usage

/metrics-review $ARGUMENTS

Workflow

1. Gather Metrics Data

If ~~product analytics is connected:

  • Pull key product metrics for the relevant time period
  • Get comparison data (previous period, same period last year, targets)
  • Pull segment breakdowns if available

If no analytics tool is connected, ask the user to provide:

  • The metrics and their values (paste a table, screenshot, or describe)
  • Comparison data (previous period, targets)
  • Any context on recent changes (launches, incidents, seasonality)

Ask the user:

  • What time period to review? (last week, last month, last quarter)
  • What metrics to focus on? Or should we review the full product metrics suite?
  • Are there specific targets or goals to compare against?
  • Any known events that might explain changes (launches, outages, marketing campaigns, seasonality)?

2. Organize the Metrics

Structure the review using a metrics hierarchy: North Star metric at the top, L1 health indicators (acquisition, activation, engagement, retention, revenue, satisfaction), and L2 diagnostic metrics for drill-down. See Product Metrics Hierarchy below for full definitions.

If the user has not defined their metrics hierarchy, help them identify their North Star and key L1 metrics before proceeding.

3. Analyze Trends

For each key metric:

  • Current value: What is the metric today?
  • Trend: Up, down, or flat compared to previous period? Over what timeframe?
  • vs Target: How does it compare to the goal or target?
  • Rate of change: Is the trend accelerating or decelerating?
  • Anomalies: Any sudden changes, spikes, or drops?

Identify correlations:

  • Do changes in one metric correlate with changes in another?
  • Are there leading indicators that predict lagging metric changes?
  • Do segment breakdowns reveal that an aggregate trend is driven by a specific cohort?

4. Generate the Review

Summary

2-3 sentences: overall product health, most notable changes, key callout.

Metric Scorecard

Table format for quick scanning:

Metric Current Previous Change Target Status
[Metric] [Value] [Value] [+/- %] [Target] [On track / At risk / Miss]

Trend Analysis

For each metric worth discussing:

  • What happened and how significant is the change
  • Why it likely happened (attribution based on known events, correlated metrics, segment analysis)
  • Whether this is a one-time event or a sustained trend

Bright Spots

What is going well:

  • Metrics beating targets
  • Positive trends to sustain
  • Segments or features showing strong performance

Areas of Concern

What needs attention:

  • Metrics missing targets or trending negatively
  • Early warning signals before they become problems
  • Metrics where we lack visibility or understanding

Recommended Actions

Specific next steps based on the analysis:

  • Investigations to run (dig deeper into a concerning trend)
  • Experiments to launch (test hypotheses about what could improve a metric)
  • Investments to make (double down on what is working)
  • Alerts to set (monitor a metric more closely)

Context and Caveats

  • Known data quality issues
  • Events that affect comparability (outages, holidays, launches)
  • Metrics we should be tracking but are not yet

5. Follow Up

After generating the review:

  • Ask if any metric needs deeper investigation
  • Offer to create a dashboard spec for ongoing monitoring
  • Offer to draft experiment proposals for areas of concern
  • Offer to set up a metrics review template for recurring use

Product Metrics Hierarchy

North Star Metric

The single metric that best captures the core value your product delivers to users. It should be:

  • Value-aligned: Moves when users get more value from the product
  • Leading: Predicts long-term business success (revenue, retention)
  • Actionable: The product team can influence it through their work
  • Understandable: Everyone in the company can understand what it means and why it matters

Examples by product type:

  • Collaboration tool: Weekly active teams with 3+ members contributing
  • Marketplace: Weekly transactions completed
  • SaaS platform: Weekly active users completing core workflow
  • Content platform: Weekly engaged reading/viewing time
  • Developer tool: Weekly deployments using the tool

L1 Metrics (Health Indicators)

The 5-7 metrics that together paint a complete picture of product health. These map to the key stages of the user lifecycle:

Acquisition: Are new users finding the product?

  • New signups or trial starts (volume and trend)
  • Signup conversion rate (visitors to signups)
  • Channel mix (where are new users coming from)
  • Cost per acquisition (for paid channels)

Activation: Are new users reaching the value moment?

  • Activation rate: % of new users who complete the key action that predicts retention
  • Time to activate: how long from signup to activation
  • Setup completion rate: % who complete onboarding steps
  • First value moment: when users first experience the core product value

Engagement: Are active users getting value?

  • DAU / WAU / MAU: active users at different timeframes
  • DAU/MAU ratio (stickiness): what fraction of monthly users come back daily
  • Core action frequency: how often users do the thing that matters most
  • Session depth: how much users do per session
  • Feature adoption: % of users using key features

Retention: Are users coming back?

  • D1, D7, D30 retention: % of users who return after 1 day, 7 days, 30 days
  • Cohort retention curves: how retention evolves for each signup cohort
  • Churn rate: % of users or revenue lost per period
  • Resurrection rate: % of churned users who come back

Monetization: Is value translating to revenue?

  • Conversion rate: free to paid (for freemium)
  • MRR / ARR: monthly or annual recurring revenue
  • ARPU / ARPA: average revenue per user or account
  • Expansion revenue: revenue growth from existing customers
  • Net revenue retention: revenue retention including expansion and contraction

Satisfaction: How do users feel about the product?

  • NPS: Net Promoter Score
  • CSAT: Customer Satisfaction Score
  • Support ticket volume and resolution time
  • App store ratings and review sentiment

L2 Metrics (Diagnostic)

Detailed metrics used to investigate changes in L1 metrics:

  • Funnel conversion at each step
  • Feature-level usage and adoption
  • Segment-specific breakdowns (by plan, company size, geography, user role)
  • Performance metrics (page load time, error rate, API latency)
  • Content-specific engagement (which features, pages, or content types drive engagement)

Common Product Metrics

DAU / WAU / MAU

What they measure: Unique users who perform a qualifying action in a day, week, or month.

Key decisions:

  • What counts as "active"? A login? A page view? A core action? Define this carefully — different definitions tell different stories.
  • Which timeframe matters most? DAU for daily-use products (messaging, email). WAU for weekly-use products (project management). MAU for less frequent products (tax software, travel booking).

How to use them:

  • DAU/MAU ratio (stickiness): values above 0.5 indicate a daily habit. Below 0.2 suggests infrequent usage.
  • Trend matters more than absolute number. Is active usage growing, flat, or declining?
  • Segment by user type. Power users and casual users behave very differently.

Retention

What it measures: Of users who started in period X, what % are still active in period Y?

Common retention timeframes:

  • D1 (next day): Was the first experience good enough to come back?
  • D7 (one week): Did the user establish a habit?
  • D30 (one month): Is the user retained long-term?
  • D90 (three months): Is this a durable user?

How to use retention:

  • Plot retention curves by cohort. Look for: initial drop-off (activation problem), steady decline (engagement problem), or flattening (good — you have a stable retained base).
  • Compare cohorts over time. Are newer cohorts retaining better than older ones? That means product improvements are working.
  • Segment retention by activation behavior. Users who completed onboarding vs those who did not. Users who used feature X vs those who did not.

Conversion

What it measures: % of users who move from one stage to the next.

Common conversion funnels:

  • Visitor to signup
  • Signup to activation (key value moment)
  • Free to paid (trial conversion)
  • Trial to paid subscription
  • Monthly to annual plan

How to use conversion:

  • Map the full funnel and measure conversion at each step
  • Identify the biggest drop-off points — these are your highest-leverage improvement opportunities
  • Segment conversion by source, plan, user type. Different segments convert very differently.
  • Track conversion over time. Is it improving as you iterate on the experience?

Activation

What it measures: % of new users who reach the moment where they first experience the product's core value.

Defining activation:

  • Look at retained users vs churned users. What actions did retained users take that churned users did not?
  • The activation event should be strongly predictive of long-term retention
  • It should be achievable within the first session or first few days
  • Examples: created first project, invited a teammate, completed first workflow, connected an integration

How to use activation:

  • Track activation rate for every signup cohort
  • Measure time to activate — faster is almost always better
  • Build onboarding flows that guide users to the activation moment
  • A/B test activation flows and measure impact on retention, not just activation rate

Goal Setting Frameworks

OKRs (Objectives and Key Results)

Objectives: Qualitative, aspirational goals that describe what you want to achieve.

  • Inspiring and memorable
  • Time-bound (quarterly or annually)
  • Directional, not metric-specific

Key Results: Quantitative measures that tell you if you achieved the objective.

  • Specific and measurable
  • Time-bound with a clear target
  • Outcome-based, not output-based
  • 2-4 Key Results per Objective

Example:

Objective: Make our product indispensable for daily workflows

Key Results:
- Increase DAU/MAU ratio from 0.35 to 0.50
- Increase D30 retention for new users from 40% to 55%
- 3 core workflows with >80% task completion rate

OKR Best Practices

  • Set OKRs that are ambitious but achievable. 70% completion is the target for stretch OKRs.
  • Key Results should measure outcomes (user behavior, business results), not outputs (features shipped, tasks completed).
  • Do not have too many OKRs. 2-3 objectives with 2-4 KRs each is plenty.
  • OKRs should be uncomfortable. If you are confident you will hit all of them, they are not ambitious enough.
  • Review OKRs at mid-period. Adjust effort allocation if some KRs are clearly off track.
  • Grade OKRs honestly at end of period. 0.0-0.3 = missed, 0.4-0.6 = progress, 0.7-1.0 = achieved.

Setting Metric Targets

  • Baseline: What is the current value? You need a reliable baseline before setting a target.
  • Benchmark: What do comparable products achieve? Industry benchmarks provide context.
  • Trajectory: What is the current trend? If the metric is already improving at 5% per month, a 6% target is not ambitious.
  • Effort: How much investment are you putting behind this? Bigger bets warrant more ambitious targets.
  • Confidence: How confident are you in hitting the target? Set a "commit" (high confidence) and a "stretch" (ambitious).

Metric Review Cadences

Weekly Metrics Check

Purpose: Catch issues quickly, monitor experiments, stay in touch with product health. Duration: 15-30 minutes. Attendees: Product manager, maybe engineering lead.

What to review:

  • North Star metric: current value, week-over-week change
  • Key L1 metrics: any notable movements
  • Active experiments: results and statistical significance
  • Anomalies: any unexpected spikes or drops
  • Alerts: anything that triggered a monitoring alert

Action: If something looks off, investigate. Otherwise, note it and move on.

Monthly Metrics Review

Purpose: Deeper analysis of trends, progress against goals, strategic implications. Duration: 30-60 minutes. Attendees: Product team, key stakeholders.

What to review:

  • Full L1 metric scorecard with month-over-month trends
  • Progress against quarterly OKR targets
  • Cohort analysis: are newer cohorts performing better?
  • Feature adoption: how are recent launches performing?
  • Segment analysis: any divergence between user segments?

Action: Identify 1-3 areas to investigate or invest in. Update priorities if metrics reveal new information.

Quarterly Business Review

Purpose: Strategic assessment of product performance, goal-setting for next quarter. Duration: 60-90 minutes. Attendees: Product, engineering, design, leadership.

What to review:

  • OKR scoring for the quarter
  • Trend analysis for all L1 metrics over the quarter
  • Year-over-year comparisons
  • Competitive context: market changes and competitor movements
  • What worked and what did not

Action: Set OKRs for next quarter. Adjust product strategy based on what the data shows.

Dashboard Design Principles

Effective Product Dashboards

A good dashboard answers the question "How is the product doing?" at a glance.

Principles:

  1. Start with the question, not the data. What decisions does this dashboard support? Design backwards from the decision.

  2. Hierarchy of information. The most important metric should be the most visually prominent. North Star at the top, L1 metrics next, L2 metrics available on drill-down.

  3. Context over numbers. A number without context is meaningless. Always show: current value, comparison (previous period, target, benchmark), trend direction.

  4. Fewer metrics, more insight. A dashboard with 50 metrics helps no one. Focus on 5-10 that matter. Put everything else in a detailed report.

  5. Consistent time periods. Use the same time period for all metrics on a dashboard. Mixing daily and monthly metrics creates confusion.

  6. Visual status indicators. Use color to indicate health at a glance:

    • Green: on track or improving
    • Yellow: needs attention or flat
    • Red: off track or declining
  7. Actionability. Every metric on the dashboard should be something the team can influence. If you cannot act on it, it does not belong on the product dashboard.

Dashboard Layout

Top row: North Star metric with trend line and target.

Second row: L1 metrics scorecard — current value, change, target, status for each key metric.

Third row: Key funnels or conversion metrics — visual funnel showing drop-off at each stage.

Fourth row: Recent experiments and launches — active A/B tests, recent feature launches with early metrics.

Bottom / drill-down: L2 metrics, segment breakdowns, and detailed time series for investigation.

Dashboard Anti-Patterns

  • Vanity metrics: Metrics that always go up but do not indicate health (total signups ever, total page views)
  • Too many metrics: Dashboards that require scrolling to see. If it does not fit on one screen, cut metrics.
  • No comparison: Raw numbers without context (current value with no previous period or target)
  • Stale dashboards: Metrics that have not been updated or reviewed in months
  • Output dashboards: Measuring team activity (tickets closed, PRs merged) instead of user and business outcomes
  • One dashboard for all audiences: Executives, PMs, and engineers need different views. One size does not fit all.

Alerting

Set alerts for metrics that require immediate attention:

  • Threshold alerts: Metric drops below or rises above a critical threshold (error rate > 1%, conversion < 5%)
  • Trend alerts: Metric shows sustained decline over multiple days/weeks
  • Anomaly alerts: Metric deviates significantly from expected range

Alert hygiene:

  • Every alert should be actionable. If you cannot do anything about it, do not alert on it.
  • Review and tune alerts regularly. Too many false positives and people ignore all alerts.
  • Define an owner for each alert. Who responds when it fires?
  • Set appropriate severity levels. Not everything is P0.

Output Format

Use tables for the scorecard. Use clear status indicators. Keep the summary tight — the reader should get the essential story in 30 seconds.

Tips

  • Start with the "so what" — what is the most important thing in this metrics review? Lead with that.
  • Absolute numbers without context are useless. Always show comparisons (vs previous period, vs target, vs benchmark).
  • Be careful about attribution. Correlation is not causation. If a metric moved, acknowledge uncertainty about why.
  • Segment analysis often reveals that an aggregate metric masks important differences. A flat overall number might hide one segment growing and another shrinking.
  • Not all metric movements matter. Small fluctuations are noise. Focus attention on meaningful changes.
  • If a metric is missing its target, do not just report the miss — recommend what to do about it.
  • Metrics reviews should drive decisions. If the review does not lead to at least one action, it was not useful.
作为敏锐的产品思维伙伴,协助PM探索问题空间、生成解决方案并挑战假设。通过问题探索、方案构思等模式,提供逆向思考与压力测试,避免过早收敛,激发独特创意。
探索新产品机会或模糊的问题领域 需要为已定义问题生成多种解决方案 对现有想法进行压力测试和挑战假设 产品经理需要思维碰撞以突破局限
product-management/skills/product-brainstorming/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill product-brainstorming -g -y
SKILL.md
Frontmatter
{
    "name": "product-brainstorming",
    "description": "Brainstorm product ideas, explore problem spaces, and challenge assumptions as a thinking partner. Use when exploring a new opportunity, generating solutions to a product problem, stress-testing an idea, or when a PM needs to think out loud with a sharp sparring partner before converging on a direction."
}

Product Brainstorming Skill

You are a sharp product thinking partner — the kind of experienced PM or design lead who challenges assumptions, asks the hard questions, and pushes ideas further before anyone converges too early. You help product managers explore problem spaces, generate ideas, and stress-test thinking before it becomes a spec.

Your job is not to generate deliverables. Your job is to think alongside the PM. Be opinionated. Push back. Bring in unexpected angles. Help them arrive at ideas they would not have reached alone.

Brainstorming Modes

Different situations call for different modes of thinking. Identify which mode fits the conversation and adapt. You can shift between modes as the conversation evolves.

Problem Exploration

Use when the PM has a problem area but has not yet defined what to solve. The goal is to understand the problem space deeply before jumping to solutions.

What to do:

  • Ask "who has this problem?" and "what are they doing about it today?" before anything else
  • Map the problem ecosystem: who is involved, what triggers the problem, what are the consequences of not solving it
  • Distinguish symptoms from root causes. PMs often describe symptoms. Keep asking "why" until you hit something structural.
  • Surface adjacent problems the PM might not have considered
  • Ask how the problem varies across user segments — it rarely affects everyone the same way

Useful questions:

  • "What happens if we do nothing? Who suffers and how?"
  • "Who has solved a version of this problem in a different context?"
  • "Is this a problem of awareness, ability, or motivation?"
  • "What would need to be true for this problem to not exist?"

Solution Ideation

Use when the problem is well-defined and the PM needs to generate multiple possible solutions. The goal is divergent thinking — quantity over quality.

What to do:

  • Generate at least 5-7 distinct approaches before evaluating any of them
  • Vary the solutions along meaningful dimensions: scope (small tweak vs big bet), approach (product vs process vs policy), timing (quick win vs long-term investment)
  • Include at least one "what if we did the opposite?" option
  • Include at least one option that removes something rather than adding something
  • Resist the urge to converge too early. If the PM latches onto the first decent idea, push them to keep going.

Ideation techniques:

  • Constraint removal: "What would you build if you had no technical constraints? No budget constraints? No political constraints?" Then work backward to what is feasible.
  • Analogies: "How does [another industry] solve this? What can we steal from that approach?"
  • Inversion: "How would we make this problem worse? Now reverse each of those."
  • Decomposition: Break the problem into subproblems and solve each independently. Then combine.
  • User hat-switching: "How would a power user solve this? A brand new user? An admin? Someone who hates our product?"

Assumption Testing

Use when the PM has an idea or direction and needs to stress-test it. The goal is to find the weak points before investing in execution.

What to do:

  • List every assumption the idea depends on — stated and unstated
  • For each assumption, ask: "How confident are we? What evidence do we have? What would disprove this?"
  • Identify the riskiest assumption — the one that, if wrong, kills the idea entirely
  • Suggest the cheapest way to test the riskiest assumption before building anything
  • Play devil's advocate: argue the strongest possible case against the idea

Assumption categories to probe:

  • User assumptions: "Users want this" — How do we know? From what evidence? How many users?
  • Problem assumptions: "This is a real problem" — How often does it occur? How much do users care?
  • Solution assumptions: "This solution will work" — Why this approach? What alternatives did we dismiss?
  • Business assumptions: "This will move the metric" — Which metric? By how much? Over what timeline?
  • Feasibility assumptions: "We can build this" — In what timeframe? With what trade-offs?
  • Adoption assumptions: "Users will find and use this" — How? What behavior change does it require?

Strategy Exploration

Use when the PM is thinking about direction, positioning, or big bets — not a specific feature. The goal is to explore the strategic landscape.

What to do:

  • Map the playing field: what are the possible strategic moves, not just the obvious one
  • Think in terms of bets: what are we betting on, what are the odds, what is the payoff
  • Consider second-order effects: "If we do X, what does that enable or foreclose?"
  • Bring in competitive dynamics: "If we do this, how do competitors respond?"
  • Think in timeframes: "What is the right move for 3 months vs 12 months vs 3 years?"

Brainstorming Frameworks

Use frameworks as thinking tools, not templates to fill in. Pull in a framework when it helps move the conversation forward. Do not force every conversation through every framework.

How Might We (HMW)

Reframe problems as opportunities. Turn a pain point into an actionable question.

Structure: "How might we [desired outcome] for [user] without [constraint]?"

Tips:

  • Too broad: "How might we improve onboarding?" — could mean anything
  • Too narrow: "How might we add a tooltip to step 3?" — that is a solution, not a question
  • Right level: "How might we help new users reach their first success within 10 minutes?"
  • Generate 5-10 HMW questions from a single problem statement. Each reframing opens different solution spaces.

Jobs-to-be-Done (JTBD)

Think from the user's job, not from features or demographics.

Structure: "When [situation], I want to [motivation] so I can [expected outcome]."

Tips:

  • The job is stable even when solutions change. People have been "hiring" solutions to share updates with colleagues for decades — memos, email, Slack, shared docs.
  • Functional jobs (get something done) are easier to identify. Emotional jobs (feel confident, look competent) and social jobs (be seen as a leader) are often more powerful.
  • Ask "What did they fire to hire your product?" — this reveals the real competitive set.

Opportunity Solution Trees

Map the path from outcome to experiment.

Desired Outcome
├── Opportunity A (user need / pain point)
│   ├── Solution A1
│   │   ├── Experiment: ...
│   │   └── Experiment: ...
│   └── Solution A2
│       └── Experiment: ...
├── Opportunity B
│   ├── Solution B1
│   └── Solution B2
└── Opportunity C
    └── Solution C1

Tips:

  • Opportunities come from research, not imagination. Every opportunity should trace back to evidence.
  • Multiple solutions per opportunity. If you only have one solution, you have not explored enough.
  • Multiple experiments per solution. Find the cheapest way to test before building.
  • The tree is a living artifact. Update it as you learn.

First Principles Decomposition

Break a complex problem down to its fundamental truths and rebuild.

  1. State the problem or assumption you want to examine
  2. Break it down: What are the fundamental components or constraints?
  3. Question each component: Why does this have to be this way? Is this a law of physics or a convention?
  4. Rebuild from the ground up: Given only the fundamental truths, what solutions are possible?

When to use: When the team is stuck in incremental thinking. When everyone says "that is just how it works." When the category has not been reimagined in years.

SCAMPER

Systematic ideation using seven lenses on an existing product or process:

  • Substitute: What component could be replaced? What if a different user did this step?
  • Combine: What if we merged two features? Two workflows? Two user roles?
  • Adapt: What idea from another product or industry could we borrow?
  • Modify: What if we made this 10x bigger? 10x smaller? 10x faster?
  • Put to other use: Could this feature serve a different user or use case?
  • Eliminate: What if we removed this entirely? Would anyone notice?
  • Reverse: What if we did the opposite? Flipped the sequence? Inverted the default?

OODA Loop (Observe–Orient–Decide–Act)

A decision-tempo framework from military strategy that excels in fast-moving, competitive product environments. The power of OODA is not in the steps — it is in cycling through them faster than the competition.

  1. Observe: Gather raw signals — usage data, customer feedback, competitive moves, market shifts, support tickets. Do not filter yet. Cast wide.
  2. Orient: Make sense of what you observed. This is the critical step. Orient through the lens of your mental models, prior experience, and cultural context. Challenge your own orientation — are you seeing what is actually there, or what you expect to see?
  3. Decide: Choose a direction. Not a final commitment — a hypothesis to test. The decision should be proportional to what you know. Small bets when uncertain, bigger moves when the signal is clear.
  4. Act: Execute the decision. Ship something. Run the experiment. Make the change. Then immediately return to Observe with new data.

When to use in brainstorming:

  • When the team is over-deliberating and needs to move. OODA favors tempo over perfection.
  • When competitive dynamics matter — a competitor just shipped something, a market window is closing, a customer is about to churn.
  • When the brainstorm keeps circling without converging. OODA forces a decision and reframes it as reversible: act, observe new data, re-orient.
  • When exploring strategy: "Given what we are observing in the market, how should we re-orient our product thinking?"

The OODA advantage in product: Most product teams get stuck in Orient — endlessly analyzing, debating frameworks, waiting for more data. OODA says: orient with what you have, decide, act, and let the next observation cycle correct your course. The team that cycles fastest learns fastest.

Reverse Brainstorming

When stuck on how to solve a problem, brainstorm how to make it worse.

  1. Invert the problem: "How could we make onboarding as confusing as possible?"
  2. Generate ideas: List everything that would make the problem worse (more steps, jargon, hidden buttons, no feedback)
  3. Reverse each idea: Each "make it worse" idea contains the seed of a "make it better" solution
  4. Evaluate: Which reversed ideas are most promising?

Why it works: People are better at identifying what is wrong than imagining what is right. Inversion unlocks creative thinking when the team is stuck.

Session Structure

A good brainstorming session has rhythm — it opens up before it narrows down.

1. Frame

Set boundaries before generating ideas. Good framing prevents wasted divergence.

  • What are we exploring? (A specific problem, an opportunity area, a strategic question)
  • Why now? (What triggered this brainstorm?)
  • What do we already know? (Prior research, data, customer feedback)
  • What are the constraints? (Timeline, technical, business, team)
  • What would a great outcome from this session look like?

Spend enough time framing. A poorly framed brainstorm produces ideas that do not connect to real needs.

2. Diverge

Generate many ideas. No judgment. Quantity enables quality.

  • Build on ideas rather than shooting them down
  • Follow tangents — the best ideas often come from unexpected connections
  • Push past the obvious. The first 3-5 ideas are usually the ones everyone would have thought of. Keep going.
  • Ask provocative questions to unlock new directions
  • Use frameworks (above) to systematically explore different angles

3. Provoke

Challenge and extend thinking. This is where the sparring partner role matters most.

  • "What is the strongest argument against this?"
  • "Who would hate this and why?"
  • "What are we not seeing?"
  • "What would [specific company or person] do differently?"
  • "What if the opposite were true?"
  • "What is the version of this that is 10x more ambitious?"

4. Converge

Narrow down. Evaluate ideas against what matters.

  • Group related ideas into themes
  • Evaluate against: user impact, feasibility, strategic alignment, evidence strength
  • Do not kill ideas by committee. If one idea excites the PM, explore it — even if it is risky. The brainstorm is not the decision.
  • Identify the top 2-3 ideas worth pursuing further
  • For each, name the biggest unknown and the cheapest way to resolve it

5. Capture

Document what matters. A brainstorm with no capture is a brainstorm that never happened.

  • Key ideas and why they are interesting
  • Assumptions to test
  • Questions to research
  • Suggested next steps (research, prototype, talk to users, write a one-pager)
  • What was explicitly set aside — ideas that were interesting but not for now

Being a Good Thinking Partner

Do

  • Be opinionated. "I think approach B is stronger because..." is more useful than listing pros and cons.
  • Challenge constructively. "That assumes X — are we confident?" not "That will not work."
  • Bring unexpected angles. Cross-industry analogies, counterexamples, edge cases the PM has not considered.
  • Match energy. If the PM is excited about an idea, explore it with them before poking holes.
  • Ask the next question. When the PM finishes a thought, do not just agree. Push further: "And then what happens?"
  • Name the pattern. If you recognize a common PM trap (solutioning too early, scope creep, feature parity thinking), name it directly.

Do Not

  • Do not dump frameworks. Use frameworks as thinking tools when they help, not as a checklist to work through.
  • Do not generate a list and hand it over. Brainstorming is a conversation, not a deliverable.
  • Do not agree with everything. A thinking partner who only validates is not a thinking partner.
  • Do not optimize prematurely. In divergent mode, do not evaluate feasibility. That kills creative thinking.
  • Do not anchor on the first idea. If the PM leads with a solution, acknowledge it, then ask "What else could solve this?"
  • Do not confuse brainstorming with decision-making. The brainstorm generates options. The decision comes later with more data.

Common Brainstorming Anti-Patterns

Solutioning before framing: The PM jumps to "we should build X" before defining the problem. Slow them down. Ask what user problem X solves and how we know.

The feature parity trap: "Competitor has X, so we need X." This is not brainstorming — it is copying. Ask what user need X serves and whether there is a better way to serve it.

Anchoring on constraints: "We cannot do that because of technical limitation Y." In divergent mode, set constraints aside. Explore freely first, then figure out feasibility.

The one-idea brainstorm: The PM comes in with a solution and calls it brainstorming. Acknowledge their idea, then push for alternatives. "That is one approach. What are three others?"

Analysis paralysis: Too much exploration, no convergence. If the session has been divergent for a while, prompt: "If you had to pick one direction right now, which would it be and why?"

Brainstorming when you should be researching: Some questions cannot be brainstormed — they need data. If the brainstorm keeps circling because no one knows the answer, stop and identify what research is needed.

用于创建、更新或重新规划产品路线图。支持添加新任务、调整优先级、变更时间线或从零构建Now/Next/Later视图,并生成包含状态、风险和依赖关系的详细摘要。
需要创建新的产品路线图 向路线图添加新功能或任务 根据新信息调整任务优先级 因依赖关系延误而移动时间线 更新现有任务的状态
product-management/skills/roadmap-update/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill roadmap-update -g -y
SKILL.md
Frontmatter
{
    "name": "roadmap-update",
    "description": "Update, create, or reprioritize your product roadmap. Use when adding a new initiative and deciding what moves to make room, shifting priorities after new information comes in, moving timelines due to a dependency slip, or building a Now\/Next\/Later view from scratch.",
    "argument-hint": "<update description>"
}

Roadmap Update

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Update, create, or reprioritize a product roadmap.

Usage

/roadmap-update $ARGUMENTS

Workflow

1. Understand Current State

If ~~project tracker is connected:

  • Pull current roadmap items with their statuses, assignees, and dates
  • Identify items that are overdue, at risk, or recently completed
  • Surface any items without clear owners or dates

If no project management tool is connected:

  • Ask the user to describe their current roadmap or paste/upload it
  • Accept any format: list, table, spreadsheet, screenshot, or prose description

2. Determine the Operation

Ask what the user wants to do:

Add item: New feature, initiative, or work item to the roadmap

  • Gather: name, description, priority, estimated effort, target timeframe, owner, dependencies
  • Suggest where it fits based on current priorities and capacity

Update status: Change status of existing items

  • Options: not started, in progress, at risk, blocked, completed, cut
  • For "at risk" or "blocked": ask for the blocker and mitigation plan

Reprioritize: Change the order or priority of items

  • Ask what changed (new information, strategy shift, resource change, customer feedback)
  • Apply a prioritization framework if helpful — see Prioritization Frameworks below for RICE, MoSCoW, ICE, and value-vs-effort
  • Show before/after comparison

Move timeline: Shift dates for items

  • Ask why (scope change, dependency slip, resource constraint)
  • Identify downstream impacts on dependent items
  • Flag items that move past hard deadlines

Create new roadmap: Build a roadmap from scratch

  • Ask about timeframe (quarter, half, year)
  • Ask about format preference (Now/Next/Later, quarterly columns, OKR-aligned) — see Roadmap Frameworks below
  • Gather the list of initiatives to include

3. Generate Roadmap Summary

Produce a roadmap view with:

Status Overview

Quick summary: X items in progress, Y completed this period, Z at risk.

Roadmap Items

For each item, show:

  • Name and one-line description
  • Status indicator (on track / at risk / blocked / completed / not started)
  • Target timeframe or date
  • Owner
  • Key dependencies

Group items by:

  • Timeframe (Now / Next / Later) or quarter, depending on format
  • Or by theme/goal if the user prefers

Risks and Dependencies

  • Items that are blocked or at risk, with details
  • Cross-team dependencies and their status
  • Items approaching hard deadlines

Changes This Update

If this is an update to an existing roadmap, summarize what changed:

  • Items added, removed, or reprioritized
  • Timeline shifts
  • Status changes

4. Follow Up

After generating the roadmap:

  • Offer to format for a specific audience (executive summary, engineering detail, customer-facing)
  • Offer to draft communication about roadmap changes
  • If project management tool is connected, offer to update ticket statuses

Roadmap Frameworks

Now / Next / Later

The simplest and often most effective roadmap format:

  • Now (current sprint/month): Committed work. High confidence in scope and timeline. These are the things the team is actively building.
  • Next (next 1-3 months): Planned work. Good confidence in what, less confidence in exactly when. Scoped and prioritized but not yet started.
  • Later (3-6+ months): Directional. These are strategic bets and opportunities we intend to pursue, but scope and timing are flexible.

When to use: Most teams, most of the time. Especially good for communicating externally or to leadership because it avoids false precision on dates.

Quarterly Themes

Organize the roadmap around 2-3 themes per quarter:

  • Each theme represents a strategic area of investment (e.g., "Enterprise readiness", "Activation improvements", "Platform extensibility")
  • Under each theme, list the specific initiatives planned
  • Themes should map to company or team OKRs
  • This format makes it easy to explain WHY you are building what you are building

When to use: When you need to show strategic alignment. Good for planning meetings and executive communication.

OKR-Aligned Roadmap

Map roadmap items directly to Objectives and Key Results:

  • Start with the team's OKRs for the period
  • Under each Key Result, list the initiatives that will move that metric
  • Include the expected impact of each initiative on the Key Result
  • This creates clear accountability between what you build and what you measure

When to use: Organizations that run on OKRs. Good for ensuring every initiative has a clear "why" tied to measurable outcomes.

Timeline / Gantt View

Calendar-based view with items on a timeline:

  • Shows start dates, end dates, and durations
  • Visualizes parallelism and sequencing
  • Good for identifying resource conflicts
  • Shows dependencies between items

When to use: Execution planning with engineering. Identifying scheduling conflicts. NOT good for communicating externally (creates false precision expectations).

Prioritization Frameworks

RICE Score

Score each initiative on four dimensions, then calculate RICE = (Reach x Impact x Confidence) / Effort

  • Reach: How many users/customers will this affect in a given time period? Use concrete numbers (e.g., "500 users per quarter").
  • Impact: How much will this move the needle for each person reached? Score on a scale: 3 = massive, 2 = high, 1 = medium, 0.5 = low, 0.25 = minimal.
  • Confidence: How confident are we in the reach and impact estimates? 100% = high confidence (backed by data), 80% = medium (some evidence), 50% = low (gut feel).
  • Effort: How many person-months of work? Include engineering, design, and any other functions.

When to use: When you need a quantitative, defensible prioritization. Good for comparing a large backlog of initiatives. Less good for strategic bets where impact is hard to estimate.

MoSCoW

Categorize items into Must have, Should have, Could have, Won't have:

  • Must have: The roadmap is a failure without these. Non-negotiable commitments.
  • Should have: Important and expected, but delivery is viable without them.
  • Could have: Desirable but clearly lower priority. Include only if capacity allows.
  • Won't have: Explicitly out of scope for this period. Important to list for clarity.

When to use: Scoping a release or quarter. Negotiating with stakeholders about what fits. Good for forcing prioritization conversations.

ICE Score

Simpler than RICE. Score each item 1-10 on three dimensions:

  • Impact: How much will this move the target metric?
  • Confidence: How confident are we in the impact estimate?
  • Ease: How easy is this to implement? (Inverse of effort — higher = easier)

ICE Score = Impact x Confidence x Ease

When to use: Quick prioritization of a feature backlog. Good for early-stage products or when you do not have enough data for RICE.

Value vs Effort Matrix

Plot initiatives on a 2x2 matrix:

  • High value, Low effort (Quick wins): Do these first.
  • High value, High effort (Big bets): Plan these carefully. Worth the investment but need proper scoping.
  • Low value, Low effort (Fill-ins): Do these when you have spare capacity.
  • Low value, High effort (Money pits): Do not do these. Remove from the backlog.

When to use: Visual prioritization in team planning sessions. Good for building shared understanding of tradeoffs.

Dependency Mapping

Identifying Dependencies

Look for dependencies across these categories:

  • Technical dependencies: Feature B requires infrastructure work from Feature A
  • Team dependencies: Feature requires work from another team (design, platform, data)
  • External dependencies: Waiting on a vendor, partner, or third-party integration
  • Knowledge dependencies: Need research or investigation results before starting
  • Sequential dependencies: Must ship Feature A before starting Feature B (shared code, user flow)

Managing Dependencies

  • List all dependencies explicitly in the roadmap
  • Assign an owner to each dependency (who is responsible for resolving it)
  • Set a "need by" date: when does the depending item need this resolved
  • Build buffer around dependencies — they are the highest-risk items on any roadmap
  • Flag dependencies that cross team boundaries early — these require coordination
  • Have a contingency plan: what do you do if the dependency slips?

Reducing Dependencies

  • Can you build a simpler version that avoids the dependency?
  • Can you parallelize by using an interface contract or mock?
  • Can you sequence differently to move the dependency earlier?
  • Can you absorb the work into your team to remove the cross-team coordination?

Capacity Planning

Estimating Capacity

  • Start with the number of engineers and the time period
  • Subtract known overhead: meetings, on-call rotations, interviews, holidays, PTO
  • A common rule of thumb: engineers spend 60-70% of time on planned feature work
  • Factor in team ramp time for new members

Allocating Capacity

A healthy allocation for most product teams:

  • 70% planned features: Roadmap items that advance strategic goals
  • 20% technical health: Tech debt, reliability, performance, developer experience
  • 10% unplanned: Buffer for urgent issues, quick wins, and requests from other teams

Adjust ratios based on team context:

  • New product: more feature work, less tech debt
  • Mature product: more tech debt and reliability investment
  • Post-incident: more reliability, less features
  • Rapid growth: more scalability and performance

Capacity vs Ambition

  • If roadmap commitments exceed capacity, something must give
  • Do not solve capacity problems by pretending people can do more — solve by cutting scope
  • When adding to the roadmap, always ask: "What comes off?"
  • Better to commit to fewer things and deliver reliably than to overcommit and disappoint

Communicating Roadmap Changes

When the Roadmap Changes

Common triggers for roadmap changes:

  • New strategic priority from leadership
  • Customer feedback or research that changes priorities
  • Technical discovery that changes estimates
  • Dependency slip from another team
  • Resource change (team grows or shrinks, key person leaves)
  • Competitive move that requires response

How to Communicate Changes

  1. Acknowledge the change: Be direct about what is changing and why
  2. Explain the reason: What new information drove this decision?
  3. Show the tradeoff: What was deprioritized to make room? Or what is slipping?
  4. Show the new plan: Updated roadmap with the changes reflected
  5. Acknowledge impact: Who is affected and how? Stakeholders who were expecting deprioritized items need to hear it directly.

Avoiding Roadmap Whiplash

  • Do not change the roadmap for every piece of new information. Have a threshold for change.
  • Batch roadmap updates at natural cadences (monthly, quarterly) unless something is truly urgent.
  • Distinguish between "roadmap change" (strategic reprioritization) and "scope adjustment" (normal execution refinement).
  • Track how often the roadmap changes. Frequent changes may signal unclear strategy, not good responsiveness.

Output Format

Use a clear, scannable format. Tables work well for roadmap items. Use text status labels: Done, On Track, At Risk, Blocked, Not Started.

Tips

  • A roadmap is a communication tool, not a project plan. Keep it at the right altitude — themes and outcomes, not tasks.
  • When reprioritizing, always ask what changed. Priority shifts should be driven by new information, not whim.
  • Flag capacity issues early. If the roadmap has more work than the team can handle, say so.
  • Dependencies are the biggest risk to roadmaps. Surface them explicitly.
  • If the user asks to add something, always ask what comes off or moves. Roadmaps are zero-sum against capacity.
用于规划敏捷冲刺,包括设定目标、评估团队产能(含假期会议)、优先级排序及生成计划文档。适用于启动新冲刺、处理遗留任务或确定P0与扩展任务。
启动新的冲刺周期 根据团队可用性对 backlog 进行规模估算 决定 P0 优先项与扩展任务 处理上个冲刺的遗留工作
product-management/skills/sprint-planning/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill sprint-planning -g -y
SKILL.md
Frontmatter
{
    "name": "sprint-planning",
    "description": "Plan a sprint — scope work, estimate capacity, set goals, and draft a sprint plan. Use when kicking off a new sprint, sizing a backlog against team availability (accounting for PTO and meetings), deciding what's P0 vs. stretch, or handling carryover from the last sprint.",
    "argument-hint": "[sprint name or date range]"
}

/sprint-planning

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Plan a sprint by scoping work, estimating capacity, and setting clear goals.

Usage

/sprint-planning $ARGUMENTS

How It Works

┌─────────────────────────────────────────────────────────────────┐
│                    SPRINT PLANNING                                 │
├─────────────────────────────────────────────────────────────────┤
│  STANDALONE (always works)                                       │
│  ✓ Define sprint goals and success criteria                     │
│  ✓ Estimate team capacity (accounting for PTO, meetings)        │
│  ✓ Scope and prioritize backlog items                           │
│  ✓ Identify dependencies and risks                              │
│  ✓ Generate sprint plan document                                │
├─────────────────────────────────────────────────────────────────┤
│  SUPERCHARGED (when you connect your tools)                      │
│  + Project tracker: Pull backlog, create sprint, assign items   │
│  + Calendar: Account for PTO and meetings in capacity           │
│  + Chat: Share sprint plan with the team                        │
└─────────────────────────────────────────────────────────────────┘

What I Need From You

  • Team: Who's on the team and their availability this sprint?
  • Sprint length: How many days/weeks?
  • Backlog: What's prioritized? (Pull from tracker, paste, or describe)
  • Carryover: Anything unfinished from last sprint?
  • Dependencies: Anything blocked on other teams?

Output

## Sprint Plan: [Sprint Name]
**Dates:** [Start] — [End] | **Team:** [X] engineers
**Sprint Goal:** [One clear sentence about what success looks like]

### Capacity
| Person | Available Days | Allocation | Notes |
|--------|---------------|------------|-------|
| [Name] | [X] of [Y] | [X] points/hours | [PTO, on-call, etc.] |
| **Total** | **[X]** | **[X] points** | |

### Sprint Backlog
| Priority | Item | Estimate | Owner | Dependencies |
|----------|------|----------|-------|--------------|
| P0 | [Must ship] | [X] pts | [Person] | [None / Blocked by X] |
| P1 | [Should ship] | [X] pts | [Person] | [None] |
| P2 | [Stretch] | [X] pts | [Person] | [None] |

### Planned Capacity: [X] points | Sprint Load: [X] points ([X]% of capacity)

### Risks
| Risk | Impact | Mitigation |
|------|--------|------------|
| [Risk] | [What happens] | [What to do] |

### Definition of Done
- [ ] Code reviewed and merged
- [ ] Tests passing
- [ ] Documentation updated (if applicable)
- [ ] Product sign-off

### Key Dates
| Date | Event |
|------|-------|
| [Date] | Sprint start |
| [Date] | Mid-sprint check-in |
| [Date] | Sprint end / Demo |
| [Date] | Retro |

Tips

  1. Leave buffer — Plan to 70-80% capacity. You will get interrupts.
  2. One clear sprint goal — If you can't state it in one sentence, the sprint is unfocused.
  3. Identify stretch items — Know what to cut if things take longer than expected.
  4. Carry over honestly — If something didn't ship, understand why before re-committing.
根据受众和周期生成定制化的干系人更新报告。支持周报、月报、发布及临时升级场景,适配高管、工程、客户等视角,自动关联项目工具或手动收集上下文,输出结构化内容。
撰写面向领导层的周/月进度汇报 宣布产品功能上线 升级风险或阻塞问题 将进展转化为不同受众版本
product-management/skills/stakeholder-update/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill stakeholder-update -g -y
SKILL.md
Frontmatter
{
    "name": "stakeholder-update",
    "description": "Generate a stakeholder update tailored to audience and cadence. Use when writing a weekly or monthly status for leadership, announcing a launch, escalating a risk or blocker, or translating the same progress into exec-brief, engineering-detail, or customer-facing versions.",
    "argument-hint": "<update type and audience>"
}

Stakeholder Update

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Generate a stakeholder update tailored to the audience and cadence.

Usage

/stakeholder-update $ARGUMENTS

Workflow

1. Determine Update Type

Ask the user what kind of update:

  • Weekly: Regular cadence update on progress, blockers, and next steps
  • Monthly: Higher-level summary with trends, milestones, and strategic alignment
  • Launch: Announcement of a feature or product launch with details and impact
  • Ad-hoc: One-off update for a specific situation (escalation, pivot, major decision)

2. Determine Audience

Ask who the update is for:

  • Executives / leadership: High-level, outcome-focused, strategic framing, brief
  • Engineering team: Technical detail, implementation context, blockers, decisions needed
  • Cross-functional partners: Context-appropriate detail, focus on shared goals and dependencies
  • Customers / external: Benefits-focused, clear timelines, no internal jargon
  • Board: Metrics-driven, strategic, risk-focused, very concise

3. Pull Context from Connected Tools

If ~~project tracker is connected:

  • Pull status of roadmap items and milestones
  • Identify completed items since last update
  • Surface items that are at risk or blocked
  • Pull sprint or iteration progress

If ~~chat is connected:

  • Search for relevant team discussions and decisions
  • Find blockers or issues raised in channels
  • Identify key decisions made asynchronously

If ~~meeting transcription is connected:

  • Pull recent meeting notes and discussion summaries
  • Find decisions and action items from relevant meetings

If ~~knowledge base is connected:

  • Search for recent meeting notes
  • Find decision documents or design reviews

If no tools are connected, ask the user to provide:

  • What was accomplished since the last update
  • Current blockers or risks
  • Key decisions made or needed
  • What is coming next

4. Generate the Update

Structure the update for the target audience using the templates and frameworks below.

For executives: TL;DR, status color (G/Y/R), key progress tied to goals, decisions made, risks with mitigation, specific asks, and next milestones. Keep it under 300 words.

For engineering: What shipped (with links), what is in progress (with owners), blockers, decisions needed (with options and recommendation), and what is coming next.

For cross-functional partners: What is coming that affects them, what you need from them (with deadlines), decisions that impact their team, and areas open for input.

For customers: What is new (framed as benefits), what is coming soon, known issues with workarounds, and how to provide feedback. No internal jargon.

For launch announcements: What launched, why it matters, key details (scope, availability, limitations), success metrics, rollout plan, and feedback channels.

5. Review and Deliver

After generating the update:

  • Ask if the user wants to adjust tone, detail level, or emphasis
  • Offer to format for the delivery channel (email, chat post, doc, slides)
  • If ~~chat is connected, offer to draft the message for sending

Update Templates by Audience

Executive / Leadership Update

Executives want: strategic context, progress against goals, risks that need their help, decisions that need their input.

Format:

Status: [Green / Yellow / Red]

TL;DR: [One sentence — the most important thing to know]

Progress:
- [Outcome achieved, tied to goal/OKR]
- [Milestone reached, with impact]
- [Key metric movement]

Risks:
- [Risk]: [Mitigation plan]. [Ask if needed].

Decisions needed:
- [Decision]: [Options with recommendation]. Need by [date].

Next milestones:
- [Milestone] — [Date]

Tips for executive updates:

  • Lead with the conclusion, not the journey. Executives want "we shipped X and it moved Y metric" not "we had 14 standups and resolved 23 tickets."
  • Keep it under 200 words. If they want more, they will ask.
  • Status color should reflect YOUR genuine assessment, not what you think they want to hear. Yellow is not a failure — it is good risk management.
  • Only include risks you want help with. Do not list risks you are already handling unless they need to know.
  • Asks must be specific: "Decision on X by Friday" not "support needed."

Engineering Team Update

Engineers want: clear priorities, technical context, blockers resolved, decisions that affect their work.

Format:

Shipped:
- [Feature/fix] — [Link to PR/ticket]. [Impact if notable].

In progress:
- [Item] — [Owner]. [Expected completion]. [Blockers if any].

Decisions:
- [Decision made]: [Rationale]. [Link to ADR if exists].
- [Decision needed]: [Context]. [Options]. [Recommendation].

Priority changes:
- [What changed and why]

Coming up:
- [Next items] — [Context on why these are next]

Tips for engineering updates:

  • Link to specific tickets, PRs, and documents. Engineers want to click through for details.
  • When priorities change, explain why. Engineers are more bought in when they understand the reason.
  • Be explicit about what is blocking them and what you are doing to unblock it.
  • Do not waste their time with information that does not affect their work.

Cross-Functional Partner Update

Partners (design, marketing, sales, support) want: what is coming that affects them, what they need to prepare for, how to give input.

Format:

What's coming:
- [Feature/launch] — [Date]. [What this means for your team].

What we need from you:
- [Specific ask] — [Context]. By [date].

Decisions made:
- [Decision] — [How it affects your team].

Open for input:
- [Topic we'd love feedback on] — [How to provide it].

Customer / External Update

Customers want: what is new, what is coming, how it benefits them, how to get started.

Format:

What's new:
- [Feature] — [Benefit in customer terms]. [How to use it / link].

Coming soon:
- [Feature] — [Expected timing]. [Why it matters to you].

Known issues:
- [Issue] — [Status]. [Workaround if available].

Feedback:
- [How to share feedback or request features]

Tips for customer updates:

  • No internal jargon. No ticket numbers. No technical implementation details.
  • Frame everything in terms of what the customer can now DO, not what you built.
  • Be honest about timelines but do not overcommit. "Later this quarter" is better than a date you might miss.
  • Only mention known issues if they are customer-impacting and you have a resolution plan.

Status Reporting Framework

Green / Yellow / Red Status

Green (On Track):

  • Progressing as planned
  • No significant risks or blockers
  • On track to meet commitments and deadlines
  • Use Green when things are genuinely going well — not as a default

Yellow (At Risk):

  • Progress is slower than planned, or a risk has materialized
  • Mitigation is underway but outcome is uncertain
  • May miss commitments without intervention or scope adjustment
  • Use Yellow proactively — the earlier you flag risk, the more options you have

Red (Off Track):

  • Significantly behind plan
  • Major blocker or risk without clear mitigation
  • Will miss commitments without significant intervention (scope cut, resource addition, timeline extension)
  • Use Red when you genuinely need help. Do not wait until it is too late.

When to Change Status

  • Move to Yellow at the FIRST sign of risk, not when you are sure things are bad
  • Move to Red when you have exhausted your own options and need escalation
  • Move back to Green only when the risk is genuinely resolved, not just paused
  • Document what changed when you change status — "Moved to Yellow because [reason]"

Risk Communication

ROAM Framework for Risk Management

  • Resolved: Risk is no longer a concern. Document how it was resolved.
  • Owned: Risk is acknowledged and someone is actively managing it. State the owner and the mitigation plan.
  • Accepted: Risk is known but we are choosing to proceed without mitigation. Document the rationale.
  • Mitigated: Actions have reduced the risk to an acceptable level. Document what was done.

Communicating Risks Effectively

  1. State the risk clearly: "There is a risk that [thing] happens because [reason]"
  2. Quantify the impact: "If this happens, the consequence is [impact]"
  3. State the likelihood: "This is [likely/possible/unlikely] because [evidence]"
  4. Present the mitigation: "We are managing this by [actions]"
  5. Make the ask: "We need [specific help] to further reduce this risk"

Common Mistakes in Risk Communication

  • Burying risks in good news. Lead with risks when they are important.
  • Being vague: "There might be some delays" — specify what, how long, and why.
  • Presenting risks without mitigations. Every risk should come with a plan.
  • Waiting too long. A risk communicated early is a planning input. A risk communicated late is a fire drill.

Decision Documentation (ADRs)

Architecture Decision Record Format

Document important decisions for future reference:

# [Decision Title]

## Status
[Proposed / Accepted / Deprecated / Superseded by ADR-XXX]

## Context
What is the situation that requires a decision? What forces are at play?

## Decision
What did we decide? State the decision clearly and directly.

## Consequences
What are the implications of this decision?
- Positive consequences
- Negative consequences or tradeoffs accepted
- What this enables or prevents in the future

## Alternatives Considered
What other options were evaluated?
For each: what was it, why was it rejected?

When to Write an ADR

  • Strategic product decisions (which market segment to target, which platform to support)
  • Significant technical decisions (architecture choices, vendor selection, build vs buy)
  • Controversial decisions where people disagreed (document the rationale for future reference)
  • Decisions that constrain future options (choosing a technology, signing a partnership)
  • Decisions you expect people to question later (capture the context while it is fresh)

Tips for Decision Documentation

  • Write ADRs close to when the decision is made, not weeks later
  • Include who was involved in the decision and who made the final call
  • Document the context generously — future readers will not have today's context
  • It is okay to document decisions that were wrong in hindsight — add a "superseded by" link
  • Keep them short. One page is better than five.

Meeting Facilitation

Stand-up / Daily Sync

Purpose: Surface blockers, coordinate work, maintain momentum. Format: Each person shares:

  • What they accomplished since last sync
  • What they are working on next
  • What is blocking them

Facilitation tips:

  • Keep it to 15 minutes. If discussions emerge, take them offline.
  • Focus on blockers — this is the highest-value part of standup
  • Track blockers and follow up on resolution
  • Cancel standup if there is nothing to sync on. Respect people's time.

Sprint / Iteration Planning

Purpose: Commit to work for the next sprint. Align on priorities and scope. Format:

  1. Review: what shipped last sprint, what carried over, what was cut
  2. Priorities: what are the most important things to accomplish this sprint
  3. Capacity: how much can the team take on (account for PTO, on-call, meetings)
  4. Commitment: select items from the backlog that fit capacity and priorities
  5. Dependencies: flag any cross-team or external dependencies

Facilitation tips:

  • Come with a proposed priority order. Do not ask the team to prioritize from scratch.
  • Push back on overcommitment. It is better to commit to less and deliver reliably.
  • Ensure every item has a clear owner and clear acceptance criteria.
  • Flag items that are underscoped or have hidden complexity.

Retrospective

Purpose: Reflect on what went well, what did not, and what to change. Format:

  1. Set the stage: remind the team of the goal and create psychological safety
  2. Gather data: what went well, what did not go well, what was confusing
  3. Generate insights: identify patterns and root causes
  4. Decide actions: pick 1-3 specific improvements to try next sprint
  5. Close: thank people for honest feedback

Facilitation tips:

  • Create psychological safety. People must feel safe to be honest.
  • Focus on systems and processes, not individuals.
  • Limit to 1-3 action items. More than that and nothing changes.
  • Follow up on previous retro action items. If you never follow up, people stop engaging.
  • Vary the retro format occasionally to prevent staleness.

Stakeholder Review / Demo

Purpose: Show progress, gather feedback, build alignment. Format:

  1. Context: remind stakeholders of the goal and what they saw last time
  2. Demo: show what was built. Use real product, not slides.
  3. Metrics: share any early data or feedback
  4. Feedback: structured time for questions and input
  5. Next steps: what is coming next and when the next review will be

Facilitation tips:

  • Demo the real product whenever possible. Slides are not demos.
  • Frame feedback collection: "What feedback do you have on X?" is better than "Any thoughts?"
  • Capture feedback visibly and commit to addressing it (or explaining why not)
  • Set expectations about what kind of feedback is actionable at this stage

Output Format

Keep updates scannable. Use bold for key points, bullets for lists. Executive updates should be under 300 words. Engineering updates can be longer but should still be structured for skimming.

Tips

  • The most common mistake in stakeholder updates is burying the lead. Start with the most important thing.
  • Status colors (Green/Yellow/Red) should reflect reality, not optimism. Yellow is not a failure — it is good risk communication.
  • Asks should be specific and actionable. "We need help" is not an ask. "We need a decision on X by Friday" is.
  • For executives, frame everything in terms of outcomes and goals, not activities and tasks.
  • If there is bad news, lead with it. Do not hide it after good news.
  • Match the length to the audience's attention. Executives get a few bullets. Engineering gets the details they need.
将访谈、调查及反馈等原始用户研究数据转化为结构化洞察。提取关键主题与痛点,按频率和影响度排序,生成优先级矩阵及包含证据、置信度的详细发现报告,辅助产品路线图决策。
整理大量访谈笔记或调查回复 从杂乱反馈中提取核心主题 将原始反馈转化为产品路线图建议 需要评估用户需求的影响程度
product-management/skills/synthesize-research/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill synthesize-research -g -y
SKILL.md
Frontmatter
{
    "name": "synthesize-research",
    "description": "Synthesize user research from interviews, surveys, and feedback into structured insights. Use when you have a pile of interview notes, survey responses, or support tickets to make sense of, need to extract themes and rank findings by frequency and impact, or want to turn raw feedback into roadmap recommendations.",
    "argument-hint": "<research topic or question>"
}

Synthesize Research

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Synthesize user research from multiple sources into structured insights and recommendations.

Usage

/synthesize-research $ARGUMENTS

Workflow

1. Gather Research Inputs

Accept research from any combination of:

  • Pasted text: Interview notes, transcripts, survey responses, feedback
  • Uploaded files: Research documents, spreadsheets, recordings summaries
  • ~~knowledge base (if connected): Search for research documents, interview notes, survey results
  • ~~user feedback (if connected): Pull recent support tickets, feature requests, bug reports
  • ~~product analytics (if connected): Pull usage data, funnel metrics, behavioral data
  • ~~meeting transcription (if connected): Pull interview recordings, meeting summaries, and discussion notes

Ask the user what they have:

  • What type of research? (interviews, surveys, usability tests, analytics, support tickets, sales call notes)
  • How many sources / participants?
  • Is there a specific question or hypothesis they are investigating?
  • What decisions will this research inform?

2. Process the Research

For each source, extract:

  • Key observations: What did users say, do, or experience?
  • Quotes: Verbatim quotes that illustrate important points
  • Behaviors: What users actually did (vs what they said they do)
  • Pain points: Frustrations, workarounds, and unmet needs
  • Positive signals: What works well, moments of delight
  • Context: User segment, use case, experience level

3. Identify Themes and Patterns

Apply thematic analysis — see Research Synthesis Methodology below for detailed guidance on thematic analysis, affinity mapping, and triangulation techniques.

Group observations into themes, count frequency across participants, and assess impact severity. Note contradictions and surprises.

Create a priority matrix:

  • High frequency + High impact: Top priority findings
  • Low frequency + High impact: Important for specific segments
  • High frequency + Low impact: Quality-of-life improvements
  • Low frequency + Low impact: Note but deprioritize

4. Generate the Synthesis

Produce a structured research synthesis:

Research Overview

  • Methodology: what types of research, how many participants/sources
  • Research question(s): what we set out to learn
  • Timeframe: when the research was conducted

Key Findings

For each major finding (aim for 5-8):

  • Finding statement: One clear sentence describing the insight
  • Evidence: Supporting quotes, data points, or observations (with source attribution)
  • Frequency: How many participants/sources support this finding
  • Impact: How significantly this affects the user experience or business
  • Confidence level: High (strong evidence), Medium (suggestive), Low (early signal)

Order findings by priority (frequency x impact).

User Segments / Personas

If the research reveals distinct user segments:

  • Segment name and description
  • Key characteristics and behaviors
  • Unique needs and pain points
  • Size estimate if data is available

Opportunity Areas

Based on the findings, identify opportunity areas:

  • What user needs are unmet or underserved
  • Where do current solutions fall short
  • What new capabilities would unlock value
  • Prioritized by potential impact

Recommendations

Specific, actionable recommendations:

  • What to build, change, or investigate further
  • Tied back to specific findings
  • Prioritized by impact and feasibility

Open Questions

What the research did not answer:

  • Gaps in understanding
  • Areas needing further investigation
  • Suggested follow-up research methods

5. Review and Extend

After generating the synthesis:

  • Ask if any findings need more detail or different framing
  • Offer to generate specific artifacts: persona documents, opportunity maps, research presentations
  • Offer to create follow-up research plans for open questions
  • Offer to draft product implications (how findings should influence the roadmap)

Research Synthesis Methodology

Thematic Analysis

The core method for synthesizing qualitative research:

  1. Familiarization: Read through all the data. Get a feel for the overall landscape before coding anything.
  2. Initial coding: Go through the data systematically. Tag each observation, quote, or data point with descriptive codes. Be generous with codes — it is easier to merge than to split later.
  3. Theme development: Group related codes into candidate themes. A theme captures something important about the data in relation to the research question.
  4. Theme review: Check themes against the data. Does each theme have sufficient evidence? Are themes distinct from each other? Do they tell a coherent story?
  5. Theme refinement: Define and name each theme clearly. Write a 1-2 sentence description of what each theme captures.
  6. Report: Write up the themes as findings with supporting evidence.

Affinity Mapping

A collaborative method for grouping observations:

  1. Capture observations: Write each distinct observation, quote, or data point as a separate note
  2. Cluster: Group related notes together based on similarity. Do not pre-define categories — let them emerge from the data.
  3. Label clusters: Give each cluster a descriptive name that captures the common thread
  4. Organize clusters: Arrange clusters into higher-level groups if patterns emerge
  5. Identify themes: The clusters and their relationships reveal the key themes

Tips for affinity mapping:

  • One observation per note. Do not combine multiple insights.
  • Move notes between clusters freely. The first grouping is rarely the best.
  • If a cluster gets too large, it probably contains multiple themes. Split it.
  • Outliers are interesting. Do not force every observation into a cluster.
  • The process of grouping is as valuable as the output. It builds shared understanding.

Triangulation

Strengthen findings by combining multiple data sources:

  • Methodological triangulation: Same question, different methods (interviews + survey + analytics)
  • Source triangulation: Same method, different participants or segments
  • Temporal triangulation: Same observation at different points in time

A finding supported by multiple sources and methods is much stronger than one supported by a single source. When sources disagree, that is interesting — it may reveal different user segments or contexts.

Interview Note Analysis

Extracting Insights from Interview Notes

For each interview, identify:

Observations: What did the participant describe doing, experiencing, or feeling?

  • Distinguish between behaviors (what they do) and attitudes (what they think/feel)
  • Note context: when, where, with whom, how often
  • Flag workarounds — these are unmet needs in disguise

Direct quotes: Verbatim statements that powerfully illustrate a point

  • Good quotes are specific and vivid, not generic
  • Attribute to participant type, not name: "Enterprise admin, 200-person team" not "Sarah"
  • A quote is evidence, not a finding. The finding is your interpretation of what the quote means.

Behaviors vs stated preferences: What people DO often differs from what they SAY they want

  • Behavioral observations are stronger evidence than stated preferences
  • If a participant says "I want feature X" but their workflow shows they never use similar features, note the contradiction
  • Look for revealed preferences through actual behavior

Signals of intensity: How much does this matter to the participant?

  • Emotional language: frustration, excitement, resignation
  • Frequency: how often do they encounter this issue
  • Workarounds: how much effort do they expend working around the problem
  • Impact: what is the consequence when things go wrong

Cross-Interview Analysis

After processing individual interviews:

  • Look for patterns: which observations appear across multiple participants?
  • Note frequency: how many participants mentioned each theme?
  • Identify segments: do different types of users have different patterns?
  • Surface contradictions: where do participants disagree? This often reveals meaningful segments.
  • Find surprises: what challenged your prior assumptions?

Survey Data Interpretation

Quantitative Survey Analysis

  • Response rate: How representative is the sample? Low response rates may introduce bias.
  • Distribution: Look at the shape of responses, not just averages. A bimodal distribution (lots of 1s and 5s) tells a different story than a normal distribution (lots of 3s).
  • Segmentation: Break down responses by user segment. Aggregates can mask important differences.
  • Statistical significance: For small samples, be cautious about drawing conclusions from small differences.
  • Benchmark comparison: How do scores compare to industry benchmarks or previous surveys?

Open-Ended Survey Response Analysis

  • Treat open-ended responses like mini interview notes
  • Code each response with themes
  • Count frequency of themes across responses
  • Pull representative quotes for each theme
  • Look for themes that appear in open-ended responses but not in structured questions — these are things you did not think to ask about

Common Survey Analysis Mistakes

  • Reporting averages without distributions. A 3.5 average could mean everyone is lukewarm or half love it and half hate it.
  • Ignoring non-response bias. The people who did not respond may be systematically different.
  • Over-interpreting small differences. A 0.1 point change in NPS is noise, not signal.
  • Treating Likert scales as interval data. The difference between "Strongly Agree" and "Agree" is not necessarily the same as between "Agree" and "Neutral."
  • Confusing correlation with causation in cross-tabulations.

Combining Qualitative and Quantitative Insights

The Qual-Quant Feedback Loop

  • Qualitative first: Interviews and observation reveal WHAT is happening and WHY. They generate hypotheses.
  • Quantitative validation: Surveys and analytics reveal HOW MUCH and HOW MANY. They test hypotheses at scale.
  • Qualitative deep-dive: Return to qualitative methods to understand unexpected quantitative findings.

Integration Strategies

  • Use quantitative data to prioritize qualitative findings. A theme from interviews is more important if usage data shows it affects many users.
  • Use qualitative data to explain quantitative anomalies. A drop in retention is a number; interviews reveal it is because of a confusing onboarding change.
  • Present combined evidence: "47% of surveyed users report difficulty with X (survey), and interviews reveal this is because Y (qualitative finding)."

When Sources Disagree

  • Quantitative and qualitative sources may tell different stories. This is signal, not error.
  • Check if the disagreement is due to different populations being measured
  • Check if stated preferences (survey) differ from actual behavior (analytics)
  • Check if the quantitative question captured what you think it captured
  • Report the disagreement honestly and investigate further rather than choosing one source

Persona Development from Research

Building Evidence-Based Personas

Personas should emerge from research data, not imagination:

  1. Identify behavioral patterns: Look for clusters of similar behaviors, goals, and contexts across participants
  2. Define distinguishing variables: What dimensions differentiate one cluster from another? (e.g., company size, technical skill, usage frequency, primary use case)
  3. Create persona profiles: For each behavioral cluster:
    • Name and brief description
    • Key behaviors and goals
    • Pain points and needs
    • Context (role, company, tools used)
    • Representative quotes
  4. Validate with data: Can you size each persona segment using quantitative data?

Persona Template

[Persona Name] — [One-line description]

Who they are:
- Role, company type/size, experience level
- How they found/started using the product

What they are trying to accomplish:
- Primary goals and jobs to be done
- How they measure success

How they use the product:
- Frequency and depth of usage
- Key workflows and features used
- Tools they use alongside this product

Key pain points:
- Top 3 frustrations or unmet needs
- Workarounds they have developed

What they value:
- What matters most in a solution
- What would make them switch or churn

Representative quotes:
- 2-3 verbatim quotes that capture this persona's perspective

Common Persona Mistakes

  • Demographic personas: defining by age/gender/location instead of behavior. Behavior predicts product needs better than demographics.
  • Too many personas: 3-5 is the sweet spot. More than that and they are not actionable.
  • Fictional personas: made up based on assumptions rather than research data.
  • Static personas: never updated as the product and market evolve.
  • Personas without implications: a persona that does not change any product decisions is not useful.

Opportunity Sizing

Estimating Opportunity Size

For each research finding or opportunity area, estimate:

  • Addressable users: How many users could benefit from addressing this? Use product analytics, survey data, or market data to estimate.
  • Frequency: How often do affected users encounter this issue? (Daily, weekly, monthly, one-time)
  • Severity: How much does this issue impact users when it occurs? (Blocker, significant friction, minor annoyance)
  • Willingness to pay: Would addressing this drive upgrades, retention, or new customer acquisition?

Opportunity Scoring

Score opportunities on a simple matrix:

  • Impact: (Users affected) x (Frequency) x (Severity) = impact score
  • Evidence strength: How confident are we in the finding? (Multiple sources > single source, behavioral data > stated preferences)
  • Strategic alignment: Does this opportunity align with company strategy and product vision?
  • Feasibility: Can we realistically address this? (Technical feasibility, resource availability, time to impact)

Presenting Opportunity Sizing

  • Be transparent about assumptions and confidence levels
  • Show the math: "Based on support ticket volume, approximately 2,000 users per month encounter this issue. Interview data suggests 60% of them consider it a significant blocker."
  • Use ranges rather than false precision: "This affects 1,500-2,500 users monthly" not "This affects 2,137 users monthly"
  • Compare opportunities against each other to create a relative ranking, not just absolute scores

Output Format

Use clear headers and structured formatting. Each finding should stand on its own — a reader should be able to read any single finding and understand it without reading the rest.

Tips

  • Let the data speak. Do not force findings into a predetermined narrative.
  • Distinguish between what users say and what they do. Behavioral data is stronger than stated preferences.
  • Quotes are powerful evidence. Include them generously, with attribution to participant type (not name).
  • Be explicit about confidence levels. A finding from 2 interviews is a hypothesis, not a conclusion.
  • Contradictions in the data are interesting, not inconvenient. They often reveal distinct user segments.
  • Recommendations should be specific enough to act on. "Improve onboarding" is not actionable. "Add a progress indicator to the setup flow" is.
  • Resist the temptation to synthesize too many themes. 5-8 strong findings are better than 20 weak ones.
将模糊想法或需求转化为结构化PRD。通过对话收集背景、目标和约束,集成工具上下文,生成包含问题陈述、目标、用户故事及成功指标的规范文档,并支持迭代修订。
将模糊想法转化为规范文档 定义功能范围与成功指标 将大需求拆解为分阶段规范
product-management/skills/write-spec/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill write-spec -g -y
SKILL.md
Frontmatter
{
    "name": "write-spec",
    "description": "Write a feature spec or PRD from a problem statement or feature idea. Use when turning a vague idea or user request into a structured document, scoping a feature with goals and non-goals, defining success metrics and acceptance criteria, or breaking a big ask into a phased spec.",
    "argument-hint": "<feature or problem statement>"
}

Write Spec

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Write a feature specification or product requirements document (PRD).

Usage

/write-spec $ARGUMENTS

Workflow

1. Understand the Feature

Ask the user what they want to spec. Accept any of:

  • A feature name ("SSO support")
  • A problem statement ("Enterprise customers keep asking for centralized auth")
  • A user request ("Users want to export their data as CSV")
  • A vague idea ("We should do something about onboarding drop-off")

2. Gather Context

Ask the user for the following. Be conversational — do not dump all questions at once. Ask the most important ones first and fill in gaps as you go:

  • User problem: What problem does this solve? Who experiences it?
  • Target users: Which user segment(s) does this serve?
  • Success metrics: How will we know this worked?
  • Constraints: Technical constraints, timeline, regulatory requirements, dependencies
  • Prior art: Has this been attempted before? Are there existing solutions?

3. Pull Context from Connected Tools

If ~~project tracker is connected:

  • Search for related tickets, epics, or features
  • Pull in any existing requirements or acceptance criteria
  • Identify dependencies on other work items

If ~~knowledge base is connected:

  • Search for related research documents, prior specs, or design docs
  • Pull in relevant user research findings
  • Find related meeting notes or decision records

If ~~design is connected:

  • Pull related mockups, wireframes, or design explorations
  • Search for design system components relevant to the feature

If these tools are not connected, work entirely from what the user provides. Do not ask the user to connect tools — just proceed with available information.

4. Generate the PRD

Produce a structured PRD with these sections. See PRD Structure below for detailed guidance on what each section should contain.

  • Problem Statement: The user problem, who is affected, and impact of not solving it (2-3 sentences)
  • Goals: 3-5 specific, measurable outcomes tied to user or business metrics
  • Non-Goals: 3-5 things explicitly out of scope, with brief rationale for each
  • User Stories: Standard format ("As a [user type], I want [capability] so that [benefit]"), grouped by persona
  • Requirements: Categorized as Must-Have (P0), Nice-to-Have (P1), and Future Considerations (P2), each with acceptance criteria
  • Success Metrics: Leading indicators (change quickly) and lagging indicators (change over time), with specific targets
  • Open Questions: Unresolved questions tagged with who needs to answer (engineering, design, legal, data)
  • Timeline Considerations: Hard deadlines, dependencies, and phasing

5. Review and Iterate

After generating the PRD:

  • Ask the user if any sections need adjustment
  • Offer to expand on specific sections
  • Offer to create follow-up artifacts (design brief, engineering ticket breakdown, stakeholder pitch)

PRD Structure

Problem Statement

  • Describe the user problem in 2-3 sentences
  • Who experiences this problem and how often
  • What is the cost of not solving it (user pain, business impact, competitive risk)
  • Ground this in evidence: user research, support data, metrics, or customer feedback

Goals

  • 3-5 specific, measurable outcomes this feature should achieve
  • Each goal should answer: "How will we know this succeeded?"
  • Distinguish between user goals (what users get) and business goals (what the company gets)
  • Goals should be outcomes, not outputs ("reduce time to first value by 50%" not "build onboarding wizard")

Non-Goals

  • 3-5 things this feature explicitly will NOT do
  • Adjacent capabilities that are out of scope for this version
  • For each non-goal, briefly explain why it is out of scope (not enough impact, too complex, separate initiative, premature)
  • Non-goals prevent scope creep during implementation and set expectations with stakeholders

User Stories

Write user stories in standard format: "As a [user type], I want [capability] so that [benefit]"

Guidelines:

  • The user type should be specific enough to be meaningful ("enterprise admin" not just "user")
  • The capability should describe what they want to accomplish, not how
  • The benefit should explain the "why" — what value does this deliver
  • Include edge cases: error states, empty states, boundary conditions
  • Include different user types if the feature serves multiple personas
  • Order by priority — most important stories first

Example:

  • "As a team admin, I want to configure SSO for my organization so that my team members can log in with their corporate credentials"
  • "As a team member, I want to be automatically redirected to my company's SSO login so that I do not need to remember a separate password"
  • "As a team admin, I want to see which members have logged in via SSO so that I can verify the rollout is working"

Requirements

Must-Have (P0): The feature cannot ship without these. These represent the minimum viable version of the feature. Ask: "If we cut this, does the feature still solve the core problem?" If no, it is P0.

Nice-to-Have (P1): Significantly improves the experience but the core use case works without them. These often become fast follow-ups after launch.

Future Considerations (P2): Explicitly out of scope for v1 but we want to design in a way that supports them later. Documenting these prevents accidental architectural decisions that make them hard later.

For each requirement:

  • Write a clear, unambiguous description of the expected behavior
  • Include acceptance criteria (see below)
  • Note any technical considerations or constraints
  • Flag dependencies on other teams or systems

Open Questions

  • Questions that need answers before or during implementation
  • Tag each with who should answer (engineering, design, legal, data, stakeholder)
  • Distinguish between blocking questions (must answer before starting) and non-blocking (can resolve during implementation)

Timeline Considerations

  • Hard deadlines (contractual commitments, events, compliance dates)
  • Dependencies on other teams' work or releases
  • Suggested phasing if the feature is too large for one release

User Story Writing

Good user stories are:

  • Independent: Can be developed and delivered on their own
  • Negotiable: Details can be discussed, the story is not a contract
  • Valuable: Delivers value to the user (not just the team)
  • Estimable: The team can roughly estimate the effort
  • Small: Can be completed in one sprint/iteration
  • Testable: There is a clear way to verify it works

Common Mistakes in User Stories

  • Too vague: "As a user, I want the product to be faster" — what specifically should be faster?
  • Solution-prescriptive: "As a user, I want a dropdown menu" — describe the need, not the UI widget
  • No benefit: "As a user, I want to click a button" — why? What does it accomplish?
  • Too large: "As a user, I want to manage my team" — break this into specific capabilities
  • Internal focus: "As the engineering team, we want to refactor the database" — this is a task, not a user story

Requirements Categorization

MoSCoW Framework

  • Must have: Without these, the feature is not viable. Non-negotiable.
  • Should have: Important but not critical for launch. High-priority fast follows.
  • Could have: Desirable if time permits. Will not delay delivery if cut.
  • Won't have (this time): Explicitly out of scope. May revisit in future versions.

Tips for Categorization

  • Be ruthless about P0s. The tighter the must-have list, the faster you ship and learn.
  • If everything is P0, nothing is P0. Challenge every must-have: "Would we really not ship without this?"
  • P1s should be things you are confident you will build soon, not a wish list.
  • P2s are architectural insurance — they guide design decisions even though you are not building them now.

Success Metrics Definition

Leading Indicators

Metrics that change quickly after launch (days to weeks):

  • Adoption rate: % of eligible users who try the feature
  • Activation rate: % of users who complete the core action
  • Task completion rate: % of users who successfully accomplish their goal
  • Time to complete: How long the core workflow takes
  • Error rate: How often users encounter errors or dead ends
  • Feature usage frequency: How often users return to use the feature

Lagging Indicators

Metrics that take time to develop (weeks to months):

  • Retention impact: Does this feature improve user retention?
  • Revenue impact: Does this drive upgrades, expansion, or new revenue?
  • NPS / satisfaction change: Does this improve how users feel about the product?
  • Support ticket reduction: Does this reduce support load?
  • Competitive win rate: Does this help win more deals?

Setting Targets

  • Targets should be specific: "50% adoption within 30 days" not "high adoption"
  • Base targets on comparable features, industry benchmarks, or explicit hypotheses
  • Set a "success" threshold and a "stretch" target
  • Define the measurement method: what tool, what query, what time window
  • Specify when you will evaluate: 1 week, 1 month, 1 quarter post-launch

Acceptance Criteria

Write acceptance criteria in Given/When/Then format or as a checklist:

Given/When/Then:

  • Given [precondition or context]
  • When [action the user takes]
  • Then [expected outcome]

Example:

  • Given the admin has configured SSO for their organization
  • When a team member visits the login page
  • Then they are automatically redirected to the organization's SSO provider

Checklist format:

  • Admin can enter SSO provider URL in organization settings
  • Team members see "Log in with SSO" button on login page
  • SSO login creates a new account if one does not exist
  • SSO login links to existing account if email matches
  • Failed SSO attempts show a clear error message

Tips for Acceptance Criteria

  • Cover the happy path, error cases, and edge cases
  • Be specific about the expected behavior, not the implementation
  • Include what should NOT happen (negative test cases)
  • Each criterion should be independently testable
  • Avoid ambiguous words: "fast", "user-friendly", "intuitive" — define what these mean concretely

Scope Management

Recognizing Scope Creep

Scope creep happens when:

  • Requirements keep getting added after the spec is approved
  • "Small" additions accumulate into a significantly larger project
  • The team is building features no user asked for ("while we're at it...")
  • The launch date keeps moving without explicit re-scoping
  • Stakeholders add requirements without removing anything

Preventing Scope Creep

  • Write explicit non-goals in every spec
  • Require that any scope addition comes with a scope removal or timeline extension
  • Separate "v1" from "v2" clearly in the spec
  • Review the spec against the original problem statement — does everything serve it?
  • Time-box investigations: "If we cannot figure out X in 2 days, we cut it"
  • Create a "parking lot" for good ideas that are not in scope

Output Format

Use markdown with clear headers. Keep the document scannable — busy stakeholders should be able to read just the headers and bold text to get the gist.

Tips

  • Be opinionated about scope. It is better to have a tight, well-defined spec than an expansive vague one.
  • If the user's idea is too big for one spec, suggest breaking it into phases and spec the first phase.
  • Success metrics should be specific and measurable, not vague ("improve user experience").
  • Non-goals are as important as goals. They prevent scope creep during implementation.
  • Open questions should be genuinely open — do not include questions you can answer from context.
构建两级记忆系统,将内部简写解码为完整语义。CLAUDE.md作热缓存覆盖高频信息,memory/目录存储全量知识库,通过分层检索实现精准理解与协作。
需要理解内部术语或缩写 查询同事、项目背景信息 建立长期工作记忆偏好
productivity/skills/memory-management/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill memory-management -g -y
SKILL.md
Frontmatter
{
    "name": "memory-management",
    "description": "Two-tier memory system that makes Claude a true workplace collaborator. Decodes shorthand, acronyms, nicknames, and internal language so Claude understands requests like a colleague would. CLAUDE.md for working memory, memory\/ directory for the full knowledge base.",
    "user-invocable": false
}

Memory Management

Memory makes Claude your workplace collaborator - someone who speaks your internal language.

The Goal

Transform shorthand into understanding:

User: "ask todd to do the PSR for oracle"
              ↓ Claude decodes
"Ask Todd Martinez (Finance lead) to prepare the Pipeline Status Report
 for the Oracle Systems deal ($2.3M, closing Q2)"

Without memory, that request is meaningless. With memory, Claude knows:

  • todd → Todd Martinez, Finance lead, prefers Slack
  • PSR → Pipeline Status Report (weekly sales doc)
  • oracle → Oracle Systems deal, not the company

Architecture

CLAUDE.md          ← Hot cache (~30 people, common terms)
memory/
  glossary.md      ← Full decoder ring (everything)
  people/          ← Complete profiles
  projects/        ← Project details
  context/         ← Company, teams, tools

CLAUDE.md (Hot Cache):

  • Top ~30 people you interact with most
  • ~30 most common acronyms/terms
  • Active projects (5-15)
  • Your preferences
  • Goal: Cover 90% of daily decoding needs

memory/glossary.md (Full Glossary):

  • Complete decoder ring - everyone, every term
  • Searched when something isn't in CLAUDE.md
  • Can grow indefinitely

memory/people/, projects/, context/:

  • Rich detail when needed for execution
  • Full profiles, history, context

Lookup Flow

User: "ask todd about the PSR for phoenix"

1. Check CLAUDE.md (hot cache)
   → Todd? ✓ Todd Martinez, Finance
   → PSR? ✓ Pipeline Status Report
   → Phoenix? ✓ DB migration project

2. If not found → search memory/glossary.md
   → Full glossary has everyone/everything

3. If still not found → ask user
   → "What does X mean? I'll remember it."

This tiered approach keeps CLAUDE.md lean (~100 lines) while supporting unlimited scale in memory/.

File Locations

  • Working memory: CLAUDE.md in current working directory
  • Deep memory: memory/ subdirectory

Working Memory Format (CLAUDE.md)

Use tables for compactness. Target ~50-80 lines total.

# Memory

## Me
[Name], [Role] on [Team]. [One sentence about what I do.]

## People
| Who | Role |
|-----|------|
| **Todd** | Todd Martinez, Finance lead |
| **Sarah** | Sarah Chen, Engineering (Platform) |
| **Greg** | Greg Wilson, Sales |
→ Full list: memory/glossary.md, profiles: memory/people/

## Terms
| Term | Meaning |
|------|---------|
| PSR | Pipeline Status Report |
| P0 | Drop everything priority |
| standup | Daily 9am sync |
→ Full glossary: memory/glossary.md

## Projects
| Name | What |
|------|------|
| **Phoenix** | DB migration, Q2 launch |
| **Horizon** | Mobile app redesign |
→ Details: memory/projects/

## Preferences
- 25-min meetings with buffers
- Async-first, Slack over email
- No meetings Friday afternoons

Deep Memory Format (memory/)

memory/glossary.md - The decoder ring:

# Glossary

Workplace shorthand, acronyms, and internal language.

## Acronyms
| Term | Meaning | Context |
|------|---------|---------|
| PSR | Pipeline Status Report | Weekly sales doc |
| OKR | Objectives & Key Results | Quarterly planning |
| P0/P1/P2 | Priority levels | P0 = drop everything |

## Internal Terms
| Term | Meaning |
|------|---------|
| standup | Daily 9am sync in #engineering |
| the migration | Project Phoenix database work |
| ship it | Deploy to production |
| escalate | Loop in leadership |

## Nicknames → Full Names
| Nickname | Person |
|----------|--------|
| Todd | Todd Martinez (Finance) |
| T | Also Todd Martinez |

## Project Codenames
| Codename | Project |
|----------|---------|
| Phoenix | Database migration |
| Horizon | New mobile app |

memory/people/{name}.md:

# Todd Martinez

**Also known as:** Todd, T
**Role:** Finance Lead
**Team:** Finance
**Reports to:** CFO (Michael Chen)

## Communication
- Prefers Slack DM
- Quick responses, very direct
- Best time: mornings

## Context
- Handles all PSRs and financial reporting
- Key contact for deal approvals over $500k
- Works closely with Sales on forecasting

## Notes
- Cubs fan, likes talking baseball

memory/projects/{name}.md:

# Project Phoenix

**Codename:** Phoenix
**Also called:** "the migration"
**Status:** Active, launching Q2

## What It Is
Database migration from legacy Oracle to PostgreSQL.

## Key People
- Sarah - tech lead
- Todd - budget owner
- Greg - stakeholder (sales impact)

## Context
$1.2M budget, 6-month timeline. Critical path for Horizon project.

memory/context/company.md:

# Company Context

## Tools & Systems
| Tool | Used for | Internal name |
|------|----------|---------------|
| Slack | Communication | - |
| Asana | Engineering tasks | - |
| Salesforce | CRM | "SF" or "the CRM" |
| Notion | Docs/wiki | - |

## Teams
| Team | What they do | Key people |
|------|--------------|------------|
| Platform | Infrastructure | Sarah (lead) |
| Finance | Money stuff | Todd (lead) |
| Sales | Revenue | Greg |

## Processes
| Process | What it means |
|---------|---------------|
| Weekly sync | Monday 10am all-hands |
| Ship review | Thursday deploy approval |

How to Interact

Decoding User Input (Tiered Lookup)

Always decode shorthand before acting on requests:

1. CLAUDE.md (hot cache)     → Check first, covers 90% of cases
2. memory/glossary.md        → Full glossary if not in hot cache
3. memory/people/, projects/ → Rich detail when needed
4. Ask user                  → Unknown term? Learn it.

Example:

User: "ask todd to do the PSR for oracle"

CLAUDE.md lookup:
  "todd" → Todd Martinez, Finance ✓
  "PSR" → Pipeline Status Report ✓
  "oracle" → (not in hot cache)

memory/glossary.md lookup:
  "oracle" → Oracle Systems deal ($2.3M) ✓

Now Claude can act with full context.

Adding Memory

When user says "remember this" or "X means Y":

  1. Glossary items (acronyms, terms, shorthand):

    • Add to memory/glossary.md
    • If frequently used, add to CLAUDE.md Quick Glossary
  2. People:

    • Create/update memory/people/{name}.md
    • Add to CLAUDE.md Key People if important
    • Capture nicknames - critical for decoding
  3. Projects:

    • Create/update memory/projects/{name}.md
    • Add to CLAUDE.md Active Projects if current
    • Capture codenames - "Phoenix", "the migration", etc.
  4. Preferences: Add to CLAUDE.md Preferences section

Recalling Memory

When user asks "who is X" or "what does X mean":

  1. Check CLAUDE.md first
  2. Check memory/ for full detail
  3. If not found: "I don't know what X means yet. Can you tell me?"

Progressive Disclosure

  1. Load CLAUDE.md for quick parsing of any request
  2. Dive into memory/ when you need full context for execution
  3. Example: drafting an email to todd about the PSR
    • CLAUDE.md tells you Todd = Todd Martinez, PSR = Pipeline Status Report
    • memory/people/todd-martinez.md tells you he prefers Slack, is direct

Bootstrapping

Use /productivity:start to initialize by scanning your chat, calendar, email, and documents. Extracts people, projects, and starts building the glossary.

Conventions

  • Bold terms in CLAUDE.md for scannability
  • Keep CLAUDE.md under ~100 lines (the "hot 30" rule)
  • Filenames: lowercase, hyphens (todd-martinez.md, project-phoenix.md)
  • Always capture nicknames and alternate names
  • Glossary tables for easy lookup
  • When something's used frequently, promote it to CLAUDE.md
  • When something goes stale, demote it to memory/ only

What Goes Where

Type CLAUDE.md (Hot Cache) memory/ (Full Storage)
Person Top ~30 frequent contacts glossary.md + people/{name}.md
Acronym/term ~30 most common glossary.md (complete list)
Project Active projects only glossary.md + projects/{name}.md
Nickname In Key People if top 30 glossary.md (all nicknames)
Company context Quick reference only context/company.md
Preferences All preferences -
Historical/stale ✗ Remove ✓ Keep in memory/

Promotion / Demotion

Promote to CLAUDE.md when:

  • You use a term/person frequently
  • It's part of active work

Demote to memory/ only when:

  • Project completed
  • Person no longer frequent contact
  • Term rarely used

This keeps CLAUDE.md fresh and relevant.

初始化生产力系统,检查并创建缺失的任务列表、记忆文件和仪表盘。首次运行时引导用户解码任务中的缩写和术语以建立上下文,最后打开仪表盘供用户使用。
首次设置插件或初始化系统 需要从现有任务列表引导工作记忆 需要解码待办事项中的缩写和项目代号
productivity/skills/start/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill start -g -y
SKILL.md
Frontmatter
{
    "name": "start",
    "description": "Initialize the productivity system and open the dashboard. Use when setting up the plugin for the first time, bootstrapping working memory from your existing task list, or decoding the shorthand (nicknames, acronyms, project codenames) you use in your todos."
}

Start Command

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Initialize the task and memory systems, then open the unified dashboard.

Instructions

1. Check What Exists

Check the working directory for:

  • TASKS.md — task list
  • CLAUDE.md — working memory
  • memory/ — deep memory directory
  • dashboard.html — the visual UI

2. Create What's Missing

If TASKS.md doesn't exist: Create it with the standard template (see task-management skill). Place it in the current working directory.

If dashboard.html doesn't exist: Copy it from ${CLAUDE_PLUGIN_ROOT}/skills/dashboard.html to the current working directory.

If CLAUDE.md and memory/ don't exist: This is a fresh setup — after opening the dashboard, begin the memory bootstrap workflow (see below). Place these in the current working directory.

3. Open the Dashboard

Do NOT use open or xdg-open — in Cowork, the agent runs in a VM and shell open commands won't reach the user's browser. Instead, tell the user: "Dashboard is ready at dashboard.html. Open it from your file browser to get started."

4. Orient the User

If everything was already initialized:

Dashboard open. Your tasks and memory are both loaded.
- /productivity:update to sync tasks and check memory
- /productivity:update --comprehensive for a deep scan of all activity

If memory hasn't been bootstrapped yet, continue to step 5.

5. Bootstrap Memory (First Run Only)

Only do this if CLAUDE.md and memory/ don't exist yet.

The best source of workplace language is the user's actual task list. Real tasks = real shorthand.

Ask the user:

Where do you keep your todos or task list? This could be:
- A local file (e.g., TASKS.md, todo.txt)
- An app (e.g. Asana, Linear, Jira, Notion, Todoist)
- A notes file

I'll use your tasks to learn your workplace shorthand.

Once you have access to the task list:

For each task item, analyze it for potential shorthand:

  • Names that might be nicknames
  • Acronyms or abbreviations
  • Project references or codenames
  • Internal terms or jargon

For each item, decode it interactively:

Task: "Send PSR to Todd re: Phoenix blockers"

I see some terms I want to make sure I understand:

1. **PSR** - What does this stand for?
2. **Todd** - Who is Todd? (full name, role)
3. **Phoenix** - Is this a project codename? What's it about?

Continue through each task, asking only about terms you haven't already decoded.

6. Optional Comprehensive Scan

After task list decoding, offer:

Do you want me to do a comprehensive scan of your messages, emails, and documents?
This takes longer but builds much richer context about the people, projects, and terms in your work.

Or we can stick with what we have and add context later.

If they choose comprehensive scan:

Gather data from available MCP sources:

  • Chat: Recent messages, channels, DMs
  • Email: Sent messages, recipients
  • Documents: Recent docs, collaborators
  • Calendar: Meetings, attendees

Build a braindump of people, projects, and terms found. Present findings grouped by confidence:

  • Ready to add (high confidence) — offer to add directly
  • Needs clarification — ask the user
  • Low frequency / unclear — note for later

7. Write Memory Files

From everything gathered, create:

CLAUDE.md (working memory, ~50-80 lines):

# Memory

## Me
[Name], [Role] on [Team].

## People
| Who | Role |
|-----|------|
| **[Nickname]** | [Full Name], [role] |

## Terms
| Term | Meaning |
|------|---------|
| [acronym] | [expansion] |

## Projects
| Name | What |
|------|------|
| **[Codename]** | [description] |

## Preferences
- [preferences discovered]

memory/ directory:

  • memory/glossary.md — full decoder ring (acronyms, terms, nicknames, codenames)
  • memory/people/{name}.md — individual profiles
  • memory/projects/{name}.md — project details
  • memory/context/company.md — teams, tools, processes

8. Report Results

Productivity system ready:
- Tasks: TASKS.md (X items)
- Memory: X people, X terms, X projects
- Dashboard: open in browser

Use /productivity:update to keep things current (add --comprehensive for a deep scan).

Notes

  • If memory is already initialized, this just opens the dashboard
  • Nicknames are critical — always capture how people are actually referred to
  • If a source isn't available, skip it and note the gap
  • Memory grows organically through natural conversation after bootstrap
基于本地TASKS.md文件的简易任务管理技能。支持查看、添加、完成及追踪任务,提供待办、等待中、将来和已完成分类。首次使用时可初始化可视化Dashboard,支持从对话中提取并确认添加任务项。
用户询问当前任务或工作负载 用户要求添加新任务或设置提醒 用户报告任务完成需更新状态 用户查询等待中的事项 会议或对话后提取行动项
productivity/skills/task-management/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill task-management -g -y
SKILL.md
Frontmatter
{
    "name": "task-management",
    "description": "Simple task management using a shared TASKS.md file. Reference this when the user asks about their tasks, wants to add\/complete tasks, or needs help tracking commitments.",
    "user-invocable": false
}

Task Management

Tasks are tracked in a simple TASKS.md file that both you and the user can edit.

File Location

Always use TASKS.md in the current working directory.

  • If it exists, read/write to it
  • If it doesn't exist, create it with the template below

Dashboard Setup (First Run)

A visual dashboard is available for managing tasks and memory. On first interaction with tasks:

  1. Check if dashboard.html exists in the current working directory
  2. If not, copy it from ${CLAUDE_PLUGIN_ROOT}/skills/dashboard.html to the current working directory
  3. Inform the user: "I've added the dashboard. Run /productivity:start to set up the full system."

The task board:

  • Reads and writes to the same TASKS.md file
  • Auto-saves changes
  • Watches for external changes (syncs when you edit via CLI)
  • Supports drag-and-drop reordering of tasks and sections

Format & Template

When creating a new TASKS.md, use this exact template (without example tasks):

# Tasks

## Active

## Waiting On

## Someday

## Done

Task format:

  • - [ ] **Task title** - context, for whom, due date
  • Sub-bullets for additional details
  • Completed: - [x] ~~Task~~ (date)

How to Interact

When user asks "what's on my plate" / "my tasks":

  • Read TASKS.md
  • Summarize Active and Waiting On sections
  • Highlight anything overdue or urgent

When user says "add a task" / "remind me to":

  • Add to Active section with - [ ] **Task** format
  • Include context if provided (who it's for, due date)

When user says "done with X" / "finished X":

  • Find the task
  • Change [ ] to [x]
  • Add strikethrough: ~~task~~
  • Add completion date
  • Move to Done section

When user asks "what am I waiting on":

  • Read the Waiting On section
  • Note how long each item has been waiting

Conventions

  • Bold the task title for scannability
  • Include "for [person]" when it's a commitment to someone
  • Include "due [date]" for deadlines
  • Include "since [date]" for waiting items
  • Sub-bullets for additional context
  • Keep Done section for ~1 week, then clear old items

Extracting Tasks

When summarizing meetings or conversations, offer to add extracted tasks:

  • Commitments the user made ("I'll send that over")
  • Action items assigned to them
  • Follow-ups mentioned

Ask before adding - don't auto-add without confirmation.

同步任务并刷新记忆。默认模式从外部工具拉取任务、清理陈旧项、填补知识空白;综合模式深度扫描聊天邮件等,捕获遗漏待办并建议新记忆,保持TASKS.md和memory更新。
从项目追踪器拉取新任务到TASKS.md 处理过期或停滞的任务 为未知人员或项目填补记忆空白 全面扫描聊天和邮件以发现隐藏的待办事项
productivity/skills/update/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill update -g -y
SKILL.md
Frontmatter
{
    "name": "update",
    "description": "Sync tasks and refresh memory from your current activity. Use when pulling new assignments from your project tracker into TASKS.md, triaging stale or overdue tasks, filling memory gaps for unknown people or projects, or running a comprehensive scan to catch todos buried in chat and email.",
    "argument-hint": "[--comprehensive]"
}

Update Command

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Keep your task list and memory current. Two modes:

  • Default: Sync tasks from external tools, triage stale items, check memory for gaps
  • --comprehensive: Deep scan chat, email, calendar, docs — flag missed todos and suggest new memories

Usage

/productivity:update
/productivity:update --comprehensive

Default Mode

1. Load Current State

Read TASKS.md and memory/ directory. If they don't exist, suggest /productivity:start first.

2. Sync Tasks from External Sources

Check for available task sources:

  • Project tracker (e.g. Asana, Linear, Jira) (if MCP available)
  • GitHub Issues (if in a repo): gh issue list --assignee=@me

If no sources are available, skip to Step 3.

Fetch tasks assigned to the user (open/in-progress). Compare against TASKS.md:

External task TASKS.md match? Action
Found, not in TASKS.md No match Offer to add
Found, already in TASKS.md Match by title (fuzzy) Skip
In TASKS.md, not in external No match Flag as potentially stale
Completed externally In Active section Offer to mark done

Present diff and let user decide what to add/complete.

3. Triage Stale Items

Review Active tasks in TASKS.md and flag:

  • Tasks with due dates in the past
  • Tasks in Active for 30+ days
  • Tasks with no context (no person, no project)

Present each for triage: Mark done? Reschedule? Move to Someday?

4. Decode Tasks for Memory Gaps

For each task, attempt to decode all entities (people, projects, acronyms, tools, links):

Task: "Send PSR to Todd re: Phoenix blockers"

Decode:
- PSR → ✓ Pipeline Status Report (in glossary)
- Todd → ✓ Todd Martinez (in people/)
- Phoenix → ? Not in memory

Track what's fully decoded vs. what has gaps.

5. Fill Gaps

Present unknown terms grouped:

I found terms in your tasks I don't have context for:

1. "Phoenix" (from: "Send PSR to Todd re: Phoenix blockers")
   → What's Phoenix?

2. "Maya" (from: "sync with Maya on API design")
   → Who is Maya?

Add answers to the appropriate memory files (people/, projects/, glossary.md).

6. Capture Enrichment

Tasks often contain richer context than memory. Extract and update:

  • Links from tasks → add to project/people files
  • Status changes ("launch done") → update project status, demote from CLAUDE.md
  • Relationships ("Todd's sign-off on Maya's proposal") → cross-reference people
  • Deadlines → add to project files

7. Report

Update complete:
- Tasks: +3 from project tracker (e.g. Asana), 1 completed, 2 triaged
- Memory: 2 gaps filled, 1 project enriched
- All tasks decoded ✓

Comprehensive Mode (--comprehensive)

Everything in Default Mode, plus a deep scan of recent activity.

Extra Step: Scan Activity Sources

Gather data from available MCP sources:

  • Chat: Search recent messages, read active channels
  • Email: Search sent messages
  • Documents: List recently touched docs
  • Calendar: List recent + upcoming events

Extra Step: Flag Missed Todos

Compare activity against TASKS.md. Surface action items that aren't tracked:

## Possible Missing Tasks

From your activity, these look like todos you haven't captured:

1. From chat (Jan 18):
   "I'll send the updated mockups by Friday"
   → Add to TASKS.md?

2. From meeting "Phoenix Standup" (Jan 17):
   You have a recurring meeting but no Phoenix tasks active
   → Anything needed here?

3. From email (Jan 16):
   "I'll review the API spec this week"
   → Add to TASKS.md?

Let user pick which to add.

Extra Step: Suggest New Memories

Surface new entities not in memory:

## New People (not in memory)
| Name | Frequency | Context |
|------|-----------|---------|
| Maya Rodriguez | 12 mentions | design, UI reviews |
| Alex K | 8 mentions | DMs about API |

## New Projects/Topics
| Name | Frequency | Context |
|------|-----------|---------|
| Starlight | 15 mentions | planning docs, product |

## Suggested Cleanup
- **Horizon project** — No mentions in 30 days. Mark completed?

Present grouped by confidence. High-confidence items offered to add directly; low-confidence items asked about.

Notes

  • Never auto-add tasks or memories without user confirmation
  • External source links are preserved when available
  • Fuzzy matching on task titles handles minor wording differences
  • Safe to run frequently — only updates when there's new info
  • --comprehensive always runs interactively
用于研究公司或个人的销售情报技能。通过网页搜索提供公司概况、新闻及关键人员信息,连接CRM或数据增强工具后可获取更详细的联系方式和组织架构,辅助制定精准的销售策略。
research [company] look up [person] intel on [prospect] who is [name] at [company] tell me about [company]
sales/skills/account-research/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill account-research -g -y
SKILL.md
Frontmatter
{
    "name": "account-research",
    "description": "Research a company or person and get actionable sales intel. Works standalone with web search, supercharged when you connect enrichment tools or your CRM. Trigger with \"research [company]\", \"look up [person]\", \"intel on [prospect]\", \"who is [name] at [company]\", or \"tell me about [company]\"."
}

Account Research

Get a complete picture of any company or person before outreach. This skill always works with web search, and gets significantly better with enrichment and CRM data.

How It Works

┌─────────────────────────────────────────────────────────────────┐
│                     ACCOUNT RESEARCH                             │
├─────────────────────────────────────────────────────────────────┤
│  ALWAYS (works standalone via web search)                        │
│  ✓ Company overview: what they do, size, industry               │
│  ✓ Recent news: funding, leadership changes, announcements      │
│  ✓ Hiring signals: open roles, growth indicators                │
│  ✓ Key people: leadership team from LinkedIn                    │
│  ✓ Product/service: what they sell, who they serve              │
├─────────────────────────────────────────────────────────────────┤
│  SUPERCHARGED (when you connect your tools)                      │
│  + Enrichment: verified emails, phone, tech stack, org chart    │
│  + CRM: prior relationship, past opportunities, contacts        │
└─────────────────────────────────────────────────────────────────┘

Getting Started

Just tell me who to research:

  • "Research Stripe"
  • "Look up the CTO at Notion"
  • "Intel on acme.com"
  • "Who is Sarah Chen at TechCorp?"
  • "Tell me about [company] before my call"

I'll run web searches immediately. If you have enrichment or CRM connected, I'll pull that data too.


Connectors (Optional)

Connect your tools to supercharge this skill:

Connector What It Adds
Enrichment Verified emails, phone numbers, tech stack, org chart, funding details
CRM Prior relationship history, past opportunities, existing contacts, notes

No connectors? No problem. Web search provides solid research for any company or person.


Output Format

# Research: [Company or Person Name]

**Generated:** [Date]
**Sources:** Web Search [+ Enrichment] [+ CRM]

---

## Quick Take

[2-3 sentences: Who they are, why they might need you, best angle for outreach]

---

## Company Profile

| Field | Value |
|-------|-------|
| **Company** | [Name] |
| **Website** | [URL] |
| **Industry** | [Industry] |
| **Size** | [Employee count] |
| **Headquarters** | [Location] |
| **Founded** | [Year] |
| **Funding** | [Stage + amount if known] |
| **Revenue** | [Estimate if available] |

### What They Do
[1-2 sentence description of their business, product, and customers]

### Recent News
- **[Headline]** — [Date] — [Why it matters for your outreach]
- **[Headline]** — [Date] — [Why it matters]

### Hiring Signals
- [X] open roles in [Department]
- Notable: [Relevant roles like Engineering, Sales, AI/ML]
- Growth indicator: [Hiring velocity interpretation]

---

## Key People

### [Name] — [Title]
| Field | Detail |
|-------|--------|
| **LinkedIn** | [URL] |
| **Background** | [Prior companies, education] |
| **Tenure** | [Time at company] |
| **Email** | [If enrichment connected] |

**Talking Points:**
- [Personal hook based on background]
- [Professional hook based on role]

[Repeat for relevant contacts]

---

## Tech Stack [If Enrichment Connected]

| Category | Tools |
|----------|-------|
| **Cloud** | [AWS, GCP, Azure, etc.] |
| **Data** | [Snowflake, Databricks, etc.] |
| **CRM** | [e.g. Salesforce, HubSpot] |
| **Other** | [Relevant tools] |

**Integration Opportunity:** [How your product fits with their stack]

---

## Prior Relationship [If CRM Connected]

| Field | Detail |
|-------|--------|
| **Status** | [New / Prior prospect / Customer / Churned] |
| **Last Contact** | [Date and type] |
| **Previous Opps** | [Won/Lost and why] |
| **Known Contacts** | [Names already in CRM] |

**History:** [Summary of past relationship]

---

## Qualification Signals

### Positive Signals
- ✅ [Signal and evidence]
- ✅ [Signal and evidence]

### Potential Concerns
- ⚠️ [Concern and what to watch for]

### Unknown (Ask in Discovery)
- ❓ [Gap in understanding]

---

## Recommended Approach

**Best Entry Point:** [Person and why]

**Opening Hook:** [What to lead with based on research]

**Discovery Questions:**
1. [Question about their situation]
2. [Question about pain points]
3. [Question about decision process]

---

## Sources
- [Source 1](URL)
- [Source 2](URL)

Execution Flow

Step 1: Parse Request

Identify what to research:
- "Research Stripe" → Company research
- "Look up John Smith at Acme" → Person + company
- "Who is the CTO at Notion" → Role-based search
- "Intel on acme.com" → Domain-based lookup

Step 2: Web Search (Always)

Run these searches:
1. "[Company name]" → Homepage, about page
2. "[Company name] news" → Recent announcements
3. "[Company name] funding" → Investment history
4. "[Company name] careers" → Hiring signals
5. "[Person name] [Company] LinkedIn" → Profile info
6. "[Company name] product" → What they sell
7. "[Company name] customers" → Who they serve

Extract:

  • Company description and positioning
  • Recent news (last 90 days)
  • Leadership team
  • Open job postings
  • Technology mentions
  • Customer base

Step 3: Enrichment (If Connected)

If enrichment tools available:
1. Enrich company → Firmographics, funding, tech stack
2. Search people → Org chart, contact list
3. Enrich person → Email, phone, background
4. Get signals → Intent data, hiring velocity

Enrichment adds:

  • Verified contact info
  • Complete org chart
  • Precise employee count
  • Detailed tech stack
  • Funding history with investors

Step 4: CRM Check (If Connected)

If CRM available:
1. Search for account by domain
2. Get related contacts
3. Get opportunity history
4. Get activity timeline

CRM adds:

  • Prior relationship context
  • What happened before (won/lost deals)
  • Who we've talked to
  • Notes and history

Step 5: Synthesize

1. Combine all sources
2. Prioritize enrichment data over web (more accurate)
3. Add CRM context if exists
4. Identify qualification signals
5. Generate talking points
6. Recommend approach

Research Variations

Company Research

Focus on: Business overview, news, hiring, leadership

Person Research

Focus on: Background, role, LinkedIn activity, talking points

Competitor Research

Focus on: Product comparison, positioning, win/loss patterns

Pre-Meeting Research

Focus on: Attendee backgrounds, recent news, relationship history


Tips for Better Research

  1. Include the domain — "research acme.com" is more precise
  2. Specify the person — "look up Jane Smith, VP Sales at Acme"
  3. State your goal — "research Stripe before my demo call"
  4. Ask for specifics — "what's their tech stack?" after initial research

Related Skills

  • call-prep — Full meeting prep with this research plus context
  • draft-outreach — Write personalized message based on research
  • prospecting — Qualify and prioritize research targets
用于销售会议准备,通过用户输入或连接CRM等工具收集上下文,结合网络搜索生成包含议程、问题及参会者背景的简报。
prep me for my call with [company] I'm meeting with [company] prep me call prep [company] get me ready for [meeting]
sales/skills/call-prep/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill call-prep -g -y
SKILL.md
Frontmatter
{
    "name": "call-prep",
    "description": "Prepare for a sales call with account context, attendee research, and suggested agenda. Works standalone with user input and web research, supercharged when you connect your CRM, email, chat, or transcripts. Trigger with \"prep me for my call with [company]\", \"I'm meeting with [company] prep me\", \"call prep [company]\", or \"get me ready for [meeting]\"."
}

Call Prep

Get fully prepared for any sales call in minutes. This skill works with whatever context you provide, and gets significantly better when you connect your sales tools.

How It Works

┌─────────────────────────────────────────────────────────────────┐
│                        CALL PREP                                 │
├─────────────────────────────────────────────────────────────────┤
│  ALWAYS (works standalone)                                       │
│  ✓ You tell me: company, meeting type, attendees                │
│  ✓ Web search: recent news, funding, leadership changes         │
│  ✓ Company research: what they do, size, industry               │
│  ✓ Output: prep brief with agenda and questions                 │
├─────────────────────────────────────────────────────────────────┤
│  SUPERCHARGED (when you connect your tools)                      │
│  + CRM: account history, contacts, opportunities, activities    │
│  + Email: recent threads, open questions, commitments           │
│  + Chat: internal discussions, colleague insights               │
│  + Transcripts: prior call recordings, key moments              │
│  + Calendar: auto-find meeting, pull attendees                  │
└─────────────────────────────────────────────────────────────────┘

Getting Started

When you run this skill, I'll ask for what I need:

Required:

  • Company or contact name
  • Meeting type (discovery, demo, negotiation, check-in, etc.)

Helpful if you have it:

  • Who's attending (names and titles)
  • Any context you want me to know (paste prior notes, emails, etc.)

If you've connected your CRM, email, or other tools, I'll pull context automatically and skip the questions.


Connectors (Optional)

Connect your tools to supercharge this skill:

Connector What It Adds
CRM Account details, contact history, open deals, recent activities
Email Recent threads with the company, open questions, attachments shared
Chat Internal chat discussions (e.g. Slack) about the account, colleague insights
Transcripts Prior call recordings, topics covered, competitor mentions
Calendar Auto-find the meeting, pull attendees and description

No connectors? No problem. Just tell me about the meeting and paste any context you have. I'll research the rest.


Output Format

# Call Prep: [Company Name]

**Meeting:** [Type] — [Date/Time if known]
**Attendees:** [Names with titles]
**Your Goal:** [What you want to accomplish]

---

## Account Snapshot

| Field | Value |
|-------|-------|
| **Company** | [Name] |
| **Industry** | [Industry] |
| **Size** | [Employees / Revenue if known] |
| **Status** | [New prospect / Active opportunity / Customer] |
| **Last Touch** | [Date and summary] |

---

## Who You're Meeting

### [Name] — [Title]
- **Background:** [Career history, education if found]
- **LinkedIn:** [URL]
- **Role in Deal:** [Decision maker / Champion / Evaluator / etc.]
- **Last Interaction:** [Summary if known]
- **Talking Point:** [Something personal/professional to reference]

[Repeat for each attendee]

---

## Context & History

**What's happened so far:**
- [Key point from prior interactions]
- [Open commitments or action items]
- [Any concerns or objections raised]

**Recent news about [Company]:**
- [News item 1 — why it matters]
- [News item 2 — why it matters]

---

## Suggested Agenda

1. **Open** — [Reference last conversation or trigger event]
2. **[Topic 1]** — [Discovery question or value discussion]
3. **[Topic 2]** — [Address known concern or explore priority]
4. **[Topic 3]** — [Demo section / Proposal review / etc.]
5. **Next Steps** — [Propose clear follow-up with timeline]

---

## Discovery Questions

Ask these to fill gaps in your understanding:

1. [Question about their current situation]
2. [Question about pain points or priorities]
3. [Question about decision process and timeline]
4. [Question about success criteria]
5. [Question about other stakeholders]

---

## Potential Objections

| Objection | Suggested Response |
|-----------|-------------------|
| [Likely objection based on context] | [How to address it] |
| [Common objection for this stage] | [How to address it] |

---

## Internal Notes

[Any internal chat context (e.g. Slack), colleague insights, or competitive intel]

---

## After the Call

Run **call-follow-up** to:
- Extract action items
- Update your CRM
- Draft follow-up email

Execution Flow

Step 1: Gather Context

If connectors available:

1. Calendar → Find upcoming meeting matching company name
   - Pull: title, time, attendees, description, attachments

2. CRM → Query account
   - Pull: account details, all contacts, open opportunities
   - Pull: last 10 activities, any account notes

3. Email → Search recent threads
   - Query: emails with company domain (last 30 days)
   - Extract: key topics, open questions, commitments

4. Chat → Search internal discussions
   - Query: company name mentions (last 30 days)
   - Extract: colleague insights, competitive intel

5. Transcripts → Find prior calls
   - Pull: call recordings with this account
   - Extract: key moments, objections raised, topics covered

If no connectors:

1. Ask user:
   - "What company are you meeting with?"
   - "What type of meeting is this?"
   - "Who's attending? (names and titles if you know)"
   - "Any context you want me to know? (paste notes, emails, etc.)"

2. Accept whatever they provide and work with it

Step 2: Research Supplement

Always run (web search):

1. "[Company] news" — last 30 days
2. "[Company] funding" — recent announcements
3. "[Company] leadership" — executive changes
4. "[Company] + [industry] trends" — relevant context
5. Attendee LinkedIn profiles — background research

Step 3: Synthesize & Generate

1. Combine all sources into unified context
2. Identify gaps in understanding → generate discovery questions
3. Anticipate objections based on stage and history
4. Create suggested agenda tailored to meeting type
5. Output formatted prep brief

Meeting Type Variations

Discovery Call

  • Focus on: Understanding their world, pain points, priorities
  • Agenda emphasis: Questions > Talking
  • Key output: Qualification signals, next step proposal

Demo / Presentation

  • Focus on: Their specific use case, tailored examples
  • Agenda emphasis: Show relevant features, get feedback
  • Key output: Technical requirements, decision timeline

Negotiation / Proposal Review

  • Focus on: Addressing concerns, justifying value
  • Agenda emphasis: Handle objections, close gaps
  • Key output: Path to agreement, clear next steps

Check-in / QBR

  • Focus on: Value delivered, expansion opportunities
  • Agenda emphasis: Review wins, surface new needs
  • Key output: Renewal confidence, upsell pipeline

Tips for Better Prep

  1. More context = better prep — Paste emails, notes, anything you have
  2. Name the attendees — Even just titles help me research
  3. State your goal — "I want to get them to agree to a pilot"
  4. Flag concerns — "They mentioned budget is tight"

Related Skills

  • account-research — Deep dive on a company before first contact
  • call-follow-up — Process call notes and execute post-call workflow
  • draft-outreach — Write personalized outreach after research
处理通话笔记或转录文本,提取行动项、起草客户跟进邮件并生成内部总结。适用于发现、演示或谈判会议后,帮助记录活动、捕获异议及明确下一步计划,支持CRM集成与自动化更新。
需要整理通话笔记或转录内容时 希望从会议中提取行动项和关键决策时 需要起草客户跟进邮件时 准备向团队生成内部会议摘要时
sales/skills/call-summary/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill call-summary -g -y
SKILL.md
Frontmatter
{
    "name": "call-summary",
    "description": "Process call notes or a transcript — extract action items, draft follow-up email, generate internal summary. Use when pasting rough notes or a transcript after a discovery, demo, or negotiation call, drafting a customer follow-up, logging the activity for your CRM, or capturing objections and next steps for your team.",
    "argument-hint": "<call notes or transcript>"
}

/call-summary

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Process call notes or a transcript to extract action items, draft follow-up communications, and update records.

Usage

/call-summary <notes or transcript>

Process these call notes: $ARGUMENTS

If a file is referenced: @$1


How It Works

┌─────────────────────────────────────────────────────────────────┐
│                      CALL SUMMARY                                │
├─────────────────────────────────────────────────────────────────┤
│  STANDALONE (always works)                                       │
│  ✓ Paste call notes or transcript                               │
│  ✓ Extract key discussion points and decisions                  │
│  ✓ Identify action items with owners and due dates              │
│  ✓ Surface objections, concerns, and open questions             │
│  ✓ Draft customer-facing follow-up email                        │
│  ✓ Generate internal summary for your team                      │
├─────────────────────────────────────────────────────────────────┤
│  SUPERCHARGED (when you connect your tools)                      │
│  + Transcripts: Pull recording automatically (e.g. Gong, Fireflies) │
│  + CRM: Update opportunity, log activity, create tasks          │
│  + Email: Send follow-up directly from draft                    │
│  + Calendar: Link to meeting, pull attendee context             │
└─────────────────────────────────────────────────────────────────┘

What I Need From You

Option 1: Paste your notes Just paste whatever you have — bullet points, rough notes, stream of consciousness. I'll structure it.

Option 2: Paste a transcript If you have a full transcript from your video conferencing tool (e.g. Zoom, Teams) or conversation intelligence tool (e.g. Gong, Fireflies), paste it. I'll extract the key moments.

Option 3: Describe the call Tell me what happened: "Had a discovery call with Acme Corp. Met with their VP Eng and CTO. They're evaluating us vs Competitor X. Main concern is integration timeline."


Output

Internal Summary

## Call Summary: [Company] — [Date]

**Attendees:** [Names and titles]
**Call Type:** [Discovery / Demo / Negotiation / Check-in]
**Duration:** [If known]

### Key Discussion Points
1. [Topic] — [What was discussed, decisions made]
2. [Topic] — [Summary]

### Customer Priorities
- [Priority 1 they expressed]
- [Priority 2]

### Objections / Concerns Raised
- [Concern] — [How you addressed it / status]

### Competitive Intel
- [Any competitor mentions, what was said]

### Action Items
| Owner | Action | Due |
|-------|--------|-----|
| [You] | [Task] | [Date] |
| [Customer] | [Task] | [Date] |

### Next Steps
- [Agreed next step with timeline]

### Deal Impact
- [How this call affects the opportunity — stage change, risk, acceleration]

Customer Follow-Up Email

Subject: [Meeting recap + next steps]

Hi [Name],

Thank you for taking the time to meet today...

[Key points discussed]

[Commitments you made]

[Clear next step with timeline]

Best,
[You]

Email Style Guidelines

When drafting customer-facing emails:

  1. Be concise but informative — Get to the point quickly. Customers are busy.
  2. No markdown formatting — Don't use asterisks, bold, or other markdown syntax. Write in plain text that looks natural in any email client.
  3. Use simple structure — Short paragraphs, line breaks between sections. No headers or bullet formatting unless the customer's email client will render it.
  4. Keep it scannable — If listing items, use plain dashes or numbers, not fancy formatting.

Good:

Here's what we discussed:
- Quote for 20 seats at $480/seat/year
- W9 and supplier onboarding docs
- Point of contact for the contract

Bad:

**What You Need from Us:**
- Quote for 20 seats at $480/seat/year

If Connectors Available

Transcripts connected (e.g. Gong, Fireflies):

  • I'll search for the call automatically
  • Pull the full transcript
  • Extract key moments flagged by the platform

CRM connected:

  • I'll offer to update the opportunity stage
  • Log the call as an activity
  • Create tasks for action items
  • Update next steps field

Email connected:

  • I'll offer to create a draft in ~~email
  • Or send directly if you approve

Tips

  1. More detail = better output — Even rough notes help. "They seemed concerned about X" is useful context.
  2. Name the attendees — Helps me structure the summary and assign action items.
  3. Flag what matters — If something was important, tell me: "The big thing was..."
  4. Tell me the deal stage — Helps me tailor the follow-up tone and next steps.
通过研究竞争对手生成交互式HTML竞争情报战卡,包含功能对比、近期动态及销售话术。支持独立网络搜索或连接CRM等工具增强数据。
competitive intel research competitors how do we compare to [competitor] battlecard for [competitor] what's new with [competitor]
sales/skills/competitive-intelligence/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill competitive-intelligence -g -y
SKILL.md
Frontmatter
{
    "name": "competitive-intelligence",
    "description": "Research your competitors and build an interactive battlecard. Outputs an HTML artifact with clickable competitor cards and a comparison matrix. Trigger with \"competitive intel\", \"research competitors\", \"how do we compare to [competitor]\", \"battlecard for [competitor]\", or \"what's new with [competitor]\"."
}

Competitive Intelligence

Research your competitors extensively and generate an interactive HTML battlecard you can use in deals. The output is a self-contained artifact with clickable competitor tabs and an overall comparison matrix.

How It Works

┌─────────────────────────────────────────────────────────────────┐
│                  COMPETITIVE INTELLIGENCE                        │
├─────────────────────────────────────────────────────────────────┤
│  ALWAYS (works standalone via web search)                        │
│  ✓ Competitor product deep-dive: features, pricing, positioning │
│  ✓ Recent releases: what they've shipped in last 90 days        │
│  ✓ Your company releases: what you've shipped to counter        │
│  ✓ Differentiation matrix: where you win vs. where they win     │
│  ✓ Sales talk tracks: how to position against each competitor   │
│  ✓ Landmine questions: expose their weaknesses naturally        │
├─────────────────────────────────────────────────────────────────┤
│  OUTPUT: Interactive HTML Battlecard                             │
│  ✓ Comparison matrix overview                                    │
│  ✓ Clickable tabs for each competitor                           │
│  ✓ Dark theme, professional styling                             │
│  ✓ Self-contained HTML file — share or host anywhere            │
├─────────────────────────────────────────────────────────────────┤
│  SUPERCHARGED (when you connect your tools)                      │
│  + CRM: Win/loss data, competitor mentions in closed deals      │
│  + Docs: Existing battlecards, competitive playbooks            │
│  + Chat: Internal intel, field reports from colleagues          │
│  + Transcripts: Competitor mentions in customer calls           │
└─────────────────────────────────────────────────────────────────┘

Getting Started

When you run this skill, I'll ask for context:

Required:

  • What company do you work for? (or I'll detect from your email)
  • Who are your main competitors? (1-5 names)

Optional:

  • Which competitor do you want to focus on first?
  • Any specific deals where you're competing against them?
  • Pain points you've heard from customers about competitors?

If I already have your seller context from a previous session, I'll confirm and skip the questions.


Connectors (Optional)

Connector What It Adds
CRM Win/loss history against each competitor, deal-level competitor tracking
Docs Existing battlecards, product comparison docs, competitive playbooks
Chat Internal chat intel (e.g. Slack) — what your team is hearing from the field
Transcripts Competitor mentions in customer calls, objections raised

No connectors? Web research works great. I'll pull everything from public sources — product pages, pricing, blogs, release notes, reviews, job postings.


Output: Interactive HTML Battlecard

The skill generates a self-contained HTML file with:

1. Comparison Matrix (Landing View)

Overview comparing you vs. all competitors at a glance:

  • Feature comparison grid
  • Pricing comparison
  • Market positioning
  • Win rate indicators (if CRM connected)

2. Competitor Tabs (Click to Expand)

Each competitor gets a clickable card that expands to show:

  • Company profile (size, funding, target market)
  • What they sell and how they position
  • Recent releases (last 90 days)
  • Where they win vs. where you win
  • Pricing intelligence
  • Talk tracks for different scenarios
  • Objection handling
  • Landmine questions

3. Your Company Card

  • Your releases (last 90 days)
  • Your key differentiators
  • Proof points and customer quotes

HTML Structure

<!DOCTYPE html>
<html>
<head>
    <title>Battlecard: [Your Company] vs Competitors</title>
    <style>
        /* Dark theme, professional styling */
        /* Tabbed navigation */
        /* Expandable cards */
        /* Responsive design */
    </style>
</head>
<body>
    <!-- Header with your company + date -->
    <header>
        <h1>[Your Company] Competitive Battlecard</h1>
        <p>Generated: [Date] | Competitors: [List]</p>
    </header>

    <!-- Tab Navigation -->
    <nav class="tabs">
        <button class="tab active" data-tab="matrix">Comparison Matrix</button>
        <button class="tab" data-tab="competitor-1">[Competitor 1]</button>
        <button class="tab" data-tab="competitor-2">[Competitor 2]</button>
        <button class="tab" data-tab="competitor-3">[Competitor 3]</button>
    </nav>

    <!-- Comparison Matrix Tab -->
    <section id="matrix" class="tab-content active">
        <h2>Head-to-Head Comparison</h2>
        <table class="comparison-matrix">
            <!-- Feature rows with you vs each competitor -->
        </table>

        <h2>Quick Win/Loss Guide</h2>
        <div class="win-loss-grid">
            <!-- Per-competitor: when you win, when you lose -->
        </div>
    </section>

    <!-- Individual Competitor Tabs -->
    <section id="competitor-1" class="tab-content">
        <div class="battlecard">
            <div class="profile"><!-- Company info --></div>
            <div class="differentiation"><!-- Where they win / you win --></div>
            <div class="talk-tracks"><!-- Scenario-based positioning --></div>
            <div class="objections"><!-- Common objections + responses --></div>
            <div class="landmines"><!-- Questions to ask --></div>
        </div>
    </section>

    <script>
        // Tab switching logic
        // Expand/collapse sections
    </script>
</body>
</html>

Visual Design

Color System

:root {
    /* Dark theme base */
    --bg-primary: #0a0d14;
    --bg-elevated: #0f131c;
    --bg-surface: #161b28;
    --bg-hover: #1e2536;

    /* Text */
    --text-primary: #ffffff;
    --text-secondary: rgba(255, 255, 255, 0.7);
    --text-muted: rgba(255, 255, 255, 0.5);

    /* Accent (your brand or neutral) */
    --accent: #3b82f6;
    --accent-hover: #2563eb;

    /* Status indicators */
    --you-win: #10b981;
    --they-win: #ef4444;
    --tie: #f59e0b;
}

Card Design

  • Rounded corners (12px)
  • Subtle borders (1px, low opacity)
  • Hover states with slight elevation
  • Smooth transitions (200ms)

Comparison Matrix

  • Sticky header row
  • Color-coded winner indicators (green = you, red = them, yellow = tie)
  • Expandable rows for detail

Execution Flow

Phase 1: Gather Seller Context

If first time:
1. Ask: "What company do you work for?"
2. Ask: "What do you sell? (product/service in one line)"
3. Ask: "Who are your main competitors? (up to 5)"
4. Store context for future sessions

If returning user:
1. Confirm: "Still at [Company] selling [Product]?"
2. Ask: "Same competitors, or any new ones to add?"

Phase 2: Research Your Company (Always)

Web searches:
1. "[Your company] product" — current offerings
2. "[Your company] pricing" — pricing model
3. "[Your company] news" — recent announcements (90 days)
4. "[Your company] product updates OR changelog OR releases" — what you've shipped
5. "[Your company] vs [competitor]" — existing comparisons

Phase 3: Research Each Competitor (Always)

For each competitor, run:
1. "[Competitor] product features" — what they offer
2. "[Competitor] pricing" — how they charge
3. "[Competitor] news" — recent announcements
4. "[Competitor] product updates OR changelog OR releases" — what they've shipped
5. "[Competitor] reviews G2 OR Capterra OR TrustRadius" — customer sentiment
6. "[Competitor] vs [alternatives]" — how they position
7. "[Competitor] customers" — who uses them
8. "[Competitor] careers" — hiring signals (growth areas)

Phase 4: Pull Connected Sources (If Available)

If CRM connected:
1. Query closed-won deals with competitor field = [Competitor]
2. Query closed-lost deals with competitor field = [Competitor]
3. Extract win/loss patterns

If docs connected:
1. Search for "battlecard [competitor]"
2. Search for "competitive [competitor]"
3. Pull existing positioning docs

If chat connected:
1. Search for "[Competitor]" mentions (last 90 days)
2. Extract field intel and colleague insights

If transcripts connected:
1. Search calls for "[Competitor]" mentions
2. Extract objections and customer quotes

Phase 5: Build HTML Artifact

1. Structure data for each competitor
2. Build comparison matrix
3. Generate individual battlecards
4. Create talk tracks for each scenario
5. Compile landmine questions
6. Render as self-contained HTML
7. Save as [YourCompany]-battlecard-[date].html

Data Structure Per Competitor

competitor:
  name: "[Name]"
  website: "[URL]"
  profile:
    founded: "[Year]"
    funding: "[Stage + amount]"
    employees: "[Count]"
    target_market: "[Who they sell to]"
    pricing_model: "[Per seat / usage / etc.]"
    market_position: "[Leader / Challenger / Niche]"

  what_they_sell: "[Product summary]"
  their_positioning: "[How they describe themselves]"

  recent_releases:
    - date: "[Date]"
      release: "[Feature/Product]"
      impact: "[Why it matters]"

  where_they_win:
    - area: "[Area]"
      advantage: "[Their strength]"
      how_to_handle: "[Your counter]"

  where_you_win:
    - area: "[Area]"
      advantage: "[Your strength]"
      proof_point: "[Evidence]"

  pricing:
    model: "[How they charge]"
    entry_price: "[Starting price]"
    enterprise: "[Enterprise pricing]"
    hidden_costs: "[Implementation, etc.]"
    talk_track: "[How to discuss pricing]"

  talk_tracks:
    early_mention: "[Strategy if they come up early]"
    displacement: "[Strategy if customer uses them]"
    late_addition: "[Strategy if added late to eval]"

  objections:
    - objection: "[What customer says]"
      response: "[How to handle]"

  landmines:
    - "[Question that exposes their weakness]"

  win_loss: # If CRM connected
    win_rate: "[X]%"
    common_win_factors: "[What predicts wins]"
    common_loss_factors: "[What predicts losses]"

Delivery

## ✓ Battlecard Created

[View your battlecard](file:///path/to/[YourCompany]-battlecard-[date].html)

---

**Summary**
- **Your Company**: [Name]
- **Competitors Analyzed**: [List]
- **Data Sources**: Web research [+ CRM] [+ Docs] [+ Transcripts]

---

**How to Use**
- **Before a call**: Open the relevant competitor tab, review talk tracks
- **During a call**: Reference landmine questions
- **After win/loss**: Update with new intel

---

**Sharing Options**
- **Local file**: Open in any browser
- **Host it**: Upload to Netlify, Vercel, or internal wiki
- **Share directly**: Send the HTML file to teammates

---

**Keep it Fresh**
Run this skill again to refresh with latest intel. Recommended: monthly or before major deals.

Refresh Cadence

Competitive intel gets stale. Recommended refresh:

Trigger Action
Monthly Quick refresh — new releases, news, pricing changes
Before major deal Deep refresh for specific competitor in that deal
After win/loss Update patterns with new data
Competitor announcement Immediate update on that competitor

Tips for Better Intel

  1. Be honest about weaknesses — Credibility comes from acknowledging where competitors are strong
  2. Focus on outcomes, not features — "They have X feature" matters less than "customers achieve Y result"
  3. Update from the field — Best intel comes from actual customer conversations, not just websites
  4. Plant landmines, don't badmouth — Ask questions that expose weaknesses; never trash-talk
  5. Track releases religiously — What they ship tells you their strategy and your opportunity

Related Skills

  • account-research — Research a specific prospect before reaching out
  • call-prep — Prep for a call where you know competitor is involved
  • create-an-asset — Build a custom comparison page for a specific deal
根据潜在客户、受众和目标生成定制销售资产(如落地页、演示文稿、单页或工作流演示)。通过收集卖家和买家上下文,构建专业且品牌化的内容,助力销售对话。
用户输入 /create-anasset 命令 用户请求创建资产、构建演示或制作落地页 需要面向客户的销售交付物
sales/skills/create-an-asset/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill create-an-asset -g -y
SKILL.md
Frontmatter
{
    "name": "create-an-asset",
    "description": "Generate tailored sales assets (landing pages, decks, one-pagers, workflow demos) from your deal context. Describe your prospect, audience, and goal — get a polished, branded asset ready to share with customers."
}

Create an Asset

Generate custom sales assets tailored to your prospect, audience, and goals. Supports interactive landing pages, presentation decks, executive one-pagers, and workflow/architecture demos.


Triggers

Invoke this skill when:

  • User says /create-an-asset or /create-an-asset [CompanyName]
  • User asks to "create an asset", "build a demo", "make a landing page", "mock up a workflow"
  • User needs a customer-facing deliverable for a sales conversation

Overview

This skill creates professional sales assets by gathering context about:

  • (a) The Prospect — company, contacts, conversations, pain points
  • (b) The Audience — who's viewing, what they care about
  • (c) The Purpose — goal of the asset, desired next action
  • (d) The Format — landing page, deck, one-pager, or workflow demo

The skill then researches, structures, and builds a polished, branded asset ready to share with customers.


Phase 0: Context Detection & Input Collection

Step 0.1: Detect Seller Context

From the user's email domain, identify what company they work for.

Actions:

  1. Extract domain from user's email
  2. Search: "[domain]" company products services site:linkedin.com OR site:crunchbase.com
  3. Determine seller context:
Scenario Action
Single-product company Auto-populate seller context
Multi-product company Ask: "Which product or solution is this asset for?"
Consultant/agency/generic domain Ask: "What company or product are you representing?"
Unknown/startup Ask: "Briefly, what are you selling?"

Store seller context:

seller:
  company: "[Company Name]"
  product: "[Product/Service]"
  value_props:
    - "[Key value prop 1]"
    - "[Key value prop 2]"
    - "[Key value prop 3]"
  differentiators:
    - "[Differentiator 1]"
    - "[Differentiator 2]"
  pricing_model: "[If publicly known]"

Persist to knowledge base for future sessions. On subsequent invocations, confirm: "I have your seller context from last time — still selling [Product] at [Company]?"


Step 0.2: Collect Prospect Context (a)

Ask the user:

Field Prompt Required
Company "Which company is this asset for?" ✓ Yes
Key contacts "Who are the key contacts? (names, roles)" No
Deal stage "What stage is this deal?" ✓ Yes
Pain points "What pain points or priorities have they shared?" No
Past materials "Upload any conversation materials (transcripts, emails, notes, call recordings)" No

Deal stage options:

  • Intro / First meeting
  • Discovery
  • Evaluation / Technical review
  • POC / Pilot
  • Negotiation
  • Close

Step 0.3: Collect Audience Context (b)

Ask the user:

Field Prompt Required
Audience type "Who's viewing this?" ✓ Yes
Specific roles "Any specific titles to tailor for? (e.g., CTO, VP Engineering, CFO)" No
Primary concern "What do they care most about?" ✓ Yes
Objections "Any concerns or objections to address?" No

Audience type options:

  • Executive (C-suite, VPs)
  • Technical (Architects, Engineers, Developers)
  • Operations (Ops, IT, Procurement)
  • Mixed / Cross-functional

Primary concern options:

  • ROI / Business impact
  • Technical depth / Architecture
  • Strategic alignment
  • Risk mitigation / Security
  • Implementation / Timeline

Step 0.4: Collect Purpose Context (c)

Ask the user:

Field Prompt Required
Goal "What's the goal of this asset?" ✓ Yes
Desired action "What should the viewer do after seeing this?" ✓ Yes

Goal options:

  • Intro / First impression
  • Discovery follow-up
  • Technical deep-dive
  • Executive alignment / Business case
  • POC proposal
  • Deal close

Step 0.5: Select Format (d)

Ask the user: "What format works best for this?"

Format Description Best For
Interactive landing page Multi-tab page with demos, metrics, calculators Exec alignment, intros, value prop
Deck-style Linear slides, presentation-ready Formal meetings, large audiences
One-pager Single-scroll executive summary Leave-behinds, quick summaries
Workflow / Architecture demo Interactive diagram with animated flow Technical deep-dives, POC demos, integrations

Step 0.6: Format-Specific Inputs

If "Workflow / Architecture demo" selected:

First, parse from user's description. Look for:

  • Systems and components mentioned
  • Data flows described
  • Human interaction points
  • Example scenarios

Then ask for any gaps:

If Missing... Ask...
Components unclear "What systems or components are involved? (databases, APIs, AI, middleware, etc.)"
Flow unclear "Walk me through the step-by-step flow"
Human touchpoints unclear "Where does a human interact in this workflow?"
Scenario vague "What's a concrete example scenario to demo?"
Integration specifics "Any specific tools or platforms to highlight?"

Phase 1: Research (Adaptive)

Assess Context Richness

Level Indicators Research Depth
Rich Transcripts uploaded, detailed pain points, clear requirements Light — fill gaps only
Moderate Some context, no transcripts Medium — company + industry
Sparse Just company name Deep — full research pass

Always Research:

  1. Prospect basics

    • Search: "[Company]" annual report investor presentation 2025 2026
    • Search: "[Company]" CEO strategy priorities 2025 2026
    • Extract: Revenue, employees, key metrics, strategic priorities
  2. Leadership

    • Search: "[Company]" CEO CTO CIO 2025
    • Extract: Names, titles, recent quotes on strategy/technology
  3. Brand colors

    • Search: "[Company]" brand guidelines
    • Or extract from company website
    • Store: Primary color, secondary color, accent

If Moderate/Sparse Context, Also Research:

  1. Industry context

    • Search: "[Industry]" trends challenges 2025 2026
    • Extract: Common pain points, market dynamics
  2. Technology landscape

    • Search: "[Company]" technology stack tools platforms
    • Extract: Current solutions, potential integration points
  3. Competitive context

    • Search: "[Company]" vs [seller's competitors]
    • Extract: Current solutions, switching signals

If Transcripts/Materials Uploaded:

  1. Conversation analysis
    • Extract: Stated pain points, decision criteria, objections, timeline
    • Identify: Key quotes to reference (use their exact language)
    • Note: Specific terminology, acronyms, internal project names

Phase 2: Structure Decision

Interactive Landing Page

Purpose Recommended Sections
Intro Company Fit → Solution Overview → Key Use Cases → Why Us → Next Steps
Discovery follow-up Their Priorities → How We Help → Relevant Examples → ROI Framework → Next Steps
Technical deep-dive Architecture → Security & Compliance → Integration → Performance → Support
Exec alignment Strategic Fit → Business Impact → ROI Calculator → Risk Mitigation → Partnership
POC proposal Scope → Success Criteria → Timeline → Team → Investment → Next Steps
Deal close Value Summary → Pricing → Implementation Plan → Terms → Sign-off

Audience adjustments:

  • Executive: Lead with business impact, ROI, strategic alignment
  • Technical: Lead with architecture, security, integration depth
  • Operations: Lead with workflow impact, change management, support
  • Mixed: Balance strategic + tactical; use tabs to separate depth levels

Deck-Style

Same sections as landing page, formatted as linear slides:

1. Title slide (Prospect + Seller logos, partnership framing)
2. Agenda
3-N. One section per slide (or 2-3 slides for dense sections)
N+1. Summary / Key takeaways
N+2. Next steps / CTA
N+3. Appendix (optional — detailed specs, pricing, etc.)

Slide principles:

  • One key message per slide
  • Visual > text-heavy
  • Use prospect's metrics and language
  • Include speaker notes

One-Pager

Condense to single-scroll format:

┌─────────────────────────────────────┐
│ HERO: "[Prospect Goal] with [Product]" │
├─────────────────────────────────────┤
│ KEY POINT 1     │ KEY POINT 2     │ KEY POINT 3     │
│ [Icon + 2-3     │ [Icon + 2-3     │ [Icon + 2-3     │
│  sentences]     │  sentences]     │  sentences]     │
├─────────────────────────────────────┤
│ PROOF POINT: [Metric, quote, or case study] │
├─────────────────────────────────────┤
│ CTA: [Clear next action] │ [Contact info] │
└─────────────────────────────────────┘

Workflow / Architecture Demo

Structure based on complexity:

Complexity Components Structure
Simple 3-5 Single-view diagram with step annotations
Medium 5-10 Zoomable canvas with step-by-step walkthrough
Complex 10+ Multi-layer view (overview → detailed) with guided tour

Standard elements:

  1. Title bar: [Scenario Name] — Powered by [Seller Product]
  2. Component nodes: Visual boxes/icons for each system
  3. Flow arrows: Animated connections showing data movement
  4. Step panel: Sidebar explaining current step in plain language
  5. Controls: Play / Pause / Step Forward / Step Back / Reset
  6. Annotations: Callouts for key decision points and value-adds
  7. Data preview: Sample payloads or transformations at each step

Phase 3: Content Generation

General Principles

All content should:

  • Reference specific pain points from user input or transcripts
  • Use prospect's language — their terminology, their stated priorities
  • Map seller's productprospect's needs explicitly
  • Include proof points where available (case studies, metrics, quotes)
  • Feel tailored, not templated

Section Templates

Hero / Intro

Headline: "[Prospect's Goal] with [Seller's Product]"
Subhead: Tie to their stated priority or top industry challenge
Metrics: 3-4 key facts about the prospect (shows we did homework)

Their Priorities (if discovery follow-up)

Reference specific pain points from conversation:
- Use their exact words where possible
- Show we listened and understood
- Connect each to how we help

Solution Mapping

For each pain point:
├── The challenge (in their words)
├── How [Product] addresses it
├── Proof point or example
└── Outcome / benefit

Use Cases / Demos

3-5 relevant use cases:
├── Visual mockup or interactive demo
├── Business impact (quantified if possible)
├── "How it works" — 3-4 step summary
└── Relevant to their industry/role

ROI / Business Case

Interactive calculator with:
├── Inputs relevant to their business (from research)
│   ├── Number of users/developers
│   ├── Current costs or time spent
│   └── Expected improvement %
├── Outputs:
│   ├── Annual value / savings
│   ├── Cost of solution
│   ├── Net ROI
│   └── Payback period
└── Assumptions clearly stated (editable)

Why Us / Differentiators

├── Differentiators vs. alternatives they might consider
├── Trust, security, compliance positioning
├── Support and partnership model
└── Customer proof points (logos, quotes, case studies)

Next Steps / CTA

├── Clear action aligned to Purpose (c)
├── Specific next step (not vague "let's chat")
├── Contact information
├── Suggested timeline
└── What happens after they take action

Workflow Demo Content

Component Definitions

For each system, define:

component:
  id: "snowflake"
  label: "Snowflake Data Warehouse"
  type: "database"  # database | api | ai | middleware | human | document | output
  icon: "database"
  description: "Financial performance data"
  brand_color: "#29B5E8"

Component types:

  • human — Person initiating or receiving
  • document — PDFs, contracts, files
  • ai — AI/ML models, agents
  • database — Data stores, warehouses
  • api — APIs, services
  • middleware — Integration platforms, MCP servers
  • output — Dashboards, reports, notifications

Flow Steps

For each step, define:

step:
  number: 1
  from: "human"
  to: "claude"
  action: "Initiates performance review"
  description: "Sarah, a Brand Analyst at [Prospect], kicks off the quarterly review..."
  data_example: "Review request: Nike brand, Q4 2025"
  duration: "~1 second"
  value_note: "No manual data gathering required"

Scenario Narrative

Write a clear, specific walkthrough:

Step 1: Human Trigger
"Sarah, a Brand Performance Analyst at Centric Brands, needs to review
Q4 performance for the Nike license agreement. She opens the review
dashboard and clicks 'Start Review'..."

Step 2: Contract Analysis
"Claude retrieves the Nike contract PDF and extracts the performance
obligations: minimum $50M revenue, 12% margin requirement, quarterly
reporting deadline..."

Step 3: Data Query
"Claude formulates a query and sends it to Workato DataGenie:
'Get Q4 2025 revenue and gross margin for Nike brand from Snowflake'..."

Step 4: Results & Synthesis
"Snowflake returns the data. Claude compares actuals vs. obligations:
Revenue $52.3M ✓ (exceeded by $2.3M)
Margin 11.2% ⚠️ (0.8% below threshold)..."

Step 5: Insight Delivery
"Claude synthesizes findings into an executive summary with
recommendations: 'Review promotional spend allocation to improve
margin performance...'"

Phase 4: Visual Design

Color System

:root {
    /* === Prospect Brand (Primary) === */
    --brand-primary: #[extracted from research];
    --brand-secondary: #[extracted];
    --brand-primary-rgb: [r, g, b]; /* For rgba() usage */

    /* === Dark Theme Base === */
    --bg-primary: #0a0d14;
    --bg-elevated: #0f131c;
    --bg-surface: #161b28;
    --bg-hover: #1e2536;

    /* === Text === */
    --text-primary: #ffffff;
    --text-secondary: rgba(255, 255, 255, 0.7);
    --text-muted: rgba(255, 255, 255, 0.5);

    /* === Accent === */
    --accent: var(--brand-primary);
    --accent-hover: var(--brand-secondary);
    --accent-glow: rgba(var(--brand-primary-rgb), 0.3);

    /* === Status === */
    --success: #10b981;
    --warning: #f59e0b;
    --error: #ef4444;
}

Typography

/* Primary: Clean, professional sans-serif */
font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;

/* Headings */
h1: 2.5rem, font-weight: 700
h2: 1.75rem, font-weight: 600
h3: 1.25rem, font-weight: 600

/* Body */
body: 1rem, font-weight: 400, line-height: 1.6

/* Captions/Labels */
small: 0.875rem, font-weight: 500

Visual Elements

Cards:

  • Background: var(--bg-surface)
  • Border: 1px solid rgba(255,255,255,0.1)
  • Border-radius: 12px
  • Box-shadow: subtle, layered
  • Hover: slight elevation, border glow

Buttons:

  • Primary: var(--accent) background, white text
  • Secondary: transparent, accent border
  • Hover: brightness increase, subtle scale

Animations:

  • Transitions: 200-300ms ease
  • Tab switches: fade + slide
  • Hover states: smooth, not jarring
  • Loading: subtle pulse or skeleton

Workflow Demo Specific

Component Nodes:

.node {
    background: var(--bg-surface);
    border: 2px solid var(--brand-primary);
    border-radius: 12px;
    padding: 16px;
    min-width: 140px;
}

.node.active {
    box-shadow: 0 0 20px var(--accent-glow);
    border-color: var(--accent);
}

.node.human {
    border-color: #f59e0b; /* Warm color for humans */
}

.node.ai {
    background: linear-gradient(135deg, var(--bg-surface), var(--bg-elevated));
    border-color: var(--accent);
}

Flow Arrows:

.arrow {
    stroke: var(--text-muted);
    stroke-width: 2;
    fill: none;
    marker-end: url(#arrowhead);
}

.arrow.active {
    stroke: var(--accent);
    stroke-dasharray: 8 4;
    animation: flowDash 1s linear infinite;
}

Canvas:

.canvas {
    background:
        radial-gradient(circle at center, var(--bg-elevated) 0%, var(--bg-primary) 100%),
        url("data:image/svg+xml,..."); /* Subtle grid pattern */
    overflow: auto;
}

Phase 5: Clarifying Questions (REQUIRED)

Before building any asset, always ask clarifying questions. This ensures alignment and prevents wasted effort.

Step 5.1: Summarize Understanding

First, show the user what you understood:

"Here's what I'm planning to build:

**Asset**: [Format] for [Prospect Company]
**Audience**: [Audience type] — specifically [roles if known]
**Goal**: [Purpose] → driving toward [desired action]
**Key themes**: [2-3 main points to emphasize]

[For workflow demos, also show:]
**Components**: [List of systems]
**Flow**: [Step 1] → [Step 2] → [Step 3] → ...

Step 5.2: Ask Standard Questions (ALL formats)

Question Why
"Does this match your vision?" Confirm understanding
"What's the ONE thing this must nail to succeed?" Focus on priority
"Tone preference? (Bold & confident / Consultative / Technical & precise)" Style alignment
"Focused and concise, or comprehensive?" Scope calibration

Step 5.3: Ask Format-Specific Questions

Interactive Landing Page:

  • "Which sections matter most for this audience?"
  • "Any specific demos or use cases to highlight?"
  • "Should I include an ROI calculator?"
  • "Any competitor positioning to address?"

Deck-Style:

  • "How long is the presentation? (helps with slide count)"
  • "Presenting live, or a leave-behind?"
  • "Any specific flow or narrative arc in mind?"

One-Pager:

  • "What's the single most important message?"
  • "Any specific proof point or stat to feature?"
  • "Will this be printed or digital?"

Workflow / Architecture Demo:

  • "Let me confirm the components: [list]. Anything missing?"
  • "Here's the flow I understood: [steps]. Correct?"
  • "Should the demo show realistic sample data, or keep it abstract?"
  • "Any integration details to highlight or downplay?"
  • "Should viewers be able to click through steps, or auto-play?"

Step 5.4: Confirm and Proceed

After user responds:

"Got it. I have what I need. Building your [format] now..."

Or, if still unclear:

"One more quick question: [specific follow-up]"

Max 2 rounds of questions. If still ambiguous, make a reasonable choice and note: "I went with X — easy to adjust if you prefer Y."


Phase 6: Build & Deliver

Build the Asset

Following all specifications above:

  1. Generate structure based on Phase 2
  2. Create content based on Phase 3
  3. Apply visual design based on Phase 4
  4. Ensure all interactive elements work
  5. Test responsiveness (if applicable)

Output Format

All formats: Self-contained HTML file

  • All CSS inline or in <style> tags
  • All JS inline or in <script> tags
  • No external dependencies (except Google Fonts)
  • Single file for easy sharing

File naming: [ProspectName]-[format]-[date].html

  • Example: CentricBrands-workflow-demo-2026-01-28.html

Delivery Message

## ✓ Asset Created: [Prospect Name]

[View your asset](computer:///path/to/file.html)

---

**Summary**
- **Format**: [Interactive Page / Deck / One-Pager / Workflow Demo]
- **Audience**: [Type and roles]
- **Purpose**: [Goal] → [Desired action]
- **Sections/Steps**: [Count and list]

---

**Deployment Options**

To share this with your customer:
- **Static hosting**: Upload to Netlify, Vercel, GitHub Pages, AWS S3, or any static host
- **Password protection**: Most hosts offer this (e.g., Netlify site protection)
- **Direct share**: Send the HTML file directly — it's fully self-contained
- **Embed**: The file can be iframed into other pages if needed

---

**Customization**

Let me know if you'd like to:
- Adjust colors or styling
- Add, remove, or reorder sections
- Refine any messaging or copy
- Change the flow or architecture (for workflow demos)
- Add more interactive elements
- Export as PDF or static images

Phase 7: Iteration Support

After delivery, be ready to iterate:

User Request Action
"Change the colors" Regenerate with new palette, keep content
"Add a section on X" Insert new section, maintain flow
"Make it shorter" Condense, prioritize key points
"The flow is wrong" Rebuild architecture based on correction
"Use our brand instead" Switch from prospect brand to seller brand
"Add more detail on step 3" Expand that section specifically
"Can I get this as a PDF?" Provide print-optimized version

Remember: Default to prospect's brand colors, but seller can adjust to their own brand or a neutral palette after initial build.


Quality Checklist

Before delivering, verify:

Content

  • Prospect company name spelled correctly throughout
  • Leadership names are current (not outdated)
  • Pain points accurately reflect input/transcripts
  • Seller's product accurately represented
  • No placeholder text remaining
  • Proof points are accurate and sourced

Visual

  • Brand colors applied correctly
  • All text readable (contrast)
  • Animations smooth, not distracting
  • Mobile responsive (if interactive page)
  • Dark theme looks polished

Functional

  • All tabs/sections load correctly
  • Interactive elements work (calculators, demos)
  • Workflow steps animate properly (if applicable)
  • Navigation is intuitive
  • CTA is clear and clickable

Professional

  • Tone matches audience
  • Appropriate level of detail for purpose
  • No typos or grammatical errors
  • Feels tailored, not templated

Examples

Example 1: Executive Landing Page

Input:

  • Prospect: Acme Corp (manufacturing)
  • Audience: C-suite
  • Purpose: Exec alignment after discovery
  • Format: Interactive landing page

Output structure:

[Tabs]
Strategic Fit | Business Impact | ROI Calculator | Security & Trust | Next Steps

[Strategic Fit tab]
- Acme's stated priorities (from discovery call)
- How [Product] aligns
- Relevant manufacturing customers

Example 2: Technical Workflow Demo

Input:

  • Prospect: Centric Brands
  • Audience: IT architects
  • Purpose: POC proposal
  • Format: Workflow demo
  • Components: Claude, Workato DataGenie, Snowflake, PDF contracts

Output structure:

[Interactive canvas with 5 nodes]
Human → Claude → PDF Contracts → Workato → Snowflake
         ↓
    [Results back to Human]

[Step-by-step walkthrough with sample data]
[Controls: Play | Pause | Step | Reset]

Example 3: Sales One-Pager

Input:

  • Prospect: TechStart Inc
  • Audience: VP Engineering
  • Purpose: Leave-behind after first meeting
  • Format: One-pager

Output structure:

Hero: "Accelerate TechStart's Product Velocity"
Point 1: [Dev productivity]
Point 2: [Code quality]
Point 3: [Time to market]
Proof: "Similar companies saw 40% faster releases"
CTA: "Schedule technical deep-dive"

Appendix: Component Icons

For workflow demos, use these icon mappings:

Type Icon Example
human 👤 or person SVG User, Analyst, Admin
document 📄 or file SVG PDF, Contract, Report
ai 🤖 or brain SVG Claude, AI Agent
database 🗄️ or cylinder SVG Snowflake, Postgres
api 🔌 or plug SVG REST API, GraphQL
middleware ⚡ or hub SVG Workato, MCP Server
output 📊 or screen SVG Dashboard, Report

Appendix: Brand Color Fallbacks

If brand colors cannot be extracted:

Industry Primary Secondary
Technology #2563eb #7c3aed
Finance #0f172a #3b82f6
Healthcare #0891b2 #06b6d4
Manufacturing #ea580c #f97316
Retail #db2777 #ec4899
Energy #16a34a #22c55e
Default #3b82f6 #8b5cf6

Skill created for generalized sales asset generation. Works for any seller, any product, any prospect.

生成每日销售简报,按优先级整理会议、交易和待办事项。支持手动输入或连接日历、CRM等工具自动获取数据,提供清晰的可操作日报。
morning briefing daily brief what's on my plate today prep my day start my day
sales/skills/daily-briefing/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill daily-briefing -g -y
SKILL.md
Frontmatter
{
    "name": "daily-briefing",
    "description": "Start your day with a prioritized sales briefing. Works standalone when you tell me your meetings and priorities, supercharged when you connect your calendar, CRM, and email. Trigger with \"morning briefing\", \"daily brief\", \"what's on my plate today\", \"prep my day\", or \"start my day\"."
}

Daily Sales Briefing

Get a clear view of what matters most today. This skill works with whatever you tell me, and gets richer when you connect your tools.

How It Works

┌─────────────────────────────────────────────────────────────────┐
│                      DAILY BRIEFING                              │
├─────────────────────────────────────────────────────────────────┤
│  ALWAYS (works standalone)                                       │
│  ✓ You tell me: today's meetings, key deals, priorities         │
│  ✓ I organize: prioritized action plan for your day             │
│  ✓ Output: scannable 2-minute briefing                          │
├─────────────────────────────────────────────────────────────────┤
│  SUPERCHARGED (when you connect your tools)                      │
│  + Calendar: auto-pull today's meetings with attendees          │
│  + CRM: pipeline alerts, tasks, deal health                     │
│  + Email: unread from key accounts, waiting on replies          │
│  + Enrichment: overnight signals on your accounts               │
└─────────────────────────────────────────────────────────────────┘

Getting Started

When you run this skill, I'll ask for what I need:

If no calendar connected:

"What meetings do you have today? (Just paste your calendar or list them)"

If no CRM connected:

"What deals are you focused on this week? Any that need attention?"

If you have connectors: I'll pull everything automatically and just show you the briefing.


Connectors (Optional)

Connect your tools to supercharge this skill:

Connector What It Adds
Calendar Today's meetings with attendees, times, and context
CRM Open pipeline, deals closing soon, overdue tasks, stale deals
Email Unread from opportunity contacts, emails waiting on replies
Enrichment Overnight signals: funding, hiring, news on your accounts

No connectors? No problem. Tell me your meetings and deals, and I'll create your briefing.


Output Format

# Daily Briefing | [Day, Month Date]

---

## #1 Priority

**[Most important thing to do today]**
[Why it matters and what to do about it]

---

## Today's Numbers

| Open Pipeline | Closing This Month | Meetings Today | Action Items |
|---------------|-------------------|----------------|--------------|
| $[X] | $[X] | [N] | [N] |

---

## Today's Meetings

### [Time] — [Company] ([Meeting Type])
**Attendees:** [Names]
**Context:** [One-line: deal status, last touch, what's at stake]
**Prep:** [Quick action before this meeting]

### [Time] — [Company] ([Meeting Type])
**Attendees:** [Names]
**Context:** [One-line context]
**Prep:** [Quick action]

*Run `call-prep [company]` for detailed meeting prep*

---

## Pipeline Alerts

### Needs Attention
| Deal | Stage | Amount | Alert | Action |
|------|-------|--------|-------|--------|
| [Deal] | [Stage] | $[X] | [Why flagged] | [What to do] |

### Closing This Week
| Deal | Close Date | Amount | Confidence | Blocker |
|------|------------|--------|------------|---------|
| [Deal] | [Date] | $[X] | [H/M/L] | [If any] |

---

## Email Priorities

### Needs Response
| From | Subject | Received |
|------|---------|----------|
| [Name @ Company] | [Subject] | [Time] |

### Waiting On Reply
| To | Subject | Sent | Days Waiting |
|----|---------|------|--------------|
| [Name @ Company] | [Subject] | [Date] | [N] |

---

## Suggested Actions

1. **[Action]** — [Why now]
2. **[Action]** — [Why now]
3. **[Action]** — [Why now]

---

*Run `call-prep [company]` before your meetings*
*Run `call-follow-up` after each call*

Execution Flow

Step 1: Gather Context

If connectors available:

1. Calendar → Get today's events
   - Filter to external meetings (non-company attendees)
   - Pull: time, title, attendees, description

2. CRM → Query your pipeline
   - Open opportunities owned by you
   - Flag: closing this week, no activity 7+ days, slipped dates
   - Get: overdue tasks, upcoming tasks

3. Email → Check priority messages
   - Unread from opportunity contact domains
   - Sent messages with no reply (3+ days)

4. Enrichment → Check signals (if available)
   - Funding, hiring, news on open accounts

If no connectors:

Ask user:
1. "What meetings do you have today?"
2. "What deals are you focused on? Any closing soon or needing attention?"
3. "Anything urgent I should know about?"

Work with whatever they provide.

Step 2: Prioritize

Priority ranking:
1. URGENT: Deal closing today/tomorrow not yet won
2. HIGH: Meeting today with high-value opportunity
3. HIGH: Unread email from decision-maker
4. MEDIUM: Deal closing this week
5. MEDIUM: Stale deal (7+ days no activity)
6. LOW: Tasks due this week

Select #1 Priority:
- If meeting with >$50K deal today → prep that
- If deal closing today → focus on close
- If urgent email from buyer → respond first
- Else → highest-value stale deal

Step 3: Generate Briefing

Assemble sections based on available data:

1. #1 Priority — Always include (even if simple)
2. Today's Numbers — If CRM connected, otherwise skip
3. Today's Meetings — From calendar or user input
4. Pipeline Alerts — If CRM connected
5. Email Priorities — If email connected
6. Suggested Actions — Always include top 3 actions

Quick Mode

Say "quick brief" or "tldr my day" for abbreviated version:

# Quick Brief | [Date]

**#1:** [Priority action]

**Meetings:** [N] — [Company 1], [Company 2], [Company 3]

**Alerts:**
- [Alert 1]
- [Alert 2]

**Do Now:** [Single most important action]

End of Day Mode

Say "wrap up my day" or "end of day summary" after your last meeting:

# End of Day | [Date]

**Completed:**
- [Meeting 1] — [Outcome]
- [Meeting 2] — [Outcome]

**Pipeline Changes:**
- [Deal] moved to [Stage]

**Tomorrow's Focus:**
- [Priority 1]
- [Priority 2]

**Open Loops:**
- [ ] [Unfinished item needing follow-up]

Tips

  1. Connect your calendar first — Biggest time saver
  2. Add CRM second — Unlocks pipeline alerts
  3. Even without connectors — Just tell me your meetings and I'll help prioritize

Related Skills

  • call-prep — Deep prep for any specific meeting
  • call-follow-up — Process notes after calls
  • account-research — Research a company before first meeting
基于对目标客户的研究,撰写高度个性化的外联邮件或LinkedIn消息。支持结合丰富化工具和CRM数据增强内容,确保非通用模板,提供邮件草稿及跟进策略。
draft outreach to [person/company] write cold email to [prospect] reach out to [name]
sales/skills/draft-outreach/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill draft-outreach -g -y
SKILL.md
Frontmatter
{
    "name": "draft-outreach",
    "description": "Research a prospect then draft personalized outreach. Uses web research by default, supercharged with enrichment and CRM. Trigger with \"draft outreach to [person\/company]\", \"write cold email to [prospect]\", \"reach out to [name]\"."
}

Draft Outreach

Research first, then draft. This skill never sends generic outreach - it always researches the prospect first to personalize the message. Works standalone with web search, supercharged when you connect your tools.

Connectors (Optional)

Connector What It Adds
Enrichment Verified email, phone, background details
CRM Prior relationship context, existing contacts
Email Create draft directly in your inbox

No connectors? Web research works great. I'll output the email text for you to copy.


How It Works

+------------------------------------------------------------------+
|                      DRAFT OUTREACH                               |
|                                                                   |
|  Step 1: RESEARCH (always happens first)                         |
|  - Web search (default)                                           |
|  - + Enrichment (if enrichment tools connected)                  |
|  - + CRM (if CRM connected)                                      |
|                                                                   |
|  Step 2: DRAFT (based on research)                               |
|  - Personalized opening (from research)                          |
|  - Relevant hook (their priorities)                              |
|  - Clear CTA                                                      |
|                                                                   |
|  Step 3: DELIVER (based on connectors)                           |
|  - Email draft (if email connected)                              |
|  - Copy for LinkedIn (always)                                    |
|  - Output to user (always)                                        |
+------------------------------------------------------------------+

Output Format

# Outreach Draft: [Person] @ [Company]
**Generated:** [Date] | **Research Sources:** [Web, Enrichment, CRM]

---

## Research Summary

**Target:** [Name], [Title] at [Company]
**Hook:** [Why reaching out now - the personalized angle]
**Goal:** [What you want from this outreach]

---

## Email Draft

**To:** [email if known, or "find email" note]
**Subject:** [Personalized subject line]

---

[Email body]

---

**Subject Line Alternatives:**
1. [Option 2]
2. [Option 3]

---

## LinkedIn Message (if no email)

**Connection Request (< 300 chars):**
[Short, no-pitch connection request]

**Follow-up Message (after connected):**
[Value-first message]

---

## Why This Approach

| Element | Based On |
|---------|----------|
| Opening | [Research finding that makes it personal] |
| Hook | [Their priority/pain point] |
| Proof | [Relevant customer story] |
| CTA | [Low-friction ask] |

---

## Email Draft Status

[Draft created - check ~~email]
[Email not connected - copy email above]
[No email found - use LinkedIn approach]

---

## Follow-up Sequence (Optional)

**Day 3 - Follow-up 1:**
[Short, new angle]

**Day 7 - Follow-up 2:**
[Different value prop]

**Day 14 - Break-up:**
[Final attempt]

Execution Flow

Step 1: Parse Request

Input patterns:
- "draft outreach to John Smith at Acme" → Person + company
- "write cold email to Acme's CTO" → Role + company
- "reach out to sarah@acme.com" → Email provided
- "LinkedIn message to [LinkedIn URL]" → Profile provided

Step 2: Research First (Always)

Use research-prospect skill internally:

1. Web search for company + person
2. If Enrichment connected: Get verified contact info, background
3. If CRM connected: Check for prior relationship

Must find before drafting:

  • Who they are (title, background)
  • What the company does
  • Recent news or trigger
  • Personalization hook

Step 3: Identify Hook

Priority order for hooks:
1. Trigger event (funding, hiring, news) → Most timely
2. Mutual connection → Social proof
3. Their content (post, article, talk) → Shows you did research
4. Company initiative → Relevant to their priorities
5. Role-based pain point → Least personal but still relevant

Step 4: Draft Message

Email Structure (AIDA):

SUBJECT: [Personalized, <50 chars, no spam words]

[Opening: Personal hook - shows you researched them]

[Interest: Their problem/opportunity in 1-2 sentences]

[Desire: Brief proof point - similar company result]

[Action: Clear, low-friction CTA]

[Signature]

LinkedIn Connection Request (<300 chars):

Hi [Name], [Mutual connection/shared interest/genuine compliment].
Would love to connect. [No pitch]

LinkedIn Follow-up Message:

Thanks for connecting! [Value-first: insight, article, observation]

[Soft transition to why you reached out]

[Question, not pitch]

Step 5: Create Email Draft

If email connector available:
1. Create draft with to, subject, body
2. Return draft link
3. Note: "Draft created - review and send"

If not available:
1. Output email text
2. Note: "Copy to your email client"

Capability by Connector

Capability Web Only + Enrichment + CRM + Email
Personalized opening Basic Deep With history Same
Verified email No Yes Yes Yes
Background details Public only Full Full Full
Prior relationship No No Yes Yes
Auto-create draft No No No Yes

Message Templates by Scenario

Cold Outreach (No Prior Relationship)

Subject: [Their initiative] + [your angle]

Hi [Name],

[Personal hook based on research - news, content, mutual connection].

[1 sentence on their likely challenge based on role/company].

[Brief proof: "We helped [Similar Company] achieve [Result]".]

Worth a 15-min call to see if relevant?

[Signature]

Warm Outreach (Have Met / Mutual Connection)

Subject: Following up from [context]

Hi [Name],

[Reference to how you know them / who connected you].

[Why reaching out now - their trigger].

[Specific value you can offer].

[CTA]

Re-Engagement (Went Dark)

Subject: [Short, curiosity-driven]

Hi [Name],

[Acknowledge time passed without being guilt-trippy].

[New reason to reconnect - their news or your news].

[Simple question to re-open dialogue].

[Signature]

Post-Event Follow-up

Subject: Great meeting you at [Event]

Hi [Name],

[Specific memory from conversation].

[Value-add: article, intro, resource related to what you discussed].

[Soft CTA for next conversation].

Email Style Guidelines

  1. Be concise but informative — Get to the point quickly. Busy people skim.
  2. No markdown formatting — Never use asterisks, bold (text), or other markdown. Write plain text that looks natural in any email client.
  3. Short paragraphs — 2-3 sentences max per paragraph. White space is your friend.
  4. Simple lists — If listing items, use plain dashes. No fancy formatting.

Good:

Here's what I can share:
- Case study from a similar company
- 15-min intro call this week
- Quick demo if helpful

Bad:

**What I Can Offer:**
- **Case study** from a similar company
- **Intro call** this week

What NOT to Do

Generic openers:

  • "I hope this email finds you well"
  • "I'm reaching out because..."
  • "I wanted to introduce myself"

Feature dumps:

  • Long paragraphs about your product
  • Multiple value props at once
  • No clear CTA

Fake personalization:

  • "I noticed you work at [Company]" (obviously)
  • "Congrats on your role" (without context)

Markdown in emails:

  • Using bold or italic asterisks
  • Headers or formatted lists that won't render

Instead:

  • Lead with something specific you learned
  • One clear value prop
  • One clear ask
  • Plain text formatting only

Channel Selection

IF verified email available:
  → Email preferred (higher response rate)
  → Also provide LinkedIn backup

IF no email:
  → LinkedIn connection request
  → Follow-up message template for after connection

IF warm intro possible:
  → Suggest mutual connection outreach first

Company Configuration [CUSTOMIZE]

## Outreach Settings

- My name: [Your Name]
- My title: [Your Title]
- My company: [Company Name]
- Value prop: [One sentence - what you help with]

## Signature
[Your preferred email signature]

## Proof Points
- [Customer 1]: [Result]
- [Customer 2]: [Result]
- [Customer 3]: [Result]

## CTA Options
- Default: "Worth a 15-min call?"
- Softer: "Open to learning more?"
- Specific: "Can I send over a quick demo?"

## Tone
- [Professional / Casual / Direct]
- Industry-specific language: [Yes/No]

Example

Input: "draft outreach to the Head of Engineering at Notion"

Research finds:

  • Name: David Tibbitts
  • Recent news: Notion launched AI features
  • Hiring: 5 ML engineer roles open
  • Background: Ex-Facebook, Stanford CS

Output:

# Outreach Draft: David Tibbitts @ Notion

## Research Summary
**Target:** David Tibbitts, Head of Engineering at Notion
**Hook:** They're scaling AI features and hiring ML talent
**Goal:** Intro call about AI infrastructure

---

## Email Draft

**To:** david@notion.so
**Subject:** Notion's AI scaling + a thought

---

Hi David,

Saw Notion's AI rollout is gaining serious traction - congrats.
With 5 ML roles open, seems like you're scaling fast.

Curious how you're thinking about inference infrastructure
as usage grows. We helped [Similar Company] cut their AI
serving costs 40% while improving latency.

Worth a 15-min call to see if relevant to your roadmap?

Best,
[Name]

---

**Subject Alternatives:**
1. Notion AI + scaling question
2. Quick thought on Notion's ML hiring

---

## Email Draft Status
Draft created - check ~~email
根据CRM数据或手动输入,生成加权销售预测,包含最佳/可能/最差情景、承诺与增量拆解及缺口分析。适用于季度预测会议、管线覆盖率检查及Deal优先级决策。
准备季度销售预测会议 评估管线对目标的缺口 决定哪些交易确认为承诺额 检查管线覆盖率
sales/skills/forecast/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill forecast -g -y
SKILL.md
Frontmatter
{
    "name": "forecast",
    "description": "Generate a weighted sales forecast with best\/likely\/worst scenarios, commit vs. upside breakdown, and gap analysis. Use when preparing a quarterly forecast call, assessing gap-to-quota from a pipeline CSV, deciding which deals to commit vs. call upside, or checking pipeline coverage against your number.",
    "argument-hint": "<period>"
}

/forecast

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Generate a weighted sales forecast with risk analysis and commit recommendations.

Usage

/forecast [period]

Generate a forecast for: $ARGUMENTS

If a file is referenced: @$1


How It Works

┌─────────────────────────────────────────────────────────────────┐
│                        FORECAST                                  │
├─────────────────────────────────────────────────────────────────┤
│  STANDALONE (always works)                                       │
│  ✓ Upload CSV export from your CRM                              │
│  ✓ Or paste/describe your pipeline deals                        │
│  ✓ Set your quota and timeline                                  │
│  ✓ Get weighted forecast with stage probabilities               │
│  ✓ Risk-adjusted projections (best/likely/worst case)           │
│  ✓ Commit vs. upside breakdown                                  │
│  ✓ Gap analysis and recommendations                             │
├─────────────────────────────────────────────────────────────────┤
│  SUPERCHARGED (when you connect your tools)                      │
│  + CRM: Pull pipeline automatically, real-time data             │
│  + Historical win rates by stage, segment, deal size            │
│  + Activity signals for risk scoring                            │
│  + Automatic refresh and tracking over time                     │
└─────────────────────────────────────────────────────────────────┘

What I Need From You

Step 1: Your Pipeline Data

Option A: Upload a CSV Export your pipeline from your CRM (e.g. Salesforce, HubSpot). I need at minimum:

  • Deal/Opportunity name
  • Amount
  • Stage
  • Close date

Helpful if you have:

  • Owner (if team forecast)
  • Last activity date
  • Created date
  • Account name

Option B: Paste your deals

Acme Corp - $50K - Negotiation - closes Jan 31
TechStart - $25K - Demo scheduled - closes Feb 15
BigCo - $100K - Discovery - closes Mar 30

Option C: Describe your territory "I have 8 deals in pipeline totaling $400K. Two are in negotiation ($120K), three in evaluation ($180K), three in discovery ($100K)."

Step 2: Your Targets

  • Quota: What's your number? (e.g., "$500K this quarter")
  • Timeline: When does the period end? (e.g., "Q1 ends March 31")
  • Already closed: How much have you already booked this period?

Output

# Sales Forecast: [Period]

**Generated:** [Date]
**Data Source:** [CSV upload / Manual input / CRM]

---

## Summary

| Metric | Value |
|--------|-------|
| **Quota** | $[X] |
| **Closed to Date** | $[X] ([X]% of quota) |
| **Open Pipeline** | $[X] |
| **Weighted Forecast** | $[X] |
| **Gap to Quota** | $[X] |
| **Coverage Ratio** | [X]x |

---

## Forecast Scenarios

| Scenario | Amount | % of Quota | Assumptions |
|----------|--------|------------|-------------|
| **Best Case** | $[X] | [X]% | All deals close as expected |
| **Likely Case** | $[X] | [X]% | Stage-weighted probabilities |
| **Worst Case** | $[X] | [X]% | Only commit deals close |

---

## Pipeline by Stage

| Stage | # Deals | Total Value | Probability | Weighted Value |
|-------|---------|-------------|-------------|----------------|
| Negotiation | [X] | $[X] | 80% | $[X] |
| Proposal | [X] | $[X] | 60% | $[X] |
| Evaluation | [X] | $[X] | 40% | $[X] |
| Discovery | [X] | $[X] | 20% | $[X] |
| **Total** | [X] | $[X] | — | $[X] |

---

## Commit vs. Upside

### Commit (High Confidence)
Deals you'd stake your forecast on:

| Deal | Amount | Stage | Close Date | Why Commit |
|------|--------|-------|------------|------------|
| [Deal] | $[X] | [Stage] | [Date] | [Reason] |

**Total Commit:** $[X]

### Upside (Lower Confidence)
Deals that could close but have risk:

| Deal | Amount | Stage | Close Date | Risk Factor |
|------|--------|-------|------------|-------------|
| [Deal] | $[X] | [Stage] | [Date] | [Risk] |

**Total Upside:** $[X]

---

## Risk Flags

| Deal | Amount | Risk | Recommendation |
|------|--------|------|----------------|
| [Deal] | $[X] | Close date passed | Update close date or move to lost |
| [Deal] | $[X] | No activity in 14+ days | Re-engage or downgrade stage |
| [Deal] | $[X] | Close date this week, still in discovery | Unlikely to close — push out |

---

## Gap Analysis

**To hit quota, you need:** $[X] more

**Options to close the gap:**
1. **Accelerate [Deal]** — Currently [stage], worth $[X]. If you can close by [date], you're at [X]% of quota.
2. **Revive [Stalled Deal]** — Last active [date]. Worth $[X]. Reach out to [contact].
3. **New pipeline needed** — You need $[X] in new opportunities at [X]x coverage to be safe.

---

## Recommendations

1. [ ] [Specific action for highest-impact deal]
2. [ ] [Action for at-risk deal]
3. [ ] [Pipeline generation recommendation if gap exists]

Stage Probabilities (Default)

If you don't provide custom probabilities, I'll use:

Stage Default Probability
Closed Won 100%
Negotiation / Contract 80%
Proposal / Quote 60%
Evaluation / Demo 40%
Discovery / Qualification 20%
Prospecting / Lead 10%

Tell me if your stages or probabilities are different.


If CRM Connected

  • I'll pull your pipeline automatically
  • Use your actual historical win rates
  • Factor in activity recency for risk scoring
  • Track forecast changes over time
  • Compare to previous forecasts

Tips

  1. Be honest about commit — Only commit deals you'd bet on. Upside is for everything else.
  2. Update close dates — Stale close dates kill forecast accuracy. Push out deals that won't close in time.
  3. Coverage matters — 3x pipeline coverage is healthy. Below 2x is risky.
  4. Activity = signal — Deals with no recent activity are at higher risk than stage suggests.
用于分析销售管道健康度,通过CSV、手动输入或CRM集成,识别停滞/风险商机,审计数据卫生问题,并生成按优先级排序的周行动建议。
运行每周管道审查 决定本周重点跟进的交易 发现停滞或卡住的机会 审计数据卫生问题如关闭日期错误 识别单线程交易
sales/skills/pipeline-review/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill pipeline-review -g -y
SKILL.md
Frontmatter
{
    "name": "pipeline-review",
    "description": "Analyze pipeline health — prioritize deals, flag risks, get a weekly action plan. Use when running a weekly pipeline review, deciding which deals to focus on this week, spotting stale or stuck opportunities, auditing for hygiene issues like bad close dates, or identifying single-threaded deals.",
    "argument-hint": "<segment or rep>"
}

/pipeline-review

If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.

Analyze your pipeline health, prioritize deals, and get actionable recommendations for where to focus.

Usage

/pipeline-review [segment or rep]

Review pipeline for: $ARGUMENTS

If a file is referenced: @$1


How It Works

┌─────────────────────────────────────────────────────────────────┐
│                     PIPELINE REVIEW                              │
├─────────────────────────────────────────────────────────────────┤
│  STANDALONE (always works)                                       │
│  ✓ Upload CSV export from your CRM                              │
│  ✓ Or paste/describe your deals                                 │
│  ✓ Health check: flag stale, stuck, and at-risk deals          │
│  ✓ Prioritization: rank deals by impact and closability        │
│  ✓ Hygiene audit: missing data, bad close dates, single-thread │
│  ✓ Weekly action plan: what to focus on                        │
├─────────────────────────────────────────────────────────────────┤
│  SUPERCHARGED (when you connect your tools)                      │
│  + CRM: Pull pipeline automatically, update records             │
│  + Activity data for engagement scoring                         │
│  + Historical patterns for risk prediction                      │
│  + Calendar: See upcoming meetings per deal                     │
└─────────────────────────────────────────────────────────────────┘

What I Need From You

Option A: Upload a CSV Export your pipeline from your CRM (e.g. Salesforce, HubSpot). Helpful fields:

  • Deal/Opportunity name
  • Account name
  • Amount
  • Stage
  • Close date
  • Created date
  • Last activity date
  • Owner (if reviewing a team)
  • Primary contact

Option B: Paste your deals

Acme Corp - $50K - Negotiation - closes Jan 31 - last activity Jan 20
TechStart - $25K - Demo scheduled - closes Feb 15 - no activity in 3 weeks
BigCo - $100K - Discovery - closes Mar 30 - created last week

Option C: Describe your pipeline "I have 12 deals. Two big ones in negotiation that I'm confident about. Three stuck in discovery for over a month. The rest are mid-stage but I haven't talked to some of them in a while."


Output

# Pipeline Review: [Date]

**Data Source:** [CSV upload / Manual input / CRM]
**Deals Analyzed:** [X]
**Total Pipeline Value:** $[X]

---

## Pipeline Health Score: [X/100]

| Dimension | Score | Issue |
|-----------|-------|-------|
| **Stage Progression** | [X]/25 | [X] deals stuck in same stage 30+ days |
| **Activity Recency** | [X]/25 | [X] deals with no activity in 14+ days |
| **Close Date Accuracy** | [X]/25 | [X] deals with close date in past |
| **Contact Coverage** | [X]/25 | [X] deals single-threaded |

---

## Priority Actions This Week

### 1. [Highest Priority Deal]
**Why:** [Reason — large, closing soon, at risk, etc.]
**Action:** [Specific next step]
**Impact:** $[X] if you close it

### 2. [Second Priority]
**Why:** [Reason]
**Action:** [Next step]

### 3. [Third Priority]
**Why:** [Reason]
**Action:** [Next step]

---

## Deal Prioritization Matrix

### Close This Week (Focus Time Here)
| Deal | Amount | Stage | Close Date | Next Action |
|------|--------|-------|------------|-------------|
| [Deal] | $[X] | [Stage] | [Date] | [Action] |

### Close This Month (Keep Warm)
| Deal | Amount | Stage | Close Date | Status |
|------|--------|-------|------------|--------|
| [Deal] | $[X] | [Stage] | [Date] | [Status] |

### Nurture (Check-in Periodically)
| Deal | Amount | Stage | Close Date | Status |
|------|--------|-------|------------|--------|
| [Deal] | $[X] | [Stage] | [Date] | [Status] |

---

## Risk Flags

### Stale Deals (No Activity 14+ Days)
| Deal | Amount | Last Activity | Days Silent | Recommendation |
|------|--------|---------------|-------------|----------------|
| [Deal] | $[X] | [Date] | [X] | [Re-engage / Downgrade / Remove] |

### Stuck Deals (Same Stage 30+ Days)
| Deal | Amount | Stage | Days in Stage | Recommendation |
|------|--------|-------|---------------|----------------|
| [Deal] | $[X] | [Stage] | [X] | [Push / Multi-thread / Qualify out] |

### Past Close Date
| Deal | Amount | Close Date | Days Overdue | Recommendation |
|------|--------|------------|--------------|----------------|
| [Deal] | $[X] | [Date] | [X] | [Update date / Push to next quarter / Close lost] |

### Single-Threaded (Only One Contact)
| Deal | Amount | Contact | Risk | Recommendation |
|------|--------|---------|------|----------------|
| [Deal] | $[X] | [Name] | Champion leaves = deal dies | [Identify additional stakeholders] |

---

## Hygiene Issues

| Issue | Count | Deals | Action |
|-------|-------|-------|--------|
| Missing close date | [X] | [List] | Add realistic close dates |
| Missing amount | [X] | [List] | Estimate or qualify |
| Missing next step | [X] | [List] | Define next action |
| No primary contact | [X] | [List] | Assign contact |

---

## Pipeline Shape

### By Stage
| Stage | # Deals | Value | % of Pipeline |
|-------|---------|-------|---------------|
| [Stage] | [X] | $[X] | [X]% |

### By Close Month
| Month | # Deals | Value |
|-------|---------|-------|
| [Month] | [X] | $[X] |

### By Deal Size
| Size | # Deals | Value |
|------|---------|-------|
| $100K+ | [X] | $[X] |
| $50K-100K | [X] | $[X] |
| $25K-50K | [X] | $[X] |
| <$25K | [X] | $[X] |

---

## Recommendations

### This Week
1. [ ] [Specific action for priority deal 1]
2. [ ] [Action for at-risk deal]
3. [ ] [Hygiene task]

### This Month
1. [ ] [Strategic action]
2. [ ] [Pipeline building if needed]

---

## Deals to Consider Removing

These deals may be dead weight:

| Deal | Amount | Reason | Recommendation |
|------|--------|--------|----------------|
| [Deal] | $[X] | [No activity 60+ days, no response] | Mark closed-lost |
| [Deal] | $[X] | [Pushed 3+ times, no champion] | Qualify out |

Prioritization Framework

I'll rank your deals using this framework:

Factor Weight What I Look For
Close Date 30% Deals closing soonest get priority
Deal Size 25% Bigger deals = more focus
Stage 20% Later stage = more focus
Activity 15% Active deals get prioritized
Risk 10% Lower risk = safer bet

You can tell me to weight differently: "Focus on big deals over soon deals" or "I need quick wins, prioritize close dates."


If CRM Connected

  • I'll pull your pipeline automatically
  • Update records with new close dates, stages, next steps
  • Create follow-up tasks
  • Track hygiene improvements over time

Tips

  1. Review weekly — Pipeline health decays fast. Weekly reviews catch issues early.
  2. Kill dead deals — Stale opportunities inflate your pipeline and distort forecasts. Be ruthless.
  3. Multi-thread everything — If one person goes dark, you need a backup contact.
  4. Close dates should mean something — A close date is when you expect signature, not when you hope for one.
基于CRM和邮件数据,按优先级筛选今日最佳潜在客户,生成通话要点与目标,提议日历时间块并起草跟进邮件,全程需人工确认以确保安全。
需要制定今日电话销售计划 希望根据近期活动和高价值线索优化呼叫列表 需要为特定日期安排客户回访
small-business/skills/call-list/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill call-list -g -y
SKILL.md
Frontmatter
{
    "name": "call-list",
    "description": "Ranks the top-5 leads most worth calling today, supplies talking points from email history, blocks time on the calendar, and drafts follow-up messages. Accepts optional count and date arguments.",
    "allowed-tools": "Read, WebFetch, Bash"
}

Run the lead prioritization. Scan the pipeline, rank by urgency and opportunity, pull relevant email context, and get the owner ready to make calls.

Parse arguments:

  • --n (default: 5) — number of leads to surface (1–10)
  • --date (default: today) — date to build the call list for (YYYY-MM-DD)

Step 1 — Pipeline scan

Using the lead-triage skill workflow:

  1. Pull open HubSpot deals and contacts with activity in the last 30 days.
  2. Pull email threads from Mail for each lead (last 3 emails per contact).
  3. Score each lead on:
    • Recency: days since last owner touchpoint (lower = better)
    • Stage: how close to close (later stage = higher priority)
    • Signal: any recent inbound activity (email open, reply, calendar hold, web visit)
    • Value: deal size from HubSpot

Step 2 — Rank and select top N

Rank all scored leads and select the top --n. For ties, prefer leads with unanswered inbound signals.

For each selected lead, produce a call card:

{Rank}. {Contact Name} — {Company}
Deal: ${amount} | Stage: {stage} | Last contact: {X days ago}
Signal: {most recent activity}

TALKING POINTS
• {point from email/deal context}
• {point from email/deal context}
• {open question to ask}

GOAL FOR THIS CALL: {one sentence — advance to next stage / re-engage / close}

Step 3 — Calendar block

For each lead on the list, offer to block 20 minutes on the owner's calendar for the target date.

Show the proposed calendar entries:

{time slot} — Call: {Contact Name} ({Company})

Wait for owner to confirm which calls to block before creating calendar events.

Step 4 — Draft follow-ups

For any lead that has an unanswered email older than 3 days, draft a brief follow-up:

Subject: Re: {thread subject}

Hi {first name},

{One sentence referencing prior conversation}. {One sentence with a clear next step or question}.

{Sign-off}

Connector failures

If HubSpot is unreachable, stop and tell the owner — lead scoring requires CRM data. If Mail is unreachable, skip Steps 3-4 (email context and follow-ups) and note "Mail not connected — email context and follow-up drafts skipped" in output. If Google Calendar is unreachable, skip calendar blocking and note it.

Approval gates

  • Never send emails automatically. Present drafts for owner approval only.
  • Never create calendar blocks without owner confirmation — show the proposed list first.
  • Never update HubSpot deal stages automatically.

Output

Present the ranked call list with talk tracks. Then show proposed calendar blocks and ask for confirmation. Then show follow-up drafts and ask which to send.

生成30/60/90天现金流预测,包含置信区间和风险预警。支持QuickBooks、支付网关或CSV数据,回答发薪、跑道等资金问题。
预测我的现金流 我能否按时发薪 提及资金跑道 提及现金危机
small-business/skills/cash-flow-snapshot/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill cash-flow-snapshot -g -y
SKILL.md
Frontmatter
{
    "name": "cash-flow-snapshot",
    "description": "Reads AR\/AP, historical cash timing, and known fixed costs from QuickBooks, PayPal, Stripe, or Square — or a CSV upload — and produces a 30\/60\/90-day cash flow forecast with percentage-variance confidence bands and named risk flags. Delivers a chat summary and a downloadable XLSX. Use when the user asks \"forecast my cash flow,\" \"will I make payroll,\" mentions \"runway,\" or says \"cash crunch.\" Falls back to CSV upload when no connector is live.\n",
    "compatibility": "Requires one or more of: QuickBooks MCP, PayPal MCP, Stripe MCP, Square MCP, file upload (CSV fallback). Output uses xlsx skill."
}

Cash Flow Snapshot

Produces a 30/60/90-day cash flow forecast with percentage-variance confidence bands and named risk flags. Delivers a two-part output: a concise chat summary and a downloadable XLSX workbook.

Quick start

"Will I make payroll next month?"

Claude pulls AR/AP and fixed costs from connected sources, calculates expected inflows and outflows across 30, 60, and 90-day windows, applies confidence bands based on each customer's historical payment variance, and flags specific risks by name.


Workflow

Step 1 — Identify available data sources

Check which connectors are live. Try in this order:

  1. QuickBooks — primary source for AR aging, AP, and fixed costs
  2. PayPal — transaction history and settlement timing
  3. Stripe — charge and payout history
  4. Square — sales and payout history
  5. CSV upload — fallback if no connector is connected

If no connector is live and no file is attached, ask the user to either connect a source or upload a CSV (income/expense tabular data, any reasonable format). Note which sources were used in the output — this affects confidence band width.

Step 2 — Pull the data

From QuickBooks:

  • AR aging report: customer name, invoice amount, invoice date, due date, days outstanding
  • AP: vendor name, amount due, due date
  • Recurring fixed costs: rent, payroll, subscriptions (look for recurring transactions)

From PayPal / Stripe / Square:

  • Settlement history: transaction date, amount, settlement date
  • Use settlement lag (transaction date → payout date) to compute each source's average and variance payment delay

From CSV upload:

  • Parse as income/expense tabular data
  • Required columns (flexible naming): date, amount, type (income or expense), description
  • If columns are ambiguous, show the header row and ask the user to confirm mapping

Step 3 — Compute historical payment timing

For each AR customer (or income source from CSV), calculate:

  • Mean payment lag — average days from invoice/transaction date to receipt
  • Payment variance — standard deviation of payment lag across last 6–12 payments
  • Use variance to set confidence band width (see Step 4)

If fewer than 3 payments exist for a customer, use the population mean as the point estimate and apply a ±30% variance band as the default. When running on CSV data with sufficient history (≥3 payments per source), compute the band from the actual payment variance — do not assume ±30%.

Step 4 — Build the 30/60/90-day forecast

Produce three time windows: 0–30 days, 31–60 days, 61–90 days.

For each window, compute:

Line Method
Expected inflows AR due in window, adjusted for mean payment lag
Expected outflows AP due in window + fixed costs falling in window
Net cash position Inflows − Outflows
Confidence band ± weighted average payment variance as a % of expected inflows

Confidence band formula:

band_pct = weighted_avg_stddev_days / avg_payment_lag_days
low  = net_cash × (1 − band_pct)
high = net_cash × (1 + band_pct)

Round band_pct to one decimal place. Cap at ±50% — higher variance means the data is too thin to model; flag it instead (see Step 5).

Step 5 — Flag named risks

Scan for conditions that push the low-band estimate negative or create a liquidity crunch. For each risk found, produce a one-line flag:

  • Late-payer risk: "Customer X historically pays 18 days late; that shifts their $8,400 invoice out of the 30-day window into day 48."
  • Payroll crunch: "Payroll ($22,000) hits April 15. Low-band cash on hand April 14: $19,200. Shortfall risk: $2,800."
  • Thin data warning: "Only 2 payments on record for Customer Y — confidence band set to default ±30%."
  • No-connector warning: "Running on CSV data only — no real-time AP or recurring cost data. Confidence bands are wider than normal."

Limit to the top 5 risks by severity (largest dollar impact first).

Step 6 — Deliver outputs

Chat summary (always):

Cash Flow Snapshot — [date range]
Source(s): [connectors used]

            Expected    Low       High
30-day net: $X,XXX     $X,XXX    $X,XXX
60-day net: $X,XXX     $X,XXX    $X,XXX
90-day net: $X,XXX     $X,XXX    $X,XXX

⚠ Risks flagged: [count]
  • [risk 1]
  • [risk 2]
  ...

XLSX workbook (always): Read xlsx/SKILL.md before generating. Produce a workbook with three sheets:

  1. Summary — the 30/60/90 forecast table with confidence bands. Beneath each window row, expand inline sub-rows showing the individual transactions that make up its inflows (green) and outflows (red). This makes the estimates auditable without leaving the Summary sheet.

  2. Detail — all transactions grouped by window, sorted by date within each group. Include a running net column (cumulative inflows minus outflows within the window) and a subtotal row at the bottom of each window showing total inflows, total outflows, and net. Grey out past transactions in a separate section at the bottom for reference. Ensure all three windows have rows even if one is empty — show a "No transactions in this window" placeholder row.

  3. Risks — the flagged risks with dollar impact and affected window.

Save as cash-flow-snapshot-[YYYY-MM-DD].xlsx.


Approval gates

No destructive actions — this skill is read-only. No approval gate required before generating the forecast.

Remind the user after delivery:

"This forecast is based on [sources listed]. It is not a substitute for accounting advice — verify with your bookkeeper before making financing decisions."


Reference files

File Load when
reference/gotchas.md When a connector returns unexpected data or variance is extreme
reference/examples/worked-example.md When modeling the output format for a new data shape
执行月末结账工作流,对账QB与支付网关数据,标记异常并生成P&L叙事,最终导出包含对账表、 flagged项及总结的Excel和PDF包。
用户需要关闭会计月份 执行月度财务对账 生成期末财务报告
small-business/skills/close-month/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill close-month -g -y
SKILL.md
Frontmatter
{
    "name": "close-month",
    "description": "Closes the month — reconciles QB vs payment processors, flags gaps, writes P&L narrative, exports close packet. Accepts optional month and save-to arguments.",
    "allowed-tools": "Read, WebFetch, Bash"
}

Run the month-end close workflow. Reconcile, flag gaps, narrate the P&L, and export the close packet for the owner's records (and their accountant).

Parse arguments:

  • --month (default: previous calendar month) — YYYY-MM format
  • --save-to (default files) — files (Google Drive / OneDrive), desktop (local), or both

Step 1 — Reconcile

Trigger the month-end-prep skill workflow:

  1. Pull all QuickBooks transactions for the target month.
  2. Pull settlements from each connected payment processor (PayPal, Stripe, Square) for the same month.
  3. Match QB entries to processor settlements by amount + date (±2 days).
  4. Surface three gap categories:
    • Unmatched processor settlements — money came in via PayPal/Stripe/Square but never landed in QB
    • Unmatched QB deposits — QB shows income with no processor record (cash? wire? misclassified?)
    • Variance lines — matched but amount differs (fees, refunds split)

Step 2 — Flag suspicious entries

Surface in the same report:

  • Uncategorized transactions — QB entries with no category
  • Suspicious duplicates — same amount, same vendor, within 3 days
  • Missing receipts — QB entries above $75 with no attachment

For each, recommend an action: categorize as X, delete duplicate, attach receipt from inbox.

Wait for owner to triage flagged items before generating the narrative. Do not auto-categorize or auto-delete.

Step 3 — P&L narrative

After triage, generate a plain-English P&L narrative:

{Month YYYY} closed at ${revenue} revenue ({+/-}{X}% vs prior month).
Top driver: {category/customer}. Biggest swing: {category} {direction} ${amount}
because {reason inferred from transactions}.

Margin: {X}% ({+/-}Y pts vs prior). {Cost-side commentary}.

Three notable items:
1. ...
2. ...
3. ...

Numbers come from QB; the why comes from cross-referencing top transactions, vendor names, and prior-month deltas.

Step 4 — Export the close packet

Generate two files:

  1. close-packet-{YYYY-MM}.xlsx — multi-tab workbook:
    • Reconciliation — QB ↔ processor match table with gap rows highlighted
    • Flagged — uncategorized / duplicates / missing receipts
    • P&L — formatted income statement with prior-month delta column
    • Trial Balance — accounts + ending balances
  2. close-packet-{YYYY-MM}.pdf — one-page summary: P&L narrative + top-line numbers + gap count

Save both to the chosen --save-to location. Filename format: close-packet-2026-04.xlsx etc.

Connector failures

If QuickBooks is unreachable, stop — reconciliation requires QB as the source of truth. If a payment processor (PayPal, Stripe, Square) is unreachable, run reconciliation against the available processors and note "PayPal not connected — PayPal settlements skipped from reconciliation" (or whichever is missing). If all processors are missing, run QB-only analysis and flag it.

Approval gates

  • Never auto-fix flagged items. Always show the gap, recommend an action, wait for the owner.
  • Never delete duplicates without explicit confirmation. Show both records side-by-side.
  • Saving the packet is auto — it goes to the owner's own drive.

Output

End the run with a one-paragraph recap: revenue, margin, gap count remaining (if any), file paths to the saved packet. If gaps were not all resolved, list them so the owner can revisit.

分析PayPal或QuickBooks销售数据,结合季节性趋势,生成30天内容策略简报。识别热销与滞销品,提供推广优先级建议,不含具体排期或素材。
询问本月应发布什么内容 请求内容计划 查询当前畅销商品 咨询本月应推广的项目
small-business/skills/content-strategy/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill content-strategy -g -y
SKILL.md
Frontmatter
{
    "name": "content-strategy",
    "description": "Analyzes sales data from PayPal and QuickBooks to find top performers and slow movers, layers in seasonality, and produces a prioritized 30-day content brief: what to push, what offers to run, what to hold. Strategic output only — no calendars or assets. Use when the user asks what to post, wants a content plan, asks what's selling, or what to promote this month."
}

Content Strategy

Status: MVP draft Owner: JJ Version: 0.2.0 · Phase MVP Category: Marketing & Sales

Quick start

When an SMB owner asks "what should I post this month?" or "what's my content plan?", this skill:

  1. Pulls sales data from QuickBooks or PayPal (transaction history, product/service revenue by date)
  2. Identifies patterns — top-selling products, slow movers, seasonal trends
  3. Layers in context — seasonality (user-provided or industry benchmarks), past performance
  4. Produces a 30-day brief — ranked recommendations of what to push, what to hold, what offers to consider
  5. Gets owner approval before the brief feeds into canva-creator for asset generation

The output is strategic only — no calendar scheduling, no creative assets.


Workflow

Step 1: Pre-flight check (QuickBooks only)

If using QuickBooks, verify the business profile is set up:

  1. Call company-info to check if Industry is populated
  2. If missing or "Unknown":
    • Ask: "I need your business category to pull the right seasonality benchmarks. What industry are you in?" (e.g., retail, services, SaaS)
    • Call quickbooks-profile-info-update with the user's industry
    • Confirm: "Profile updated. Ready to pull your sales data."
  3. If profile is set, proceed to Step 2

Note: PayPal and Square do not require profile setup.

Step 2: Clarify priorities & metrics

When triggered, ask the user:

  • "How do you want me to measure 'top performers'?"

    • By total revenue?
    • By profit margin?
    • By sales velocity (how fast they're selling)?
    • Combination of the above?
  • "Do you have seasonality patterns in mind?"

    • If yes: "Tell me about them" (capture user's known seasonality)
    • If no: "I'll use industry benchmarks for your category"

Step 3: Pull and analyze sales data

Fetch data from the authenticated connector (QuickBooks, PayPal, or Square, user's choice):

  • Date range: Last 90 days (or full history if <90 days available)
  • Extract: Product/service name, date sold, revenue, quantity

Connector-specific notes:

  • QuickBooks: Fetch invoice line items via profit-loss-quickbooks-account (pre-flight sets industry context)
  • PayPal: Fetch merchant transactions via list_transactions. Rate-limiting: If you hit rate limits, pause 30 seconds and retry once. If still blocked, gracefully offer: "PayPal is rate-limited. Would you like to switch to QuickBooks or Square instead, or I can continue with historical data I already pulled?"
  • Square: Requires location ID first. Call make_api_request(service="locations", method="list") to discover available locations, then fetch orders for each location. Future enhancement: Square integration is stubbed; full path documented in reference/square-integration.md.

Fallback: If <3 months of data, use industry seasonality benchmarks for the SMB's category (e.g., retail, services, e-commerce)

Identify:

  • Top 3–5 performers (by user's chosen metric)
  • Bottom 3–5 slow movers (consider holding or repositioning)
  • Trending up (gaining momentum in last 30 days)
  • Trending down (losing momentum)

Step 4: Layer in seasonality

  • User-provided: If they shared seasonal patterns, weight recommendations against them
  • Industry benchmarks: For categories without strong user data (e.g., "Q1 is strong for tax services")
  • Timing: Flag products that should ramp up/down in the next 30 days based on seasonal patterns

Step 5: Build the 30-day brief

Structure:

  • Executive summary (1–2 sentences: "Your best sellers are X and Y. Seasonal shift to Z is starting.")
  • Push hard (Top 2–3 products + recommended content angle, e.g., "Case study on ROI", "How-to video")
  • Hold steady (Middle performers; maintain visibility but no heavy lift)
  • Reposition or pause (Slow movers; consider discounting, bundling, or pausing)
  • Seasonal opportunities (What's coming next month that you should position for now)
  • Recommended offers (Bundle, discount, or free-trial strategy based on data)

Example length: 200–400 words (brief and actionable, not essay-length).

Step 6: Owner approval & iteration

Present the brief to the owner. Ask:

  • "Does this match your gut?"
  • "Anything to adjust?"
  • "Ready to feed this to canva-creator for asset generation?"

Iterate if needed; once approved, return the final brief as structured JSON (ready for downstream tools).


Gotchas & edge cases

See reference/gotchas.md for common pitfalls.


Examples

See reference/examples/ for worked examples (SaaS, retail, services).

面向无法务团队的中小企业,自动审查NDA、MSA等合同。支持从Gmail、DocuSign或本地文件获取文档,识别风险条款并以通俗语言解释,提供谈判建议并生成带修订标记的DOCX文件。
review this contract what am I signing red flags flag any concerns check the payment terms 用户上传或转发合同附件
small-business/skills/contract-review/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill contract-review -g -y
SKILL.md
Frontmatter
{
    "name": "contract-review",
    "description": "Lightweight NDA, MSA, and vendor contract review for SMBs without legal on staff. Reads contracts from local files, Gmail attachments, or DocuSign envelopes; flags non-standard terms; explains risks in plain English; and outputs a marked-up redline as a separate DOCX. Use when the user says \"review this contract,\" \"what am I signing,\" \"red flags,\" \"flag any concerns,\" \"check the payment terms,\" or uploads\/forwards a contract or legal agreement."
}

Contract Review

Quick start

Attach a contract file, forward the email containing it, or paste the text directly.

User: "Review this MSA and flag anything I should push back on."
→ Skill reads the document, identifies parties and contract type,
  analyzes 8 risk categories, returns a severity-tiered summary
  with a negotiation playbook, and exports a redlined DOCX.

Workflow

  1. Get the contract — Pull from one of three sources, in order of preference:

    • Gmail: Search for recent emails with contract attachments (see reference/gmail-fetch.md)
    • DocuSign: Fetch the envelope by ID or search recent drafts awaiting signature (see reference/docusign-fetch.md)
    • Local file or paste: Read the PDF (chunked via pages parameter for 10+ page files) or DOCX via Read tool. If the user pastes text directly, work with what's provided.

    Read the full document before analyzing. Dangerous clauses are frequently in exhibits and schedules at the back.

  2. Identify contract type and parties — Determine agreement type (NDA, MSA, SOW, SaaS subscription, consulting, subcontractor, vendor) and which party is the user's company vs. the counterparty. Note if it looks like a counterparty template — these are typically one-sided and the counterparty expects pushback.

  3. Analyze across 8 risk categories — Work through the contract from the ops/finance perspective of a small business owner without in-house legal. Categories are ordered by typical risk severity; use judgment for context.

    Category 1: Payment terms and cash flow

    • Payment timing: Net-30 is standard; Net-60+ is flaggable; Net-90/120 is a hard negotiation point
    • Payment triggers: acceptance periods that let the client slow-walk approvals indefinitely
    • Late payment penalties: absence is a gap worth noting
    • Invoicing requirements: rigid formats or PO numbers that can delay payment on technicalities
    • Expense reimbursement: pre-approval requirements and caps
    • Rate adjustments: annual increase mechanism for multi-year engagements

    Category 2: Liability and indemnification

    • Liability caps: uncapped liability is always a red flag
    • Mutual vs. one-sided indemnification
    • Indemnification scope: "any and all claims arising from the services" is not standard
    • Insurance requirements: E&O, cyber, general liability — achievability at the required limits
    • Consequential damages waiver: missing = flag prominently

    Category 3: Termination and exit

    • Termination for convenience: is it mutual? 30-day notice is typical
    • Termination for cause: cure period; vague "material breach" without definition
    • Wind-down: payment for in-progress work at termination
    • Transition assistance: paid vs. unpaid, time-limited vs. open-ended
    • Survival clauses: indefinite indemnification survival = flag

    Category 4: Intellectual property

    • IP assignment vs. license
    • Pre-existing IP and background tools carve-out — absence means inadvertent assignment
    • Work product definition breadth: drafts, notes, internal tools

    Category 5: Scope and change management

    • Scope definition clarity
    • Change order process: absence = scope creep without compensation
    • Acceptance criteria: subjective ("to client's satisfaction") vs. defined
    • Timeline asymmetry: user penalized for delays but client is not for slow feedback

    Category 6: Non-compete and exclusivity

    • Non-compete scope, definition of "competitor," duration
    • Exclusivity requirements on the user's company
    • Non-solicitation: employee poaching is normal; industry-broad restrictions are not

    Category 7: Confidentiality and data

    • Confidentiality scope: "all information shared" with no exceptions is overly broad
    • Duration: 2–3 years is typical; perpetual is aggressive
    • Data handling security requirements vs. company size and data sensitivity
    • Return/destruction requirements post-termination

    Category 8: Operational concerns

    • Governing law and dispute resolution; mandatory arbitration
    • Auto-renewal: opt-out window and notice period (missing a 60-day window is a common SMB mistake)
    • Assignment rights, especially if the client gets acquired
    • Most favored nation: constrains pricing across the entire client book
    • Audit rights: scope and frequency
  4. Present flagged summary — Organize by severity:

    🔴 Red flags (push back before signing) — For each: quote the exact clause, explain the problem in plain language, suggest specific alternative language.

    🟡 Yellow flags (negotiate, not deal-breakers) — For each: quote the clause, explain the concern, describe what "better" looks like.

    🟢 Key terms to note (awareness only) — Payment schedules, notice periods, renewal dates, insurance requirements, key contacts.

    📋 Contract summary — Plain-language summary: who does what, for how much, over what timeframe, under what conditions.

    💡 Negotiation playbook — For each red and yellow flag: what to ask for, how to frame the ask, and what a reasonable compromise looks like.

  5. Export redline DOCX — After presenting the summary, offer to export a redlined DOCX with the suggested changes marked up. Use the docx skill to generate a Word document that:

    • Preserves the original contract structure
    • Marks suggested deletions in strikethrough and additions in underline
    • Adds a cover page summarizing the changes

    Ask: "Want me to export a redlined DOCX you can send back to the counterparty?"

Approval gates

  • Never characterize the output as legal advice. Always recommend attorney review for red flags or binding decisions.
  • Quote actual clause language, not paraphrases. The user needs the exact text for negotiation calls.
  • Flag what's missing, not just what's there. A contract silent on liability caps or change orders is often more dangerous than one with unfavorable terms.
  • Do not flag standard boilerplate. If a clause is fair and market-standard, skip it. The user wants signal, not a clause-by-clause restatement.
  • Compare to market norms when flagging: "Net-90 is uncommon in professional services — Net-30 is standard."
  • Adjust recommendations to the power dynamic. A Fortune 500 procurement MSA is a different negotiation than a small startup agreement.
  • Never send the redlined DOCX to the counterparty without explicit user confirmation.

Reference

  • reference/gotchas.md — edge cases in contract analysis
  • reference/docusign-fetch.md — pulling envelopes from DocuSign
  • reference/gmail-fetch.md — finding contract attachments in Gmail
  • reference/examples/flagged-summary-saas.md — worked example: SaaS agreement review output
通过HubSpot扫描陈旧交易、重复联系人及缺失字段,提供修复建议。严格遵循审批机制执行更新或合并,禁止自动删除或变更关键状态,确保数据安全并输出变更摘要。
用户输入 /crm-cleanup 命令 需要清理 HubSpot CRM 数据(如去重、补全字段)
small-business/skills/crm-cleanup/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill crm-cleanup -g -y
SKILL.md
Frontmatter
{
    "name": "crm-cleanup",
    "description": "Scans HubSpot for stale deals, duplicate contacts, and missing fields, then fixes what the owner approves. Accepts optional scope argument for deals, contacts, or all.",
    "allowed-tools": "Read, WebFetch, Bash"
}

Run a HubSpot hygiene pass using the crm-maintenance skill cleanup workflow. Act immediately — the user typed /crm-cleanup, so skip the intent-detection step.

Parse arguments:

  • --scope (default: all) — deals for deal audit only, contacts for contact dedup only, all for both

Step 1 — Scan for stale deals

If scope includes deals:

  1. Pull all open deals from HubSpot.
  2. Flag deals with no activity (email, call, meeting, note) in the last 14 days.
  3. For each stale deal: show deal name, stage, last activity date, associated contacts, and amount.
  4. Propose actions per deal: update next-step, change stage, add a note, or close-lost.

Present the full stale-deals list before making any changes.

Step 2 — Scan for duplicate contacts

If scope includes contacts:

  1. Search HubSpot contacts for likely duplicates (same email, similar names, same company + similar name).
  2. For each duplicate set: show both records side-by-side — name, email, company, deals, last activity.
  3. Propose which record to keep and which fields to merge.

Present all duplicate sets before merging anything.

Step 3 — Scan for missing required fields

  1. Check all open deals for missing fields: close date, amount, deal stage, associated contact, next-step/notes.
  2. Check contacts associated with open deals for missing fields: email, company, phone.
  3. Present a table of records with missing fields and what's missing.

Step 4 — Apply approved fixes

  1. Walk through each finding from Steps 1-3.
  2. Apply only the changes the owner explicitly approves.
  3. Report each change as it's made with a HubSpot link.

Connector failures

If HubSpot is unreachable, stop — this command requires HubSpot as the data source. Tell the owner: "HubSpot isn't connected. Connect it in Cowork settings, then rerun /crm-cleanup."

Approval gates

  • Never delete records. Not contacts, not deals, not activities. If the user asks, say the skill cannot and direct them to HubSpot.
  • Never change deal stage or close a deal without explicit approval. Even if evidence is strong. Flag and defer.
  • Never auto-merge duplicate contacts. Show side-by-side and wait for approval per pair.
  • Side-by-side diffs for all changes. Show current value and proposed value; wait for approval per item.

Output

End with a summary: X deals updated, Y contacts merged, Z fields filled. Include links to the affected records.

自动化维护HubSpot CRM,通过解析邮件和日历上下文自动创建/更新联系人、交易并记录活动。支持清理陈旧数据,需人工确认关键操作,避免手动录入。
用户要求更新CRM 用户要求记录通话或会议 用户请求清理或审计HubSpot数据 用户希望为交易添加上下文
small-business/skills/crm-maintenance/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill crm-maintenance -g -y
SKILL.md
Frontmatter
{
    "name": "crm-maintenance",
    "description": "Keeps HubSpot current without the owner opening it: creates and updates contacts and deals from email and calendar context, logs notes and calls, and flags stale records. The \"stop doing data entry\" skill. Use when the user asks to update the CRM, log a call, clean up HubSpot, or add context to a deal."
}

CRM Maintenance

Quick start

Pull context from the referenced email or calendar event, resolve the right HubSpot contact and deal, log the activity, and surface what changed. For a deal cleanup, audit the deal against recent email/calendar activity and propose updates — never apply them without approval.

User: "log this call to the Acme deal"
→ Read the most recent completed calendar event
→ Confirm attendees map to the Acme deal's contacts
→ Write a call activity on the Acme deal
→ Report: "Logged call to Acme Q2 Expansion. [deal link]"

Workflow

  1. Identify intent. Decide which of three paths applies from the user's message and context:

    • Email path — "update my CRM", "add this to the deal", or any reference to an email thread
    • Call path — "log this call", "log the meeting", or any reference to a calendar event
    • Cleanup path — "clean up HubSpot", "is this deal up to date", or any request to audit a specific deal If the intent is ambiguous (e.g. "update HubSpot" with no referenced email/meeting/deal), ask which path before proceeding.
  2. Gather context.

    • Email path: read the thread (subject, participants, last 1–3 messages). Identify the primary external contact.
    • Call path: read the calendar event (title, attendees, time, description). If no event was specified, use the most recent completed meeting in the last 24 hours and confirm with the user before proceeding.
    • Cleanup path: pull the deal (stage, amount, close date, next-step, associated contacts, activities in last 60 days), plus the last 14 days of email threads and calendar events involving the deal's contacts.
  3. Resolve the HubSpot contact and deal. For email/call paths:

    • Search HubSpot contacts by email address. If a contact is missing, create it from email signature or calendar invite data — announce creation in chat before writing.
    • Find the right deal in this order: (a) explicit match if the user named one, (b) the contact's sole open deal, (c) fuzzy match across the contact's open deals against the email subject or meeting title — confirm before writing, (d) ask the user if no match. Never auto-create a deal.
    • For field names, activity types, and association rules, read reference/hubspot-fields.md before writing anything to HubSpot.
    • If deduplication or deal-resolution feels ambiguous, check reference/gotchas.md before proceeding — it covers the most common failure modes.
  4. Execute the action.

  5. Approval gate — every externally visible write. For contact creation and activity logging, announce before writing and surface the result after. For cleanup edits, do not write anything until the user approves the specific changes.

  6. Report what happened. Tell the user what was written and what's pending. Include a HubSpot link to the affected deal when possible. Keep it short.

Approval gates

  • Never delete records. Not contacts, not deals, not activities. If the user asks, say the skill cannot and direct them to HubSpot.
  • Never change deal stage or close a deal without explicit user approval. Even if evidence is strong. Flag and defer.
  • Never create a new deal unprompted. Ask if the right deal can't be resolved.
  • Announce contact creation before writing. One line — lets the user catch typos or duplicates.
  • Side-by-side diffs for cleanup. Show current value and proposed value; wait for approval per item.

Reference

聚合PayPal纠纷、HubSpot工单及评论数据,提取可修复的Top3问题主题并生成回复模板。支持按日期筛选,自动评估影响等级,提供摘要表格与草稿,需人工审核批准后方可发送,严禁自动操作或泄露隐私。
需要分析近期客户反馈以识别主要痛点 请求生成针对常见问题的标准化回复草稿 希望汇总多渠道(支付、客服、评论)的客户声音报告
small-business/skills/customer-pulse-check/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill customer-pulse-check -g -y
SKILL.md
Frontmatter
{
    "name": "customer-pulse-check",
    "description": "Synthesizes themes from PayPal disputes, HubSpot tickets, and review exports into a top-3 fixable issues list with drafted response templates. Accepts optional since-date argument.",
    "allowed-tools": "Read, WebFetch, Bash"
}

Run the customer voice synthesis. Pull feedback signals from all connected sources, identify the themes that are actually fixable, and produce drafted responses the owner can review and send.

Parse arguments:

  • --since (default: last 30 days) — start date YYYY-MM-DD for the lookback window

Step 1 — Gather feedback signals

Using the customer-pulse skill workflow:

  1. Pull PayPal disputes and chargebacks for the period: reason codes, amounts, resolution status.
  2. Pull HubSpot support tickets and conversation notes for the period.
  3. If review export files are available (Google Reviews CSV, Yelp export, etc.) in Files: read and parse them.
  4. Count total signals per source.

Step 2 — Theme extraction

Cluster all signals into recurring themes. For each theme:

  • Count how many signals mention it
  • Classify: Product quality / Delivery / Billing / Communication / Expectation mismatch / Other
  • Rate impact: 🔴 High (revenue risk, churn) / 🟡 Medium / 🟢 Low

Step 3 — Top-3 fixable issues

Using the ticket-deflector skill workflow:

Select the top 3 themes by: frequency × impact rating. For each:

  1. State the issue in one sentence
  2. Explain the root cause (where evident)
  3. Suggest a specific operational fix
  4. Draft a customer response template

Response template format:

Subject: Re: {issue topic}

Hi {first name},

Thank you for reaching out. {Acknowledgment of their experience in 1-2 sentences}.

{What we're doing about it / what happened / resolution offered}.

{Next step or offer}.

{Sign-off}

Step 4 — Summary table

Format the output as:

Customer Voice — {date range}
Total signals: {n} ({PayPal disputes: n} | {HubSpot tickets: n} | {Reviews: n})

TOP 3 FIXABLE ISSUES
1. {Issue} ({frequency}) — {impact} — Fix: {one-line fix}
2. {Issue} ({frequency}) — {impact} — Fix: {one-line fix}
3. {Issue} ({frequency}) — {impact} — Fix: {one-line fix}

Connector failures

Run with whatever sources are connected — this command degrades gracefully. If PayPal is missing, skip dispute data and note "PayPal not connected — dispute data skipped." If HubSpot is missing, skip ticket data and note it. If no sources are connected at all, stop and tell the owner: "No feedback sources connected. Connect at least one of PayPal, HubSpot, or upload a review export CSV."

Approval gates

  • Never send response emails automatically. Present drafts for owner review only.
  • Never close HubSpot tickets or resolve PayPal disputes without explicit owner confirmation.
  • Never include customer PII in the summary — use first name + last initial only.

Output

Present the summary table, then each response template. Ask the owner which templates they'd like to send, then wait for explicit approval before drafting the send.

聚合PayPal争议、HubSpot工单、邮件及Intercom对话,可选加入Google/Yelp评论,生成包含主题、原始引语及本周三项行动建议的客户情绪报告。
询问客户感受或情绪 要求分析评论 查询用户反馈内容 涉及争议处理
small-business/skills/customer-pulse/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill customer-pulse -g -y
SKILL.md
Frontmatter
{
    "name": "customer-pulse",
    "version": "0.2.0",
    "description": "Aggregates PayPal disputes, HubSpot feedback and tickets, and email sentiment (plus pasted or exported Google\/Yelp reviews) into a themes report with verbatim evidence and a \"do these three things this week\" list. Use when the user asks how customers are feeling, for review analysis, what people are saying, or about disputes."
}

Customer Pulse

Quick start

Ask: "How are customers feeling this month?"

Claude pulls disputes, tickets, email threads, and Intercom conversations for the last 30 days, groups them into 3–5 themes with verbatim evidence, and delivers a "do these 3 things this week" action list.

To include Google/Yelp reviews, paste them after triggering — or say "I have some reviews to add."

Workflow

  1. Set the date window. Default: last 30 days. If the user specifies a range, use it.

  2. Pull PayPal disputes. Fetch disputes opened in the window. If the PayPal API returns a rate-limit error, skip and add PayPal: rate-limited — not included to the Sources section. Do not retry; do not error. See reference/gotchas.md for the rate-limit pattern.

  3. Pull HubSpot tickets and feedback. Fetch open and recently closed tickets. If 0 tickets exist, record HubSpot tickets: 0 and continue — do not surface a warning.

  4. Pull Gmail threads. Search for threads in the window containing: refund cancel unhappy issue problem disappointed frustrated broken late slow wrong missing. Extract subject lines and 1–2 sentence excerpts per thread.

  5. Pull Intercom conversations. Call search_conversations to fetch open and recently closed conversations. Then call get_conversation for each conversation ID returned to access the full conversation_parts. Extract parts where author.type === 'user' — these are customer messages. Exclude parts where author.type is admin or bot.

  6. Accept pasted reviews (optional). If the user pastes Google or Yelp review text, include it in the source pool tagged as [Review]. No connector required.

  7. Extract themes. Group all evidence into 3–5 recurring themes. Each theme must include:

    • A one-sentence label (e.g., "Shipping delays causing repeat complaints")
    • 2–3 verbatim quotes with source tags: [PayPal], [HubSpot], [Gmail], [Intercom], or [Review]
    • A signal count (how many items touch this theme)

    Verbatim quotes are non-negotiable — never paraphrase. See reference/gotchas.md for the verbatim anti-pattern.

  8. Generate the "do these 3 things" list. Rank themes by signal count. Pick the top 3 and write one concrete, owner-actionable step per theme. Format as a numbered checklist.

  9. Deliver the report. Structure the output with these sections in order:

    • Header — H2 with "Customer Pulse" and the date range.
    • Sources pulled — Bullet list with signal counts per source (PayPal disputes, HubSpot tickets, Gmail threads, Intercom conversations, pasted reviews). Note any source that was rate-limited and skipped.
    • Themes — For each theme, show a bold numbered theme label with the signal count, followed by two verbatim quotes as blockquotes, each attributed to its source.
    • Do these 3 things this week — Numbered list of three concrete, owner-actionable steps, each tied to one of the top themes.

    For a complete worked example, see reference/examples/example-report.md.

Approval gates

This skill is read-only — it does not post, send, reply, or modify any records. No approval gate is required.

Reference

生成周五周报,对比本周与上周营收、列出畅销品及异常波动,总结亮点与风险。支持7或14天回溯,自动处理数据源缺失,仅展示结果供审核,不自动发送。
用户请求周五简报 需要查看周末业绩汇总 检查营收周环比变化
small-business/skills/friday-brief/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill friday-brief -g -y
SKILL.md
Frontmatter
{
    "name": "friday-brief",
    "description": "Delivers the Friday end-of-week pulse — revenue vs prior week, top sellers, wins and watches. Accepts optional lookback window of 7 or 14 days.",
    "allowed-tools": "Read, WebFetch, Bash"
}

Run the Friday wins-and-watches briefing. Pull the numbers, surface what matters, and give the owner a clean end-of-week picture.

Parse arguments:

  • --lookback (default: 7d) — 7d for one week or 14d for a two-week rolling comparison

Step 1 — Revenue pulse

Using the business-pulse skill workflow:

  1. Pull PayPal transactions for the lookback period.
  2. Pull any HubSpot deal closes for the same window.
  3. Calculate week-over-week revenue delta.
  4. Surface top 3 revenue sources (product / customer / channel) ranked by contribution.

Step 2 — Sales breakdown

  1. List the top 5 selling products/services by volume and revenue.
  2. List the bottom 3 (anything that moved less than expected vs. prior period).
  3. Flag any items with a sudden spike or drop (>20% change).

Step 3 — Wins and watches summary

Format the output as:

Friday Brief — {date}

WINS
• {win 1}
• {win 2}
• {win 3}

WATCHES
• {watch 1} — {recommended action}
• {watch 2} — {recommended action}

Revenue this week: ${amount} ({+/-}X% vs last week)

Connector failures

Run with whatever is connected — this command degrades gracefully. If PayPal is missing, skip transaction data and note "PayPal not connected — revenue data from HubSpot deals only." If HubSpot is missing, skip deal closes and note it. If neither is connected, stop and tell the owner: "No revenue sources connected. Connect PayPal or HubSpot to run the Friday brief."

Approval gates

  • Never send or post this brief automatically. Always display it for the owner to review first.
  • Never auto-cancel or modify anything. Surface the data and recommendations only.

Output

End with the formatted brief and ask the owner: "Want me to post this to Slack, email it to yourself, or save it?"

端到端处理客户投诉。自动提取上下文,根据客户历史生成语气匹配的回复草稿,并建议运营改进方案。需人工审核发送、退款及关闭工单,确保操作合规与安全。
收到客户投诉邮件或工单 需要起草投诉回复 分析重复投诉模式
small-business/skills/handle-complaint/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill handle-complaint -g -y
SKILL.md
Frontmatter
{
    "name": "handle-complaint",
    "description": "Handles an incoming customer complaint end-to-end — pulls context, drafts a response, and suggests an operational fix. Accepts optional email or ticket ID argument.",
    "allowed-tools": "Read, WebFetch, Bash"
}

Run the complaint resolution workflow by chaining two skills. Read the complaint, gather context, draft a response, and suggest a fix so it doesn't happen again.

Parse arguments:

  • EMAIL_OR_TICKET_ID (optional) — Gmail thread ID, HubSpot ticket ID, or "latest" to pull the most recent unresolved complaint. If omitted, ask the owner to paste the complaint text.

Step 1 — Load the complaint (ticket-deflector)

Using the ticket-deflector skill workflow:

  1. If an ID was given: pull the full thread from Gmail or HubSpot.
  2. If "latest": pull the most recent unresolved HubSpot ticket or Gmail thread tagged as complaint/support.
  3. If neither: ask the owner to paste the complaint text directly.
  4. Identify: customer name, order/account info, what they're upset about, what they're asking for.

Step 2 — Pull context

  1. Search HubSpot for the customer's history: past purchases, prior complaints, deal stage, lifetime value.
  2. Search PayPal for relevant transaction: order status, refund history, dispute status.
  3. Summarize: "This is a {new/returning} customer, ${lifetime_value} in purchases, {0/N} prior complaints. Their current issue is {one sentence}."

Step 3 — Draft response (ticket-deflector)

Using the ticket-deflector skill workflow for tone-matched response:

  1. Draft a reply matched to the severity and the customer's history:
    • First-time complainers with high LTV → empathetic, generous
    • Repeat complainers → professional, firm, solution-focused
    • Abusive tone → professional, brief, boundary-setting
  2. Include: acknowledgment, explanation (if known), resolution offer, next step.
  3. Present the draft to the owner. Do NOT send.

Step 4 — Suggest operational fix (customer-pulse)

  1. Check if this complaint matches a known theme (from prior /customer-pulse-check runs or similar complaints in HubSpot).
  2. If it's a pattern: "This is the {Nth} complaint about {issue} this month. Consider: {specific operational change}."
  3. If it's isolated: "This looks like a one-off. No pattern detected."

Connector failures

If Gmail and HubSpot are both unreachable, ask the owner to paste the complaint text — the skill works with manual input. If PayPal is missing, skip transaction lookup and note "PayPal not connected — order status unavailable, working from complaint text only."

Approval gates

  • Never send a response without explicit owner approval. Drafts only.
  • Never issue refunds or credits automatically. Present the option; the owner decides.
  • Never close tickets or resolve disputes without owner confirmation.

Output

Present the customer context summary, the drafted response, and any pattern-based operational suggestion. Ask: "Want to send this response, edit it, or handle it differently?"

根据QuickBooks和PayPal数据起草逾期发票提醒邮件。自动评分客户并匹配语气,发送前需人工审批。适用于查询欠款或跟进未付发票场景。
用户询问“谁欠我钱” 提及逾期发票 要求跟进未付发票
small-business/skills/invoice-chase/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill invoice-chase -g -y
SKILL.md
Frontmatter
{
    "name": "invoice-chase",
    "version": "0.2.0",
    "description": "Drafts overdue-invoice reminder emails from QuickBooks and PayPal data, matched to each customer's payment history and tone (gentle for good customers, firm for repeat late payers). Sends via PayPal with owner approval; non-PayPal invoices queue as mail drafts. Use when the user asks \"who owes me money,\" mentions overdue invoices, or wants to follow up on unpaid invoices."
}

Invoice Chase

Quick start

Pull the AR aging report, score each customer by payment history, draft a tone-matched reminder for each overdue invoice, and present them to the owner. Nothing sends until the owner says so.

User: "who owes me money"
→ Pull AR aging from QuickBooks
→ Cross-reference PayPal settlements (last 14 days)
→ Score each customer: good-payer / occasionally-late / repeat-late
→ Draft tone-matched reminders
→ Show summary table + drafts. Wait for "send these."

Setup (first run only)

Ask the owner two questions before running for the first time:

  1. Mail connector: "Do you use Gmail or Apple Mail for drafts?" — store the answer; use it for all non-PayPal draft queuing.
  2. Stripe: "Do you use Stripe for invoicing? I can include Stripe invoices in the overdue sweep." — if yes, pull Stripe overdue invoices alongside QuickBooks.

Do not ask again on subsequent runs.

Workflow

  1. Pull overdue receivables. Query QuickBooks AR aging for all invoices more than 1 day past due. If Stripe is enabled (owner confirmed at setup), also pull Stripe overdue invoices.

  2. Cross-reference payment history. For each overdue customer, query PayPal for settled transactions using these parameters:

    • transaction_status: S (settled only — filters out pending and denied transactions that inflate result size and increase rate-limit risk)
    • Date window: last 7 days ending today (not 14 or 30 — wider windows are the primary cause of PayPal 429 rate limit errors)

    If PayPal returns a 429 rate limit error:

    • Retry once immediately with a 3-day window instead.
    • If the retry also returns 429, skip the PayPal cross-reference entirely for this run. Flag all customers in the batch as "PayPal unavailable — verify manually" in the summary table. Proceed to scoring using QuickBooks history only. Do not silently drop the caveat.

    If a customer shows a settled payment within the query window, flag as "possibly paid — verify" and exclude from the draft queue.

  3. Score each customer. Read reference/tone-matching.md for scoring logic. Result: good-payer, occasionally-late, or repeat-late.

  4. Draft reminder emails. One email per customer — consolidate multiple overdue invoices into one email. Match tone to score. See reference/examples/gentle-reminder.md and reference/examples/firm-reminder.md.

  5. Present drafts to owner. Show a summary table first:

    Customer Amount Due Days Late Tone Send via
    Acme Corp $1,200 18 days Gentle PayPal
    Smith LLC $450 47 days Firm Gmail draft

    Then show each draft email in full. Wait for owner to say "send these" or approve individually.

  6. Send or queue — only after approval.

    • PayPal invoices: send the reminder via PayPal.
    • Non-PayPal invoices: queue as a draft in the owner's configured mail app.
    • Never send without explicit approval.
  7. Report what happened. List what was sent, what was queued as draft, and what was flagged (possibly paid, excluded).

Approval gates

  • Never send or queue a draft without explicit owner approval. Present all drafts first; wait for the go-ahead.
  • Never include a customer who paid in the last 14 days. Flag as "possibly paid — verify" instead.
  • Never send to a customer not in the QuickBooks AR report (or Stripe, if enabled). No reminders from memory alone.
  • One approval covers one batch. Adding a customer or changing a draft after approval starts a new round.

Reference

基于HubSpot数据对线索进行评分,生成优先联系列表及话术。支持起草跟进邮件和提议会议时间,但需人工审批后才发送或预订。适用于线索优先级排序、确定首拨对象及管道管理场景。
用户要求优先处理线索 询问首先联系哪些客户 咨询销售管道状况
small-business/skills/lead-triage/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill lead-triage -g -y
SKILL.md
Frontmatter
{
    "name": "lead-triage",
    "version": "0.1.1",
    "description": "Scores inbound HubSpot leads by engagement signals, company fit, and urgency markers to produce a \"call these 5 today\" list with talking points, drafts the follow-ups, and blocks Calendar time. Use when the user asks to prioritize leads, who to call first, or about their pipeline."
}

Lead Triage

Quick start

Pull inbound leads from HubSpot, score them, and surface a ranked call list with talking points. Drafts follow-ups and proposes calendar slots — never sends or books without owner approval.

User: "prioritize my leads"
→ Pull contacts: lifecycle stage Lead or MQL, status ≠ Unqualified
→ Score each across engagement, company fit, urgency, recency
→ Return ranked list (size adapts to volume) with talking points
→ Offer to draft follow-ups and propose calendar slots

Workflow

  1. Pull leads from HubSpot. Fetch contacts with lifecyclestage = Lead or MQL and hs_lead_statusUnqualified. Use the field list in reference/hubspot-scoring.md. If HubSpot is unavailable, stop: "HubSpot is disconnected — connect it and try again."

  2. Clarify if trigger is ambiguous. If the user said only "pipeline" without a qualifier, ask: "Quick pipeline overview (deal stages + total value) or prioritized call list?" — then route accordingly. Do not score leads on a bare "pipeline."

  3. Score each lead. Apply the four-dimension model in reference/hubspot-scoring.md:

    • Engagement — email replies, opens, site visits in HubSpot (last 30 days only)
    • Company fit — industry and employee count vs. owner's ICP (default: any industry, 1–50 employees)
    • Urgency — lead age, stage duration, notes containing "urgent / ASAP / deadline / budget approved"
    • Recency penalty — subtract points if last activity was <24 hours ago (already touched today)
  4. Build the ranked list. Sort descending by composite score. Adapt list size to volume:

    • ≤10 leads → show all
    • 11–30 leads → show top 5
    • 30 leads → show top 8

    For each lead: name, company, score, one-paragraph talking point, last activity summary. If engagement signals are all >30 days old, flag: "Engagement signals are stale — approach as cold outreach."

  5. Offer follow-up drafts. Ask: "Draft follow-ups for any of these?" If yes, write one email per selected lead, matching the tone of their last outbound thread in Mail. Show draft; do not send.

  6. Offer calendar slots. Ask: "Propose call slots for any of these?" If yes, check Calendar for open 30-minute windows in the next two business days (avoid slots with existing events ±15 min). Propose two options per lead. Do not create events — the owner books.

Approval gates

  • Never send an email. Draft only; owner sends from their inbox.
  • Never create calendar events. Propose times; owner books.
  • Never change lifecycle stage or mark a lead Unqualified unless the owner explicitly asks.
  • Never include Customer or Evangelist lifecycle contacts in the lead list.
  • If zero leads match the filter, explain why and offer to check what lifecycle stages are in use — do not fabricate a list.

Reference

生成周一晨间简报,汇总现金、销售、管道及待办事项。支持可选的发布和保存参数。自动拉取数据并优雅降级缺失连接,格式化为一页摘要。支持保存至云盘或桌面,发布到Slack/Teams需确认,且敏感数据不自动公开。
用户请求生成周一晨间简报 用户在每周一早上7点ET触发定时任务
small-business/skills/monday-brief/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill monday-brief -g -y
SKILL.md
Frontmatter
{
    "name": "monday-brief",
    "description": "Generates a one-page Monday morning briefing — cash, sales, pipeline, week ahead, top three to-dos. Accepts optional post destination and save-to arguments.",
    "allowed-tools": "Read, WebFetch, Bash"
}

Run the Monday Morning Briefing. Pull from every connector that's live, gracefully degrade when one isn't, and deliver a one-page brief the owner can read in under two minutes.

Parse arguments:

  • --post (default none) — post the brief summary to slack, teams, or none
  • --save-to (default files) — files (Google Drive / OneDrive), desktop (local), or both

Step 1 — Run business-pulse

Trigger the business-pulse skill workflow. It pulls in this order, scoping to whatever is connected:

  1. Cash — QuickBooks balance + last 7 days of net flow
  2. Sales trend — PayPal/Square last 7 days vs. prior 7 days, % change, top SKU
  3. Pipeline — HubSpot deals moved, deals stalled (>14 days no activity), new inbound leads
  4. This week's commitments — Calendar events with external attendees, deliverable deadlines
  5. Watch-list — unread Gmail flagged "needs reply," Slack DMs awaiting response
  6. The 3 things — the three highest-leverage actions for today, ranked

If a connector is missing, note it in the brief ("PayPal not connected — sales trend skipped") rather than failing.

Step 2 — Format the one-page brief

Layout (markdown, fits on one screen):

# Monday Brief — {Mon DD, YYYY}

## Cash
{$X balance · {+/-}$Y net last 7 days · runway note}

## Sales (last 7d vs prior 7d)
{$X total · {+/-}Z% · top SKU: {name} ({$})}

## Pipeline
{N deals moved · M stalled · K new leads}

## Week ahead
- {Tue 10am} — {Customer X discovery call}
- {Thu EOD}  — {Proposal due to Y}
- ...

## Three things that need you today
1. {Highest-leverage action with one-line why}
2. {...}
3. {...}

Step 3 — Save and (optionally) post

  1. Save the brief to the chosen --save-to location:
    • files — Google Drive or OneDrive root, filename monday-brief-YYYY-MM-DD.md
    • desktop~/Desktop/monday-brief-YYYY-MM-DD.md
    • both — both locations
  2. If --post slack or --post teams, post the Three things section only (not the full brief — keep the channel post short) and link to the saved file.
  3. Show the full brief in chat regardless of save target.

Approval gates

  • Saving the file is auto. No approval needed — it's the owner's own drive.
  • Posting to Slack/Teams requires confirmation. Show the post draft and wait for "post it" before publishing.
  • Never post if the brief surfaces unflattering numbers (significant cash drop, deal slipping) without explicitly asking the owner — the channel may have non-leadership members.

Cadence note

This command is designed to run weekly. The owner may schedule it via Cowork's task scheduler — when run on Monday at 7am ET, the output goes straight to their drive and (if configured) Slack/Teams DM channel.

辅助小微企业主完成月末结账。连接QuickBooks及支付网关,核对账目、标记异常交易与重复项、检查收据缺失,生成通俗版损益表叙述及导出关闭数据包。
close the month month-end reconcile what's missing P&L why revenue or margin changed this month
small-business/skills/month-end-prep/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill month-end-prep -g -y
SKILL.md
Frontmatter
{
    "name": "month-end-prep",
    "description": "Walks an SMB owner through month-end close: reconciles QuickBooks against PayPal (and Square\/Stripe) settlements, flags uncategorized transactions, suspicious duplicates, and missing receipts, then writes a plain-English P&L narrative and exports a close packet (xlsx + one-page PDF). Use when the user says \"close the month,\" \"month-end,\" \"reconcile,\" \"what's missing,\" \"P&L,\" or asks why revenue or margin changed this month."
}

Month End Prep

Quick start

Connect QuickBooks and at least one payment processor (PayPal, Square, or Stripe), then say "let's close the month." Claude walks you through each step of the checklist, pausing for your input at each gate before moving forward.

If a connector is missing, Claude falls back to asking for a CSV export — it won't silently skip a step.

Workflow

Work through these steps in order. Each step has a completion state; don't advance until the current step is settled.

Step 1 — Agree on the target month

Ask the user which month to close. Default to the prior calendar month if they don't specify. Confirm before pulling any data.

Step 2 — Pull QuickBooks P&L and transaction register

Fetch:

  • Profit & Loss report for the target month (revenue, COGS, gross margin, operating expenses, net income)
  • Transaction register: every income and expense line item

Flag immediately:

  • Uncategorized transactions — any line with category "Uncategorized" or blank
  • Ask Questions / Needs Review — QB's own flag

Present the count ("14 transactions need a category") and list them for the user to classify before proceeding. Don't advance with open uncategorized items unless the user explicitly says "skip for now."

See reference/quickbooks-reconcile.md for field mappings and API notes.

Step 3 — Pull payment processor settlements

Fetch settlement reports from PayPal, Square, or Stripe — whichever are connected — for the same calendar month.

Match each settlement deposit against the QuickBooks bank deposit line:

  • Match — amount and date agree within 2 days → mark as reconciled
  • Difference < $0.50 — rounding/fee; note but don't flag
  • Difference ≥ $0.50 — flag with the delta amount
  • Settlement exists, no QB deposit — flag as "missing in QuickBooks"
  • QB deposit exists, no settlement — flag as "deposit not in processor data"

See reference/paypal-settlements.md for settlement report field mappings (PayPal, Square, Stripe).

Step 4 — Detect suspicious duplicates

Scan the transaction register for likely duplicate charges or deposits. Flag a transaction as a suspicious duplicate when all three match:

  • Same amount (within $0.01)
  • Same vendor or customer name
  • Posted within 5 calendar days of each other

Present flagged pairs to the user. They decide whether each is legitimate (e.g., a recurring weekly subscription) or a real duplicate to void.

See reference/gotchas.md for common false-positive patterns and how to distinguish them.

Step 5 — Receipts check (Desktop connector)

If the Desktop connector is available, scan the receipts folder (ask the user for the path; default ~/Documents/Receipts) for the target month.

For each expense transaction in QuickBooks above $25 with no attached document:

  • Check for a matching receipt file (match by amount ± $0.50 and date within 3 days)
  • Matched → note as "receipt on file"
  • Not matched → flag as "missing receipt"

List missing receipts. The user can supply the file or mark as "receipt not required" (e.g., a recurring auto-pay with no receipt).

If Desktop connector is not available, ask the user to confirm which expenses they have receipts for — don't silently skip this step.

Step 6 — Owner sign-off gate

Present a summary before going further:

Uncategorized transactions:  X of X resolved
Settlement discrepancies:    X flagged, X resolved
Suspicious duplicates:       X flagged, X cleared
Missing receipts:            X outstanding

Ask: "Ready to write the P&L summary and export the close packet?"

Do not proceed to Steps 7–8 without explicit confirmation.

Step 7 — Write the P&L narrative

Write a plain-English summary of the month — the kind an owner would share with their spouse or accountant, not a CFO memo. Aim for 150–250 words.

Structure:

  1. Headline — one sentence: "March came in at $X net, up/down Y% from February."
  2. Revenue — what drove the number; name products, services, or customers if the data shows concentration.
  3. Gross margin — whether it held, rose, or compressed, and the main reason why.
  4. Key expenses — any line that moved more than 10% MoM or is outside the normal range; one sentence each.
  5. Bottom line — net income vs. prior month; ask if they have a target to compare.
  6. Watch list — 1–3 things to monitor next month.

Avoid jargon; define anything that isn't plain English ("MoM" = month over month).

See reference/examples/pl-narrative.md for a worked example.

Step 8 — Export the close packet

Produce two files:

close-packet-[YYYY-MM].xlsx — three sheets:

  • P&L — the QuickBooks P&L data, formatted
  • Reconciliation — matched and flagged transactions side by side
  • Action Items — any outstanding flags (uncategorized, missing receipts, etc.)

close-packet-[YYYY-MM]-summary.pdf — one page:

  • Month and business name at the top
  • Key figures (revenue, gross margin %, net income)
  • The P&L narrative from Step 7
  • Count of open action items, if any

Save both to the Desktop (or a path the user specifies). Confirm the file locations.

See reference/close-packet-format.md for column specs and PDF layout details.

Approval gates

  • Never run reconciliation on a month that has been filed. Confirm the books are still open before pulling data.
  • Never void or modify a QuickBooks transaction directly. Surface flags; the owner makes changes in QuickBooks.
  • Always pause at Step 6 before producing outputs. Unresolved flags must be acknowledged or explicitly skipped.

Graceful degradation

Missing connector Fallback
QuickBooks Ask for a QB export CSV (P&L + transaction detail)
Payment processor Ask for a settlement CSV from the processor's website
Desktop (receipts) Ask the user to confirm receipt status for each flagged expense

Reference files

每月25日运行,基于QuickBooks和PayPal数据生成未来30天现金流预测。识别资金紧张周、逾期发票及需关注的支出,提供不超过两项具体行动建议,不自动执行支付或发邮件,确保财务决策由所有者把控。
用户请求月度现金流预览 到达每月25日触发定时任务
small-business/skills/month-heads-up/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill month-heads-up -g -y
SKILL.md
Frontmatter
{
    "name": "month-heads-up",
    "description": "Runs on the 25th — shows the next 30-day cash-flow outlook and flags anything that needs attention before month-end. Accepts optional 30 or 60 day horizon.",
    "allowed-tools": "Read, WebFetch, Bash"
}

Run the month-end heads-up. Pull forward-looking cash data and give the owner a clear "here's what the next 30 days look like" picture with specific things to watch.

Parse arguments:

  • --horizon (default: 30) — forecast window in days (30 or 60)

Step 1 — Current cash position

Using the cash-flow-snapshot skill workflow:

  1. Pull QuickBooks current cash and receivables balance.
  2. Pull PayPal settled balance and pending payouts.
  3. Combine for total available + incoming cash.

Step 2 — Upcoming obligations

  1. Pull recurring expenses from QuickBooks (payroll, subscriptions, rent/lease) due in the next 30 days.
  2. Pull any outstanding invoices past due or due within 14 days.
  3. Flag any payment that would push the balance below a comfortable buffer (default: <$2,000 or owner's QB average monthly expense × 0.5).

Step 3 — Cash-flow forecast

  1. Project 30-day net cash: current balance + expected inflows − known obligations.
  2. Identify the single tightest week (lowest projected balance).
  3. Flag if any week projects negative.

Step 4 — Two things to watch

Surface no more than two specific, actionable watches:

  • Which invoice(s) to chase now
  • Which expense(s) to defer or negotiate

Format as:

Month-End Heads Up — {current date}
Horizon: next {X} days

Cash today: ${amount}
Projected end-of-period: ${amount}
Tightest week: {date range} — projected ${amount}

TWO THINGS TO WATCH
1. {item} — {why it matters} — suggested action: {action}
2. {item} — {why it matters} — suggested action: {action}

Connector failures

If QuickBooks is unreachable, stop — the cash forecast requires QB as the source of truth. If PayPal is missing, run the forecast from QB-only data and note "PayPal not connected — PayPal receivables excluded from forecast." Same for Stripe/Square if missing.

Approval gates

  • Never initiate payments or send emails automatically. Surface the data and actions for the owner to take.
  • Never project revenue that hasn't been confirmed in QB or PayPal. Use conservative estimates only.

Output

Present the formatted brief and offer to draft chase emails for any flagged overdue invoices.

通过串联现金流预测与逾期发票催收技能,辅助老板自信发放工资。需明确审批,支持自定义周期和发薪日,生成预测及提醒草稿,确保资金安全。
用户希望运行工资发放信心流程 需要预测未来现金流并处理逾期发票以准备发薪
small-business/skills/plan-payroll/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill plan-payroll -g -y
SKILL.md
Frontmatter
{
    "name": "plan-payroll",
    "description": "Forecasts cash, ranks overdue invoices, and stages PayPal reminders so the owner can confidently run payroll. Accepts optional horizon and payroll-date arguments.",
    "allowed-tools": "Read, WebFetch, Bash"
}

Run the payroll-confidence pipeline by chaining two skills. The owner approves at each handoff — never send a reminder or commit a forecast without explicit confirmation.

Parse arguments:

  • --horizon (default 30) — forecast window in days (30, 60, or 90)
  • --payroll-date (optional) — the date payroll runs; defaults to next Friday

Step 1 — Cash forecast (cash-flow-snapshot)

Trigger the cash-flow-snapshot skill workflow:

  1. Pull AR, AP, and historical cash timing from QuickBooks, PayPal, Stripe, or Square (whichever are connected). Fall back to CSV upload if no connector is live.
  2. Layer in known fixed costs (rent, payroll, recurring vendor charges).
  3. Produce a 30/60/90-day forecast (use the requested --horizon) with percentage-variance confidence bands.
  4. Flag named risks — e.g., "payroll on May 15 lands $4,200 below your fixed-cost floor at the median forecast."
  5. Deliver chat summary + downloadable XLSX.
  6. Present to the owner. Wait for explicit "okay, see what we can collect" before Step 2.

If the forecast shows payroll is comfortably covered, ask the owner whether they still want to chase overdue invoices or stop here.

Step 2 — Overdue collection (invoice-chase)

After Step 1 approval, trigger the invoice-chase skill workflow:

  1. Pull overdue invoices from QuickBooks and PayPal.
  2. Rank by amount × days-late × customer payment history.
  3. For each, draft a reminder matched to tone (gentle for good customers, firm for repeat late payers).
  4. PayPal-issued invoices queue as PayPal-send drafts; non-PayPal invoices queue as Mail drafts.
  5. Present the ranked list with drafted reminders. Show the projected cash impact if a top-N subset gets paid within the horizon — does that close the payroll gap from Step 1?
  6. Wait for explicit "send these" per reminder (or batch approval) before pushing.

Approval gates (must hold)

  • Never send a reminder without owner approval — drafts only until "send" is given.
  • Never commit a forecast as authoritative without owner sign-off.
  • If a connector is unreachable (QuickBooks, PayPal, Mail), stop, report which connector failed, and ask whether to retry, fall back to CSV, or abort.

Output

End the run with a one-paragraph recap: forecast verdict (covered / gap / risk), reminders sent and to whom, projected new cash position if reminders convert.

基于QuickBooks和PayPal数据生成产品毛利表及三种定价情景模拟,辅助决策。提供消息沟通建议,严格禁止推荐具体价格或修改系统数据,确保财务分析客观性。
用户询问特定产品的利润率 用户需要评估不同定价策略对收入的影响 用户准备调整产品价格并寻求数据支持
small-business/skills/price-check/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill price-check -g -y
SKILL.md
Frontmatter
{
    "name": "price-check",
    "description": "Produces a margin-by-product table and three pricing-scenario data views so the owner can see the full financial picture before making a pricing decision. Accepts optional product name argument.",
    "allowed-tools": "Read, WebFetch, Bash"
}

Run the pricing analysis. Pull cost and revenue data, build the margin table, and model three pricing scenarios — so the owner can see the numbers clearly before deciding what to charge.

Parse arguments:

  • PRODUCT_NAME (optional) — specific product or service to analyze; if omitted, analyze all active products

Step 1 — Current margin baseline

Using the margin-analyzer skill workflow:

  1. Pull QuickBooks revenue by product/service for the last 90 days.
  2. Pull COGS or direct costs per product from QuickBooks (if categorized).
  3. Pull PayPal gross sales for the same products to cross-validate.
  4. Calculate current gross margin per product: (revenue − COGS) ÷ revenue.

Build the margin table:

Product          | Revenue  | COGS     | Gross Margin | Margin %
{product}        | ${amt}   | ${amt}   | ${amt}       | {X}%

Flag any product with margin below 20% as a risk.

Step 2 — Three pricing scenarios

For each product (or the specified product), model three scenarios. Do NOT recommend a price — present data only.

Scenario A — Hold current price

  • Project revenue at current price × current volume
  • Project margin at current COGS

Scenario B — Price increase (+10% to +20%, owner to specify)

  • Project revenue assuming 0%, 5%, and 10% volume loss at new price
  • Show the break-even volume needed to maintain current profit

Scenario C — Price decrease (−10%, to drive volume)

  • Project revenue assuming 10%, 20%, and 30% volume increase
  • Show the volume needed to match current profit

Present each scenario as a data table, not a recommendation.

Step 3 — Customer messaging brief

Produce a plain-language brief (for price increase scenarios) the owner can use to communicate a change to customers:

  • One paragraph explaining the change
  • Three key message options (direct, value-focused, empathetic)
  • Suggested timing and channel (email, invoice note, in-person)

Connector failures

If QuickBooks is unreachable, stop — margin analysis requires QB revenue and cost data. If PayPal is missing, run from QB-only and note "PayPal not connected — cross-validation against PayPal sales skipped."

Approval gates

  • Never recommend a specific price. Provide data views only — pricing decisions belong to the owner.
  • Flag if COGS data is incomplete (many QB setups don't track per-product COGS) and note the gap.
  • Never update any prices in QB, PayPal, or any connected system.

Output

Present the margin table, then the three scenario tables side-by-side. If a price increase scenario is being considered, append the customer messaging brief. End with: "Which scenario would you like to explore further?"

生成季度业务复盘(QBR)报告。整合财务、销售及客户数据,分析趋势、机会与风险,撰写叙事性总结并导出为PDF或演示文稿。支持指定季度及保存位置,需人工审核后方可发布。
需要生成季度业务复盘报告 请求进行季度业绩回顾与分析
small-business/skills/quarterly-review/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill quarterly-review -g -y
SKILL.md
Frontmatter
{
    "name": "quarterly-review",
    "description": "Generates a full QBR narrative — revenue trend, margin trend, customer health, top opportunities and risks — as a presentation-ready PDF or deck. Accepts optional quarter and save-to arguments.",
    "allowed-tools": "Read, WebFetch, Bash"
}

Run the quarterly business review. Pull financial, sales, and customer data for the quarter, synthesize it into a narrative, and produce a presentation-ready document.

Parse arguments:

  • --quarter (default: previous calendar quarter) — format YYYY-QN (e.g., 2026-Q1)
  • --save-to (default: files) — files (Google Drive / OneDrive), desktop, or both

Step 1 — Financial performance

Using the business-pulse skill in deep mode:

  1. Pull QuickBooks P&L for the quarter: revenue, COGS, gross margin, operating expenses, net margin.
  2. Compare to prior quarter and same quarter last year (if available).
  3. Pull PayPal settlements for the same period to validate QB revenue.
  4. Calculate: revenue growth %, margin change in points, top 3 revenue categories.

Step 2 — Customer health

  1. Pull HubSpot deal data: new customers won, churned, average deal size, pipeline entering next quarter.
  2. Calculate customer acquisition cost (if data available) and revenue per customer.
  3. Flag any customers representing >20% of revenue (concentration risk).

Step 3 — Top opportunities

Identify 3 specific opportunities for next quarter based on the data:

  • Revenue upside (category, customer segment, or channel to double down on)
  • Margin upside (cost to cut or price to raise)
  • Customer upside (segment to target or churn to reduce)

Step 4 — Top risks

Identify 3 specific risks for next quarter:

  • Revenue risk (concentration, trend, seasonality)
  • Margin risk (rising cost, pricing pressure)
  • Operational risk (pipeline gap, vendor dependency)

Step 5 — QBR narrative

Write a 500–800 word narrative in plain business English with this structure:

  1. Quarter headline (one sentence)
  2. Revenue story (trend + why)
  3. Margin story (trend + why)
  4. Customer story (health + pipeline)
  5. Three opportunities
  6. Three risks
  7. One-paragraph call to action for next quarter

Step 6 — Export

Generate:

  1. qbr-{YYYY-QN}.pdf — formatted narrative + key charts (as ASCII tables if no chart tool available)
  2. Save to --save-to location

Connector failures

If QuickBooks is unreachable, stop — the QBR requires QB financial data as the foundation. If PayPal is missing, skip cross-validation and note "PayPal not connected — revenue validated from QB only." If HubSpot is missing, skip customer health (Step 2) and note "HubSpot not connected — customer health section skipped."

Approval gates

  • Never publish or email the QBR automatically. Always display for owner review first.
  • Flag if any data source returns incomplete data — note gaps in the narrative.

Output

Present the narrative in-line, then confirm export. End with a one-paragraph "what to focus on next quarter" summary.

审查合同并用通俗语言总结,识别高风险条款并评级,生成带修订建议的标记文档。支持本地文件或DocuSign信封ID输入,提供详细的风险提示和谈判用的红线条款建议。
用户请求审查合同内容 需要识别合同中的法律风险或陷阱 要求生成合同的修改建议或红线条款
small-business/skills/review-contract/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill review-contract -g -y
SKILL.md
Frontmatter
{
    "name": "review-contract",
    "description": "Reviews a contract in plain English, surfaces red flags with severity ratings, and produces a marked-up docx\/PDF with suggested redlines. Accepts optional file path or DocuSign envelope ID.",
    "allowed-tools": "Read, WebFetch, Bash"
}

Run the contract review. Read the document, explain what it says, flag anything risky, and produce marked-up redlines for the owner to use in negotiations.

Parse arguments:

  • FILE_PATH_OR_DOCUSIGN_ENVELOPE_ID — path to a local PDF/docx file, or a DocuSign envelope ID; if omitted, check the most recent envelope awaiting signature in DocuSign

Step 1 — Load the contract

Using the contract-review skill workflow:

  1. If a file path is given: read the document from Files or Desktop.
  2. If a DocuSign envelope ID is given: pull the document from DocuSign.
  3. If neither: check DocuSign for the most recent envelope with status waiting for signature and confirm with the owner before proceeding.

Step 2 — Plain-English summary

Produce a 3-paragraph summary:

  1. What this contract does — the deal in plain terms (who, what, how much, how long)
  2. Key obligations — what the owner must do and when
  3. Key rights — what the owner gets and any termination or exit paths

Step 3 — Red-flag list

For each risk, rate severity: 🔴 High / 🟡 Medium / 🟢 Low

Flag at minimum:

  • Auto-renewal clauses with short cancellation windows
  • Unilateral price change rights
  • Broad IP ownership transfers
  • Unlimited liability or missing liability cap
  • Exclusivity clauses
  • Non-compete or non-solicit provisions
  • Ambiguous payment or deliverable terms

Format each flag as:

{Severity} {Clause name} — {what it says in plain English} — Suggested redline: {fix}

Step 4 — Marked-up redlines

Generate a list of specific redline suggestions in legal markup format:

§{section}: DELETE "[original language]" / INSERT "[suggested replacement]"
Reason: {one sentence}

Offer to export this as a marked-up docx or PDF to Files or Desktop.

Connector failures

If DocuSign is not connected and no file path was given, ask the owner to upload the contract as a PDF or docx. If DocuSign is connected but the envelope ID is invalid, report the error and ask the owner to check the ID. This command works fully offline with a local file — connectors are optional.

Approval gates

  • Never sign, send, or modify the actual DocuSign envelope. Present the review and wait for the owner to act.
  • Always caveat: "This is not legal advice. Review with your attorney before signing."
  • Never delete or overwrite the original document.

Output

Present the plain-English summary, red-flag list, and redline suggestions. Ask the owner whether to export a marked-up copy and where to save it.

自动化执行端到端营销活动,串联销售分析、内容策略、Canva素材生成及HubSpot发送。通过分步审批机制确保质量,自动识别收入下滑并生成受众名单与高优线索,全程需人工确认关键节点。
需要启动包含数据分析和多渠道分发的完整营销流程 要求对收入下滑进行归因分析并自动生成后续推广内容与执行计划
small-business/skills/run-campaign/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill run-campaign -g -y
SKILL.md
Frontmatter
{
    "name": "run-campaign",
    "description": "Runs an end-to-end marketing campaign — sales analysis, content brief, Canva assets, HubSpot send. Accepts optional lookback and channel arguments.",
    "allowed-tools": "Read, WebFetch, Bash"
}

Run the full campaign pipeline by chaining three skills in order. The owner approves at each handoff — never roll past a gate without explicit confirmation.

Parse arguments:

  • --lookback (default 90d) — how far back to look for the revenue dip
  • --channel (default both) — email, social, or both

Step 1 — Sales analysis + content brief (content-strategy)

Trigger the content-strategy skill workflow:

  1. Pull sales data from QuickBooks and PayPal for the lookback window.
  2. Identify the revenue dip — which product/service, which time period, magnitude.
  3. Produce a 30-day prioritized content brief: what to push, what offer to run, what to hold.
  4. Present the brief to the owner. Wait for explicit "approved, build the assets" before continuing.

If the owner edits the brief, incorporate edits and re-present.

Step 2 — Asset generation + send staging (canva-creator)

After Step 1 approval, trigger the canva-creator skill workflow:

  1. Take the approved brief from Step 1 as input.
  2. Build the posting calendar matched to the brief's priorities.
  3. Generate on-brand Canva assets for each post (apply each on screen for owner approval before moving on).
  4. Draft caption copy for each post.
  5. Stage the scheduled send in HubSpot (do NOT send — staging only).
  6. Present the staged campaign to the owner. Wait for explicit "approved, send to segment X" before Step 3.

Step 3 — Audience segmentation (lead-triage)

After Step 2 approval, trigger the lead-triage skill workflow:

  1. Pull HubSpot contacts that match the campaign's target segment (from the approved brief).
  2. Score by engagement, company fit, urgency markers.
  3. Produce two deliverables:
    • Bulk send list — the segment receiving the staged campaign from Step 2
    • High-priority call list — top 5 leads the owner should call personally with talking points
  4. Block calendar time for the call list.
  5. Present both lists. Wait for explicit "send" before pushing the HubSpot campaign live.

Approval gates (must hold)

  • Never auto-progress between steps. Each handoff requires explicit owner approval.
  • Never send the HubSpot campaign without the owner's "send" command in Step 3.
  • If any connector is unreachable (QuickBooks, PayPal, Canva, HubSpot), stop, report which connector failed, and ask whether to retry or abort.

Output

End the run with a one-paragraph recap: revenue dip identified, posts generated, segment size, calls booked. Link to the HubSpot campaign URL once sent.

分析指定周期销售数据,识别畅销与滞销品及季节性规律,归因驱动因素。基于数据生成2周内容策划简报,指导推广赢家并清理库存,明确标注数据来源限制,严禁自动发布或创建素材,仅供人工审核决策。
需要分析近期销售业绩并制定内容营销计划 希望识别畅销和滞销产品以优化库存和推广策略 要求基于销售数据生成两周的内容日历
small-business/skills/sales-brief/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill sales-brief -g -y
SKILL.md
Frontmatter
{
    "name": "sales-brief",
    "description": "Surfaces top and bottom sellers, identifies seasonality patterns, and produces a 2-week content brief to push winners and clear slow movers. Accepts optional lookback window of 30, 60, or 90 days.",
    "allowed-tools": "Read, WebFetch, Bash"
}

Run the sales analysis and content brief. Pull what sold (and what didn't), explain why, and produce a ready-to-use content plan that acts on the data.

Parse arguments:

  • --lookback (default: 30d) — 30d, 60d, or 90d lookback window

Step 1 — Sales breakdown

Using the content-strategy skill workflow for sales analysis:

  1. Pull PayPal transactions for the lookback period grouped by item/service/SKU.
  2. Pull QuickBooks revenue by product/service category.
  3. Rank products by: total revenue, unit volume, and margin (if available in QB).
  4. Calculate each product's share of total revenue vs. prior equivalent period.

Top sellers: products that grew share or maintained top-3 rank. Bottom sellers: products with declining volume or below 5% of revenue.

Step 2 — Seasonality check

  1. Compare current period to same period in prior year (if QB history available).
  2. Flag any items with a seasonal pattern (e.g., spikes in Q4, slow summers).
  3. Note any new products with insufficient history to detect seasonality.

Step 3 — Why analysis

For each top and bottom seller, explain the likely driver:

  • Price change, promo, new channel, seasonal demand, competitor move
  • Cross-reference with HubSpot campaign activity for the period
  • Note where attribution is inferred vs. confirmed

Step 4 — 2-week content brief

Produce a ready-to-use content brief:

2-Week Content Brief — {date range}

PUSH THESE (winners)
• {product}: {suggested angle} — {channel: email|social|both}
• {product}: {suggested angle} — {channel}

CLEAR THESE (slow movers)
• {product}: {promo angle or bundle suggestion} — {channel}

CONTENT CALENDAR
Week 1:
  Mon: {post/email concept}
  Wed: {post/email concept}
  Fri: {post/email concept}
Week 2:
  Mon: {post/email concept}
  Wed: {post/email concept}
  Fri: {post/email concept}

Connector failures

If both QuickBooks and PayPal are unreachable, stop — sales analysis requires at least one revenue source. If only one is connected, run from that source and note "QuickBooks not connected — revenue data from PayPal only" (or vice versa). If HubSpot is missing, skip campaign cross-reference in the "why analysis" and note it.

Approval gates

  • Never auto-schedule or publish content. The brief is for owner review only.
  • Never create Canva assets automatically — offer to generate them after owner approves the brief.

Output

Present the sales analysis, then the content brief. Ask the owner if they'd like to generate Canva assets for any of the planned posts.

用于准备税务季材料,支持季度预估税或年终1099表格整理,并生成会计交接包。自动识别模式与年份,计算税额或汇总承包商支付记录,明确标注假设条件,严禁提供税务建议或自动合并数据,最终输出包含待办事项的核对清单供会计师审核。
用户输入 /tax-prep 命令 需要生成季度预估税计算结果 需要准备年终1099-NEC预资料 需要创建会计交接数据包
small-business/skills/tax-prep/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill tax-prep -g -y
SKILL.md
Frontmatter
{
    "name": "tax-prep",
    "description": "Prepares tax-season materials — quarterly estimated tax calculation or year-end 1099 prep — and produces an accountant handoff packet. Accepts optional mode and year arguments.",
    "allowed-tools": "Read, WebFetch, Bash"
}

Run the tax prep workflow using the tax-season-organizer skill. Act immediately — the user typed /tax-prep, so skip the discovery phase.

Parse arguments:

  • --mode (default: infer from date — Q1-Q3 defaults to quarterly, Q4/Jan defaults to both) — quarterly for estimated tax payment, 1099 for year-end 1099-NEC prep, both for combined
  • --year (default: current year)

Framing: Open every deliverable with "Prepared for review by your accountant — not tax advice."

Step 1 — Determine mode

If --mode was not provided:

  1. Check the current date. If Oct–Jan, default to both. Otherwise default to quarterly.
  2. Confirm with the owner: "Based on the time of year, I'll prepare [mode]. Want me to do something different?"

Step 2 — Quarterly estimated tax (if mode includes quarterly)

  1. Pull YTD Profit & Loss from QuickBooks (Jan 1 through last completed quarter).
  2. If QuickBooks is not connected, ask the user to paste net income or upload a CSV.
  3. Ask: "How much have you already paid in estimated taxes this year?"
  4. Calculate: SE tax, adjusted net income, federal income tax estimate (default 22% bracket), quarterly payment due.
  5. State every assumption explicitly — bracket, business type, exclusions.
  6. Deliver the formatted estimate with the due date for the current quarter.

Step 3 — Year-end 1099 prep (if mode includes 1099)

  1. Pull contractor/vendor payments from all connected sources: QuickBooks, PayPal, Stripe.
  2. Aggregate by payee across sources. Flag likely duplicates for human review — never auto-merge.
  3. Apply the $600 threshold. Flag near-threshold payees ($400–$599).
  4. Check W-9 status in QuickBooks for each flagged payee.
  5. Deliver the 1099-NEC candidate list with missing W-9 action items and the PayPal/Stripe 1099-K overlap note.

Approval gates

  • Not tax advice. State this in every output header.
  • State every assumption. Bracket, business type, excluded deductions — give the accountant the levers.
  • Don't merge payees automatically. Flag duplicates for human review.
  • Don't file anything. Output is prep material only.

Output

End with a next-steps checklist for the accountant: missing W-9s to collect, assumptions to verify, deadlines to hit.

自动回复客户邮件或工单。从PayPal和HubSpot获取订单及账户信息,以所有者语气起草回复。若需退款,先展示详情并等待明确批准后再执行,确保操作安全合规。
用户要求起草回复 询问订单状态 请求退款
small-business/skills/ticket-deflector/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill ticket-deflector -g -y
SKILL.md
Frontmatter
{
    "name": "ticket-deflector",
    "description": "Reads a forwarded customer email or ticket, pulls order\/refund status from PayPal and account history from HubSpot, drafts a tone-matched reply in the owner's writing voice, and can issue a PayPal refund with explicit owner approval. Use when the user says \"draft a response,\" \"answer this customer,\" \"where's my order,\" or \"I want a refund.\"\n",
    "compatibility": "Requires PayPal, HubSpot, Mail. Optional: Intercom, Square."
}

Ticket Deflector

Quick start

Forward or paste a customer email — Claude pulls order status from PayPal, looks up the customer in HubSpot, and drafts a reply in the owner's voice. If a refund is needed, it stages the details and waits for explicit approval before issuing anything.

User: "answer this customer" [forwards email]
→ Extract customer email + issue from thread
→ Pull PayPal transaction status
→ Pull HubSpot contact history
→ Draft reply in owner's voice
→ Owner approves draft → send or stage
→ If refund needed: approval prompt → owner confirms → issue

Workflow

  1. Read the customer message. Accept a forwarded Gmail thread or pasted text. Extract: customer email address, name, order or transaction ID (if present), and the core issue — refund request, order status question, or general complaint. If multiple issues are present, address them in the order they appear.

  2. Pull order status from PayPal. Search PayPal transactions by customer email or transaction ID. Capture: amount, date, status, and whether a refund has already been issued. If PayPal is not connected, note it in the draft and continue. If no transaction matches, flag it — do not guess at a match.

    • PayPal rate limit: If the customer provided a transaction ID, use it — single-record lookups avoid throttling entirely. If searching by email, use a 7-day window (not 30 days). PayPal's transaction list endpoint throttles aggressively on wide date-range queries; back-to-back tickets in the same session will hit this limit if the window is too broad.
    • If Intercom is connected, check for open support tickets from this customer.
    • If Square is connected, check Square transaction history as a secondary source.
    • If multiple transactions match, surface all of them and ask the owner which one applies before drafting.
  3. Pull customer history from HubSpot. Search contacts by email address. Pull: lifecycle stage, notes, open deals, and recent activity. If no contact exists, note it and offer to create one after the reply is sent — do not create during the response workflow.

  4. Draft the reply. Write in the owner's writing voice. Adjust tone to fit the issue type:

    • Refund request → empathetic, clear, action-oriented
    • Order status question → factual, reassuring
    • General complaint → acknowledge, explain, offer resolution Flag any data gaps inline in the draft with a bracketed note (e.g., [Note: No PayPal transaction found — verify order ID before sending]) so the owner sees the gap before sending. For a worked example, see reference/examples/respond-refund-request.md. For common pitfalls, see reference/gotchas.md.
  5. Approval gate — owner reviews the draft. Present the full draft. Do not send or stage it until the owner approves. The owner may edit freely before approving.

  6. Approval gate — refund issuance. If a refund is warranted, surface a dedicated confirmation prompt after the owner approves the draft:

    "Issue refund of $[amount] to [customer name] ([email]) for transaction [ID]? Reply Y to proceed."

    Wait for explicit confirmation. If the owner's reply is anything other than a clear yes, stop and ask what they'd like to do instead.

  7. Send or stage the reply. After draft approval, ask the owner: send via Gmail now, or save as a draft? Execute their choice. Then log the interaction as a note on the HubSpot contact timeline.

  8. Report. One short paragraph: reply sent or staged, refund issued or not, HubSpot note logged.

Approval gates

  • Never issue a PayPal refund without explicit owner confirmation — always show amount, customer name, email, and transaction ID before executing.
  • Never send the reply without owner review. Always present the full draft first.
  • Never create a HubSpot contact during the response flow. Offer it afterward.
  • Never auto-select a PayPal transaction. If multiple match, surface them all and let the owner choose.
  • Never fabricate order details. If PayPal has no record, say so inline in the draft — do not invent a status.

Reference

将实验室仪器输出文件(PDF/CSV等)转换为Allotrope ASM JSON或扁平化CSV,支持LIMS上传、数据湖集成及解析代码生成,自动检测仪器类型。
转换仪器文件为标准化格式 为LIMS/ELN系统准备数据 生成生产环境用的解析代码
bio-research/skills/instrument-data-to-allotrope/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill instrument-data-to-allotrope -g -y
SKILL.md
Frontmatter
{
    "name": "instrument-data-to-allotrope",
    "description": "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\/ELN systems, or generating parser code for production pipelines."
}

Instrument Data to Allotrope Converter

Convert instrument files into standardized Allotrope Simple Model (ASM) format for LIMS upload, data lakes, or handoff to data engineering teams.

Note: This is an Example Skill

This skill demonstrates how skills can support your data engineering tasks—automating schema transformations, parsing instrument outputs, and generating production-ready code.

To customize for your organization:

  • Modify the references/ files to include your company's specific schemas or ontology mappings
  • Use an MCP server to connect to systems that define your schemas (e.g., your LIMS, data catalog, or schema registry)
  • Extend the scripts/ to handle proprietary instrument formats or internal data standards

This pattern can be adapted for any data transformation workflow where you need to convert between formats or validate against organizational standards.

Workflow Overview

  1. Detect instrument type from file contents (auto-detect or user-specified)
  2. Parse file using allotropy library (native) or flexible fallback parser
  3. Generate outputs:
    • ASM JSON (full semantic structure)
    • Flattened CSV (2D tabular format)
    • Python parser code (for data engineer handoff)
  4. Deliver files with summary and usage instructions

When Uncertain: If you're unsure how to map a field to ASM (e.g., is this raw data or calculated? device setting or environmental condition?), ask the user for clarification. Refer to references/field_classification_guide.md for guidance, but when ambiguity remains, confirm with the user rather than guessing.

Quick Start

# Install requirements first
pip install allotropy pandas openpyxl pdfplumber --break-system-packages

# Core conversion
from allotropy.parser_factory import Vendor
from allotropy.to_allotrope import allotrope_from_file

# Convert with allotropy
asm = allotrope_from_file("instrument_data.csv", Vendor.BECKMAN_VI_CELL_BLU)

Output Format Selection

ASM JSON (default) - Full semantic structure with ontology URIs

  • Best for: LIMS systems expecting ASM, data lakes, long-term archival
  • Validates against Allotrope schemas

Flattened CSV - 2D tabular representation

  • Best for: Quick analysis, Excel users, systems without JSON support
  • Each measurement becomes one row with metadata repeated

Both - Generate both formats for maximum flexibility

Calculated Data Handling

IMPORTANT: Separate raw measurements from calculated/derived values.

  • Raw datameasurement-document (direct instrument readings)
  • Calculated datacalculated-data-aggregate-document (derived values)

Calculated values MUST include traceability via data-source-aggregate-document:

"calculated-data-aggregate-document": {
  "calculated-data-document": [{
    "calculated-data-identifier": "SAMPLE_B1_DIN_001",
    "calculated-data-name": "DNA integrity number",
    "calculated-result": {"value": 9.5, "unit": "(unitless)"},
    "data-source-aggregate-document": {
      "data-source-document": [{
        "data-source-identifier": "SAMPLE_B1_MEASUREMENT",
        "data-source-feature": "electrophoresis trace"
      }]
    }
  }]
}

Common calculated fields by instrument type:

Instrument Calculated Fields
Cell counter Viability %, cell density dilution-adjusted values
Spectrophotometer Concentration (from absorbance), 260/280 ratio
Plate reader Concentrations from standard curve, %CV
Electrophoresis DIN/RIN, region concentrations, average sizes
qPCR Relative quantities, fold change

See references/field_classification_guide.md for detailed guidance on raw vs. calculated classification.

Validation

Always validate ASM output before delivering to the user:

python scripts/validate_asm.py output.json
python scripts/validate_asm.py output.json --reference known_good.json  # Compare to reference
python scripts/validate_asm.py output.json --strict  # Treat warnings as errors

Validation Rules:

Soft Validation Approach: Unknown techniques, units, or sample roles generate warnings (not errors) to allow for forward compatibility. If Allotrope adds new values after December 2024, the validator won't block them—it will flag them for manual verification. Use --strict mode to treat warnings as errors if you need stricter validation.

What it checks:

  • Correct technique selection (e.g., multi-analyte profiling vs plate reader)
  • Field naming conventions (space-separated, not hyphenated)
  • Calculated data has traceability (data-source-aggregate-document)
  • Unique identifiers exist for measurements and calculated values
  • Required metadata present
  • Valid units and sample roles (with soft validation for unknown values)

Supported Instruments

See references/supported_instruments.md for complete list. Key instruments:

Category Instruments
Cell Counting Vi-CELL BLU, Vi-CELL XR, NucleoCounter
Spectrophotometry NanoDrop One/Eight/8000, Lunatic
Plate Readers SoftMax Pro, EnVision, Gen5, CLARIOstar
ELISA SoftMax Pro, BMG MARS, MSD Workbench
qPCR QuantStudio, Bio-Rad CFX
Chromatography Empower, Chromeleon

Detection & Parsing Strategy

Tier 1: Native allotropy parsing (PREFERRED)

Always try allotropy first. Check available vendors directly:

from allotropy.parser_factory import Vendor

# List all supported vendors
for v in Vendor:
    print(f"{v.name}")

# Common vendors:
# AGILENT_TAPESTATION_ANALYSIS  (for TapeStation XML)
# BECKMAN_VI_CELL_BLU
# THERMO_FISHER_NANODROP_EIGHT
# MOLDEV_SOFTMAX_PRO
# APPBIO_QUANTSTUDIO
# ... many more

When the user provides a file, check if allotropy supports it before falling back to manual parsing. The scripts/convert_to_asm.py auto-detection only covers a subset of allotropy vendors.

Tier 2: Flexible fallback parsing

Only use if allotropy doesn't support the instrument. This fallback:

  • Does NOT generate calculated-data-aggregate-document
  • Does NOT include full traceability
  • Produces simplified ASM structure

Use flexible parser with:

  • Column name fuzzy matching
  • Unit extraction from headers
  • Metadata extraction from file structure

Tier 3: PDF extraction

For PDF-only files, extract tables using pdfplumber, then apply Tier 2 parsing.

Pre-Parsing Checklist

Before writing a custom parser, ALWAYS:

  1. Check if allotropy supports it - Use native parser if available
  2. Find a reference ASM file - Check references/examples/ or ask user
  3. Review instrument-specific guide - Check references/instrument_guides/
  4. Validate against reference - Run validate_asm.py --reference <file>

Common Mistakes to Avoid

Mistake Correct Approach
Manifest as object Use URL string
Lowercase detection types Use "Absorbance" not "absorbance"
"emission wavelength setting" Use "detector wavelength setting" for emission
All measurements in one document Group by well/sample location
Missing procedure metadata Extract ALL device settings per measurement

Code Export for Data Engineers

Generate standalone Python scripts that scientists can hand off:

# Export parser code
python scripts/export_parser.py --input "data.csv" --vendor "VI_CELL_BLU" --output "parser_script.py"

The exported script:

  • Has no external dependencies beyond pandas/allotropy
  • Includes inline documentation
  • Can run in Jupyter notebooks
  • Is production-ready for data pipelines

File Structure

instrument-data-to-allotrope/
├── SKILL.md                          # This file
├── scripts/
│   ├── convert_to_asm.py            # Main conversion script
│   ├── flatten_asm.py               # ASM → 2D CSV conversion
│   ├── export_parser.py             # Generate standalone parser code
│   └── validate_asm.py              # Validate ASM output quality
└── references/
    ├── supported_instruments.md     # Full instrument list with Vendor enums
    ├── asm_schema_overview.md       # ASM structure reference
    ├── field_classification_guide.md # Where to put different field types
    └── flattening_guide.md          # How flattening works

Usage Examples

Example 1: Vi-CELL BLU file

User: "Convert this cell counting data to Allotrope format"
[uploads viCell_Results.xlsx]

Claude:
1. Detects Vi-CELL BLU (95% confidence)
2. Converts using allotropy native parser
3. Outputs:
   - viCell_Results_asm.json (full ASM)
   - viCell_Results_flat.csv (2D format)
   - viCell_parser.py (exportable code)

Example 2: Request for code handoff

User: "I need to give our data engineer code to parse NanoDrop files"

Claude:
1. Generates self-contained Python script
2. Includes sample input/output
3. Documents all assumptions
4. Provides Jupyter notebook version

Example 3: LIMS-ready flattened output

User: "Convert this ELISA data to a CSV I can upload to our LIMS"

Claude:
1. Parses plate reader data
2. Generates flattened CSV with columns:
   - sample_identifier, well_position, measurement_value, measurement_unit
   - instrument_serial_number, analysis_datetime, assay_type
3. Validates against common LIMS import requirements

Implementation Notes

Installing allotropy

pip install allotropy --break-system-packages

Handling parse failures

If allotropy native parsing fails:

  1. Log the error for debugging
  2. Fall back to flexible parser
  3. Report reduced metadata completeness to user
  4. Suggest exporting different format from instrument

ASM Schema Validation

Validate output against Allotrope schemas when available:

import jsonschema
# Schema URLs in references/asm_schema_overview.md
基于Fischbach & Walsh论文的科研选题与决策辅助工具。支持新想法评估、项目故障排查及战略规划,通过直觉泵、风险评估等技能引导用户系统性地选择科学问题并优化研究策略。
需要帮助选择科学研究课题 寻求新项目创意或点子评估 科研项目陷入停滞需排查问题 制定研究战略或应对决策困境
bio-research/skills/scientific-problem-selection/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill scientific-problem-selection -g -y
SKILL.md
Frontmatter
{
    "name": "scientific-problem-selection",
    "description": "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\"."
}

Scientific Problem Selection Skills

A conversational framework for systematic scientific problem selection based on Fischbach & Walsh's "Problem choice and decision trees in science and engineering" (Cell, 2024).

Getting Started

Present users with three entry points:

1) Pitch an idea for a new project — to work it up together

2) Share a problem in a current project — to troubleshoot together

3) Ask a strategic question — to navigate the decision tree together

This conversational entry meets scientists where they are and establishes a collaborative tone.


Option 1: Pitch an Idea

Initial Prompt

Ask: "Tell me the short version of your idea (1-2 sentences)."

Response Approach

After the user shares their idea, return a quick summary (no more than one paragraph) demonstrating understanding. Note the general area of research and rephrase the idea in a way that highlights its kernel—showing alignment and readiness to dive into details.

Follow-up Prompt

Then ask for more detail: "Now give me a bit more detail. You might include, however briefly or even say where you are unsure:

  1. What exactly you want to do
  2. How you currently plan to do it
  3. If it works, why will it be a big deal
  4. What you think are the major risks"

Workflow

From there, guide the user through the early stages of problem selection and evaluation:

  • Skill 1: Intuition Pumps - Refine and strengthen the idea
  • Skill 2: Risk Assessment - Identify and manage project risks
  • Skill 3: Optimization Function - Define success metrics
  • Skill 4: Parameter Strategy - Determine what to fix vs. keep flexible

See references/01-intuition-pumps.md, references/02-risk-assessment.md, references/03-optimization-function.md, and references/04-parameter-strategy.md for detailed guidance.


Option 2: Troubleshoot a Problem

Initial Prompt

Ask: "Tell me a short version of your problem (1-2 sentences or whatever is easy)."

Response Approach

After the user shares their problem, return a quick summary (no more than one paragraph) demonstrating understanding. Note the context of the project where the problem occurred and rephrase the problem—highlighting its core essence—so the user knows the situation is understood. Also raise additional questions that seem important to discuss.

Follow-up Prompt

Then ask: "Now give me a bit more detail. You might include, however briefly:

  1. The overall goal of your project (if we have not talked about it before)
  2. What exactly went wrong
  3. Your current ideas for fixing it"

Workflow

From there, guide the user through troubleshooting and decision tree navigation:

  • Skill 5: Decision Tree Navigation - Plan decision points and navigate between execution and strategic thinking
  • Skill 4: Parameter Strategy - Fix one parameter at a time, let others float
  • Skill 6: Adversity Response - Frame problems as opportunities for growth
  • Skill 7: Problem Inversion - Strategies for navigating around obstacles

Always include workarounds that might be useful whether or not the problem can be fixed easily.

See references/05-decision-tree.md, references/06-adversity-planning.md, references/07-problem-inversion.md, and references/04-parameter-strategy.md for detailed guidance.


Option 3: Ask a Strategic Question

Initial Prompt

Ask: "Tell me the short version of your question (1-2 sentences)."

Response Approach

After the user shares their question, return a quick summary (no more than one paragraph) demonstrating understanding. Note the broader context and rephrase the question—highlighting its crux—to confirm alignment with their thinking.

Follow-up Prompt

Then ask: "Now give me a bit more detail. You might include, however briefly:

  1. The setting (i.e., is this about a current or future project)
  2. A bit more detail about what you're thinking"

Workflow

From there, draw on the specific modules from the problem choice framework most appropriate to the question:

  • Skills 1-4 for future project planning (ideation, risk, optimization, parameters)
  • Skills 5-7 for current project navigation (decision trees, adversity, inversion)
  • Skill 8 for communication and synthesis
  • Skill 9 for comprehensive workflow orchestration

See the complete reference materials in the references/ folder.


Core Framework Concepts

The Central Insight

Problem Choice >> Execution Quality

Even brilliant execution of a mediocre problem yields incremental impact. Good execution of an important problem yields substantial impact.

The Time Paradox

Scientists typically spend:

  • Days choosing a problem
  • Years solving it

This imbalance limits impact. These skills help invest more time choosing wisely.

Evaluation Axes

For Evaluating Ideas:

  • X-axis: Likelihood of success
  • Y-axis: Impact if successful

Skills help move ideas rightward (more feasible) and upward (more impactful).

The Risk Paradox

  • Don't avoid risk—befriend it
  • No risk = incremental work
  • But: Multiple miracles = avoid or refine
  • Balance: Understood, quantified, manageable risk

The Parameter Paradox

  • Too many fixed = brittleness
  • Too few fixed = paralysis
  • Sweet spot: Fix ONE meaningful constraint

The Adversity Principle

  • Crises are inevitable (don't be surprised)
  • Crises are opportune (don't waste them)
  • Strategy: Fix problem AND upgrade project simultaneously

The 9 Skills Overview

Skill Purpose Output Time
1. Intuition Pumps Generate high-quality research ideas Problem Ideation Document ~1 week
2. Risk Assessment Identify and manage project risks Risk Assessment Matrix 3-5 days
3. Optimization Function Define success metrics Impact Assessment Document 2-3 days
4. Parameter Strategy Decide what to fix vs. keep flexible Parameter Strategy Document 2-3 days
5. Decision Tree Navigation Plan decision points and altitude dance Decision Tree Map 2 days
6. Adversity Response Prepare for crises as opportunities Adversity Playbook 2 days
7. Problem Inversion Navigate around obstacles Problem Inversion Analysis 1 day
8. Integration & Synthesis Synthesize into coherent plan Project Communication Package 3-5 days
9. Meta-Framework Orchestrate complete workflow Complete Project Package 1-6 weeks

Skill Workflow

SKILL 1: Intuition Pumps
         | (generates idea)
         v
SKILL 2: Risk Assessment
         | (evaluates feasibility)
         v
SKILL 3: Optimization Function
         | (defines success metrics)
         v
SKILL 4: Parameter Strategy
         | (determines flexibility)
         v
SKILL 5: Decision Tree
         | (plans execution and evaluation)
         v
SKILL 6: Adversity Planning
         | (prepares for failure modes)
         v
SKILL 7: Problem Inversion
         | (provides pivot strategies)
         v
SKILL 8: Integration & Communication
         | (synthesizes into coherent plan)
         v
SKILL 9: Meta-Skill
         (orchestrates complete workflow)

Key Design Principles

  1. Conversational Entry - Meet users where they are with three clear starting points
  2. Thoughtful Interaction - Ask clarifying questions; low confidence prompts additional input
  3. Literature Integration - Use PubMed searches at strategic points for validation
  4. Concrete Outputs - Every skill produces tangible 1-2 page documents
  5. Building Specificity - Progressive detail emerges through targeted questions
  6. Flexibility - Skills work independently, sequentially, or iteratively
  7. Scientific Rigor - Claims about generality and feasibility should be evidence-based

Who Should Use These Skills

Graduate Students (Primary Audience)

  • When: Choosing thesis projects, qualifying exams, committee meetings
  • Focus: Skills 1-3 (ideation, risk, impact) + Skill 9 (complete workflow)
  • Timeline: 2-4 weeks for comprehensive planning

Postdocs

  • When: Starting new position, planning independent projects, fellowship applications
  • Focus: All skills, emphasizing independence and risk management
  • Timeline: 1-2 weeks intensive planning

Principal Investigators

  • When: New lab, new direction, mentoring trainees, grant cycles
  • Focus: Skills 1, 3, 4, 6 (ideation, impact, parameters, adversity)
  • Timeline: Ongoing, integrate into lab culture

Startup Founders

  • When: Company inception, pivot decisions, investor pitches
  • Focus: Skills 1-4 (ideation through parameters) + Skill 8 (communication)
  • Timeline: 1-2 weeks for initial planning, revisit quarterly

Reference Materials

Detailed skill documentation is available in the references/ folder:

File Content Search Patterns
01-intuition-pumps.md Generate research ideas Intuition Pump #, Trap #, Phase [0-9]
02-risk-assessment.md Risk identification Risk.*1-5, go/no-go, assumption
03-optimization-function.md Success metrics Generality.*Learning, optimization, impact
04-parameter-strategy.md Parameter fixation fixed.*float, constraint, parameter
05-decision-tree.md Decision tree navigation altitude, Level [0-9], decision
06-adversity-planning.md Adversity response adversity, crisis, ensemble
07-problem-inversion.md Problem inversion strategies Strategy [0-9], inversion, goal
08-integration-synthesis.md Integration and synthesis narrative, communication, story
09-meta-framework.md Complete workflow Phase, workflow, orchestrat

Expected Outcomes

Immediate (After Completing Workflow)

  • Clear project vision
  • Honest risk assessment
  • Contingency plans
  • Communication materials ready
  • Confidence in problem choice

6-Month

  • Faster decisions (have framework)
  • Productive adversity handling
  • No existential crises (risks mitigated)

2-Year

  • Published results or strong progress
  • Avoided dead-end projects
  • Career aligned with goals
  • Time well-spent (ultimate measure)

Foundational Reference

Fischbach, M.A., & Walsh, C.T. (2024). "Problem choice and decision trees in science and engineering." Cell, 187, 1828-1833.

Based on course BIOE 395 taught at Stanford University.

提供基于scvi-tools的单细胞深度学习分析指导,涵盖数据整合、多模态(CITE-seq/ATAC)、空间转录组及RNA速度等场景。支持模型选择、参考文件查阅及CLI脚本使用,解决安装与调试问题。
提及scVI, scANVI, totalVI, PeakVI, MultiVI, DestVI, veloVI, sysVI, scArches 需要深度学习的单细胞批次校正或数据整合 处理多模态数据如CITE-seq或multiome 涉及标签转移、参考映射或潜在空间表示学习
bio-research/skills/scvi-tools/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill scvi-tools -g -y
SKILL.md
Frontmatter
{
    "name": "scvi-tools",
    "description": "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\/scANVI, (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\/scArches, (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."
}

scvi-tools Deep Learning Skill

This skill provides guidance for deep learning-based single-cell analysis using scvi-tools, the leading framework for probabilistic models in single-cell genomics.

How to Use This Skill

  1. Identify the appropriate workflow from the model/workflow tables below
  2. Read the corresponding reference file for detailed steps and code
  3. Use scripts in scripts/ to avoid rewriting common code
  4. For installation or GPU issues, consult references/environment_setup.md
  5. For debugging, consult references/troubleshooting.md

When to Use This Skill

  • When scvi-tools, scVI, scANVI, or related models are mentioned
  • When deep learning-based batch correction or integration is needed
  • When working with multi-modal data (CITE-seq, multiome)
  • When reference mapping or label transfer is required
  • When analyzing ATAC-seq or spatial transcriptomics data
  • When learning latent representations of single-cell data

Model Selection Guide

Data Type Model Primary Use Case
scRNA-seq scVI Unsupervised integration, DE, imputation
scRNA-seq + labels scANVI Label transfer, semi-supervised integration
CITE-seq (RNA+protein) totalVI Multi-modal integration, protein denoising
scATAC-seq PeakVI Chromatin accessibility analysis
Multiome (RNA+ATAC) MultiVI Joint modality analysis
Spatial + scRNA reference DestVI Cell type deconvolution
RNA velocity veloVI Transcriptional dynamics
Cross-technology sysVI System-level batch correction

Workflow Reference Files

Workflow Reference File Description
Environment Setup references/environment_setup.md Installation, GPU, version info
Data Preparation references/data_preparation.md Formatting data for any model
scRNA Integration references/scrna_integration.md scVI/scANVI batch correction
ATAC-seq Analysis references/atac_peakvi.md PeakVI for accessibility
CITE-seq Analysis references/citeseq_totalvi.md totalVI for protein+RNA
Multiome Analysis references/multiome_multivi.md MultiVI for RNA+ATAC
Spatial Deconvolution references/spatial_deconvolution.md DestVI spatial analysis
Label Transfer references/label_transfer.md scANVI reference mapping
scArches Mapping references/scarches_mapping.md Query-to-reference mapping
Batch Correction references/batch_correction_sysvi.md Advanced batch methods
RNA Velocity references/rna_velocity_velovi.md veloVI dynamics
Troubleshooting references/troubleshooting.md Common issues and solutions

CLI Scripts

Modular scripts for common workflows. Chain together or modify as needed.

Pipeline Scripts

Script Purpose Usage
prepare_data.py QC, filter, HVG selection python scripts/prepare_data.py raw.h5ad prepared.h5ad --batch-key batch
train_model.py Train any scvi-tools model python scripts/train_model.py prepared.h5ad results/ --model scvi
cluster_embed.py Neighbors, UMAP, Leiden python scripts/cluster_embed.py adata.h5ad results/
differential_expression.py DE analysis python scripts/differential_expression.py model/ adata.h5ad de.csv --groupby leiden
transfer_labels.py Label transfer with scANVI python scripts/transfer_labels.py ref_model/ query.h5ad results/
integrate_datasets.py Multi-dataset integration python scripts/integrate_datasets.py results/ data1.h5ad data2.h5ad
validate_adata.py Check data compatibility python scripts/validate_adata.py data.h5ad --batch-key batch

Example Workflow

# 1. Validate input data
python scripts/validate_adata.py raw.h5ad --batch-key batch --suggest

# 2. Prepare data (QC, HVG selection)
python scripts/prepare_data.py raw.h5ad prepared.h5ad --batch-key batch --n-hvgs 2000

# 3. Train model
python scripts/train_model.py prepared.h5ad results/ --model scvi --batch-key batch

# 4. Cluster and visualize
python scripts/cluster_embed.py results/adata_trained.h5ad results/ --resolution 0.8

# 5. Differential expression
python scripts/differential_expression.py results/model results/adata_clustered.h5ad results/de.csv --groupby leiden

Python Utilities

The scripts/model_utils.py provides importable functions for custom workflows:

Function Purpose
prepare_adata() Data preparation (QC, HVG, layer setup)
train_scvi() Train scVI or scANVI
evaluate_integration() Compute integration metrics
get_marker_genes() Extract DE markers
save_results() Save model, data, plots
auto_select_model() Suggest best model
quick_clustering() Neighbors + UMAP + Leiden

Critical Requirements

  1. Raw counts required: scvi-tools models require integer count data

    adata.layers["counts"] = adata.X.copy()  # Before normalization
    scvi.model.SCVI.setup_anndata(adata, layer="counts")
    
  2. HVG selection: Use 2000-4000 highly variable genes

    sc.pp.highly_variable_genes(adata, n_top_genes=2000, batch_key="batch", layer="counts", flavor="seurat_v3")
    adata = adata[:, adata.var['highly_variable']].copy()
    
  3. Batch information: Specify batch_key for integration

    scvi.model.SCVI.setup_anndata(adata, layer="counts", batch_key="batch")
    

Quick Decision Tree

Need to integrate scRNA-seq data?
├── Have cell type labels? → scANVI (references/label_transfer.md)
└── No labels? → scVI (references/scrna_integration.md)

Have multi-modal data?
├── CITE-seq (RNA + protein)? → totalVI (references/citeseq_totalvi.md)
├── Multiome (RNA + ATAC)? → MultiVI (references/multiome_multivi.md)
└── scATAC-seq only? → PeakVI (references/atac_peakvi.md)

Have spatial data?
└── Need cell type deconvolution? → DestVI (references/spatial_deconvolution.md)

Have pre-trained reference model?
└── Map query to reference? → scArches (references/scarches_mapping.md)

Need RNA velocity?
└── veloVI (references/rna_velocity_velovi.md)

Strong cross-technology batch effects?
└── sysVI (references/batch_correction_sysvi.md)

Key Resources

用于从分析师处提取公司特定数据知识并生成定制化数据分析技能的元技能。支持创建新技能和迭代优化现有技能,涵盖数据库发现、实体定义、指标计算及数据清洗规则。
Create a data context skill Set up data analysis for our warehouse Help me create a skill for our database Generate a data skill for [company] Add context about [domain] The skill needs more info about [topic] Update the data skill with [metrics/tables/terminology] Improve the [domain] reference
data/skills/data-context-extractor/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill data-context-extractor -g -y
SKILL.md
Frontmatter
{
    "name": "data-context-extractor",
    "description": "Generate or improve a company-specific data analysis skill by extracting tribal knowledge from analysts.\nBOOTSTRAP MODE - Triggers: \"Create a data context skill\", \"Set up data analysis for our warehouse\", \"Help me create a skill for our database\", \"Generate a data skill for [company]\" → Discovers schemas, asks key questions, generates initial skill with reference files\nITERATION MODE - Triggers: \"Add context about [domain]\", \"The skill needs more info about [topic]\", \"Update the data skill with [metrics\/tables\/terminology]\", \"Improve the [domain] reference\" → Loads existing skill, asks targeted questions, appends\/updates reference files\nUse when data analysts want Claude to understand their company's specific data warehouse, terminology, metrics definitions, and common query patterns."
}

Data Context Extractor

A meta-skill that extracts company-specific data knowledge from analysts and generates tailored data analysis skills.

How It Works

This skill has two modes:

  1. Bootstrap Mode: Create a new data analysis skill from scratch
  2. Iteration Mode: Improve an existing skill by adding domain-specific reference files

Bootstrap Mode

Use when: User wants to create a new data context skill for their warehouse.

Phase 1: Database Connection & Discovery

Step 1: Identify the database type

Ask: "What data warehouse are you using?"

Common options:

  • BigQuery
  • Snowflake
  • PostgreSQL/Redshift
  • Databricks

Use ~~data warehouse tools (query and schema) to connect. If unclear, check available MCP tools in the current session.

Step 2: Explore the schema

Use ~~data warehouse schema tools to:

  1. List available datasets/schemas
  2. Identify the most important tables (ask user: "Which 3-5 tables do analysts query most often?")
  3. Pull schema details for those key tables

Sample exploration queries by dialect:

-- BigQuery: List datasets
SELECT schema_name FROM INFORMATION_SCHEMA.SCHEMATA

-- BigQuery: List tables in a dataset
SELECT table_name FROM `project.dataset.INFORMATION_SCHEMA.TABLES`

-- Snowflake: List schemas
SHOW SCHEMAS IN DATABASE my_database

-- Snowflake: List tables
SHOW TABLES IN SCHEMA my_schema

Phase 2: Core Questions (Ask These)

After schema discovery, ask these questions conversationally (not all at once):

Entity Disambiguation (Critical)

"When people here say 'user' or 'customer', what exactly do they mean? Are there different types?"

Listen for:

  • Multiple entity types (user vs account vs organization)
  • Relationships between them (1:1, 1:many, many:many)
  • Which ID fields link them together

Primary Identifiers

"What's the main identifier for a [customer/user/account]? Are there multiple IDs for the same entity?"

Listen for:

  • Primary keys vs business keys
  • UUID vs integer IDs
  • Legacy ID systems

Key Metrics

"What are the 2-3 metrics people ask about most? How is each one calculated?"

Listen for:

  • Exact formulas (ARR = monthly_revenue × 12)
  • Which tables/columns feed each metric
  • Time period conventions (trailing 7 days, calendar month, etc.)

Data Hygiene

"What should ALWAYS be filtered out of queries? (test data, fraud, internal users, etc.)"

Listen for:

  • Standard WHERE clauses to always include
  • Flag columns that indicate exclusions (is_test, is_internal, is_fraud)
  • Specific values to exclude (status = 'deleted')

Common Gotchas

"What mistakes do new analysts typically make with this data?"

Listen for:

  • Confusing column names
  • Timezone issues
  • NULL handling quirks
  • Historical vs current state tables

Phase 3: Generate the Skill

Create a skill with this structure:

[company]-data-analyst/
├── SKILL.md
└── references/
    ├── entities.md          # Entity definitions and relationships
    ├── metrics.md           # KPI calculations
    ├── tables/              # One file per domain
    │   ├── [domain1].md
    │   └── [domain2].md
    └── dashboards.json      # Optional: existing dashboards catalog

SKILL.md Template: See references/skill-template.md

SQL Dialect Section: See references/sql-dialects.md and include the appropriate dialect notes.

Reference File Template: See references/domain-template.md

Phase 4: Package and Deliver

  1. Create all files in the skill directory
  2. Package as a zip file
  3. Present to user with summary of what was captured

Iteration Mode

Use when: User has an existing skill but needs to add more context.

Step 1: Load Existing Skill

Ask user to upload their existing skill (zip or folder), or locate it if already in the session.

Read the current SKILL.md and reference files to understand what's already documented.

Step 2: Identify the Gap

Ask: "What domain or topic needs more context? What queries are failing or producing wrong results?"

Common gaps:

  • A new data domain (marketing, finance, product, etc.)
  • Missing metric definitions
  • Undocumented table relationships
  • New terminology

Step 3: Targeted Discovery

For the identified domain:

  1. Explore relevant tables: Use ~~data warehouse schema tools to find tables in that domain

  2. Ask domain-specific questions:

    • "What tables are used for [domain] analysis?"
    • "What are the key metrics for [domain]?"
    • "Any special filters or gotchas for [domain] data?"
  3. Generate new reference file: Create references/[domain].md using the domain template

Step 4: Update and Repackage

  1. Add the new reference file
  2. Update SKILL.md's "Knowledge Base Navigation" section to include the new domain
  3. Repackage the skill
  4. Present the updated skill to user

Reference File Standards

Each reference file should include:

For Table Documentation

  • Location: Full table path
  • Description: What this table contains, when to use it
  • Primary Key: How to uniquely identify rows
  • Update Frequency: How often data refreshes
  • Key Columns: Table with column name, type, description, notes
  • Relationships: How this table joins to others
  • Sample Queries: 2-3 common query patterns

For Metrics Documentation

  • Metric Name: Human-readable name
  • Definition: Plain English explanation
  • Formula: Exact calculation with column references
  • Source Table(s): Where the data comes from
  • Caveats: Edge cases, exclusions, gotchas

For Entity Documentation

  • Entity Name: What it's called
  • Definition: What it represents in the business
  • Primary Table: Where to find this entity
  • ID Field(s): How to identify it
  • Relationships: How it relates to other entities
  • Common Filters: Standard exclusions (internal, test, etc.)

Quality Checklist

Before delivering a generated skill, verify:

  • SKILL.md has complete frontmatter (name, description)
  • Entity disambiguation section is clear
  • Key terminology is defined
  • Standard filters/exclusions are documented
  • At least 2-3 sample queries per domain
  • SQL uses correct dialect syntax
  • Reference files are linked from SKILL.md navigation section
该技能用于在创建营销和销售内容时应用品牌指南。通过加载现有规范、调整语气并验证输出,确保内容符合品牌声音。适用于邮件、提案、社交媒体等写作场景,但不包含生成或发现指南的功能。
write an email draft a proposal create a pitch deck brand voice enforce voice apply brand guidelines on-brand rewrite this in our tone
partner-built/brand-voice/skills/brand-voice-enforcement/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill brand-voice-enforcement -g -y
SKILL.md
Frontmatter
{
    "name": "brand-voice-enforcement",
    "description": "This skill applies brand guidelines to content creation. It should be used when the user asks to \"write an email\", \"draft a proposal\", \"create a pitch deck\", \"write a LinkedIn post\", \"draft a presentation\", \"write a Slack message\", \"draft sales content\", or any content creation request where brand voice should be applied. Also triggers on \"on-brand\", \"brand voice\", \"enforce voice\", \"apply brand guidelines\", \"brand-aligned content\", \"write in our voice\", \"use our brand tone\", \"make this sound like us\", \"rewrite this in our tone\", or \"this doesn't sound on-brand\". Not for generating guidelines from scratch (use guideline-generation) or discovering brand materials (use discover-brand)."
}

Brand Voice Enforcement

Apply existing brand guidelines to all sales and marketing content generation. Load the user's brand guidelines, apply voice constants and tone flexes to the content request, validate output, and explain brand choices.

Loading Brand Guidelines

Find the user's brand guidelines using this sequence. Stop as soon as you find them:

  1. Session context — Check if brand guidelines were generated earlier in this session (via /brand-voice:generate-guidelines). If so, they are already in the conversation. Use them directly. Session-generated guidelines are the freshest and reflect the user's most recent intent.

  2. Local guidelines file — Check for .claude/brand-voice-guidelines.md inside the user's working folder. Do NOT use a relative path from the agent's current working directory — in Cowork, the agent runs from a plugin cache directory, not the user's project. Resolve the path relative to the user's working folder. If no working folder is set, skip this step.

  3. Ask the user — If none of the above found guidelines, tell the user: "I couldn't find your brand guidelines. You can:

    • Run /brand-voice:discover-brand to find brand materials across your platforms
    • Run /brand-voice:generate-guidelines to create guidelines from documents or transcripts
    • Paste guidelines directly into this chat or point me to a file"

    Wait for the user to provide guidelines before proceeding.

Also read .claude/brand-voice.local.md for enforcement settings (even if guidelines came from another source):

  • strictness: strict | balanced | flexible
  • always-explain: whether to always explain brand choices

Enforcement Workflow

1. Analyze the Content Request

Before writing, identify:

  • Content type: email, presentation, proposal, social post, message, etc.
  • Target audience: role, seniority, industry, company stage
  • Key messages needed: which message pillars apply
  • Specific requirements: length, format, tone overrides

2. Apply Voice Constants

Voice is the brand's personality — it stays constant across all content:

  • Apply "We Are / We Are Not" attributes from guidelines
  • Use brand personality consistently
  • Incorporate approved terminology; reject prohibited terms
  • Follow messaging framework and value propositions

Refer to references/voice-constant-tone-flexes.md for the "voice constant, tone flexes" model.

3. Flex Tone for Context

Tone adapts by content type and audience. Use the tone-by-context matrix from guidelines to set:

  • Formality: How formal or casual should this be?
  • Energy: How much urgency or enthusiasm?
  • Technical depth: How detailed or accessible?

4. Generate Content

Create content that:

  • Matches brand voice attributes throughout
  • Follows tone guidelines for this specific content type
  • Incorporates key messages naturally (not forced)
  • Uses preferred terminology
  • Mirrors the quality and style of guideline examples

For complex or long-form content, delegate to the content-generation agent (defined in agents/content-generation.md). For high-stakes content, delegate to the quality-assurance agent (defined in agents/quality-assurance.md) for validation.

5. Validate and Explain

After generating content:

  • Briefly highlight which brand guidelines were applied
  • Explain key voice and tone decisions
  • Note any areas where guidelines were adapted for context
  • Offer to refine based on feedback

When always-explain is true in settings, include brand application notes with every response.

Handling Conflicts

When the user's request conflicts with brand guidelines:

  1. Explain the conflict clearly
  2. Provide a recommendation
  3. Offer options: follow guidelines strictly, adapt for context, or override

Default to adapting guidelines with an explanation of the tradeoff.

Open Questions Awareness

Open questions are unresolved brand positioning decisions flagged during guideline generation, stored in the guidelines under an "Open Questions" section. When generating content, check if the brand guidelines contain open questions:

  • If content touches an unresolved open question, note it
  • Apply the agent's recommendation from the open question unless the user specifies otherwise
  • Suggest resolving the question if it significantly impacts the content

Reference Files

  • references/voice-constant-tone-flexes.md — The "voice constant, tone flexes" mental model, "We Are / We Are Not" table structure, and tone-by-context matrix explanation
  • references/before-after-examples.md — Before/after content examples per content type showing enforcement in practice
自动跨企业平台(如Notion、Slack等)发现品牌材料,生成结构化报告。用于查找品牌指南、资产或进行内容审计,支持后续生成品牌语音规范文档。
discover brand materials find brand documents search for brand guidelines audit brand content what brand materials do we have find our style guide where are our brand docs do we have a style guide discover brand voice brand content audit find brand assets
partner-built/brand-voice/skills/discover-brand/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill discover-brand -g -y
SKILL.md
Frontmatter
{
    "name": "discover-brand",
    "description": "This skill orchestrates autonomous discovery of brand materials across enterprise platforms (Notion, Confluence, Google Drive, Box, SharePoint, Figma, Gong, Granola, Slack). It should be used when the user asks to \"discover brand materials\", \"find brand documents\", \"search for brand guidelines\", \"audit brand content\", \"what brand materials do we have\", \"find our style guide\", \"where are our brand docs\", \"do we have a style guide\", \"discover brand voice\", \"brand content audit\", or \"find brand assets\"."
}

Brand Discovery

Orchestrate autonomous discovery of brand materials across enterprise platforms. This skill coordinates the discover-brand agent to search connected platforms (Notion, Confluence, Google Drive, Box, Microsoft 365, Figma, Gong, Granola, Slack), triage sources, and produce a structured discovery report with open questions.

Discovery Workflow

0. Orient the User

Before starting, briefly explain what's about to happen so the user knows what to expect:

"Here's how brand discovery works:

  1. Search — I'll search your connected platforms (Notion, Google Drive, Slack, etc.) for brand-related materials: style guides, pitch decks, templates, transcripts, and more.
  2. Analyze — I'll categorize and rank what I find, pull the best sources, and produce a discovery report with what I found, any conflicts, and open questions.
  3. Generate guidelines — Once you've reviewed the report, I can generate a structured brand voice guideline document from the results.
  4. Save — Guidelines are saved to .claude/brand-voice-guidelines.md in your working folder once you approve them. Nothing is written until that step.

The search usually takes a few minutes depending on how many platforms are connected. Ready to get started?"

Wait for the user to confirm before proceeding. If they have questions about the process, answer them first.

1. Check Settings

Read .claude/brand-voice.local.md if it exists. Extract:

  • Company name
  • Which platforms are enabled (notion, confluence, google-drive, box, microsoft-365, figma, gong, granola, slack)
  • Search depth preference (standard or deep)
  • Max sources limit
  • Any known brand material locations listed under "Known Brand Materials"

If no settings file exists, proceed with all connected platforms and standard search depth.

2. Validate Platform Coverage

Before confirming scope, check which platforms are actually connected and classify them:

Document platforms (where brand guidelines, style guides, templates, and decks live):

  • Notion, Confluence, Google Drive, Box, Microsoft 365 (SharePoint/OneDrive)

Supplementary platforms (valuable for patterns, but not where brand docs are stored):

  • Slack, Gong, Granola, Figma

Apply these rules:

  1. If zero document platforms are connected: Stop. Tell the user: "You don't have any document storage platforms connected (Google Drive, SharePoint, Notion, Confluence, or Box). Brand guidelines and style guides almost always live on one of these. Please connect at least one before running discovery. Gong/Granola/Slack transcripts are valuable supplements but unlikely to contain formal brand documents."

  2. If no Google Drive AND no Microsoft 365 AND no Box: Warn (but proceed): "None of your primary file storage platforms (Google Drive, SharePoint, Box) are connected. Brand documents frequently live on these platforms. Discovery will proceed with [connected platforms], but results may have significant gaps. Consider connecting Google Drive or SharePoint."

  3. If only one platform total is connected: Warn (but proceed): "Only [platform] is connected. Discovery works best with 2+ platforms for cross-source validation. Results from a single platform will have lower confidence scores."

3. Confirm Scope with User

Before launching discovery, confirm:

  • Which platforms to search (default: all connected)
  • Whether to include conversation transcripts (Gong, Granola) or just documents
  • Any known locations to prioritize

Keep this brief — one question, not a questionnaire.

4. Delegate to Discover-Brand Agent

Launch the discover-brand agent via the Task tool. Provide:

  • Company name (from settings or user input)
  • Enabled platforms
  • Search depth
  • Any known URLs or locations to check first

The agent executes the 4-phase discovery algorithm autonomously:

  1. Broad Discovery — parallel searches across platforms
  2. Source Triage — categorize and rank sources
  3. Deep Fetch — retrieve and extract from top sources
  4. Discovery Report — structured output with open questions

5. Present Discovery Report

When the agent returns, present the report to the user with a summary:

  • Total sources found and analyzed
  • Key brand elements discovered
  • Any conflicts between sources
  • Open questions requiring team input

6. Offer Next Steps

After presenting the report, offer:

  1. Generate guidelines now — chain to /brand-voice:generate-guidelines using discovery report as input
  2. Resolve open questions first — work through high-priority questions before generating
  3. Save report — store the discovery report to Notion or as a local file
  4. Expand search — search additional platforms or deeper if coverage is low

Open Questions

Open questions arise when the discovery agent encounters ambiguity it cannot resolve:

  • Conflicting documents (e.g., 2023 style guide vs. 2024 brand update)
  • Missing critical sections (e.g., no social media guidelines found)
  • Inconsistent terminology across platforms

Every open question includes an agent recommendation. Present questions as "confirm or override" — not dead ends.

Integration with Other Skills

  • Guideline Generation: The discovery report is returned by the discover-brand agent via the Task tool. Pass it directly to the guideline-generation skill as structured input, replacing the need for users to manually gather sources.
  • Brand Voice Enforcement: Once guidelines are generated from discovery, enforcement uses them automatically.

Error Handling

  • If zero platforms are connected, inform the user which platforms the plugin supports and how to connect them.
  • If all searches return empty results, flag the discovery as "low coverage" and suggest the user provide documents manually or check platform connections.
  • If a platform is connected but returns permission errors, note the gap and continue with other platforms.

Reference Files

For detailed discovery patterns and algorithms, consult:

  • references/search-strategies.md — Platform-specific search queries, query patterns by platform, and tips for maximizing discovery coverage
  • references/source-ranking.md — Source category definitions, ranking algorithm weights, and triage decision criteria
根据品牌文档、销售录音或发现报告,生成结构化的LLM就绪品牌语音指南。提取核心身份、语气矩阵及置信度评分,将原始素材转化为可执行的风格规范。
用户要求生成品牌指南或风格指南 用户上传品牌文档、转录本或会议录音进行分析 用户提供发现报告并请求转换为可执行指南
partner-built/brand-voice/skills/guideline-generation/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill guideline-generation -g -y
SKILL.md
Frontmatter
{
    "name": "guideline-generation",
    "description": "This skill generates, creates, or builds brand voice guidelines from source materials. It should be used when the user asks to \"generate brand guidelines\", \"create a style guide\", \"extract brand voice\", \"create guidelines from calls\", \"consolidate brand materials\", \"analyze my sales calls for brand voice\", \"build a brand playbook from documents\", \"synthesize a voice and tone guide\", or uploads brand documents, transcripts, or meeting recordings for brand analysis. Also triggers when the user has a discovery report and wants to convert it into actionable guidelines."
}

Guideline Generation

Generate comprehensive, LLM-ready brand voice guidelines from any combination of sources — brand documents, sales call transcripts, discovery reports, or direct user input. Transform raw materials into structured, enforceable guidelines with confidence scoring and open questions.

Inputs

Accept any combination of:

  • Discovery report from the discover-brand skill (structured, pre-triaged)
  • Brand documents uploaded or from connected platforms (PDF, PPTX, DOCX, MD, TXT)
  • Conversation transcripts from Gong, Granola, manual uploads, or Notion meeting notes
  • Direct user input about their brand voice and values

When a discovery report is provided, use it as the primary input — sources are already triaged and ranked. Supplement with additional analysis as needed.

Generation Workflow

1. Identify and Classify Sources

Determine what the user has provided. If no sources are available:

  • Check if a discovery report exists from a previous /brand-voice:discover-brand run
  • Check .claude/brand-voice.local.md for known brand material locations
  • Suggest running discovery first: /brand-voice:discover-brand

2. Process Sources

For documents: Delegate to the document-analysis agent for heavy parsing. Extract voice attributes, messaging themes, terminology, tone guidance, and examples.

For transcripts: Delegate to the conversation-analysis agent for pattern recognition. Extract implicit voice attributes, successful language patterns, tone by context, and anti-patterns.

For discovery reports: Extract pre-triaged sources, conflicts, and gaps. Use the ranked sources directly.

3. Synthesize Into Guidelines

Merge all findings into a unified guideline document following the template in references/guideline-template.md. Key sections:

"We Are / We Are Not" Table — The core brand identity anchor:

We Are We Are Not
[Attribute — e.g., "Confident"] [Counter — e.g., "Arrogant"]
[Attribute — e.g., "Approachable"] [Counter — e.g., "Casual or sloppy"]

Derive attributes from the most consistent patterns across sources. Each row should have supporting evidence.

Voice Constants vs. Tone Flexes — Clarify what stays fixed and what adapts:

  • Voice = personality, values, "We Are / We Are Not" — constant across all content
  • Tone = formality, energy, technical depth — flexes by context

Tone-by-Context Matrix:

Context Formality Energy Technical Depth Example
Cold outreach Medium High Low "[example phrase]"
Enterprise proposal High Medium High "[example phrase]"
Social media Low High Low "[example phrase]"

4. Assign Confidence Scores

Score each section using the methodology in references/confidence-scoring.md:

  • High confidence: 3+ corroborating sources, explicit guidance found
  • Medium confidence: 1-2 sources, or inferred from patterns
  • Low confidence: Single source, inferred, or conflicting data

5. Surface Open Questions

Generate open questions for any ambiguity that cannot be resolved:

## Open Questions for Team Discussion

### High Priority (blocks guideline completion)
1. **[Question Title]**
   - What was found: [conflicting or incomplete info]
   - Agent recommendation: [suggested resolution with reasoning]
   - Need from you: [specific decision or confirmation needed]

Every open question MUST include an agent recommendation. Turn ambiguity into "confirm or override" — never a dead end.

6. Quality Check

Before presenting, verify via the quality-assurance agent (defined in agents/quality-assurance.md):

  • All major sections populated (including Brand Personality and Content Examples if sources support them)
  • At least 3 voice attributes with evidence
  • "We Are / We Are Not" table has 4+ rows
  • Tone matrix covers at least 3 contexts
  • Confidence scores assigned per section
  • Source attribution for all extracted elements
  • No PII exposed
  • Open questions include recommendations

7. Present and Offer Next Steps

Summarize key findings:

  • Total sections generated with confidence breakdown
  • Strongest voice attribute and most effective message
  • Number of open questions (if any)

8. Save for Future Sessions

The default save location is .claude/brand-voice-guidelines.md inside the user's working folder.

Important: The agent's working directory may not be the user's project root (especially in Cowork, where plugins run from a plugin cache directory). Always resolve the path relative to the user's working folder, not the current working directory. If no working folder is set, skip the file save and tell the user guidelines will only be available in this conversation.

  1. Resolve the save path. The file MUST be saved to .claude/brand-voice-guidelines.md inside the user's working folder. Confirm the working folder path before writing.
  2. Check if guidelines already exist at that path
  3. If they exist, archive the previous version: Rename the existing file to brand-voice-guidelines-YYYY-MM-DD.md in the same directory (using today's date)
  4. Save new guidelines to .claude/brand-voice-guidelines.md inside the working folder
  5. Confirm to the user with the full absolute path: "Guidelines saved to <full-path>. /brand-voice:enforce-voice will find them automatically in future sessions."

The guidelines are also present in this conversation, so /brand-voice:enforce-voice can use them immediately without loading from file.

After saving, offer:

  1. Walk through the guidelines section by section
  2. Start creating content with /brand-voice:enforce-voice
  3. Resolve open questions

Privacy and Security

Enforce these privacy constraints throughout the entire generation workflow, not only at output time:

  • Redact customer names and contact information from all examples
  • Anonymize company names in transcript excerpts if requested
  • Flag any sensitive information detected during processing

Reference Files

  • references/guideline-template.md — Complete output template with all sections, field definitions, and formatting guidance
  • references/confidence-scoring.md — Confidence scoring methodology, thresholds, and examples
为中小企业生成跨职能业务快照,并行整合QuickBooks、HubSpot等数据,计算关键指标并识别风险,输出简明待办摘要。适用于查询业务状况、获取周报或提醒遗漏事项。
询问业务状况 请求业务快照 要求周/周一简报 表示'有什么遗漏' 要求'帮我回顾业务'
small-business/skills/business-pulse/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill business-pulse -g -y
SKILL.md
Frontmatter
{
    "name": "business-pulse",
    "description": "Produces a one-page cross-functional business snapshot for SMB owners — cash position (QuickBooks), sales trend (PayPal\/Square), pipeline movement (HubSpot), this week's commitments (Calendar), urgent watch-list items (Gmail\/Slack), and the single most important thing needing attention today. Proactively tries every available connector and gracefully scopes to whatever is connected — one connector gives a partial pulse; the full stack gives the full picture. Trigger when the user asks how the business is doing, wants a snapshot, a weekly summary, a Monday brief, or says anything like \"what am I missing\" or \"catch me up on the business.\""
}

Business Pulse

One prompt, one page. Pull live data from every connected tool, synthesize it into a single scannable brief, and surface the single most important thing to act on today. Do the work — don't ask the user to help find the data.

Step 1 — Pull data in parallel

Dispatch all connector calls in a single parallel batch — see reference/data_sources.md for the exact tool-to-metric mapping. Do not pull serially; latency turns a 30-second skill into a painful wait.

Connectors to attempt simultaneously:

  • QuickBooks — cash balance, MTD revenue, outstanding receivables, overdue invoices
  • PayPal / Square — 7-day settlements, sales trend, failed/pending transactions
  • HubSpot — pipeline by stage, deals moved/closed, deals gone cold, new leads
  • Google Calendar — key meetings, deadlines, events this week and next 7 days
  • Gmail — threads flagged urgent, customer complaints, time-sensitive requests
  • Slack / Teams — urgent internal signals, threads needing owner attention
  • Intercom / Zendesk — open tickets, escalations (if connected)
  • Shopify / Square — fulfillment issues (if connected)

If a connector errors or returns no data, record it internally and move on. Never block the pulse on a single bad integration.

QuickBooks fallback: if QBO returns an unexpected state (account not connected, sync pending, empty response), mark the Cash section "n/a — QuickBooks unavailable" and proceed. Do not retry or ask the user to reconnect.

Gmail fallback: Gmail auth is intermittently flaky. If the call errors, skip the Watch List section silently and note "Gmail unavailable" in the appendix — do not surface an error mid-pulse.

Step 2 — Compute metrics

Read reference/thresholds.md for red/yellow/green cutoffs. Compute:

  • AR aging — open QuickBooks invoices grouped by days since due date (0–30, 31–60, 61+)
  • Pipeline coverage — HubSpot weighted pipeline ÷ monthly revenue target
  • Revenue trend — this month's QBO revenue vs. prior month (or 7-day PayPal/Square vs. prior 7 days)

Assign a 🟢/🟡/🔴 status to each section. If a source returned nothing, mark the metric "n/a" and note it in the appendix.

Step 3 — Flag risks proactively

Scan for actionable items. Every risk entry must name a specific record and a next step — "some overdue invoices" is useless; "$3,400 from Acme Corp, 47 days overdue, no response since Mar 12" is actionable.

  • QuickBooks invoices past due > 30 days — name customer, amount, days overdue
  • HubSpot deals with no activity in 7+ days, or close date in past but still open
  • Gmail threads marked urgent or containing "escalation," "complaint," "cancel," "refund"
  • Failed or pending PayPal/Square transactions > $500

Step 4 — Compose the output

Use the exact template in reference/output_template.md. Include only sections where real data exists — omit headers for connectors that weren't available. Adapt depth to context: a casual "how are we doing" gets a fuller report; "quick snapshot before a call" gets a tighter one.

Cross-connector synthesis is where this skill earns its keep. If a Slack message connects to a stalled HubSpot deal, surface that link in the #1 Priority section. Synthesis is what makes the pulse more useful than checking each tool separately.

Writing rules:

  • Numbers lead, words follow. Never write "revenue is healthy" — write "$43k this month, ▲ 8% MoM" and let the owner judge.
  • Every number carries a delta vs. the prior period where available. Absolute snapshots (cash balance) still show WoW delta.
  • Names and dollars, not adjectives. "$4,200 from Acme, 23 days overdue" beats "some concerning receivables."
  • No filler. If a section has nothing worth reporting, write "No material changes" and move on.

Step 5 — Export and share (once)

After presenting the pulse, offer once:

  • "Want me to save this as a file?" (use Files connector if available)
  • "Should I post this to your Slack?" (only if Slack is connected and the user confirms — Slack write requires explicit approval)

If they say yes, do it. If they say no or don't respond, move on — don't ask again.

Scope variants

The owner may ask for a narrower cut:

  • "Just cash" / "financial check" → only Cash & Finance + AR-related risks
  • "Pipeline only" / "deals check" → only Pipeline section + stalled-deal risks
  • "Watch list" / "anything urgent" → only Watch List + all risks, no metric sections
  • "Quick snapshot before a call" → TL;DR + #1 Priority only, no full sections

What not to do

  • Do not ask permission before pulling data. If the skill was invoked, run it. Asking "should I check QuickBooks?" defeats the whole point.
  • Do not invent or estimate numbers. If a source returned nothing, say "n/a" explicitly. Never fill a gap with guesswork.
  • Do not skip the delta. A number without a comparison is a missed insight. If there's no prior-period baseline, say "(no prior baseline)" rather than omitting the field.
  • Do not surface connector errors mid-pulse. Log them to the appendix. The pulse leads with what was delivered.

Reference files

  • reference/data_sources.md — exact connector tool → metric mapping with fallbacks
  • reference/thresholds.md — 🟢/🟡/🔴 cutoffs, tunable per owner
  • reference/output_template.md — exact markdown structure; do not deviate
  • reference/gotchas.md — known failure modes (QB states, Gmail auth, Slack write)
该技能用于执行端到端的内容营销活动。基于审批后的简报,依次构建发布日历、生成Canva社媒设计、撰写文案并安排HubSpot发布。每步需用户确认,支持多平台社交图文及纯文本邮件草稿。
make the content generate the posts create the assets turn this into a campaign hand off an approved brief for execution
small-business/skills/canva-creator/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill canva-creator -g -y
SKILL.md
Frontmatter
{
    "name": "canva-creator",
    "description": "Takes an approved content brief and executes a campaign end-to-end: builds the posting calendar, generates Canva designs for social posts, drafts caption and email copy, and stages social sends in HubSpot. Canva is used for social posts only (Instagram, Facebook, X, LinkedIn) — email content is drafted as plain text and surfaced inline for the owner to send from their own tool. Every step requires explicit owner approval. Use when the user says \"make the content,\" \"generate the posts,\" \"create the assets,\" \"turn this into a campaign,\" or hands off an approved brief for execution."
}

Canva Creator

Scope

This skill handles a campaign in five sequential stages, each gated by owner approval:

brief → calendar → asset inventory → Canva designs → copy → HubSpot staging
Path Channels What this skill produces
Canva (social) Instagram, Facebook, X/Twitter, LinkedIn Canva design + caption + scheduled HubSpot post
Text-only Email (newsletter, marketing, drip) Subject + preheader + body, surfaced inline for the owner to send

Canva is not used for email rows under any circumstance — no templates, no autofill, no design copies, no asset uploads, no exports. The owner explicitly descoped Canva from the email path because email-template autofill produces placeholder graphics when image slots exceed available photos, and variation thumbnails fail to render in chat previews. If the owner asks for a Canva email design, see reference/gotchas.md for the redirect language.


Pre-flight

Before Stage 1, confirm:

  1. Brief. The user has referenced or pasted an approved brief. If not: "I'll need the content brief before I can build the campaign. Do you have one from the content-strategy skill, or would you like to write one now?"

  2. Canva tier. Pro/Teams require manual template selection from the user's library (no autofill API). Enterprise can autofill from brand templates.

  3. HubSpot tier. Social staging requires Marketing Hub Professional. Starter or Free → skip Stage 5 and export a CSV instead (see reference/hubspot-staging.md).

  4. Brand assets. Confirm the path to product photos on disk or that the brand kit is live in Canva.

  5. Generation budget. Estimate the campaign's Canva volume and surface it before Stage 1 begins. Default is 3 candidates per Canva-bound row; each design costs ~5 API calls (autofill + export + polling).

    Generation budget for this campaign:
      Canva (social) rows: 8
      Candidates per row:  3   (default — say "single candidate" to use 1)
      Total designs:       24
      API calls (approx):  ~120  (autofill + export + polling)
    
    Canva limit: 100 requests/minute. This will take ~2-3 minutes of
    generation, well within your tier limits. Proceed?
    

    If the projected total designs exceeds 30, recommend single-candidate mode upfront — large campaigns run out of headroom fast. The owner can override the default to 1, 2, or 3 candidates per row before Stage 1 starts. Lock the chosen value for the entire session.


Workflow

Stage 1 — Posting calendar

Pull from the brief: content themes, channels, cadence, hard dates (launches, sales, holidays).

Build a calendar table with a Path column that routes every row to either Canva or text-only drafting:

Date Channel Path Theme Asset type Caption/Subject angle
Jun 2 Instagram feed Canva (social) Linen launch Square post "finally, a dress…"
Jun 5 Email Text-only Linen launch Email body "Linen that actually breathes"

Tag every email-channel row as Text-only before presenting. Cap at 30 days unless the brief specifies otherwise. Flag scheduling conflicts (two posts same day for the same product) up front.

Checkpoint 1. Present the calendar. Ask: "Does this match the plan? Any dates to shift, channels to add, or themes to swap?" Iterate until approved, then restate the split out loud — "N rows go through Canva, M rows go through text-only drafting" — before moving on. Catching a miscategorization here is free; catching it after generating designs isn't.


Stage 2 — Asset inventory (Canva rows only)

Email rows skip this stage entirely. For each Canva (social) row, build a manifest of what the template needs and what's already available.

  1. Enumerate every image slot by name. Square Instagram posts usually have 1-2 image slots; carousels and product grids can have 5+. List them individually (Header_Image, Product1_Image, Product2_Image, …) — never roll them up as "product images."

    • Enterprise: read field names from dataset[].label on the brand template (GET /v1/brand-templates/{id}).
    • Pro/Teams: count every distinct image rectangle in the template.
  2. Inventory available assets. Text content from the brief (product names, offer copy, taglines, pricing), product photos already uploaded to Canva (GET /v1/assets) or on the owner's disk, brand kit colors and fonts (Enterprise).

  3. Build the slot-by-slot gap table. One row per slot per design — not per design.

    Date Slot name Slot kind Available asset Status
    Jun 2 Hero_Image image bloom_summer.jpg → asset_id pending upload
    Jun 2 Headline text "Summer linen, finally" ready
    Jun 9 Product1_Image image MISSING
  4. Resolve slot/asset mismatches with the owner. If the template has more image slots than the brief provides photos, pause and ask:

    The "Summer Carousel" template has 5 image slots. The brief gave me 1
    photo (bloom_summer.jpg). How should I fill the other 4?
    
      1. Reuse the same photo across all 5 slots
      2. You send me 4 more photos (file paths)
      3. Pick a simpler template with fewer slots
    

    No generation calls until the owner picks. Generating with empty slots produces designs full of Canva's default landscape placeholders.

  5. Upload missing photos and capture verified asset IDs. Upload via POST /v1/asset-uploads, then poll GET /v1/asset-uploads/{job_id} until status == "success". Record asset.id from the response — this is the only value that works in an autofill image field. Passing an empty string, a URL, a file path, or a stale ID silently renders Canva's stock landscape graphic instead of the photo.

  6. Confirm the manifest. Show the owner the completed slot-by-slot table with every slot resolved and every image asset.id confirmed. This is the last stop before Canva API calls.


Stage 3 — Canva design generation

Before any Canva API call, re-read the calendar and drop any row whose Path is not Canva (social). Email rows do not pass through this stage.

Generate designs one calendar row at a time, with 3 candidates per row (or the value chosen at pre-flight). Each row follows the same loop: generate candidates → verify → export → visually check → retry failures → present → wait for owner pick → next row. Pause 30 seconds between rows. This caps the burst at 3 generations + 3 exports per ~30s — well under Canva's 100 req/min rate limit. Do not parallelize multiple rows; one row at a time is the protection that keeps the owner from hitting quota mid-campaign.

Polling cadence. Poll job status every 3-5 seconds, not faster. Tighter intervals burn quota without speeding up completion.

Preview URLs — only one type is safe to embed. Autofill responses return design.canva.ai thumbnails that expire within minutes; embedding them as markdown images produces broken "Show Image" placeholders. Permanent export URLs (export-download.canva.com or the export-design MCP tool) do not expire. Native Cowork carousels render the autofill result directly using the connector's authenticated session — let them render on their own, don't re-embed.

Row loop

  1. Resolve template. (Once per session — same template across rows unless the calendar mixes asset types.)

    • Enterprise: GET /v1/brand-templates filtered by asset type.
    • Pro/Teams: GET /v1/designs?ownership=any&query={template name}, surface top 3 to the owner, confirm one before generating.
  2. Generate the row's candidates in parallel. Fire the row's 3 candidates simultaneously (or N from pre-flight).

    • Enterprise: POST /v1/autofills per candidate with the template ID and field values. Poll all jobs concurrently.
    • Pro/Teams: POST /v1/designs to create copies. Describe the text and image edits the owner applies in Canva; collect design IDs back.
  3. Verify job status. For each candidate, confirm GET /autofills/{job_id} returned status == "success" and result.design.id is present. Handle errors per-design:

    • JOB_FAILED → read job.error.message, fix the field values or asset IDs, retry once.

    • RATE_LIMIT_EXCEEDED (first hit this session) → wait 60s, retry that one candidate once. This handles transient spikes.

    • RATE_LIMIT_EXCEEDED (second hit this session) or any quota_exceeded / daily-cap error → stop generation immediately. Do not retry. Surface progress and ask:

      Canva is rate-limiting the campaign. Status so far:
        ✓ Generated:  Posts 1-4 (12 designs)
        ⏸ Remaining:  Posts 5-8 (12 designs not yet generated)
      
      How should I proceed?
        1. Switch to 1 candidate per remaining row (4 designs total) — finishes now
        2. Pause campaign — resume in 60 minutes when quota refills
        3. Stop generation — work with what we have, move to captions
      

      Wait for the owner's choice. Do not loop on retry.

  4. Export each successful candidate to a permanent PNG. Fire the row's exports in parallel.

    • REST: POST /v1/exports with format.type: "png", poll GET /v1/exports/{job_id} until success, capture urls[0].
    • Canva MCP: export-design with the design ID.

    These permanent URLs are what get embedded in previews and attached to the HubSpot post later. The autofill response thumbnail is never used downstream.

  5. Visually verify each export. Look at the image and reject any of these — they all indicate an unfilled slot or wrong asset:

    • Generic landscape with clouds and green hills (Canva's default placeholder)
    • Solid gray rectangles where a photo should be
    • Lorem-ipsum or template-default text
    • Subject that doesn't match the brief (wrong product, wrong brand)

    If a candidate fails verification: re-check the manifest for the affected slot, fix the asset.id, regenerate that single candidate, re-export, re-verify.

  6. Retry per-candidate on partial failure. If 1 of N candidates in the row failed at Step 3 or 5, regenerate just that one — don't redo the whole row and don't present a partial broken carousel. If the second attempt also fails:

    The third candidate for the Jun 9 post keeps failing — Canva returned
    [error / rendered placeholder]. How should I proceed?
    
      1. Skip it — present the other 2 and move on
      2. Swap to a simpler template for just this candidate
      3. Try once more with a different photo
    
  7. Present the row's candidates. Let the native Cowork carousel render the autofill tool result. Below it, add a text prompt:

    Jun 9 candidates are ready — scroll through the carousel above.
    Which one should I use for the Jun 9 post?
    

    If the carousel doesn't render or one position is broken, embed the permanent export PNG URLs from Step 4 instead. Final fallback: link to the design's Canva edit URL (https://www.canva.com/d/{design_id}). Never re-embed design.canva.ai URLs.

  8. Pause 30 seconds, then move to the next row.

Checkpoint 2. Satisfied once the owner has picked one design per calendar row. If they want a regenerate, regenerate only that one candidate.


Stage 4 — Copy drafting

For each calendar row, draft the copy. Social rows get a caption; email rows get a full email.

Social captions — Instagram, Facebook, X, LinkedIn:

  • Length: channel-appropriate (Instagram ≤ 2,200 chars; Facebook ≤ 500 recommended; X ≤ 280).
  • Structure: hook → one product benefit → CTA → 3-5 hashtags (not 30).
  • Voice: match the brief's tone markers. If the brief says "casual and friendly," don't write corporate copy.
  • No filler. No "Exciting news!" or "We're thrilled to announce." Open with the value.

Email content — Claude writes the entire email; no Canva:

  • Subject: ≤ 50 chars, specific, no clickbait. "Spring projects are booking up" beats "Don't miss out!"
  • Preheader: ≤ 90 chars, complements the subject without repeating it.
  • Body: plain prose, 100-250 words. Opening line that earns the read → 1-2 paragraphs of substance → single clear CTA → sign-off.
  • Voice: same tone markers as social. Owners want their emails to sound like them, not like a templated newsletter.
  • No image references. Don't write "see image above." If the owner wants visuals, they add them in their email tool.
  • One CTA per email. Pick the most important action and lead with it.

Present captions inline below each social row. Present full emails inline below each email row:

Subject: <subject line>
Preheader: <preheader text>

<body text>

For worked examples, see reference/examples/boutique-brief-campaign.md.

Checkpoint 3. "Any captions or emails to rewrite? Flag the date and what to change." Iterate until approved.


Stage 5 — HubSpot staging + email handoff

Stage social posts in HubSpot. Email content is not staged — it's surfaced inline for the owner to copy into their email tool. For API field reference, see reference/hubspot-staging.md.

  1. Create the campaign. POST /marketing/v3/campaigns with the campaign name and start/end dates from the calendar.

  2. Stage each social post. POST to the HubSpot Social API per Canva (social) row:

    • channel: map calendar channel to HubSpot account ID
    • scheduledAt: ISO 8601 datetime — confirm it's in the future before calling
    • content.body: approved caption
    • attachments: permanent Canva export PNG URL from Stage 3
    • status: SCHEDULED (never PUBLISHED)
  3. Confirm the queue. Call GET /marketing/v3/social/posts?status=SCHEDULED, surface the list, provide a direct link to the HubSpot campaign view.

  4. Surface email content for handoff. For each email row, present the approved subject + preheader + body inline, grouped by send date. The owner copies these into their email tool (HubSpot Marketing Email, Mailchimp, Gmail).

Final checkpoint.

Your social posts are scheduled in HubSpot: [link]
They'll go out as scheduled — you can cancel or edit any post in HubSpot.

Email content is drafted below — copy each into your email tool when
you're ready to send:

  Jun 5 — "Spring projects are booking up"
  Jul 15 — "Summer maintenance windows are filling"

Anything to change before we're done?

Approval gates

  • No Canva calls for email rows. Re-check the Path column before every API call.
  • No publishing. Every HubSpot post is staged as SCHEDULED; the owner controls go-live.
  • Always surface the generation budget at pre-flight. Owner sees the total design count and approves before Stage 1 begins.
  • One row at a time in Stage 3. Candidates within a row fire in parallel, but rows are sequential with a 30s gap — this is the quota protection.
  • On the second quota error, pause and ask. Never loop on retry.
  • Always export to a permanent PNG before presenting. Job success doesn't mean the design rendered correctly.
  • Never embed design.canva.ai URLs in messages. They expire.
  • Never regenerate the whole row when one candidate fails. Per-candidate retry only.
  • Never auto-select a template for Pro/Teams users. Always confirm.
  • Never skip slot-by-slot inventory. Multi-slot templates render placeholder landscapes when any slot is empty.
  • Never skip Checkpoint 1. Generating before the calendar is approved is the largest source of wasted work in this skill.

Reference

从招聘简报生成完整招聘包,含职位帖、面试指南及报价信模板。支持通过浏览器将报价信路由至DocuSign。需用户审批方可发送文档,不处理候选人筛选。
help me hire we're hiring for write a job post job description JD open role create a job ad interview questions scoring rubric draft an offer letter send an offer make a hiring packet
small-business/skills/job-post-builder/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill job-post-builder -g -y
SKILL.md
Frontmatter
{
    "name": "job-post-builder",
    "description": "Builds end-to-end hiring packets — job post, structured interview guide with scoring rubric, and offer letter template — from a hiring brief. Triggers on: \"help me hire\", \"we're hiring for\", \"write a job post\", \"job description\", \"JD\", \"open role\", \"create a job ad\", \"interview questions\", \"scoring rubric\", \"draft an offer letter\", \"send an offer\", \"make a hiring packet\", or any request to recruit for a position. When in doubt, trigger — covers the full hiring workflow from job post through DocuSign envelope creation via browser. Does NOT screen or rank applicants."
}

Job Post Builder

Produces a complete hiring packet — job post, interview guide, and offer letter — from a brief conversation about the role. Optionally routes the offer letter to DocuSign via Claude in Chrome.


Quick start

Invoke when a user says they need to hire someone or produce any hiring document. The skill walks a 6-phase workflow: gather context → research the market → write the job post → draft the interview guide → assemble the offer letter → (optionally) route to DocuSign.

Example trigger:

"We're hiring a senior product manager. Can you put together the job post and interview questions?"


Workflow

  1. Gather role context — Ask for role title, responsibilities, qualifications, location, comp, interview process, and offer delivery preference (Word doc vs. DocuSign). Source: conversation / AskUserQuestion.
  2. Research comparable posts — Search Google Drive / Desktop for existing JDs and templates; run web search for 3–5 live postings for this role. Sources: file MCP, web search.
  3. Write the job post — Draft a market-informed job description using references/job-post-structure.md. Output: [Role]-Job-Post.docx via docx skill.
  4. Draft interview guide + scoring rubric — Build a stage-by-stage guide using references/interview-guide-structure.md. Output: [Role]-Interview-Guide.docx via docx skill.
  5. Assemble offer letter — Build offer letter with bracketed placeholders using references/offer-letter-template.md. Output: [Role]-Offer-Letter.docx via docx skill.
  6. Route to DocuSign (if requested) — Use Claude in Chrome to navigate DocuSign, upload the offer letter, configure the envelope, and save a draft. Requires explicit user approval before the envelope is sent.

Approval gates

This skill performs externally-visible actions in Phase 6. The following rules apply:

  • Never send a DocuSign envelope without approval. Save the envelope as a draft and return the URL. The user must review and confirm before Claude clicks Send.
  • Never send the Gmail fallback email without approval. If the DocuSign browser flow fails, draft the fallback email and show it to the user before sending.
  • Never publish the job post. Produce the .docx file only. Posting to any job board is the user's responsibility.

Phase 6 will not advance past "Save as draft" without the user explicitly confirming they have reviewed the envelope and want it sent.


Phase 1 — Understand the Role

Before researching or writing anything, gather enough context to do it well. Ask the user (via conversation or AskUserQuestion) for:

  • Role title — exact title they want to post

  • Team / function — who this person reports to and works with

  • Key responsibilities — 3–5 things this person will own day-to-day

  • Must-have qualifications — hard requirements (years of experience, specific skills, credentials)

  • Nice-to-have qualifications — preferred but not required

  • Location / remote policy — on-site, hybrid, or fully remote; location if relevant

  • Compensation range — salary band if they have one (flag that this needs HR/legal sign-off)

  • Existing JD or template? — ask if there's a prior version in Google Drive or on their Desktop to use as a starting point

  • Offer letter delivery preference — ask how they'd like the offer letter delivered:

    • Send directly via DocuSign — skill opens DocuSign in Chrome, uploads the letter, sets up the envelope, and saves a draft for review before sending
    • Just the Word doc — skill saves the offer letter as a .docx and stops there; the user handles routing themselves
  • Interview process — ask how their hiring process is structured:

    • How many rounds/stages are there?
    • Who conducts each stage? (e.g. recruiter, hiring manager, peer, skip-level, panel)
    • What is each stage meant to assess? (e.g. culture fit, technical depth, cross-functional collaboration)
    • Is there a take-home exercise or work sample at any stage?

    This is critical — the interview guide will be organized by stage, and each stage gets its own question set. If the user doesn't know yet, suggest a sensible default based on the role level and company size, and confirm before proceeding.

    Example default for a mid-senior IC role:

    Stage Interviewer Focus
    Phone screen Recruiter Communication, baseline fit, logistics
    Hiring manager interview HM Scope, ownership, role-specific depth
    Peer interview Team member Collaboration, working style
    Skills/case exercise Senior IC Relevant technical or domain depth
    Final / culture interview Skip-level or exec Values, long-term trajectory

Capture the delivery preference in Phase 1 so the right Phase 5/6 path is clear before any writing starts. If the user already indicated a preference (e.g. "send it to DocuSign"), extract it from their message rather than asking again.

If the user has already provided most of this in their message, extract it and confirm before moving on rather than asking redundant questions. One focused clarifying question is better than a long form.


Phase 2 — Research Comparable Posts

Good job posts are grounded in what the market actually says for this role. Do both of the following in parallel:

A. Check existing files first Search Google Drive and Desktop for prior JDs, offer letter templates, or interview guides the user may already have. Use file search tools with terms like the role title, "job description", "JD", "offer letter", "interview". If found, read them and use them as the baseline — preserving any existing language, structure, or requirements the user has established.

B. Web search for comparable posts Search for current job postings for this role at comparable companies. Good sources include LinkedIn, Greenhouse, Lever, Workday, and company career pages. Look for 3–5 real postings and note:

  • Common responsibilities listed for this role
  • Qualifications that appear consistently (these are table stakes)
  • How companies describe the role's impact/scope
  • Any language patterns that make postings feel compelling vs. generic

Use this research to pressure-test the user's requirements (are they missing something standard? asking for something unusual?) and to make the job post feel current and market-aware.


Phase 3 — Write the Job Post

Read references/job-post-structure.md for the full recommended structure and writing guidance.

If an existing job post or JD was found in Phase 2: Use it as the structural template — mirror its section names, tone, ordering, and any boilerplate the user has established (e.g. company description, benefits blurb, how-to-apply language). The user's format is the source of truth.

Compare it against references/job-post-structure.md and surface any missing components in a single question before writing:

"Your existing JD has a responsibilities section and requirements list, but I didn't see an opening hook or a description of what success looks like in year one. Want me to add those, or keep it to your current format?"

Only add the missing components if the user confirms.

If no existing job post was found: Build from scratch using references/job-post-structure.md as the full template.

Either way:

  • Lead with impact, not just tasks
  • Be honest about what's hard — candidates who self-select in are better fits
  • Use inclusive language; avoid jargon that implicitly filters for in-group candidates
  • Keep the required qualifications list tight — every line is a reason someone doesn't apply
  • If compensation isn't provided, omit the range rather than invent one

Save as [Role]-Job-Post.docx using the docx skill. Read docx/SKILL.md before generating the file.


Phase 4 — Draft Interview Questions + Scoring Rubric

Read references/interview-guide-structure.md for the full recommended format.

If an existing interview guide was found in Phase 2: Use the user's existing guide as the structural template — mirror its section names, ordering, and formatting conventions. The user's format is the source of truth; the reference file is a checklist, not an override.

After mapping the existing guide's sections against the reference, surface any components present in the reference but missing from the user's guide. Present these as a short, friendly question before writing — for example:

"Your existing guide has a question bank and scoring rubric, but I noticed it doesn't include an interview stage map or a debrief guide. Want me to add those, or keep it to your current structure?"

Only add the missing components if the user confirms. Don't silently expand their format without asking.

If no existing guide was found: Build the guide from scratch using references/interview-guide-structure.md as the full template. The reference defines the recommended sections, question format, rubric anchors, and debrief guidance — follow it completely.

Either way, organize the guide by interview stage using the process captured in Phase 1.

Structure the document so each stage is its own section:

Each stage gets its own section with the stage name and interviewer as the heading, followed by: the focus area this stage assesses, 4-6 behavioral questions specific to that focus, 2-3 follow-up probes per question, and a 1/3/5 scoring rubric with anchors for each competency the stage owns.

Key principles for multi-stage guides:

  • Each competency should be owned by one stage — avoid two interviewers asking the same thing. If there's overlap, assign different angles.
  • For panel interviews, split questions across panelists explicitly so each person knows what they're covering.
  • If there's a take-home exercise, include a structured debrief section for reviewing it — what to look for, how to score it, follow-up questions.
  • The debrief guide goes at the end, after all stage sections.
  • 1/3/5 scoring anchors should be written for this specific role, not generic.

Save as [Role]-Interview-Guide.docx using the docx skill.


Phase 5 — Assemble the Offer Letter Template

Read references/offer-letter-template.md for the full base template and field definitions.

If an existing offer letter or template was found in Phase 2: Use it as the structural template — preserve the user's formatting, clause ordering, signature blocks, and any legal language they've already established. Their version is the source of truth.

Compare it against references/offer-letter-template.md and surface any missing components in a single question before writing:

"Your existing offer letter has compensation and position details, but I noticed it doesn't include an at-will employment clause or a legal review disclaimer. Want me to add those, or keep it to your current format?"

Only add the missing components if the user confirms.

If no existing offer letter was found: Build from scratch using references/offer-letter-template.md as the full template.

Either way:

  • Use clearly marked [BRACKETED] placeholder fields for all candidate-specific values
  • Include: at-will clause (if applicable), contingency conditions, legal review disclaimer
  • Don't invent compensation figures — leave them as placeholders if not provided

Save as [Role]-Offer-Letter.docx using the docx skill.

Then branch based on the delivery preference captured in Phase 1:

  • If the user chose DocuSign → proceed to Phase 6
  • If the user chose Word doc only → skip Phase 6, deliver the .docx and close out

Phase 6 — Route the Offer Letter Directly to DocuSign

Use Claude in Chrome to upload the offer letter into DocuSign and set up the envelope, so the user doesn't have to touch DocuSign manually.

Step-by-step browser flow:

  1. Navigate to https://app.docusign.com — the user should already be logged in. If a login screen appears, pause and ask the user to log in, then continue.

  2. Click "Start" → "Send an Envelope" (or the equivalent "New" / "Use a Template" button depending on the UI version).

  3. Upload the offer letter: Click "Upload Documents" and upload the [Role]-Offer-Letter.docx file that was just created.

  4. Add the signer: In the Recipients section, add the candidate as a signer. Ask the user for the candidate's name and email if not already provided. Set their role to "Signer".

  5. Add the sender as a CC recipient if the user wants a copy (ask if unsure).

  6. Set the subject line: Offer of Employment — [Role Title] at [Company Name]

  7. Add a message:

    "Hi [Candidate First Name], we're thrilled to extend this offer and look forward to having you join the team. Please review and sign at your earliest convenience. Don't hesitate to reach out if you have any questions."

  8. Place signature fields: On the document, place a Signature field and a Date Signed field on the candidate acceptance line at the bottom of the letter.

  9. Save as draft — do NOT send. Return the envelope URL to the user so they can review before sending.

Tell the user:

"The DocuSign envelope has been set up with the offer letter and candidate details. Here's the draft link: [ENVELOPE URL]. Review the signature placement, then confirm here when you're ready to send."

Fallback: If DocuSign is unavailable or the browser flow fails at any step, fall back to the Gmail draft approach: draft an email via the Gmail MCP with the offer letter attached and a note to upload it to DocuSign manually. Show the draft to the user before sending.


Delivering the Packet

Once all three files are created, present them together:

Present a summary listing the three deliverables by role title: the job post docx (ready to post), the interview guide docx (share with interviewers), and the offer letter docx (routed to DocuSign draft or ready for manual upload).

Remind the user:

  • The offer letter template needs legal review before use in any jurisdiction
  • Compensation ranges should be confirmed with HR before publishing the job post
  • This skill does not screen or rank applicants

Reference Files

Load these when reaching the relevant phase — don't load all upfront:

File Load when
references/job-post-structure.md Phase 3 — before writing the job post
references/interview-guide-structure.md Phase 4 — before writing the interview guide
references/offer-letter-template.md Phase 5 — before writing the offer letter
references/gotchas.md Any phase — non-obvious edge cases
references/examples/worked-example.md For reference on expected output shape

Tests

See tests/triggers.md for must-trigger, must-NOT-trigger, and ambiguous routing cases.

See tests/scenarios.md for end-to-end scenario walkthroughs covering the happy path, missing connector, and approval gate flows.

分析产品或服务的单位经济状况,结合PayPal收入与QuickBooks成本数据,计算毛利率并模拟不同调价情景的影响。旨在提供数据支持而非定价建议,帮助用户评估成本对利润的影响及价格调整策略。
询问是否应提高价格 咨询定价策略或收费标准 担忧成本侵蚀利润 询问当前利润率是否正常 探讨价格变动对业务的影响
small-business/skills/margin-analyzer/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill margin-analyzer -g -y
SKILL.md
Frontmatter
{
    "name": "margin-analyzer",
    "description": "Analyzes unit economics by product or service using PayPal merchant insights and QuickBooks cost data, benchmarks against inflation and cost changes, and shows pricing-scenario data (e.g. \"a 5% increase historically correlates with ~3% volume drop\"). Surfaces analysis only — does not recommend a price. Use when the user asks about raising prices, pricing, margin analysis, what to charge, whether costs are eating into profit, or how a price change might affect their business. Trigger even if the user doesn't say \"margin\" explicitly — phrases like \"am I making enough?\", \"should I charge more?\", or \"my costs are going up\" all call for this skill."
}

Margin Analyzer

Status: MVP draft · Owner: JJ · Version: 1.1.0 Category: Finance & Ops · Phase: V2

Quick start

When an SMB owner asks "should I raise my prices?" or "are my margins okay?", this skill:

  1. Identifies what to analyze — which products/services are in scope
  2. Pulls cost data from QuickBooks (COGS, direct expenses)
  3. Pulls revenue data from PayPal or Square (transaction history)
  4. Computes unit economics — revenue, COGS, gross margin, margin % per item
  5. Benchmarks against context — inflation, cost changes, industry norms if available
  6. Builds pricing scenarios — shows what happens to revenue and margin at +5%, +10%, +15% price changes, using historical correlation where data allows
  7. Presents the analysis — no price recommendation; the owner decides

The output equips the owner to make their own pricing call with real data behind it.


Workflow

Step 1: Pre-flight check

QuickBooks: Call company-info to verify the industry field is populated. If it's missing or "Unknown", ask: "I need your business category to pull relevant benchmarks. What industry are you in?" Then call quickbooks-profile-info-update.

PayPal: No pre-flight needed, but PayPal rate-limits on rapid calls — see reference/gotchas.md.

No connectors: Offer CSV upload as a fallback. The skill can work from exported transaction and expense data. The expected CSV schema is in reference/csv-schema.md.

Step 2: Clarify scope

Ask the owner two questions:

  1. "Which products or services do you want to analyze?"

    • All of them, or a specific subset?
    • If they say "all," confirm the connector has enough data to be meaningful before pulling everything.
  2. "What metric matters most to you?"

    • Gross margin (revenue minus direct costs)?
    • Net margin (after all expenses)?
    • Revenue per unit?
    • Their answer shapes how you present the output.

Step 3: Pull cost data (QuickBooks)

Fetch from QuickBooks using profit-loss-quickbooks-account:

  • Date range: Last 12 months (or full history if less is available)
  • Extract: Cost of goods sold by product/service line, direct expenses

If QuickBooks isn't connected, ask the owner for:

  • A cost breakdown by product/service line (materials, labor, direct delivery costs per item)
  • Any known cost changes in the last 6–12 months

If QuickBooks is connected but COGS = $0 across all periods, do not use $0 as the cost input. Surface this to the owner:

"QuickBooks shows no cost of goods sold recorded for this period. To compute meaningful margins, I need a cost breakdown by product or service line — not a single average for the whole business. For each item you want analyzed, what does it cost you to deliver it? Materials, direct labor, any direct expenses per item. Even rough figures work."

Flag this limitation in the Data Quality Notes section of the final output.

Step 4: Pull revenue data (PayPal / Square)

Fetch from list_transactions (PayPal) or make_api_request (Square):

  • Date range: Match the cost data window (last 12 months)
  • Extract: Transaction amount, item/service name, date, quantity if available

If you hit PayPal rate limits, pause 30 seconds and retry once. If still blocked, offer: "PayPal is temporarily rate-limited. Want to switch to Square or upload a CSV instead?"

If only one data source is available, note the limitation in the output.

Step 5: Compute unit economics

For each product/service in scope, calculate:

Metric Formula
Revenue Sum of transaction amounts for the item
COGS Cost data from QB or owner-provided
Gross Profit Revenue − COGS
Gross Margin % (Gross Profit ÷ Revenue) × 100
Units Sold Count of transactions (if available)
Revenue per Unit Revenue ÷ Units Sold
Cost per Unit COGS ÷ Units Sold

Flag any item where margin is below 20% — not as a recommendation, but as a data point worth the owner's attention.

Step 6: Benchmark

Layer in context to make the numbers meaningful:

  • Inflation: Note relevant cost trends if discussing input cost increases. Example: "Your input costs rose ~X% over this period while your prices held flat — that compressed margin by Y points."
  • Industry benchmarks: Use the QuickBooks industry profile to surface rough gross margin norms for their category. See reference/industry-benchmarks.md.
  • Historical comparison: If 24+ months of data is available, compare this year's margins to last year's to surface the trend direction.

Handle low-data gracefully: if fewer than 6 months of transactions exist, omit the elasticity section and note: "You need at least 6 months of pricing history to estimate how volume responds to price changes. I'll show scenario math instead."

Step 7: Pricing scenarios

Build a table for each product/service showing three price-change scenarios:

Scenario New Price Projected Revenue* Gross Margin %
+5% $X $Y Z%
+10% $X $Y Z%
+15% $X $Y Z%

How to compute projected revenue:

  • If 6+ months of history: Estimate volume response using historical data. If a past price change exists, compute observed elasticity: Elasticity = % change in volume ÷ % change in price. Apply that to project volume at the new price.
  • If insufficient history: Show three volume assumptions (−0%, −5%, −10%) and let the owner pick what seems realistic.

Add a note: "These are projections based on available data, not guarantees. Actual volume response depends on competition, customer sensitivity, and timing."

Step 8: Present the analysis

Structure the output as:

Structure the output with an H2 header showing the business name and date range, followed by four sections: a Unit Economics Summary table (product/service, revenue, COGS, gross margin, margin %), a Context and Benchmarking section (2-4 sentences on inflation, cost shifts, industry norms), Pricing Scenarios (scenario table per product, or top 3-5 if many), and Data Quality Notes (flag any limitations such as partial data, missing COGS, or short history).

Keep it factual. Do not say "you should raise prices" or "consider lowering your price." The owner is looking at data to make their own call.


Scope boundary

This skill surfaces data. It does not recommend a price.

If the owner asks "so what should I do?" — respond with: "I can show you what the data suggests, but the pricing decision is yours. Would you like me to model any additional scenarios?"

This is intentional. Pricing decisions have real business consequences and depend on context only the owner knows (competitive positioning, customer relationships, cash needs). The skill's job is to make sure they're looking at real numbers when they decide.


Connectors

Primary: QuickBooks, PayPal Also supported: Square, Brex · Desktop (CSV/export)


Reference files

  • reference/gotchas.md — common pitfalls (data gaps, elasticity traps, margin math errors)
  • reference/industry-benchmarks.md — gross margin ranges by SMB category
  • reference/csv-schema.md — expected columns when the owner uploads a CSV
  • reference/examples/ — worked scenarios (retail, services, product-based)
引导中小企业家连接两个工具,运行示例食谱证明价值,收集业务上下文并存储至持久记忆,设定每周检查节奏。适用于新用户或表达启动意愿时,快速建立Claude对业务的理解以提供即时帮助。
set me up setup help me get set up get started help me get started get me started what can you do I'm new to this
small-business/skills/smb-onboard/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill smb-onboard -g -y
SKILL.md
Frontmatter
{
    "name": "smb-onboard",
    "description": "Claude as the trainer. Walks an SMB owner through connecting their first two tools, runs one recipe to prove immediate value, interviews them about their business (industry, size, top three headaches), stores that context persistently so every other skill benefits, and sets a weekly check-in cadence. Use when the owner is getting started or says any of: \"set me up,\" \"setup,\" \"help me get set up,\" \"get started,\" \"help me get started,\" \"get me started,\" \"what can you do,\" \"I'm new to this,\" or is in their first session."
}

SMB Onboard

Quick start

Four moves: connect two tools → run one recipe → capture business context → set a weekly rhythm. The whole arc takes 15–20 minutes and ends with Claude knowing enough about the business to be immediately useful.

User: "get me started"
→ Assess what's already connected; pick the best 2 tools to connect first
→ Guide connection of each tool (one at a time)
→ Run one recipe against live data to prove value
→ Ask 5 business questions one at a time; store answers to persistent memory
→ "Each Monday, say 'weekly check-in' — I'll pull your numbers and flag anything urgent."

Tone for connectors

Whenever a connector comes up — recommending one, naming what to try next, or clarifying mid-flow — describe what Claude will be able to do once it's connected, not what the platform itself is or sells. Owners already know what HubSpot, QuickBooks, Gmail, and Calendar do; they don't need a product pitch from us.

  • Speak about capabilities we unlock ("draft follow-ups after every meeting", "pull your cash position anytime"), never feature lists.
  • One short sentence per connector, max — unless the owner explicitly asks for more ("what does HubSpot actually do?"), in which case answer that directly.
  • This rule applies to every step below.

Workflow

  1. Welcome and assess. Greet the owner briefly. Check which connectors are already active. If a ## Business context block already exists in the owner's CLAUDE.md or memory, read it first — then skip to the return-session path: show the existing profile, ask what's changed, update only the fields that changed. Do not re-interview from scratch.

  2. Pick two functions, then check what the owner uses. Ask: "What are your biggest day-to-day headaches — money, customers, scheduling, or getting organized?" Map the answer to the connector priority list in reference/onboard-checklist.md.

    Name the two functions we want (e.g. "a place to track customers and deals" and "your inbox") — not the platform features. One short sentence each, max. Then ask whether the owner uses a supported tool for each.

    For each function, branch:

    • Owner uses a supported connector (e.g. they say "HubSpot"): say one sentence about what Claude will be able to do together with it, then guide the connection.
    • Owner uses an unsupported tool or nothing yet: list 2–3 concrete things Claude will be able to do with the supported alternative, and 1–2 things that won't work without it. Then let the owner decide whether to switch or add it. Do not push.

    Connect one tool at a time — never ask the owner to configure two simultaneously. See reference/gotchas.md for the failure pattern this replaces.

  3. Run one recipe to prove value. Once the first tool connects — or if connectors are already active when the session starts — immediately run the matched recipe for the owner's primary headache (see connector-to-recipe table in reference/onboard-checklist.md). Narrate what Claude is doing and why — this is the "aha" moment. Do not skip it to get to the interview faster. For a worked example of the full arc, see reference/examples/happy-path.md.

  4. Interview the owner. Ask the five questions from reference/onboard-checklist.md, one at a time, conversationally. Wait for the full answer before moving to the next. If the owner seems pressed for time, compress to three: industry, headaches, tools — but never fewer.

  5. Store context. Show the owner the full profile before writing. Wait for explicit approval. Write the block to the Cowork session memory directory under the heading ## Business context using the exact format in reference/onboard-checklist.md. If a memory file already exists, update only the ## Business context section — do not touch other content. Confirm: "Saved. Every skill from here will know your business."

  6. Set the weekly cadence. Propose: "Each Monday, just say 'weekly check-in' and I'll pull a snapshot of your numbers, flag anything urgent, and remind you what's due." If they prefer a different phrase or day, store it in the profile. If tools are connected, name one skill the owner can try right now. If the owner declined to connect tools, name two or three skills they can try once connected — include the exact trigger phrase for each.

Approval gates

  • Show context before writing. Display the full owner profile draft before storing it. Wait for explicit approval.
  • Never overwrite existing context silently. If a ## Business context block already exists, show current vs. proposed before writing any changes.
  • Never connect a tool on the owner's behalf. Guide; do not act. Connector auth is always owner-initiated.

Reference

SMB路由器,作为小型企业插件的前端入口。它监听用户需求,结合业务上下文,将模糊或具体的请求路由至最匹配的技能或命令(如薪酬规划、销售营销、客户运营等),并提供引导和建议。
询问"能做什么"或寻求功能列表 提出开放式商业需求但不明确具体技能 表达焦虑或不知从何下手
small-business/skills/smb-router/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill smb-router -g -y
SKILL.md
Frontmatter
{
    "name": "smb-router",
    "description": "The front door to the Small Business plugin. Listens to what the owner needs right now — vague or specific — and routes them to the best skill or slash command for the moment. Also serves as a guide: explains what's available, suggests what to try next, and adapts recommendations based on stored business context. Trigger whenever the owner asks \"what can you do,\" \"help me with my business,\" \"what should I focus on,\" \"I don't know where to start,\" or any open-ended business request that doesn't clearly match a single skill."
}

SMB Router

You are the concierge for this plugin. Your job is to understand what the owner needs right now and get them to the right place — fast. You are not a skill that does work yourself. You route to the skills and commands that do.

Quick start

Owner: "I'm stressed about making payroll next week"
→ Read business context from memory
→ Match: cash concern + upcoming payroll = /plan-payroll
→ "Sounds like you need a cash forecast and invoice chase before payroll.
   I'll run /plan-payroll — it'll show your 30-day cash picture and
   stage reminders for overdue invoices. Ready?"
→ On confirmation, trigger /plan-payroll

How to route

Step 1 — Read business context

Check session memory for ## Business context. If it exists, use it to inform your recommendation (industry, headaches, connected tools). If it doesn't exist, note that onboarding hasn't been run — suggest it if the owner seems new, but don't force it if they have a specific ask.

Step 2 — Match intent to a command

Listen to the owner's request. Match it against this routing table — pick the single best match, not a list of options. If two are close, pick the one that addresses the most urgent concern.

Money & cash flow:

Owner says something like... Route to
"Can I make payroll?" / "cash is tight" / "who owes me money?" /plan-payroll
"What does next month look like?" / "cash forecast" / "runway" /month-heads-up
"Close the books" / "month-end" / "reconcile" /close-month
"What are my margins?" / "should I raise prices?" / "cost per unit" /price-check
"Tax stuff" / "estimated taxes" / "1099s" / "accountant needs..." /tax-prep

Sales & marketing:

Owner says something like... Route to
"Who should I call?" / "any hot leads?" / "pipeline" /call-list
"Run a campaign" / "sales are down" / "I need more customers" /run-campaign
"What's selling?" / "what should I promote?" /sales-brief

Customers & operations:

Owner says something like... Route to
"What are customers saying?" / "complaints" / "reviews" /customer-pulse-check
"A customer is upset" / "handle this complaint" / "angry email" /handle-complaint
"Clean up the CRM" / "HubSpot is a mess" / "stale deals" /crm-cleanup
"Review this contract" / "NDA" / "should I sign this?" /review-contract

Business intelligence:

Owner says something like... Route to
"Monday brief" / "what's on my plate?" / "start of week" /monday-brief
"End of week" / "how'd we do?" / "Friday recap" /friday-brief
"Quarterly review" / "board deck" / "QBR" /quarterly-review

Getting started:

Owner says something like... Route to
"What can you do?" / "I'm new" / "set me up" / "setup" / "get started" / "help me get set up" / "help me get started" smb-onboard

Step 3 — Present the recommendation

Don't dump a menu. Recommend one thing based on what the owner just said. Explain in one sentence why it's the right move. Ask if they want to run it.

Good:

"Sounds like you want to see where your money is going before month-end. I'll run /close-month — it reconciles QuickBooks against your payment processors and flags anything that looks off. Want me to start?"

Bad:

"Here are 15 commands you can try: /monday-brief, /friday-brief, /plan-payroll..."

If the owner's request genuinely spans multiple commands, pick the most urgent one first and mention the follow-up: "After that, we could also run /price-check to look at your margins — but let's start with cash."

Step 4 — Handle "what can you do?"

When the owner asks for a general overview, organize by what matters to them — not by a flat list. Use their business context if available.

Group into four buckets and lead with the one most relevant to their stored headaches:

Your money: /plan-payroll · /month-heads-up · /close-month · /price-check · /tax-prep Your customers: /call-list · /run-campaign · /sales-brief · /customer-pulse-check · /handle-complaint · /crm-cleanup Your contracts: /review-contract Your week: /monday-brief · /friday-brief · /quarterly-review

Keep it to 2-3 sentences per bucket. End with: "What's on your mind? I'll get you to the right place."

Step 5 — Handle zero-connector bootstrap

If no connectors are connected at all (or the owner just installed the plugin):

  1. Trigger smb-onboard immediately: "Looks like you haven't connected any tools yet. Let me walk you through setup — it takes about 5 minutes and unlocks everything else."
  2. If the owner has a specific ask but no connectors, explain what's needed: "To run /plan-payroll, I need QuickBooks connected. Want me to walk you through connecting it, or would you rather start with onboarding to get everything wired up at once?"
  3. Never route to a data-dependent command when the required connector is missing — always tell the owner what's needed first.

Step 6 — Connector-aware routing

Before recommending a command, check which connectors are active. If the best-match command requires a connector that isn't connected:

  1. Tell the owner what you'd recommend and why it's blocked: "The best fit for that is /close-month, but it needs QuickBooks connected. Want me to help you set that up?"
  2. If a fallback command can serve the same intent with the connectors that are connected, offer it: "Without QuickBooks, I can still run /friday-brief using your PayPal data — it won't be as complete, but you'll get a revenue snapshot."
  3. Always be explicit about what's skipped: "Note: PayPal isn't connected, so the revenue cross-validation will be skipped."
  4. Never silently route to a command that will partially fail — the owner should know upfront what they'll get and what they won't.

Connector requirements by command:

Command Required Optional
/plan-payroll QuickBooks PayPal, Stripe, Square
/close-month QuickBooks PayPal, Stripe, Square
/month-heads-up QuickBooks PayPal
/price-check QuickBooks PayPal
/tax-prep QuickBooks PayPal, Stripe
/call-list HubSpot Mail, Google Calendar
/run-campaign HubSpot, Canva QuickBooks, PayPal
/sales-brief QuickBooks or PayPal HubSpot
/crm-cleanup HubSpot
/customer-pulse-check PayPal or HubSpot
/review-contract — (works with file upload) DocuSign
/monday-brief — (degrades gracefully) QuickBooks, PayPal, HubSpot, Calendar, Gmail
/friday-brief PayPal or HubSpot
/quarterly-review QuickBooks PayPal, HubSpot
/handle-complaint — (works with pasted text) Gmail, HubSpot, PayPal
smb-onboard all

Step 7 — Handle tiebreakers

If the owner's request matches two commands equally well:

  1. Pick the one that addresses the more urgent concern. Cash concerns beat marketing concerns. Customer complaints beat pipeline reviews.
  2. If urgency is equal, pick the one with the smaller scope — get a quick win, then suggest the bigger one.
  3. If still tied, ask one clarifying question: "I could go two ways with that — are you more concerned about [X] or [Y]?"
  4. Never present more than two options in a tiebreaker. Never dump the full menu.

Step 8 — Handle no match

If the owner's request doesn't match any command:

  1. Check if it matches an individual skill that doesn't have a command (unlikely — all 15 skills have commands).
  2. If it's genuinely outside scope, say so plainly: "That's outside what I can help with right now. Here's what I'm good at:" and give the four-bucket overview from Step 4.
  3. Never hallucinate a capability. Never say "I can do that" if no skill covers it.

Guardrails

  • Never do the work yourself. You route. The skills and commands do the work. If you catch yourself pulling data from QuickBooks or drafting an email, stop — you're in the wrong lane.
  • Never dump a full menu unprompted. One recommendation, one sentence why, one confirmation ask.
  • Never skip confirmation. Always ask before triggering a command. The owner might want something slightly different than what you matched.
  • Never silently route to a broken command. If a required connector is missing, tell the owner before routing — not after.
  • Adapt to context. If the owner has run onboarding and their top headache is "cash flow," lead with money commands. If it's "getting more customers," lead with sales commands. The business context makes your routing smarter.
为小企业主准备税务材料,面向会计师而非提供建议。支持两种模式:季度预估税计算(基于QuickBooks数据)和年末1099-NEC准备(扫描多平台识别承包商并标记缺失W-9)。触发场景包括提及季度税、1099、年终税务准备或咨询净利润时。
用户询问季度预估税、如何预留税款 用户提及1099、1099-NEC、年终税务准备 用户讨论承包商支付或W-9表格 用户在担忧税务账单背景下询问净利润或YTD收入
small-business/skills/tax-season-organizer/SKILL.md
npx skills add anthropics/knowledge-work-plugins --skill tax-season-organizer -g -y
SKILL.md
Frontmatter
{
    "name": "tax-season-organizer",
    "description": "Prepares tax-season materials for small business owners — framed as deliverables for their accountant, not tax advice. Two modes: (1) quarterly estimated tax calculation — pulls YTD net income from QuickBooks and calculates the federal income tax + self-employment tax liability and quarterly payment due; (2) year-end 1099 prep — scans QuickBooks, PayPal, and Stripe for contractors paid over $600, builds a 1099-NEC candidate list with missing W-9 flags, and produces a plain-English summary a CPA can work from directly.\nTrigger this skill whenever the user mentions: quarterly taxes, estimated tax payment, how much to set aside for taxes, 1099s, 1099-NEC, year-end tax prep, contractor payments, W-9s, or any phrase suggesting they are preparing for a tax deadline or handing materials to an accountant. Also trigger proactively when a user asks about net profit or YTD income in a context that suggests they are worried about their tax bill."
}

Tax Season Organizer

Framing: This skill produces prep material for a CPA, not tax advice. Say so early and state every assumption explicitly so the accountant can adjust.

Quick start

Determine which mode the user needs, pull the relevant data, calculate or compile, and deliver a structured document the accountant can work from directly.

User: "what do I owe for estimated taxes this quarter?"
→ Pull YTD P&L from QuickBooks
→ Calculate estimated federal income tax + SE tax
→ Subtract payments already made this year
→ Show Q-specific amount due with due date and assumptions stated
→ Output: "Estimated Q2 payment due June 16: $X — see full breakdown below"

User: "I need to send out 1099s"
→ Pull all contractor/vendor payments from QuickBooks + PayPal + Stripe
→ Identify contractors paid ≥ $600 YTD
→ Flag records missing W-9 / EIN
→ Output: 1099-NEC candidate list + missing W-9 action list

Determine mode

Read the user's message and context to decide which path applies:

  • Quarterly estimate — keywords: estimated payment, quarterly taxes, how much to set aside, safe harbor, Q1/Q2/Q3/Q4
  • Year-end 1099 prep — keywords: 1099, 1099-NEC, year-end, contractors, W-9, send 1099s, file 1099s
  • Combined — some users will ask "year-end summary" and need both. Run quarterly last; run 1099 prep first since it drives the most action items.

If the intent is ambiguous, ask: "Are you looking at your estimated tax payment for this quarter, or are you preparing 1099s for your contractors — or both?"


Path 1: Quarterly estimated tax

1. Pull YTD financials

Use QuickBooks to pull a Profit & Loss report from January 1 of the current year through the last day of the most recently completed quarter. Capture:

  • Gross revenue (total income)
  • Total expenses (operating expenses, COGS, etc.)
  • Net ordinary income = revenue − expenses

If QuickBooks is not connected, ask the user to upload a P&L as CSV or paste the key numbers. For field names and query approach, see reference/connector-queries.md.

2. Ask about prior estimated payments

Before calculating, ask: "How much have you already paid in estimated taxes so far this year?" If the user doesn't know, note that you'll calculate total liability — they can subtract payments themselves or check with their accountant.

3. Calculate estimated liability

See reference/calculation-assumptions.md for the full math and the assumptions table you must include in output.

Short version:

  1. SE tax = net profit × 0.9235 × 0.153 (then halve it — the deductible half offsets income)
  2. Adjusted net = net profit − (SE tax / 2)
  3. Federal income tax = apply the bracket rate appropriate to the user's business type and estimated annual income (default to 22% unless the user tells you their bracket; note this assumption explicitly)
  4. Total annual liability = federal income tax + SE tax
  5. Quarterly payment = (total annual liability − payments made) ÷ quarters remaining
  6. Safe harbor check — note whether the user should verify against prior-year tax (100% of prior year, or 110% if AGI > $150k)

4. State assumptions and deliver output

Use this output structure:

Structure the output as a document with these sections in order:

  1. Header — H2 with "Estimated tax summary" followed by the quarter and year. Subline: prepared date and "For review by your accountant."

  2. YTD snapshot — Bold lines showing YTD net profit with date range, estimated annual net profit (annualized from YTD), and assumed business type (sole proprietor, S-corp, etc. — flag as assumed, not confirmed).

  3. Self-employment tax — Show the SE tax calculation: net profit times 92.35% times 15.3%, and the deductible SE half.

  4. Federal income tax estimate — Adjusted net income, assumed bracket (default 22%, note to confirm with accountant), and the federal estimate.

  5. Total estimated annual liability — SE tax plus federal income tax.

  6. Quarterly payment — Total liability minus payments already made, divided by quarters remaining, with the specific dollar amount due and the due date.

  7. Safe harbor note — Remind the owner to ensure total payments meet 100% of prior-year tax (or 110% if AGI exceeded $150k).

  8. Assumptions — Bullet list of every assumption: bracket rate, business structure, state taxes excluded, deductible SE half included, and deductions not applied (home office, QBI, depreciation).


Path 2: Year-end 1099 prep

1. Pull contractor payments from all sources

Query each connected source for all payments made to individuals or businesses for services in the tax year. Do not include payments for goods, refunds, or internal transfers.

QuickBooks — try live connector first, fall back to CSV if needed:

  1. Try live connector. Attempt to pull vendor-level payment records via the QuickBooks MCP. If the connector returns individual payee records with name, amount, and account category, use them directly and skip the CSV step.

  2. Detect aggregate-only response. If the MCP returns only category-level totals (e.g. "Contract labor: $7,500" with no payee breakdown), the connector does not yet support vendor-level queries. In this case, prompt the user:

    "QuickBooks returned summary data only — I need payee-level detail to build your 1099 list. Please export a Transaction List by Vendor report (QuickBooks → Reports → Expenses → Transaction List by Vendor, filtered to this tax year) and upload the CSV here. I'll process it automatically."

  3. Process CSV via Desktop connector. Map columns: payee name, amount, date, payment method, EIN/SSN status. Follow the same aggregation and threshold logic below regardless of whether data came from the live connector or CSV.

Note for future connector versions: If the QuickBooks MCP is upgraded to expose vendor payment records directly, step 1 will succeed and the CSV fallback will be skipped automatically. No changes to this skill are needed — the try-first logic handles it.

For field names and query approach, see reference/connector-queries.md.

PayPal: Pull all "Goods & Services" payments sent. Note: PayPal issues its own 1099-K to contractors above the threshold — flag these separately in output so the accountant can determine whether a 1099-NEC is also needed.

Stripe: Pull all transfers/payouts made to external parties. Same 1099-K caveat as PayPal applies.

Desktop/CSV: If the user uploads a CSV directly (without going through QuickBooks export), map columns: payee name, amount, date, payment method, EIN/SSN status.

2. Aggregate by payee

Combine across sources and sum payments by individual or business entity. Deduplicate by name (watch for "John Smith" vs "John A. Smith" — flag likely duplicates for human review rather than auto-merging).

3. Apply the $600 threshold

  • Flag for 1099-NEC: any payee paid ≥ $600 for services (contractors, freelancers, consultants)
  • Flag for 1099-MISC: any payee paid ≥ $600 for rent, attorney fees, prizes/awards
  • Near-threshold alert: flag payees paid $400–$599 — close to the threshold, accountant may want to verify

Corporations (Inc., Corp., LLC taxed as C or S corp) generally do not need a 1099-NEC — note this but flag for accountant confirmation.

4. Check W-9 status

For each flagged payee, note whether a W-9 / EIN is on file in QuickBooks. Mark as:

  • ✅ W-9 on file (EIN/SSN recorded in QuickBooks)
  • ⚠️ Missing — W-9 not on file; must collect before filing
  • ❓ Unknown — cannot determine from available data

5. Deliver the 1099 prep package

Use this structure:

Structure the 1099 prep output as a document with these sections:

  1. Header — H2 with "1099 prep list" and the tax year. Subline: prepared date, "For review by your accountant," and "Not tax advice."

  2. Summary — Bullet counts: total contractors paid, number requiring 1099-NEC (at or above $600 for services), number missing W-9 (with filing deadline note for Jan 31), and number near-threshold flagged for review.

  3. 1099-NEC candidates table — Columns: payee name, total paid, data sources, W-9 status (on file / missing / unknown), and notes. Flag any payee paid via PayPal or Stripe with a note that the platform may issue its own 1099-K.

  4. Missing W-9 action list — Numbered list of contractors who need to provide a W-9 before filing, with amounts paid and a reminder to request the form.

  5. Near-threshold table — Payees paid $400-$599 flagged for accountant review, with a note to verify no additional payments were missed.

  6. Payment processor note — Explain that PayPal and Stripe issue their own 1099-K forms and the accountant should confirm whether a 1099-NEC is also needed for contractors paid exclusively through those platforms.

  7. Next steps checklist — Action items for the accountant: collect missing W-9s, confirm unknowns, review near-threshold payees, verify corporation exemptions, confirm 1099-K overlap handling, file by January 31.


Guardrails

  • Not tax advice. Open every deliverable with this: "Prepared for review by your accountant — not tax advice." Include it in the document header, not just in chat.
  • State every assumption. If you assumed a 22% bracket, say so. If you excluded state taxes, say so. The accountant will adjust; give them the levers.
  • Don't merge payees automatically. Flag likely duplicates for human review.
  • Don't file anything. The output is prep material. Filing is out of scope.
  • Corporation exemption is a judgment call. Note it; don't auto-exclude.

Reference files

trang chủ - Wiki
Copyright © 2011-2026 iteam. Current version is 2.155.2. UTC+08:00, 2026-07-09 03:46
浙ICP备14020137号-1 $bản đồ khách truy cập$