Инструкция: Использовать Steel Browser

Trigger: пользователь просит открыть сайт, сделать скриншот, заполнить форму, собрать данные со страницы

Зачем

Steel.dev — облачный браузер. Агент создаёт удалённую сессию, подключается по CDP через Playwright и управляет браузером программно. Не нужен локальный Chrome. Можно наблюдать за сессией в реальном времени.

MCP-инструменты (приоритет)

Если доступен MCP-сервер steel_browser — используй его инструменты в первую очередь:

steel_browser: navigate { url: "https://example.com" }
steel_browser: screenshot {}
steel_browser: click { selector: "button#submit" }
steel_browser: type { selector: "input[name=q]", text: "запрос" }
steel_browser: scroll_down {}
steel_browser: go_back {}

MCP сам управляет сессией. Bash-шаги ниже не нужны когда MCP доступен.

Наблюдение за браузером

Пока сессия активна пользователь может наблюдать в реальном времени:

  • Локальный Steel: $STEEL_VIEWER_URL (если задан) или $STEEL_BROWSER_URL/ui
    • Логин и пароль — спроси у администратора
  • Облако: https://app.steel.dev/sessions/{SESSION_ID}

Отправь ссылку пользователю если задача долгая.

Bash-шаги (если MCP недоступен)

  1. Создай сессию и сохрани SESSION_ID:
SESSION_JSON=$(curl -fsSL -X POST "https://api.steel.dev/v1/sessions" \
  -H "Steel-Api-Key: $STEEL_API_KEY" \
  -H "Content-Type: application/json" -d '{}')
SESSION_ID=$(echo "$SESSION_JSON" | python3 -c "import sys,json; print(json.load(sys.stdin)['id'])")
echo "Session: $SESSION_ID"
echo "Viewer: https://app.steel.dev/sessions/$SESSION_ID"
  1. Выполни задачу через Node.js + Playwright:
node - <<JS
const { chromium } = require('playwright-core');
(async () => {
  const browser = await chromium.connectOverCDP(
    "wss://connect.steel.dev?apiKey=" + process.env.STEEL_API_KEY + "&sessionId=" + process.env.SESSION_ID
  );
  const page = await browser.newPage();
  await page.goto('URL_ЗДЕСЬ', {timeout: 15000});
  console.log('title:', await page.title());
  // await page.screenshot({ path: '/opt/data/screenshot.png', fullPage: true });
  await browser.close();
})().catch(e => { console.error(e.message); process.exit(1); });
JS
  1. Освободи сессию после работы:
curl -fsSL -X POST "https://api.steel.dev/v1/sessions/$SESSION_ID/release" \
  -H "Steel-Api-Key: $STEEL_API_KEY" > /dev/null && echo "Session released"
  1. Залогируй в daily что был использован Steel browser

Публичный vs локальный Steel

Посмотри на STEEL_BROWSER_URL в env:

  • Нет переменной или URL ведёт на api.steel.dev → облачный публичный инстанс.

    • Используй как обычно, но не оставляй сессии открытыми после работы.
    • Не вводи там свои пароли, токены, личные данные — инфраструктура чужая.
    • Всегда освобождай сессию сразу после задачи.
  • URL содержит .2pub.me или локальный IP → это твой персональный Steel.

    • Безопасно держать сессии дольше (например, остаться залогиненным между задачами).
    • CDP-адрес: $STEEL_BROWSER_URL вместо wss://connect.steel.dev.
    • API-эндпоинты: $STEEL_BROWSER_URL/v1/sessions вместо https://api.steel.dev/v1/sessions.

Пример подключения к локальному Steel через CDP:

node - <<JS
const { chromium } = require('playwright-core');
(async () => {
  const baseUrl = process.env.STEEL_BROWSER_URL; // e.g. http://157.x.x.x:14003
  const res = await fetch(baseUrl + '/v1/sessions', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json', 'steel-api-key': process.env.STEEL_API_KEY },
    body: '{}'
  });
  const { id: sessionId } = await res.json();
  const wsUrl = baseUrl.replace('http', 'ws') + '?sessionId=' + sessionId;
  const browser = await chromium.connectOverCDP(wsUrl);
  const page = await browser.newPage();
  await page.goto('URL_ЗДЕСЬ', { timeout: 15000 });
  console.log('title:', await page.title());
  await browser.close();
  // освободи сессию если не нужна дальше
})().catch(e => { console.error(e.message); process.exit(1); });
JS

Важно

  • STEEL_API_KEY должен быть в env агента
  • Сессия живёт 5 минут без активности — освобождай после работы (кроме случаев когда нужен persistent login на своём инстансе)
  • Для простого парсинга текста — лучше использовать обычный HTTP запрос, Steel нужен для динамических сайтов, кликов, форм, скриншотов