quickstart changedagents-and-tools/agent-skills/quickstart
Nearest release: v2.1.232, published 7 hours before this site recorded the change. Shown because the two are within 24 hours of each other. Nothing here says the release caused the edit.
## Prerequisites ## Agent Skills overview ## Step 1: List available Skills ## Step 2: Create a presentation ## Step 3: Download the created file ## Try more examples ### Create a spreadsheet ### Create a Word document ### Generate a PDF ## Next steps
The whole hunk
1255 lines, first recordedThe first capture of this source. The page was already there, and this is what it said.
---
title: Get started with Agent Skills in the API
url: https://platform.claude.com/docs/en/agents-and-tools/agent-skills/quickstart
description: Learn how to use Agent Skills to create documents with the Claude API in under 10 minutes.
---
This tutorial shows you how to use Agent Skills to create a PowerPoint presentation. You'll learn how to enable Skills, make a request, and access the generated file.
## Prerequisites
* A [Claude API key](https://platform.claude.com/settings/keys) or a logged-in [ant CLI](https://platform.claude.com/docs/en/cli-sdks-libraries/cli/authentication)
* A [client SDK](https://platform.claude.com/docs/en/cli-sdks-libraries/overview) for your language, or `curl` and `jq`
* Basic familiarity with making API requests
## Agent Skills overview
Pre-built Agent Skills extend Claude's capabilities with specialized expertise for tasks such as creating documents, analyzing data, and processing files. Anthropic provides the following pre-built Agent Skills in the API:
* **PowerPoint (pptx):** Create and edit presentations
* **Excel (xlsx):** Create and analyze spreadsheets
* **Word (docx):** Create and edit documents
* **PDF (pdf):** Generate PDF documents
<Note>
To create custom Skills, see the [Agent Skills Cookbook](https://platform.claude.com/cookbook/skills-notebooks-01-skills-introduction) for examples of building your own Skills with domain-specific expertise.
</Note>
## Step 1: List available Skills
First, check what Skills are available. Use the Skills API to list all Anthropic-managed Skills. Each language tab is an excerpt from one continuous script, with any imports and client setup at the top:
<CodeGroup defaultLanguage="CLI">
```bash cURL
# List Anthropic-managed Skills
curl --fail-with-body -sS "https://api.anthropic.com/v1/skills?source=anthropic" \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: skills-2025-10-02" |
jq -r '.data[] | "\(.id): \(.display_title)"'
```
```bash CLI
# List Anthropic-managed Skills
ant beta:skills list --source anthropic
```
```python Python
# List Anthropic-managed Skills
skills = client.beta.skills.list(source="anthropic")
for skill in skills.data:
print(f"{skill.id}: {skill.display_title}")
```
```typescript TypeScript
// List Anthropic-managed Skills
const skills = await client.beta.skills.list({ source: "anthropic" });
for (const skill of skills.data) {
console.log(`${skill.id}: ${skill.display_title}`);
}
```
```csharp C#
// List Anthropic-managed Skills
var skills = await client.Beta.Skills.List(new SkillListParams { Source = "anthropic" });
foreach (var skill in skills.Items)
{
Console.WriteLine($"{skill.ID}: {skill.DisplayTitle}");
}
```
```go Go
// List Anthropic-managed Skills
skills, err := client.Beta.Skills.List(ctx, anthropic.BetaSkillListParams{
Source: anthropic.String("anthropic"),
})
if err != nil {
panic(err)
}
for _, skill := range skills.Data {
fmt.Printf("%s: %s\n", skill.ID, skill.DisplayTitle)
}
```
```java Java
// List Anthropic-managed Skills
SkillListPage skills = client.beta().skills().list(
SkillListParams.builder().source("anthropic").build()
);
for (SkillListResponse skill : skills.data()) {
IO.println(skill.id() + ": " + skill.displayTitle().orElse(""));
}
```
```php PHP
// List Anthropic-managed Skills
$skills = $client->beta->skills->list(source: 'anthropic');
foreach ($skills->data as $skill) {
echo "{$skill->id}: {$skill->displayTitle}\n";
}
```
```ruby Ruby
# List Anthropic-managed Skills
skills = client.beta.skills.list(source: "anthropic")
skills.data.each do |skill|
puts "#{skill.id}: #{skill.display_title}"
end
```
</CodeGroup>
You see the following Skills: `pptx`, `xlsx`, `docx`, and `pdf`.
This API returns each Skill's metadata: its name and description. Claude loads this metadata at startup to determine which Skills are available. This is the first level of **progressive disclosure**, where Claude discovers Skills without loading their full instructions yet.
## Step 2: Create a presentation
Use the PowerPoint Skill to create a presentation about renewable energy. Specify Skills using the `container` parameter in the Messages API:
<CodeGroup>
```bash cURL
# Create a message with the PowerPoint Skill
response=$(
curl --fail-with-body -sS https://api.anthropic.com/v1/messages \
-H "content-type: application/json" \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: skills-2025-10-02" \
-d @- <<'EOF'
{
"model": "claude-opus-5",
"max_tokens": 16000,
"container": {
"skills": [{"type": "anthropic", "skill_id": "pptx", "version": "latest"}]
},
"messages": [
{"role": "user", "content": "Create a presentation about renewable energy with 5 slides"}
],
"tools": [{"type": "code_execution_20260521", "name": "code_execution"}]
}
EOF
)
jq -r '"stop_reason=\(.stop_reason), blocks=\(.content | length)"' <<<"$response"
```
```bash CLI
# Create a message with the PowerPoint Skill
response=$(ant beta:messages create --format json \
--beta skills-2025-10-02 <<'YAML'
model: claude-opus-5
max_tokens: 16000
container:
skills:
- type: anthropic
skill_id: pptx
version: latest
messages:
- role: user
content: Create a presentation about renewable energy with 5 slides
tools:
- type: code_execution_20260521
name: code_execution
YAML
)
jq -r '"stop_reason=\(.stop_reason), blocks=\(.content | length)"' <<<"$response"
```
```python Python
# Create a message with the PowerPoint Skill
response = client.beta.messages.create(
model="claude-opus-5",
max_tokens=16000,
betas=["skills-2025-10-02"],
container={
"skills": [{"type": "anthropic", "skill_id": "pptx", "version": "latest"}]
},
messages=[
{
"role": "user",
"content": "Create a presentation about renewable energy with 5 slides",
}
],
tools=[{"type": "code_execution_20260521", "name": "code_execution"}],
)
print(f"stop_reason={response.stop_reason}, blocks={len(response.content)}")
```
```typescript TypeScript
// Create a message with the PowerPoint Skill
const response = await client.beta.messages.create({
model: "claude-opus-5",
max_tokens: 16000,
betas: ["skills-2025-10-02"],
container: {
skills: [{ type: "anthropic", skill_id: "pptx", version: "latest" }],
},
messages: [
{
role: "user",
content: "Create a presentation about renewable energy with 5 slides",
},
],
tools: [{ type: "code_execution_20260521", name: "code_execution" }],
});
console.log(
`stop_reason=${response.stop_reason}, blocks=${response.content.length}`,
);
```
```csharp C#
// Create a message with the PowerPoint Skill
var response = await client.Beta.Messages.Create(new MessageCreateParams
{
Model = Model.ClaudeOpus5,
MaxTokens = 16000,
Betas = ["skills-2025-10-02"],
Container = new BetaContainerParams
{
Skills =
[
new BetaSkillParams
{
Type = BetaSkillParamsType.Anthropic,
SkillID = "pptx",
Version = "latest",
},
],
},
Messages =
[
new BetaMessageParam
{
Role = Role.User,
Content = "Create a presentation about renewable energy with 5 slides",
},
],
Tools = [new BetaCodeExecutionTool20260521()],
});
Console.WriteLine($"stop_reason={response.StopReason?.Raw()}, blocks={response.Content.Count}");
```
```go Go
// Create a message with the PowerPoint Skill
response, err := client.Beta.Messages.New(ctx, anthropic.BetaMessageNewParams{
Model: anthropic.ModelClaudeOpus5,
MaxTokens: 16000,
Betas: []anthropic.AnthropicBeta{
anthropic.AnthropicBetaSkills2025_10_02,
},
Container: anthropic.BetaMessageNewParamsContainerUnion{
OfContainers: &anthropic.BetaContainerParams{
Skills: []anthropic.BetaSkillParams{
{
Type: anthropic.BetaSkillParamsTypeAnthropic,
SkillID: "pptx",
Version: anthropic.String("latest"),
},
},
},
},
Messages: []anthropic.BetaMessageParam{
anthropic.NewBetaUserMessage(
anthropic.NewBetaTextBlock("Create a presentation about renewable energy with 5 slides"),
),
},
Tools: []anthropic.BetaToolUnionParam{
{OfCodeExecutionTool20260521: &anthropic.BetaCodeExecutionTool20260521Param{}},
},
})
if err != nil {
panic(err)
}
fmt.Printf("stop_reason=%s, blocks=%d\n", response.StopReason, len(response.Content))
```
```java Java
// Create a message with the PowerPoint Skill
BetaMessage response = client.beta().messages().create(
MessageCreateParams.builder()
.model(Model.CLAUDE_OPUS_5)
.maxTokens(16000)
.addBeta(AnthropicBeta.SKILLS_2025_10_02)
.container(
BetaContainerParams.builder()
.addSkill(
BetaSkillParams.builder()
.type(BetaSkillParams.Type.ANTHROPIC)
.skillId("pptx")
.version("latest")
Cut at 300 lines. The page has the rest.
No line in this hunk matches that.