Lean Baseball

No Engineering, No Baseball.

大谷翔平投手が故障前後で何が変わったか生成AIに聞いてみた - 半日で作った自作MCP Serverの活用

あまり見ない高校野球以上に, 日ハムとホークスの首位争いの方が気になるマンです(これは個人の趣味と都合*1).

前回ブログ「シン・野球データサイエンス」の続編的な内容となります.

shinyorke.hatenablog.com

上記ブログおよびBet AI Dayの直前イベントLT(スライドはこれ)にて,

  • Claude DesktopをAI Agentとした野球データ分析の仕組みをシュッと作った
  • データはMCP Toolbox for Databasesを経由して取得する

という発表をしました. 個人開発で3年以上開発・メンテしてきた基盤を生成AI時代のユースケースにアジャストさせた良い取り組みだったと自画自賛しています*2.

ここまでが前回のあらすじでして今回は,

  • MCP Serverを自作する(=MCP Toolbox for Databasesじゃなくていい部分を委譲する)
  • これで実際野球データ分析ができるか, オオタニサンをベンチマークにしてやってみた

以上に取り組んだ際の知見をまとめましたので御覧ください.

TL;DR

ちゃんとしたドキュメントと設定があればMCP Serverは半日で作れる&故障明けのオオタニサンはすごい(と生成AIが言ってました).

アーキテクチャの全体像

簡易的な構成図(Blueprint)はこれです.

生成AI野球データ分析PoC第二弾の絵

前回ブログとの差分は以下の通りです.

差分はこんな感じ

まず前提条件として「野球データをいい感じに取得するRESTful API」的なサービスが既に存在します.

shinyorke.hatenablog.com

今回は上記で作ったAPIに対するMCP Serverを自作することで,

  • 分析のニーズ・ユースケースに合わせてMCP Server(自作)からAPI Call
  • APIで実現できないものは前回作ったMCP Toolbox for Databases経由でいい感じにする

この発想とアーキテクチャが最適かどうか試す意味でシュッと作りました*3.

構成はいたってシンプルで,

  1. FastMCPでAPIの仕様に合わせたMCP Serverを作る
  2. 上記のMCP Serverを自分のPC上に立てたDockerでホスト
  3. Claude DesktopのMCP設定に取り込み

これでいきました&結果やりたいことはできました.

MCP Serverを半日でシュッと作る

この先はMCP Serverの実装をどうやったか?の話となります.

ざっくり以下の手順でやりました.

  1. APIドキュメントをCursorで執筆
  2. APIドキュメントとOpenAPIの設定を元にMCP Serverを実装
  3. Docker化してローカルでホスト

APIドキュメントをCursorで執筆

まず, 元々Goで作成していた野球データAPIのコードをCursorに読み込ませて*4, 詳細なAPIドキュメントを作成しました. 完成品は以下の通りです.

# Zobrist Dashboard API Documentation

## 概要

Zobrist Dashboard APIは、MLB(メジャーリーグベースボール)の選手データを提供するRESTful APIです。投手、打者、守備の各ポジションに関する詳細な統計データとトラッキングデータを提供します。

## 基本情報

- **Base URL**: `https://your-api-gateway-url.com`
- **Content-Type**: `application/json`
- **認証**: API Key認証
- **バージョン**: 6.1.0

※長すぎるので省略


## 制限事項

- 年パラメータ: 2020-2025(守備データは2020-2023)
- 守備ポジション: 2-9
- 日付形式: YYYY-MM-DD
- キャッシュパラメータ: true/false

## 使用例

※ここにcallするためのcurl コマンドが入る

「ソースコードから逆算して書いたDesign Doc」とも言えるこのドキュメントで,

  • Endpointの一覧
  • I/F仕様
  • curlでの呼び出しサンプル
  • 環境変数および制約事項

以上を言語化しました.

MCP Serverの実装

上記のAPIドキュメントとOpenAPIの設定を元に, PythonでMCP Serverを実装しました.

実装したのはもちろん生成AI(今回はCursor)です.

import os
from typing import Any, cast

import requests
from fastmcp import FastMCP

app: FastMCP = FastMCP("zobrist-mcp-server")

# API設定
API_BASE_URL = os.getenv("ZOBRIST_API_BASE_URL", "https://your-api-gateway-url.com")
API_KEY = os.getenv("ZOBRIST_API_KEY", "")
API_REFERRER = os.getenv("ZOBRIST_API_REFERRER", "")


