Claude Platform Docs
Messagesツール

SDKツールセットでのブラウザ使用

PythonまたはTypeScript SDKからブラウザ使用ツールを実行します。SDKはループと、設定したURL、ファイル、承認のチェックを実行し、ブラウザはご自身で用意します。

PythonおよびTypeScript SDKには、「browser use tool」(ブラウザ使用ツール)用のクラスが含まれています。このクラスをサブクラス化し、navigateやleft_clickなどの「member tool」(メンバーツール)ごとに1つのメソッドを、独自のブラウザ自動化に対して記述します。SDKは各呼び出しをルーティングし、URLとファイルパスをチェックし、承認コールバックに問い合わせ、各tool_resultを構築します。

SDKには、ブラウザ、既製の「driver」(ドライバー)、「denylist」(拒否リスト)は含まれていません。PlaywrightおよびChrome DevTools Protocol向けのPythonとTypeScriptのドライバー例は、claude-quickstartsリポジトリのbrowser-toolsetフォルダーにあります。

クイックスタート

ドライバーとは、BetaAbstractBrowserToolset20260801の独自のサブクラスです。この例では、navigate、screenshot、left_clickに加えて、すべてのドライバーに必要な状態レポートである_browser_state(TypeScriptではbrowserState)を実装しています。この例のbackendは、Playwrightなどのブラウザ自動化ライブラリをラップする独自のラッパーを表します。

from anthropic import Anthropic
from anthropic.tools.browser import (
    BetaAbstractBrowserToolset20260801,
    BetaBrowserNavigateResult,
    BetaBrowserScreenshotResult,
    BrowserState,
    ToolsetCallContext,
)
from anthropic.types.beta import (
    BetaBrowserLeftClickInput,
    BetaBrowserNavigateInput,
    BetaBrowserScreenshotInput,
    BetaBrowserStateTabEntryParam,
)


class MyBrowser(BetaAbstractBrowserToolset20260801):
    def __init__(self, backend, **options):
        super().__init__(**options)
        self.backend = backend

    def _browser_state(self, context: ToolsetCallContext) -> BrowserState:
        return BrowserState(
            tabs=[
                BetaBrowserStateTabEntryParam(
                    tab_id=tab.id,
                    title=tab.title,
                    url=tab.url,
                    active=tab.id == self.backend.active,
                )
                for tab in self.backend.tabs()
            ],
            state_changes=self.backend.drain_changes(),
        )

    def navigate(
        self, context: ToolsetCallContext, input: BetaBrowserNavigateInput
    ) -> BetaBrowserNavigateResult:
        # input.url は URL ポリシーを通過した URL、または "back"、"forward"、
        # "reload" のいずれかです。Claude がスキームを省略した場合、SDK が https:// を付加します。
        page = self.backend.goto(input.url, input.tab_id)
        return BetaBrowserNavigateResult(
            url=page.url, status=page.status, title=page.title
        )

    def screenshot(
        self, context: ToolsetCallContext, input: BetaBrowserScreenshotInput
    ) -> BetaBrowserScreenshotResult:
        data = self.backend.png_base64(input.tab_id)
        return BetaBrowserScreenshotResult(data=data, media_type="image/png")

    def left_click(
        self, context: ToolsetCallContext, input: BetaBrowserLeftClickInput
    ) -> None:
        # 返す値はありません。Claude には "Clicked." が渡されます
        self.backend.click(input.target, input.tab_id)

    def close(self) -> None:
        super().close()  # first, so no call is still using the browser when it closes
        if not self.backend.closed:
            self.backend.close()


client = Anthropic()
with MyBrowser(backend, allowed_domains=["example.com", "iana.org"]) as browser:
    runner = client.beta.messages.tool_runner(
        model="claude-opus-5-5",
        max_tokens=1024,
        tools=[browser],
        messages=[
            {
                "role": "user",
                "content": "Open example.com and tell me the page heading.",
            }
        ],
    )
    for message in runner:
        print(message)

ドライバーインスタンス自体をtoolsエントリとして渡します。実装していないメンバーは、無効としてAPIに送信されます。それでもClaudeがそのメンバーを呼び出した場合、SDKはエラーを返し、実行は継続します。executeをオーバーライドすると、無効として送信されるメンバーが変わります(前後のフックを追加する)。ランナーはツールセットを閉じないため、1つのインスタンスで複数の実行に対応できます。使い終わったら閉じてください。

