fitness-nutrition について
ジム利用者向けのフィットネス・栄養スキルです。wgerとUSDAのデータ検索に加え、オフラインの身体指標・トレーニング計算機を備えています。
主な機能
- 01筋肉、器具、名称で種目を検索
- 02食品の栄養データを検索
- 03BMI、TDEE、体脂肪率を計算
- 041RMとマクロ配分を推定
活用シーン
- 01使用器具に合わせて種目を絞り込む
- 02食品の100gあたりの栄養を確認
- 03必要カロリーや体脂肪率を推定
- 04マクロ栄養素の比率を計画
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ nousresearch/ hermes-agent --skill fitness-nutritionインストール後、Claude Code で/fitness-nutritionを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/FORMULAS.mdscripts/body_calc.pynutrition_search.py詳細
フィットネスと栄養
フィットネスコーチとスポーツ栄養士の専門スキルです。2 つのデータソースとオフライン計算ツールを備え、ジムに通う人が必要とするものをすべて一か所に集約しています。
データソース(すべて無料、pip への依存関係なし):
- wger(https://wger.de/api/v2/) — オープンなエクササイズデータベースです。筋肉、器具、画像を含む 690 種類以上のエクササイズを収録しています。公開エンドポイントでは認証は不要です。
- USDA FoodData Central(https://api.nal.usda.gov/fdc/v1/) — 米国政府の栄養データベースで、380,000 種類以上の食品を収録しています。
DEMO_KEYはすぐに使用できます。より高い利用上限が必要な場合は、無料で登録してください。
オフライン計算ツール(Python 標準ライブラリのみ):
- BMI、TDEE(Mifflin-St Jeor 式)、1 回最大挙上重量(Epley/Brzycki/Lombardi 式)、マクロ栄養素の配分、体脂肪率(US Navy 法)
使用するタイミング
ユーザーが次のことについて質問した場合に、このスキルを使用します。
- エクササイズ、ワークアウト、ジムのルーティン、筋肉群、ワークアウトの分割
- 食品のマクロ栄養素、カロリー、タンパク質量、食事計画、カロリー計算
- 体組成:BMI、体脂肪率、TDEE、カロリーの余剰/不足
- 1 回最大挙上重量の推定、トレーニングの割合、漸進性過負荷
- 減量、増量、維持のためのマクロ栄養素比率
手順
エクササイズの検索(wger API)
wger の公開エンドポイントはすべて JSON を返し、認証は不要です。エクササイズを検索する際は、必ず
format=json と language=2(英語)を指定してください。
手順 1 — ユーザーの希望を特定します:
- 筋肉で検索 →
/api/v2/exercise/?muscles={id}&language=2&status=2&format=jsonを使用 - カテゴリで検索 →
/api/v2/exercise/?category={id}&language=2&status=2&format=jsonを使用 - 器具で検索 →
/api/v2/exercise/?equipment={id}&language=2&status=2&format=jsonを使用 - 名前で検索 →
/api/v2/exercise/search/?term={query}&language=english&format=jsonを使用 - 詳細を取得 →
/api/v2/exerciseinfo/{exercise_id}/?format=jsonを使用
手順 2 — 参照 ID(追加の API 呼び出しは不要です):
エクササイズのカテゴリ:
| ID | カテゴリ |
|---|---|
| 8 | 腕 |
| 9 | 脚 |
| 10 | 腹筋 |
| 11 | 胸 |
| 12 | 背中 |
| 13 | 肩 |
| 14 | ふくらはぎ |
| 15 | 有酸素運動 |
筋肉:
| ID | 筋肉 | ID | 筋肉 |
|---|---|---|---|
| 1 | 上腕二頭筋 | 2 | 三角筋前部 |
| 3 | 前鋸筋 | 4 | 大胸筋 |
| 5 | 外腹斜筋 | 6 | 腓腹筋 |
| 7 | 腹直筋 | 8 | 大臀筋 |
| 9 | 僧帽筋 | 10 | 大腿四頭筋 |
| 11 | 大腿二頭筋 | 12 | 広背筋 |
| 13 | 腕筋 | 14 | 上腕三頭筋 |
| 15 | ヒラメ筋 |
器具:
| ID | 器具 |
|---|---|
| 1 | バーベル |
| 3 | ダンベル |
| 4 | ジムマット |
| 5 | スイスボール |
| 6 | 懸垂バー |
| 7 | なし(自重) |
| 8 | ベンチ |
| 9 | インクラインベンチ |
| 10 | ケトルベル |
手順 3 — 結果を取得して提示します:
# Search exercises by name
QUERY="$1"
ENCODED=$(python -c "import urllib.parse,sys; print(urllib.parse.quote(sys.argv[1]))" "$QUERY")
curl -s "https://wger.de/api/v2/exercise/search/?term=${ENCODED}&language=english&format=json" \
| python -c "
import json,sys
data=json.load(sys.stdin)
for s in data.get('suggestions',[])[:10]:
d=s.get('data',{})
print(f\" ID {d.get('id','?'):>4} | {d.get('name','N/A'):<35} | Category: {d.get('category','N/A')}\")
"
# Get full details for a specific exercise
EXERCISE_ID="$1"
curl -s "https://wger.de/api/v2/exerciseinfo/${EXERCISE_ID}/?format=json" \
| python -c "
import json,sys,html,re
data=json.load(sys.stdin)
trans=[t for t in data.get('translations',[]) if t.get('language')==2]
t=trans[0] if trans else data.get('translations',[{}])[0]
desc=re.sub('<[^>]+>','',html.unescape(t.get('description','N/A')))
print(f\"Exercise : {t.get('name','N/A')}\")
print(f\"Category : {data.get('category',{}).get('name','N/A')}\")
print(f\"Primary : {', '.join(m.get('name_en','') for m in data.get('muscles',[])) or 'N/A'}\")
print(f\"Secondary : {', '.join(m.get('name_en','') for m in data.get('muscles_secondary',[])) or 'none'}\")
print(f\"Equipment : {', '.join(e.get('name','') for e in data.get('equipment',[])) or 'bodyweight'}\")
print(f\"How to : {desc[:500]}\")
imgs=data.get('images',[])
if imgs: print(f\"Image : {imgs[0].get('image','')}\")
"
# List exercises filtering by muscle, category, or equipment
# Combine filters as needed: ?muscles=4&equipment=1&language=2&status=2
FILTER="$1" # e.g. "muscles=4" or "category=11" or "equipment=3"
curl -s "https://wger.de/api/v2/exercise/?${FILTER}&language=2&status=2&limit=20&format=json" \
| python -c "
import json,sys
data=json.load(sys.stdin)
print(f'Found {data.get(\"count\",0)} exercises.')
for ex in data.get('results',[]):
print(f\" ID {ex['id']:>4} | muscles: {ex.get('muscles',[])} | equipment: {ex.get('equipment',[])}\")
"
栄養情報の検索(USDA FoodData Central)
USDA_API_KEY 環境変数が設定されている場合はその値を使用し、設定されていない場合は DEMO_KEY にフォールバックします。
DEMO_KEY は 1 時間あたり 30 件までです。無料登録で取得したキーは 1 時間あたり 1,000 件までです。
# Search foods by name
FOOD="$1"
API_KEY="${USDA_API_KEY:-DEMO_KEY}"
ENCODED=$(python -c "import urllib.parse,sys; print(urllib.parse.quote(sys.argv[1]))" "$FOOD")
curl -s "https://api.nal.usda.gov/fdc/v1/foods/search?api_key=${API_KEY}&query=${ENCODED}&pageSize=5&dataType=Foundation,SR%20Legacy" \
| python -c "
import json,sys
data=json.load(sys.stdin)
foods=data.get('foods',[])
if not foods: print('No foods found.'); sys.exit()
for f in foods:
n={x['nutrientName']:x.get('value','?') for x in f.get('foodNutrients',[])}
cal=n.get('Energy','?'); prot=n.get('Protein','?')
fat=n.get('Total lipid (fat)','?'); carb=n.get('Carbohydrate, by difference','?')
print(f\"{f.get('description','N/A')}\")
print(f\" Per 100g: {cal} kcal | {prot}g protein | {fat}g fat | {carb}g carbs\")
print(f\" FDC ID: {f.get('fdcId','N/A')}\")
print()
"
# Detailed nutrient profile by FDC ID
FDC_ID="$1"
API_KEY="${USDA_API_KEY:-DEMO_KEY}"
curl -s "https://api.nal.usda.gov/fdc/v1/food/${FDC_ID}?api_key=${API_KEY}" \
| python -c "
import json,sys
d=json.load(sys.stdin)
print(f\"Food: {d.get('description','N/A')}\")
print(f\"{'Nutrient':<40} {'Amount':>8} {'Unit'}\")
print('-'*56)
for x in sorted(d.get('foodNutrients',[]),key=lambda x:x.get('nutrient',{}).get('rank',9999)):
nut=x.get('nutrient',{}); amt=x.get('amount',0)
if amt and float(amt)>0:
print(f\" {nut.get('name',''):<38} {amt:>8} {nut.get('unitName','')}\")
"
オフライン計算ツール
複数件の処理には scripts/ のヘルパースクリプトを使用するか、
単一の計算にはインラインで実行します。
python scripts/body_calc.py bmi <weight_kg> <height_cm>python scripts/body_calc.py tdee <weight_kg> <height_cm> <age> <M|F> <activity 1-5>python scripts/body_calc.py 1rm <weight> <reps>python scripts/body_calc.py macros <tdee_kcal> <cut|maintain|bulk>python scripts/body_calc.py bodyfat <M|F> <neck_cm> <waist_cm> [hip_cm] <height_cm>
各計算式の科学的根拠については、references/FORMULAS.md を参照してください。
注意点
- wger の運動エンドポイントはデフォルトですべての言語を返すため、英語の場合は必ず
language=2を追加してください - wger には未検証のユーザー投稿も含まれるため、承認済みの運動のみを取得するには
status=2を追加してください - USDA の
DEMO_KEYは1時間あたり30リクエストまでです。バッチリクエストの間にsleep 2を追加するか、無料のキーを取得してください - USDA のデータは100gあたりの値です。実際の摂取量に合わせて換算するようユーザーに伝えてください
- BMIでは筋肉と脂肪を区別できません。筋肉質な人のBMIが高くても、必ずしも不健康とは限りません
- 体脂肪の計算式は推定値(±3-5%)です。正確な測定にはDEXAスキャンを推奨してください
- 1RMの計算式は10回を超えると精度が低下します。より正確に推定するには3-5回のセットを使用してください
- wger の
exercise/searchエンドポイントでは、パラメーター名にqueryではなくtermを使用します
検証
運動を検索した後:結果に運動名、筋肉群、器具が含まれていることを確認してください。 栄養情報を検索した後:100gあたりのマクロ栄養素として、kcal、タンパク質、脂質、炭水化物が返されることを確認してください。 計算ツールの実行後:出力が妥当か確認してください(例:ほとんどの成人のTDEEは1500-3500の範囲です)。
クイックリファレンス
| タスク | ソース | エンドポイント |
|---|---|---|
| 名前で運動を検索 | wger | GET /api/v2/exercise/search/?term=&language=english |
| 運動の詳細 | wger | GET /api/v2/exerciseinfo/{id}/ |
| 筋肉で絞り込み | wger | GET /api/v2/exercise/?muscles={id}&language=2&status=2 |
| 器具で絞り込み | wger | GET /api/v2/exercise/?equipment={id}&language=2&status=2 |
| カテゴリーを一覧表示 | wger | GET /api/v2/exercisecategory/ |
| 筋肉を一覧表示 | wger | GET /api/v2/muscle/ |
| 食品を検索 | USDA | GET /fdc/v1/foods/search?query=&dataType=Foundation,SR Legacy |
| 食品の詳細 | USDA | GET /fdc/v1/food/{fdcId} |
| BMI / TDEE / 1RM / マクロ栄養素 | オフライン | python scripts/body_calc.py |