Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
AIHAWK_MODELNoAn OpenRouter model id. Defaults to z-ai/glm-5.3-flash.z-ai/glm-5.3-flash
STEALTHFOX_BINARYNoAn engine binary you already have. It must be the build the seal pins, or startup refuses: this skips the download, not the version check.
OPENROUTER_API_KEYYesYour OpenRouter API key. Can also be set with the --openrouter-key flag or in a .env file.

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": false
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}
experimental
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
browser_openA

Open main or support, or reopen one as somebody else.

support is yours to manage: open it when the task needs a second identity, and close it with browser_close as soon as the task no longer needs it, before you answer. It is not saved.

Called on a browser that is already up, this REOPENS it with the settings given, and what it held is gone.

seed the identity; same seed, same fingerprint. Left out, one is drawn. profile a directory keeping cookies, logins and the seed between opens; "" means none. It keeps the SEED too, so a login does not come back on different hardware every visit. proxy the exit, http://user:pass@host:port or socks5://host:port; "" means this machine's own address; left out for support, it shares the exit main has. A profile does NOT pin its exit, and a login arriving from a new country is as visible as one arriving on new hardware.

browser_closeA

Close one browser and free what it was holding.

The page it had is gone with it. The other browser is not touched.

Who it was is kept: browser_open with no arguments brings the same person back. To be somebody else, pass a seed, a proxy or a profile.

browser_listA

Which of the two browsers are open, where each one is, and which one you are working in.

Answers JSON: focus, the browser your last command acted in, or "" when none is open; note, which says how many are open and that a command naming no browser goes to main; and browsers - each row id, url (the page it is on) and urls (every page it holds, which is more than one only when a site opened one). Only open browsers are listed, so every row is one you can act on.

Starts nothing: it reports what is open, so asking is free.

browser_statusA

Who is browsing right now: the identity, the exit, the profile and the page.

Ask whenever you need to know which person the browser currently is, or from where its traffic leaves. The seed is what you would pass to browser_open to become this person again, so this is also how you record an identity worth repeating.

It starts nothing: a browser that is not open, or gone, is answered with the sentence that says which.

browser_navigateA

Go to a url in this browser's page, opening it if none exists.

Answers with the HTTP status the server gave and the url actually landed on, which is not always the one asked for: a redirect to a login wall or a regional domain shows up here. Read the status before trusting the page - a 404 or a 403 still has a document, and reading it as content is the mistake this reply exists to prevent.

wait_until is "domcontentloaded" by default, which returns as soon as the markup is parsed. Use "load" when the page needs its images and stylesheets, or "networkidle" for a single-page app that fetches its content after load.

browser_read_textA

The visible text of an element, with the markup gone.

The cheapest way to read a page. Narrow the selector when you know where the answer is; use browser_read_html instead when the structure matters, or browser_snapshot when you need something to click.

Long text is cut at max_chars (6000 by default) and the cut is marked in what comes back, so text that ends without that marker is the whole thing.

browser_snapshotA

Title, url, and the interactive elements that are actually visible.

Each element carries a selector when one can reach it: pass that string to browser_click or browser_type VERBATIM rather than writing your own. It is built to match exactly ONE element, which the obvious selector often does not, and the driver acts on the first match - so a caller aiming at the third of five identical links would silently hit the first and be told it succeeded.

Elements with no selector carry at, the centre coordinates, for browser_click_at.

It lists what a caller can act on, and it is not the accessibility tree: one country <select> would otherwise fill the answer with its options before the form you were looking for appears.

browser_read_htmlA

The page's HTML, cleaned down to what is worth reading.

Use this when the STRUCTURE matters - a form and its labels, a table, what a control is wired to. browser_snapshot gives a flat inventory of things to click; this keeps the markup and the relationships inside it.

mode="form" keeps the interactive surface and the text explaining it, mode="text" returns the prose alone, mode="full" keeps the structure with the noise and the attribute soup removed.

