MCP Fusion/Core concepts/MVAパターン
MVAパターン
Model View Agent は、AI バックエンドにおいて MVC を置き換えるパターンです。View が Presenter となり、AI エージェントが見るもの、知ること、次に何ができるかを正確に制御する知覚レイヤーになります。
MVA は Model View Agent の略です。AI エージェントのバックエンドのためのアーキテクチャパターンで、MCP Fusion はその Model Context Protocol におけるリファレンス実装です。考え方は小さく、そして深い。API の消費者がブラウザーではなく AI エージェントになると、View レイヤーの意味が変わります。もう HTML をレンダリングしません。エージェントが知覚するものを整形します。
f.query() · billing.get_invoice// the agent called the tool
billing.get_invoice({ id: 'inv_2026_0417' })
// the handler returns the raw model row
ctx.db.invoices.findUnique({
where: { id: input.id },
});waiting for the tool result…
Raw SDK would giveA raw SDK server would return this row as-is: every column, every internal field, straight into the model context.
Run を押して、1 回のツール呼び出しがパターンを通る様子を追ってみてください。生の行、Presenter、マスキング、ルール、アフォーダンス、そしてきれいな知覚パッケージです。
3 つの文字
| 文字 | 名前 | 責務 |
|---|---|---|
| M | Model | ドメインデータ: 請求書、ユーザー、チケット。defineModel() で一度だけ宣言します。 |
| V | View (Presenter) | 知覚レイヤー: どのフィールドが存在し、どの値がマスキングされ、どのルールをエージェントが受け取り、次にどのアクションが取れるか。 |
| A | Agent | LLM。Model には直接触れません。Presenter が見せることを選んだものだけを見ます。 |
MVA が取り除く 3 つの失敗
コンテキスト飢餓。 生の JSON ダンプは、タスクに不要なフィールドでコンテキストウィンドウを浪費します。Presenter は各レスポンスをタスクに必要なフィールドへ切り詰め、.limit() でボリュームを上限にします。
アクション盲目。 エージェントは 1 ステップを終え、次に何をすべきか推測するしかなく、ツール名をハルシネーションします。Presenter は各レスポンスを .suggest() で締めます。アフォーダンスのリストであり、HATEOAS が Web API で行うように、サーバーがエージェントに次に何ができるかを伝えます。
知覚のドリフト。 2 つのツールが同じエンティティを違う形で返したり、単位が変わっても誰もモデルに教えなかったりします。Presenter はエンティティごとに一度だけ定義されるので、そのエンティティを返す全ツールが同じ整形された真実を見せ、.rules() が system prompt の行として意味を運びます。
MVC と MVA の比較
| 観点 | MVC | MVA |
|---|---|---|
| 消費者 | ブラウザー | AI エージェント |
| View レイヤー | HTML や JSON をレンダリング | 知覚を整形: フィールド、ルール、アフォーダンス |
| 信頼の境界 | ユーザーは UI を見る | モデルは秘密を見てはならない |
| ナビゲーション | ページ間のリンク | アクション間の .suggest() アフォーダンス |
| 障害モード | 壊れたページ | ハルシネーション、PII 漏洩、単位の誤り |
Presenter の構成要素
各要素は省略可能で、組み合わせられます。
.schema(): 存在するフィールドと、エージェントが読む説明.redactPII(): シリアライズ前に必ず除去されるパス.rules(): 毎回のレスポンスに注入される system prompt の行.ui(): ダッシュボード向けの、データがマスキングを迂回するテーブルなどのレンダリングブロック.suggest(): エージェントが検討してよい次のアクション.limit(): 自己修復メッセージ付きのレスポンス量の上限.embed(): 関連エンティティのためのネストした Presenter
Presenter はフォーマットの補助ではなく、セキュリティの境界です。マスキングは UI ブロックのレンダリング後、シリアライズ前に実行されるので、ネットワークには機密データが流れません。だからこそ MCP Fusion の全ツールは .returns() で Presenter を取り付けます。
次のステップ
- Models and Presenters: 両方の完全な API
- Tools: ツールが Presenter を取り付ける方法
- Governance: 表面が安全なままだったことを証明する方法
