Tabstack — Web & PDF Tools for AI Agents
Tabstack is a web execution API for reading, extracting, transforming, and interacting with web pages and PDF documents. It handles JavaScript-rendered sites, structured data extraction, AI-powered content transformation, and multi-step browser automation.
Setup (first use only)
Install dependencies from the skill's directory:
cd <skill-dir> && npm install
Where <skill-dir> is the directory containing this SKILL.md file.
Operations
All operations are run via the exec tool. First cd into the skill directory,
then run the command with a relative path:
<skill-dir>/scripts/run.sh <command> <args>
Execution strategy: Always run tabstack commands in the foreground —
call exec and wait for completion. Background execution requires manual
polling and is unreliable.
JSON arguments: Any JSON argument (schema, --data) can be passed inline
or as a file path prefixed with @ (e.g. @/tmp/schema.json). Use file
paths for complex schemas to avoid shell quoting issues.
1. extract-markdown — Read a page or PDF as clean Markdown
Best for: reading articles, documentation, PDF reports. This is the cheapest operation — prefer it when you just need to read content.
<skill-dir>/scripts/run.sh extract-markdown "<url>"
Returns the page/PDF as Markdown. For web pages, includes YAML frontmatter metadata (title, author, etc.).
Optional flags:
--metadata— return metadata as a separate JSON block--nocache— bypass caching and get fresh content--geo CC— fetch from a specific country (ISO 3166-1 alpha-2, e.g.US,GB)
2. extract-json — Pull structured data from a page or PDF
Best for: prices, product details, tables, invoices, any document with predictable repeating structure.
Without a schema (Tabstack infers structure):
<skill-dir>/scripts/run.sh extract-json "<url>"
With a JSON Schema (inline or from file):
<skill-dir>/scripts/run.sh extract-json "<url>" @/tmp/schema.json
Optional flags: --nocache, --geo CC.
See references/examples.md for common JSON schema patterns (products, articles, events, tables, contacts).
3. generate — Transform web/PDF content into a custom JSON shape
Best for: summaries, categorization, sentiment analysis, reformatting. Unlike
extract-json (which pulls existing data), generate uses an LLM to create
new content. May be slower due to LLM processing.
<skill-dir>/scripts/run.sh \
generate "<url>" "<json_schema|@file>" "<instructions>"
Optional flags: --nocache, --geo CC.
Example — categorise and summarise HN posts:
<skill-dir>/scripts/run.sh \
generate "https://news.ycombinator.com" \
'{"type":"object","properties":{"stories":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string"},"category":{"type":"string"},"summary":{"type":"string"}}}}}}' \
"For each story, categorize as tech/business/science/other and write a one-sentence summary"
See references/examples.md for more schema and instruction examples.
4. automate — Multi-step browser task in natural language
Best for: tasks needing real browser interaction — clicking, navigating across
pages, filling forms. Does NOT support PDFs or --geo.
<skill-dir>/scripts/run.sh \
automate "<natural language task>" --url "<url>"
Optional flags:
--url <url>— starting URL for the task. When omitted, automate uses its own built-in web search to find relevant pages — this can be cheaper and faster thanresearchfor simple factual questions.--max-iterations N— limit steps (default 50, range 1-100)--guardrails "..."— safety constraints (e.g."browse only, don't submit forms")--data '{"key":"val"}'|@file— JSON context for form filling
Timeout: May take 30-120 seconds. Use at least 420s exec timeout.
Example — fill a contact form with guardrails:
<skill-dir>/scripts/run.sh \
automate "Fill out the contact form with my information" \
--url "https://example.com/contact" \
--data '{"name":"Alex","email":"alex@example.com","message":"Hello"}' \
--guardrails "Only fill and submit the contact form, do not navigate away"
Example — simple search (no URL, uses built-in web search):
<skill-dir>/scripts/run.sh \
automate "Find the current price of a MacBook Air M4"
5. research — AI-powered deep web research
Searches the web, analyzes multiple sources, and synthesizes a comprehensive
answer with citations. Unlike the other operations, research doesn't need
a URL — you give it a question and it finds the answers.
For simple factual lookups, automate without a --url may be faster and
cheaper. Use research when you need depth, multiple perspectives, or
cited sources.
Use cases:
- Complex questions that need multiple sources ("What are the pros and cons of Rust vs Go for CLI tools?")
- Fact-checking and verification ("Is it true that...")
- Current events and recent information
- Topic deep-dives and literature reviews
- Competitive research ("Compare X vs Y vs Z")
<skill-dir>/scripts/run.sh research "<query>"
Optional flags:
--mode fast|balanced—fastfor quick single-source answers,balanced(default) for deeper multi-source research with more iterations--geo CC— research from a specific country's perspective
Timeout: May take 60-120 seconds. Use at least 420s exec timeout.
Example — quick factual lookup:
<skill-dir>/scripts/run.sh research "What is the current LTS version of Node.js?" --mode fast
Example — deep research:
<skill-dir>/scripts/run.sh research "Compare WebSocket vs SSE vs long polling for real-time web applications"
Reference: Examples & Recipes
Read references/examples.md when you need to:
- Build a JSON schema for
extract-json— patterns for products, articles, events, tables, contacts, invoices - Write effective instructions for
generate— recipes for summarization, sentiment analysis, competitive analysis, content digests - Recover from a failed attempt — if a command doesn't produce good results, check for a better approach
Choosing the Right Operation
| Operation | Use when... | Cost | Timeout |
|---|---|---|---|
extract-markdown | Read/summarise a page or PDF | Lowest | 60s |
extract-json | Structured data from a page or PDF | Medium | 60s |
generate | AI-transformed content from a page or PDF | Medium | 60s |
research | Answers from multiple web sources | Medium | 420s |
automate | Browser interaction or simple web search (no PDF) | Highest | 420s |
Prefer cheaper operations when they suffice. Use extract-markdown for
simple reading. Only use automate when the task requires clicking,
navigating, or form interaction.
Inform the user before triggering multiple automate calls — they are the
most expensive.
Error Handling
| Error | Meaning |
|---|---|
401 Unauthorized | TABSTACK_API_KEY is missing or invalid |
422 Unprocessable | URL is malformed or page is unreachable |
400 Bad Request | Malformed request — check arguments |
| No output | Task timed out or page blocked automation |
On automate failures, retry once. If it fails again, fall back to
extract-markdown for read-only tasks.
Environment Configuration
This skill requires a TABSTACK_API_KEY to function. Get one from
tabstack.ai (Mozilla-backed, free tier available).
Set the key via the CLI:
openclaw config set env.TABSTACK_API_KEY "your-key-here"
The skill will exit with an error if the key is not set.
Security & Privacy
-
API key: This skill requires a
TABSTACK_API_KEY. All requests are sent to the Tabstack API (api.tabstack.ai) using this key for authentication. The key is read from the environment, not hardcoded. -
Data sent to Tabstack: URLs you process, JSON schemas, instructions, and any
--datapayloads are sent to Tabstack's servers for processing. Do not pass passwords, authentication tokens, or other secrets via--dataunless you explicitly trust the Tabstack service. -
Browser automation: The
automatecommand drives a remote browser that can click, navigate, fill forms, and submit data. Use--guardrailsto constrain what the browser can do (e.g."browse only, don't submit forms"). -
Dependencies: This skill installs
@tabstack/sdkandtsxfrom npm. Apackage-lock.jsonis provided for reproducible installs. -
No persistence: The skill does not modify agent configuration, store credentials, or run outside of its own directory.