はじめに
MCPサーバーが流行っているので、私も使ってみました。個人的にはMCPサーバーを使って自然言語でDBを操作するのが面白いと思ったので、pybaseballで取得したデータをSQLiteを使ってDBに登録してそれをMCPサーバーから操作する、というのをこの記事で紹介したいと思います。
pybaseballで大谷翔平の打撃データを取得
uv(プロジェクトマネージャ)のインストール
環境の管理にuvを使用するので、pipでuvのインストール
pip install uv
uvで仮想環境を初期化して、次に必要なpythonライブラリpybaseballをインストール(※SQLiteはPython標準のものを使用するのでインストール不要)
uv init
uv add pybaseball
次に、2024年の大谷の打撃データを取得してSQLiteのDBに保存するコードを準備します。
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のデータフレームからレコードを取得し、一行ずつデータベースに挿入
- 変更をコミットし、保存件数を表示
- 接続を閉じる
以下で、作成したコードを実行。
uv run ohtani_stats.py
以下のような結果が出力されれば"2024_ohtani.db"が作成されています。
Gathering Player Data
データベースに2789件のレコードが保存されました。
Claude デスクトップの準備
MCPホストとなるLLMのClaude デスクトップの準備をします。
Claude デスクトップのインストール
以下のサイトからClaude デスクトップをインストール
MCP設定ファイルの更新
エディタで「~\AppData\Roaming\Claude\claude_desktop_config.json」(※Windows)を開いて、以下のように編集。
{
"mcpServers": {
"sqlite": {
"command": "uvx",
"args": ["mcp-server-sqlite", "--db-path", "[YOUR_DB_PATH]\\2024_ohtani.db"]
}
}
}
[YOUR_DB_PATH]に関しては上記で作成したDBのフォルダパスを指定。
Claude デスクトップを再起動
Claudeデスクトップ」を再起動すると、トンカチのアイコンが表示され、クリックでsqliteのツールが表示されます。
さっそく、分析
それではClaude デスクトップからDBの内容ついて聞いてみましょう。
DBにアクセスして、一試合で一番多くホームランを打った日を教えて下さい。
結果
Claudeのコードを実行するアーティファクトと組み合わせる事で、以下のような事もできます。
ホームランを打った球種で円グラフを作成してください。
結果
まとめ
本記事では、MCPサーバーを使ってSQLiteのデータベースを自然言語で操る体験しました。MCPサーバーを使うことで、簡単にLLMからいろいろなツールを使用できるのでとても便利ですね。