料金無料(オープンソース)
対応Windows / macOS / Linux
ライセンスMIT License
目次

概要

agent-browser は、AI エージェントが Web ブラウザを操作するための標準化されたインターフェースです。2026 年 3 月のアップデートで Electron アプリ対応が追加され、Slack、Discord、VS Code、Notion などの Desktop アプリ操作も自動化可能になりました。

Electron アプリ対応の仕組み

アーキテクチャ

┌─────────────────────────────────────────────────────────┐
│                  AI エージェント                        │
│              (Claude Code / Codex)                      │
└─────────────────────────────────────────────────────────┘
                           │
                           │ agent-browser プロトコル
                           ▼
┌─────────────────────────────────────────────────────────┐
│               agent-browser スキル                       │
│  - DOM ツリー取得(Web/Electron 共通)                   │
│  - 要素操作(クリック、入力、スクロール)                 │
│  - スクリーンショット                                    │
│  - キーボード操作                                        │
└─────────────────────────────────────────────────────────┘
                           │
              ┌────────────┴────────────┐
              │                         │
              ▼                         ▼
┌─────────────────────┐   ┌─────────────────────┐
│   Web ブラウザ       │   │   Electron アプリ   │
│   (Chrome/Firefox)  │   │   (Slack/VS Code)   │
└─────────────────────┘   └─────────────────────┘

対応 Electron アプリ

アプリ対応状況主な操作
Slack Desktop✓ 完全対応チャンネル操作、メッセージ送信
Discord✓ 完全対応サーバー移動、メッセージ、通話
VS Code✓ 完全対応ファイル操作、ターミナル、デバッグ
Notion Desktop✓ 完全対応ページ作成、編集、検索
Teams Desktop△ 一部対応チャット、会議
Zoom△ 一部対応会議参加、画面共有
Obsidian✓ 完全対応ノート作成、検索、グラフ

インストールと設定

agent-browser のインストール

# npm でインストール
npm install -g @anthropic/agent-browser

# または Claude Code 経由で自動インストール
# .mcp.json に追加すると自動でセットアップされます

Claude Code 設定

// .mcp.json
{
  "mcpServers": {
    "agent-browser": {
      "command": "npx",
      "args": ["-y", "@anthropic/agent-browser@latest"],
      "env": {
        "AGENT_BROWSER_MODE": "electron",
        "AGENT_BROWSER_APP": "slack"
      }
    }
  }
}

対応アプリの指定

# Slack を操作
export AGENT_BROWSER_APP=slack

# VS Code を操作
export AGENT_BROWSER_APP=vscode

# Discord を操作
export AGENT_BROWSER_APP=discord

# カスタム Electron アプリ
export AGENT_BROWSER_APP=custom
export AGENT_BROWSER_PATH="/Applications/MyApp.app"

基本操作

1. アプリ起動と接続

ユーザー: Slack を起動して

agent-browser: 
  action: launch_app
  params: { app: "slack" }
  result: { status: "success", pid: 12345 }

回答: Slack を起動しました。

2. 画面状態取得

ユーザー: 現在の画面状態を教えて

agent-browser:
  action: get_snapshot
  params: {}
  result: {
    type: "electron",
    app: "slack",
    elements: [
      { id: "channel-list", type: "list", visible: true },
      { id: "message-input", type: "textbox", visible: true },
      { id: "send-button", type: "button", visible: true }
    ]
  }

3. 要素操作

ユーザー: #general チャンネルに「おはようございます」と送信して

agent-browser:
  action: sequence
  steps:
    - action: click
      target: { id: "channel-general" }
    - action: type
      target: { id: "message-input" }
      text: "おはようございます"
    - action: click
      target: { id: "send-button" }
  result: { status: "success" }

実践ユースケース

Slack 自動化

ユーザー: 未読メッセージのあるチャンネルを一覧して、それぞれの最新メッセージを表示して

agent-browser:
  1. サイドバーのチャンネルリスト取得
  2. 未読バッジのあるチャンネルを抽出
  3. 各チャンネルに移動して最新メッセージ取得
  4. 結果を構造化して返す

出力例:
  - #general: 3 件の未読
    - 田中: 明日の会議資料を送ります
    - 鈴木: ありがとうございます
  - #プロジェクト A: 5 件の未読
    - 佐藤: 進捗報告をお願いします

VS Code 自動化

ユーザー: 新しい Python ファイルを作成して、FastAPI の Hello World を書いて

agent-browser:
  1. VS Code ウィンドウにフォーカス
  2. Ctrl+N で新規ファイル
  3. Ctrl+S で保存ダイアログ
  4. ファイル名入力: main.py
  5. コード入力:FastAPI テンプレート
  6. 保存

生成コード:
  from fastapi import FastAPI
  
  app = FastAPI()
  
  @app.get("/")
  def read_root():
      return {"Hello": "World"}

Discord 自動化

ユーザー: 参加中のサーバー一覧を取得して、各サーバーのオンラインメンバー数を表示して

agent-browser:
  1. サーバーサイドバー取得
  2. 各サーバーアイコンクリック
  3. メンバーリストからオンライン数カウント
  4. 結果を集計

出力例:
  - プログラミング社区:オンライン 234/500
  - ゲームサーバー:オンライン 89/200
  - 音楽好き:オンライン 45/150

Notion 自動化

ユーザー: 今週のタスクページを作成して、月曜日から金曜日までのセクションを作って

agent-browser:
  1. Notion 開く
  2. 新規ページ作成
  3. タイトル設定:「今週のタスク(2026/03/07-03/11)」
  4. 見出しブロック追加(月 - 金)
  5. 各見出し下にチェックボックステンプレート

