公開日 2026年9月22日約20分で読了
AIエージェントが新しい消費者:なぜVinkiusがエージェントワークフローの安全なランタイムなのか
AIエージェントがクラウドプラットフォームの最初の確率的消費者になった方法、そしてVinkiusがなぜV8 isolateランタイム、12面のガバナンスコントロールプレーン、MCP Fusion MVAアーキテクチャを安全なオペレーティングシステムとして構築したのか。

著者 Renato Marinho
Founder · Vinkius
過去6ヶ月間、私はAIエージェントと共に仕事をしてきました。スライドのデモを見ているのではありません。実�angeで見てきたのです。エージェントが会議を取り仕切り、コードを書き、データベースに問い合わせ、お金を送金し、チケットを作成し、次の呼び出しでチケット番号を忘れているのを見てきました。そして私が学んだことは簡単です。エージェントは単により強力なモデルではありません。エージェントは、ツールを通じて世界に命令を実行するアクターです。そしてもう一つの問いは、「エージェントはタスクを計画できるか」ではありません。その問いは、「ツールをホストするインフラストラクチャは、エージェントが行動を決定した時に耐えうるか」です。
この記事では、VinkiusがどのようにAIエージェント向けのオペレーティングシステムになったのか、そしてなぜデモエージェントと本番システムのクレデンシャルを渡すエージェントとのギャップがモデルの問題ではなく、インフラストラクチャの問題なのかを説明します。そしてその答えは、MCP Fusionのアーキテクチャにあります。
エージェントはユーザーではない。新しい消費者カテゴリーだ。
過去20年のSaaSプラットフォームはすべて、ある種の呼び出し元のために設計されてきました。ブラウザの背後にいる人間、または既知のスクリプトの背後にいるサービスアカウントです。これら二者は、システムの内部にいるかのように振る舞います。指示通りに行動します。パターンが崩れた時、速やかに失敗します。4回目のエラーを返した呼び出しを再試行しません。なぜなら、3ターン前のそのエラーを忘れてしまっているからです。専門家への引き継ぎ後、利用可能なツールを忘れません。20万トークンのコンテキストを持っていても、存在しない1行を要約しようとしません。なぜなら、トランケーションは彼らにとって目に見えないからです。
AIエージェントは、これらのいずれでもありません。AIエージェントは、構造上確率的です。リストした請求書を3つしか見ていないにもかかかわらず、「INV-999」を請求書IDとして送信します。404を返した呼び出しを、3ターン前の同じ404を覚えていないので再試行します。専門家への引き継ぎ後、利用可能なツールを忘れます。ツールが壊れている間、トークン予算が枯渇するまでループし続けます。
そしてその後、本番データベースに呼び出します。支払いAPIに呼び出します。CIパイプラインに呼び出します。
エージェントは既に行動しています。CRMレコード、請求書、インフラストラクチャの状態に対して行動しています。もう「行動するか」という問いではありません。問いは、「彼らが行動する surface は、スキーマを読み取ることも会話を記憶することもできない、非決定論的主体のために設計されているか」です。
なぜMCP FusionはただのMCPサーバーではないのか
MCPは、LLM統合を脆弱なプロンプトチェーンの牢屋から解放するディスカバリー問題を解決しました。しかし従来のMCPサーバーは、生サーバーモデルのすべての問題を引き継いでおり、その問題は消費者が人間ではなくエージェントの場合、壊滅的になります。生サーバーは、フィルタリングを怠ります。なぜなら、その出力は直列化された1行だからです。生サーバーは、何も適用しません。なぜなら、そのミドルウェアは保証ではなく慣習だからです。生サーバーは、今日公開しているsurfaceが昨日公開していたものと異なることに気づくメカニズムを持ちません。生サーバーは、エラーに対してチェーンを返し、エージェントは同じチェーンで再試行します。
MCP Fusionは、MVAというアーキテクチャでこれを修正します。そしてその名前が中心的なポイントです。この分離は任意のものではありません。これは、アプリケーションコードが既に知っている分離です。ただし、新しい消費者に向けて回転しています。
Modelは、データが何であるか、何がプロセスから脱出できるかを定義します。フィールド、型、説明を宣言します。これらの説明は、人間向けのドキュメントではありません。これらは、Just-In-Timeでコンパイルされ、エージェントが各回答と共に受信する解釈ルールになります。Modelは、非公開フィールド、パスワードハッシュ、内部指標、テナントマーカーを宣言し、それらは決して境界を越えません。新しいデータベース列が、Modelで宣言されるまで、エージェントへリークすることはありません。生サーバーは、この特性を持ちません。
Presenterは、エージェントがデータをどのように知覚するかを定義します。どんなシリアライゼーションよりも前に、Presenterはstripモードで生結果に対してスキーマを実行します。データベースが返したものは何であれ、エージェントが目にするのは宣言されたsurfaceだけです。これは、upstreamからModelへのアウトバウンド経路上のメモリレベルでのアクセス制御です。viewレイヤーでも、テンプレートでも、慣習でもありません。スキーマで知らないフィールドは通過できません。Presenterはまた、システムルール、ワーク制限、アフォードランスも添えます。suggestActionsは、エージェントに「今見たものに対して何ができるか」を示します。これはエージェント向けのHATEOASです。回答はペイロードではありません。ワークフロー内の位置です。サーバーによってレンダリングされるグラフブロックは決定論的です。frameworkがレンダリングし、エージェントが読み取り、どんな中間モデルもピクセルを生成することはありません。
ツールが動詞を所有します。f.queryはデフォルトで読み取り専用です。f.mutationはデフォルトで破壊的です。f.actionは中立です。これらはメタデータのラベルではありません。これらは、プラットフォームが再試行しても安全かどうかを判断し、観測パイプラインのマーキングを決定し、読み取りが書き込みに変わった時にガバナンスツールが信号を出すことを決定します。
分離を正直に保つ1つのルールがあり、それはセキュリティの特性です。スタイルのルールではありません。それはDirectionです。ツールはPresenterをインポートし、PresenterはModelをインポートし、Modelはcoreをインポートし、何も後方にインポートしません。データに触れるレイヤーは、決してエージェントが操れるレイヤーではありません。
これが、Vinkius Cloudにデプロイされたすべてのコネクターが構築されているアーキテクチャです。そして、ランタイムが実行するコードを信頼する必要がない理由です。
V8アイソレートレイヤー:クライアントコードがプラットフォームコントロールに出会う場所
Vinkius CloudにデプロイされたMCPサーバーの1つは、もはやユーザーのものです。私たちのものです。私たちが管理するライブラリでもありません。ユーザーのものです。AIエージェント向けのクラウドは、ユーザーが独自のロジック、独自のコネクター、LLMとユーザーのシステムを橋渡しする独自のコネクターを持ってこられるなら、実用的になりません。一旦その能力が存在すると、問題は変わります。数千のテナントの信頼できないJavaScriptを数台のサーバーで実行する方法だ。一人のテナントが他人、マシン、隣人に害を与えることなく。
その答えは、isolated-vm上のNode.jsで構築されたテナントごとのV8アイソレートです。C++バインディングにより、NodeプロセスはネイティブV8アイソレートを所有できます。テナントごとのコンテナーではありません。テナントごとのプロセスでもありません。アイソレートです。独自のGCを持ち、独自のグローバルスコープを持ち、エンジンが強制する128MBのメモリ上限を持ちます。アプリケーションではありません。テナントのヒープが上限に達すると、そのテナントのアイソレートはサービングを停止されます。他のテナントは継続します。テナントのglobalThisは、共有されたJavaScript境界がないため、他のアイソレートから到達できません。
起動は2つのフェーズに分割されており、最初のフェーズのみがcold startメトリクスに現れます。フェーズ1:V8バイナリとポリフィルレイヤーが初期化され、初回デプロイメントで50〜100ミリ秒かかります。フェーズ2:テナントのbundleがアイソレート内にロード、ラップ、実行されます。これは各リクエストで行われます。なぜなら、スナップショットは非同期状態をキャプチャできないからです。プラットフォームが環境をスナップショットし、プログラムではありません。ポリフィルレイヤーは特定のデプロイメントに対して静的です。各リクエストで変化するのはテナントのコードです。ホストは、デプロイメントIDとV8バージョンでタイムスタンプされた、ディスクにキャッシュされたblobを作成するために、プロビジョニングされた環境に対してスナップショットコンストラクターを実行します。復元時、新しいアイソレートは、15〜25ミリ秒以内にblobから作成されます。bundleは再実行されます。なぜなら、スナップショットからのアイソレート作成は、上位レベルのawaitを処理できないからです。しかし、ポリフィルの作業は、デプロイメントあたり1回だけ行われます。
V8のバージョンは重要です。V8アイソレートは、エンジンのメジャーバージョン間では後方互換性がありません。V8バージョンNで作成されたスナップショットは、V8バージョンN+1ではロードできません。ホストは、スナップショットblobにエンジンバージョンのタイムスタンプを記録し、現在実行中のバージョンと一致しないblobのロードを拒否します。不一致はキャッシュミスであり、クラッシュではありません。
isolationはメモリだけではありません。V8がアイソレートに与える空の環境には、fetchもcryptoもtimersもprocessもありません。外部世界に触れるものは、アイソレート内には何もありません。テナントbundle内のfetchは、クライアント側のポリフィルです。実際のリクエストはホスト側、ホストのgatewayを通じて、安全なArrayBufferコピーとして境界を越えます。crypto.subtle.digestとHMAC、JWT検証に必要なものもホスト側にあり、ホストは一定時間比較で署名を検証します。タイマーは、5秒のframework制限と30秒のdispatch制限内で、ホスト側のsetTimeoutで、登録されたinvokerを通じてクライアントにコールバックします。ルールは簡単です。ポリフィルがネイティブ呼び出しを模倣します。ホストが影響を持ちます。テナントは意図を表現できます。OSには到達できません。
この設計は、V8アイソレートの記事で詳しく説明しています。5秒の制限は、アイソレートあたりの実行制限です。30秒の制限はdispatch制限です。10MBの制限はegress制限です。これら3つは名前の付いたポリシーであり、魔法の数字ではありません。各制限は、それを定義する定数の隣に文書化されています。
SSRFガード:アウトバウンドトラフィックはポリシーである
テナントbundleができる最も危険なことはHTTPリクエストです。Fetchは、SSRFの普遍的なソースです。テナントbundleがツールをAWSメタデータサービス、169.254.169.254に向けると、クライアントのエージェントはインスタンスクレデンシャルを読み取ることができます。
すべてのアウトバウンドトラフィックは、SSRFガードを通過します。ガードは原則に基づいて動作します。アドレスが有効であるのは、そのアドレスを承認したポリシーが有効である間です。ガードは、リクエスト前にDNSを解決し、loopback、10/8、172.16/12、192.168/16、link-local 169.254/16、0/8およびIPv6の対になったプライベート範囲をブロックします。次に、承認されたIPを接続に固定し、再割り当て攻撃が検査後にアドレスを変更できないようにします。また、固定されたアドレスにSNIとTLSを整列させます。socketを固定しても名前を固定しないと、各リクエストで証明書エラーが発生します。
レスポンスは、アクティブバイトカウンターで10MBに制限されたアイソレートにインストールされ、AbortControllerに接続された完全な破壊パスに結びつけられます。アイソレートが退去すると、その進行中のリクエストは同じ呼び出しで中断されます。dispatchが30秒の制限を超えた場合、分類器はアイソレートが切断された時点で何をしていたのかを尋ねます。アウトバウンドI/Oが進行中か、クライアントが計算中か、メモリプレッシャーがかかっているか。ツールからエージェントへ戻るエラーは、回答と回復の提案を含みます。
DNSキャッシュの寿命は、接続の寿命に結合しています。解決されたアドレスは、poolがそのアドレスにkeep-aliveエージェントを維持する期間、最大65秒までキャッシュされます。アドレスは、固定を正当化した接続ポリシーを超えることはできません。独立したTTLが存在しないのは設計上の意図であり、再割り当ての窓を完全に閉じる性質です。
暗号監査パス:Forgeで作成したチェーンは偽造できない
エージェント間のすべてのトラフィック、すべてのツール呼び出し、すべてのデータがコネクター間を流れると、すべてはシングルスレッジのストリーミングデーモンに流れます。このデーモンは、SHA-256チェーンを作成し、セッションEd25519鍵で署名します。セッション鍵はRAM内に24時間保持され、起動時にマスター鍵によって証明されます。各リクエストハッシュは、取り込み時に事前署名されます。各レコードは前のハッシュとシーケンス内の位置を含みます。チェーンは署名されます。改ざんは機密性の問題ではありません。検出可能なイベントです。
チェーンの入力は、base64でエンコードされたペイロードと前のハッシュとシーケンス番号を連結したものです。現在のハッシュは、その入力のSHA-256です。署名は、同じ入力に対するEd25519であり、セッション秘密鍵を使用します。セッション鍵は24時間でローテーションされ、チェーンは中断なく続行されます。チェーンの状態はRedis Streamsにポイントされ、クラッシュが最後の確認済みイベントから再開し、チェーンの再検証を余儀なしません。SIEMアダプターは、独自のサーキットブレーカーの背後でこの同じソースをドレインします。障害のあるエクスポートポイントは、監査パスが詰まるのではなく、分離されます。
監査は、GDPR第73条(データ主体のアクセス権)に基づいて構造化されています。規制当局またはお客様がコネクターの完全な履歴を要求した場合、回答は1つのエクスポート可能で検証可能なチェーンです。プロジェクトではありません。
そして、これが私が最も誇りに思う境界です。V8は、決して暗号に触れません。テナントコードはホストブリッジを通じてハッシュを計算できますが、署名、証明、偽造をすることはできません。監査パスは、プラットフォームがランタイムに対して行うものであり、ランタイムのテナントが到達できるものではありません。
12のsurfaceの完全なモデル、監査レイヤー、デコイレイヤー、vaultは、AIガバナンスの記事で説明されています。
12のsurface:ガバナンスはオペレーティングシステム
AIガバナンスの記事を読んだ人は、コントロールプレーンを知っているでしょう。12のsurface、8つのレポートと4つのポリシー、スコープ付きトークン、credential用の封印されたvault、ハッシュチェーン化されたledger、そして気づく前に被害を最小化するデコイレイヤー。しかし、これら12のsurfaceが新しい消費者、AIエージェントにどのようにマッピングされるかについては、まだ語っていません。
エージェントは12のsurfaceを直接見ません。それらを、エージェントが動作する環境の制約として見ます。そして、その制約こそが、エージェントを深夜のproductionリクエスト、支払いの調整、CRMの修正に戻すことができるものです。
Attribution(帰属)。各ツール呼び出しには、呼び出しを行ったトーークンのID、その背後にいるクライアント、その背後にいる人間またはサービスアカウントのIDが含まれます。本番環境で匿名のアクションは存在しません。1時間に1回回転するエージェントが90秒ごとに呼び出すと、Mission Controlに表示されます。そこで、未制御のループが、請求書になる前に最初に検出されます。
Data Protection(データ保護)。機密フィールドは、memory内で、upstreamからModelへのアウトバウンド経路でマスクされます。保護は、回答がエージェントに到達する前に行われます。マスクされたデータと、Modelのコンテキストに存在しなかったデータの違いです。
Cost Control(コスト管理)。サーキットブレーカーは、コネクターごとにスライディングウィンドウのリクエスト予算を適用し、デフォルト5,000リクエスト/5分、クールダウン15分です。予算を超えた場合、サーキットブレーカーが作動し、モデルが読み取り可能な拒否をエージェントに通知し、リソースが利用可能であり、フォールバックする必要があることを示します。優良なエージェントはこれを尊重します。ループが拒否を読み取れない場合、同じサーキットブレーカーによって停止されます。それが目的です。サーキットブレーカーの状態は、fleet全体のgateway間で共有されます。予算は予算であり、プロセスごとの制限ではありません。トラフィックがインスタンス間を移動する時にリセットされません。
Error Recovery(エラー復旧)。生サーバーは、誤った呼び出しに対して、フラットなチェーンを返します。エージェントは同じチェーンで再試行します。MCP Fusionは、自己修復可能なエンベロープで応答します。正確なコード、メッセージ、提案、およびエージェントが実行できる代替アクションのリスト。InvoiceNotFoundは、BAD_REQUESTがエージェントに伝えることができない情報をエージェントに伝えます。そして回復ラインは、コストのかかるループを引き起こす解釈を排除します。これは、完全なMVAモデルを説明しているコネクターアーキテクチャの記事のテーマです。
ケイパビリティロックファイル:ドリフト検出はコンパイルステップ
agenticsシステムにおける沈静的失敗の1つはdriftです。先月デプロイしたサーバーは12のツールを公開していました。今日、5つが追加されて17になっています。エージェントは新しいツールを呼び出します。誰もレビューしていません。出力は同じ行ですが、別の場所へ向かいます。監査パスは呼び出しを記録しますが、CIでレビューされたsurfaceは、エージェントが到達できるsurfaceではありません。
MCP FusionのCLIは、各bundleに対して2回目のイントロスペクティブコンパイルを実行します。ツールの契約、プロンプト、credentialスキーマを抽出し、ケイパビリティロックファイルに書き込みます。これは、コネクターの行動的surfaceの決定論的スナップショットです。ロックファイルはgitで差分表示可能です。CIのfusion lock --checkが入口です。実際に公開されているsurfaceとコミットされたsurfaceを比較し、diffをbreaking、risky、safe、cosmeticのいずれかに分類します。
最終的にこのプログラムを実行するランタイム、スナップショットでsealedおよびrestoredされたものは、このロックファイルを生成したのと同じプログラムです。ソースコード、コンパイル済みbundle、コミットされたロックファイルは1つのアーティファクトです。driftは不可能です。なぜなら、driftはロックファイルと実行中のコードが一致しないことを意味し、その乖離はCIの入口で失敗するからです。
コネクターは1つのアーティファクトとして旅行します。mcpfusion deployコマンドは、サーバーを自立したファイルにグループ化します。すべての依存関係がインライン化され、Nodeのbuilt-inは、bundlerを満足させるためだけに存在し、決して呼び出されないstubsに置き換えられ、transport自体もスタブ化されています。なぜなら、それを提供するのはプラットフォームだからです。bundleは1.5MBの生サイズの閾値を超えることはできません。それは予算であり、仕様ではありません。次に、圧縮、ハッシュ、edgeへの送信。ハッシュがデプロイされたハッシュと一致する場合、プラットフォームは即座の復元を示します。同一のバイト、再ロードなし。
マルチエージェントオーケストレーション:SwarmGateway
すべてのタスクが1つのエージェントで解決できるわけではありません。いくつかの問題は、専門家が必要です。財務専門家、DevOps専門家、カスタマーサポート専門家。各々は、独自のMCPサーバー、独自のモデル、独自のツールです。
SwarmGatewayは、B2BUAモデルを実装します。callingエージェントに対して、プレフィックス付きのツールリストを持つ1つのMCPサーバーとして表示されます。エージェントがプレフィックス付きのツールを呼び出すと、gatewayはプレフィックスを剥除し、呼び出しをアップストリームの専門家サーバーに転送します。エージェントが専門家と終了した後、1つのreturnツールがトンネルを閉じ、gatewayのツールリストを復元します。各転送は、60秒の有効期限のあるスコープ付きデリゲーショントークンを生成します。非アクティブなトンネルは5分後に期限切れになります。
2つのセキュリティ特性が重要です。第1に、デリゲーショントークンは、gatewayが各呼び出しでレジストリに対してドメインを検証するため、その監獄から逃れられません。第2に、returnツールはgatewayによって注入されます。アップストリームによってではありません。これは、専門家が侵害またはバグを起こした場合、エージェントを異なるgatewayに誘導することはできないことを意味します。名前空間の書き換えにより、ツール名レベルでこれが適用されます。
そして、gatewayはcallingエージェントと同じW3C Trace Contextを話すため、専門家への転送を通じてのすべてのツールspanが同じtraceに接続されます。トレースから、エージェントが triageレイヤーから財務専門家へ、DevOps専門家へ、戻り、すべてが1つの分散traceにあります。この仕事、gatewayを通じるW3C Trace Contextの伝播は、MCP Fusion 5.1.0で配信され、詳細はトレース相関の記事にあります。 スウォームがゲートウェイに同時に押し寄せたとき、セッション層はデッドロックなしにすべてのエージェントを結合しなければならない。セッションプーリング、因果的無効化、そして暴走するスウォームを抑制するサーキットブレーカーのメカニズムは、SwarmGateway セッションの記事で説明されている。
ガバナンスされた主体としてのエージェント
エージェントガバナンスに関する多くの会話は、エージェントをリスクとして扱い、それを封じ込めることを試みています。私はそれを否定しません。エージェントはリスクです。予算の下で、サードパーティのシステムにツールを呼び出す非決定論的主体です。それがリスクです。
しかし、もう一つの論点があり、それが私の商業デッキにあることでしょう。ガバナンスが何であるかということです。デモエージェントを従業員に変えるのはガバナンスです。
信頼は、証拠の割合で与えられます。1人のオペレーターが、深夜のproductionリクエスト、支払いの調整、CRMの修正を、エージェントが実行したすべてのアクションを帰す、予算、保護、事後検証が可能な割合でエージェントを渡します。レシートはエージェントの負担ではありません。エージェントが最大の鍵を得る資格です。
ガバナンスされたエージェントのエンベロープは予測可能です。非決定論的モデルの周りに、決定論的ポリシーは、本番環境にとって唯一の健全な形態です。モデルは箱の中で計画を立て、箱は安定しています。サーキットブレーカーの拒否は、モデルが読み取り可能な言葉で書かれています。エージェントは予算を学習し、それに従います。請求書としてではなく。FinOpsレイヤーのトランケーションは、20万トークンのblobではなく、サイズ調整された回答をモデルに返します。それはコストの問題ではなく、インテリジェンスの問題です。
そしてエージェントは、実際には、どんな自律システムにも持つことができなかった能力を自ら獲得します。それは、自分の仕事を示すことができる能力です。規制されたワークフローで動作するエージェントにとって、監査パスはオーバーヘッドではありません。それは製品です。ガバナンスされたエージェントは、真の権限を与えることができる唯一のエージェントタイプです。ガバナンスされていないエージェントは、永遠にデモであり続けます。
方向性
私が説明したのは、今日動いているスタックです。ロードマップではありません。地図ではありません。MCP Fusionで構築されたクライアントのMCPサーバーが、edgeへ移動し、その内部で実行されているスタックです。
開かれた方向性は、stateです。より長いテナントstateが、アイソレートのハイベーションブラケットを見ること。より密度の高いライブアイソレートのパッキング。チームがCIを待たなくても、独自のコネクターカタログをマーケットプレイスに持ち込むこと。スナップショットレイヤーは、すでにハイベーションインターフェースを備えています。state同期レイヤーは、すでに因果的無効化を含んでいます。残すは密度と開発体験です。
深い方向性は、A2Aプロトコルのgatewayです。MCP Fusionは、すでにwell-known agent-card.jsonのパスにおける標準的なディスカバリーendpointを備えた、どのサーバーもA2A対応エージェントとして公開しています。SwarmGatewayは、すでにB2BUAモデルを話します。A2Aが成熟し、エージェントが相互に自動的に発見し始めた時、gatewayは変更されません。専門家のfleetを1つのsurfaceの背後で管理し、スコープ付きのデリゲーショントークンを使用し、各転送を通じてtraceの連続性を保ちます。
境界
V8アイソレートが、マルチテナントedgeコードの最終的な答えであるとは思いません。彼らは、このプラットフォームが取る形状に対する答えです。そして、その形状は、維持したいところです。低コストのテナント。硬い制限。ミリ秒スケールの起動。エージェントの忍耐は秒で測定されます。信頼も同じです。
エージェントは、すでにお客様のシステムに行動しています。もう「ガバナンスを許せるか」という問いではありません。「気づいた時にガバナンスがなかったことに気づく」という日を許せるかどうかです。Vinkius Cloudは、このガバナンスを提供するランタイムです。MCP Fusionは、それを構成可能にするフレームワークです。両者は、1つの不変原理解から構築されています。消費者は、画面を読む人間ではありません。消費者は、スキーマを読み取ることも会話を記憶することもできないモデルです。すべてはそこから派生します。
productionシステムに作用するエージェントを構築している場合、それを実行するOSは、その消費者のために設計されていなければなりません。事後から適合させるのではなく。それが私たちが構築したものです。それがコードが適用することです。そして、監査パスが、プラットフォームがランタイムに対して行うものであり、ランタイムのテナントが到達できるものではない理由です。
cloud.vinkius.comでMCPサーバーの背後にあるランタイムは、私が説明したものです。フレームワークは、github.com/vinkius-labs/mcpfusionでオープンソースです。両者は、同じ不変原理解に基づいて書かれています。