def _make_api_request(
    endpoint: str, params: dict[str, Any] | None = None
) -> dict[str, Any]:
    """APIリクエストを実行する共通関数"""
    headers = {"x-api-key": API_KEY, "Referer": API_REFERRER} if API_KEY else {}
    url = f"{API_BASE_URL}{endpoint}"

    try:
        response = requests.get(url, headers=headers, params=params, timeout=30)
        response.raise_for_status()
        return cast(dict[str, Any], response.json())
    except requests.exceptions.RequestException as e:
        return {"error": f"API request failed: {str(e)}"}


@app.tool()
def get_batter_list(year: int) -> dict[str, Any]:
    """指定した年の打者リストを取得します。

    Args:
        year: シーズン年(2020-2025)

    Returns:
        打者リストのJSONレスポンス
    """
    if not 2020 <= year <= 2025:
        return {"error": "Year must be between 2020 and 2025"}

    endpoint = f"/players/{year}/batter"
    return _make_api_request(endpoint)


@app.tool()
def get_pitcher_list(year: int) -> dict[str, Any]:
    """指定した年の投手リストを取得します。

    Args:
        year: シーズン年(2020-2025)

    Returns:
        投手リストのJSONレスポンス
    """
    if not 2020 <= year <= 2025:
        return {"error": "Year must be between 2020 and 2025"}

    endpoint = f"/players/{year}/pitcher"
    return _make_api_request(endpoint)


@app.tool()
def get_batter_tracking_data(
    year: int, player_id: int, start_date: str, end_date: str, use_cache: bool = True
) -> dict[str, Any]:
    """指定した打者のトラッキングデータを取得します。

    Args:
        year: シーズン年(2020-2025)
        player_id: 選手ID
        start_date: 開始日(YYYY-MM-DD形式)
        end_date: 終了日(YYYY-MM-DD形式)
        use_cache: キャッシュ使用フラグ(デフォルト: True)

    Returns:
        打者トラッキングデータのJSONレスポンス
    """
    if not 2020 <= year <= 2025:
        return {"error": "Year must be between 2020 and 2025"}

    endpoint = f"/tracking/{year}/batter/{player_id}"
    params = {"start": start_date, "end": end_date, "cache": str(use_cache).lower()}
    return _make_api_request(endpoint, params)


@app.tool()
def get_pitcher_tracking_data(
    year: int, player_id: int, start_date: str, end_date: str, use_cache: bool = True
) -> dict[str, Any]:
    """指定した投手のトラッキングデータを取得します。

    Args:
        year: シーズン年(2020-2025)
        player_id: 選手ID
        start_date: 開始日(YYYY-MM-DD形式)
        end_date: 終了日(YYYY-MM-DD形式)
        use_cache: キャッシュ使用フラグ(デフォルト: True)

    Returns:
        投手トラッキングデータのJSONレスポンス
    """
    if not 2020 <= year <= 2025:
        return {"error": "Year must be between 2020 and 2025"}

    endpoint = f"/tracking/{year}/pitcher/{player_id}"
    params = {"start": start_date, "end": end_date, "cache": str(use_cache).lower()}
    return _make_api_request(endpoint, params)


@app.tool()
def get_fielding_data(
    year: int,
    player_id: int,
    position: int,
    start_date: str,
    end_date: str,
    use_cache: bool = True,
) -> dict[str, Any]:
    """指定した選手の守備データを取得します。

    Args:
        year: シーズン年(2020-2023)
        player_id: 選手ID
        position: 守備ポジション(2-9)
        start_date: 開始日(YYYY-MM-DD形式)
        end_date: 終了日(YYYY-MM-DD形式)
        use_cache: キャッシュ使用フラグ(デフォルト: True)

    Returns:
        守備データのJSONレスポンス
    """
    if not 2020 <= year <= 2023:
        return {"error": "Year must be between 2020 and 2023"}

    if not 2 <= position <= 9:
        return {"error": "Position must be between 2 and 9"}

    endpoint = f"/fielding/{year}/player/{player_id}"
    params = {
        "position": position,
        "start": start_date,
        "end": end_date,
        "cache": str(use_cache).lower(),
    }
    return _make_api_request(endpoint, params)


@app.tool()
def get_server_info() -> dict[str, str | list[str] | bool]:
    """Zobrist MCP Serverの情報を取得します。"""
    return {
        "name": "Zobrist MCP Server",
        "version": "0.1.0",
        "description": "MLB選手データを提供するZobrist Dashboard APIのMCP Server",
        "tools": [
            "get_batter_list",
            "get_pitcher_list",
            "get_batter_tracking_data",
            "get_pitcher_tracking_data",
            "get_fielding_data",
            "get_server_info",
        ],
        "api_base_url": API_BASE_URL,
        "api_key_configured": bool(API_KEY),
        "api_referrer_configured": bool(API_REFERRER),
    }


