エージェントスキルは、指示、スクリプト、リソースの整理されたフォルダを通じてClaudeの機能を拡張します。このガイドでは、Claude APIで事前構築されたスキルとカスタムスキルの両方を使用する方法を示します。
リクエスト/レスポンススキーマとすべてのパラメータを含む完全なAPIリファレンスについては、以下を参照してください:
エージェントスキルのアーキテクチャと実世界での応用についての詳細は、エンジニアリングブログをお読みください:エージェントスキルで実世界に対応するエージェントを装備する。
スキルはコード実行ツールを通じてMessages APIと統合されます。Anthropicが管理する事前構築されたスキルを使用する場合でも、アップロードしたカスタムスキルを使用する場合でも、統合の形状は同じです。どちらもコード実行が必要で、同じcontainer構造を使用します。
スキルはソースに関係なくMessages APIで同じように統合されます。containerパラメータでスキルを指定し、skill_id、type、およびオプションのversionを指定すると、コード実行環境で実行されます。
2つのソースからスキルを使用できます:
| 側面 | Anthropicスキル | カスタムスキル |
|---|---|---|
| Type値 | anthropic | custom |
| スキルID | 短い名前:pptx、xlsx、docx、pdf | 生成済み:skill_01AbCdEfGhIjKlMnOpQrStUv |
| バージョン形式 | 日付ベース:20251013またはlatest | エポックタイムスタンプ:1759178010641129またはlatest |
| 管理 | Anthropicによって事前構築および保守 |
両方のスキルソースはリストスキルエンドポイントによって返されます(sourceパラメータを使用してフィルタリング)。統合の形状と実行環境は同じです。唯一の違いはスキルの出所と管理方法です。
スキルを使用するには、以下が必要です:
code-execution-2025-08-25 - コード実行を有効にする(スキルに必須)skills-2025-10-02 - スキルAPIを有効にするfiles-api-2025-04-14 - コンテナへのファイルのアップロード/ダウンロード用スキルはMessages APIのcontainerパラメータを使用して指定されます。リクエストごとに最大8つのスキルを含めることができます。
構造はAnthropicスキルとカスタムスキルの両方で同じです。必須のtypeとskill_idを指定し、オプションでversionを含めて特定のバージョンにピン留めします:
スキルがドキュメント(Excel、PowerPoint、PDF、Word)を作成する場合、レスポンスでfile_id属性が返されます。これらのファイルをダウンロードするにはFiles APIを使用する必要があります。
仕組み:
file_idが含まれる例:Excelファイルの作成とダウンロード
追加のFiles API操作:
Files APIの完全な詳細については、Files APIドキュメントを参照してください。
コンテナIDを指定して、複数のメッセージ間で同じコンテナを再利用します:
スキルは複数のターンが必要な操作を実行する場合があります。pause_turn停止理由を処理します:
レスポンスにpause_turn停止理由が含まれる場合があります。これは、APIが長時間実行されるスキル操作を一時停止したことを示します。レスポンスをそのまま後続のリクエストで提供して、Claudeがそのターンを続行できるようにするか、会話を中断して追加のガイダンスを提供する場合はコンテンツを変更できます。
複雑なワークフローを処理するために、単一のリクエストで複数のスキルを組み合わせます:
カスタムスキルをアップロードして、ワークスペースで利用可能にします。ディレクトリパスまたは個別のファイルオブジェクトを使用してアップロードできます。
要件:
name:最大64文字、小文字/数字/ハイフンのみ、XMLタグなし、予約語なし(「anthropic」、「claude」)description:最大1024文字、空でない、XMLタグなし完全なリクエスト/レスポンススキーマについては、スキル作成APIリファレンスを参照してください。
ワークスペースで利用可能なすべてのスキル(Anthropicの事前構築されたスキルとカスタムスキルの両方)を取得します。sourceパラメータを使用してスキルタイプでフィルタリングします:
ページネーションとフィルタリングオプションについては、リストスキルAPIリファレンスを参照してください。
特定のスキルの詳細を取得します:
スキルを削除するには、まずすべてのバージョンを削除する必要があります:
既存のバージョンを持つスキルを削除しようとすると、400エラーが返されます。
スキルはバージョン管理をサポートして、更新を安全に管理します:
Anthropic管理スキル:
20251013カスタムスキル:
1759178010641129"latest"を使用して常に最新バージョンを取得します完全な詳細については、スキルバージョン作成APIリファレンスを参照してください。
コンテナでスキルを指定する場合:
/skills/{directory}/にコピーされます段階的な開示アーキテクチャにより、効率的なコンテキスト使用が保証されます。Claudeは必要な場合にのみ完全なスキル指示を読み込みます。
ブランド&コミュニケーション
プロジェクト管理
ビジネス運営
コンテンツ作成
データ分析
開発&自動化
ExcelとカスタムDCF分析スキルを組み合わせます:
name:最大64文字、小文字/数字/ハイフンのみ、XMLタグなし、予約語なしdescription:最大1024文字、空でない、XMLタグなしスキルはコード実行コンテナで実行され、以下の制限があります:
利用可能なパッケージについては、コード実行ツールドキュメントを参照してください。
複数のドキュメントタイプまたはドメインを含むタスクの場合、スキルを組み合わせます:
良いユースケース:
避けるべき:
本番環境の場合:
# 安定性のために特定のバージョンにピン留めする
container={
"skills": [{
"type": "custom",
"skill_id": "skill_01AbCdEfGhIjKlMnOpQrStUv",
"version": "1759178010641129" # 特定のバージョン
}]
}開発の場合:
# アクティブな開発に最新を使用する
container={
"skills": [{
"type": "custom",
"skill_id": "skill_01AbCdEfGhIjKlMnOpQrStUv",
"version": "latest" # 常に最新を取得
}]
}プロンプトキャッシングを使用する場合、コンテナ内のスキルリストを変更するとキャッシュが破損することに注意してください:
最適なキャッシングパフォーマンスのために、リクエスト間でスキルリストを一貫性のあるものに保ちます。
スキル関連のエラーを適切に処理します:
| スキルAPIを通じてアップロードおよび管理 |
| 可用性 | すべてのユーザーが利用可能 | ワークスペースに限定 |
import anthropic
client = anthropic.Anthropic()
response = client.beta.messages.create(
model="claude-sonnet-4-5-20250929",
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 presentation about renewable energy"
}],
tools=[{
"type": "code_execution_20250825",
"name": "code_execution"
}]
)import anthropic
client = anthropic.Anthropic()
# ステップ1:スキルを使用してファイルを作成する
response = client.beta.messages.create(
model="claude-sonnet-4-5-20250929",
max_tokens=4096,
betas=["code-execution-2025-08-25", "skills-2025-10-02"],
container={
"skills": [
{"type": "anthropic", "skill_id": "xlsx", "version": "latest"}
]
},
messages=[{
"role": "user",
"content": "Create an Excel file with a simple budget spreadsheet"
}],
tools=[{"type": "code_execution_20250825", "name": "code_execution"}]
)
# ステップ2:レスポンスからファイルIDを抽出する
def extract_file_ids(response):
file_ids = []
for item in response.content:
if item.type == 'bash_code_execution_tool_result':
content_item = item.content
if content_item.type == 'bash_code_execution_result':
for file in content_item.content:
if hasattr(file, 'file_id'):
file_ids.append(file.file_id)
return file_ids
# ステップ3:Files APIを使用してファイルをダウンロードする
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"]
)
# ステップ4:ディスクに保存する
file_content.write_to_file(file_metadata.filename)
print(f"Downloaded: {file_metadata.filename}")# ファイルメタデータを取得する
file_info = client.beta.files.retrieve_metadata(
file_id=file_id,
betas=["files-api-2025-04-14"]
)
print(f"Filename: {file_info.filename}, Size: {file_info.size_bytes} bytes")
# すべてのファイルをリストする
files = client.beta.files.list(betas=["files-api-2025-04-14"])
for file in files.data:
print(f"{file.filename} - {file.created_at}")
# ファイルを削除する
client.beta.files.delete(
file_id=file_id,
betas=["files-api-2025-04-14"]
)# 最初のリクエストがコンテナを作成する
response1 = client.beta.messages.create(
model="claude-sonnet-4-5-20250929",
max_tokens=4096,
betas=["code-execution-2025-08-25", "skills-2025-10-02"],
container={
"skills": [
{"type": "anthropic", "skill_id": "xlsx", "version": "latest"}
]
},
messages=[{"role": "user", "content": "Analyze this sales data"}],
tools=[{"type": "code_execution_20250825", "name": "code_execution"}]
)
# 同じコンテナで会話を続ける
messages = [
{"role": "user", "content": "Analyze this sales data"},
{"role": "assistant", "content": response1.content},
{"role": "user", "content": "What was the total revenue?"}
]
response2 = client.beta.messages.create(
model="claude-sonnet-4-5-20250929",
max_tokens=4096,
betas=["code-execution-2025-08-25", "skills-2025-10-02"],
container={
"id": response1.container.id, # コンテナを再利用する
"skills": [
{"type": "anthropic", "skill_id": "xlsx", "version": "latest"}
]
},
messages=messages,
tools=[{"type": "code_execution_20250825", "name": "code_execution"}]
)messages = [{"role": "user", "content": "Process this large dataset"}]
max_retries = 10
response = client.beta.messages.create(
model="claude-sonnet-4-5-20250929",
max_tokens=4096,
betas=["code-execution-2025-08-25", "skills-2025-10-02"],
container={
"skills": [
{"type": "custom", "skill_id": "skill_01AbCdEfGhIjKlMnOpQrStUv", "version": "latest"}
]
},
messages=messages,
tools=[{"type": "code_execution_20250825", "name": "code_execution"}]
)
# 長時間操作のためにpause_turnを処理する
for i in range(max_retries):
if response.stop_reason != "pause_turn":
break
messages.append({"role": "assistant", "content": response.content})
response = client.beta.messages.create(
model="claude-sonnet-4-5-20250929",
max_tokens=4096,
betas=["code-execution-2025-08-25", "skills-2025-10-02"],
container={
"id": response.container.id,
"skills": [
{"type": "custom", "skill_id": "skill_01AbCdEfGhIjKlMnOpQrStUv", "version": "latest"}
]
},
messages=messages,
tools=[{"type": "code_execution_20250825", "name": "code_execution"}]
)response = client.beta.messages.create(
model="claude-sonnet-4-5-20250929",
max_tokens=4096,
betas=["code-execution-2025-08-25", "skills-2025-10-02"],
container={
"skills": [
{
"type": "anthropic",
"skill_id": "xlsx",
"version": "latest"
},
{
"type": "anthropic",
"skill_id": "pptx",
"version": "latest"
},
{
"type": "custom",
"skill_id": "skill_01AbCdEfGhIjKlMnOpQrStUv",
"version": "latest"
}
]
},
messages=[{
"role": "user",
"content": "Analyze sales data and create a presentation"
}],
tools=[{
"type": "code_execution_20250825",
"name": "code_execution"
}]
)import anthropic
client = anthropic.Anthropic()
# オプション1:files_from_dirヘルパーを使用する(Pythonのみ、推奨)
from anthropic.lib import files_from_dir
skill = client.beta.skills.create(
display_title="Financial Analysis",
files=files_from_dir("/path/to/financial_analysis_skill"),
betas=["skills-2025-10-02"]
)
# オプション2:zipファイルを使用する
skill = client.beta.skills.create(
display_title="Financial Analysis",
files=[("skill.zip", open("financial_analysis_skill.zip", "rb"))],
betas=["skills-2025-10-02"]
)
# オプション3:ファイルタプルを使用する(ファイル名、ファイルコンテンツ、MIMEタイプ)
skill = client.beta.skills.create(
display_title="Financial Analysis",
files=[
("financial_skill/SKILL.md", open("financial_skill/SKILL.md", "rb"), "text/markdown"),
("financial_skill/analyze.py", open("financial_skill/analyze.py", "rb"), "text/x-python"),
],
betas=["skills-2025-10-02"]
)
print(f"Created skill: {skill.id}")
print(f"Latest version: {skill.latest_version}")# すべてのスキルをリストする
skills = client.beta.skills.list(
betas=["skills-2025-10-02"]
)
for skill in skills.data:
print(f"{skill.id}: {skill.display_title} (source: {skill.source})")
# カスタムスキルのみをリストする
custom_skills = client.beta.skills.list(
source="custom",
betas=["skills-2025-10-02"]
)skill = client.beta.skills.retrieve(
skill_id="skill_01AbCdEfGhIjKlMnOpQrStUv",
betas=["skills-2025-10-02"]
)
print(f"Skill: {skill.display_title}")
print(f"Latest version: {skill.latest_version}")
print(f"Created: {skill.created_at}")# ステップ1:すべてのバージョンを削除する
versions = client.beta.skills.versions.list(
skill_id="skill_01AbCdEfGhIjKlMnOpQrStUv",
betas=["skills-2025-10-02"]
)
for version in versions.data:
client.beta.skills.versions.delete(
skill_id="skill_01AbCdEfGhIjKlMnOpQrStUv",
version=version.version,
betas=["skills-2025-10-02"]
)
# ステップ2:スキルを削除する
client.beta.skills.delete(
skill_id="skill_01AbCdEfGhIjKlMnOpQrStUv",
betas=["skills-2025-10-02"]
)# 新しいバージョンを作成する
from anthropic.lib import files_from_dir
new_version = client.beta.skills.versions.create(
skill_id="skill_01AbCdEfGhIjKlMnOpQrStUv",
files=files_from_dir("/path/to/updated_skill"),
betas=["skills-2025-10-02"]
)
# 特定のバージョンを使用する
response = client.beta.messages.create(
model="claude-sonnet-4-5-20250929",
max_tokens=4096,
betas=["code-execution-2025-08-25", "skills-2025-10-02"],
container={
"skills": [{
"type": "custom",
"skill_id": "skill_01AbCdEfGhIjKlMnOpQrStUv",
"version": new_version.version
}]
},
messages=[{"role": "user", "content": "Use updated Skill"}],
tools=[{"type": "code_execution_20250825", "name": "code_execution"}]
)
# 最新バージョンを使用する
response = client.beta.messages.create(
model="claude-sonnet-4-5-20250929",
max_tokens=4096,
betas=["code-execution-2025-08-25", "skills-2025-10-02"],
container={
"skills": [{
"type": "custom",
"skill_id": "skill_01AbCdEfGhIjKlMnOpQrStUv",
"version": "latest"
}]
},
messages=[{"role": "user", "content": "Use latest Skill version"}],
tools=[{"type": "code_execution_20250825", "name": "code_execution"}]
)# カスタムDCF分析スキルを作成する
from anthropic.lib import files_from_dir
dcf_skill = client.beta.skills.create(
display_title="DCF Analysis",
files=files_from_dir("/path/to/dcf_skill"),
betas=["skills-2025-10-02"]
)
# Excelで使用して財務モデルを作成する
response = client.beta.messages.create(
model="claude-sonnet-4-5-20250929",
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": "Build a DCF valuation model for a SaaS company with the attached financials"
}],
tools=[{"type": "code_execution_20250825", "name": "code_execution"}]
)# 最初のリクエストがキャッシュを作成する
response1 = client.beta.messages.create(
model="claude-sonnet-4-5-20250929",
max_tokens=4096,
betas=["code-execution-2025-08-25", "skills-2025-10-02", "prompt-caching-2024-07-31"],
container={
"skills": [
{"type": "anthropic", "skill_id": "xlsx", "version": "latest"}
]
},
messages=[{"role": "user", "content": "Analyze sales data"}],
tools=[{"type": "code_execution_20250825", "name": "code_execution"}]
)
# スキルの追加/削除がキャッシュを破損する
response2 = client.beta.messages.create(
model="claude-sonnet-4-5-20250929",
max_tokens=4096,
betas=["code-execution-2025-08-25", "skills-2025-10-02", "prompt-caching-2024-07-31"],
container={
"skills": [
{"type": "anthropic", "skill_id": "xlsx", "version": "latest"},
{"type": "anthropic", "skill_id": "pptx", "version": "latest"} # キャッシュミス
]
},
messages=[{"role": "user", "content": "Create a presentation"}],
tools=[{"type": "code_execution_20250825", "name": "code_execution"}]
)try:
response = client.beta.messages.create(
model="claude-sonnet-4-5-20250929",
max_tokens=4096,
betas=["code-execution-2025-08-25", "skills-2025-10-02"],
container={
"skills": [
{"type": "custom", "skill_id": "skill_01AbCdEfGhIjKlMnOpQrStUv", "version": "latest"}
]
},
messages=[{"role": "user", "content": "Process data"}],
tools=[{"type": "code_execution_20250825", "name": "code_execution"}]
)
except anthropic.BadRequestError as e:
if "skill" in str(e):
print(f"Skill error: {e}")
# スキル固有のエラーを処理する
else:
raise効果的なスキル作成のベストプラクティス