プロダクトリリース・小互解読

アリババがPage Agentをオープンソース化——スクリーンショットではなくテキストでUIを直接読み書きするエージェントをウェブページに直接埋め込む

MITライセンスで公開、モデル非依存、OpenAI互換のテキストモデルなら何でも接続可能。ただし現状は単一ページビューの操作にとどまる

1分でわかる要点
  • アリババのチームがPage Agentをオープンソース化した。純粋なJavaScriptとしてウェブページ内部で動くエージェントライブラリで、ページのテキスト構造(DOM)を直接読み取ってUIを理解・操作する。スクリーンショットには頼らない
  • 核心技術はDOM dehydration(DOM脱水)——ページ全体の数千のノードを、操作可能な要素だけを残した簡潔なテキストマップ「FlatDomTree」に圧縮する。これにより通常のテキストモデルでも要素を正確に特定できる
  • MITライセンスでオープンソース化、モデル非依存。任意のOpenAI互換エンドポイント経由で接続でき、テキストのみをやり取りするためマルチモーダルモデルは不要。コードはDOM処理とprompt周りのロジックをbrowser-useから継承している
  • ウェブページの内部で動くため、ユーザーが今ログインしている状態やcookie、権限を自動的に引き継ぐ。専用バックエンドを書く必要も、ヘッドレスブラウザも不要
  • 限界もはっきりしている——安全ルールは強制制約ではなくprompt内に書かれているだけで、コアライブラリが操作できるのは単一ページのみ。タブをまたぐにはChrome拡張機能を別途入れる必要がある
1誰が、何をしたのか

アリババが定石破りのブラウザエージェントをオープンソース化した

アリババのチームが最近、Page Agentをオープンソース化した。純粋なJavaScriptとしてウェブページ内部で動作し、テキスト化されたDOMを読み取ってUIを理解・操作するエージェントライブラリだ。

まるで本物のユーザーのようにウェブページの中に住み込み、ページのテキスト構造を読んでボタンを押したりフォームに入力したりする。全過程でヘッドレスブラウザの起動もスクリーンショットも不要、画像を理解できるマルチモーダルモデルすら要らない。

現在主流のブラウザ自動化ツール——Playwright、Selenium、Puppeteer、browser-use——は、いずれもブラウザの外側で別プロセスを立ち上げ、スクリーンショットデバッグプロトコルを使って遠隔からページを操作する。Page Agentが選んだのは真逆の道だ。エージェントのロジックそのものがウェブページに埋め込まれた一段のJavaScriptであり、そのためユーザーの現在のログイン状態、cookie、権限を自然に引き継ぐ。導入もscriptタグ一本、あるいはnpmインストール一発で済む。
送信 ▍送信をクリック… 内部:JSが直接ページ要素を操作 外部:別プロセスを起動 スクリーンショット/プロトコルで遠隔操作
同じウェブページでも、操作経路は2通り——エージェントが内部に住み込むか、外からロボットアームが伸びてくるか
2比較の前提

従来のやり方はどこにコストがかかるのか

Page Agentが何を省いたのかを理解するには、まず外部ツールがウェブページを操作するために背負っているものを見る必要がある。それらはページの内部に入らず、ガラス越しに外から指示を出すことしかできない。

01
独立したプロセス
PlaywrightやSeleniumはいずれもブラウザの外にもう一つランタイムやサービスを走らせる必要があり、あなたのアプリケーションとは別のプログラムになる
02
ドライバかデバッグプロトコルの層
WebDriverやCDP(Chrome DevTools Protocol、ブラウザ公式のリモートデバッグプロトコル)経由でページを遠隔から読み書きする。ページの内部に入るわけではない
03
マルチモーダルモデルが必要になることも多い
多くの方式はページのスクリーンショットを撮り、画像を理解できるモデルに要素の位置を推測させる。推論コストがより高くつく

この外部駆動の発想は、クロスサイトでのデータ取得やエンドツーエンドテストの実行では依然として有効だ。Page Agentが解決しようとしているのは別の面倒だ——そのウェブページがそもそも自分のプロダクトで、コードを自由に書き換えられるなら、なぜそんなに遠回りをする必要があるのか、という点だ。

3核心技術

ウェブページ全体をテキストの一覧に圧縮する

現代的なウェブページは1000を超えるノードを持つこともあり、HTMLをそのままモデルに渡すのは遅くコストもかかる。Page Agentのやり方は、まずページを一度「脱水」し、本当に操作可能なものだけを残すことだ。

DOM dehydration・DOM脱水

指示を受けると、エージェントはDOM(Document Object Model、ブラウザがウェブページを解析して作るあの要素ツリー)全体をスキャンし、操作可能な要素——ボタン、リンク、入力欄——を一つずつ見つけ出し、それぞれに番号(index)、role、テキストラベル(label)を付ける。装飾用の冗長なマークアップはすべて剥ぎ取られ、ページ全体は「FlatDomTree」と呼ばれる簡潔なテキストマップに圧縮される。モデルが読むのはこの一覧であって、ピクセルではない。