if __name__ == "__main__":
    app.run()

チャットで話していい感じに型安全に作ってもらいました.

このMCP Serverには以下の機能が含まれています.

  • 投手・打者のリスト取得. これで選手IDとかを取れる.
  • 投手・打者のトラッキングデータ取得. 選手IDをキーに取得.
  • 守備データの取得(これもトラッキングデータ).
  • サーバー情報の取得.

結果的にこれで実用に堪えるものができました.

テストコードもあれば完璧でしたが...今回は実験なので省略.

Docker化とローカルホスト

MCP ServerをDocker化してローカルでホストし, Claude Desktopに接続して動作確認を行いました.

Claude Desktopの設定はこんな感じです(MCP Toolboxの方はコマンドとして導入&本件のMCP Serverはcomposeで管理).

{
  "mcpServers": {
    "bigquery": {
      "command": "/Users/your_user/.mcp_toolbox/toolbox",
      "args": ["--prebuilt","bigquery","--stdio"],
      "env": {
        "BIGQUERY_PROJECT": "baseball-zobrist"
      }
    },
    "zobrist-mcp-server": {
      "command": "docker-compose",
      "args": [
        "-f", "/Users/your_user/zobrist-dashboard/mcp_server/compose.yaml",
        "run",
        "--rm",
        "mcp-server"
      ]
    }
  }
}

試しに大谷翔平選手の事を聞いてみました, しっかり使えています.

やりたいことができた

ほぼほぼCursorに頼ったおかげで, ここまでのMCP Serverは半日で行けました.

大谷翔平の故障前後で比較してみた.

せっかく作ったので試しにこんな分析をしました.

  • 大谷翔平選手の最近(今月)の投球と, 故障離脱寸前の2023年8月のパフォーマンスをレポートとして書いてもらう.
  • レポート同士を比較し, 違いを言語化してもらう.

どちらもClaude DesktopからMCP Serverを呼び出し得たデータを元にまとめました.

今月のレポート

# 大谷翔平 2025年8月投手成績レポート

## 📊 エグゼクティブサマリー

**大谷翔平選手の2025年8月の投手成績は、卓越したパフォーマンスを示しました。** 3試合の登板で計200球を投球し、最高102mphの速球と7種類の多彩な球種を駆使して効果的な投球を展開。特に4シームファストボールとスイーパーを二本柱に、月を通じて極めて高いレベルの投球内容を維持しました。

---

## 📈 投球データ分析

### 登板概要
- **登板試合数**: 3試合
- **総投球数**: 200球
- **対戦打者数**: 50名
- **登板日**: 8月6日、8月13日、8月20日

### 球種別分析

#### 🔥 4シーム・ファストボール(速球の軸)
- **球数**: 72球(36.0%)
- **平均球速**: 98.9 mph (159.1 km/h)
- **最高球速**: 102.0 mph (164.1 km/h)
- **平均回転数**: 2,453 rpm
- **最高回転数**: 2,638 rpm
- **ストライク率**: 55.6%

**評価**: 98mph台後半の安定した球速で打者を圧倒。102mph記録で威力十分。2023年から更なる球速向上を実現。

#### 🌀 スイーパー(主力変化球)
- **球数**: 61球(30.5%)
- **平均球速**: 84.8 mph (136.4 km/h)
- **最高球速**: 87.8 mph (141.3 km/h)
- **平均回転数**: 2,571 rpm
- **最高回転数**: 2,650 rpm
- **ストライク率**: 50.8%

**評価**: 大谷の代表的な決め球として最も効果的。優れた横変化で18.0%の空振り率を記録。

#### 🎯 スライダー
- **球数**: 35球(17.5%)
- **平均球速**: 89.1 mph (143.4 km/h)
- **最高球速**: 91.5 mph (147.2 km/h)
- **平均回転数**: 2,541 rpm
- **最高回転数**: 2,784 rpm
- **特徴**: カウント球、空振り誘発に効果的

#### ⚾ シンカー
- **球数**: 18球(9.0%)
- **平均球速**: 97.2 mph (156.4 km/h)
- **最高球速**: 100.0 mph (160.9 km/h)
- **平均回転数**: 2,107 rpm
- **特徴**: 速球系として有効、ゴロ誘発球種

#### 🔽 スプリット・フィンガー
- **球数**: 8球(4.0%)
- **平均球速**: 91.5 mph (147.2 km/h)
- **平均回転数**: 1,498 rpm
- **特徴**: 低回転による落差で37.5%の高い空振り率

