調整さんの出欠回答を Playwright で自動入力し、Claude Code 経由の Google Calendar MCP で判定する構成

調整さん(chouseisan.com)の出欠回答を Playwright で自動入力し、◯/△/× の判定は Google カレンダーと照合して Claude Code(claude.ai Google Calendar MCP 経由)に任せる構成を作成した記録です。fetch / fill / submit の3段階に分け、判定ルールは CLAUDE.md に記述する形にしました。

playwrightclaude-codemcpgoogle-calendarchouseisanautomationpython

台本(フルテキスト)

動画の掛け合いを書き起こしたものです。音声を再生しづらい場合はこちらをお読みください。

オープニング

  • 調整さんの出欠回答を Playwright で自動入力
  • Claude Code + Google Calendar MCP で日程判定
はう
今日は調整さんの出欠入力を自動化するツールについて教えてください。
めたん
調整さんの出欠回答を Playwright で自動入力して、◯・△・× の判定は Google カレンダーと照合して Claude Code に任せる構成を作ったの。
はう
なぜ Playwright を使うんですか?
めたん
調整さんは公開 API を持っていないので、公開ページの DOM を直接操作しているの。Playwright がブラウザ操作の自動化に適しているわ。
はう
判定の AI 部分はどうやっているんですか?
めたん
Claude.ai の Google Calendar MCP を使うことで、OAuth 設定なしでカレンダーと連携できるの。Claude Code セッションに対話で頼む形にしているわ。

3段階のワークフロー

  • fetch → Claude で判定 → submit の3段階
  • 各段階を独立に再実行できる設計
はう
ワークフローの全体像を教えてください。
めたん
fetch で候補日を events/{slug}.json に抽出、Claude にカレンダー照合と答え埋めを依頼、submit で Playwright 経由で送信、という3段階よ。
はう
3段階に分けるメリットは何ですか?
めたん
候補が変わったら fetch だけ再実行、判定ロジックを試したいなら Claude に再依頼するだけ、確認後に submit、という形で各段階を切り離せるのよ。
はう
fetch の出力はどういう形式ですか?
めたん
slug、ラベル、URL、名前、コメント、choices 配列を含む JSON よ。choices には候補日時と初期値の × が入っていて、Claude がここを埋めていくの。

調整さんの DOM 操作

  • hidden input kouho{N} に 1=◯/2=△/3=× が入る
  • #kouho{N} ~ input.oax-{col} で一意にボタンを取得
はう
Playwright で DOM をどう操作するんですか?
めたん
候補ごとの hidden input に 1=◯、2=△、3=× の値が入るの。クリック対象は同じ td 内の画像ボタン oax-0 から oax-2 よ。
はう
ID が重複していたんですか?
めたん
そうなの。全行の最初の画像ボタンが oax_0_0 という ID になっていたから、ID では取れなかったわ。#kouho{N} を起点に CSS の後続兄弟セレクタで取る形にしたの。

判定ルールを CLAUDE.md に記述

  • CLAUDE.md に判定ルールを書いて Claude Code が自動読込
  • 「参考:」プレフィックスのスキップや終日イベントの扱いを定義
はう
判定ルールはどこに書くんですか?
めたん
プロジェクトルートの CLAUDE.md に書くの。Claude Code は作業ディレクトリの CLAUDE.md を自動的に読むから、毎回ルールを伝えなおさなくて済むわ。
はう
どんなルールを書いているんですか?
めたん
「参考:」プレフィックスのイベントはスキップ、transparency が transparent のイベントは空きとみなす、終日のブロッキング予定は × にする、といった個人のカレンダー運用ルールね。
はう
既存エントリの更新はどう処理しますか?
めたん
ページ表示直後に同名の参加者リンクがあるか確認して、あれば編集モード、なければ新規モードに自動切替するの。毎回新規エントリが増えないようにしているわ。

ハマりどころとまとめ

  • networkidle は調整さんでは永遠に来ない → load を使う
  • 判定ルール外在化でロジックのデバッグが容易に
はう
ハマったところはほかにありましたか?
めたん
wait_for_load_state の networkidle が調整さんのページで30秒経っても来なかったの。Google Ads などの第三者タグが多いのが原因で、load に変えたら解決したわ。
はう
今日のまとめをお願いします。
めたん
調整さんの DOM を Playwright で操作して fetch・submit、判定部分は Claude Code + Google Calendar MCP に任せる設計よ。ルールを CLAUDE.md に書いておくと管理しやすいの。
はう
ソースコードはどこで見られますか?
めたん
GitHub の nakamura196/choseisan で公開しているわ。DOM の構造は予告なく変わる可能性があるから、利用する際は確認してね。