ドライバーをカスタマイズする

メンバーを有効化または無効化する

configsは、ツールセットを設定するで説明されているメンバーごとの設定を受け取ります。変更するメンバーのみを列挙します:

# read_console も実装した MyBrowser
browser = MyBrowser(
    backend, configs={"read_console": {"enabled": True}, "navigate": {"enabled": False}}
)

SDKは、無効化されたメンバーへの呼び出しを、コードが実行される前に拒否します。クラスが実装していないメンバーを有効にすると、クラスがexecuteをオーバーライドしていない限り、設定エラーになります。

前後のフックを追加する

executeをオーバーライドし、親のexecuteを呼び出します。その呼び出しより前のコードは、URLチェック(URLポリシーを設定する)とconfirm(影響の大きいメンバーを制限する)の後に実行され、入力を変更できます。SDKは変更された入力を再度チェックしません。呼び出しより後のコードは結果を受け取り、結果を変更できます。呼び出しを拒否するには、ToolErrorを送出します(TypeScriptではthrowします)。

executeをオーバーライドすると、Claudeに提供されるメンバーが変わります。SDKはすべてのメンバーを実装済みとみなすため、デフォルトで有効なすべてのメンバーがClaudeに提供されます。クイックスタートのMyBrowserは3つのメンバーしか処理しないため、次のTracedBrowserは処理できないメンバーをClaudeに提供してしまいます。使用する前に、configsでそれらのメンバーを無効にしてください。

import time


class TracedBrowser(MyBrowser):
    def execute(self, context, name, input):
        started = time.monotonic()
        result = super().execute(context, name, input)
        elapsed_ms = (time.monotonic() - started) * 1000
        call_id = context.tool_use.id if context.tool_use else "-"
        log.info("%s %s %.0fms", call_id, name, elapsed_ms)
        return redact(result) if name == "get_page_text" else result

ドライバーを実装する

ブラウザがサポートするメンバーをオーバーライドします。各メンバーは、呼び出しコンテキストと、BetaBrowserNavigateInputなどの型付きオブジェクトとしてのメンバーの入力を受け取ります。入力型はanthropic.types.beta(TypeScriptでは@anthropic-ai/sdk/resources/beta)から提供されます。各入力のフィールドはメンバーツールに記載されています。

TypeScriptでは、SDKがプロトタイプ上でメンバーを検出するため、メンバーはアロー関数フィールドではなくメソッドとして記述してください。TypeScriptではtypeメンバーをtype_と記述します。Pythonではtypeです。

結果を返す

メンバーが返すものによって、Claudeが読み取る内容が決まります。成功した結果は、状態レポートから構築されたbrowser_stateブロックで終わります。エラー結果にはブロックは含まれません。

メンバー戻り値Claudeが読み取る内容
screenshot、zoomBetaBrowserScreenshotResult1つの画像ブロック
navigateBetaBrowserNavigateResultNavigated to {url} — {title} (HTTP {status})
new_tab、switch_tab、list_tabs、close_tabタブエントリ(new_tab、switch_tab)、タブエントリのリスト(list_tabs)、または何も返さない(close_tab)browser_stateブロックのみ
read_page、get_page_text、find、read_console、read_network、javascript_exec文字列その文字列
その他すべてのメンバー何も返さない、または1行のテキストClicked.などの短い確認メッセージと、それに続く独立したテキストブロック内の返された行

ブラウザの状態を報告する

SDKは、拒否された呼び出しや失敗した呼び出しを含め、すべての呼び出しの後に_browser_state(TypeScriptではbrowserStateオプション)を呼び出します。開いているすべてのタブと、前回のレポート以降に変更された内容を返します:

  • 開かれたタブとダウンロードイベント。
  • 「request hook」(リクエストフック)がブロックした各ナビゲーションに対するNavigationRefused。
  • ドライバーが閉じた各ネイティブダイアログに対するDialogDismissed。

これらはすべてstate_changesに入れます。Pythonでは、NavigationRefused(url=...)とDialogDismissed(kind=..., message=...)はanthropic.tools.browserから提供されます。TypeScriptでは、{ type: "navigation_refused", url }と{ type: "dialog_dismissed", kind, message }です。