Unlike browser_read_text this is NOT capped: it returns the whole reduced page, tens of thousands of characters on a large one. Cutting markup in the middle leaves tags that mean nothing, so it is not cut - but the answer can be long. Reach for browser_snapshot when you only need something to click.

browser_take_screenshotB

One screenshot of this browser's page, on demand.

browser_watchA

The whole browser window as a person at the machine sees it: tab strip, address bar, the page and the pointer, from a live capture kept running on that page. For watching the work, not for acting on it: the picture is window pixels, so do not feed its coordinates to browser_click_at; use browser_take_screenshot for that.

Starts nothing. A browser that is not open has no window, so this answers the sentence that says so, and the live panes - which call this many times a second - read that sentence as the idle pane.

browser_clickA

Click the first element matching a CSS selector.

Scrolls it into view and waits for it to be clickable. When no selector can describe the target, use browser_click_at with coordinates from browser_snapshot.

browser_click_atA

Click (or press-and-hold) a raw viewport coordinate instead of a selector - for targets a selector cannot reliably reach: a slider track, a canvas-drawn captcha, a precise point inside a wider element. Moves the pointer there first (no teleport), then down, then up, holding first if hold_seconds is set. Returns a screenshot taken right after release.

Coordinates are relative to the VIEWPORT, not to the page, so the ones in a snapshot go stale the moment anything scrolls. Nothing raises when that happens: the click lands on whatever is at that spot now. Take a fresh snapshot after anything that could have moved the page, and prefer browser_click with the element's selector whenever it has one.

browser_typeA

Fill a field, replacing whatever it holds.

This sets the value rather than typing key by key, so it will not fire the per-keystroke handlers an autocomplete needs. For those, click the field and use browser_press_key.

browser_select_optionA

Choose an option in a dropdown (<select>), by its visible label or by its value.

Use this rather than clicking the dropdown and pressing arrow keys: a click plus arrows cannot tell you which row it landed on, and setting the value through browser_evaluate changes it without the page seeing a real interaction.

browser_press_keyA

Press a key on whatever has focus: "Enter", "Tab", "Escape", "ArrowDown", "Control+a", or a single character.

browser_evaluateA

READ from the page with JavaScript and get the result as JSON.

For what the other tools cannot see: a computed style, a value held in a framework's state, the length of a list.

Acting on the page is refused, and the refusal names the tool to use. Assigning to value, checked or selected, or calling click(), dispatchEvent(), submit() or requestSubmit(), changes the page without a real keystroke or pointer, and a page can tell. Use browser_click, browser_type or browser_select_option instead; they do the same thing through the pointer and the keyboard. Reading any of those properties is fine.

The refusal catches the obvious spellings, not every possible one. A script that slips past it is still the wrong way to do the thing: report it in your answer rather than using it.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

A4.1/5.0

Scored across 16 tools

Disambiguation5/5

Each tool targets a distinct browser primitive: lifecycle, navigation, reading, interaction, or identity. The read tools separate plain text, HTML structure, snapshot inventory, screenshot, and live watch clearly, and click/type/select/press actions are cleanly differentiated.

Naming Consistency4/5

All tools share the browser_ prefix and mostly use an imperative verb, making the family predictable. A few names are noun-like or omit an explicit object (browser_status, browser_snapshot, browser_type), a small deviation from a fully uniform verb_noun pattern.

Tool Count4/5

16 tools is slightly above the ideal range, but each tool corresponds to a distinct and useful browser automation primitive. There is no obvious redundant cluster, so the larger count feels purposeful rather than bloated.

Completeness4/5

The suite covers the full browsing lifecycle and most common tasks: opening, navigating, reading, clicking, typing, selecting, screenshotting, and watching. Minor gaps include no explicit tab switching or file upload support, but these are edge cases for a typical browser automation workflow.

Maintenance

ActivityActive
ResponsivenessUnresponsive