なぜ MCP が AI 統合の境界なのか?
NENE2 は AI エージェントにデータベースやファイルシステムへの直接アクセスを与えるのではなく、Model Context Protocol(MCP)を通じて統合します。このページではその設計上の決定を説明します。
境界の構造
AI エージェント(Claude、Cursor など)
│ MCP stdio
▼
local-mcp-server.php ← NENE2 の MCP サーバー
│ HTTP
▼
NENE2 API(PSR-7 / OpenAPI) ← ブラウザが使うのと同じエンドポイント
│ PDO
▼
データベースAI エージェントはデータベースに直接到達しません。すべての操作は、リクエストバリデーション・認証・構造化エラーレスポンスを持つドキュメントされた HTTP エンドポイントを通ります。
エージェントにデータベースを直接クエリさせない理由
1. API コントラクトが信頼の源
OpenAPI ドキュメントは、どの操作が存在し、どの入力を受け付け、どの出力を返すかを記述します。SQL クエリはこのコントラクトを迂回します。SQL を書くエージェントは意図した操作のスコープ外のデータに暗黙に触れる可能性があります。
2. 認可は API レイヤーにある
API キー認証・CORS ポリシー・リクエストサイズ制限は PSR-15 ミドルウェアで適用されます。データベースへの直接接続はこれらをすべてスキップします。
3. 構造化エラーがエージェントの回復を助ける
API 呼び出しが失敗した場合、エージェントは機械可読な type と構造化された errors を持つ Problem Details レスポンスを受け取ります。失敗した SQL クエリはエージェントがパースまたは無視しなければならないデータベースエラー文字列を返します。
4. 同じエンドポイントがすべてのクライアントに対応
MCP サーバーはブラウザ・テストスイート・curl コマンドと同じルートを呼び出します。つまり:
- OpenAPI テストが MCP から到達可能な動作を検証する
- リクエストログが人間のリクエストと並んで MCP 操作をキャプチャする
- MCP パスに個別のデータベーステストサーフェスが不要
なぜ特に MCP なのか
MCP はクライアントエコシステムが成長しているオープンプロトコルです(Claude・Cursor・Zed・VS Code など)。独自の AI 統合ではなく MCP を実装することで、変更なしに同じ local-mcp-server.php がクライアント間で動作します。
MCP サーバーは HTTP サーバーではなく stdio プロセスです。これは開放ポートがないことを意味し、開発マシンの外から誤って到達されることがありません。
ツールの安全レベル
NENE2 の MCP ツールには明示的な安全レベルがあります。
| レベル | 例 | 要件 |
|---|---|---|
read | getHealth、getNote | API キー以上は不要 |
write | createNote、updateNote | 同上 |
admin | 仮想的なロール変更 | 明示的な確認ステップ |
destructive | バッチ削除 | ローカル開発スコープ外 |
read ツールから始めて、明示的にスコープが定まった場合にのみ write ツールを追加することで、エージェントが意図しない状態変更を行うリスクを減らします。
関連ドキュメント
docs/integrations/mcp-tools.md— ツールカタログポリシーdocs/integrations/local-mcp-server.md— ローカルサーバーの起動docs/mcp/tools.json— 現在のツール定義