カスタムSkillsのデプロイとAPIからの利用
Skillsは移植性が高く、一度作成すればさまざまな環境で利用できます。ここでは、週報作成用のカスタムSkillsを作成し、デプロイして、Claude SDKを使って呼び出す方法を解説します。週報の元となる内容は本来SlackやGitHubの活動履歴から自動的に取得する仕組みが必要ですが、今回は既にまとめられている前提でSkillsの操作を中心に進めます。実際に使用したコードはZIPファイルとして配布します。
Nodeプロジェクトの初期化作業については省略します。詳細内容はZIPファイル内のREADME.mdに記載しています。
SKILL.mdの定義は以下の通りです。作成のベストプラクティスに沿って、metadataを定義しています。
--- name: writing-weekly-reports description: 週報作成を支援するスキル。Progress(進捗)、Plans(計画)、Problems(課題)の3要素で構成される簡潔なチーム活動レポートを作成します。週次の定期報告、プロジェクト進捗報告、チーム状況共有の作成時にこのスキルを使用してください。 ---
nameは「作業内容+ing」の動名詞形式で定義しています。descriptionには作業内容と使用タイミングを記述しています。
bodyには、より詳細な説明とBundled filesのパスを記載しています。
## このスキルを使用するタイミング 以下のような週報・進捗報告を作成する際に使用します: - 週次の3P更新 (Progress, Plans, Problems) - チームの週報・週次レポート - プロジェクトの週次進捗報告 - リーダーシップへの定期報告 ## スキルの使用方法 週報を作成する手順: 1. **チーム名と対象期間を確認**する 2. **ガイドラインファイルを読み込む**: - `examples/weekly-report.md` - Progress/Plans/Problemsの週報作成ガイド 3. **ガイドラインに従って週報を作成**する(形式、トーン、コンテンツ収集方法に従う)
Bundled filesであるexamples/weekly-report.mdには、フォーマットの指定と、他に使えるツールの使い方の説明も含まれており、拡張性を持たせています。以下に一部を抜粋します。
## フォーマット 形式は常に同じで、非常に厳密なフォーマットです。これ以外のフォーマットは決して使用しないでください。チームと更新の雰囲気を捉えた楽しい絵文字を選択してください。 [絵文字を選択] [チーム名] (対象期間、通常は1週間) Progress: [1-3文のコンテンツ] Plans: [1-3文のコンテンツ] Problems: [1-3文のコンテンツ] 各セクションは1-3文以内にすること: 明確で要点を押さえたもの。データドリブンで、可能な限りメトリクスを含めるべきです。トーンは非常に事実ベースで、過度に装飾的な文体ではありません。
完成したSkillsのディレクトリ構成は下記の通りです。
writing-weekly-reports/
├── SKILL.md
└── examples/
└── weekly-report.md
次に、このディレクトリをZIPファイルにしています。完成したZIPファイルはwriting-weekly-reports.zipになります。
続いて、Skillsをデプロイするファイルを作成しています。ファイル名はdeploy.tsとしています。
import Anthropic, { toFile } from "@anthropic-ai/sdk";
import fs from "fs";
if (!process.env.ANTHROPIC_API_KEY) {
throw new Error("Please set the ANTHROPIC_API_KEY environment variable.");
}
const client = new Anthropic({
apiKey: process.env.ANTHROPIC_API_KEY,
});
const skill = await client.beta.skills.create({
display_title: "Weekly Report Generator",
files: [
await toFile(
fs.createReadStream("writing-weekly-reports.zip"), // 作成したZIPを指定
"writing-weekly-reports.zip"
),
],
betas: ["skills-2025-10-02"],
});
console.log("✅ Skill created successfully!");
console.log("Skill ID:", skill.id);
console.log("Display Title:", skill.display_title);
package.json に、このスクリプトを実行するための設定を追加しています。
...
"scripts": {
"deploy": "tsx deploy.ts",
},
npm run deployで実際にデプロイを実行すると、下記のような出力が確認できます。
% npm run deploy > code-spaces@1.0.0 deploy > tsx deploy.ts ✅ Skill created successfully! Skill ID: skill_01T7jNtgqNumjWmasXXXXX Display Title: Weekly Report Generator
デプロイが完了したら、実際に利用できる Skills を一覧で確認できます。
...省略
for await (const skillListResponse of client.beta.skills.list()) {
console.log(skillListResponse.id);
}
出力結果は下記の通りです。デプロイされているカスタムSkillsに加えて、公式のSkillsも確認できます。
skill_01T7jNtgqNumjWmasXXXXX xlsx pptx pdf docx
次に、実際にSkillsを使って週報を作成しています。サンプルの週間活動記録はmaterials/sample-weekly-report.mdにあります。
main.tsの実装の一部は下記の通りです。最初に必要な活動記録を読み取り、その後、利用するSkillsと実行環境を指定しています。
// 1.活動記録を読み取り
const markdownContent = fs.readFileSync(
"materials/sample-weekly-report.md",
"utf-8"
);
// 2.メインロジック-利用するskillとコード実行環境の指定と週報の作成
const response = await 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_01T7jNtgqNumjWmasXXXXX",
version: "latest",
},
],
},
messages: [
{
role: "user",
content:
"下記の資料を参考にして、週報を作成してください。\n\n" + markdownContent,
},
],
tools: [
{
type: "code_execution_20250825",
name: "code_execution",
},
],
});
console.log(response.content);
npm run startを実行すると、複数のツールが実行され、最終的に週報が作成されます。通常、出力ファイルはAnthropicのSandboxに保存されますが、ローカルに取り出したい場合は、下記のようなコードをmain.tsのメインロジックの下に追加することで、ローカルにダウンロードできます。
function extractFileIds(response: any): string[] {
const fileIds: string[] = [];
for (const item of response.content) {
if (item.type === 'bash_code_execution_tool_result') {
const contentItem = item.content;
if (contentItem.type === 'bash_code_execution_result') {
for (const file of contentItem.content) {
if ('file_id' in file) {
fileIds.push(file.file_id);
}
}
}
}
}
return fileIds;
}
for (const fileId of extractFileIds(response)) {
const fileMetadata = await client.beta.files.retrieveMetadata(fileId, {
betas: ['files-api-2025-04-14']
});
const fileContent = await client.beta.files.download(fileId, {
betas: ['files-api-2025-04-14']
});
fs.writeFileSync(fileMetadata.filename, Buffer.from(await fileContent.arrayBuffer()));
console.log(`Downloaded: ${fileMetadata.filename}`);
}
デプロイされたSkillsは同じ組織内で利用でき、一貫性のある作業を実現できます。また、バージョン管理も可能です。ただし、1回のリクエストに使えるSkillsは最大8つまでです。適切に組み合わせて、業務効率化を図りましょう。
まとめ
本記事では、Claude Skillsの実践的な設計と実装方法について解説しました。
Skillsの登場によって、属人化が解消される可能性があるのではないかと考えています。一度Skillsを作成すれば、その後AIエージェントがベテランのように作業を遂行してくれるため、単純作業による工数の浪費を削減できます。スタートアップにとっては、一人ユニコーン企業の実現といった少人数でも高い生産性を目指すための手段として有効になり得るほか、大企業にとっても、ベテラン社員の知識の引き継ぎ先がAIエージェントになる可能性は大いに期待できます。
また、現在はClaude Codeのプラグインから公式Skillsをダウンロードする仕組みが存在しますが、今後Agent Skillsがスタンダードとして確立された際には、Skillsの有料マーケットプレイスが生まれるのではないかと期待しています。
