Останнім часом чи не кожен мій проєкт потребує одного й того ж: надійного способу інтегрувати вебконтент у скрипт або агент. І це не має бути крихкий скрейпінг, що тримається на CSS-селекторах та чесному слові. Мені потрібен інструмент, який бере URL і повертає чистий, структурований текст, готовий до подальшої обробки. Я вже не раз писав подібні обгортки, і вони завжди виявлялися складнішими, ніж здавалося спочатку. Тому, коли Mozilla випустила tabstack CLI — єдиний бінарний файл на Go, що працює з Tabstack AI API, — я вирішив присвятити йому вечір.
Опис у README лаконічний: будь-яка взаємодія з вебом, яка потрібна вашому агенту чи стеку, доступна прямо з термінала або скрипту. Утиліта перетворює будь-який URL на чистий Markdown або структурований JSON, виконує автоматизацію браузера за допомогою природної мови та відповідає на дослідницькі запитання з посиланнями на джерела. Що мене особливо зачепило: вивід має чудовий вигляд у терміналі, але при цьому його можна одразу передавати в jq через пайп без додаткових прапорців. Це дрібниця, яка свідчить про те, що розробники самі живуть у командному рядку.
Ось мій досвід знайомства з цим інструментом.
Встановлення
Вам не потрібно встановлювати середовище виконання чи щось налаштовувати — інструмент постачається як єдиний статичний бінарний файл для macOS, Linux та Windows. Найшвидший спосіб — скористатися скриптом встановлення:
curl -fsSL https://tabstack.ai/install.sh | sh
Це завантажить потрібний файл і додасть його до вашого PATH. Якщо ви не хочете запускати скрипт із мережі напряму, є альтернативи. Якщо у вас встановлено Go, виконайте:
go install github.com/Mozilla-Ocho/tabstack-cli/cmd/tabstack@latest
Бінарний файл з’явиться в $GOPATH/bin (зазвичай це ~/go/bin). Якщо після цього оболонка не бачить tabstack, перевірте, чи додана ця директорія до PATH:
export PATH="$HOME/go/bin:$PATH"
Також можна завантажити готові файли зі сторінки Releases або клонувати репозиторій і запустити make install-local. Усі шляхи максимально прості та зрозумілі.
Розумна автентифікація
Це те, за що хочеться похвалити розробників передусім. Робота з доступами часто реалізована абияк, але тут все інакше. Ви логінитеся один раз:
tabstack auth login # запитує ключ (введення приховане) і зберігає його в конфіг
tabstack auth status # показує, звідки береться ключ, але не виводить його
Ключ може підтягуватися з трьох місць у строгому порядку пріоритетності:
- прапорець
--api-key; - змінна оточення
TABSTACK_API_KEY; - файл конфігурації
$XDG_CONFIG_HOME/tabstack/config.toml(за замовчуванням~/.config/tabstack/config.toml).
Файл конфігурації має права доступу 0600, тож він захищений від стороннього читання. Якщо ключ не знайдено, команда завершиться з кодом 2 і підказкою, замість того, щоб «виплюнути» помилку стеку. До кодів завершення ми ще повернемося — вони тут важливі.
Основа: перетворення сторінки на корисні дані
Кожна команда має передбачувану структуру: tabstack <group> <action> <target>. Коли ви це зрозумієте, робота з інструментом стане інтуїтивною.
Найперше, що я спробував — extract. У найпростішому варіанті вона перетворює сторінку на чистий Markdown:
tabstack extract markdown https://example.com --metadata
Прапорець --metadata додає заголовок, автора та іншу супутню інформацію. Але справжня магія — це структурований витяг даних у JSON за заданою схемою:
tabstack extract json https://example.com --schema @schema.json
tabstack extract json https://example.com --schema '{"type":"object","properties":{"title":{"type":"string"}}}'
Синтаксис @schema.json дозволяє зчитувати схему з файлу. Це працює для всіх вхідних прапорців: можна передати рядок, вказати шлях до файлу через @ або зчитати зі stdin через - (як у curl -d). Наприклад:
echo '{"type":"object"}' | tabstack extract json https://example.com --schema -
Приємно, коли розробники один раз створюють зручну логіку аргументів і застосовують її всюди.
Generate: видобуток з інтерпретацією
Якщо extract просто витягує те, що є на сторінці, то generate використовує AI для трансформації контенту. Ви надаєте інструкції разом зі схемою:
tabstack generate json https://example.com \
--instructions "Summarise the article and list the key points." \
--schema @schema.json
Моя логіка така: extract json потрібен для отримання фактичних даних, а generate json — коли треба щось підсумувати, класифікувати або переструктурувати за допомогою моделі. Розподіл на два окремі дієслова — правильне рішення: це вберігає від використання «важкого» AI там, де достатньо звичайного парсингу.
Агенти: автоматизація та дослідження
Тут tabstack перетворюється з простого парсера на щось значно цікавіше. Команди групи agent виконуються на стороні сервера і стрімлять прогрес у реальному часі.
Автоматизація браузера розуміє запити людською мовою:
tabstack agent automate "Find the pricing for the Pro plan" --url https://example.com
Функція research шукає інформацію в мережі, аналізує її та видає звіт із нумерованими посиланнями на джерела:
tabstack agent research "What are the latest developments in quantum computing?" --mode balanced
Цікава особливість — інтерактивна автоматизація. Ви можете запустити процес, який зупиниться і запитає вашого введення:
tabstack agent automate "Log in and download the latest invoice" --url https://example.com --interactive
При зупинці ви отримуєте ID запиту і відповідаєте на нього окремою командою:
tabstack agent input <request-id> --data '{"fields":[{"ref":"field1","value":"yes"}]}'
Це елегантний спосіб залучити людину до процесу (human-in-the-loop) лише тоді, коли це справді необхідно.
Зручність для скриптів
Ось дизайнерське рішення, про яке варто знати: вивід автоматично стає «чистим» JSON, якщо ви передаєте його в іншу програму через пайп. Ніяких зайвих прапорців:
tabstack extract markdown https://example.com | jq .
Ви можете примусово задати режим через -o pretty або -o json, а також вимкнути кольори через --no-color. Команди automate та research у режимі JSON видають NDJSON (по одному об’єкту на рядок), що дозволяє обробляти події миттєво.
Окремої уваги варті коди завершення:
| Код | Значення |
|---|---|
0 |
успіх |
1 |
помилка виконання або мережі |
2 |
помилка використання, невірні дані або відсутність конфігурації |
3 |
помилка API або невдача виконання завдання |
Це дозволяє створювати надійні shell-скрипти, які розуміють різницю між мережевим збоєм та невірним аргументом.
Серед інших корисних опцій: --effort (регулює швидкість та ретельність рендерингу), --geo GB (маршрутизація через конкретну країну) та --nocache (ігнорування кешу).
Створено і для агентів
У репозиторії є файл AGENTS.md, який показує вектор розвитку проєкту. CLI розроблено так, щоб ним могли керувати не лише люди, а й LLM-агенти. Цей файл описує всі команди та коди у форматі, зручному для «споживання» машинами. Якщо ви підключаєте tabstack до Claude Code або власної системи, просто вкажіть агенту на цей файл.
Передбачуваний CLI з машинно-читаним виводом — це саме той інструмент, який агент може використовувати безпечно. Те, що робить утиліту зручною для мене в терміналі, робить її придатною і для моделі в циклі керування.
Чи варто це використовувати?
Так. Проблема доступу до вебданих виникає постійно. tabstack CLI розв'язує всі супутні питання: від керування ключами до зрозумілих помилок. Це єдиний бінарний файл, версія 1.0.0, ліцензія MIT та підтримка від Mozilla. Це не просто чийсь експеримент на вихідні, а надійний інструмент для вашого пайплайну.
Якщо вашому стеку чи агентам потрібно «читати» інтернет — спробуйте tabstack. Почніть із tabstack auth login, і ви швидко зрозумієте всі переваги.
Маю передчуття, що найцікавіше — не в самому витягуванні даних, а в тому, куди ви спрямуєте цей потік далі. Але про це — у наступному матеріалі.