🐥

「パパ、MCPを使えば献立考えるの楽になるよ」

に公開

とある平日の夕方

娘「ねぇパパ、今日の晩ご飯なに?」

ワイ「うーん……冷蔵庫にウインナーと残りもんのキャベツあるから、焼きそばにでもしよか」

娘「また焼きそば? 3日連続なんだけど」

ワイ「献立考えるのって、ほんま骨折れるんや! 仕事終わってクタクタやのにレシピ探す余裕ないねん」

娘「……だったらパパ、機械に任せればいいじゃん

ワイ「機械て、お前また電子レンジに喋りかけるつもりか?」

娘「違うよ。MCPサーバー立てて、レシピをツールとして公開して、あとはLLMに献立考えさせればいいだけだよ」

ワイ「M…C…P? なんやそれ新しい格闘ゲームか?」

娘「“Model Context Protocol” の略。ローカルで動くツール群を LLM が呼び出せる仕組み。
最近 ChatGPT や Claude と繋げるの流行ってるでしょ?」

MCPサーバーって何を作ればいいの?

ワイ「せやけどワイ、APIとかよー分からへんわ」

娘「心配ご無用。ツールは2個だけでいいよ」

ツール名 役割 引数 戻り値
list_tags() 料理タグ一覧を返す string[]
get_recipes_by_conditions() 時間・カロリー条件でレシピを返す max_time, max_calories Recipe[]

娘「この 2 つを Python でも TypeScript でもいいから実装して、mcp.run(transport='stdio') で起動。
Claude for Desktop に登録すれば、LLM 側が勝手に呼んでくれるから!」

ワイ「どうことや?さっぱりわからん」

娘「見たほうが早いよ、10分で作るから見逃さないでね」

娘による10分クッキング

  1. レシピデータrecipes.json に保存

    [
      { "title": "鶏の照り焼き", "tags": ["主菜", "肉"], "time": 20, "calories": 450 },
      { "title": "ほうれん草のお浸し", "tags": ["副菜", "ヘルシー"], "time": 10, "calories": 60 },
      { "title": "味噌汁", "tags": ["汁物"], "time": 15, "calories": 90 }
    ]
    
  2. MCPサーバーファイル menu.py

    from mcp.server.fastmcp import FastMCP
    import json, random
    mcp = FastMCP("menu")
    RECIPES = json.load(open("recipes.json", encoding="utf-8"))
    
    @mcp.tool()  # 一覧ツール
    async def list_tags() -> list[str]:
        tags = {t for r in RECIPES for t in r["tags"]}
        return sorted(tags)
    
    @mcp.tool()  # 条件検索ツール
    async def get_recipes_by_conditions(max_time:int=30, max_calories:int=500):
        return [r for r in RECIPES if r["time"]<=max_time and r["calories"]<=max_calories]
    
    if __name__ == "__main__":
        mcp.run(transport="stdio")
    
  3. Claude for Desktop 設定
    claude_desktop_config.json

    {
      "mcpServers": {
        "menu": {
          "command": "python",
          "args": ["menu.py"]
        }
      }
    }
    

ワイ「……ホンマに10分で書きよった!」

娘「ソース短いからね。あとはLLM側プロンプト
『夕食を考えて。カロリーは700kcal以内、30分で作れる献立にして』って頼めば完了。」

実際に使ってみた

  1. Claude に「今日の献立よろしく。30分以内・600kcal以内」と送信
  2. Claude → list_tags() でタグ把握
  3. Claude → get_recipes_by_conditions(30,600) 呼び出し
  4. Claude が返ってきたレシピを組み合わせ、提案メニューを自然文で回答

Claude の返答例

  • 主菜: 鶏の照り焼き (450kcal / 20分)
  • 副菜: ほうれん草のお浸し (60kcal / 10分)
  • 汁物: 味噌汁 (90kcal / 15分)
    合計 600kcal / 同時調理で約25分

ワイ「……ええやん! これ明日から毎日頼むわ」

娘「でしょ? パパの仕事が1つAIに代替されたね!」

ワイ「作るところまでやってくれると嬉しいんだけど」

娘「パパは怠惰だな〜」

おまけ: 娘、ひらめく

娘「ねぇパパ、今日もAIくんに献立考えてもらっていい?」

ワイ「いいよ」

娘「じゃあ、AIくん今日の献立はスイーツ中心でお願い」

ワイ「えええ? 待て待て待て待て」

Claude の返答
スイーツ中心の今日の献立をご提案します!

【主役スイーツ】

  • クッキーシュー(約300kcal/60分)
  • 厚切りフレンチトースト(約500kcal/20分)

【サイドにおすすめ】

  • ブロッコリーと卵のサラダ(250kcal/20分)
    ※甘いものの合間に、さっぱりサラダもおすすめ!

お好みでフルーツやアイスを添えても楽しいですよ!
他にもスイーツレシピを知りたい場合は、ジャンルや材料を教えてください!

娘「やったぁ!今晩はクッキーシューとフレンチトーストだね!」

ワイ「トホホ・・・いろいろ制約つけなアカンな・・・」

まとめ

〜おしまい〜

Discussion