pybaseballで取得した大谷翔平の打撃データをMCPを使って分析してみる

## はじめに

　MCPサーバーが流行っているので、私も使ってみました。個人的にはMCPサーバーを使って自然言語でDBを操作するのが面白いと思ったので、pybaseballで取得したデータをSQLiteを使ってDBに登録してそれをMCPサーバーから操作する、というのをこの記事で紹介したいと思います。

## pybaseballで大谷翔平の打撃データを取得

#### uv（プロジェクトマネージャ）のインストール

　環境の管理にuvを使用するので、pipでuvのインストール
 
```bash
pip install uv
```
  
  uvで仮想環境を初期化して、次に必要なpythonライブラリpybaseballをインストール(※SQLiteはPython標準のものを使用するのでインストール不要)

```bash
uv init
uv add pybaseball
```

　次に、2024年の大谷の打撃データを取得してSQLiteのDBに保存するコードを準備します。

```ohtani_stats.py
import sqlite3
from pybaseball import statcast_batter, playerid_lookup

# 大谷翔平の選手IDを取得
ohtani = playerid_lookup('Ohtani', 'Shohei')
ohtani_id = ohtani.iloc[0]['key_mlbam']

# 大谷翔平の2024年の打撃成績を取得
stats = statcast_batter('2024-03-29', '2024-10-01', ohtani_id)

# 重要な列だけを選択
important_cols = [
    'game_date',  # 試合日
    'launch_speed',  # 打球速度
    'launch_angle',  # 打球角度
    'hit_distance_sc',  # 打撃飛距離
    'events',  # 打席結果
    'description',  # 説明
    'zone',  # ゾーン
    'pitch_type',  # 球種
    'hit_location',  # ヒット位置
    'bb_type',  # 打球の種類
    'estimated_ba_using_speedangle'  # 速度と角度から推定される打率
]

# 選択した列だけでデータフレームを作成（NaNを0に置換）
selected_stats = stats[important_cols].fillna(0)

# データベース接続
conn = sqlite3.connect('2024_ohtani.db')
cursor = conn.cursor()

# テーブル作成
cursor.execute('''
DROP TABLE IF EXISTS ohtani_batting
''')

cursor.execute('''
CREATE TABLE ohtani_batting (
    game_date TEXT, 
    launch_speed REAL,
    launch_angle REAL,
    hit_distance_sc REAL,
    events TEXT,
    description TEXT,
    zone INTEGER, 
    pitch_type TEXT, 
    hit_location INTEGER, 
    bb_type TEXT, 
    estimated_ba_using_speedangle REAL
)
''')

# データを挿入する準備
records = selected_stats.to_dict('records')
for record in records:
    placeholders = ', '.join(['?'] * len(record))
    columns = ', '.join(record.keys())
    query = f"INSERT INTO ohtani_batting ({columns}) VALUES ({placeholders})"
    cursor.execute(query, list(record.values()))

# 変更を保存して接続を閉じる
conn.commit()

# 確認のためにレコード数を表示
cursor.execute("SELECT COUNT(*) FROM ohtani_batting")
count = cursor.fetchone()[0]
print(f"データベースに{count}件のレコードが保存されました。")

conn.close()

```

#### コード解説
- 必要なライブラリのインポート
  - sqlite3：Pythonの標準ライブラリで、SQLiteデータベースを操作
  - pybaseball：MLBデータを取得するためのライブラリ
- 選手IDの取得
  - playerid_lookup関数で大谷翔平選手のMLB IDを取得
- 2024年シーズンの打撃データ取得
  - statcast_batter関数で2024年3月29日から10月1日までのデータを取得
- 重要なデータの選択
  - 打球速度、打球角度、飛距離など重要な指標を選択
  - 欠損値を0に置換
- データベース操作
  - SQLiteデータベースに接続
  - ohtani_battingテーブルを作成（既存なら削除して再作成）
  - Pandasのデータフレームからレコードを取得し、一行ずつデータベースに挿入
  - 変更をコミットし、保存件数を表示
  - 接続を閉じる

　以下で、作成したコードを実行。

```bash
uv run ohtani_stats.py
```

以下のような結果が出力されれば"2024_ohtani.db"が作成されています。

```
Gathering Player Data
データベースに2789件のレコードが保存されました。
```

## Claude デスクトップの準備

　MCPホストとなるLLMのClaude デスクトップの準備をします。

#### Claude デスクトップのインストール

　以下のサイトからClaude デスクトップをインストール

https://claude.ai/download

#### MCP設定ファイルの更新

　エディタで「~\AppData\Roaming\Claude\claude_desktop_config.json」(※Windows)を開いて、以下のように編集。

```claude_desktop_config.json
{
  "mcpServers": {
    "sqlite": {
      "command": "uvx",
      "args": ["mcp-server-sqlite", "--db-path", "[YOUR_DB_PATH]\\2024_ohtani.db"]
    }
  }
}
```

　[YOUR_DB_PATH]に関しては上記で作成したDBのフォルダパスを指定。

#### Claude デスクトップを再起動

　Claudeデスクトップ」を再起動すると、トンカチのアイコンが表示され、クリックでsqliteのツールが表示されます。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350321/07fae925-4ff1-4667-a98c-5af3323d62f0.png)


## さっそく、分析

　それではClaude デスクトップからDBの内容ついて聞いてみましょう。

```
DBにアクセスして、一試合で一番多くホームランを打った日を教えて下さい。
```

結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350321/cb81252d-2f9f-4699-bc08-b4d678aceb66.png)

　Claudeのコードを実行するアーティファクトと組み合わせる事で、以下のような事もできます。

 ```
ホームランを打った球種で円グラフを作成してください。
 ```

 結果

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350321/48c0d670-5125-4c5f-8b06-1f75bc702284.png)


## まとめ 
　本記事では、MCPサーバーを使ってSQLiteのデータベースを自然言語で操る体験しました。MCPサーバーを使うことで、簡単にLLMからいろいろなツールを使用できるのでとても便利ですね。