#### 🔄 カーブボール
- **球数**: 4球(2.0%)
- **平均球速**: 76.2 mph (122.6 km/h)
- **最高球速**: 80.6 mph (129.7 km/h)
- **平均回転数**: 2,559 rpm
- **特徴**: タイミング外しに使用、75.0%のストライク率

#### その他球種
- **カッター**: 2球(1.0%)- 平均97.1 mph

---

## 🎯 投球制球力・対戦成績

### 総合成績
- **奪三振**: 12個(6.0%)
- **四球**: 4個(2.0%)
- **被安打**: 8本(4.0%)
- **被本塁打**: 1本(0.5%)
- **その他**: 175球(87.5%)- ファール、ボール、アウトなど

### 球種別制球分析
| 球種 | ストライク率 | 空振り率 | 使用率 |
|------|-------------|----------|-------|
| 4シームファストボール | 55.6% | 8.3% | 36.0% |
| スイーパー | 50.8% | 18.0% | 30.5% |
| スライダー | 48.6% | 14.3% | 17.5% |
| スプリット | 62.5% | 37.5% | 4.0% |
| シンカー | 44.4% | 5.6% | 9.0% |

### コントロール評価
**優秀** - 全体的に非常に安定したストライク率を維持。特にファストボールとスプリットフィンガーの制球が抜群。

---

## 📅 試合別パフォーマンス

### 8月6日 vs セントルイス・カージナルス
- **投球数**: 64球
- **対戦打者**: 約16名
- **平均球速**: 92.1 mph
- **最高球速**: 102.0 mph
- **奪三振**: 4個
- **四球**: 1個
- **被安打**: 3本

**ハイライト**: 月間最高球速102.0mphを記録。イバン・エレーラ、ペドロ・パヘス等から三振を奪取。

### 8月13日 vs ロサンゼルス・エンゼルス(インターリーグ)
- **投球数**: 89球(月間最多)
- **対戦打者**: 約22名
- **平均球速**: 90.8 mph
- **最高球速**: 101.2 mph
- **奪三振**: 6個(月間最多)
- **四球**: 2個
- **被安打**: 4本(被本塁打1本含む)

**ハイライト**: 最も長いイニングを投球。テイラー・ウォードに被本塁打を記録するも、マイク・トラウトから3三振を奪う好投。

### 8月20日 vs コロラド・ロッキーズ
- **投球数**: 47球
- **対戦打者**: 約12名
- **平均球速**: 91.0 mph
- **最高球速**: 100.0 mph
- **奪三振**: 2個
- **四球**: 1個
- **被安打**: 1本

**ハイライト**: 最もコンパクトな投球。エセキエル・トバル等を抑え、効率的なピッチングで月間を締めくくり。

---

## ⚡ 被打球分析

### 打球種類別成績
- **ゴロ**: 16本(平均打球速度 78.4mph、平均角度 -8.1°)
- **フライ**: 12本(平均打球速度 85.2mph、平均角度 38.7°)
- **ライナー**: 8本(平均打球速度 96.1mph、平均角度 12.3°)
- **ポップフライ**: 2本(平均打球速度 65.8mph、平均角度 58.0°)

### 被安打詳細
- **ゴロ安打**: 3本(平均距離 78ft)
- **フライ安打**: 3本(平均距離 298ft)
- **ライナー安打**: 2本(平均距離 195ft)

**評価**: ハードヒット率を大幅に抑制。被安打の大部分が軟打に抑制されている。

---

## 🔮 技術的評価・進歩点

### 強み
1. **球速**: 平均98.9mph、最高102.0mphの圧倒的な速球
2. **球種の多様性**: 7種類の球種を戦術的に使い分け
3. **決め球**: スイーパーとスプリットの威力向上
4. **制球力**: 極めて安定したコマンドと配球

### 2023年からの進歩点
- **球速向上**: 4シーム平均が97.4mph→98.9mphに向上
- **球種使い分け**: より効果的な配球パターンの確立
- **空振り率**: スイーパーとスプリットの威力増大
- **制球精度**: ゾーンコマンドの更なる向上

### 月間を通じた安定性
- **登板間隔**: 6-7日の適切な休息で疲労管理良好
- **球速維持**: 3試合を通じて100mph超を安定して記録
- **コマンド**: 一貫して高い制球力を発揮
- **球種配分**: 戦略的かつ効果的な投球選択

---

## 🆚 特筆すべき対戦

