AIフレンドリーなアプリケーション設計のチェックリスト
最近は AI Agent や MCP (Model Context Protocol) を使って既存システムを操作するケースが増えています。
しかし、多くの既存アプリケーションは「人間が画面を操作すること」を前提に作られており、AI から利用しようとすると意外と苦労します。
一方で、最初から少しだけ設計を意識しておくと、将来的に Tool 化や MCP 化が非常に楽になります。
ポイントは 「人間向けUI」とは別に、「AIが安全かつ確実に操作できる面」を用意しておくこと です。
ただしこれは、人間用とAI用に 別々のシステムを二重に作る という意味ではありません。むしろ逆で、人間向けUIも、AIが叩くのと同じAPI(を直接、またはラップした関数)経由で動かす ——つまりAIと人間で操作の入り口を共通化することが、良いコードを保つ鍵になります(詳しくは「人間用UIとAI用APIのロジックを分離しない」を参照)。
以下は、AIフレンドリーなアプリケーション設計のためのチェックリストです。
UI操作だけに依存しない
- 主要操作は必ず API / CLI / SDK から実行できるようにする
- ブラウザ操作やDOM操作を前提にしない
- AIが画面をクリックしなくても処理できる構造を目指す
APIは小さく、明確に、冪等にする
責務を明確に分離する。
- create
- update
- delete
- get
- list
- execute
また、
- 同じリクエストを何度実行しても壊れにくくする
- 副作用のある操作は明示する
状態を持ちすぎない
- セッション依存を減らす
- 長いウィザード形式を避ける
- 可能な限り単発のAPI呼び出しで完結させる
- 必要な状態はリクエストとして明示する
認証情報をAIに持たせない
- APIキーは環境変数で管理する
- Secret Managerを利用する
- AIには認証済み実行環境だけを渡す
- プロンプトに秘密情報を埋め込まない
権限を細かく分離する
例えば以下のような権限を用意する。
- Read
- Create
- Update
- Delete
- Execute
- Admin
また、
- AIには最小権限のみ付与する
- 本番環境と開発環境の権限を分離する
危険操作には確認ステップを用意する
削除や送信などは即実行させない。
- dry-run
- preview
- confirm
を用意する。
対象例:
- メール送信
- 請求処理
- データ削除
- 本番デプロイ
- 権限変更
API仕様を機械可読にする
以下のような形式を整備する。
- OpenAPI
- JSON Schema
- MCP Tool Schema
- Typed SDK
AIは自然言語より構造化された仕様の方が扱いやすい。
エラーを構造化する
人間向け文章だけではなく、機械が処理しやすい形式で返す。
{
"error_code": "USER_NOT_FOUND",
"retryable": false,
"suggested_fix": "Create user first"
}
推奨項目:
- error_code
- retryable
- suggested_fix
- missing_fields
入出力を構造化する
自由文よりも以下を優先する。
- JSON
- JSON Lines
- CSV
- Protocol Buffers
レスポンスには可能な限り以下を含める。
- ID
- 状態
- 次に可能な操作
ログと監査証跡を残す
記録すべき内容:
- 誰が実行したか
- どの権限で実行したか
- 何を変更したか
- 成功したか失敗したか
- AI経由か人間経由か
後から検証できることが重要。
人間用UIとAI用APIのロジックを分離しない
よくある失敗は、
- UI専用ロジック
- AI / API専用ロジック
が別実装に分かれてしまうこと。AIと人間で「操作の入り口」を二重に作ると、片方だけ仕様が古くなったり挙動がズレたりして、バグの温床になる。
理想は、人間向けUIも、AIが叩くのと同じAPIを使うこと。 UIはそのAPIを直接、または薄くラップした関数を経由して呼び出す。こうすれば操作の入り口が一本に共通化され、AIと人間がまったく同じロジックを通る。
人間向けUI ─┐
├─→ 共通API(またはそのラッパ関数)─→ Domain Logic
AI / MCP ───┘
ポイント:
- AIと人間で 別々のAPIを作らない(共通化する)。これが結果的にコードを健全に保つ
- UIから直接DBやドメインロジックを叩かず、必ずこの共通APIを経由させる
- 共通APIを unit test で固めておくと、人間・AI どちらの経路も同時に品質が保証され、安心してリファクタリングできる
イベント駆動を意識する
操作結果をイベントとして記録する。
例:
- UserCreated
- InvoicePaid
- TaskCompleted
メリット:
- AIが履歴を追いやすい
- 状態変化を説明しやすい
- Rollbackしやすい
フロントエンドもAI操作を意識する
- URLで状態を再現できる
- hidden stateを減らす
- 状態管理をシンプルにする
- Form Schemaを定義する
後からAgentが利用しやすくなる。
テスト環境を整備する
- Sandbox環境
- Fixtureデータ
- Mock API
- テストアカウント
を用意する。
AIが安全に試行錯誤できる環境は重要。
ドキュメントをAI向けに書く
最低限必要な情報:
- 目的
- 入力
- 出力
- 副作用
- エラー
- サンプル
- 注意事項
長文の解説よりも、短く正確な説明の方がAIは扱いやすい。
既存アプリは「AI用操作レイヤー」から始める
全面改修する必要はない。
まずは以下から整備する。
- 読み取りAPI
- 検索API
- 作成API
内部関数を少しずつ Tool 化していく方が現実的。
まとめ
AI時代のアプリケーション設計は、必ずしも「AI専用アプリを作る」ことではありません。
むしろ、
- APIファースト
- 最小権限
- 構造化データ
- Dry Run
- 監査ログ
- 機械可読な仕様
といった従来からの良い設計を徹底することが重要です。
これらを意識しておけば、将来的に MCP Server や AI Tool として公開したくなったときも、大きな作り直しをせずに対応できます。
言い換えると、
AIフレンドリーな設計とは、人間にも機械にも扱いやすい設計である。