
Browser Intent
FreeExecute natural-language browser commands effortlessly.
Free · Opens the source repo
What Browser Intent does
Browser Intent provides a natural-language interface for interacting with web pages through a low-level selector toolset. Unlike traditional methods that rely on specific selectors, this skill allows users to describe their desired actions in plain language, such as 'Click the login button' or 'Fill the search box with cats and submit'. This is particularly useful in scenarios where elements are difficult to select due to dynamic class names or ambiguous structures. By leveraging the page-agent, the skill translates these natural language commands into actionable browser interactions.
The skill operates by invoking the browser_act function with a task string, and optionally a URL and session identifier. If the page-agent is properly configured, it will execute the command and return a structured response detailing the success of the action, the steps taken, and any relevant history. In cases where the page-agent or an OpenAI-compatible LLM provider is not available, the skill degrades gracefully, allowing users to fall back on traditional selector-based commands without losing functionality.
This tool is ideal for developers and designers who need to automate browser interactions without the overhead of writing complex selector chains. It is particularly beneficial for one-off tasks where the time spent crafting a selector outweighs the simplicity of describing the action in natural language. However, users should be aware that using this skill introduces additional latency due to the LLM processing, so it is best suited for situations where such overhead is acceptable.
In summary, Browser Intent simplifies browser automation by allowing natural language commands, making it easier to interact with web elements that are otherwise cumbersome to select. It is a valuable addition for anyone looking to streamline their web interaction workflows, especially in dynamic environments.
When to use it
Use this skill when you need to perform browser actions that are easier to describe than to select, especially for dynamic or ambiguous elements.
When not to use it
Avoid this skill when you already have precise selectors available, as it introduces additional latency and cost compared to direct calls.
What you can build with it
Quick Login Automation
Automate the login process by simply stating 'Click the login button' without needing to write complex selectors.
Dynamic Content Interaction
Interact with elements that change frequently by describing them instead of relying on potentially outdated selectors.
Simplified Form Filling
Fill out forms by stating your intent, such as 'Fill the search box with cats', making the process faster and more intuitive.
How to install Browser Intent
View source1. Install with the skills CLI
npx skills add ruvnet/ruflo/browser-intent --agent claude-code2. Or install it manually
Download the skill folder and drop it into ~/.claude/skills/ for all projects, or .claude/skills/ to scope it to one repo. Restart Claude Code so it picks up the new skill.
Anthropic's agentic coding CLI, and the reference implementation of Agent Skills. Drop a skill folder into ~/.claude/skills and Claude Code loads it automatically whenever a task matches the skill's description. Claude Code docs
Inside SKILL.md
Written by ruvnetBrowser Intent
Natural-language layer on top of the low-level browser_* selector tools. Where browser-extract and browser-form-fill compose selector-based primitives (browser_click, browser_fill, browser_snapshot), browser-intent lets the caller say what they want ("Click the login button", "Fill the search box with cats and submit") and delegates execution to page-agent — in-page injected JS that turns the DOM into text and drives an LLM tool-call loop against it.
When to use
- The target element is easier to describe in words than to select reliably (dynamic class names, ambiguous structure, A/B-tested markup).
- A one-shot interaction where writing out a selector chain isn't worth it.
- Prefer
browser_click/browser_fill/browser_snapshotdirectly when you already know the exact selector or ref (@e1) —browser_actadds LLM latency + cost that a direct selector call doesn't.
Steps
- Call
browser_actwith ataskstring, and optionallyurl(navigates first) andsession(default"default"):mcp__plugin_ruflo-core_ruflo__browser_act({ task: "Click the login button", url: "https://example.com/account", session: "my-session" }) - Read the response contract:
{ success: true, result, steps, history, contentFlagged, llmSource }— the intent executed.resultis the AIDefence-gated final text page-agent produced;historyis the full step trace (reflection + action + tool result per step);stepsishistory.length.{ success: true, degraded: true, reason, hint }— page-agent isn't installed, or no OpenAI-compatible LLM provider is configured. Never treatdegraded: trueas an error to retry — surface thehintand fall back to selector-basedbrowser_*tools instead.{ success: false, error, ... }— a real failure (browser open failed, injection failed, execution timed out, or page-agent's ownexecute()reportedsuccess:false).
- On
contentFlagged: true, the returnedresulthas already been redacted by AIDefence (PII or a prompt-injection/threat pattern was detected in the page-agent output) — do not attempt to recover the original text. - Prefer a recorded session (
browser-record) when the interaction matters enough to replay later;browser_actitself does not open an RVF container — it operates on whatever session id you pass (or"default").
Provider requirements (why this degrades so often)
page-agent calls its LLM directly from the browser page context via a plain OpenAI-compatible POST {baseURL}/chat/completions. That means:
- A bare
ANTHROPIC_API_KEYis not sufficient — Anthropic's native API is a different shape (/v1/messages). - Configure one of:
OPENROUTER_API_KEY(OpenRouter, OpenAI-compatible),OLLAMA_API_KEY(Ollama Cloud, OpenAI-compatible), orCLAUDE_FLOW_PAGE_AGENT_BASE_URL+CLAUDE_FLOW_PAGE_AGENT_API_KEYfor a custom OpenAI-compatible endpoint. - The real provider key never enters the page:
browser_actstarts a short-lived loopback HTTP proxy that holds the key server-side and injects the realAuthorizationheader itself. The page only ever sees a127.0.0.1URL and a placeholder key string.
Caveats
page-agentis anoptionalDependenciesentry (npm i page-agentif the doctor/degraded hint asks for it) — this plugin stays fully operational without it; you simply lose the natural-language layer and fall back to selector-based tools.- The npm bundle's demo auto-init tail (which would otherwise construct a second
PageAgentinstance against Alibaba's public test endpoint) is stripped before injection — you should never see traffic to apage-ag-testing-*host from this tool. - Every successful
browser_actcall best-effort records the intent + resulting trajectory into thebrowsermemory namespace (ADR-174 distillation loop). This is fire-and-forget — a memory-store failure never fails the tool call. timeoutMs(default 120000) bounds how longbrowser_actpolls forexecute()to settle; a slow multi-step intent may need a higher value.
Frequently asked questions about Browser Intent
Similar skills
Spring Boot Testing
Master testing techniques for Spring Boot 4 applications.
GitHub Issues
Manage GitHub issues efficiently with MCP tools.
Geofeed Tuner
Optimize your IP geolocation feeds in CSV format.
Batch Files
Master Windows batch scripting for automation and task management.
Adobe Illustrator Scripting
Automate your Illustrator workflows with ExtendScript.
Plugin Structure
Create and organize Claude Code plugins effectively.