### 印象的な三振シーン
1. **8/6 vs イバン・エレーラ**: スライダーで空振り三振(2回)
2. **8/6 vs ペドロ・パヘス**: 4シーム102mphでファールチップ三振
3. **8/13 vs ザック・ネト**: スイーパーでファールチップ三振
4. **8/13 vs マイク・トラウト**: 4シーム101.2mphで見逃し三振
5. **8/13 vs ノーラン・シャニューエル**: カーブで空振り三振
6. **8/20 vs エセキエル・トバル**: カーブで空振り三振

### 被安打シーン
- **8/13 vs テイラー・ウォード**: 4シーム97.9mphを右中間本塁打(375ft)
- その他の被安打はすべて単打・二塁打で、長打を最小限に抑制

---

## 📊 総合評価

**S級パフォーマンス**

大谷翔平の2025年8月の投手成績は、2023年から更に進化した圧巻のパフォーマンスでした:

### 卓越した点
1. **球速**: 平均98.9mph、最高102.0mphの2年前を上回る速球
2. **球種**: 7つの異なる球種を高度に戦術的使い分け
3. **制球**: 極めて精密なコマンドでゾーンを支配
4. **安定性**: 3試合を通じて一貫した最高水準のクオリティ

### 戦術的成功
- **投球配分**: 4シーム(36.0%)とスイーパー(30.5%)の完璧な二本柱
- **決め球**: スプリットで37.5%、スイーパーで18.0%の高い空振り率
- **被打球抑制**: ハードヒット率の劇的な低減に成功

### 2023年からの成長
8月の投球内容は、2年前の素晴らしいパフォーマンスを更に上回る進化を示しており、大谷選手の投手としての完成度の高さがピークに達している証拠です。球速、制球力、球種の多様性、そして戦術的判断すべてにおいて顕著な向上が見られます。

### 2025年シーズンでの位置付け
2025年8月の投球内容は、大谷選手のキャリアハイレベルの投手パフォーマンスを示す記念すべき月間成績と評価できます。二刀流選手として打者でも活躍しながら、投手として世界最高峰のパフォーマンスを発揮した傑出した期間でした。

---

## 📈 2023年8月との比較分析

### 主要指標比較
| 項目 | 2023年8月 | 2025年8月 | 変化 |
|------|-----------|-----------|------|
| 登板試合数 | 3試合 | 3試合 | → |
| 総投球数 | 182球 | 200球 | ↑ +18球 |
| 平均球速 | 91.6 mph | 91.3 mph | ↓ -0.3 mph |
| 最高球速 | 101.4 mph | 102.0 mph | ↑ +0.6 mph |
| 奪三振 | 11個 | 12個 | ↑ +1個 |
| 四球 | 5個 | 4個 | ↓ -1個 |
| 被安打 | 6本 | 8本 | ↑ +2本 |

### 球種進化の分析
**2023年**: スイーパー37.4%、4シーム36.3%の二本柱
**2025年**: 4シーム36.0%、スイーパー30.5%でより多彩な配球

**進歩点**:
- **制球精度**: 四球率が2.7%→2.0%に改善
- **球種バランス**: より戦術的な配球パターンの確立
- **決め球威力**: スプリットの空振り率が大幅向上
- **投球効率**: より効率的なイニング消化能力

---

## 🏆 月間MVP級パフォーマンス

### 歴史的意義
- **102mph記録**: 日本人投手として最高峰の球速記録
- **球種多様性**: メジャー屈指の7球種使い分け能力
- **二刀流継続**: 投打両面でのエリートレベル維持
- **安定性**: 3試合連続での高水準パフォーマンス

### 他選手との比較
2025年8月のメジャーリーグ投手陣の中でも、大谷選手の以下の指標は際立っていました:
- **球速×制球**: 100mph超の速球を安定してストライクゾーンに投げ込む能力
- **球種の質**: 7球種すべてがメジャーレベルの品質
- **空振り誘発**: 複数球種での高い空振り率
- **被長打抑制**: ハードヒット率の驚異的な低さ

---

## 🔍 詳細技術分析

### リリースポイント分析
- **一貫性**: 全球種で安定したリリースポイント
- **欺瞒性**: 速球と変化球の見分けにくさ
- **エクステンション**: 平均6.6ftの優秀な前方リリース

### 回転効率分析
- **4シーム**: 高回転率による浮き上がり効果
- **スイーパー**: 横回転による大きな変化
- **スプリット**: 低回転による急激な落下
- **カーブ**: 縦回転による大きなブレーク

### 配球戦略
- **カウント別**: 有利カウントでの決め球使い分け
- **打者別**: 左右打者に応じた効果的な攻め
- **状況別**: ランナーありなしでの球種選択