後の2つはAPIの状態変更ではありません。SDKはこれらをbrowser_stateブロックの外側のテキストとしてClaudeに報告します。拒否されたすべてのナビゲーションについてはURLを示さない1行、閉じられたダイアログについては最初の3つそれぞれに1行ずつ、その後に残りの件数を報告します。

タブが開いている場合は、ちょうど1つがアクティブである必要があります。tab_idを受け取るすべてのメンバーは、指定されたタブに対して動作する必要があります。SDKはレポートを使用して、結果がどのページから得られたかを判断します。レポートに関するAPIの制限は、browser_stateでタブを追跡するに記載されています。

エラーを処理する

メンバーまたはSDKが送出するものClaudeが読み取る内容実行
ToolErrorそのメッセージ(エラー結果として)継続
その他の例外そのテキスト(エラー結果として)継続
ToolsetUsageError(設定ミス、呼び出し中のSDKの誤用、またはclose後の呼び出しの場合)なし停止

メンバーのエラーテキスト、left_clickなどのアクションが返す行、失敗したダウンロードのエラー、または閉じられたダイアログのメッセージをClaudeが読み取る前に、SDKはポリシーが拒否する各URLを(blocked)に置き換えます。また、ファイルポリシーが公開しない各ローカルパスを(path hidden)に置き換えます。このチェックでは一部のURLやパスを見逃す可能性があります。URLポリシー、ファイルポリシー、またはconfirmの「callable」(呼び出し可能オブジェクト)からのToolErrorは記述されたとおりにClaudeに届くため、そのテキストには拒否されたURLやローカルパスを含めないでください。メンバー内で例外をキャッチし、独自のテキストでToolErrorを送出してください(TypeScriptではthrowします)。

ツールランナーなしで実行する

インスタンスをtoolsに渡し(TypeScriptではbrowser.toJSON())、各メンバー呼び出しにtool_result(TypeScriptではtoolResult)で応答します。ブラウザ使用ツールでは、最初に失敗した呼び出しで停止する必要があります(バッチアクション)。失敗した呼び出しの後、このループはそのターンの後続の呼び出しを実行せずに応答します:

from anthropic.types.beta import BetaToolResultBlockParam

NOT_EXECUTED = "Not executed: an earlier action in this turn failed."
MAX_TURNS = 10

with MyBrowser(backend, allowed_domains=["example.com"]) as browser:
    messages = [{"role": "user", "content": "Open example.com"}]
    for _ in range(MAX_TURNS):
        response = client.beta.messages.create(
            model="claude-opus-5-5",
            max_tokens=1024,
            tools=[browser],
            messages=messages,
        )
        messages.append({"role": "assistant", "content": response.content})
        calls = [
            block
            for block in response.content
            if block.type == "tool_use" and block.toolset_name == browser.toolset_name
        ]
        if not calls:
            break
        results: list[BetaToolResultBlockParam] = []
        failed = False
        for call in calls:
            if failed:
                # 呼び出しが失敗した後、そのターンの残りの呼び出しは実行されず、応答だけが返されます。
                results.append(
                    {
                        "type": "tool_result",
                        "tool_use_id": call.id,
                        "toolset_name": call.toolset_name,
                        "content": NOT_EXECUTED,
                        "is_error": True,
                    }
                )
                continue
            result = browser.tool_result(call)
            failed = bool(result.get("is_error"))
            results.append(result)
        messages.append({"role": "user", "content": results})

スキップされた呼び出しへの各応答には、is_error、呼び出しのtoolset_name、およびバッチアクションで求められる正確なテキストが含まれます。ツールランナーも同じ応答を送信します。

ツールセットを安全に実行する