たとえるなら

分厚い本の本文を全部取り除いて、目次の章タイトルとページ番号だけを残すようなものだ。モデルは本を丸ごと読み込む必要はなく、この目次に一目通すだけで、どのページを開くべきか、どのボタンを押すべきかがわかる。

脱水の前後で、モデルが見るものはどれだけ違うか

脱水前・生のDOM
<div class="hdr"> <nav><ul><li><a href…> <span><svg>…</svg></span> <div class="wrap"><div>… <button class="btn primary"…> <input type="text" name…> …数千個の雑多なノード
脱水後・FlatDomTree
[0] link   「ホーム」 [1] input  メールアドレス [2] input  パスワード [3] button 「ログイン」 [4] button 「経費を提出」

原文のデモページはこのループをそのまま見せてくれる。「Dehydrated DOM」パネルにモデルが読み取った一覧が表示され、隣の「Action trace」パネルには指示の実行につれて一手ずつ更新が入る。1ステップずつクリックしていく様子をその場で見られる。

Dehydrated DOM
[0] link 「ホーム」
[1] input メールアドレス
[2] input パスワード
[3] button 「ログイン」
[4] button 「経費を提出」
Action trace
updateTree・一覧を生成
inputText [1]・メールアドレス入力
inputText [2]・パスワード入力
clickElement [3]・ログインをクリック
4内部構造

指示が入ってから、内部でどう動くのか

自然言語の一文から、実際にページ上で何かがクリックされるまで、その間は決まった一つの閉ループになっている。実際の処理はPageControllerという部品が引き受ける。

自然言語の指示execute()
DOMをスキャンupdateTree
FlatDomTreeを生成テキストの一覧
モデルが判断どのindexを選ぶか
アクションを実行click / input / scroll

PageControllerが公開しているのはまさにこれらの具体的なアクションで、番号を指定して要素を操作する。

PageController・コアアクション呼び出し
await this.pageController.updateTree()
await this.pageController.clickElement(index)
await this.pageController.inputText(index, text)
await this.pageController.scroll({ down: true, numPages: 1 })

monorepo全体は責務を3つの小さなパッケージに分けている。

@page-agent/coreUIを持たないエージェントのコアロジック
page-agentUIパネル付きの完全なエントリークラス
@page-agent/page-controllerDOM抽出と要素の番号付けを担当。任意でSimulatorMaskによる視覚的フィードバックも可能

開発者が手にする3つのガードレール

操作ホワイトリスト
エージェントが実行できるアクションを限定し、それ以外には一切触らせない
データマスキング
パスワードのような機微なフィールドを隠し、モデルに送らない
カスタムナレッジ
自分たちのビジネスルールを注入し、自社ドメインの取り決めに沿って動かせる
5横並び比較

他のツールと比べて、誰がこれを使うべきか

この比較表が言いたいのはシナリオの話であって、速さの話ではない。4つの方式はそれぞれ違う場所で動き、違う方法でページを読み取る。それぞれ得意な陣地がある。

方式どこで動くかページの読み取り方導入コスト最適な用途
Page Agentウェブページ内部(クライアントJS)脱水後のテキストDOMscriptタグ一本またはnpm自社プロダクト内の操作型copilot
Selenium / Playwright / Puppeteer外部プロセスドライバ経由でDOMを読む(WebDriver/CDP)ドライバ+ランタイムまたはサービススクリプト化されたエンドツーエンドテスト
browser-use外部プロセスDOM+任意で視覚情報Python+ブラウザ自律的なマルチサイトエージェント
WebMCPサーバーサイドツール構造化された関数呼び出し標準が広く採用される必要ありエージェントネイティブなツール呼び出し
WebMCPとは何か

これは別の道を行く方式だ。ウェブページ自身の機能を構造化された「ツール」関数としてラップし、標準化されたインターフェースでエージェントに直接呼び出させる。Page AgentはDOMのテキストを読むのに対し、WebMCPは標準プロトコルに頼る。片方はページを改修しなくても導入でき、もう片方はインターフェース標準が広く受け入れられるのを待つ必要がある。

結論は適用範囲にある。Page Agentはコードを自由に書き換えられる、自分がコントロールできるプロダクト内部に向いている。他人のサイトをクロールしたり、ロックダウンされた環境で作業したりする場合は、依然として外部駆動方式に軍配が上がる。

6活用シーン

何ができるのか

アプリケーションの内部に住み込んでいるからこそ、ユーザーの代わりに実際に操作を完了できる——横でどう操作すればいいか説明するだけではない。原文では4つの具体例が挙げられている。