---

## 📝 今後への期待と課題

### 更なる向上の余地
1. **耐久性**: より長いイニングへの対応
2. **球種精度**: カーブとカッターの更なる精密化
3. **配球パターン**: より予測困難な投球順序
4. **体調管理**: 二刀流での疲労蓄積対策

### 2025年シーズン後半への影響
この8月のパフォーマンスは、シーズン後半とポストシーズンでの大谷選手の投手としての役割拡大を示唆しており、チームの優勝争いにおいて極めて重要な意味を持ちます。

---

## 🌟 最終評価

**歴史的パフォーマンス**

大谷翔平の2025年8月投手成績は、以下の理由で歴史的な意義を持ちます:

1. **技術的完成度**: 2023年を上回る投球技術の向上
2. **戦術的成熟**: より高度な配球と状況判断
3. **フィジカル**: 102mph記録に示される身体能力の維持
4. **メンタル**: プレッシャー下での安定したパフォーマンス

### 結論
2025年8月は、大谷翔平選手の投手としてのキャリアにおいて最も充実した月の一つとして記録されるべき素晴らしい成績でした。二刀流の頂点を極めながらも、投手として更なる高みを目指す姿勢が明確に表れた、まさに「完璧に近い」投球月間でした。

---

*データ期間: 2025年8月1日-31日*  
*分析対象: 200投球(3試合登板)*  
*最終更新: 2025年8月*

それっぽいことを言っていますが, マイク・トラウトから3三振を奪う好投。 など, データ集計をしくじっている感ある内容もありました(正解は2三振).

3試合連続での高水準パフォーマンス も盛っています, 8/22の試合はKOといってもおかしくない内容です.

投球データの分析(球速・回転数・球数)はデータ由来の部分で合っていそうでした.

2023年8月のレポート

故障寸前のレポートはこんな感じです.

# 大谷翔平 2023年8月投手成績レポート

## 📊 エグゼクティブサマリー

**大谷翔平選手の2023年8月の投手成績は、安定したパフォーマンスを示しました。** わずか3試合の登板で計182球を投球し、多彩な球種を駆使して効果的な投球を展開。特にスイーパーと4シームファストボールを武器に、月を通じて高いレベルの投球内容を維持しました。

---

## 📈 投球データ分析

### 登板概要
- **登板試合数**: 3試合
- **総投球数**: 182球
- **対戦打者数**: 24名
- **登板日**: 8月3日、8月9日、8月23日

### 球種別分析

#### 🌀 スイーパー(主力変化球)
- **球数**: 68球(37.4%)
- **平均球速**: 83.9 mph (135.0 km/h)
- **最高球速**: 89.8 mph (144.5 km/h)
- **平均回転数**: 2,347 rpm
- **最高回転数**: 2,651 rpm
- **ストライク率**: 52.9%

**評価**: 大谷の代表的な決め球として最も多用。優れた横変化で空振りを奪う主要武器。

#### 🔥 4シーム・ファストボール(速球の軸)
- **球数**: 66球(36.3%)
- **平均球速**: 97.4 mph (156.7 km/h)
- **最高球速**: 101.4 mph (163.1 km/h)
- **平均回転数**: 2,244 rpm
- **最高回転数**: 2,494 rpm
- **ストライク率**: 53.0%

**評価**: 97mph台の安定した球速で打者を圧倒。100mph超えも記録し威力十分。

#### 🎯 カッター
- **球数**: 17球(9.3%)
- **平均球速**: 86.5 mph (139.3 km/h)
- **最高球速**: 95.6 mph (153.9 km/h)
- **特徴**: カウント球、タイミング外しに使用

#### ⚾ スプリット・フィンガー
- **球数**: 15球(8.2%)
- **平均球速**: 89.0 mph (143.2 km/h)
- **平均回転数**: 1,385 rpm
- **特徴**: 低回転による落差で空振り誘発

#### 🔽 カーブボール
- **球数**: 11球(6.0%)
- **平均球速**: 75.3 mph (121.2 km/h)
- **最高球速**: 82.8 mph (133.2 km/h)
- **平均回転数**: 2,419 rpm
- **最高回転数**: 2,998 rpm

#### その他球種
- **スライダー**: 4球(2.2%)- 平均87.0 mph
- **シンカー**: 1球(0.5%)- 95.2 mph

---

## 🎯 投球制球力・対戦成績

### 総合成績
- **奪三振**: 11個(6.0%)
- **四球**: 5個(2.7%)
- **被安打**: 6本(3.3%)
- **その他**: 160球(87.9%)- ファール、ボール、アウトなど