Claudeの次のアクションは、読み取るページに依存します。ページ、またはページに注入されたテキストは、内部サービスへのアクセスやホストからのファイルの持ち出しを試みる可能性があります。また、実際の影響を伴うアクションを引き起こそうとする可能性もあります。使い捨てのブラウザ以外に対してドライバーを実行する前に、次の6つの手順を実行してください:

  1. URLポリシーを設定する:allowed_domains、blocked_domains、または独自のurl_policy。
  2. ドライバーでリクエストをインターセプトし、ツールセットに判定を求めます。
  3. コンテナに「egress policy」(エグレスポリシー)を適用し、ドライバーが認識できないものをネットワークでブロックします。
  4. アップロードとダウンロードを制限するか、アップロードを無効のままにします。
  5. confirmで影響の大きいメンバーを制限します。
  6. セッションごとに専用のコンテナまたはVMでブラウザホストを分離します。

SDKは、手順1、4、5を設定に従って適用します。手順2、3、6はドライバーとデプロイメント次第です。セキュリティ上の考慮事項の注意事項も適用されます。

URLポリシーを設定する

allowed_domains(TypeScriptではallowedDomains)に、タスクに必要なサイトを設定します。どちらのリストのエントリも、ドメイン(そのサブドメインも対象)、IPアドレス、またはCIDRネットワークです。allowed_domainsを設定すると、ツールセットはそれ以外のすべてのホストを拒否します。

browser = MyBrowser(backend, allowed_domains=["example.com", "iana.org"])

タスクでオープンなWebが必要な場合は、代わりにblocked_domains(blockedDomains)を設定します。リストはホスト名を名前解決せずに比較します。拒否リストのエントリ127.0.0.0/8はlocalhostをブロックしないため、ネットワークだけでなくホスト名も指定してください。両方のリストを設定した場合は、blocked_domainsが優先されます。

拒否リストでは、プライベートアドレスに解決されるパブリックな名前を検出できません。そのため、blocked_domainsを使用する場合、そのような名前がプライベートアドレスに到達するのを防ぐのはコンテナのエグレスポリシーです。

# ブラウザからは到達できても Claude にはアクセスさせてはならないホストとネットワークを列挙します:
# IPv4 と IPv6 のループバック、リンクローカル、プライベートの各範囲、0.0.0.0/8、
# ご利用のクラウドのメタデータアドレスと名前(metadata.google.internal など)、
# localhost、および内部ホスト名です。
browser = MyBrowser(backend, blocked_domains=internal_networks)

url_policy(urlPolicy)は両方のリストを置き換えるもので、いずれかのリストと一緒に渡すと設定エラーになります。ポリシーは、URLを許可する場合は何も返さず、拒否する場合はToolErrorを送出(throw)します。デフォルトのルールを維持するには、default_url_policy(defaultURLPolicy)でデフォルトポリシーを構築し、独自のポリシーから最初にそれを呼び出します:

from urllib.parse import urlsplit

from anthropic.tools.browser import ToolError, URLContext, default_url_policy

listed = default_url_policy(allowed_domains=["example.com"])


def url_policy(context: URLContext, url: str) -> None:
    listed(context, url)  # the default rules first
    if context.phase == "request" and urlsplit(url).scheme != "https":
        raise ToolError("Only https navigation is allowed.")


browser = MyBrowser(backend, url_policy=url_policy)

ポリシーは、コードの実行前にすべてのnavigateのURLに対して、結果が報告するURLに対して、そして状態レポート内のすべてのタブとダウンロードのURLに対して実行されます。結果と状態レポートでは、リモートホストを示さないアドレス(空のタブ、about:blank、ブラウザのchrome-error:ページ、data:ドキュメント)はスキップされます。

どのポリシーの下でも、ツールセットはabout:blankを除き、httpまたはhttps以外のスキームへのnavigateを拒否します。url_policy="allow_all"(urlPolicy: "allow_all")はポリシーを無効にしますが、このスキームルールは無効になりません。

url_policy=None(urlPolicy: null)を渡すとコンストラクターが設定エラーを送出するため、設定から読み込まれたNone(null)によってチェックが無効になることはありません。TypeScriptでは、undefinedはオプションを未設定のままにし、渡さない場合と同じになります。

ページが拒否されたアドレスに到達すると、Claudeはそのコンテンツが差し控えられたことを読み取り、タブは(blocked)として表示されます。タブが再び許可されたアドレスに移るまで、ツールセットはそのタブに対する呼び出しを拒否します。例外は、navigate(ただし"reload"を除く)、new_tab、list_tabs、switch_tab、close_tabです。

ドライバーでリクエストをインターセプトする

