🤖

「LLMを処理系として動かせる時代になった」の続き

に公開

LLMを処理系として動かせる時代になったの仕組みを使ってもう1つ。

立川の映画館 シネマシティの上演情報の取得と表示も、同じようにLLMに実行させるスクリプトが描けました。

#!/bin/zsh

# 引数チェック
if [ $# -ne 1 ]; then
    echo "使用法: $0 {fetch|view|view_web}"
    echo "  fetch:    シネマシティの映画情報を取得してSQLiteに保存"
    echo "  view:     SQLiteに保存された映画情報を表示"
    echo "  view_web: ブラウザで映画情報を確認"
    exit 1
fi

case "$1" in
    "fetch")
        claude --allowedTools "mcp__fetch__fetch,mcp__sqlite__create_table,mcp__sqlite__write_query,mcp__sqlite__read_query,mcp__sqlite__describe_table,mcp__sqlite__list_tables" -p "~/bin/cinemacity_movies.shのコメント部分を読み取って、fetch処理を実行してください" 
        ;;
    "view")
        claude --allowedTools "mcp__sqlite__read_query,mcp__sqlite__list_tables,mcp__sqlite__describe_table" -p "~/bin/cinemacity_movies.shのコメント部分を読み取って、view処理を実行してください"
        ;;
    "view_web")
        claude --allowedTools "mcp__sqlite__read_query,mcp__sqlite__list_tables,mcp__sqlite__describe_table,mcp__filesystem__write_file,mcp__filesystem__create_directory" -p "~/bin/cinemacity_movies.shのコメント部分を読み取って、view_web処理を実行してください"
        ;;
    *)
        echo "エラー: 無効な引数です。'fetch', 'view', または 'view_web' を指定してください。"
        exit 1
        ;;
esac

: '
ここから、LLMに対する指示です。
# シネマシティ映画情報管理プロンプト

## fetch処理
必要な権限: mcp__fetch__fetch, mcp__sqlite__create_table, mcp__sqlite__write_query, mcp__sqlite__read_query, mcp__sqlite__describe_table, mcp__sqlite__list_tables

以下のステップを実行して、シネマシティの映画情報を取得してSQLiteに保存します:

1. https://cinemacity.co.jp/ を読み取り(mcp__fetch__fetch使用)
2. https://res.cinemacity.co.jp/TicketReserver/showing から上映映画一覧を取得(mcp__fetch__fetch使用、raw=trueで取得)
3. 各映画の詳細ページ(https://res.cinemacity.co.jp/TicketReserver/studio/movie/{ID})から詳細情報を取得(mcp__fetch__fetch使用)
4. SQLiteテーブル存在確認(mcp__sqlite__list_tables使用)、`cinemacity_movies` が存在しない場合は作成(mcp__sqlite__create_table使用):
   - movie_id (INTEGER PRIMARY KEY)
   - title (TEXT NOT NULL)
   - description (TEXT)
   - screening_period (TEXT)
   - screening_notes (TEXT)
   - audio_format (TEXT)
   - video_format (TEXT)
   - studio_restrictions (TEXT)
   - special_events (TEXT)
   - copyright_info (TEXT)
   - official_website (TEXT)
   - poster_url (TEXT)
   - fetched_at (DATETIME DEFAULT CURRENT_TIMESTAMP)
5. 取得した映画情報をSQLiteテーブルに挿入(mcp__sqlite__write_query使用、INSERT OR REPLACEで更新・挿入)
6. すでに存在する映画は更新し、新規映画は挿入する
7. 2.の一覧全てが処理できたら終了する

## view処理
必要な権限: mcp__sqlite__read_query, mcp__sqlite__list_tables, mcp__sqlite__describe_table

以下のクエリを実行して映画情報を表示します:

1. テーブル存在確認(mcp__sqlite__list_tables使用)
2. テーブル構造確認(mcp__sqlite__describe_table使用)
3. `SELECT movie_id, title, screening_period, video_format, audio_format FROM cinemacity_movies ORDER BY movie_id` で基本情報を表示(mcp__sqlite__read_query使用)
4. 限定上映作品がある場合は期間も含めて表示
5. 特殊フォーマット(4K、7.1ch等)がある場合は併記

## view_web処理
必要な権限: mcp__sqlite__read_query, mcp__sqlite__list_tables, mcp__sqlite__describe_table, mcp__filesystem__write_file, mcp__filesystem__create_directory

以下の手順でブラウザ表示用のHTMLファイルを作成します:

1. テーブル存在確認(mcp__sqlite__list_tables使用)
2. SQLiteから全映画情報を取得(mcp__sqlite__read_query使用、SELECT * FROM cinemacity_movies ORDER BY movie_id)
3. ~/tmp/ディレクトリが存在しない場合は作成(mcp__filesystem__create_directory使用)
4. 映画情報を整理したHTMLファイルを~/tmp/cinemacity_movies_YYYYMMDD_HHMMSS.htmlとして作成(mcp__filesystem__write_file使用)
5. 作成したHTMLファイルのパスを表示してブラウザで開けるように案内

## 表示形式例

シネマシティ上映映画一覧:

1. はじまりのうた (ID: 1926) [極上音響上映]
   期間: 2025年6月13日(金)-6月26日(木) 2週間限定

2. 機動戦士Gundam GQuuuuuuX -Beginning- (ID: 3322)
   期間: 2025年6月20日(金)-7月3日(木) 2週間限定

3. Mr.ノボカイン (ID: 3400) [4K]

...

'

view_webでは、いい感じのHTMLを作ってくれます。

プロンプトは100行程度なのです。
でもLLMが知っている知識に乗っかることで、今までのプログラムの100行程度とは比較にならないぐらい、結構な事をやってくれています。

動作が遅いや、挙動が不安定になる箇所は多々あるでしょう。
けど、自分は今とてもワクワクしています。

Discussion