Skills 入出力仕様設計
優れた Skill は、タスクを完了できるだけでなく、「何を受け取るか」「何を生み出すか」を明確に定義する必要があります。
適切な入出力仕様は、Skill が確実に動作するための基盤です。
なぜ入出力仕様を定義するのか
Skills は実際のユーザーリクエストを扱うため、入力形式はさまざまです。
明確な仕様がない Skill の場合、Claude が入力の意図を推測することになり、動作が不安定になります。
仕様は制限ではなく、Claude に明確な行動範囲を与え、曖昧さを減らし、出力の一貫性を高めるものです。
入力仕様の4つの要素
| 要素 | 説明 | 例 |
|---|---|---|
| 入力タイプ | ファイル、テキスト、URL、パラメータなど | ユーザーがアップロードした PDF ファイル |
| 形式の要件 | ファイル拡張子、エンコーディング、構造 | .csv、UTF-8 エンコーディング、1行目がヘッダー |
| 必須/任意 | どの入力が必須か | ファイルパスは必須、列名は任意 |
| デフォルトの動作 | 任意パラメータが指定されていない場合の処理方法 | 列名が指定されていない場合はすべての列を分析 |
SKILL.md で入力仕様を定義する
例
## 入力仕様
### 必須入力
- **データファイル**:ユーザーがアップロードした`.csv` 或 `.xlsx`ファイル
- エンコーディング:UTF-8(CSV)または標準の Excel 形式
- 1行目は列見出しである必要があります
- ファイルサイズは 50MB 以下
### 任意入力
- **対象列**:分析する列を指定します。デフォルトではすべての数値列を分析します
- **出力形式**:`table`(テーブル)または`text`(テキスト要約)、デフォルト`table`
- **精度**:小数部の桁数、デフォルト2 位
### 入力がない場合の処理
ファイルがアップロードされていない場合は、ユーザーに次のように伝えます:「分析する CSV または Excel ファイルをアップロードしてください。」
ファイル形式がサポートされていない場合は、ユーザーに伝え、サポートされている形式のリストを表示します。
### 必須入力
- **データファイル**:ユーザーがアップロードした`.csv` 或 `.xlsx`ファイル
- エンコーディング:UTF-8(CSV)または標準の Excel 形式
- 1行目は列見出しである必要があります
- ファイルサイズは 50MB 以下
### 任意入力
- **対象列**:分析する列を指定します。デフォルトではすべての数値列を分析します
- **出力形式**:`table`(テーブル)または`text`(テキスト要約)、デフォルト`table`
- **精度**:小数部の桁数、デフォルト2 位
### 入力がない場合の処理
ファイルがアップロードされていない場合は、ユーザーに次のように伝えます:「分析する CSV または Excel ファイルをアップロードしてください。」
ファイル形式がサポートされていない場合は、ユーザーに伝え、サポートされている形式のリストを表示します。
出力仕様の3つの次元
次元1:出力内容
何を出力するかを明確に指定し、漏れや過剰な出力を防ぎます。
例
## 出力内容
分析完了後、以下の内容を提供します:
1. **統計サマリーテーブル**:各列の行数、平均値、最大/最小値、空値の数
2. **データ品質レポート**:検出された問題をリストアップ(例:空値が多すぎる、データ型の混在)
3. **ファイルパス**:出力ファイルを生成した場合は、ダウンロードパスを提供
分析完了後、以下の内容を提供します:
1. **統計サマリーテーブル**:各列の行数、平均値、最大/最小値、空値の数
2. **データ品質レポート**:検出された問題をリストアップ(例:空値が多すぎる、データ型の混在)
3. **ファイルパス**:出力ファイルを生成した場合は、ダウンロードパスを提供
次元2:出力形式
出力をどのような形式で表示するか、およびどこに保存するかを指定します。
| 出力先 | 形式 | 保存先 |
|---|---|---|
| 会話内で表示 | Markdown テーブル、コードブロック | 保存不要 |
| ダウンロード可能なファイル | .xlsx、.pdf、.html | /mnt/user-data/outputs/ |
| 中間結果 | JSON、CSV | /home/claude/(一時) |
次元3:出力タイミング
いつ出力するかを指定します。一度にすべて出力するか、ステップごとに段階的に表示するかを指定します。
例
## 出力タイミング
1. **ファイル読み込み後**:ファイルの基本情報(行数、列数、サイズ)をすぐにユーザーに伝えます
2. **分析中**:分析にかかる時間が10秒を超える場合は、先に進捗通知を出力
3. **分析完了後**:完全な統計サマリーを出力
4. **ファイル生成後**:ファイルパスを表示し、present_files ツールを呼び出します
1. **ファイル読み込み後**:ファイルの基本情報(行数、列数、サイズ)をすぐにユーザーに伝えます
2. **分析中**:分析にかかる時間が10秒を超える場合は、先に進捗通知を出力
3. **分析完了後**:完全な統計サマリーを出力
4. **ファイル生成後**:ファイルパスを表示し、present_files ツールを呼び出します
完全な入出力仕様の例
以下は、ドキュメント要約 Skill の完全な入出力仕様です:
例
---
name: doc-summarizer
description: >
ユーザーがアップロードしたドキュメントから要約を抽出します。PDF、Word(.docx)、プレーンテキストに対応しています。
ユーザーがドキュメントの内容を素早く把握したい、重要な情報を抽出したい、ドキュメントの要約を生成したい場合に使用します。
---
# ドキュメント要約器
## 入力仕様
### 必須
- ドキュメントファイル(.pdf、.docx または .txt)
### 任意
- **要約の長さ**:`short`(3文)/ `medium`(1段落)/ `long`(3段落)、デフォルト`medium`
- **言語**:出力言語。デフォルトは原文と同じ
- **重点方向**:例:「結論部分に重点を置く」、「数値データを抽出する」
### 異常処理
- ファイルが 10MB を超える場合:ファイルが大きすぎることをユーザーに伝え、分割してアップロードするよう提案
- 形式がサポートされていない場合:サポートされている形式をリストアップし、ユーザーに再アップロードを依頼
- ドキュメントが画像スキャンで文字を認識できない場合:処理できないことを伝え、OCR ツールでの前処理を提案
## 出力仕様
### 出力内容(順番に)
1. ドキュメントの基本情報:タイトル(ある場合)、ページ数、推定文字数
2. コア要約:ユーザーが指定した長さで出力
3. キーワード:5-8個のテーマキーワード
### 出力形式
- すべて会話内で Markdown 形式を使用して表示
ユーザーが明示的に保存を要求しない限り、追加ファイルは生成しない
### 出力例
---
**ドキュメント**:サンプル-annual-report.pdf(24ページ、約12,000 字)
**要約**:本レポートでは サンプル の年間ビジネス実績を振り返り、ユーザー数は前年比で増加35%,
技術ドキュメントのカバレッジは98%。収入構造は多様化が進み、広告と会員収入の比率は横ばいです。
**キーワード**:年間レポート、ユーザー成長、技術ドキュメント、収入構造、多様化
---
name: doc-summarizer
description: >
ユーザーがアップロードしたドキュメントから要約を抽出します。PDF、Word(.docx)、プレーンテキストに対応しています。
ユーザーがドキュメントの内容を素早く把握したい、重要な情報を抽出したい、ドキュメントの要約を生成したい場合に使用します。
---
# ドキュメント要約器
## 入力仕様
### 必須
- ドキュメントファイル(.pdf、.docx または .txt)
### 任意
- **要約の長さ**:`short`(3文)/ `medium`(1段落)/ `long`(3段落)、デフォルト`medium`
- **言語**:出力言語。デフォルトは原文と同じ
- **重点方向**:例:「結論部分に重点を置く」、「数値データを抽出する」
### 異常処理
- ファイルが 10MB を超える場合:ファイルが大きすぎることをユーザーに伝え、分割してアップロードするよう提案
- 形式がサポートされていない場合:サポートされている形式をリストアップし、ユーザーに再アップロードを依頼
- ドキュメントが画像スキャンで文字を認識できない場合:処理できないことを伝え、OCR ツールでの前処理を提案
## 出力仕様
### 出力内容(順番に)
1. ドキュメントの基本情報:タイトル(ある場合)、ページ数、推定文字数
2. コア要約:ユーザーが指定した長さで出力
3. キーワード:5-8個のテーマキーワード
### 出力形式
- すべて会話内で Markdown 形式を使用して表示
ユーザーが明示的に保存を要求しない限り、追加ファイルは生成しない
### 出力例
---
**ドキュメント**:サンプル-annual-report.pdf(24ページ、約12,000 字)
**要約**:本レポートでは サンプル の年間ビジネス実績を振り返り、ユーザー数は前年比で増加35%,
技術ドキュメントのカバレッジは98%。収入構造は多様化が進み、広告と会員収入の比率は横ばいです。
**キーワード**:年間レポート、ユーザー成長、技術ドキュメント、収入構造、多様化
---
スクリプトレベルの入出力取り決め
Skill にスクリプトが付属する場合、Claude が結果を解析しやすいよう、構造化された入出力形式として JSON を使用することをお勧めします。
例
# ファイルパス:scripts/summarize.py
# 標準化された JSON 入出力パターン
import json
import sys
def summarize(file_path: str, length: str = "medium") -> dict:
"""
ドキュメントの要約を実行
パラメータ:
file_path: ドキュメントパス(必須)
length: 要約の長さ、short/medium/long(任意、デフォルトは medium)
戻り値:
dict。status、data、または error フィールドを含む
"""
try:
# ドキュメント読み込みのシミュレーション
with open(file_path, "r", encoding="utf-8") as f:
content = f.read()
# 要約生成のシミュレーション
summary = content[:200] + "..." # 実際には本物の要約ロジックを呼び出すべき
return {
"status": "success",
"data": {
"word_count": len(content),
"summary": summary,
"length": length
}
}
except FileNotFoundError:
return {"status": "error", "error": f"ファイルが存在しません:{file_path}"}
except Exception as e:
return {"status": "error", "error": str(e)}
if __name__ == "__main__":
file_path = sys.argv[1] if len(sys.argv) > 1 else ""
length = sys.argv[2] if len(sys.argv) > 2 else "medium"
result = summarize(file_path, length)
# 統一された JSON を出力し、Claude が解析しやすくする
print(json.dumps(result, ensure_ascii=False, indent=2))
# 標準化された JSON 入出力パターン
import json
import sys
def summarize(file_path: str, length: str = "medium") -> dict:
"""
ドキュメントの要約を実行
パラメータ:
file_path: ドキュメントパス(必須)
length: 要約の長さ、short/medium/long(任意、デフォルトは medium)
戻り値:
dict。status、data、または error フィールドを含む
"""
try:
# ドキュメント読み込みのシミュレーション
with open(file_path, "r", encoding="utf-8") as f:
content = f.read()
# 要約生成のシミュレーション
summary = content[:200] + "..." # 実際には本物の要約ロジックを呼び出すべき
return {
"status": "success",
"data": {
"word_count": len(content),
"summary": summary,
"length": length
}
}
except FileNotFoundError:
return {"status": "error", "error": f"ファイルが存在しません:{file_path}"}
except Exception as e:
return {"status": "error", "error": str(e)}
if __name__ == "__main__":
file_path = sys.argv[1] if len(sys.argv) > 1 else ""
length = sys.argv[2] if len(sys.argv) > 2 else "medium"
result = summarize(file_path, length)
# 統一された JSON を出力し、Claude が解析しやすくする
print(json.dumps(result, ensure_ascii=False, indent=2))
{
"status": "success",
"data": {
"word_count": 12480,
"summary": "サンプル 年度报告回顾了平台在过去一年的业务表现...",
"length": "medium"
}
}
その他の拡張スクリプトの出力形式として JSON を使用することで、Claude は自由テキストを推測して解釈する必要がなく、結果を安定して解析できます。