mcpField
F
fitness-nutrition

fitness-nutrition

github.com/nousresearchその他258.1k42 回インストール今日更新
リポジトリ

fitness-nutrition について

ジム利用者向けのフィットネス・栄養スキルです。wgerとUSDAのデータ検索に加え、オフラインの身体指標・トレーニング計算機を備えています。

主な機能

  1. 01筋肉、器具、名称で種目を検索
  2. 02食品の栄養データを検索
  3. 03BMI、TDEE、体脂肪率を計算
  4. 041RMとマクロ配分を推定

活用シーン

  1. 01使用器具に合わせて種目を絞り込む
  2. 02食品の100gあたりの栄養を確認
  3. 03必要カロリーや体脂肪率を推定
  4. 04マクロ栄養素の比率を計画

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/nousresearch/hermes-agent --skill fitness-nutrition

インストール後、Claude Code で/fitness-nutritionを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
FORMULAS.md
scripts/
body_calc.py
nutrition_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の範囲です)。


クイックリファレンス

タスクソースエンドポイント
名前で運動を検索wgerGET /api/v2/exercise/search/?term=&language=english
運動の詳細wgerGET /api/v2/exerciseinfo/{id}/
筋肉で絞り込みwgerGET /api/v2/exercise/?muscles={id}&language=2&status=2
器具で絞り込みwgerGET /api/v2/exercise/?equipment={id}&language=2&status=2
カテゴリーを一覧表示wgerGET /api/v2/exercisecategory/
筋肉を一覧表示wgerGET /api/v2/muscle/
食品を検索USDAGET /fdc/v1/foods/search?query=&dataType=Foundation,SR Legacy
食品の詳細USDAGET /fdc/v1/food/{fdcId}
BMI / TDEE / 1RM / マクロ栄養素オフラインpython scripts/body_calc.py

コメント