Flintrail
Flintrail drives a real Chrome for AI agents via MCP: it batches scripted browser actions live, records them as reusable flows with robust element fingerprints, then replays those flows (or the site's own API calls) without an LLM.
Browse & act live:
fl_openURLs in background tabs, run many actions in onefl_actcall (click, fill, type, select, check, press, upload, download, goto, back, wait, scroll, mouse, dialog, resize, eval, request), re-read pages withfl_snapshot.Adopt existing tabs:
fl_adopttakes over a tab the user already opened, e.g. after a manual sign-in.Extract data: run page JavaScript with
fl_extract, capture screenshots (full page or single element) withfl_screenshot, read console errors withfl_console.Inspect APIs:
fl_networklists the site's fetch/XHR calls with timing, body and JSON sample so clicks can be replaced with a direct request.Sign in safely:
fl_loginfills credentials and one-time codes from the browser password manager or 1Password/Bitwarden/custom CLI without exposing secrets to the agent.Record flows:
fl_record_start/fl_record_stopcapture a task with resilient element fingerprints and{{variables}};fl_flow_set_varturns recorded literals into variables (e.g. after teaching by demonstration).Replay fast:
fl_runreplays a flow with variables at browser speed (stopping at the failing step for repair),fl_run_manyruns it across many variable sets in parallel tabs.Manage flows & tabs:
fl_flows,fl_flowinspect saved flows;fl_tabsandfl_closemanage tabs;fl_extensionreports the browser-extension connection status.
Supports driving Arc through the Flintrail browser extension, allowing agents to open tabs, interact with pages, record flows, and replay them without needing a debugging port.
Supports Brave via the Flintrail browser extension, enabling agents to automate tabs, record browser interactions, and replay flows. Default CDP attach mode intentionally avoids personal Brave browsers unless explicitly allowed.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Flintrailrecord this checkout flow, then replay it at full speed"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Why
Browser MCP servers today make the model do everything, every time: read the page, pick one element, click, read the page again. Each click is a tool call, and each tool call is a model turn that costs seconds. Do the same task tomorrow and the agent pays the full price again.
Flintrail treats the browser like a JIT compiler treats code:
Live, the agent drives the page, but batches a whole sequence of actions into one call and gets back a compact snapshot with clickable refs.
Record, the same calls are captured with multi-clue element fingerprints and
{{variables}}.Replay, the flow runs at browser speed with no model between steps. When a site changes, the run stops at the exact failing step and hands the page back so the agent repairs only that part.
API replay, Flintrail sees the site's own fetch/XHR calls and can replay them from inside the page, with the same cookies and session. No rendering, no clicking.
Related MCP server: jev-mcp
Benchmark
Same 5-step task (fill a field, tick a box, change page, click a client-rendered button that calls an API, wait for the result), median of 10 runs, headless Chromium. The numbers are tool-side wall time only. In a real agent every tool call also costs a model turn, so going from 7 calls to 2 saves several more seconds on top.
The hatched bar is the floor: the same clicks as a raw Playwright script, with no MCP and no agent. Any tool that clicks through the UI is bounded by it, which is why the per-call ratios stay modest. Flintrail adds about 50 ms per call on top of that floor, Playwright MCP about 260 ms. The only way under the floor is to stop clicking, which is what API replay does.
Reproduce it: npm run bench (installs nothing global; Playwright MCP is a dependency of bench/ only).
Architecture
Install
Claude Desktop: download flintrail.mcpb and double-click it.
Claude Desktop, Claude Code, Cursor (stdio)
{
"mcpServers": {
"flintrail": {
"command": "npx",
"args": ["-y", "flintrail@latest"]
}
}
}Claude Code: claude mcp add flintrail -- npx -y flintrail@latest
From a local clone (git clone https://github.com/Soflutionltd/flintrail.git && cd flintrail && npm install && npm run build), start node /absolute/path/to/flintrail/bin/supervise.cjs.
Automatic updates
Every install below keeps itself up to date, without restarting Claude or Cursor. The MCP client talks to a small supervisor (bin/supervise.cjs) that stays connected while the server runs behind it. At start-up and every 6 hours it asks npm for the latest flintrail, installs it in the background in ~/.soflution/mcp/flintrail/, and switches over as soon as no request is in flight (the client is told the tool list may have changed). A version that fails to start is rolled back at once and never picked again on that machine. npm checks the integrity of every download, and releases are published from GitHub Actions with provenance.
The only network call is that version check to registry.npmjs.org; nothing about your machine or your use is sent. Turn it off with NO_UPDATE_NOTIFIER=1 (or SOFLUTION_AUTO_UPDATE=0). Started directly with node dist/..., flintrail does not update itself and only mentions a newer version in its first tool result.
Any agent, any machine (HTTP)
node dist/cli.js --http --host 127.0.0.1 --port 8931
# token is generated once in ~/.flintrail/token (or pass --token / FLINTRAIL_TOKEN)Clients connect to http://host:8931/mcp with Authorization: Bearer <token>. Put it behind a tunnel or reverse proxy with TLS if it leaves the machine.
Browser modes
Mode | When | How |
| Your desktop. Keep your logged-in sessions. | Connects over CDP to a dedicated Chrome for Testing. On macOS Flintrail finds it, restarts it with a local debugging port if needed (tabs are restored) and opens its own tabs in the background. |
| Servers, CI, Docker. |
|
| Anyone, any Chromium browser, no debugging port. |
|
Flintrail refuses to attach to a personal browser (Brave, Edge, Opera, or on macOS anything that is not Chrome for Testing) unless FLINTRAIL_ALLOW_ANY_BROWSER=1. Your everyday browser stays yours.
Browser extension
The extension is the easiest way in: no command-line flags, no debugging port, works in Chrome, Edge, Brave, Arc or any Chromium 125+.
Install. Download
flintrail-extension-<version>.zipfrom the latest release, unzip it, openchrome://extensions, enable Developer mode, click Load unpacked and pick the folder. (Chrome Web Store listing in progress.)Run Flintrail in extension mode, for example in Claude Desktop:
{ "mcpServers": { "flintrail": { "command": "npx", "args": ["-y", "flintrail@latest"], "env": { "FLINTRAIL_MODE": "extension" } } } }Connect. Click the Flintrail icon, paste the token from
~/.flintrail/token, click Connect. The extension reconnects by itself afterwards.
How it works: Flintrail starts a relay on 127.0.0.1:8932. The extension connects to it with the token and executes CDP commands with chrome.debugger, one tab at a time. Playwright sees an ordinary CDP browser, so every tool, recording and replay works unchanged. The agent only sees tabs it opened itself or tabs you share with Share with agent. Chrome shows its "started debugging this browser" bar while a tab is driven, by design.
Teach by demonstration
You do not have to explain a task to the agent. Type a flow name in the popup, click Start recording, do the task yourself in the tab, click Stop and save. The extension records clicks, typing, selects, checkboxes and Enter with the same element fingerprints the engine uses, and never records password fields. Then:
fl_flow_set_var("paybyphone-renew", 0, "plate") # turn the typed plate into {{plate}}
fl_run("paybyphone-renew", { "plate": "AB-123-CD" })The flow now runs without you, without the LLM, in milliseconds per step.
Limits in extension mode: browser-level CDP (download folder, permissions, window size) is not available to extensions, so download saves through the browser's normal download flow. Chrome dismisses dialogs of background tabs driven by chrome.debugger before anyone can answer, so in this mode {do:"dialog"} answers the next alert / confirm / prompt from inside the page instead.
Tools
Tool | What it does |
| Open a URL in a background tab, return a compact snapshot with |
| Run many actions in one call: |
| Re-read a page: interactive elements, headings, text excerpt, same-origin frames. |
| Run JavaScript in the page and return the result. |
| List the site's own API calls with timing, body and a JSON sample. |
| JPEG screenshot of the tab, or of one element ( |
| Console errors and uncaught exceptions of a tab ( |
| Record a flow; |
| Replay a flow with variables, no LLM. |
| Replay a flow for many variable sets in parallel tabs. |
| List flows, inspect one. |
| Turn a recorded value into a |
| Extension connection status. |
| Take control of a tab you already opened yourself, for example right after signing in by hand. |
| Sign in with your saved password (browser password manager, 1Password, Bitwarden or your own command). Flintrail fills it, the agent never sees it. See Sign in. |
| Manage tabs. |
Example
// one call, five actions
{ "tool": "fl_act", "tab": "t1", "actions": [
{ "do": "fill", "ref": "e1", "value": "AA-111-AA", "var": "plate" },
{ "do": "check", "ref": "e3" },
{ "do": "click", "role": "button", "name": "Continue" },
{ "do": "click", "selector": "[data-testid=confirm]" },
{ "do": "wait", "text": "active" }
]}Then fl_run("permit", { "plate": "ZZ-999-ZZ" }) repeats it in under a second.
// files, native dialogs, coordinates, mobile width
{ "tool": "fl_act", "tab": "t1", "actions": [
{ "do": "upload", "ref": "e4", "files": ["/Users/me/statement.csv"], "var": "statement" },
{ "do": "dialog", "accept": true },
{ "do": "click", "role": "button", "name": "Delete" },
{ "do": "mouse", "x": 640, "y": 380 },
{ "do": "resize", "width": 390, "height": 844 }
]}upload works on a file input, even a hidden one, and on a button or drop zone that opens the file chooser. Dialogs are dismissed by default and every one is reported in the result, as are new console errors.
Sign in
fl_login signs the agent in with the passwords you already have, without ever showing them to the agent: it only learns which fields were filled. Passwords and one-time codes are masked in every tool result, including captured request bodies and page reads, and a recorded flow stores a reference to the login, never the secret. On a multi-step sign-in (e-mail page, then password page) the agent calls it on each step.
Sources are tried in the order of FLINTRAIL_PASSWORDS (default browser):
Source | Setup | Notes |
| None. Save the password in Chrome, Edge or Brave as usual. | The browser fills the form itself; Flintrail confirms with a real click and submits. Works in extension mode and in attach mode, on the profile that holds your passwords. With several saved accounts for a site, the browser picks one: use a CLI source to choose. |
| 1Password CLI signed in, or | One-time codes stored in 1Password are filled too. A service account never asks for Touch ID; scope it to a vault that holds only what the agent needs. |
| Bitwarden CLI unlocked, | One-time codes through |
| Any program: Flintrail runs it with the page URL as only argument. | It prints |
Logins from a CLI source are only filled in frames whose domain matches the login's website, so a look-alike page gets nothing. Several matches: the agent passes item (ID, title or username). Example for Claude Desktop:
"env": { "FLINTRAIL_PASSWORDS": "browser,1password" }Not supported: Apple Passwords (iCloud Keychain) has no command-line access. One-time codes sent by SMS, e-mail or phone prompt: fl_login says so and the agent asks you.
How replay finds elements again
Each recorded step stores a fingerprint, not a fragile selector: test id, stable id, name attribute, ARIA role and accessible name, placeholder, link target, visible text and a short CSS path. At replay time Flintrail tries them from most to least stable and takes the first that matches exactly one element, waiting only for that element, never for the network to go idle.
Security
No password is ever written to a flow. Password fields are skipped during recording; keep the session logged in instead.
fl_loginnever returns a password or a one-time code to the agent and masks them in every tool result. CLI logins are only filled on their own website. Password manager programs are chosen in the configuration, never by the agent, and run without a shell.Flows are plain JSON in
~/.flintrail/flows, easy to review and version.The HTTP transport requires a bearer token (constant-time comparison) and binds to
127.0.0.1by default.evalandrequestrun inside the page with the page's own privileges, nothing more.
Configuration
Variable | Default | |
|
|
|
|
| Local port the extension connects to |
|
| Browser to attach to |
|
| Debugging port used when Flintrail starts Chrome for Testing |
| auto | Browser executable |
|
|
|
|
| Flows, profile, token |
|
| Where downloads land |
| generated | HTTP bearer token and extension token |
|
| Password sources for |
Develop
npm install
npx playwright-core install chromium # once, for tests
npm test # build + 26 end-to-end tests over real MCP, extension included
npm run pack:extension # flintrail-extension-<version>.zip
npm run bench # benchmark vs Playwright MCPRoadmap
Chrome Web Store and Edge Add-ons listings for the extension.
Automatic promotion of recorded UI steps to API steps when the captured call is replay-safe.
Shared flow library for common sites.
Visual diff on replay failure.
En français
Flintrail est un serveur MCP de navigation pour agents IA. Il pilote un vrai Chrome dédié (jamais votre navigateur personnel), enchaîne plusieurs actions en un seul appel, enregistre une tâche la première fois puis la rejoue seul, sans IA, en quelques centaines de millisecondes, ou en rejouant directement les appels API du site avec votre session. Sur notre banc d'essai, la même tâche prend 2,4 s avec Playwright MCP et 0,11 s avec Flintrail en mode API.
L'extension Chrome rend tout cela accessible à tout le monde : on l'installe, on colle le jeton, et l'agent pilote le navigateur. Mieux, on peut lui apprendre une tâche en la faisant soi-même une fois (bouton Start recording), Flintrail la rejoue ensuite seul. Les mots de passe ne sont jamais enregistrés.
Pour se connecter, l'agent utilise fl_login avec vos mots de passe habituels : ceux enregistrés dans le navigateur (sans réglage), ou 1Password, Bitwarden ou tout autre gestionnaire par sa ligne de commande. Flintrail remplit le formulaire lui-même, l'agent ne voit jamais ni le mot de passe ni le code.
License
MIT © 2026 Soflution Ltd
Available Tools
19 toolsfl_actB
Run SEVERAL actions in one call (fill a whole form, click, submit, wait, extract) and get one fresh snapshot back. Always batch as many actions as possible: one call beats ten.
| Name | Required | Description | Default |
|---|---|---|---|
| max | No | Max interactive elements listed (default 150). | |
| tab | Yes | ||
| text | No | Characters of page text to include (default 600, 0 for none). | |
| actions | Yes | ||
| snapshot | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It discloses that one fresh snapshot is returned, but does not explain side effects, action ordering, failure handling, partial execution, permissions, or destructive potential for actions like click, upload, goto, eval, and request.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with zero filler and the batching instruction front-loaded. Every sentence earns its place and quickly conveys the main calling pattern.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is complex: a nested actions array with many action types and fields, five top-level parameters, no output schema, and no annotations. The description is far too terse to cover execution semantics, failure behavior, tab handling, snapshot options, or how the many action types interact.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 40%, and the description adds little meaning beyond the schema. It does not explain the required tab parameter, the snapshot flag, or the overall actions structure, and its mention of "extract" does not match the action enum.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: run several browser actions in one call and return a fresh snapshot. The batching purpose is clear, but the description does not explicitly distinguish it from nearby tools such as fl_run, fl_run_many, or fl_flow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear usage guidance: batch as many actions as possible because one call beats ten, with examples like filling a whole form and submitting. It lacks explicit when-not-to-use guidance or named alternatives for single-action versus multi-action execution.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fl_adoptA
Take control of a tab the user already has open in the browser (first match on a URL substring), e.g. a site they just signed in to by hand. Returns its snapshot.
| Name | Required | Description | Default |
|---|---|---|---|
| max | No | Max interactive elements listed (default 150). | |
| url | Yes | Substring of the tab URL | |
| text | No | Characters of page text to include (default 600, 0 for none). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It does disclose meaningful behavior: matching is by URL substring and only the first match is adopted. But it omits what happens when nothing matches, whether the tab is focused/brought forward, and what 'take control' does to the user's session — all important for a tool that touches a live tab.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero padding. The core action is front-loaded and the return value is appended compactly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Three parameters, all documented, and no output schema so the brief 'returns its snapshot' is adequate. However, with no annotations at all, the absence of any failure-mode or side-effect disclosure (no matching tab, focus stealing, effect on the user's manual session) leaves a real gap for an adoption/control tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real information the schema lacks: the url parameter is matched by substring and the first matching tab wins. The max/text parameters are left entirely to the schema, which is acceptable at full coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource: 'take control of a tab the user already has open in the browser', which implicitly contrasts with opening new tabs (fl_open) and with pure snapshotting (fl_snapshot). It also states what comes back ('Returns its snapshot'). No sibling is named explicitly, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The example ('a site they just signed in to by hand') makes the intended situation clear, which is useful. But it never says when NOT to use it or names alternatives like fl_open, fl_tabs or fl_snapshot, leaving the agent to infer the choice from the tool list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fl_closeC
Close a Flintrail tab.
| Name | Required | Description | Default |
|---|---|---|---|
| tab | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, yet it says nothing about side effects — whether unsaved state or in-flight recordings are discarded, whether closing is idempotent, or what happens if the tab handle is invalid. For a destructive-feeling operation this is a significant gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler or redundancy. It is short, but nothing in it needs trimming.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter mutation tool with no annotations and no output schema, the description should at minimum explain the tab identifier format and the effect of closing. Neither is covered, leaving the agent under-equipped to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one required parameter, 'tab', with 0% schema description coverage, and the description does not explain what form the identifier takes (name, handle, or index) or where to obtain it. The only hint is the word 'tab' in the description, which adds almost nothing beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Close a Flintrail tab" states a specific verb (close) and resource (tab), making the operation immediately identifiable and distinct from siblings like fl_open and fl_tabs. It stops short of differentiating scope or noting what closing means relative to those siblings, so it is clear but not maximally so.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to close versus leave a tab open, no prerequisite that the tab exist or be open, and no reference to sibling tools such as fl_tabs (to find a tab) or fl_open (its counterpart). An agent must infer all usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fl_consoleC
Console errors and uncaught exceptions of a tab (level "all" adds warnings and logs). fl_act and fl_snapshot already say when new errors appeared.
| Name | Required | Description | Default |
|---|---|---|---|
| tab | Yes | ||
| clear | No | ||
| level | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and falls short: it never says whether the read is non-destructive, whether the buffer is drained or truncated, whether results are scoped to the current page load or the whole session, or what happens when the error list is empty. Only the level semantics are disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the resource stated first and the level caveat in a parenthetical. Nothing is wasted, though the second sentence is terse enough to be cryptic about the sibling relationship.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description says nothing about what an error entry contains (message, stack, timestamp, level) or how much history is returned. Combined with the undescribed clear parameter, an agent cannot predict the return payload or side effects.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so all three parameters need explanation, but only level is described ("all" adds warnings and logs). The required tab parameter's accepted format and the clear parameter's effect — presumably draining the buffer — are never explained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific resource — console errors and uncaught exceptions of a tab — and clarifies that level "all" widens the set to warnings and logs. It is a noun phrase rather than a verb+resource, but an agent can still tell it apart from fl_network and the fl_* action tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The note that fl_act and fl_snapshot already report when new errors appeared implies this tool is for drilling into details, but that inference is left to the reader. There is no explicit statement of when to call it versus fl_network or the snapshot tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fl_extensionB
Status of the Flintrail browser extension (extension mode).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the behavioral burden, yet it only says this reports extension status. It does not clarify whether the call is read-only, whether the extension must be installed or connected, or what happens when extension mode is unavailable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single short sentence with no filler, and the key subject and purpose are front-loaded. It wastes no words, even though it could have been expanded usefully elsewhere.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotations, the description should ideally say what status information is returned or what extension mode means for invocation. It leaves the agent to discover the actual response by calling the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there are no parameter semantics to explain. The empty input schema is consistent with a simple status-checking tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource, the Flintrail browser extension, and a specific concern, its status, so an agent can distinguish it from action-oriented siblings like fl_open or fl_act. It does not explicitly contrast with any sibling, but the status-checking purpose is clear enough to classify the tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical '(extension mode)' weakly implies a context, but there is no explicit guidance on when to call this tool instead of alternatives such as fl_tabs or fl_snapshot. It does not state prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fl_extractB
Run JavaScript in the page and return the result. Fastest way to pull tables, lists or links.
| Name | Required | Description | Default |
|---|---|---|---|
| js | Yes | Function body with return, e.g. return [...document.querySelectorAll("tr")].map(r => r.innerText) | |
| tab | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It says the tool runs JavaScript and returns a result, but it does not disclose that arbitrary JS execution may mutate the page, access sensitive data, require specific permissions, or need serializable return values. This leaves significant safety and side-effect information unstated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences and front-loads the core action before adding a concrete use case. There is no filler, and both sentences contribute useful information for an agent deciding whether to call the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a JavaScript-execution tool with no annotations and no output schema, the description is incomplete. It does not explain the expected return format, how results are serialized, what 'tab' means, or the security and side-effect implications of running arbitrary code in a page. These gaps are material for correct and safe invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: the 'js' parameter has a description with an example, but 'tab' has no schema description. The tool description does not clarify what 'tab' refers to or how it should be supplied, and it adds little meaning to 'js' beyond the extraction examples already implied by the schema. With half the parameters undocumented, the description fails to compensate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Run JavaScript in the page and return the result.' It also gives a concrete extraction use case ('pull tables, lists or links'), so the tool’s purpose is clear. However, it does not explicitly differentiate itself from siblings like fl_run, fl_snapshot, or fl_act, which could also retrieve or interact with page content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Fastest way to pull tables, lists or links' implies when to use the tool for data extraction, but there is no explicit guidance on when not to use it, prerequisites, or named alternatives. The agent can infer the extraction use case but must decide on its own how this compares to fl_snapshot or fl_network.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fl_flowB
Show a flow with all its steps and element fingerprints.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. 'Show' implies a read-only retrieval operation and it discloses that steps and fingerprints are returned, but it does not mention permissions, error behavior, or formatting/pagination details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no redundant or filler content. Every phrase contributes to stating the action and returned scope.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter lookup tool, it conveys the core action and output content, but it leaves gaps around parameter meaning and when to choose this over fl_flows. With no annotations or output schema, a bit more context would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for the undocumented 'name' parameter. It does not explicitly state that 'name' identifies the flow, nor does it describe the expected format or any constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Show') and resource ('a flow'), and clarifies the returned content with 'all its steps and element fingerprints.' It implicitly distinguishes from the list-oriented sibling fl_flows by using singular 'a flow,' but does not explicitly name alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance on when to use this tool versus alternatives such as fl_flows or other flow-related siblings. The intended use is only implied by 'Show a flow,' with no conditions or exclusions stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fl_flowsB
List recorded flows with their variables and last timing.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It reveals part of the return shape (variables and last timing) but says nothing about whether the call is read-only, how many flows may be returned, ordering, or truncation limits — all relevant since recorded flows can accumulate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short, front-loaded clause with no filler; the resource and the returned fields are stated immediately. Brevity here is close to under-specification, but nothing wasteful is included.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter list tool with no output schema, the description is minimal but workable — the agent knows what is listed and roughly what comes back. It omits any note on absence of side effects or result volume, which are the remaining gaps an agent would want covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema declares zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. No misleading parameter language is present.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("List recorded flows") plus the payload each entry carries ("variables and last timing"). It is distinguishable from siblings like fl_flow or fl_run, though it never names them explicitly to draw the contrast.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when this should be used instead of fl_flow (execute a flow), fl_record_start/stop, or fl_extract. The listing verb hints at a discovery role, but the agent must infer that on its own, and no prerequisites or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fl_flow_set_varC
Turn the literal value of one step into a variable {{var}}, e.g. after recording by demonstration.
| Name | Required | Description | Default |
|---|---|---|---|
| var | Yes | ||
| name | Yes | ||
| step | Yes | Step index, as shown by fl_flow (0-based). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden, and it falls well short. It does not say whether this mutates and persists the flow, what happens when the step's value is not a literal, whether the change is reversible, or what errors occur for a bad step index.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the key transformation stated first and the example after. Nothing is wasted, though the terseness leaves little room for the context that is missing elsewhere.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with three required parameters, no annotations, no output schema and an unexplained required parameter, one sentence is not enough. An agent cannot tell whether the flow must be loaded first, what state the flow ends up in, or how to confirm success.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 33%: only 'step' is documented, and that documentation lives in the schema, not the description. The description does clarify that 'var' becomes the {{var}} template, but the required 'name' parameter (presumably the flow identifier) is never mentioned or explained anywhere.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The verb and resource are concrete: convert a step's literal value into a {{var}} placeholder, illustrated with the recording-by-demonstration scenario. It is clearly distinct from fl_run, fl_record_start and fl_flow, though it does not explicitly contrast itself with them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"e.g. after recording by demonstration" gives one concrete situation in which to reach for this tool. There is no guidance on prerequisites (must the flow be open or stopped?), on when not to use it, or on alternatives such as editing the flow directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fl_loginA
Sign in on the open sign-in form with the user's saved password: from the browser's own password manager, or from a password manager CLI the user configured (1Password, Bitwarden, custom command). Flintrail fills username, password and one-time code itself; the secrets never reach you. A CLI login is only filled when the page domain matches its website. On a multi-step sign-in (e-mail page, then password page), call it on each step. While recording, the flow stores the source and login ID, never a secret.
| Name | Required | Description | Default |
|---|---|---|---|
| max | No | Max interactive elements listed (default 150). | |
| tab | Yes | ||
| item | No | Login ID, title or username in a password manager CLI, when several match the site. | |
| text | No | Characters of page text to include (default 600, 0 for none). | |
| source | No | Only this source: browser, 1password, bitwarden or command. | |
| submit | No | Press Enter after filling (default true). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does well: it discloses that secrets never reach the agent, explains domain matching for CLI logins, covers multi-step behavior, and notes that recording stores only source and login ID. It does not describe failure behavior, what happens after submit navigation, or the returned result.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and then layers on secret handling, CLI constraints, multi-step guidance, and recording behavior. Every sentence adds relevant information without redundant repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a login tool with six parameters, no annotations, and no output schema, the description covers the key secret-handling and multi-step behavior. However, it does not describe what the tool returns or how success/failure is surfaced, leaving a meaningful gap given the absence of an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is high at 83%, so the schema already documents most parameters. The description adds useful context about CLI domain matching and multi-step invocation, but it largely repeats the source behavior already captured by the schema and does not explain max or text beyond their schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: sign in on an open sign-in form using saved credentials. It clearly differentiates the tool by explaining that Flintrail itself fills username, password, and one-time code from browser or CLI password managers. However, it does not explicitly name a sibling alternative for non-login form interaction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear usage context: use it on an open sign-in form, call it on each step of a multi-step sign-in, and only apply CLI logins when the page domain matches the CLI website. It stops short of naming alternatives such as fl_act for generic form filling or stating explicit when-not-to-use conditions beyond the CLI domain restriction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fl_networkB
List the API calls (fetch/XHR) the site made, with method, status, timing, body and a JSON sample. Use it to replace UI clicks with a direct {do:"request"} step: the fastest possible replay.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| filter | No | Substring the URL must contain. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It implies a read operation but never says whether calls must be captured live, whether results persist across sessions, how pagination/limit behaves, or whether reading bodies has cost. For a capture-dependent tool with zero annotation coverage, this is a real gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the resource and its returned fields, then the practical use. The jargon ({do:"request"} step) is dense but each sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully names the returned fields, which is the main thing an agent needs. But it omits the capture prerequisite, the meaning of limit, and how results relate to an in-progress recording, leaving meaningful gaps for a network-inspection tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50% — filter is documented in the schema, limit is not — and the description mentions neither parameter. It neither explains the default/behavior of limit nor clarifies that filter matches the URL substring, so it does not compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (list the fetch/XHR API calls the site made) and enumerates what comes back: method, status, timing, body, JSON sample. That is far more informative than the sibling names fl_act/fl_extract/fl_snapshot, though it never explicitly contrasts itself with them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It does give a usage scenario — replacing UI clicks with a direct {do:"request"} replay step — but that phrasing assumes the agent already knows the flow/replay authoring model. There is no explicit statement of when not to use it, nor of prerequisites such as whether a recording session must exist first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fl_openA
Open a URL in a background tab of the dedicated browser (logged-in sessions kept). Returns a compact snapshot whose [eN] refs can be used directly in fl_act.
| Name | Required | Description | Default |
|---|---|---|---|
| max | No | Max interactive elements listed (default 150). | |
| url | Yes | ||
| text | No | Characters of page text to include (default 600, 0 for none). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It usefully discloses background-tab opening, retained logged-in sessions, and the snapshot return with [eN] refs, but omits tab lifecycle, cleanup behavior, failure modes, and side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no wasted words. The operational context is front-loaded, and the return-value note follows immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description takes care to explain that a compact snapshot with usable [eN] refs is returned. It is complete enough to call and chain into fl_act, though it could say more about tab persistence and error behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is moderate at 67%, and the schema itself describes the max and text parameters. The description adds context about the returned snapshot but does not add meaning beyond the schema for the parameters, so a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: opening a URL in a background tab of the dedicated browser. It also distinguishes the result as a compact snapshot with [eN] refs, making its role clear relative to action and snapshot siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies usage for session-aware navigation by noting that logged-in sessions are kept and the tab is opened in the background. However, it does not explicitly say when to use this versus fl_tabs, fl_snapshot, or fl_act, nor does it state exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fl_record_startA
Start recording a flow. Every fl_open / fl_act after this is captured with robust element fingerprints so fl_run can replay it without an LLM. repairFrom keeps steps before that index and replaces the rest.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| startUrl | No | ||
| repairFrom | No | ||
| description | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full load and does well: it discloses the fingerprint mechanism, that replay requires no LLM, and the exact keep/replace semantics of repairFrom. It omits the state-machine behavior (error vs. restart when already recording) and any return payload, which matters for a stateful tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, no waste, with the core action front-loaded and the parameter caveat last. Every clause adds information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The lifecycle context (record here, replay with fl_run) is well covered, but with no annotations, no output schema, and three of four parameters undocumented, the definition is not fully sufficient for confident invocation. It is adequate on the conceptual side and thin on the mechanical side.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for all four parameters, but it only explains repairFrom. The required `name`, plus `startUrl` and `description`, get no meaning at all — an agent cannot tell whether name is a label or an identifier, or how startUrl relates to the first fl_open.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Start recording a flow" gives a specific verb and resource, and the follow-up sentences scope exactly what the recording captures (fl_open/fl_act calls) and what consumes it (fl_run). This clearly separates it from fl_record_stop and fl_run among the siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It tells the agent when to call it (before issuing fl_open/fl_act calls that should be captured) and names the downstream tool, fl_run. It stops short of stating exclusions, such as what to do if a recording is already in progress or which operations are not captured.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fl_record_stopA
Stop recording and save the flow (save=false to discard).
| Name | Required | Description | Default |
|---|---|---|---|
| save | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It usefully discloses that save=false discards the flow and implies default saving, but it does not mention what happens if no recording is active, error behavior, or auth requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the main action, and every phrase adds useful information. There is no wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter stop-recording tool with no output schema or annotations, the description covers the essential action and the discard option. It could mention return behavior or state requirements, but it is largely adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain the single parameter. It does so effectively by clarifying that save=false discards the flow, which adds meaning beyond the bare boolean name.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Stop recording and save the flow.' It clearly contrasts with the recording-start sibling, though it does not explicitly name fl_record_start.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'Stop recording' and the save=false discard option, but the description gives no explicit when-to-use guidance, prerequisites, or alternatives beyond the sibling tool family.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fl_runB
Replay a recorded flow at browser speed, no LLM. On failure (site changed) it stops at the failing step and returns the page so the flow can be repaired.
| Name | Required | Description | Default |
|---|---|---|---|
| tab | No | ||
| name | Yes | ||
| vars | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden; it does disclose two valuable traits — deterministic no-LLM replay and the failure contract (stops at the failing step and returns the page). It does not disclose whether playback mutates page state, whether it requires an existing browser session/tab, or what happens on success.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with zero filler; the core capability is front-loaded ahead of the failure-behavior detail. Every clause adds information an agent could act on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter tool with a nested object, no annotations, and no output schema, the description is thin: it leaves vars/tab semantics and the success behavior unexplained. The failure-path disclosure is good, but an agent still can't confidently construct a call from this alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for three parameters including a nested string-map 'vars', and the description explains none of them. 'Flow' context hints that 'name' identifies the recorded flow, but the roles of 'tab' and 'vars' (presumably variable substitution) are completely undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Replay a recorded flow') and adds a meaningful differentiator ('at browser speed, no LLM') that separates deterministic playback from agentic tools like fl_act. It doesn't explicitly name siblings such as fl_run_many or fl_record_start, so the boundary with the batch/recording variants is left implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies a recorded flow must exist first and hints at a repair loop when playback fails, but it never states when to choose fl_run over fl_run_many or fl_record_start/fl_record_stop, nor any prerequisite like an open tab. No explicit when-to-use or when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fl_run_manyB
Replay the same flow for many variable sets in parallel, each in its own background tab.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| runs | Yes | ||
| keepTabs | No | ||
| concurrency | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It does mention parallel execution and background tabs, but omits critical behavior such as tab lifecycle, error handling, concurrency defaults, authentication needs, and what happens when runs fail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no wasted words. It is appropriately concise, though its brevity contributes to the broader under-specification of behavior and parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a four-parameter parallel browser-automation tool with no annotations and no output schema, the description is incomplete. It explains the core action but leaves out operational details an agent would need to invoke it correctly, such as concurrency defaults, tab cleanup, and failure behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain the four parameters. It only hints at their meaning through phrases like 'variable sets,' 'same flow,' 'parallel,' and 'background tab,' without defining name, runs, keepTabs, concurrency, their types, defaults, or constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource ('Replay the same flow') and clearly scopes it to many variable sets in parallel, each in its own background tab. This distinguishes it from the single-run sibling fl_run without needing to open either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'for many variable sets in parallel' implies when this tool is appropriate, but it does not explicitly name alternatives such as fl_run for single executions or state when not to use it. Usage guidance is present but inferential.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fl_screenshotA
Screenshot of a tab, or of one element with ref / selector. Only when the visual layout matters: snapshots are much cheaper. Pixels are CSS pixels, usable as x / y for {do:"mouse"}.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | ||
| tab | Yes | ||
| full | No | ||
| selector | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does add useful behavior: snapshots are cheaper, screenshot pixels are CSS pixels, and those coordinates are usable with mouse actions. It does not describe the return shape or what the 'full' option changes, but the core operational traits are disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact clauses with no waste. The primary use case is front-loaded, followed by the key cost comparison and coordinate mapping detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a four-parameter read-only screenshot tool with no annotations or output schema, the description supplies the critical usage and coordinate semantics. It is not fully complete because the 'full' parameter and exact return form are not covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains ref and selector as element targeting and implies tab as the screenshot target, but it does not explain the 'full' boolean parameter at all, leaving one of four parameters undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: a screenshot of a tab or an element identified by ref/selector. It also distinguishes the tool from fl_snapshot by positioning snapshots as cheaper and screenshots as for visual layout.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance: only when visual layout matters, and contrasts that with snapshots being much cheaper. This routes the agent clearly between this tool and its likely alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fl_snapshotC
Re-read a tab: interactive elements with refs, headings and the start of the text.
| Name | Required | Description | Default |
|---|---|---|---|
| max | No | Max interactive elements listed (default 150). | |
| tab | Yes | ||
| text | No | Characters of page text to include (default 600, 0 for none). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden: it never states that this is a read-only operation, how refs are scoped/stable, whether refs are the handles fl_act expects, or what the cost/size of a snapshot is. It lists return contents but not behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence, front-loaded and free of padding. It is efficient rather than padded, though the terseness leaves key facts unstated rather than the phrasing being wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations, no output schema, and an undocumented required parameter, the description should compensate more: the output is only loosely sketched (no shape, no ref format) and the link from refs to fl_act is left implicit. An agent would have to guess at the calling contract.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% (max and text are documented, the required 'tab' is not). The description adds nothing about any parameter, and in particular does not say where the 'tab' identifier comes from (presumably fl_tabs) or how max/text trade off against snapshot size.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
It does name the deliverable — interactive elements with refs, headings, and the start of the page text — which is a specific enough resource. But the lead verb 'Re-read a tab' is cryptic about what is actually being captured (a DOM/accessibility snapshot), and it gives no signal distinguishing it from sibling fl_extract or fl_screenshot.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Re-read' hints that this is called after an action changes the page, but there is no explicit statement of when to use this versus fl_extract (text extraction), fl_screenshot (visual), or fl_tabs (listing tabs). No prerequisites or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fl_tabsB
List tabs opened by Flintrail.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full behavioral burden, yet it says nothing about scope (all sessions vs. current browser context), whether the call is read-only, ordering, or whether it triggers any side effects. The only disclosed behavior is that it returns a list.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. Nothing redundant or misplaced for a tool this simple.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter list tool with no output schema, the description covers the minimum, but since no output schema exists it would help to indicate what the returned tabs look like (IDs, titles, URLs). The gaps are modest rather than blocking.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline applies; there is nothing for the description to disambiguate. The description correctly implies no inputs are needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('List tabs') scoped to 'opened by Flintrail', which is enough to tell it apart from siblings like fl_open, fl_close, or fl_snapshot that act on tabs rather than enumerate them. It stops short of defining what a 'tab' is in this browser context, but the core purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to call this versus alternatives such as fl_open or fl_close, nor any stated preconditions (e.g., must a session be running). The agent must infer usage entirely from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v1.3.0- Added
fl_login
4 tool updates
v1.2.1- Changed
fl_act9 fields changed- added
Input schema / properties / actions / items / properties / acceptAdded value: +{ + "description": "dialog: true to accept (OK), false to dismiss. value is the prompt answer.", + "type": "boolean" +} - added
Input schema / properties / actions / items / properties / countAdded value: +{ + "description": "mouse: 2 for a double click.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - added
Input schema / properties / actions / items / properties / do / descriptionAdded value: +"upload: files into a file input, or a button / drop zone that opens the file chooser. mouse: click at x,y (escape hatch for canvas, shadow DOM, extension overlays). dialog: how to answer the NEXT alert/confirm/prompt (default dismiss). resize: viewport width x height." - changed
Input schema / properties / actions / items / properties / do / enumPrevious value: -[ - "click", - "dblclick", - "hover", - "fill", - "type", - "select", - "check", - "uncheck", - "press", - "download", - "goto", - "back", - "wait", - "scroll", - "eval", - "request" -]New value: +[ + "click", + "dblclick", + "hover", + "fill", + "type", + "select", + "check", + "uncheck", + "press", + "download", + "upload", + "goto", + "back", + "wait", + "scroll", + "eval", + "request", + "mouse", + "dialog", + "resize" +] - added
Input schema / properties / actions / items / properties / filesAdded value: +{ + "description": "upload: absolute file paths. With var, a single file becomes {{var}}.", + "items": { + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / actions / items / properties / heightAdded value: +{ + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - added
Input schema / properties / actions / items / properties / widthAdded value: +{ + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - added
Input schema / properties / actions / items / properties / xAdded value: +{ + "description": "mouse: x in CSS pixels of the viewport, same scale as fl_screenshot.", + "type": "number" +} - added
Input schema / properties / actions / items / properties / y / descriptionAdded value: +"mouse: y in CSS pixels. scroll: pixels to scroll (default 800)."
- Added
fl_adopt - Added
fl_console - Changed
fl_screenshot2 fields changed- added
Input schema / properties / refAdded value: +{ + "type": "string" +} - added
Input schema / properties / selectorAdded value: +{ + "type": "string" +}
16 tool updates
v1.1.0- First observed
fl_act - First observed
fl_close - First observed
fl_extension - First observed
fl_extract - First observed
fl_flow - First observed
fl_flow_set_var - First observed
fl_flows - First observed
fl_network - First observed
fl_open - First observed
fl_record_start - First observed
fl_record_stop - First observed
fl_run - First observed
fl_run_many - First observed
fl_screenshot - First observed
fl_snapshot - First observed
fl_tabs
TDQS
Scored across 19 tools
Most tools have clearly distinct purposes: recording (record_start/stop), replay (run/run_many), inspection (snapshot/network/console/screenshot), and action batching (act/extract). A few pairs are close—fl_run vs fl_run_many, fl_flows vs fl_flow, and fl_open vs fl_snapshot both returning snapshots—but the descriptions disambiguate them adequately.
All names share a consistent fl_ prefix and snake_case formatting, which is highly predictable. There is mild inconsistency between verb-style (fl_open, fl_run, fl_extract) and noun-style (fl_tabs, fl_flows, fl_console) names, but this mirrors the common list-vs-action distinction and remains readable.
19 tools is on the heavier side but justified by a genuinely multi-faceted domain: browser control, flow recording, replay, login, and debugging. Each tool maps to a concrete capability rather than redundant surface area.
The surface covers the full lifecycle of record→save→replay→repair, plus inspection, auth, and parallel execution. Minor gaps exist—no explicit flow delete/rename or dedicated tab-switch/navigation tool—but agents can work around these via fl_act or re-opening.
Maintenance
Related MCP Connectors
Let your AI agent operate any website through a real, logged-in browser session.
Give AI agents a real cloud Chrome: open sessions, navigate, read pages, click, type and screenshot.
Connect AI agents to your own Chrome with scoped access, approvals, and verified task results.
AI-powered web automation. Navigate websites using AI agents for one page or a thousand
Related MCP Servers
- AlicenseAqualityAmaintenanceEnables AI agents to drive your real, logged-in Chrome browser with existing sessions and cookies, bypassing CAPTCHA and anti-bot measures, with support for multi-session and human-in-the-loop workflows.4060MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to drive a real Chrome browser for autonomous web tasks, using fast typed decisions with calibrated confidence, human-in-the-loop questions, safety gates, and full debug traces.392 npm5MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI assistants to drive the user's real, already-logged-in Chrome browser locally, so they can read and navigate pages, click, type, fill forms, take screenshots, and inspect cookies, tabs, console, and network traffic without headless browsers or remote-debugging ports.1 npmISC
- AlicenseNot gradedqualityAmaintenanceLets AI coding tools drive the real Chrome browser you already have open and logged into — navigating, reading pages, clicking, filling forms, capturing screenshots, and inspecting network, console, and storage state. It works through a Chrome extension rather than a remote-debugging port, so no extra debugging prompt appears and nothing else on the machine can hijack your logged-in browser.1 npmISC