URLポリシーが判定するのは、ツールセットが認識するアドレス(ナビゲーション、結果、状態レポート)のみです。サブリソース、fetch()呼び出し、WebSocket、またはホスト名の解決先は認識しません。

ツールセットが新しいアドレスを検出するのは、呼び出しが終了したとき、その呼び出しの結果または状態レポートにおいてのみです。そのため、それまでの間に呼び出しが拒否されたページに対して動作する可能性があり、SDKにできるのはせいぜいその呼び出しの結果を差し控えることだけです。ドライバーがリダイレクトのホップを含むすべてのリクエストを判定しない限り、拒否されたアドレスにリダイレクトするページは読み込まれてしまいます。

ドライバーのリクエストフック(自動化ライブラリが各リクエストの前に呼び出す関数)で、check_url(checkURL)を呼び出します。これはツールセット自体のポリシーを適用するため、ルールを二重に記述する必要はありません:

from anthropic.tools.browser import URLContext


class MyBrowser(BetaAbstractBrowserToolset20260801):
    ...

    # Playwright のブラウザコンテキストに context.route("**/*", self._guard) で登録されます
    def _guard(self, route):
        url_context = URLContext(
            member="navigate", phase="request", tab_id=self.backend.active
        )
        if not self.check_url(url_context, route.request.url).allowed:
            return route.abort("blockedbyclient")
        route.continue_()

check_urlはnavigateと同じスキームルールとポリシーを適用します。このようなリクエストフックは、WebSocketハンドシェイク、Service Workerのリクエスト、リダイレクトのホップを認識しません。Service Workerはブロックしてください。WebSocketハンドシェイクとリダイレクトのホップは、それらを認識できるフックで判定してください。

リクエストフェーズでは、check_urlはhttp、https、about:blankのURLのみを許可します。そのため、WebSocketの場合は、呼び出す前にws://をhttp://に、wss://をhttps://に変更してください。

コンテナにエグレスポリシーを適用する

インターセプトではブラウザが行うすべてのリクエストを認識できず、URLポリシーは名前の解決先を認識しません。コンテナのネットワークが適用するエグレスポリシーは、その両方をカバーします:

  • IPv4とIPv6のループバック、リンクローカル、プライベートアドレス範囲、および0.0.0.0/8をブロックします。これにはクラウドメタデータアドレス169.254.169.254が含まれます。
  • タスクに必要なホストへのアウトバウンド接続のみを許可します。ルールがIPアドレスで照合する場合は、コンテナの起動時に許可するホスト名を名前解決してください。
  • DNSはコンテナのリゾルバーへのみ許可します。
  • ドライバーがローカルのDevToolsポート経由でブラウザにアクセスする場合は、そのポートでのみループバックを許可します。ループバック全体を許可するルールでは、すべてのローカルサービスがページに開放されてしまいます。

アップロードとダウンロードを制限する

file_uploadはデフォルトで無効です。file_policyがない場合、SDKはパスまたはドキュメントIDを指定するすべてのアップロードを拒否します。アップロードを有効にするには、タスクのファイルのみを保持する1つのアップロードディレクトリを指定したLocalFilePolicy(TypeScriptではNodeFilePolicy)を渡します:

from anthropic.tools.browser import LocalFilePolicy

# file_upload も実装する MyBrowser です
browser = MyBrowser(
    backend,
    configs={"file_upload": {"enabled": True}},
    confirm=make_confirm(),  # required for file_upload; see Gate consequential members
    file_policy=LocalFilePolicy(
        upload_roots=["/task/uploads"],
        download_dir="/task/downloads",
        expose_download_paths=False,
    ),
)

SDKはシンボリックリンクをたどって各アップロードパスを解決し、アップロードルート外のパスを拒否します。ファイルポリシーは、アップロードルート内にあるダウンロードディレクトリを拒否します。ダウンロードのパスがClaudeに届くのは、expose_download_paths(exposeDownloadPaths)がtrueで、かつファイルがダウンロードディレクトリ内にある場合のみです。

付属のパスチェックは、SDKを実行するプロセスのファイルシステム上でパスを解決します。保護されるのは、そのファイルシステムを共有するブラウザのみです。リモートブラウザの場合は、代わりにリモートブラウザとホスト型ブラウザに従ってください。

