トラス構造が幾何学的に組まれた建築物のファサード
技術解説

マルチロール予約基盤をAIコーディングで作る時の設計チェックリスト

目次を見る

家事代行・電気工事・清掃などの訪問サービスを予約できるプラットフォームを、個人開発や小規模チームでAIコーディングツールを使って作ろうとしている方に向けた内容です。顧客アプリ・管理ダッシュボード・技術者向け画面という3者が1つのバックエンドを共有する構成は、単純なCRUD(データの作成・読み取り・更新・削除だけを行うシンプルな処理)アプリとは設計の難しさの質が違います。

海外の開発者コミュニティdev.toで公開された事例では、HomeFixという訪問サービス予約プラットフォームが紹介されています。顧客用モバイルアプリ、React・TypeScript製のWebサイト、管理者用ダッシュボードという3つのフロントエンドを、Node.js・Express・Socket.IOのバックエンドが束ねる構成です。この手の「複数ロールが1つの状態を共有するシステム」は、ChatGPTやClaude CodeのようなAIコーディングツールに丸投げすると、ロール間の整合性が崩れやすい典型パターンでもあります。

なぜマルチロール予約システムの設計は難しいのか

予約フローを順番に見ると、顧客が予約を作成し、バックエンドに保存され、管理者が受け取り、技術者を割り当て、顧客に更新が通知されます。

この5ステップのうち、どこか1つでも非同期処理の扱いを誤ると、顧客画面には「予約済み」なのに管理画面には反映されていない、といった不整合が起きます。

単一ロールのTodoアプリなら、画面をリロードすれば最新状態が見えます。しかしこの予約システムでは、顧客・管理者・技術者がそれぞれ別の端末からリアルタイムに同じ予約レコードを見ている状態を維持する必要があります。

ここで使われているのがSocket.IOです。これはWebSocket(サーバーとクライアントが双方向に常時接続する通信方式)を扱いやすくラップしたJavaScriptライブラリで、ポーリング(一定間隔でサーバーに問い合わせる方式)に頼らず、サーバー側の変化をクライアントへ即座にプッシュできます。技術者の位置情報や予約ステータスの変更を、画面の手動更新なしに反映する用途に向いています。

AIコーディングツールに設計を任せる時の落とし穴

Claude CodeやCursorのようなAIコーディングツールに「予約システムを作って」と指示すると、多くの場合REST API(HTTPでリソースを操作する標準的な設計様式)のCRUDエンドポイントは綺麗に生成されます。

問題はロール間の状態同期です。AIは「顧客が予約を作る」機能と「管理者が技術者を割り当てる」機能を、別々のプロンプトで依頼すると、別々の実装方針で作ってしまうことがあります。

たとえば、ある機能ではSocket.IOのイベント名をbooking:createdにし、別の機能ではnewBookingにしてしまうようなケースです。片方のクライアントだけイベントを受信できず、サイレントに同期が壊れます。

これを防ぐには、最初のプロンプトでイベント名・ペイロード構造を明示的に固定し、以降のプロンプトでは「既存のbooking:createdイベント仕様に従って実装して」と毎回参照させる運用が有効です。AIに新規実装を都度任せるのではなく、一度決めた契約(イベント名・データ構造)をドキュメント化し、プロンプトに含め続ける方が崩れにくくなります。

MCPで予約データベースとAIツールをつなぐ発想

こうしたマルチロールシステムの開発では、AIコーディングツールにデータベースの実スキーマを直接確認させる仕組みが役立ちます。

MCP(Model Context Protocol、AIモデルが外部ツールやデータソースに安全にアクセスするための標準プロトコル)対応のデータベースサーバーをClaude CodeやCursorに接続すると、AIが実際のテーブル定義を見ながらコードを生成できます。

具体的には、PostgreSQL用のMCPサーバーを設定ファイルに登録すれば、AIが「bookingsテーブルのstatusカラムが本当にenum型かどうか」を推測ではなく実物を見て判断できるようになります。予約ステータスの不整合は、AIが古い想定のままコードを書くことで起きやすいため、この確認ステップは地味ですが効果があります。

従来のモノリシック構成との比較で見る設計判断

観点単一フロントエンド構成マルチロール構成(今回の例)
状態管理クライアント内で完結しやすい複数クライアント間での同期が必須
リアルタイム通信任意(なくても成立)Socket.IO等がほぼ必須
AIへの指示粒度機能単位で依頼しやすい契約(イベント仕様)を先に固定する必要
テストの焦点単体テスト中心ロール間の結合シナリオテストが重要

この比較から分かるのは、ロールが増えるほど「個々の機能が動くか」より「ロール間の受け渡しが崩れていないか」の確認比重が上がるという点です。

今日確認できること

すでに訪問サービス予約やマッチング系のアプリをAI駆動で作っている、あるいはこれから作る場合、次の点を確認してみてください。

  • Socket.IOを使っているなら、イベント名とペイロード構造を1枚のドキュメント(README等)にまとめ、AIへのプロンプトに常に添付しているか
  • 顧客・管理者・技術者それぞれのクライアントで、同じイベントを受信するコードが別々に実装されていないか(重複実装はズレの温床)
  • 使っているAIコーディングツールがMCP対応なら、データベース用MCPサーバーを設定し、スキーマを都度確認させているか(Claude Codeなら.mcp.json、Cursorなら設定画面のMCPタブで登録状況を確認できます)
  • 予約作成から技術者割り当てまでの一連の流れを、E2Eテスト(ユーザー操作全体を通して検証するテスト)で1本は用意しているか

特に最後の項目は見落とされがちです。各ロールの機能が個別に動いていても、一連の流れとして通しで確認していないと、本番で初めて不整合が発覚します。

まとめ

複数ロールが1つのバックエンドを共有する予約プラットフォームは、個々の画面よりも「ロール間のデータ受け渡し」が設計の核心になります。

Socket.IOのようなリアルタイム通信の仕組みを使う場合、イベント名とデータ構造を先に固定し、AIコーディングツールへのプロンプトに継続して含めることが、実装のブレを防ぐ具体的な手立てです。

MCP対応のデータベース接続を使えるツールなら、AIにスキーマの実物を見せることで、推測によるコード生成を減らせます。

まずは手元のプロジェクトで、Socket.IOのイベント一覧とE2Eテストの有無を棚卸しするところから始めてみてください。

参考

Building a Full-Stack Home Services Booking Platform

この記事について: 本記事は AI を活用して作成し、forva AI 編集部が内容を確認・監修しています。

AI 駆動開発のご相談は forva AI へ。まずはお気軽にどうぞ。