
The Claude Code Playbook: Skill-First Workflows
Build skill-first workflows with Claude Code that stick. CLAUDE.md, commands, skills, and the Explore-Plan-Execute-Verify loop. No coding required.
You've written the perfect prompt.
It runs your weekly standup summary, builds your PRD in exactly the right format, or generates client reports with the metrics your team actually cares about.
Then someone else on your team needs it. Or you need it in a different tool. Or you want to run it programmatically.
So you copy-paste. You tweak. You copy-paste again.
Six months later, there are nine versions of the same workflow scattered across Slack threads, Google Docs, and half-remembered conversation histories.
Skills solve for this.
This guide will walk you through the full picture — what skills are, where they run, how they differ across Claude's surfaces, and how to build a shared skill library your team can actually maintain.
We'll cover pre-built skills (the fastest path to value), custom skills (packaging your team's expertise), and the patterns that make skills and MCP work together without falling apart.
If you haven't read our earlier guides, here's the quick version: tools give Claude access to actions (read a file, call an API), MCP standardizes how those tools connect, and skills package the method — the instructions, templates, and checks that turn raw tool access into reliable workflows. For the full breakdown, see Agent Skills 101: Tools vs MCP vs Skills.
This guide goes deeper on skills specifically.
Every team has tribal knowledge. The way you structure a PRD. The format your investors expect in board decks. The specific checks you run before shipping a deploy. The rubric your team uses for customer research.
This knowledge lives in people's heads, in scattered docs, and in prompts that get rebuilt from scratch every time someone starts a new conversation.
Skills are the packaging layer that turns tribal prompts into reusable capability.
One workflow, ten implementations
Without skills, here's what happens:
Each version drifts. Nobody knows which one is current. When the report format changes, you update one version and forget the others.
Create once, reuse everywhere
A skill is a directory with a SKILL.md file. That's it. The same skill works across:
One source of truth. Multiple surfaces. When you update the skill, everyone gets the update.
Want to use Claude Code with your team?
Try Duet—the collaborative workspace for AIs and Humans
Skills aren't identical everywhere. Each surface has different sharing models, different constraints, and different setup steps.
Understanding these differences is how you avoid building something that only works in one place.
| Claude.ai | Claude Code | Claude API | Agent SDK | |
|---|---|---|---|---|
| Pre-built skills | Yes (automatic) | No | Yes (via skill_id) | No |
| Custom skills | Yes (upload zip) | Yes (filesystem) | Yes (upload via API) | Yes (filesystem) |
| Sharing scope | Per-user only | Per-project or personal | Organization-wide | Per-project |
| Setup required | Upload in Settings | Create directory + SKILL.md | API upload + beta headers | Directory + config |
| Network access | Varies by settings | Full (your machine) | None (sandboxed) | Full (your machine) |
| Best for | Individual use, quick tasks | Repo-specific workflows | Production systems, automation | Custom agent apps |
The simplest starting point. Claude.ai supports both pre-built skills and custom skills you upload yourself.
How to add a custom skill:
The catch: Custom skills in Claude.ai are per-user. Your teammate can't see skills you've uploaded. There's no admin panel, no org-wide deployment, no central management. If your team has five people, each person uploads the skill separately.
This matters less than you'd think for personal productivity skills. It matters a lot if you're trying to standardize workflows across a team. For team-wide consistency, use the API or Claude Code with a shared repo.
Requirements: Pro, Max, Team, or Enterprise plan with code execution enabled.
Claude Code is where most builders start with custom skills. Skills live on your filesystem as directories — no upload step, no API calls, no zip files. If you're new to Claude Code, start with The Ultimate Beginner's Guide.
.claude/skills/weekly-report/
├── SKILL.md # Main instructions (required)
├── template.md # Report template
└── examples/
└── sample.md # Example output
Claude discovers skills automatically and uses them when relevant to your request. Or you invoke one directly with /weekly-report.
Where skills live determines who sees them:
| Location | Path | Who can use it |
|---|---|---|
| Personal | ~/.claude/skills/my-skill/SKILL.md | You, across all projects |
| Project | .claude/skills/my-skill/SKILL.md | Anyone working on this project |
| Enterprise | Managed settings | Everyone in your org |
Key Claude Code features:
disable-model-invocation: true to your frontmatter if you only want the skill to run when you explicitly call it (like /deploy — you don't want Claude deciding to deploy because your code looks ready)allowed-tools in frontmatter to limit what Claude can do when a skill is active. allowed-tools: Read, Grep, Glob creates a read-only modecontext: fork to run a skill in an isolated subagent — useful for research tasks or anything that shouldn't pollute your main conversation context!command syntax runs shell commands before the skill content reaches Claude. !gh pr diff injects the actual PR diff into the skill promptFor a practical guide to setting up skills with CLAUDE.md and commands, see The Claude Code Playbook.
The API is where skills become infrastructure. You upload custom skills via the /v1/skills endpoint, reference pre-built skills by their skill_id, and everything runs in a sandboxed code execution container.
The differentiator: Custom skills uploaded via the API are shared organization-wide. Everyone in your workspace can use them. This is the opposite of Claude.ai's per-user model, and it's why the API is the right choice for team-wide standardization.
Using a pre-built skill (Python):
import anthropic
client = anthropic.Anthropic()
response = client.beta.messages.create(
model="claude-sonnet-4-6",
max_tokens=4096,
betas=["code-execution-2025-08-25", "skills-2025-10-02"],
container={
"skills": [
{"type": "anthropic", "skill_id": "pptx", "version": "latest"}
]
},
messages=[
{"role": "user", "content": "Create a quarterly review presentation"}
],
tools=[{"type": "code_execution_20250825", "name": "code_execution"}],
)
Uploading a custom skill:
from anthropic.lib import files_from_dir
skill = client.beta.skills.create(
display_title="Weekly Report Generator",
files=files_from_dir("/path/to/weekly-report-skill"),
betas=["skills-2025-10-02"],
)
print(f"Skill ID: {skill.id}")
Important constraints:
code-execution-2025-08-25, skills-2025-10-02, files-api-2025-04-14The SDK supports custom skills through the same filesystem-based approach as Claude Code. Store skills in .claude/skills/ and include "Skill" in your allowedTools configuration.
const agent = new Agent({
model: 'claude-sonnet-4-6',
allowedTools: ['Read', 'Write', 'Bash', 'Skill'],
})
One thing to note: Tool restrictions work differently in the SDK. The allowed-tools frontmatter field is a Claude Code CLI feature. In the SDK, you use allowedTools in your agent configuration instead.
Before you build anything custom, check whether a pre-built skill already does what you need. Anthropic maintains skills for the document types that actual work runs on.
| Skill ID | What it does |
|---|---|
pptx | Create and edit PowerPoint presentations |
xlsx | Create spreadsheets, analyze data, generate charts |
docx | Create and edit Word documents |
pdf | Generate formatted PDF documents and reports |
These exist because real work produces real artifacts — decks, spreadsheets, docs — not just chat text. If your workflow ends with "now copy this into Google Slides," a pre-built skill can skip that step entirely.
Think about the deliverables your team produces repeatedly:
pptx skill takes structured data and produces a formatted presentationxlsx skill creates a spreadsheet with charts and conditional formattingdocx skill outputs a formatted document ready to sharepdf skill produces polished PDFsThe pattern is the same: structured inputs go in, formatted files come out. The Files API handles uploads and downloads.
Downloading a generated file:
for file_id in extract_file_ids(response):
file_metadata = client.beta.files.retrieve_metadata(
file_id=file_id, betas=["files-api-2025-04-14"]
)
file_content = client.beta.files.download(
file_id=file_id, betas=["files-api-2025-04-14"]
)
file_content.write_to_file(file_metadata.filename)
Use pre-built skills when:
Build custom when:
You can also combine both — use a custom skill for the analysis logic and a pre-built skill for the final output:
response = client.beta.messages.create(
model="claude-sonnet-4-6",
max_tokens=4096,
betas=["code-execution-2025-08-25", "skills-2025-10-02"],
container={
"skills": [
{"type": "anthropic", "skill_id": "xlsx", "version": "latest"},
{"type": "custom", "skill_id": dcf_skill.id, "version": "latest"},
]
},
messages=[
{"role": "user", "content": "Run the DCF analysis and output to Excel"}
],
tools=[{"type": "code_execution_20250825", "name": "code_execution"}],
)
Pre-built skills handle standard formats. Custom skills handle everything else — the workflows, conventions, and institutional knowledge that make your team's work distinct.
A skill is a directory. The only required file is SKILL.md. Everything else is optional.
incident-report/
├── SKILL.md # Main instructions (required)
├── template.md # Your incident report template
├── severity-rubric.md # How to classify severity
├── examples/
│ └── sample-report.md # A good example report
└── scripts/
└── validate.py # Script to check completeness
SKILL.md uses YAML frontmatter for metadata and markdown for instructions:
---
name: incident-report
description: Generates incident postmortem reports following our team format.
Use when writing incident reports, postmortems, or analyzing outages.
---
# Incident Report Generator
## Process
1. Gather timeline from provided logs or description
2. Classify severity using severity-rubric.md
3. Fill in template.md with structured findings
4. Run validation: python scripts/validate.py report.md
5. If validation fails, fix issues and re-validate
## Key rules
- Every finding must cite a specific log entry or timestamp
- Action items must have an owner and a due date
- Never classify severity below the actual impact
They encode "how we do this here":
Without skills, this knowledge lives in "ask Sarah, she knows the format" or "check the wiki page from 2024 that might still be accurate."
The description field is the most important thing you write. It's not documentation for humans — it's metadata Claude uses to decide when to load a skill without loading everything into context.
Good description:
description: Generates incident postmortem reports following our team format.
Use when writing incident reports, postmortems, or analyzing outages.
Bad description:
description: Helps with documents
Include: what it does + when to use it + trigger phrases a user might naturally say. Write in third person ("Generates reports" not "I can help you generate reports").
Testing your description: After creating a skill, test it by asking Claude for things the skill should handle. Ask using different phrasings — obvious ones and paraphrased ones. Also test that it doesn't trigger on unrelated requests. A skill that activates too often is almost as bad as one that never activates.
Skills use a three-level loading system that keeps your context window clean:
| Level | When loaded | Token cost | What it includes |
|---|---|---|---|
| Metadata | Always (at startup) | ~100 tokens per skill | name and description from frontmatter |
| Instructions | When skill is triggered | Under 5K tokens | SKILL.md body |
| Resources | As needed | Effectively unlimited | Additional files, scripts, templates |
This means you can install dozens of skills without penalty. Claude sees the metadata for all of them at startup (lightweight), reads the full SKILL.md only when relevant (moderate), and accesses supporting files only when needed (on demand).
Practical implication: Don't try to cram everything into SKILL.md. Keep it under 500 lines. Move detailed reference material, examples, and data into separate files and reference them:
## Additional resources
- For API details, see reference.md
- For usage examples, see examples.md
Claude reads those files only when the task requires them.
Skills provide Claude with instructions and executable code. A malicious skill can direct Claude to do things that don't match its stated purpose.
Non-negotiable practices
YAML frontmatter constraints (enforced by the system):
name: max 64 characters, lowercase letters/numbers/hyphens only, no XML tagsdescription: max 1024 characters, no XML tagsThe supply chain risk is real. Snyk's ToxicSkills research found 36% of AI agent skills on public directories contain security flaws. Stick to skills from known sources with visible maintainers. This isn't theoretical — there have been active malicious payloads disguised as legitimate skills in public skill directories.
Want to use Claude Code with your team?
Try Duet—the collaborative workspace for AIs and Humans
If you read our Agent Skills 101 guide, you know the core distinction: MCP gives you access, skills give you method. Together, they're more reliable than giant prompts stitched together with ad-hoc integrations.
MCP = standardized access to tools and data. It's the plumbing — connecting Claude to Jira, Slack, BigQuery, GitHub, your database, whatever.
Skills = reusable workflows. The method, templates, and checks that turn raw tool access into something consistent and reliable.
Together: less brittle than ad-hoc integrations. When you change your ticketing system from Jira to Linear, you swap the MCP server. The skill that generates your weekly exec summary stays the same because it defines the process, not the plumbing.
For a practical walkthrough of connecting MCP tools to your workflow, see Connecting External Tools with MCP.
Most useful skills follow the same three-step pattern:
Exec weekly workflow
Pull: Jira MCP — get sprint tickets + status changes. Slack MCP — get key thread summaries.
Transform: Weekly report skill — normalize data, apply template, highlight blockers.
Produce: docx skill — formatted Word document ready for stakeholders.
Board deck workflow
Pull: BigQuery MCP — get revenue, churn, NPS metrics. Stripe MCP — get payment data and trends.
Transform: Board deck skill — aggregate metrics, create narratives, flag anomalies.
Produce: pptx skill — formatted PowerPoint with charts.
Incident report workflow
Pull: Datadog MCP — get relevant logs and timeline. PagerDuty MCP — get incident timeline and responders.
Transform: Incident report skill — structure timeline, classify severity, validate findings.
Produce: docx + pdf skills — formatted report for internal review and external stakeholders.
When your skill uses MCP tools, always use fully qualified names to avoid "tool not found" errors:
Use the Jira:get_sprint_issues tool to retrieve current sprint tickets.
Use the Slack:get_channel_messages tool to pull key thread updates.
The format is ServerName:tool_name. Without the server prefix, Claude may fail to locate the tool, especially when multiple MCP servers are available.
As your team connects more MCP servers, a scaling problem emerges. This section covers the pattern Anthropic recommends for keeping things fast and cost-effective.
When an agent has access to hundreds of MCP tools, two costs explode:
Anthropic's efficiency guidance: use code execution so the agent can process large intermediate results inside the execution environment and return only the small final result to the model.
Instead of this (expensive):
Claude → MCP tool → [large result enters context] → Claude reasons →
MCP tool → [another large result enters context] → Claude generates final answer
Do this (efficient):
Claude → code execution [
→ load only needed tool definitions via filesystem
→ call MCP tool
→ process large result locally
→ extract relevant data
] → small final result enters context → Claude generates answer
This pattern is especially relevant when combining skills with MCP. Your skill's code can orchestrate MCP calls efficiently inside the execution environment, processing data locally and only surfacing what matters.
Building a skill is the easy part. Keeping a skill library healthy over time — that's where most teams drop the ball. This section covers the operational practices that separate "we tried skills once" from "skills are how we work."
Every skill needs:
Store this in your frontmatter or in a companion metadata file:
---
name: weekly-report
description: Generates weekly team report with metrics and highlights.
Use when creating weekly reports or team updates.
---
For API-managed skills, versions are auto-generated timestamps. Pin to specific versions in production and use "latest" only in development:
# Production: pin version
{"type": "custom", "skill_id": "skill_01Abc...", "version": "1759178010641129"}
# Development: use latest
{"type": "custom", "skill_id": "skill_01Abc...", "version": "latest"}
Treat skills like code:
Before sharing any skill, verify:
Discovery and triggering:
Functional correctness:
Integration:
Post-packaging:
The strongest skill libraries share a common pattern: the skill IS the documentation. When your skill includes clear instructions, templates, and examples, you don't need a separate wiki page explaining "how to generate a weekly report." The skill itself is the living doc.
To accelerate this:
generating-reports, reviewing-code, analyzing-dataanalyzing-metrics skill"Common failure modes and fixes:
| Problem | Likely cause | Fix |
|---|---|---|
| Skill never triggers | Description too vague | Add specific trigger phrases and keywords |
| Skill triggers on everything | Description too broad | Narrow the description, add constraints |
| Output format drifts | Instructions too loose | Add a strict template with explicit structure |
| Skill works in Claude Code but fails via API | Network or package dependency | Remove external API calls; verify packages are pre-installed |
| Context window fills up | SKILL.md too long or too many skills loaded | Split into separate files; keep SKILL.md under 500 lines |
Skills aren't just a Claude feature anymore. They're becoming a cross-platform standard, and this has implications for how you invest in your skill library.
Claude Code skills follow the Agent Skills open standard (agentskills.io), which works across multiple AI tools. This means a skill you write for Claude Code can potentially work in other tools that support the standard — Cursor, Codex, OpenCode, and others.
In January 2026, Vercel launched skills.sh, an open directory where developers publish and install skills for AI agents. It's growing at roughly 147 new skills per day and supports Claude Code, Codex, Cursor, and other tools. Think of it as npm for agent skills.
The ecosystem is young, and the supply chain risks are real. Snyk's research found active malicious payloads in public skill directories — skills disguised as crypto trading tools that actually steal credentials.
Practical rules for public skills
If you're starting from scratch, here's a practical sequence:
.claude/skills/your-skill/ to your repo. Now everyone on the project has it./v1/skills so it's available organization-wide and accessible from automations.Don't try to build a comprehensive skill library on day one. Build the one skill that saves the most time this week. Then build another one next week. The library grows from actual usage, not from planning sessions.
Use this template for every new skill. It forces you to define scope, inputs, guardrails, and success criteria before writing instructions.
# Skill Spec: [Skill Name]
## Scope
- **What this skill does:** [one sentence]
- **What this skill does NOT do:** [boundaries]
- **Target surfaces:** [Claude.ai / Claude Code / API / SDK]
## Inputs
- **Required:** [what the user must provide]
- **Optional:** [what enhances the output]
- **MCP dependencies:** [which MCP servers/tools, if any]
## Guardrails
- **Must always:** [non-negotiable rules]
- **Must never:** [hard constraints]
- **Validation:** [how to verify the output is correct]
## Success criteria
- Output matches expected format
- Triggers on relevant requests
- Does NOT trigger on unrelated requests
- Tested with Haiku / Sonnet / Opus
- Reviewed by [owner name]
## Owner
- **Created by:** [name]
- **Version:** [x.y]
- **Last updated:** [date]
For teams managing more than a handful of skills:
Inventory:
Quality:
Maintenance:
Distribution:
Skills are the difference between "Claude is useful when I prompt it right" and "Claude knows how our team works."
The investment is small. A SKILL.md file with your team's conventions. A few templates. Maybe a validation script. The return compounds every time someone on your team avoids rebuilding a workflow from scratch.
Start with one. The one workflow you're most tired of re-explaining.
This is Part 3 of the Duet Guides series. Part 1 covers Agent Skills 101: Tools vs MCP vs Skills, and Part 2 covers The Ultimate Beginner's Guide to Claude Code. For practical setup of CLAUDE.md, commands, and skills in Claude Code, see The Claude Code Playbook.
Want this running in your own workspace?
Start free in Duet to run persistent agents across your team.

Build skill-first workflows with Claude Code that stick. CLAUDE.md, commands, skills, and the Explore-Plan-Execute-Verify loop. No coding required.

Confused by Tools, MCP, and Agent Skills? This comparison breaks down each with examples, a decision table, and setup steps so you pick the right one.

Replace your $5k/mo automation stack with Claude Code. A practical guide to using it for go-to-market, product, and operations — not just coding.