ダウンロードは次のように設定します:

  • ダウンロードディレクトリはモード0700で自分で作成し、noexec,nosuid,nodevでマウントします。
  • シェルやファイルツールなど、Claudeが呼び出せる他のツールからディレクトリにアクセスできないようにします。
  • download_failed状態変更では、errorを固定のフレーズとして記述します。例外のテキストにはパスやURLが含まれる可能性があります。
  • 人が判断するまで、ダウンロードしたファイルを会話に読み込んだり実行したりしないでください。

影響の大きいメンバーを制限する

javascript_execとfile_uploadはデフォルトで無効です。confirm呼び出し可能オブジェクトなしでいずれかを有効にすると、コンストラクターは設定エラーを送出します。confirm呼び出し可能オブジェクトがある場合、SDKは実行されようとしているすべての呼び出しの前にそれを呼び出します。ない場合は、何も確認されません。

呼び出しを実行するにはTrueを、拒否するにはFalseを返します(TypeScriptではtrueとfalse)。呼び出し可能オブジェクトが人に確認する場合は、メンバー、ページのURL、呼び出しの入力を表示してください。入力にはページからのテキストが含まれる可能性があるため、まず入力内の印字可能なASCII以外のすべての文字をエスケープしてください。

この例では、独自のask_user関数(TypeScriptではaskUser)を通じて2つの制限対象メンバーについて確認し、それ以外は承認します:

import json
from collections.abc import Callable

from anthropic.tools.browser import ConfirmContext

GATED = {"javascript_exec", "file_upload"}


def shown(context: ConfirmContext) -> str:
    """The call's input as JSON, with every character outside printable
    ASCII escaped."""
    return json.dumps(context.input.to_dict(), ensure_ascii=True, indent=2)


def make_confirm() -> Callable[[ConfirmContext], bool]:
    granted: set[tuple[str, str, str]] = set()

    def confirm(context: ConfirmContext) -> bool:
        name = context.member
        if name not in GATED:
            return True
        detail = shown(context)
        page = context.tab_url
        origin = context.origin
        if page is None or origin is None or origin.startswith("chrome-error:"):
            # オリジンがない場合やエラーページの場合は、毎回確認します。
            return ask_user(
                f"Allow {name} on {page or 'a page with no origin'}?\n{detail}"
            )
        # 承認は、このページ上のこの入力内容そのものにのみ適用されます。
        key = (name, page, detail)
        if key not in granted and ask_user(f"Allow {name} on {page}?\n{detail}"):
            granted.add(key)
        return key in granted

    return confirm


# javascript_exec と file_upload も実装した MyBrowser
browser = MyBrowser(
    backend,
    configs={"javascript_exec": {"enabled": True}, "file_upload": {"enabled": True}},
    confirm=make_confirm(),
)

make_confirm()(TypeScriptではmakeConfirm())を呼び出すたびに、承認を持たない呼び出し可能オブジェクトが返されます。ツールセットごとに1回呼び出し、各ユーザーに専用のツールセットを割り当ててください。

承認の対象は、最後の状態レポートが示した時点のページであり、呼び出しが実行される前にページが変わる可能性があります。購入、メッセージの送信、規約への同意は、left_clickやtypeなどの通常のメンバーを通じて行われるため、confirmはそれらを名前で識別できません。人にそれらを承認させるには、それらのメンバーについても確認してください。

リクエストをインターセプトしないドライバーでは、javascript_execを有効にしないでください。拒否されたページで実行されるスクリプトは、そのコンテンツを後の読み取りで返される場所にコピーできてしまいます。

ブラウザホストを分離する

セッションごとに、専用の最小権限のコンテナまたはVMでブラウザを実行します:

  • 非rootユーザーとして実行し、ブラウザが許容する場合は読み取り専用のルートファイルシステムを使用します。
  • 設定したアップロードおよびダウンロードディレクトリ(ある場合)以外は、ホストから何もマウントしません。
  • 認証情報を環境に含めず、新しいブラウザプロファイルから開始します。
  • Claudeが呼び出せる他のツールとファイルシステムを共有しません。