高度なテクニック

1. ワークフローの保存と再利用

# workflows/slack-morning.yaml
name: 朝のルーティン
trigger: "朝の準備して"
steps:
  - app: slack
    actions:
      - click: "#status-channel"
      - type: "朝礼です。本日もよろしくお願いします!"
      - send
  - app: notion
    actions:
      - open: "タスクリスト"
      - filter: today
      - report: true

実行:

ユーザー: 朝の準備して

agent-browser: workflow/slack-morning.yaml 実行

2. 条件分岐付き操作

ユーザー: 未読メッセージがあったら通知して、なかったら「問題ありません」と報告して

agent-browser:
  1. 未読メッセージ数取得
  2. if 未読数 > 0:
       - 未読チャンネル一覧とメッセージ内容報告
     else:
       - "問題ありません" と報告

3. 複数アプリ連携

ユーザー: Slack の #alerts チャンネルのメッセージを Notion に記録して

agent-browser:
  1. Slack で #alerts チャンネル開く
  2. 最新 10 件メッセージ取得
  3. Notion で「アラートログ」ページ開く
  4. メッセージを追加記録
  5. 完了報告

4. 定期的な監視

// scripts/monitor.js
const agentBrowser = require('@anthropic/agent-browser');

async function monitorSlack() {
  const browser = await agentBrowser.connect('slack');
  
  setInterval(async () => {
    const mentions = await browser.getUnreadMentions();
    if (mentions.length > 0) {
      console.log('新しいメンション:', mentions);
      // 通知処理
    }
  }, 60000); // 1 分毎
}

monitorSlack();

テスト自動化

E2E テスト例

// tests/slack.test.ts
import { AgentBrowser } from '@anthropic/agent-browser';

describe('Slack E2E テスト', () => {
  let browser: AgentBrowser;
  
  beforeAll(async () => {
    browser = await AgentBrowser.launch('slack');
  });
  
  test('メッセージ送信', async () => {
    await browser.click('#test-channel');
    await browser.type('#message-input', 'テストメッセージ');
    await browser.click('#send-button');
    
    const messages = await browser.getMessages();
    expect(messages[messages.length - 1].text).toBe('テストメッセージ');
  });
  
  test('ファイルアップロード', async () => {
    await browser.uploadFile('#attach-button', './test.pdf');
    await browser.click('#send-button');
    
    const messages = await browser.getMessages();
    expect(messages[messages.length - 1].hasAttachment).toBe(true);
  });
  
  afterAll(async () => {
    await browser.close();
  });
});

ビジュアルリグレッションテスト

// tests/visual.test.ts
import { AgentBrowser } from '@anthropic/agent-browser';
import { compare } from 'pixelmatch';

test('UI リグレッション', async () => {
  const browser = await AgentBrowser.launch('slack');
  
  // 現在のスクリーンショット
  const current = await browser.screenshot();
  
  // 基准画像と比較
  const baseline = fs.readFileSync('./baseline/slack-home.png');
  const diff = new Buffer(current.length);
  
  const numDiff = compare(
    baseline,
    current,
    diff,
    current.width,
    current.height
  );
  
  expect(numDiff).toBeLessThan(100); // 許容誤差
});

データ抽出

構造化データ抽出

ユーザー: Slack の #sales チャンネルから今月の受注データを抽出して CSV で保存して

agent-browser:
  1. #sales チャンネルに移動
  2. 今月のメッセージフィルタ
  3. 受注メッセージを正規表現で抽出
  4. 構造化データに変換
  5. CSV ファイル保存

出力 CSV:
  日付,顧客名,金額,担当
  2026-03-01,株式会社 A,100000,田中
  2026-03-02,株式会社 B,250000,鈴木
  ...

定期的なデータ収集

# scripts/collect_data.py
import agent_browser
import pandas as pd
from datetime import datetime

def collect_slack_data():
    browser = agent_browser.connect('slack')
    
    # 各チャンネルからデータ収集
    channels = ['#sales', '#support', '#feedback']
    all_data = []
    
    for channel in channels:
        messages = browser.get_messages(channel, limit=100)
        for msg in messages:
            all_data.append({
                'channel': channel,
                'date': msg['date'],
                'user': msg['user'],
                'text': msg['text']
            })
    
    # DataFrame で保存
    df = pd.DataFrame(all_data)
    df.to_csv(f'data/slack_{datetime.now():%Y%m%d}.csv')

collect_slack_data()

トラブルシューティング

アプリが検出されない

解決策:

# app path を明示指定
export AGENT_BROWSER_PATH="/Applications/Slack.app"

# または
export AGENT_BROWSER_EXECUTABLE="C:\Program Files\Slack\slack.exe"

要素が見つからない

解決策:

# DOM 再取得をトライガー
ユーザー: 画面を更新して

# または
ユーザー: 要素一覧を再取得して

操作がタイムアウトする

解決策:

# タイムアウト延長
export AGENT_BROWSER_TIMEOUT=30000  # 30 秒

セキュリティ注意事項

認証情報の扱い

# 悪い例:認証情報をスクリプトにハードコード
export SLACK_TOKEN=xoxb-xxx

# 良い例:環境変数またはシークレット管理
export SLACK_TOKEN=$SECRET_SLACK_TOKEN

操作ログの記録

// 操作ログを記録
const logger = new OperationLogger();

browser.on('action', (action) => {
  logger.log({
    timestamp: Date.now(),
    action: action.type,
    target: action.target,
    user: session.userId
  });
});

参考リンク

免責事項 — 掲載情報は執筆時点のものです。料金・機能は変更される場合があります。最新情報は各公式サイトをご確認ください。