🤖
プロダクト内蔵の操作型copilot
SaaSプロダクトに、ユーザーの代わりに操作できるアシスタントを組み込む。カスタマーサポートボットが手順を説明するのではなく、直接実行してくれる。
📝
一言で複数ステップのフォームを埋める
ERPやCRMの長い複数ステップフォームを一文に圧縮する。ユーザーが昨日のランチ代50ドルの経費精算を提出してと入力すれば、ページ遷移も入力も自動でやってくれる。
🎙️
音声とアクセシビリティ
Web Speech APIと組み合わせて音声操作を実現。どんなウェブページも自然言語でたどり着けるようになり、スクリーンリーダーにもわかりやすい案内を読み上げさせられる。
🧰
レガシーシステムに自然言語の入り口を追加
APIを持たない古い社内ツールにかぶせて、コマンドバーを1本追加する。元のコードは一切変更しない。
7始め方

最小コストはscriptタグ1行

まず試してみたいなら、scriptタグ1本で無料テストモデル付きのPage Agentを読み込め、ページ上ですぐ体験できる。

評価用・1行で導入(無料テストAI付き)
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/iife/page-agent.demo.js" crossorigin="true"></script>
MIT
オープンソースライセンス、コードベースはTypeScript優先
1.10.0
jsDelivr CDN上ですぐ体験できるdemoバージョン番号

本番利用ではパッケージを導入し、エンドポイントを自分のものに差し替える。

本番用・npmインストールして自分のエンドポイントを設定
import { PageAgent } from 'page-agent'

const agent = new PageAgent({
  model: 'qwen3.5-plus',
  baseURL: 'https://dashscope.aliyuncs.com/compatible-mode/v1',
  apiKey: 'YOUR_API_KEY',
  language: 'en-US',
})

await agent.execute('Click the login button')

modelとbaseURLは任意のOpenAI互換プロバイダーを受け付ける。モデルを切り替えるのは基本的にbase-URLとkeyを差し替えるだけだ。

⚠️
あのdemoエンドポイントは技術評価専用だ。また、new PageAgentに直接書き込んだapiKeyはフロントエンドコードにそのままバンドルされてしまう。本番環境では自分のバックエンドを経由したプロキシでリクエストを転送する必要があり、鍵をクライアント側に剥き出しにしてはいけない。エージェントは重要なアクションを実行する前に確認ダイアログを出す機能にも対応している。
8実際の限界

できないこと

この「ウェブページの中に住み込む」というやり方には、それなりの代償がある。公式もその限界をはっきり示している。使う前に、これらの点をテーブルの上に並べておく必要がある。

promptに書かれた安全ルールは、あくまで提案にすぎない

「決済フォームを自動送信しない」といったルールは、システムprompt内に置かれているだけだ。これらは説得力のあるガイドではあっても、確実な保証ではない。機微な操作や破壊的な操作については、サーバーサイドの検証は必ず残さなければならず、prompt内の指示だけを唯一の防御線にしてはいけない。

コアライブラリが管理するのは単一ページのみ

コアライブラリが狙っているのは単一ビュー内でのインタラクションであり、それ自体はタブやウィンドウをまたいで移動できない。ページをまたいだ自動化を行うには、任意のChrome拡張機能を別途入れる必要があり、この拡張機能にはインストールと権限付与が別途必要になる。さらにベータ段階のMCPサーバーもあり、Claude DesktopやCopilotといった外部エージェントが逆にPage Agentを駆動できるようになっている。

展開:3つの動作場所がそれぞれ何を解決するか

コアライブラリはページ内で動き、単一ページの操作を担う。Chrome拡張機能はタブをまたぐ能力を補うが、インストールと権限が必要になるという代償がある。ベータのMCPサーバーは、Page AgentをClaude DesktopやCopitolといった外部エージェントから呼び出せるツールに変え、外部エージェントに接続し直す。3つの層はそれぞれ異なる範囲を担い、外側に行くほど設定と権限付与のコストが高くなる。

冒頭の話に戻ると、Page Agentと主流ツールは2つの異なる道を歩んでいる。一方はウェブページの内部に入り込んでテキストを読む道、もう一方は外に立ってスクリーンショットとプロトコルで遠隔操作する道だ。これはブラウザ自動化が実際に着地できる場所を、「外部スクリプトで他人のウェブページを操作する」から「プロダクト自身が備える自然言語操作の入り口」へと広げたと言える。

The agent lives inside the webpage as plain JavaScript. It reads the live DOM as text and acts as the real user. No headless browser, no screenshots, no multi-modal model. 、MarkTechPost、2026-07-02
本記事はMarkTechPostの報道をもとに整理・解読したものです。事実関係およびコード例は原文に基づきます。オープンソースのリポジトリはgithub.com/alibaba/page-agent(MITライセンス、TypeScript)。小互・AI解読站編集。