APIを呼び出すコードはAPIキーと会話を保持しているため、ブラウザのコンテナの外で実行してください。ツールランナーとtool_resultはどちらもそのコードのプロセス内でツールセットを実行するため、ブラウザはツールセットのファイルシステムを共有しません。ブラウザはリモートとして扱ってください。リモートブラウザとホスト型ブラウザが適用されます。

ページテキスト、スクリーンショット、コンソールとネットワークのエントリ、タブのタイトル、ダウンロード名など、ページが返すものはすべて信頼できないものとして扱ってください。

リモートブラウザとホスト型ブラウザ

一部のブラウザは、SDKを実行するプロセスとファイルシステムを共有しません。例としては、別のコンテナ内のブラウザ、DevTools URLでアクセスするブラウザ、ホスト型ブラウザサービスのブラウザがあります。これらの場合でも、URLポリシー、リクエストのインターセプト、confirmは引き続き自分のプロセス内で実行されます。

ホスト型ブラウザでは、プロバイダーがエグレスとホストの分離を制御します。独自のエグレスポリシーはそこには適用されないため、ドライバーのリクエストフックがブラウザのリクエストに対する唯一のチェックになります。ブラウザのネットワークが何にアクセスできるかを確認してください。

付属のパスチェックはリモートブラウザを保護しません。LocalFilePolicy(TypeScriptではNodeFilePolicy)はSDKを実行するプロセスのファイルシステム上のパスをチェックしますが、ブラウザは自身のファイルシステムを読み書きします。

SDKはブラウザがリモートであることを検出できません。そのため、リモートブラウザの場合は、ドライバーが独自のFilePolicyを使用してブラウザが実行される場所でアップロードパスをチェックしない限り、file_uploadを無効のままにしてください。FilePolicyは各アップロードのパスとドキュメントIDを検査し、Claudeがダウンロードのパスを参照できるかどうかを決定します。

リモートブラウザ自体のホストにアップロードとダウンロードを制限するのダウンロード設定がない限り、リモートブラウザにはダウンロードを拒否させてください。

ドライバーの例はこのルールに従っています。リモートブラウザでは、file_policy(filePolicy)または有効化されたfile_uploadに対して設定エラーを送出し、ブラウザがダウンロードを拒否するように設定します。

プロバイダーのAPIキーと、キーを含む可能性のあるセッションの接続URLは、ログ、ツール結果、エラーテキストに含めないでください。プロバイダーがセッションを記録する場合、その記録はClaudeが見て入力したすべてのもののもう1つのコピーとなり、プロバイダーの保持条件が適用されます。

リファレンス

コンストラクターのオプションは、両方のSDKで同じ意味を持ちます:

PythonTypeScript設定内容
configsconfigs有効にするメンバー
confirmconfirm各呼び出しを承認または拒否する呼び出し可能オブジェクト
allowed_domains、blocked_domainsallowedDomains、blockedDomainsデフォルトURLポリシーのリスト
url_policyurlPolicy独自のURLポリシー
file_policyfilePolicyアップロードルートとダウンロードパスの公開
tool_configstoolConfigscache_controlなど、toolsエントリのフィールド
_browser_stateメソッドbrowserState状態レポート

構築後にオプションを変更することはできません。デフォルト値、エラー、コンテキストフィールド、および非同期Pythonクラス(BetaAsyncAbstractBrowserToolset20260801)については、Python SDKおよびTypeScript SDKに記載されています。

制限事項

  • URLポリシーがチェックするのはナビゲーションであり、すべてのリクエストではありません: ドライバーでリクエストをインターセプトするを参照してください。
  • 承認は最後の状態レポートに基づきます: そのレポートの後にページが変わる可能性があります。SDKは呼び出しが実行される前にページを再度チェックしません。
  • 1つのツールセットに対する呼び出しは一度に1つずつ実行されます: これを無効にすることはできません。
  • SDKは、タブIDが一意であること、1つのタブがアクティブであること、タブの数をチェックしません: これらのルールに違反するレポートはAPIが拒否します。

次のステップ

メンバーツール、browser_stateブロック、およびツールのセキュリティに関する考慮事項。

SDKがループを実行する方法と、送信するメッセージを変更する方法。

信頼できないコンテンツを読み取るあらゆるアプリケーション向けのガードレール。

Was this page helpful?