### 球種別制球分析
| 球種 | ストライク率 | 空振り率 | 見逃し率 |
|------|-------------|----------|----------|
| スイーパー | 52.9% | 16.2% | 14.7% |
| 4シーム | 53.0% | 6.1% | 16.7% |
| スプリット | 40.0% | 26.7% | 6.7% |
| カッター | 29.4% | 17.6% | 5.9% |

### コントロール評価
**良好** - 全体的に安定したストライク率を維持。特にファストボールとスイーパーの制球が優秀。

---

## 📅 試合別パフォーマンス

### 8月3日 vs シアトル・マリナーズ
- **投球数**: 59球
- **対戦打者**: 9名
- **平均球速**: 91.6 mph
- **最高球速**: 101.4 mph
- **奪三振**: 4個
- **四球**: 1個
- **被安打**: 3本

**ハイライト**: シーズン最高球速101.4mphを記録。カル・レイリー、テオスカー・ヘルナンデスから空振り三振を奪取。

### 8月9日 vs サンフランシスコ・ジャイアンツ
- **投球数**: 97球(月間最多)
- **対戦打者**: 9名
- **平均球速**: 88.5 mph
- **最高球速**: 99.0 mph
- **奪三振**: 5個(月間最多)
- **四球**: 3個
- **被安打**: 3本

**ハイライト**: 最も長いイニングを投球。マイケル・コンフォルトに二塁打を被弾するも、その後しっかりと修正。

### 8月23日 vs シンシナティ・レッズ
- **投球数**: 26球
- **対戦打者**: 6名
- **平均球速**: 85.2 mph
- **最高球速**: 95.4 mph
- **奪三振**: 2個
- **四球**: 1個
- **被安打**: 0本

**ハイライト**: 最もコンパクトな投球。被安打ゼロの好投で月間を締めくくり。

---

## ⚡ 被打球分析

### 打球種類別成績
- **ゴロ**: 13本(平均打球速度80.0mph、平均角度-18.1°)
- **フライ**: 9本(平均打球速度89.8mph、平均角度44.7°)
- **ライナー**: 3本(平均打球速度88.9mph、平均角度18.0°)
- **ポップフライ**: 2本(平均打球速度68.3mph、平均角度60.0°)

### 被安打詳細
- **ゴロ安打**: 3本(平均距離86ft)
- **フライ安打**: 2本(平均距離286ft)
- **ライナー安打**: 1本(216ft)

**評価**: ゴロ率が高く、ハードヒットを抑制。被安打はほとんどが軟打。

---

## 🔮 技術的評価・進歩点

### 強み
1. **球速**: 平均97.4mphの高速ファストボール
2. **球種の多様性**: 7種類の球種を効果的に使い分け
3. **決め球**: スイーパーとスプリットの威力
4. **制球力**: 安定したストライクゾーンコマンド

### 月間を通じた安定性
- **登板間隔**: 適切な休息で疲労蓄積なし
- **球速維持**: 3試合を通じて安定した球速
- **コマンド**: 一貫して高い制球力を発揮

---

## 🆚 特筆すべき対戦

### 印象的な三振シーン
1. **8/3 vs ユージニオ・スアレス**: スイーパーで空振り三振
2. **8/3 vs テオスカー・ヘルナンデス**: ファールチップで三振
3. **8/9 vs ルイス・マトス**: スイーパーで空振り三振(2回)
4. **8/9 vs J.D.デイビス**: スイーパーで空振り三振

### 被安打シーン
- **8/9 vs マイケル・コンフォルト**: カッターを二塁打(唯一の長打被弾)
- その他の被安打はすべて単打で、ダメージを最小限に抑制

---

## 📊 総合評価

**A級パフォーマンス**

大谷翔平の2023年8月の投手成績は非常に優秀でした:

### 卓越した点
1. **球速**: 平均97.4mph、最高101.4mphの圧倒的な速球
2. **球種**: 7つの異なる球種を戦術的に使い分け
3. **制球**: 高精度なコマンドでゾーンを有効活用
4. **安定性**: 3試合を通じて一貫したクオリティ

### 戦術的成功
- **投球配分**: スイーパー(37.4%)と4シーム(36.3%)の二本柱
- **決め球**: スイーパーで11個の空振りを奪取
- **被打球抑制**: ハードヒット率の低減に成功

### 2023年シーズンでの位置付け
8月の投球内容は、大谷選手の投手としての完成度の高さを示す代表的な月間成績と評価できます。二刀流選手として打者でも活躍しながら、投手として世界最高水準のパフォーマンスを発揮した素晴らしい期間でした。

---

*データ期間: 2023年8月1日-31日*  
*分析対象: 182投球(3試合登板)*  
*最終更新: 2025年8月*

こっちの方がちゃんとしたレポートになっているような...

少なくとも数字は合っていそうです.

比較するとどうなる?

Claudeにきいてレポート化したのがこちらです.

# 大谷翔平 投手成績比較サマリー(2023年8月 vs 2025年8月)

## 🔥 2025年が上回っている点

### パフォーマンス向上
- **最高球速**: 101.4 mph → **102.0 mph** (+0.6 mph)
- **投球数**: 182球 → **200球** (+18球) - より多くの投球機会
- **奪三振**: 11個 → **12個** (+1個)
- **制球力**: 四球率 2.7% → **2.0%** (改善)

### 技術的進歩
- **4シーム平均球速**: 97.4 mph → **98.9 mph** (+1.5 mph)
- **球種多様性**: より戦術的な配球パターンの確立
- **空振り率**: スプリットで**37.5%**の高い空振り率を実現
- **制球精度**: 全体的にストライク率が向上

---

## 📉 2023年が上回っていた点

### 被打撃成績
- **被安打**: **6本** vs 8本 (-2本少ない)
- **被本塁打**: **0本** vs 1本 (完封)
- **全体平均球速**: **91.6 mph** vs 91.3 mph (+0.3 mph)

### 効率性
- **スイーパー使用率**: **37.4%** vs 30.5% (より多用)
- **被長打**: 2023年は被本塁打なしで長打を完全封鎖

---

## ⚖️ 総合評価

### 🏆 **2025年の圧勝**

**技術的成長**: 最高球速102mph到達、制球力向上、球種の戦術的使い分けなど、投手として明確な進化を遂げている

**成熟度**: より多くの投球数をこなしながら高いパフォーマンスを維持し、投手としての耐久性も向上

**戦術面**: 2023年のスイーパー偏重から脱却し、より多彩で予測困難な配球パターンを確立

### 結論
2025年8月は2023年8月の素晴らしい成績を**さらに上回る歴史的パフォーマンス**。わずかな被安打増加はあるものの、球速、制球力、投球量、技術的完成度すべてにおいて明確な向上を示しており、**大谷選手の投手としての最高峰レベル**を記録した月間と評価できます。

「歴史的パフォーマンス」は言い過ぎかもですが, 数字とかFactベースのDiffはちゃんと取ってくれそうです.

結び

「半日で作った自作MCP Server」を使ってオオタニサンの分析を試みる営みを紹介しました.

自分の所感としてはこんな感じっです.

  • ポジティブ
    • 元々作ってたシステムのAPIに対してMCP Serverを噛ませるのは思った以上に楽にできる.
    • 直接クラウドのDB/DWH(本件ではBigQuery)を叩くようなMCP Serverは怖いのでAPI経由でいい感じにしたい.
    • 現状のMCP Serverと各種コンポーネントでAI Agentは作れそう. なおユースケースと設計(ry
  • もっといけるやろ
    • API ServerのResponseがJSONなお陰でAI Agent(今回はClaude)の文字数限界に達した. MCP Server側でJSON to CSVにするなど, 工夫が必要.
    • レポートはかけるがちょいちょい嘘が入る. 数字の集計間違いはルールにして徹底させる, 思い込みを書かせない仕組み*5を考える or 機械的にできるvalidationは必要そう.
    • Claudeに頼るのではなく, Geminiとかを使った自作AI Agent作り*6頑張らないと...

なお, 今日紹介したこちらの内容は(もうちょっとデモを頑張ったうえで)8/28のお昼に開催される「月末 Tech Lunch Online#4 - Google Cloud を語る!」にてデモを交えてお話しますのでお楽しみに.

jaguer-tech-lunch.connpass.com

最後までお読み頂きありがとうございました.

*1:夏休みにエスコン行くので気が気でない.

*2:これは本当にそうで, 3年前に(自分の時間を)投資したことは全く間違ってなかった.

*3:同時に, 私がMCP Serverを作ったことがない事, (仕事的な意味も含めて)MCP Serverの役割やセキュリティ, システムに組み込むときのアーキテクチャの土地勘を積みたくてやりました.

*4:余談ですがここはClaude Codeでも良いはず.

*5:一番やりやすいのはレポートのフォーマットとサンプルを作り教えることですが, 今回は手を抜いてやってない. やらなきゃ.

*6:こちらはこの秋冬の目標. クラウドアーキテクチャ含めて乞うご期待. 構想はあります.